-S servername:port -t path/to/this/file.php The mapagent can then be accessed via: http://servername:port/mapguide/mapagent/mapagent.fcgi */ require_once dirname(__FILE__)."/../../../../Web/src/mapadmin/constants.php"; function EscapeXmlChars($str) { $newStr = ""; $len = strlen($str); for($i = 0; $i < $len; $i++) { switch($str[$i]) { case '&' : { $newStr .= "&"; break; } case '\'' : { $newStr .= "'"; break; } case '>' : { $newStr .= ">"; break; } case '<' : { $newStr .= "<"; break; } case '"' : { $newStr .= """; break; } default : $newStr .= $str[$i]; } } return $newStr; } function Unauthorized() { //Send back 401 header('WWW-Authenticate: Basic realm="MapGuide"'); $e = new Exception(); echo "You must enter a valid login ID and password to access this site\r\n"; http_response_code(401); die; } function CheckParams($param) { $bValid = $param->ContainsParameter("SESSION"); if (!$bValid) $bValid = $param->ContainsParameter("USERNAME"); $op = $param->GetParameterValue("OPERATION"); if ($op == "GETSITESTATUS") $bValid = true; //Invalid service parameter needs to trigger unauthorized if ($bValid) { if ($param->ContainsParameter("SERVICE")) { $svc = $param->GetParameterValue("SERVICE"); $bValid = ($svc == "WFS" || $svc == "WMS"); } } if (!$bValid) Unauthorized(); } function OutputException($statusMessage, $errorMessage, $details, $phpTrace, $status = 500, $mimeType = MgMimeType::Html) { $errResponse = ""; $errResponse = sprintf( "\r\n\n\n%s\n\n\n\n

%s

\n%s\n\n\n", $statusMessage, $errorMessage, $details, $phpTrace); header($_SERVER["SERVER_PROTOCOL"]." 559 $statusMessage"); header("Status: 559 $statusMessage"); header($statusMessage, true, 559); echo $errResponse; } function OutputError($result, $mimeType = MgMimeType::Html) { $statusMessage = $result->GetHttpStatusMessage(); $e = new Exception(); if ($statusMessage === "MgAuthenticationFailedException" || $statusMessage === "MgUnauthorizedAccessException" || $statusMessage == "MgPermissionDeniedException") { Unauthorized(); } else { header("Content-Type: $mimeType"); OutputException($statusMessage, $result->GetErrorMessage(), $result->GetDetailedErrorMessage(), $e->getTraceAsString(), $result->GetStatusCode(), $mimeType); } } function OutputMgStringCollection($strCol, $mimeType = MgMimeType::Xml) { $content = ""; if ($strCol != null) { // MgStringCollection::ToXml() doesn't seem to be reliable in PHP (bug?), so do this manually $count = $strCol->GetCount(); $content = ""; for ($i = 0; $i < $count; $i++) { $value = EscapeXmlChars($strCol->GetItem($i)); $content .= "$value"; } $content .= ""; } header("Content-Type: $mimeType"); echo $content; } function OutputByteReader($byteReader, $chunkResult = false, $bPrependXmlProlog = false) { $mimeType = $byteReader->GetMimeType(); header("Content-Type: $mimeType"); $rdrLen = $byteReader->GetLength(); if ($mimeType == MgMimeType::Xml && $bPrependXmlProlog) { echo ""; } do { $data = str_pad("\0", 50000, "\0"); $len = $byteReader->Read($data, 50000); if ($len > 0) { $str = substr($data, 0, $len); echo $str; } } while ($len > 0); } function TryFillCredentials($param) { if (array_key_exists("SESSION", $_REQUEST)) { $param->AddParameter("SESSION", $_REQUEST["SESSION"]); } else { $username = null; $password = ""; // Username/password extraction logic ripped from PHP implementation of the MapGuide AJAX viewer // No session, no credentials explicitely passed. Check for HTTP Auth user/passwd. Under Apache CGI, the // PHP_AUTH_USER and PHP_AUTH_PW are not set. However, the Apache admin may // have rewritten the authentication information to REMOTE_USER. This is a // suggested approach from the Php.net website. // Has REMOTE_USER been rewritten? if (!isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['REMOTE_USER']) && preg_match('/Basic +(.*)$/i', $_SERVER['REMOTE_USER'], $matches)) { list($name, $password) = explode(':', base64_decode($matches[1])); $_SERVER['PHP_AUTH_USER'] = strip_tags($name); $_SERVER['PHP_AUTH_PW'] = strip_tags($password); } // REMOTE_USER may also appear as REDIRECT_REMOTE_USER depending on CGI setup. // Check for this as well. if (!isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['REDIRECT_REMOTE_USER']) && preg_match('/Basic (.*)$/i', $_SERVER['REDIRECT_REMOTE_USER'], $matches)) { list($name, $password) = explode(':', base64_decode($matches[1])); $_SERVER['PHP_AUTH_USER'] = strip_tags($name); $_SERVER['PHP_AUTH_PW'] = strip_tags($password); } // Finally, PHP_AUTH_USER may actually be defined correctly. If it is set, or // has been pulled from REMOTE_USER rewriting then set our USERNAME and PASSWORD // parameters. if (isset($_SERVER['PHP_AUTH_USER']) && strlen($_SERVER['PHP_AUTH_USER']) > 0) { $username = $_SERVER['PHP_AUTH_USER']; if (isset($_SERVER['PHP_AUTH_PW']) && strlen($_SERVER['PHP_AUTH_PW']) > 0) $password = $_SERVER['PHP_AUTH_PW']; } //If we have everything we need, put it into the MgHttpRequestParam if ($username != null) { $param->AddParameter("USERNAME", $username); if ($password !== "") { $param->AddParameter("PASSWORD", $password); } } else { Unauthorized(); } } } $iniFile = dirname(__FILE__)."/../../../webconfig.ini"; try { if (array_key_exists("WEBCONFIGINI", $_SERVER)) { $iniFile = $_SERVER["WEBCONFIGINI"]; } if (array_key_exists("WEBCONFIGINI", $_ENV)) { $iniFile = $_ENV["WEBCONFIGINI"]; } MgInitializeWebTier($iniFile); $method = $_SERVER["REQUEST_METHOD"]; if (strpos($_SERVER["REQUEST_URI"], '/mapguide/mapagent/mapagent.fcgi') !== FALSE) { if ($method == "GET" || $method == "POST") { $uri = "http://".$_SERVER["SERVER_NAME"].$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; $req = new MgHttpRequest($uri); $param = $req->GetRequestParam(); TryFillCredentials($param); if ($method == "GET") { foreach ($_GET as $key => $value) { $param->AddParameter($key, $value); } } else { //POST foreach ($_POST as $key => $value) { $param->AddParameter($key, $value); } foreach ($_FILES as $key => $value) { if (array_key_exists("error", $value) && $value["error"] == 1) { echo "Error: The file ".$value["name"]." for field $key exceeds the maximum file upload size of ".ini_get("upload_max_filesize"); die; } $param->AddParameter($key, $value["tmp_name"]); $param->SetParameterType($key, "tempfile"); } } CheckParams($param); $response = $req->Execute(); $result = $response->GetResult(); $status = $result->GetStatusCode(); if ($status == 200) { $resultObj = $result->GetResultObject(); if ($resultObj != null) { header("Content-Type: ".$result->GetResultContentType()); if ($resultObj instanceof MgByteReader) { OutputByteReader($resultObj); } else if ($resultObj instanceof MgStringCollection) { //OutputMgStringCollection($resultObj, $param->GetParameterValue("FORMAT")); $byteReader = $resultObj->ToXml(); OutputByteReader($byteReader); } else if ($resultObj instanceof MgHttpPrimitiveValue) { echo $resultObj->ToString(); } else if (method_exists($resultObj, "ToXml")) { $byteReader = $resultObj->ToXml(); OutputByteReader($byteReader); } else { throw new Exception("Could not determine how to output: ".$resultObj->ToString()); //TODO: Localize } } } else { $format = $param->GetParameterValue("FORMAT"); if ($format != "") { OutputError($result, $format); } else { OutputError($result); } //throw new Exception("Error executing operation: ".$param->GetParameterValue("OPERATION").". The status code is: $status"); //TODO: Localize } http_response_code($status); } else { echo "Unsupported method"; http_response_code(405); } } else { return false; } } catch (MgException $ex) { OutputException(get_class($ex), $ex->GetExceptionMessage(), $ex->GetDetails(), $e->getTraceAsString(), 559); die; } ?>