Author: mturk Date: Wed Jan 31 00:36:57 2007 New Revision: 501766 URL: http://svn.apache.org/viewvc?view=rev&rev=501766 Log: Backport filter notification from JK2 where we had an option to specify the auth_complete. Fixes Bz #36365. The patch does not like proposed detect IIS 5.1 but rather adds registry DWORD as a flag if auth_complete should be used or not (defaults to 1 -- used).
Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c?view=diff&rev=501766&r1=501765&r2=501766 ============================================================================== --- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Wed Jan 31 00:36:57 2007 @@ -80,6 +80,7 @@ static char HTTP_WORKER_HEADER_NAME[_MAX_FNAME]; #define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.0") +#define W3SVC_REGISTRY_KEY ("SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters") #define EXTENSION_URI_TAG ("extension_uri") #define URI_SELECT_TAG ("uri_select") @@ -90,6 +91,7 @@ #define SHM_SIZE_TAG ("shm_size") #define WORKER_MOUNT_RELOAD_TAG ("worker_mount_reload") #define STRIP_SESSION_TAG ("strip_session") +#define AUTH_COMPLETE_TAG ("auth_complete") #define TRANSLATE_HEADER ("Translate:") @@ -146,7 +148,6 @@ static int using_ini_file = JK_FALSE; static int is_inited = JK_FALSE; static int is_mapread = JK_FALSE; -static int iis5 = -1; static jk_uri_worker_map_t *uw_map = NULL; static jk_map_t *workers_map = NULL; @@ -167,6 +168,8 @@ static char rewrite_rule_file[MAX_PATH * 2] = {0}; static int shm_config_size = JK_SHM_DEF_SIZE; static int strip_session = 0; +static DWORD auth_notification_flags = 0; +static int use_auth_notification_flags = 1; #define URI_SELECT_OPT_PARSED 0 #define URI_SELECT_OPT_UNPARSED 1 @@ -213,7 +216,7 @@ static int read_registry_init_data(void); -static int get_config_parameter(LPVOID src, const char *tag, +static int get_config_parameter(LPVOID src, const char *tag, char *val, DWORD sz); static int get_config_bool(LPVOID src, const char *tag, int def); @@ -236,6 +239,7 @@ static int base64_encode_cert(char *encoded, const char *string, int len); +static int get_auth_flags(); static char x2c(const char *what) { @@ -686,6 +690,7 @@ BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer) { + BOOL rv = TRUE; ULONG http_filter_revision = HTTP_FILTER_REVISION; pVer->dwFilterVersion = pVer->dwServerFilterVersion; @@ -693,21 +698,27 @@ if (pVer->dwFilterVersion > http_filter_revision) { pVer->dwFilterVersion = http_filter_revision; } - - pVer->dwFlags = SF_NOTIFY_ORDER_HIGH | - SF_NOTIFY_SECURE_PORT | - SF_NOTIFY_NONSECURE_PORT | - SF_NOTIFY_PREPROC_HEADERS | - SF_NOTIFY_LOG | - SF_NOTIFY_AUTH_COMPLETE; - - strcpy(pVer->lpszFilterDesc, VERSION_STRING); - if (!is_inited) { - return initialize_extension(); + rv = initialize_extension(); + auth_notification_flags = get_auth_flags(); + } + if (auth_notification_flags == SF_NOTIFY_AUTH_COMPLETE) { + pVer->dwFlags = SF_NOTIFY_ORDER_HIGH | + SF_NOTIFY_SECURE_PORT | + SF_NOTIFY_NONSECURE_PORT | + SF_NOTIFY_PREPROC_HEADERS | + SF_NOTIFY_LOG | + SF_NOTIFY_AUTH_COMPLETE; + } + else { + pVer->dwFlags = SF_NOTIFY_ORDER_HIGH | + SF_NOTIFY_SECURE_PORT | + SF_NOTIFY_NONSECURE_PORT | + SF_NOTIFY_PREPROC_HEADERS; } - return TRUE; + strcpy(pVer->lpszFilterDesc, VERSION_STRING); + return rv; } static int simple_rewrite(char *uri) @@ -746,28 +757,7 @@ if (!is_mapread) is_inited = JK_FALSE; } - - if (is_inited && (iis5 < 0)) { - char serverSoftware[256]; - DWORD dwLen = sizeof(serverSoftware); - iis5 = 0; - if (pfc-> - GetServerVariable(pfc, SERVER_SOFTWARE, serverSoftware, &dwLen)) { - iis5 = (atof(serverSoftware + 14) >= 5.0); - if (iis5) { - jk_log(logger, JK_LOG_DEBUG, "Detected IIS >= 5.0"); - } - else { - jk_log(logger, JK_LOG_DEBUG, "Detected IIS < 5.0"); - } - } - } - - if (is_inited && - (((SF_NOTIFY_PREPROC_HEADERS == dwNotificationType) && !iis5) || - ((SF_NOTIFY_AUTH_COMPLETE == dwNotificationType) && iis5) - ) - ) { + if (auth_notification_flags == dwNotificationType) { char uri[INTERNET_MAX_URL_LENGTH]; char snuri[INTERNET_MAX_URL_LENGTH] = "/"; char Host[INTERNET_MAX_URL_LENGTH] = ""; @@ -789,7 +779,7 @@ DWORD szPort = sizeof(Port); DWORD szTranslate = sizeof(Translate); - if (iis5) { + if (auth_notification_flags == SF_NOTIFY_AUTH_COMPLETE) { GetHeader = ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->GetHeader; SetHeader = @@ -1360,7 +1350,7 @@ } } if (!using_ini_file) { - long rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOCATION, + long rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOCATION, (DWORD)0, KEY_READ, &hkey); if (ERROR_SUCCESS != rc) { return JK_FALSE; @@ -1389,7 +1379,7 @@ shm_config_size = get_config_int(src, SHM_SIZE_TAG, JK_SHM_DEF_SIZE); worker_mount_reload = get_config_int(src, WORKER_MOUNT_RELOAD_TAG, JK_URIMAP_DEF_RELOAD); strip_session = get_config_bool(src, STRIP_SESSION_TAG, JK_FALSE); - + use_auth_notification_flags = get_config_int(src, AUTH_COMPLETE_TAG, 1); if (using_ini_file) { jk_map_free(&map); } @@ -1399,7 +1389,7 @@ return ok; } -static int get_config_parameter(LPVOID src, const char *tag, +static int get_config_parameter(LPVOID src, const char *tag, char *val, DWORD sz) { const char *tmp = NULL; @@ -1438,14 +1428,14 @@ return jk_map_get_bool((jk_map_t*)src, tag, def); } else { char tmpbuf[128]; - if (get_registry_config_parameter(*((HKEY*)src), tag, + if (get_registry_config_parameter(*((HKEY*)src), tag, tmpbuf, sizeof(tmpbuf))) { return jk_get_bool_code(tmpbuf, def); } else { return def; } - } + } } static int get_registry_config_parameter(HKEY hkey, @@ -1831,4 +1821,31 @@ *p++ = '\0'; return (int)(p - encoded); +} + +static int get_auth_flags() +{ + HKEY hkey; + long rc; + int maj, sz; + int rv = SF_NOTIFY_PREPROC_HEADERS; + int use_auth = JK_FALSE; + /* Retreive the IIS version Major */ + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + W3SVC_REGISTRY_KEY, (DWORD) 0, KEY_READ, &hkey); + if (ERROR_SUCCESS != rc) { + return rv; + } + sz = sizeof(int); + rc = RegQueryValueEx(hkey, "MajorVersion", NULL, NULL, + (LPBYTE) & maj, &sz); + if (ERROR_SUCCESS != rc) { + CloseHandle(hkey); + return rv; + } + CloseHandle(hkey); + if (use_auth_notification_flags && maj > 4) + rv = SF_NOTIFY_AUTH_COMPLETE; + + return rv; } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]