📄 jk_isapi_plugin.c
字号:
return 1; } } } } return 0;}static int init_error = 0;DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD dwNotificationType, LPVOID pvNotification){ /* Initialise jk */ if (is_inited && !is_mapread) { char serverName[MAX_SERVERNAME]; DWORD dwLen = sizeof(serverName); if (pfc->GetServerVariable(pfc, SERVER_NAME, serverName, &dwLen)) { if (dwLen > 0) serverName[dwLen - 1] = '\0'; if (init_jk(serverName)) is_mapread = JK_TRUE; } /* If we can't read the map we become dormant */ if (!is_mapread) is_inited = JK_FALSE; } if (!is_inited && !is_mapread) { /* In case the initialization failed * return error. This will make entire IIS * unusable like with Apache servers */ SetLastError(ERROR_INVALID_FUNCTION); return SF_STATUS_REQ_ERROR; } if (auth_notification_flags == dwNotificationType) { char uri[INTERNET_MAX_URL_LENGTH]; char snuri[INTERNET_MAX_URL_LENGTH] = "/"; char Host[INTERNET_MAX_URL_LENGTH] = ""; char Port[INTERNET_MAX_URL_LENGTH] = ""; char Translate[INTERNET_MAX_URL_LENGTH]; char squery[INTERNET_MAX_URL_LENGTH] = ""; BOOL(WINAPI * GetHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName, LPVOID lpvBuffer, LPDWORD lpdwSize); BOOL(WINAPI * SetHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName, LPSTR lpszValue); BOOL(WINAPI * AddHeader) (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName, LPSTR lpszValue); char *query; DWORD sz = sizeof(uri); DWORD szHost = sizeof(Host); DWORD szPort = sizeof(Port); DWORD szTranslate = sizeof(Translate); if (auth_notification_flags == SF_NOTIFY_AUTH_COMPLETE) { GetHeader = ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->GetHeader; SetHeader = ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->SetHeader; AddHeader = ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->AddHeader; } else { GetHeader = ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->GetHeader; SetHeader = ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->SetHeader; AddHeader = ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->AddHeader; } if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "Filter started"); /* * Just in case somebody set these headers in the request! */ SetHeader(pfc, URI_HEADER_NAME, NULL); SetHeader(pfc, QUERY_HEADER_NAME, NULL); SetHeader(pfc, WORKER_HEADER_NAME, NULL); SetHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, NULL); if (!GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz)) { jk_log(logger, JK_LOG_ERROR, "error while getting the url"); return SF_STATUS_REQ_ERROR; } if (strlen(uri)) { int rc; const char *worker = NULL; query = strchr(uri, '?'); if (query) { *query++ = '\0'; StringCbCopy(squery, INTERNET_MAX_URL_LENGTH, query); } rc = unescape_url(uri); if (rc == BAD_REQUEST) { jk_log(logger, JK_LOG_ERROR, "[%s] contains one or more invalid escape sequences.", uri); write_error_response(pfc, "400 Bad Request", HTML_ERROR_400); return SF_STATUS_REQ_FINISHED; } else if (rc == BAD_PATH) { jk_log(logger, JK_LOG_EMERG, "[%s] contains forbidden escape sequences.", uri); write_error_response(pfc, "404 Not Found", HTML_ERROR_404); return SF_STATUS_REQ_FINISHED; } getparents(uri); if (pfc-> GetServerVariable(pfc, SERVER_NAME, (LPVOID) Host, (LPDWORD) & szHost)) { if (szHost > 0) { Host[szHost - 1] = '\0'; } } Port[0] = '\0'; if (pfc-> GetServerVariable(pfc, "SERVER_PORT", (LPVOID) Port, (LPDWORD) & szPort)) { if (szPort > 0) { Port[szPort - 1] = '\0'; } } szPort = atoi(Port); if (szPort != 80 && szPort != 443 && szHost > 0) { StringCbCat(Host, INTERNET_MAX_URL_LENGTH, ":"); StringCbCat(Host, INTERNET_MAX_URL_LENGTH, Port); } if (szHost > 0) { StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, Host); StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, uri); if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "Virtual Host redirection of %s", snuri); worker = map_uri_to_worker(uw_map, snuri, logger); } if (!worker) { if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "Default redirection of %s", uri); worker = map_uri_to_worker(uw_map, uri, logger); } /* * Check if somebody is feading us with his own TOMCAT data headers. * We reject such postings ! */ if (worker) { char *forwardURI; if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "check if [%s] is points to the web-inf directory", uri); if (uri_is_web_inf(uri)) { jk_log(logger, JK_LOG_EMERG, "[%s] points to the web-inf or meta-inf directory. " "Somebody try to hack into the site!!!", uri); write_error_response(pfc, "404 Not Found", HTML_ERROR_404); return SF_STATUS_REQ_FINISHED; } /* This is a servlet, should redirect ... */ if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "[%s] is a servlet url - should redirect to %s", uri, worker); /* get URI we should forward */ if (uri_select_option == URI_SELECT_OPT_UNPARSED) { /* get original unparsed URI */ GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz); /* restore terminator for uri portion */ if (query) *(query - 1) = '\0'; if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "fowarding original URI [%s]", uri); forwardURI = uri; } else if (uri_select_option == URI_SELECT_OPT_ESCAPED) { if (!escape_url(uri, snuri, INTERNET_MAX_URL_LENGTH)) { jk_log(logger, JK_LOG_ERROR, "[%s] re-encoding request exceeds maximum buffer size.", uri); write_error_response(pfc, "400 Bad Request", HTML_ERROR_400); return SF_STATUS_REQ_FINISHED; } if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "fowarding escaped URI [%s]", snuri); forwardURI = snuri; } else if (uri_select_option == URI_SELECT_OPT_PROXY) { if (!jk_canonenc(uri, snuri, INTERNET_MAX_URL_LENGTH)) { jk_log(logger, JK_LOG_ERROR, "[%s] re-encoding request exceeds maximum buffer size.", uri); write_error_response(pfc, "400 Bad Request", HTML_ERROR_400); return SF_STATUS_REQ_FINISHED; } if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "fowarding escaped URI [%s]", snuri); forwardURI = snuri; } else { forwardURI = uri; } /* Do a simple rewrite . * Note that URI can be escaped, so thus the rule has * to be in that case. * * TODO: Add more advanced regexp rewrite. */ if (JK_IS_DEBUG_LEVEL(logger)) { char duri[INTERNET_MAX_URL_LENGTH]; StringCbCopy(duri, INTERNET_MAX_URL_LENGTH, forwardURI); if (simple_rewrite(forwardURI)) { jk_log(logger, JK_LOG_DEBUG, "rewriten URI [%s]->[%s]", duri, forwardURI); } else if (rregex_rewrite(forwardURI)) { jk_log(logger, JK_LOG_DEBUG, "rewriten URI [%s]->[%s]", duri, forwardURI); } } else { if (!simple_rewrite(forwardURI)) rregex_rewrite(forwardURI); } if (!AddHeader(pfc, URI_HEADER_NAME, forwardURI) || ((strlen(squery) > 0) ? !AddHeader(pfc, QUERY_HEADER_NAME, squery) : FALSE) || !AddHeader(pfc, WORKER_HEADER_NAME, (LPSTR)worker) || !SetHeader(pfc, "url", extension_uri)) { jk_log(logger, JK_LOG_ERROR, "error while adding request headers"); SetLastError(ERROR_INVALID_PARAMETER); return SF_STATUS_REQ_ERROR; } /* Move Translate: header to a temporary header so * that the extension proc will be called. * This allows the servlet to handle 'Translate: f'. */ if (GetHeader (pfc, TRANSLATE_HEADER, (LPVOID) Translate, (LPDWORD) & szTranslate) && Translate != NULL && szTranslate > 0) { if (!AddHeader (pfc, TOMCAT_TRANSLATE_HEADER_NAME, Translate)) { jk_log(logger, JK_LOG_ERROR, "error while adding Tomcat-Translate headers"); return SF_STATUS_REQ_ERROR; } SetHeader(pfc, "Translate:", NULL); } if (!pfc->pFilterContext) { isapi_log_data_t *ld = (isapi_log_data_t *)pfc->AllocMem(pfc, sizeof(isapi_log_data_t), 0); if (!ld) { jk_log(logger, JK_LOG_ERROR, "error while allocating memory"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return SF_STATUS_REQ_ERROR; } memset(ld, 0, sizeof(isapi_log_data_t)); StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI); StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery); pfc->pFilterContext = ld; } else { isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext; memset(ld, 0, sizeof(isapi_log_data_t)); StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI); StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery); } } else { if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "[%s] is not a servlet url", uri); if (strip_session) { char *jsessionid = strstr(uri, JK_PATH_SESSION_IDENTIFIER); if (jsessionid) { if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "removing session identifier [%s] for non servlet url [%s]", jsessionid, uri); *jsessionid = '\0'; SetHeader(pfc, "url", uri); } } } } } else if (is_inited && (dwNotificationType == SF_NOTIFY_LOG)) { if (pfc->pFilterContext) { isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext; HTTP_FILTER_LOG *pl = (HTTP_FILTER_LOG *)pvNotification; pl->pszTarget = ld->uri; pl->pszParameters = ld->query; } } return SF_STATUS_REQ_NEXT_NOTIFICATION;}BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO * pVer){ pVer->dwExtensionVersion = MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR); StringCbCopy(pVer->lpszExtensionDesc, HSE_MAX_EXT_DLL_NAME_LEN, VERSION_STRING); if (!is_inited) { return initialize_extension(); } return TRUE;}DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpEcb){ DWORD rc = HSE_STATUS_ERROR; lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR; JK_TRACE_ENTER(logger); /* Initialise jk */ if (is_inited && !is_mapread) { char serverName[MAX_SERVERNAME] = { 0 }; DWORD dwLen = sizeof(serverName); if (lpEcb-> GetServerVariable(lpEcb->ConnID, SERVER_NAME, serverName, &dwLen)) { if (dwLen > 0) serverName[dwLen - 1] = '\0'; if (init_jk(serverName)) is_mapread = JK_TRUE; } if (!is_mapread) is_inited = JK_FALSE; } if (is_inited) { isapi_private_data_t private_data; jk_ws_service_t s; jk_pool_atom_t buf[SMALL_POOL_SIZE]; char *worker_name;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -