glenn 2002/12/29 20:05:39 Modified: jk/native/apache-2.0 mod_jk.c Log: Port mod_jk apache 1.3 JkAutoAlias to apache 2.0, 1.3 and 2.0 should be in synch now Revision Changes Path 1.63 +110 -1 jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c Index: mod_jk.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -r1.62 -r1.63 --- mod_jk.c 9 Dec 2002 13:19:17 -0000 1.62 +++ mod_jk.c 30 Dec 2002 04:05:39 -0000 1.63 @@ -71,6 +71,7 @@ #include "ap_config.h" #include "apr_lib.h" #include "apr_date.h" +#include "apr_file_info.h" #include "httpd.h" #include "http_config.h" #include "http_request.h" @@ -152,6 +153,11 @@ int was_initialized; /* + * Automatic context path apache alias + */ + char *alias_dir; + + /* * Request Logging */ @@ -894,6 +900,29 @@ return NULL; } + +/* + * JkAutoAlias Directive Handling + * + * JkAutoAlias application directory + */ + +static const char *jk_set_auto_alias(cmd_parms *cmd, + void *dummy, + char *directory) +{ + server_rec *s = cmd->server; + jk_server_conf_t *conf = + (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module); + + conf->alias_dir = directory; + + if (conf->alias_dir == NULL) + return "JkAutoAlias directory invalid"; + + return NULL; +} + /***************************************************************** * * Actually logging. @@ -1540,6 +1569,14 @@ "The Jakarta mod_jk module request log format string"), /* + * Automatically Alias webapp context directories into the Apache + * document space. + */ + AP_INIT_TAKE1( + "JkAutoAlias", jk_set_auto_alias, NULL, RSRC_CONF, + "The Jakarta mod_jk module automatic context apache alias directory"), + + /* * Apache has multiple SSL modules (for example apache_ssl, stronghold * IHS ...). Each of these can have a different SSL environment names * The following properties let the administrator specify the envoiroment @@ -1853,6 +1890,9 @@ c->log_file = NULL; c->log_level = -1; c->log = NULL; + c->alias_dir = NULL; + c->format_string = NULL; + c->format = NULL; c->mountcopy = JK_FALSE; c->was_initialized = JK_FALSE; c->options = JK_OPT_FWDURIDEFAULT; @@ -2088,6 +2128,75 @@ apr_table_setn(r->main->notes, JK_WORKER_ID, worker); return OK; + } else if(conf->alias_dir != NULL) { + /* Automatically map uri to a context static file */ + jk_log(conf->log, JK_LOG_DEBUG, + "mod_jk::jk_translate, check alias_dir: %s\n", + conf->alias_dir); + if (strlen(r->uri) > 1) { + /* Get the context directory name */ + char *context_dir = NULL; + char *context_path = NULL; + char *child_dir = NULL; + char *index = r->uri; + char *suffix = strchr(index+1,'/'); + if( suffix != NULL ) { + int size = suffix - index; + context_dir = ap_pstrndup(r->pool,index,size); + /* Get the context child directory name */ + index = index + size + 1; + suffix = strchr(index,'/'); + if( suffix != NULL ) { + size = suffix - index; + child_dir = ap_pstrndup(r->pool,index,size); + } else { + child_dir = index; + } + /* Deny access to WEB-INF and META-INF directories */ + if( child_dir != NULL ) { + jk_log(conf->log, JK_LOG_DEBUG, + "mod_jk::jk_translate, AutoAlias child_dir: %s\n",child_dir); + if( !strcasecmp(child_dir,"WEB-INF") || + !strcasecmp(child_dir,"META-INF") ) { + jk_log(conf->log, JK_LOG_DEBUG, + "mod_jk::jk_translate, AutoAlias HTTP_FORBIDDEN for URI: %s\n", + r->uri); + return HTTP_FORBIDDEN; + } + } + } else { + context_dir = ap_pstrdup(r->pool,index); + } + + context_path = ap_pstrcat(r->pool,conf->alias_dir, + ap_os_escape_path(r->pool,context_dir,1), + NULL); + if( context_path != NULL ) { + apr_finfo_t finfo; + finfo.filetype = APR_NOFILE; + apr_stat(&finfo,context_path,APR_FINFO_TYPE,r->pool); + if( finfo.filetype == APR_DIR ) { + char *escurl = ap_os_escape_path(r->pool, r->uri, 1); + char *ret = ap_pstrcat(r->pool,conf->alias_dir,escurl,NULL); + /* Add code to verify real path ap_os_canonical_name */ + if( ret != NULL ) { + jk_log(conf->log, JK_LOG_DEBUG, + "mod_jk::jk_translate, AutoAlias OK for file: %s\n",ret); + r->filename = ret; + return OK; + } + } else { + /* Deny access to war files in web app directory */ + int size = strlen(context_dir); + if( size > 4 && !strcasecmp(context_dir+(size-4),".war") ) { + jk_log(conf->log, JK_LOG_DEBUG, + "mod_jk::jk_translate, AutoAlias HTTP_FORBIDDEN for URI: %s\n", + r->uri); + return HTTP_FORBIDDEN; + } + } + } + } } } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>