coar 99/03/20 13:51:40
Modified: htdocs/manual/mod mod_env.html src CHANGES src/modules/standard mod_env.c Log: Add PassAllEnv to make all of the server's environment variables available to CGIs and SSIs within the directive's scope. NOT recommended for general use, but eases the transition for IBM's current LDGW customers to Apache. Revision Changes Path 1.13 +47 -0 apache-1.3/htdocs/manual/mod/mod_env.html Index: mod_env.html =================================================================== RCS file: /home/cvs/apache-1.3/htdocs/manual/mod/mod_env.html,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- mod_env.html 1999/01/02 13:24:41 1.12 +++ mod_env.html 1999/03/20 21:51:37 1.13 @@ -30,11 +30,58 @@ <H2>Directives</H2> <UL> +<LI><A HREF="#passallenv">PassAllEnv</A> <LI><A HREF="#passenv">PassEnv</A> <LI><A HREF="#setenv">SetEnv</A> <LI><A HREF="#unsetenv">UnsetEnv</A> </UL> +<HR> + +<H2><A NAME="passallenv">PassAllEnv</A></H2> +<A + HREF="directive-dict.html#Syntax" + REL="Help" +><STRONG>Syntax:</STRONG></A> PassAllEnv <EM>On | Off</EM><BR> +<A + HREF="directive-dict.html#Default" + REL="Help" +><STRONG>Default:</STRONG></A> <EM>Off</EM> +<BR> +<A + HREF="directive-dict.html#Context" + REL="Help" +><STRONG>Context:</STRONG></A> directory<BR> +<A + HREF="directive-dict.html#Status" + REL="Help" +><STRONG>Status:</STRONG></A> Base<BR> +<A + HREF="directive-dict.html#Module" + REL="Help" +><STRONG>Module:</STRONG></A> mod_env<BR> +<A + HREF="directive-dict.html#Compatibility" + REL="Help" +><STRONG>Compatibility:</STRONG></A> PassAllEnv is only available in +Apache 1.3.5 and later. +<P> +This directive controls whether <EM>all</EM> of the server's environment +variables should be made available to CGI scripts and SSI documents, +or only those explicitly named by +<A HREF="#passenv"><CODE>PassEnv</CODE></A> directives or otherwise +created by the server itself. +</P> +<BLOCKQUOTE><STRONG>It is highly recommended that this functionality +be enabled only with extreme caution and after careful examination +of whether the entire environment is needed.</STRONG></BLOCKQUOTE> +<P> +Because of security considerations, <CODE>PassAllEnv</CODE> may +only appear inside +<A HREF="core.html#directory"><SAMP><Directory></SAMP></A> and +<A HREF="core.html#location"><SAMP><Location></SAMP></A> +containers in the server configuration files. +</P> <HR> <H2><A NAME="passenv">PassEnv</A></H2> 1.1286 +3 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1285 retrieving revision 1.1286 diff -u -r1.1285 -r1.1286 --- CHANGES 1999/03/20 15:41:08 1.1285 +++ CHANGES 1999/03/20 21:51:38 1.1286 @@ -1,5 +1,8 @@ Changes with Apache 1.3.5 + *) Added PassAllEnv; makes server's entire environment available + to CGIs and SSIs executed within directive's scope. [Ken Coar] + *) ap_uuencode() always added two trailing '='s and encoding of 8 bit characters on a machine with signed char may produced incorrect results. Additionally ap_uuencode() should now 1.26 +121 -20 apache-1.3/src/modules/standard/mod_env.c Index: mod_env.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_env.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- mod_env.c 1999/01/01 19:05:09 1.25 +++ mod_env.c 1999/03/20 21:51:40 1.26 @@ -96,24 +96,52 @@ * *** configuration carefully before accepting this *** * *** version of the module in a live webserver which used *** * *** older versions of the module. *** + * 20.Mar.1999 Added PassAllEnv to allow copying of the entire parent + * process environment to CGIs and SSIs. */ #include "httpd.h" #include "http_config.h" -typedef struct { +#include <unistd.h> +extern char **environ; + +/* + * Server-wide config info for this module + */ +typedef struct env_server_config_rec { table *vars; + table *parent_env; char *unsetenv; int vars_present; } env_server_config_rec; +/* + * Per-directory config info + */ +typedef struct env_dir_config_rec { + int passall; +} env_dir_config_rec; + module MODULE_VAR_EXPORT env_module; +static void *create_env_dir_config(pool *p, char *dspec) +{ + env_dir_config_rec *dconf; + + dconf = ap_palloc(p, sizeof(env_dir_config_rec)); + dconf->passall = 0; + return dconf; +} + static void *create_env_server_config(pool *p, server_rec *dummy) { - env_server_config_rec *new = - (env_server_config_rec *) ap_palloc(p, sizeof(env_server_config_rec)); + env_server_config_rec *new; + + new = (env_server_config_rec *) ap_palloc(p, + sizeof(env_server_config_rec)); new->vars = ap_make_table(p, 50); + new->parent_env = NULL; new->unsetenv = ""; new->vars_present = 0; return (void *) new; @@ -123,9 +151,7 @@ { env_server_config_rec *base = (env_server_config_rec *) basev; env_server_config_rec *add = (env_server_config_rec *) addv; - env_server_config_rec *new = - (env_server_config_rec *) ap_palloc(p, sizeof(env_server_config_rec)); - + env_server_config_rec *new; table *new_table; table_entry *elts; array_header *arr; @@ -133,6 +159,8 @@ int i; const char *uenv, *unset; + new = (env_server_config_rec *) ap_palloc(p, + sizeof(env_server_config_rec)); /* * new_table = copy_table( p, base->vars ); * foreach $element ( @add->vars ) { @@ -203,7 +231,8 @@ if ((*name == '\0') || (*arg != '\0')) { - return "SetEnv takes one or two arguments. An environment variable name and an optional value to pass to CGI."; + return "SetEnv takes one or two arguments. An environment " + "variable name and an optional value to pass to CGI."; } sconf->vars_present = 1; @@ -215,11 +244,64 @@ static const char *add_env_module_vars_unset(cmd_parms *cmd, char *struct_ptr, char *arg) { - env_server_config_rec *sconf = - ap_get_module_config(cmd->server->module_config, &env_module); - sconf->unsetenv = sconf->unsetenv ? - ap_pstrcat(cmd->pool, sconf->unsetenv, " ", arg, NULL) : - arg; + env_server_config_rec *sconf; + + sconf = ap_get_module_config(cmd->server->module_config, &env_module); + sconf->unsetenv = sconf->unsetenv + ? ap_pstrcat(cmd->pool, sconf->unsetenv, " ", arg, NULL) + : arg; + return NULL; +} + +/* + * Set up to make the entire server environment available through + * r->subprocess_env. + */ +static const char *add_env_module_passall(cmd_parms *cmd, void *mconfig, + int enable) +{ + env_dir_config_rec *dconf = (env_dir_config_rec *) mconfig; + + dconf->passall = enable; + if (enable) { + env_server_config_rec *sconf; + + sconf = (env_server_config_rec *) ap_get_module_config(cmd->server->module_config, + &env_module); + /* + * If we've copied the entire server environment before, it's + * in the server config record. Otherwise, do so now. + */ + if (sconf->parent_env == NULL) { + char **e = environ; + char *lhs; + char *rhs; + + sconf->parent_env = ap_make_table(cmd->pool, 30); + while (*e != NULL) { + /* + * Make a copy of the environment entry so we can split + * it into a key/value pair with '\0'. + */ + lhs = ap_pstrdup(cmd->pool, *e); + rhs = strchr(lhs, '='); + if (rhs == NULL) { + rhs = ""; + } + else { + *rhs = '\0'; + rhs++; + } + ap_table_setn(sconf->parent_env, lhs, rhs); + e++; + } + } + /* + * Note that there are variables to be copied during the fixup + * phase. + */ + sconf->vars_present++; + } return NULL; } @@ -227,10 +309,12 @@ { {"PassEnv", add_env_module_vars_passed, NULL, RSRC_CONF, RAW_ARGS, "a list of environment variables to pass to CGI."}, - {"SetEnv", add_env_module_vars_set, NULL, - RSRC_CONF, RAW_ARGS, "an environment variable name and a value to pass to CGI."}, - {"UnsetEnv", add_env_module_vars_unset, NULL, - RSRC_CONF, RAW_ARGS, "a list of variables to remove from the CGI environment."}, + {"SetEnv", add_env_module_vars_set, NULL, RSRC_CONF, RAW_ARGS, + "an environment variable name and a value to pass to CGI."}, + {"UnsetEnv", add_env_module_vars_unset, NULL, RSRC_CONF, RAW_ARGS, + "a list of variables to remove from the CGI environment."}, + {"PassAllEnv", add_env_module_passall, NULL, ACCESS_CONF, FLAG, + "On or Off to control passing of entire server environment."}, {NULL}, }; @@ -239,13 +323,30 @@ table *e = r->subprocess_env; server_rec *s = r->server; env_server_config_rec *sconf = ap_get_module_config(s->module_config, - &env_module); + &env_module); + env_dir_config_rec *dconf = ap_get_module_config(r->per_dir_config, + &env_module); table *vars = sconf->vars; - if (!sconf->vars_present) + if (!sconf->vars_present) { return DECLINED; + } - r->subprocess_env = ap_overlay_tables(r->pool, e, vars); + /* + * If the entire environment is supposed to be copied, do it. + */ + if (dconf->passall) { + r->subprocess_env = ap_overlay_tables(r->pool, r->subprocess_env, + sconf->parent_env); + } + else { + /* + * If we just copied the entire environment, we don't need to + * deal with the PassEnv settings because they were automatically + * included. Otherwise, do them now. + */ + r->subprocess_env = ap_overlay_tables(r->pool, e, vars); + } return OK; } @@ -254,7 +355,7 @@ { STANDARD_MODULE_STUFF, NULL, /* initializer */ - NULL, /* dir config creater */ + create_env_dir_config, /* dir config creater */ NULL, /* dir merger --- default is to override */ create_env_server_config, /* server config */ merge_env_server_configs, /* merge server configs */