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;
 }
-- 
[EMAIL PROTECTED]        PubKey: [EMAIL PROTECTED]  
Web:                                 http://devnull.redbrick.dcu.ie/ 

Reply via email to