]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r463427 from trunk:
authorJim Jagielski <jim@apache.org>
Fri, 8 Dec 2006 15:29:36 +0000 (15:29 +0000)
committerJim Jagielski <jim@apache.org>
Fri, 8 Dec 2006 15:29:36 +0000 (15:29 +0000)
mod_authnz_ldap: Add an AuthLDAPRemoteUserAttribute directive. If
set, REMOTE_USER will be set to this attribute, rather than the
username supplied by the user. Useful for example when you want users
to log in using an email address, but need to supply a userid instead
to the backend.

Submitted by: minfrin
Reviewed by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@484638 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
docs/manual/mod/mod_authnz_ldap.xml
modules/aaa/mod_authnz_ldap.c

diff --git a/CHANGES b/CHANGES
index 358dfe4f950c5a8ec48424f3e6814953ea013ea6..110d4f276e8ddbe723c35f39a20b9b54c01a5f75 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,12 @@
                                                         -*- coding: utf-8 -*-
 Changes with Apache 2.2.4
 
+  *) mod_authnz_ldap: Add an AuthLDAPRemoteUserAttribute directive. If
+     set, REMOTE_USER will be set to this attribute, rather than the
+     username supplied by the user. Useful for example when you want users
+     to log in using an email address, but need to supply a userid instead
+     to the backend. [Graham Leggett]
+
   *) mod_cgi and mod_cgid: Don't use apr_status_t error return
      from input filters as HTTP return value from the handler.
      PR#31579.
diff --git a/STATUS b/STATUS
index 608d75bd0fb7d803cce4a8a48e9a230cd426be48..82527db587f2d29fab6d089c3a9f0b8c338130c8 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -96,14 +96,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
      wrowe adds; keeping the old idents for backporting would have
                  made this alot easier for review - mind \x09's please.
 
-    * mod_authnz_ldap: Add an AuthLDAPRemoteUserAttribute directive. If
-      set, REMOTE_USER will be set to this attribute, rather than the
-      username supplied by the user. Useful for example when you want users
-      to log in using an email address, but need to supply a userid instead
-      to the backend.
-      Trunk: http://svn.apache.org/viewvc?view=rev&rev=463427
-      +1: minfrini, wrowe, jim
-
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
 
     * mod_mem_cache: Convert mod_mem_cache to use APR memory pool functions
index e4335e5ed6954551f63fd767ae1462296e979fdc..1b00366665a559fbbac682ec7d47d78f7bfbf2e2 100644 (file)
@@ -802,6 +802,29 @@ group membership</description>
 </usage>
 </directivesynopsis>
 
+<directivesynopsis>
+<name>AuthLDAPRemoteUserAttribute</name>
+<description>Use the value of the attribute returned during the user
+query to set the REMOTE_USER environment variable</description>
+<syntax>AuthLDAPRemoteUserAttribute uid</syntax>
+<default>none</default>
+<contextlist><context>directory</context><context>.htaccess</context>
+</contextlist>
+<override>AuthConfig</override> 
+      
+<usage>
+    <p>If this directive is set, the value of the 
+    <code>REMOTE_USER</code> environment variable will be set to the
+    value of the attribute specified. Make sure that this attribute is
+    included in the list of attributes in the AuthLDAPUrl definition,
+    otherwise this directive will have no effect. This directive, if
+    present, takes precedence over AuthLDAPRemoteUserIsDN. This
+    directive is useful should you want people to log into a website
+    using an email address, but a backend application expects the
+    username as a userid.</p>
+</usage>
+</directivesynopsis>
+
 <directivesynopsis>
 <name>AuthLDAPRemoteUserIsDN</name>
 <description>Use the DN of the client username to set the REMOTE_USER
index 5637d091aa25afd4abc96e72c4db8ffaa645b936..4f3d1ca004f80b64132ded9ef62f90d9e1416f10 100644 (file)
@@ -64,6 +64,7 @@ typedef struct {
     char *bindpw;                   /* Password to bind to server (can be NULL) */
 
     int user_is_dn;                 /* If true, connection->user is DN instead of userid */
+    char *remote_user_attribute;    /* If set, connection->user is this attribute instead of userid */
     int compare_dn_on_server;       /* If true, will use server to do DN compare */
 
     int have_ldap_url;              /* Set if we have found an LDAP url */
@@ -303,6 +304,7 @@ static void *create_authnz_ldap_dir_config(apr_pool_t *p, char *d)
     sec->secure = -1;   /*Initialize to unset*/
 
     sec->user_is_dn = 0;
+    sec->remote_user_attribute = NULL;
     sec->compare_dn_on_server = 0;
 
     return sec;
@@ -337,6 +339,7 @@ static authn_status authn_ldap_check_password(request_rec *r, const char *user,
 
     util_ldap_connection_t *ldc = NULL;
     int result = 0;
+    int remote_user_attribute_set = 0;
     const char *dn = NULL;
 
     authn_ldap_request_t *req =
@@ -447,10 +450,28 @@ start_over:
                 j++;
             }
             apr_table_setn(e, str, vals[i]);
+
+            /* handle remote_user_attribute, if set */
+            if (sec->remote_user_attribute && 
+                !strcmp(sec->remote_user_attribute, sec->attributes[i])) {
+                r->user = (char *)apr_pstrdup(r->pool, vals[i]);
+                remote_user_attribute_set = 1;
+            }
             i++;
         }
     }
 
+    /* sanity check */
+    if (sec->remote_user_attribute && !remote_user_attribute_set) {
+        ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r,
+                  "[%" APR_PID_T_FMT "] auth_ldap authenticate: "
+                  "REMOTE_USER was to be set with attribute '%s', "
+                  "but this attribute was not requested for in the "
+                  "LDAP query for the user. REMOTE_USER will fall "
+                  "back to username or DN as appropriate.", getpid(),
+                  sec->remote_user_attribute);
+    }
+
     ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                   "[%" APR_PID_T_FMT "] auth_ldap authenticate: accepting %s", getpid(), user);
 
@@ -1041,6 +1062,13 @@ static const command_rec authnz_ldap_cmds[] =
                  "DN of the remote user. By default, this is set to off, meaning that "
                  "the REMOTE_USER variable will contain whatever value the remote user sent."),
 
+    AP_INIT_TAKE1("AuthLDAPRemoteUserAttribute", ap_set_string_slot,
+                 (void *)APR_OFFSETOF(authn_ldap_config_t, 
+                                      remote_user_attribute), OR_AUTHCFG,
+                 "Override the user supplied username and place the "
+                 "contents of this attribute in the REMOTE_USER "
+                 "environment variable."),
+
     AP_INIT_FLAG("AuthzLDAPAuthoritative", ap_set_flag_slot,
                  (void *)APR_OFFSETOF(authn_ldap_config_t, auth_authoritative), OR_AUTHCFG,
                  "Set to 'off' to allow access control to be passed along to lower modules if "