sniper          Fri Dec 17 22:56:11 2004 EDT

  Modified files:              (Branch: PHP_4_3)
    /php-src/sapi/isapi php4isapi.c 
  Log:
  MFH: - Fixed bug #7782 (Cannot use PATH_INFO fully with php isapi)
  
http://cvs.php.net/diff.php/php-src/sapi/isapi/php4isapi.c?r1=1.92.2.11&r2=1.92.2.12&ty=u
Index: php-src/sapi/isapi/php4isapi.c
diff -u php-src/sapi/isapi/php4isapi.c:1.92.2.11 
php-src/sapi/isapi/php4isapi.c:1.92.2.12
--- php-src/sapi/isapi/php4isapi.c:1.92.2.11    Fri Dec 17 22:15:10 2004
+++ php-src/sapi/isapi/php4isapi.c      Fri Dec 17 22:56:11 2004
@@ -16,7 +16,7 @@
    |          Ben Mansell <[EMAIL PROTECTED]> (Zeus Support)                   
|
    +----------------------------------------------------------------------+
  */
-/* $Id: php4isapi.c,v 1.92.2.11 2004/12/18 03:15:10 sniper Exp $ */
+/* $Id: php4isapi.c,v 1.92.2.12 2004/12/18 03:56:11 sniper Exp $ */
 
 #ifdef PHP_WIN32
 # include <windows.h>
@@ -462,8 +462,85 @@
                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 @@
 
 #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 @@
                }
                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 @@
        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 @@
 
 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 @@
        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 @@
 {
        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 @@
                        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];

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to