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"
{
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;
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));
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",
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;
}
}
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;