You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Colm MacCárthaigh <co...@Redbrick.DCU.IE> on 2002/05/28 19:36:28 UTC

[PATCH] Include Directives in apache 1.3

A friend wanted to keep a (very big) list of "Allow" directives 
in a file and Include them from several directories (needed to put an
ACL in force basically).

But the contexts get warped when you call Include and certain
things are allowed and certain not allowed because they are
always treated as resource configs .. and so on, The patch below should 
fix it, I simply copied ap_process_resource_config and removed the lines 
that warp the context, ap_process_include_config inherits the correct 
context from it's caller.

Index: src/include/http_config.h
===================================================================
RCS file: /home/cvspublic/apache-1.3/src/include/http_config.h,v
retrieving revision 1.108
diff -u -r1.108 http_config.h
--- src/include/http_config.h	13 Mar 2002 21:05:29 -0000	1.108
+++ src/include/http_config.h	28 May 2002 17:15:11 -0000
@@ -373,6 +373,8 @@
 CORE_EXPORT(const char *) ap_init_virtual_host(pool *p, const char *hostname,
 				server_rec *main_server, server_rec **);
 CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp);
+CORE_EXPORT(void) ap_process_include_config(server_rec *s, char *fname, pool *p, pool *ptemp,
+		                cmd_parms *parms);
 
 /* ap_check_cmd_context() definitions: */
 API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden);
Index: src/main/http_config.c
===================================================================
RCS file: /home/cvspublic/apache-1.3/src/main/http_config.c,v
retrieving revision 1.163
diff -u -r1.163 http_config.c
--- src/main/http_config.c	13 Mar 2002 21:05:30 -0000	1.163
+++ src/main/http_config.c	28 May 2002 17:15:12 -0000
@@ -1206,6 +1206,101 @@
     return strcmp(f1->fname,f2->fname);
 }
 
+CORE_EXPORT(void) ap_process_include_config(server_rec *s, char *fname, pool *p, pool *ptemp, 
+		cmd_parms *parms)
+{
+    const char *errmsg;
+    struct stat finfo;
+
+    fname = ap_server_root_relative(p, fname);
+
+    if (stat(fname, &finfo) == -1)
+	    return;
+
+    /* 
+     * here we want to check if the candidate file is really a
+     * directory, and most definitely NOT a symlink (to prevent
+     * horrible loops).  If so, let's recurse and toss it back into
+     * the function.
+     */
+    if (ap_is_rdirectory(fname)) {
+	DIR *dirp;
+	struct DIR_TYPE *dir_entry;
+	int current;
+	array_header *candidates = NULL;
+	fnames *fnew;
+
+	/*
+	 * first course of business is to grok all the directory
+	 * entries here and store 'em away. Recall we need full pathnames
+	 * for this.
+	 */
+	fprintf(stderr, "Processing config directory: %s\n", fname);
+	dirp = ap_popendir(p, fname);
+	if (dirp == NULL) {
+	    perror("fopen");
+	    fprintf(stderr, "%s: could not open config directory %s\n",
+		ap_server_argv0, fname);
+#ifdef NETWARE
+	    clean_parent_exit(1);
+#else
+	    exit(1);
+#endif
+	}
+	candidates = ap_make_array(p, 1, sizeof(fnames));
+	while ((dir_entry = readdir(dirp)) != NULL) {
+	    /* strip out '.' and '..' */
+	    if (strcmp(dir_entry->d_name, ".") &&
+		strcmp(dir_entry->d_name, "..")) {
+		fnew = (fnames *) ap_push_array(candidates);
+		fnew->fname = ap_make_full_path(p, fname, dir_entry->d_name);
+	    }
+	}
+	ap_pclosedir(p, dirp);
+	if (candidates->nelts != 0) {
+            qsort((void *) candidates->elts, candidates->nelts,
+              sizeof(fnames), fname_alphasort);
+	    /*
+	     * Now recurse these... we handle errors and subdirectories
+	     * via the recursion, which is nice
+	     */
+	    for (current = 0; current < candidates->nelts; ++current) {
+	        fnew = &((fnames *) candidates->elts)[current];
+		fprintf(stderr, " Processing config file: %s\n", fnew->fname);
+		ap_process_resource_config(s, fnew->fname, p, ptemp);
+	    }
+	}
+	return;
+    }
+    
+    if (!(parms->config_file = ap_pcfg_openfile(p,fname))) {
+	perror("fopen");
+	fprintf(stderr, "%s: could not open document config file %s\n",
+		ap_server_argv0, fname);
+#ifdef NETWARE
+        clean_parent_exit(1);
+#else
+	exit(1);
+#endif
+    }
+
+    errmsg = ap_srm_command_loop(parms, s->lookup_defaults);
+
+    if (errmsg) {
+	fprintf(stderr, "Syntax error on line %d of %s:\n",
+		parms->config_file->line_number, parms->config_file->name);
+	fprintf(stderr, "%s\n", errmsg);
+#ifdef NETWARE
+        clean_parent_exit(1);
+#else
+	exit(1);
+#endif
+    }
+
+    ap_cfg_closefile(parms->config_file);
+}
+
+
 CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp)
 {
     const char *errmsg;
Index: src/main/http_core.c
===================================================================
RCS file: /home/cvspublic/apache-1.3/src/main/http_core.c,v
retrieving revision 1.312
diff -u -r1.312 http_core.c
--- src/main/http_core.c	17 May 2002 18:01:57 -0000	1.312
+++ src/main/http_core.c	28 May 2002 17:15:12 -0000
@@ -2674,9 +2674,12 @@
 
 static const char *include_config (cmd_parms *cmd, void *dummy, char *name)
 {
+    static cmd_parms parms;
     name = ap_server_root_relative(cmd->pool, name);
+
+    bcopy(cmd, &parms, sizeof(parms));
     
-    ap_process_resource_config(cmd->server, name, cmd->pool, cmd->temp_pool);
+    ap_process_include_config(cmd->server, name, cmd->pool, cmd->temp_pool, &parms);
 
     return NULL;
 }
-- 
colmmacc@redbrick.dcu.ie        PubKey: colmmacc+pgp@redbrick.dcu.ie  
Web:                                 http://devnull.redbrick.dcu.ie/ 

Re: [PATCH] Include Directives in apache 1.3

Posted by Martin Kraemer <Ma...@Fujitsu-Siemens.com>.
On Tue, May 28, 2002 at 06:36:28PM +0100, Colm MacCárthaigh wrote:
> But the contexts get warped when you call Include and certain
> things are allowed and certain not allowed because they are
> always treated as resource configs .. and so on

Yes, I stubled over that problem myself several times.

> The patch below should 
> fix it, I simply copied ap_process_resource_config and removed the lines 
> that warp the context, ap_process_include_config inherits the correct 
> context from it's caller.

The result would be much more what the user expects from an "Include"
directive.
+1 on concept (some more test driving needed to see whether it causes
any unwanted side effects?)

> Index: src/main/http_core.c
> ===================================================================
> +    bcopy(cmd, &parms, sizeof(parms));

Noooooo.... Bcopy is nonstandard. Use:
> +    memcpy(&parms, cmd, sizeof(parms));
instead. Does it maybe require a (void*) cast? (untested)

   Martin
-- 
<Ma...@Fujitsu-Siemens.com>         |     Fujitsu Siemens
Fon: +49-89-636-46021, FAX: +49-89-636-47655 | 81730  Munich,  Germany

Re: [PATCH] Include Directives in apache 1.3

Posted by Colm MacCárthaigh <co...@Redbrick.DCU.IE>.
On Tue, May 28, 2002 at 06:36:28PM +0100, Colm MacCárthaigh wrote:
> Index: src/main/http_core.c
> ===================================================================
> RCS file: /home/cvspublic/apache-1.3/src/main/http_core.c,v
> retrieving revision 1.312
> diff -u -r1.312 http_core.c
> --- src/main/http_core.c	17 May 2002 18:01:57 -0000	1.312
> +++ src/main/http_core.c	28 May 2002 17:15:12 -0000
> @@ -2674,9 +2674,12 @@
>  
>  static const char *include_config (cmd_parms *cmd, void *dummy, char *name)
>  {
> +    static cmd_parms parms;

*cough*, could have sworn I took that out, should be no static

-- 
colmmacc@redbrick.dcu.ie        PubKey: colmmacc+pgp@redbrick.dcu.ie  
Web:                                 http://devnull.redbrick.dcu.ie/