]> granicus.if.org Git - php/commitdiff
MFH: - Fixed bug #7782 (Cannot use PATH_INFO fully with php isapi)
authorfoobar <sniper@php.net>
Sat, 18 Dec 2004 03:56:11 +0000 (03:56 +0000)
committerfoobar <sniper@php.net>
Sat, 18 Dec 2004 03:56:11 +0000 (03:56 +0000)
sapi/isapi/php4isapi.c

index 8384378e9cecc321173d0c89fa6912aca4444d0c..8ed91da5ddaf26a97fc8916510426568c2dcf8b3 100644 (file)
@@ -462,8 +462,85 @@ static void sapi_isapi_register_zeus_variables(LPEXTENSION_CONTROL_BLOCK lpECB,
                php_register_variable( "SERVER_SIGNATURE", static_variable_buf, track_vars_array TSRMLS_CC );
        }
 }
-#endif
+#else
 
+static void sapi_isapi_register_iis_variables(LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array TSRMLS_DC)
+{
+       char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE];
+       char path_info_buf[ISAPI_SERVER_VAR_BUF_SIZE];
+       DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
+       DWORD scriptname_len = ISAPI_SERVER_VAR_BUF_SIZE;
+       DWORD pathinfo_len = 0;
+       HSE_URL_MAPEX_INFO humi;
+
+       /* Get SCRIPT_NAME, we use this to work out which bit of the URL
+        * belongs in PHP's version of PATH_INFO.  SCRIPT_NAME also becomes PHP_SELF.
+        */
+       lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_NAME", static_variable_buf, &scriptname_len);
+       php_register_variable("SCRIPT_FILENAME", SG(request_info).path_translated, track_vars_array TSRMLS_CC);
+
+       /* Adjust IIS' version of PATH_INFO, set PHP_SELF,
+        * and generate REQUEST_URI
+        * Get and adjust PATH_TRANSLATED to what PHP wants
+        */
+       if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_INFO", static_variable_buf, &variable_len) && static_variable_buf[0] ) {
+
+               /* Chop off filename to get just the 'real' PATH_INFO' */
+               php_register_variable( "ORIG_PATH_INFO", static_variable_buf, track_vars_array TSRMLS_CC );
+               pathinfo_len = variable_len - scriptname_len;
+               strncpy(path_info_buf, static_variable_buf + scriptname_len - 1, sizeof(path_info_buf)-1);
+               php_register_variable( "PATH_INFO", path_info_buf, track_vars_array TSRMLS_CC );
+               /* append query string to give url... extra byte for '?' */
+               if ( strlen(lpECB->lpszQueryString) + variable_len + 1 < ISAPI_SERVER_VAR_BUF_SIZE ) {
+                       /* append query string only if it is present... */
+                       if ( strlen(lpECB->lpszQueryString) ) {
+                               static_variable_buf[ variable_len - 1 ] = '?';
+                               strcpy( static_variable_buf + variable_len, lpECB->lpszQueryString );
+                       }
+                       php_register_variable( "URL", static_variable_buf, track_vars_array TSRMLS_CC );
+                       php_register_variable( "REQUEST_URI", static_variable_buf, track_vars_array TSRMLS_CC );
+               }
+               variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
+               if ( lpECB->GetServerVariable(lpECB->ConnID, "PATH_TRANSLATED", static_variable_buf, &variable_len) && static_variable_buf[0] ) {
+                       php_register_variable( "ORIG_PATH_TRANSLATED", static_variable_buf, track_vars_array TSRMLS_CC );
+               }
+               if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, path_info_buf, &pathinfo_len, (LPDWORD) &humi)) {
+                       /* Remove trailing \  */
+                       if (humi.lpszPath[variable_len-2] == '\\') {
+                               humi.lpszPath[variable_len-2] = 0;
+                       }
+                       php_register_variable("PATH_TRANSLATED", humi.lpszPath, track_vars_array TSRMLS_CC);
+               }
+       }
+
+       static_variable_buf[0] = '/';
+       static_variable_buf[1] = 0;
+       variable_len = 2;
+       if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, static_variable_buf, &variable_len, (LPDWORD) &humi)) {
+               /* Remove trailing \  */
+               if (humi.lpszPath[variable_len-2] == '\\') {
+                       humi.lpszPath[variable_len-2] = 0;
+               }
+               php_register_variable("DOCUMENT_ROOT", humi.lpszPath, track_vars_array TSRMLS_CC);
+       }
+
+       if (!SG(request_info).auth_user || !SG(request_info).auth_password || 
+               !SG(request_info).auth_user[0] || !SG(request_info).auth_password[0]) {
+               variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
+               if (lpECB->GetServerVariable(lpECB->ConnID, "HTTP_AUTHORIZATION", static_variable_buf, &variable_len)
+                       && static_variable_buf[0]) {
+                       php_handle_auth_data(static_variable_buf TSRMLS_CC);
+               }
+       }
+
+       if (SG(request_info).auth_user)  {
+               php_register_variable("PHP_AUTH_USER", SG(request_info).auth_user, track_vars_array TSRMLS_CC );
+       }
+       if (SG(request_info).auth_password) {
+               php_register_variable("PHP_AUTH_PW", SG(request_info).auth_password, track_vars_array TSRMLS_CC );
+       }
+}
+#endif
 
 static void sapi_isapi_register_server_variables2(char **server_variables, LPEXTENSION_CONTROL_BLOCK lpECB, zval *track_vars_array, char **recorded_values TSRMLS_DC)
 {
@@ -534,6 +611,8 @@ static void sapi_isapi_register_server_variables(zval *track_vars_array TSRMLS_D
 
 #ifdef WITH_ZEUS
        sapi_isapi_register_zeus_variables(lpECB, track_vars_array TSRMLS_CC);
+#else
+       sapi_isapi_register_iis_variables(lpECB, track_vars_array TSRMLS_CC);
 #endif
 
        /* PHP_SELF support */
@@ -562,22 +641,6 @@ static void sapi_isapi_register_server_variables(zval *track_vars_array TSRMLS_D
                }
                efree(isapi_special_server_variables[SPECIAL_VAR_ALL_HTTP]);
        }
-
-#ifdef PHP_WIN32
-       {
-               HSE_URL_MAPEX_INFO humi;
-               DWORD path_len = 2;
-               char path[] = "/";
-
-               if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, path, &path_len, (LPDWORD) &humi)) {
-                       /* Remove trailing \  */
-                       if (humi.lpszPath[path_len-2] == '\\') {
-                               humi.lpszPath[path_len-2] = 0;
-                       }
-                       php_register_variable("DOCUMENT_ROOT", humi.lpszPath, track_vars_array TSRMLS_CC);
-               }
-       }
-#endif
 }
 
 
@@ -608,9 +671,6 @@ static sapi_module_struct isapi_sapi_module = {
        sapi_isapi_register_server_variables,   /* register server variables */
        NULL,                                                                   /* Log message */
 
-       NULL,                                                                   /* Block interruptions */
-       NULL,                                                                   /* Unblock interruptions */
-
        STANDARD_SAPI_MODULE_PROPERTIES
 };
 
@@ -654,9 +714,14 @@ DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD notificationType, LP
 
 static void init_request_info(LPEXTENSION_CONTROL_BLOCK lpECB TSRMLS_DC)
 {
+       DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
+       char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE];
+#ifndef WITH_ZEUS
+       HSE_URL_MAPEX_INFO humi;
+#endif
+
        SG(request_info).request_method = lpECB->lpszMethod;
        SG(request_info).query_string = lpECB->lpszQueryString;
-       SG(request_info).path_translated = lpECB->lpszPathTranslated;
        SG(request_info).request_uri = lpECB->lpszPathInfo;
        SG(request_info).content_type = lpECB->lpszContentType;
        SG(request_info).content_length = lpECB->cbTotalBytes;
@@ -664,6 +729,33 @@ static void init_request_info(LPEXTENSION_CONTROL_BLOCK lpECB TSRMLS_DC)
        if (!bFilterLoaded) { /* we don't have valid ISAPI Filter information */
                SG(request_info).auth_user = SG(request_info).auth_password = NULL;
        }
+
+#ifdef WITH_ZEUS
+       /* PATH_TRANSLATED can contain extra PATH_INFO stuff after the
+        * file being loaded, so we must use SCRIPT_FILENAME instead
+        */
+       if(lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_FILENAME", static_variable_buf, &variable_len)) {
+               SG(request_info).path_translated = estrdup(static_variable_buf);
+       } else 
+#else
+       /* happily, IIS gives us SCRIPT_NAME which is correct (without PATH_INFO stuff)
+          so we can just map that to the physical path and we have our filename */
+
+       lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_NAME", static_variable_buf, &variable_len);
+       if (lpECB->ServerSupportFunction(lpECB->ConnID, HSE_REQ_MAP_URL_TO_PATH_EX, static_variable_buf, &variable_len, (LPDWORD) &humi)) {
+               SG(request_info).path_translated = estrdup(humi.lpszPath);
+       } else 
+#endif
+               /* if mapping fails, default to what the server tells us */
+               SG(request_info).path_translated = estrdup(lpECB->lpszPathTranslated);
+
+       /* some server configurations allow '..' to slip through in the
+          translated path.   We'll just refuse to handle such a path. */
+       if (strstr(SG(request_info).path_translated,"..")) {
+               SG(sapi_headers).http_response_code = 404;
+               efree(SG(request_info).path_translated);
+               SG(request_info).path_translated = NULL;
+       }
 }
 
 
@@ -722,6 +814,7 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB)
 {
        zend_file_handle file_handle = {0};
        zend_bool stack_overflown=0;
+       int retval = FAILURE;
 #ifdef PHP_ENABLE_SEH
        LPEXCEPTION_POINTERS e;
 #endif
@@ -734,41 +827,29 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB)
                        init_request_info(lpECB TSRMLS_CC);
                        SG(server_context) = lpECB;
 
-#ifdef WITH_ZEUS
-                       /* PATH_TRANSLATED can contain extra PATH_INFO stuff after the
-                        * file being loaded, so we must use SCRIPT_FILENAME instead
-                        */
-                       file_handle.filename = (char *)emalloc( ISAPI_SERVER_VAR_BUF_SIZE );
-                       file_handle.free_filename = 1;
-                       {
-                               DWORD filename_len = ISAPI_SERVER_VAR_BUF_SIZE;
-                               if( !lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_FILENAME", file_handle.filename, &filename_len) || file_handle.filename[ 0 ] == '\0' ) {
-                                       /* If we're running on an earlier version of Zeus, this
-                                        * variable won't be present, so fall back to old behaviour.
-                                        */
-                                       efree( file_handle.filename );
-                                       file_handle.filename = SG(request_info).path_translated;
-                                       file_handle.free_filename = 0;
-                               }
-                       }
-#else
+                       php_request_startup(TSRMLS_C);
+
                        file_handle.filename = SG(request_info).path_translated;
                        file_handle.free_filename = 0;
-#endif
                        file_handle.type = ZEND_HANDLE_FILENAME;
                        file_handle.opened_path = NULL;
-                       /* some server configurations allow '..' to slip through in the
-                          translated path.   We'll just refuse to handle such a path. */
-                       if (strstr(SG(request_info).path_translated,"..")) {
+
+                       /* open the script here so we can 404 if it fails */
+                       if (file_handle.filename)
+                               retval = php_fopen_primary_script(&file_handle TSRMLS_CC);
+
+                       if (!file_handle.filename || retval == FAILURE) {
                                SG(sapi_headers).http_response_code = 404;
-                               SG(request_info).path_translated = NULL;
+                               PUTS("No input file specified.\n");
+                       } else {
+                               php_execute_script(&file_handle TSRMLS_CC);
                        }
 
-                       php_request_startup(TSRMLS_C);
-                       php_execute_script(&file_handle TSRMLS_CC);
                        if (SG(request_info).cookie_data) {
                                efree(SG(request_info).cookie_data);
                        }
+                       if (SG(request_info).path_translated)
+                               efree(SG(request_info).path_translated);
 #ifdef PHP_ENABLE_SEH
                } __except(exceptionhandler(&e, GetExceptionInformation())) {
                        char buf[1024];