- operational attributes are specified with new conf directive,
  WebAuthLdapOperationalAttribute
- same semantics as WebAuthLdapAttribute
- also placed into environment
---
 docs/mod_webauthldap.xml       | 31 +++++++++++++++++-
 modules/ldap/config.c          | 15 +++++++--
 modules/ldap/mod_webauthldap.c | 71 +++++++++++++++++++++++++++++++++++++++++-
 modules/ldap/mod_webauthldap.h |  2 ++
 4 files changed, 115 insertions(+), 4 deletions(-)

diff --git a/docs/mod_webauthldap.xml b/docs/mod_webauthldap.xml
index 78c135c..9a680b8 100644
--- a/docs/mod_webauthldap.xml
+++ b/docs/mod_webauthldap.xml
@@ -202,7 +202,8 @@ override this behavior, see
 <a href="#webauthldapseparator">WebAuthLdapSeparator</a>.</p>

 <p>The attributes can be any attribute found in your LDAP server that
-the server using this module has access to read.</p>
+the server using this module has access to read, except for operational
+attributes, like entryUUID.</p>

 <example><title>Example</title>
 &lt;Location /private/&gt;<br />
@@ -216,6 +217,34 @@ WebAuthLdapAttribute suUnivid<br />
 </usage>
 </directivesynopsis>

+<directivesynopsis>
+<name>WebAuthLdapOperationalAttribute</name>
+<description>LDAP operational attribute to place in the 
environment</description>
+<syntax>WebAuthLdapOperationalAttribute<em>oper_attribute</em>  
[<em>oper_attribute</em>] ...</syntax>
+<default>none</default>
+<contextlist>
+<context>directory</context>
+<context>.htaccess</context>
+</contextlist>
+
+<usage>
+<p>All attributes defined by this directive will be looked up additionally
+and their values will be inserted into the environment. This directive can
+also be used multiple times.</p>
+
+<p>Like<a href="#webauthldapattribute">WebAuthLdapAttribute</a>, the name
+of the enviornment variable is formed by prepending WEBAUTH_LDAP_ to the
+uppercased name. Multivalued attributes work exactly the same as well.</p>
+
+<example><title>Example</title></example>
+&lt;Location /private/&gt;<br />
+AuthType WebAuth<br />
+Require privgroup stanford:staff<br />
+WebAuthLdapOperationalAttribute entryUUID<br />
+&lt;/Location&gt;<br/>
+</example>
+</usage>
+</directivesynopsis>

 <directivesynopsis>
 <name>WebAuthLdapAuthorizationAttribute</name>
diff --git a/modules/ldap/config.c b/modules/ldap/config.c
index e44e6e0..6e7fd5c 100644
--- a/modules/ldap/config.c
+++ b/modules/ldap/config.c
@@ -45,6 +45,7 @@ APLOG_USE_MODULE(webauthldap);
     static const type DF_ ## name = def;

 DIRN(Attribute,              "additional LDAP attributes to retrieve")
+DIRN(OperationalAttribute,   "operational LDAP attributes to retrieve")
 DIRN(AuthorizationAttribute, "LDAP attribute for privilege groups")
 DIRD(Authrule,               "whether to display the authorization rule",
      bool, true)
@@ -63,6 +64,7 @@ DIRN(TktCache,               "Kerberos ticket cache for LDAP")

 enum {
     E_Attribute,
+    E_OperationalAttribute,
     E_AuthorizationAttribute,
     E_Authrule,
     E_Base,
@@ -75,7 +77,7 @@ enum {
     E_Privgroup,
     E_Separator,
     E_SSL,
-    E_TktCache
+    E_TktCache,
 };

 /*
@@ -199,6 +201,7 @@ mwl_dir_config_merge(apr_pool_t *pool, void *basev, void 
*overv)

     /* FIXME: Should probably remove duplicates. */
     MERGE_ARRAY(attribs);
+    MERGE_ARRAY(oper_attribs);
     MERGE_ARRAY(privgroups);
     return conf;
 }
@@ -317,7 +320,7 @@ cfg_str(cmd_parms *cmd, void *mconf, const char *arg)
     struct server_config *sconf;
     struct dir_config *dconf = mconf;
     const char *err = NULL;
-    const char **attrib, **privgroup;
+    const char **attrib, **privgroup, **oper_attrib;

     sconf = ap_get_module_config(cmd->server->module_config,
                                  &webauthldap_module);
@@ -358,6 +361,13 @@ cfg_str(cmd_parms *cmd, void *mconf, const char *arg)
         attrib = apr_array_push(dconf->attribs);
         *attrib = apr_pstrdup(cmd->pool, arg);
         break;
+    case E_OperationalAttribute:
+        if (dconf->oper_attribs == NULL)
+            dconf->oper_attribs
+                = apr_array_make(cmd->pool, 5, sizeof(const char *));
+        oper_attrib = apr_array_push(dconf->oper_attribs);
+        *oper_attrib = apr_pstrdup(cmd->pool, arg);
+        break;
     case E_Privgroup:
         if (dconf->privgroups == NULL)
             dconf->privgroups
@@ -467,6 +477,7 @@ const command_rec webauthldap_cmds[] = {
     DIRECTIVE(AP_INIT_TAKE1,   cfg_str,   RSRC_CONF,  TktCache),

     DIRECTIVE(AP_INIT_ITERATE, cfg_str,   OR_AUTHCFG, Attribute),
+    DIRECTIVE(AP_INIT_ITERATE, cfg_str,   OR_AUTHCFG, OperationalAttribute),
     DIRECTIVE(AP_INIT_ITERATE, cfg_str,   OR_AUTHCFG, Privgroup),

     { NULL, { NULL }, NULL, OR_NONE, RAW_ARGS, NULL }
diff --git a/modules/ldap/mod_webauthldap.c b/modules/ldap/mod_webauthldap.c
index 5701720..bcea718 100644
--- a/modules/ldap/mod_webauthldap.c
+++ b/modules/ldap/mod_webauthldap.c
@@ -263,7 +263,7 @@ webauthldap_init(MWAL_LDAP_CTXT* lc)
     int i;
     char** attrib;
     char *p, *privgroup;
-    apr_array_header_t* attribs;
+    apr_array_header_t* attribs, *oper_attribs;

     if (lc->sconf->debug)
         ap_log_error(APLOG_MARK, APLOG_INFO, 0, lc->r->server, "%s %s",
@@ -298,6 +298,21 @@ webauthldap_init(MWAL_LDAP_CTXT* lc)
         }
     }

+    if (lc->dconf->oper_attribs) {
+        oper_attribs = apr_array_copy(lc->r->pool, lc->dconf->oper_attribs);
+
+        for (i = 0; ((attrib = apr_array_pop(oper_attribs)) != NULL); i++) {
+            for (p = *attrib; *p != '\0'; p++)
+                *p = toupper(*p);
+            apr_table_set(lc->envvars, *attrib, *attrib);
+
+            if (lc->sconf->debug)
+                ap_log_error(APLOG_MARK, APLOG_INFO, 0, lc->r->server,
+                             "webauthldap(%s): oper attribute to put into env: 
%s",
+                             lc->r->user, *attrib);
+        }
+    }
+
     /* Allocate the privgroups table, and populate its keys with the
        privgroups we've been asked to check and export. We do not care about
        the values in this table; we're only using it to generate a set of
@@ -1177,6 +1192,7 @@ auth_checker_hook(request_rec * r)
     /* if we have attributes to set or privgroups to check, we need to keep
        going */
     if (!apr_is_empty_array((const apr_array_header_t *)lc->dconf->attribs) ||
+        !apr_is_empty_array((const apr_array_header_t 
*)lc->dconf->oper_attribs) ||
         !apr_is_empty_array((const apr_array_header_t *)lc->dconf->privgroups))
         needs_further_handling = 1;
     else if (reqs_arr) {
@@ -1301,6 +1317,34 @@ auth_checker_hook(request_rec * r)

     apr_table_do(webauthldap_exportprivgroup, lc, lc->privgroups, NULL);

+    /*
+     * If configured to look for operational attributes, query LDAP again for
+     * all operational attributes and export them into the environment.
+     */
+     if (lc->dconf->oper_attribs != NULL) {
+        if (lc->sconf->debug)
+            ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
+                "webauthldap: looking up operational attributes");
+
+        lc->attrs = apr_pcalloc(lc->r->pool, (sizeof(char*) * 2));
+        lc->attrs[0] = LDAP_ALL_OPERATIONAL_ATTRIBUTES;
+        lc->attrs[1] = NULL;
+
+        if (webauthldap_dosearch(lc) != 0) {
+            apr_thread_mutex_unlock(lc->sconf->totalmutex); /* error: unlock */
+            return DECLINED;
+        }
+
+        /* Cool, we got the oper attrs, now set the envvars */
+        for (i = 0; i<  lc->numEntries; i++)
+            apr_table_do(webauthldap_exportattrib, lc, lc->entries[i], NULL);
+        apr_table_do(webauthldap_attribnotfound, lc, lc->envvars, NULL);
+
+        if (lc->sconf->debug)
+            ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
+                "webauthldap: finished looking up params");
+     }
+
     webauthldap_returnconn(lc);
     apr_thread_mutex_unlock(lc->sconf->totalmutex); /**** FINAL UNLOCKING! 
****/

@@ -1506,6 +1550,31 @@ fixups_hook(request_rec *r)
         return DECLINED;
     }
     apr_table_do(webauthldap_exportprivgroup, lc, lc->privgroups, NULL);
+
+    /*
+     * If configured to look for operational attributes, query LDAP again for
+     * all operational attributes and export them into the environment.
+     */
+     if (lc->dconf->oper_attribs != NULL) {
+        if (lc->sconf->debug)
+            ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
+                "webauthldap: looking up operational attributes");
+
+        lc->attrs = apr_pcalloc(lc->r->pool, (sizeof(char*) * 2));
+        lc->attrs[0] = LDAP_ALL_OPERATIONAL_ATTRIBUTES;
+        lc->attrs[1] = NULL;
+
+        if (webauthldap_dosearch(lc) != 0) {
+            apr_thread_mutex_unlock(lc->sconf->totalmutex); /* error: unlock */
+            return DECLINED;
+        }
+
+        /* Cool, we got the oper attrs, now set the envvars */
+        for (i = 0; i<  lc->numEntries; i++)
+            apr_table_do(webauthldap_exportattrib, lc, lc->entries[i], NULL);
+        apr_table_do(webauthldap_attribnotfound, lc, lc->envvars, NULL);
+     }
+
     webauthldap_returnconn(lc);
     apr_thread_mutex_unlock(lc->sconf->totalmutex); /**** FINAL UNLOCKING! 
****/

diff --git a/modules/ldap/mod_webauthldap.h b/modules/ldap/mod_webauthldap.h
index 675fc63..ead6932 100644
--- a/modules/ldap/mod_webauthldap.h
+++ b/modules/ldap/mod_webauthldap.h
@@ -89,6 +89,7 @@ struct server_config {
 struct dir_config {
     apr_array_header_t *attribs;        /* Array of const char * */
     apr_array_header_t *privgroups;     /* Array of const char * */
+       apr_array_header_t *oper_attribs;       /* Array of const char * */
 };

 /* Used for passing things around */
@@ -108,6 +109,7 @@ typedef struct {

     LDAP *ld;
     char **attrs;            /* attributes to retrieve from LDAP, (null = all)
+                                                         * (+ = operational)
                               */
     char *filter;
     int port;
--
1.8.1.4



Reply via email to