]> andersk Git - mod-vhost-ldap.git/commitdiff
Use ap_walk_config to configure directives
authorGreg Brockman <gdb@mit.edu>
Sun, 15 Aug 2010 14:51:37 +0000 (10:51 -0400)
committerAnders Kaseorg <andersk@mit.edu>
Fri, 18 Mar 2011 06:33:17 +0000 (02:33 -0400)
The only expected change in behavior here is that directives
configured from LDAP are expected to now behave much more like ones
configured statically, since they now use the same code.  In practice,
this should not work out to a significant difference, but some
directives do seem to have a lot of code that
mod_vhost_ldap_translate_name didn't contain.  (I haven't investigated
this in-depth.)

I also removed logic to deal with r->uri[0] != '\0' && r->uri[0] !=
'/'.  I believe this is not actually relevant anymore, as the tranlate
hook no longer deals with translating to filenames itself, but I could
be mistaken.

mod_vhost_ldap.c

index 5ff766cc0163d46c9cc067816078365050df03d6..0c78330bba7d2c3fe933e14a4d785a905598667d 100644 (file)
@@ -398,6 +398,16 @@ static const char *mod_vhost_ldap_set_fallback(cmd_parms *cmd, void *dummy, cons
     return NULL;
 }
 
+static int reconfigure_directive(apr_pool_t *p,
+                                server_rec *s,
+                                const char *dir,
+                                const char *args)
+{
+    ap_directive_t dir_s = { .directive = dir, .args = args, .next = NULL,
+                             .line_num = 0, .filename = "VhostLDAPConf" };
+    return ap_process_config_tree(s, &dir_s, p, p);
+}
+
 command_rec mod_vhost_ldap_cmds[] = {
     AP_INIT_TAKE1("VhostLDAPURL", mod_vhost_ldap_parse_url, NULL, RSRC_CONF,
                   "URL to define LDAP connection. This should be an RFC 2255 compliant\n"
@@ -436,17 +446,16 @@ static int mod_vhost_ldap_translate_name(request_rec *r)
 {
     server_rec *server;
     const char *error;
+    int code;
     mod_vhost_ldap_request_t *reqc;
     int failures = 0;
     const char **vals = NULL;
     char filtbuf[FILTER_LENGTH];
     mod_vhost_ldap_config_t *conf =
        (mod_vhost_ldap_config_t *)ap_get_module_config(r->server->module_config, &vhost_ldap_module);
-    core_server_config *core;
     util_ldap_connection_t *ldc = NULL;
     int result = 0;
     const char *dn = NULL;
-    char *cgi;
     const char *hostname = NULL;
     int is_fallback = 0;
     int sleep0 = 0;
@@ -461,9 +470,6 @@ static int mod_vhost_ldap_translate_name(request_rec *r)
        return HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    core = core_module.create_server_config(r->pool, server);
-    ap_set_module_config(server->module_config, &core_module, core);
-
     reqc =
        (mod_vhost_ldap_request_t *)apr_pcalloc(r->pool, sizeof(mod_vhost_ldap_request_t));
     memset(reqc, 0, sizeof(mod_vhost_ldap_request_t)); 
@@ -533,7 +539,7 @@ fallback:
            if (strncmp(hostname, "*.", 2) == 0)
                hostname += 2;
            hostname += strcspn(hostname, ".");
-           hostname = apr_pstrcat(r->pool, "*", hostname, NULL);
+           hostname = apr_pstrcat(r->pool, "*", hostname, (const char *)NULL);
            ap_log_rerror(APLOG_MARK, APLOG_NOTICE|APLOG_NOERRNO, 0, r,
                          "[mod_vhost_ldap.c] translate: "
                          "virtual host not found, trying wildcard %s",
@@ -576,25 +582,54 @@ null:
        int i;
        for (i = 0; attributes[i]; i++) {
 
+           const char *directive;
            char *val = apr_pstrdup (r->pool, vals[i]);
+           /* These do not correspond to any real directives */
+           if (strcasecmp (attributes[i], "apacheSuexecUid") == 0) {
+               reqc->uid = val;
+               continue;
+           }
+           else if (strcasecmp (attributes[i], "apacheSuexecGid") == 0) {
+               reqc->gid = val;
+               continue;
+           }
+
            if (strcasecmp (attributes[i], "apacheServerName") == 0) {
                reqc->name = val;
+               directive = "ServerName";
            }
            else if (strcasecmp (attributes[i], "apacheServerAdmin") == 0) {
                reqc->admin = val;
+               directive = "ServerAdmin";
            }
            else if (strcasecmp (attributes[i], "apacheDocumentRoot") == 0) {
                reqc->docroot = val;
+               directive = "DocumentRoot";
            }
            else if (strcasecmp (attributes[i], "apacheScriptAlias") == 0) {
+               if (val != NULL) {
+                   /* Hack to deal with current apacheScriptAlias lagout */
+                   if (strlen(val) > 0 && val[strlen(val) - 1] == '/')
+                       val = apr_pstrcat(r->pool, "/cgi-bin/ ", val, (const char *)NULL);
+                   else
+                       val = apr_pstrcat(r->pool, "/cgi-bin/ ", val, "/", (const char *)NULL);
+                   directive = "ScriptAlias";
+               }
                reqc->cgiroot = val;
            }
-           else if (strcasecmp (attributes[i], "apacheSuexecUid") == 0) {
-               reqc->uid = val;
-           }
-           else if (strcasecmp (attributes[i], "apacheSuexecGid") == 0) {
-               reqc->gid = val;
-           }
+           else {
+               /* This should not actually be reachable, but it's
+                  good to cover all all possible cases */
+                ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r,
+                              "Unexpected attribute %s encountered", attributes[i]);
+                continue;
+            }
+
+           if (val == NULL)
+                continue;
+
+           if ((code = reconfigure_directive(r->pool, server, directive, val)) != 0)
+               return code;
        }
     }
 
@@ -615,64 +650,6 @@ null:
        return HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    cgi = NULL;
-
-    if (reqc->cgiroot) {
-       cgi = strstr(r->uri, "cgi-bin/");
-       if (cgi && (cgi != r->uri + strspn(r->uri, "/"))) {
-           cgi = NULL;
-       }
-    }
-    if (cgi) {
-        /* Set exact filename for CGI script */
-        cgi = apr_pstrcat(r->pool, reqc->cgiroot, cgi + strlen("cgi-bin"), NULL);
-        if ((cgi = ap_server_root_relative(r->pool, cgi))) {
-         ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r,
-                       "[mod_vhost_ldap.c]: ap_document_root is: %s",
-                       ap_document_root(r));
-         r->filename = cgi;
-         r->handler = "cgi-script";
-         apr_table_setn(r->notes, "alias-forced-type", r->handler);
-       }
-    } else if (r->uri[0] == '/') {
-        /* we don't set r->filename here, and let other modules do it
-         * this allows other modules (mod_rewrite.c) to work as usual
-        */
-        /* r->filename = apr_pstrcat (r->pool, reqc->docroot, r->uri, NULL); */
-    } else {
-        /* We don't handle non-file requests here */
-       return DECLINED;
-    }
-
-    server->server_hostname = reqc->name;
-
-    if (reqc->admin) {
-       server->server_admin = reqc->admin;
-    }
-
-    /* Stolen from server/core.c */
-
-    /* Make it absolute, relative to ServerRoot */
-    reqc->docroot = ap_server_root_relative(r->pool, reqc->docroot);
-
-    if (reqc->docroot == NULL) {
-        ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, 
-                      "[mod_vhost_ldap.c] set_document_root: DocumentRoot must be a directory");
-
-        return HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    /* TODO: ap_configtestonly && ap_docrootcheck && */
-    if (apr_filepath_merge((char**)&core->ap_document_root, NULL, reqc->docroot,
-                           APR_FILEPATH_TRUENAME, r->pool) != APR_SUCCESS
-        || !ap_is_directory(r->pool, reqc->docroot)) {
-
-        ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r,
-                     "[mod_vhost_ldap.c] set_document_root: Warning: DocumentRoot [%s] does not exist",
-                     reqc->docroot);
-        core->ap_document_root = reqc->docroot;
-    }
-
     ap_fixup_virtual_host(r->pool, r->server, server);
     r->server = server;
 
This page took 0.0435140000000001 seconds and 5 git commands to generate.