r2668 - moved all LDAP options into LDAP_options array
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 27 Apr 2009 16:49:20 +0000 (16:49 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 27 Apr 2009 16:49:20 +0000 (16:49 +0000)
 - displayname_attrs: change format from array of strings to more convenient one string with space delimiters
 - discardLDAPCache(): new helper function
 - authenticated_via_ldap(): discard LDAP cache on LDAP options change

inc/auth.php
inc/database.php
local/secret-sample.php

index fff5c63aaea65a64fd514455dcaeea18f0b49080..f23a9725a30dbe3404a7f2e5953c3f31cd224afc 100644 (file)
@@ -161,14 +161,15 @@ function permitted ($p = NULL, $t = NULL, $o = NULL, $annex = array())
 
 function authenticated_via_ldap ($username, $password)
 {
-       global
-               $ldap_cache_refresh, // read
-               $ldap_cache_retry, // read
-               $ldap_cache_expiry, // read
-               $remote_displayname, // set
-               $auto_tags; // set
+       global $LDAP_options, $remote_displayname, $auto_tags;
 
-       $oldinfo = acquireLDAPCache ($username, sha1 ($password), $ldap_cache_expiry);
+       // Destroy the cache each time config changes.
+       if (sha1 (serialize ($LDAP_options)) != loadScript ('LDAPConfigHash'))
+       {
+               discardLDAPCache();
+               saveScript ('LDAPConfigHash', sha1 (serialize ($LDAP_options)));
+       }
+       $oldinfo = acquireLDAPCache ($username, sha1 ($password), $LDAP_options['cache_expiry']);
        // Remember to have releaseLDAPCache() called before any return statement.
        if ($oldinfo === NULL) // cache miss
        {
@@ -188,7 +189,7 @@ function authenticated_via_ldap ($username, $password)
        // There are two confidence levels of cache hits: "certain" and "uncertain". In either case
        // expect authentication success, unless it's well-timed to perform a retry,
        // which may sometimes bring a NAK decision.
-       if ($oldinfo['success_age'] < $ldap_cache_refresh or $oldinfo['retry_age'] < $ldap_cache_retry)
+       if ($oldinfo['success_age'] < $LDAP_options['cache_refresh'] or $oldinfo['retry_age'] < $LDAP_options['cache_retry'])
        {
                releaseLDAPCache();
                $remote_displayname = $oldinfo['displayed_name'];
@@ -233,35 +234,29 @@ function authenticated_via_ldap ($username, $password)
 // 'result' => 'NAK' : server replied and denied access (or search returned odd data)
 //
 // 'result' => 'ACK' : server replied and cleared access, there were no search errors
-// 'displayed_name' : a string built according to ldap_displayname_attrs option
+// 'displayed_name' : a string built according to LDAP displayname_attrs option
 // 'memberof' => filtered list of all LDAP groups the user belongs to
 //
 function queryLDAPServer ($username, $password)
 {
-       global $ldap_server, $ldap_domain, $ldap_search_dn, $ldap_search_attr;
-       global
-               $ldap_server,
-               $ldap_domain,
-               $ldap_search_dn,
-               $ldap_search_attr,
-               $ldap_displayname_attrs;
+       global $LDAP_options;
 
-       $connect = @ldap_connect ($ldap_server);
+       $connect = @ldap_connect ($LDAP_options['server']);
        if ($connect === FALSE)
                return array ('result' => 'CAN');
 
        // Decide on the username we will actually authenticate for.
-       if (isset ($ldap_domain) and !empty ($ldap_domain))
-               $auth_user_name = $username . "@" . $ldap_domain;
+       if (isset ($LDAP_options['domain']) and !empty ($LDAP_options['domain']))
+               $auth_user_name = $username . "@" . $LDAP_options['domain'];
        elseif
        (
-               isset ($ldap_search_dn) and
-               !empty ($ldap_search_dn) and
-               isset ($ldap_search_attr) and
-               !empty ($ldap_search_attr)
+               isset ($LDAP_options['search_dn']) and
+               !empty ($LDAP_options['search_dn']) and
+               isset ($LDAP_options['search_attr']) and
+               !empty ($LDAP_options['search_attr'])
        )
        {
-               $results = @ldap_search ($connect, $ldap_search_dn, "(${ldap_search_attr}=${username})", array("dn"));
+               $results = @ldap_search ($connect, $LDAP_options['search_dn'], '(' . $LDAP_options['search_attr'] . "=${username})", array("dn"));
                if ($results === FALSE)
                        return array ('result' => 'CAN');
                if (@ldap_count_entries ($connect, $results) != 1)
@@ -293,20 +288,20 @@ function queryLDAPServer ($username, $password)
        // Displayed name only makes sense for authenticated users anyway.
        if
        (
-               isset ($ldap_displayname_attrs) and
-               count ($ldap_displayname_attrs) and
-               isset ($ldap_search_dn) and
-               !empty ($ldap_search_dn) and
-               isset ($ldap_search_attr) and
-               !empty ($ldap_search_attr)
+               isset ($LDAP_options['displayname_attrs']) and
+               count ($LDAP_options['displayname_attrs']) and
+               isset ($LDAP_options['search_dn']) and
+               !empty ($LDAP_options['search_dn']) and
+               isset ($LDAP_options['search_attr']) and
+               !empty ($LDAP_options['search_attr'])
        )
        {
                $results = @ldap_search
                (
                        $connect,
-                       $ldap_search_dn,
-                       "(${ldap_search_attr}=${username})",
-                       array_merge (array ('memberof'), $ldap_displayname_attrs)
+                       $LDAP_options['search_dn'],
+                       '(' . $LDAP_options['search_attr'] . "=${username})",
+                       array_merge (array ('memberof'), explode (' ', $LDAP_options['displayname_attrs']))
                );
                if (@ldap_count_entries ($connect, $results) != 1)
                {
@@ -316,7 +311,7 @@ function queryLDAPServer ($username, $password)
                $info = @ldap_get_entries ($connect, $results);
                ldap_free_result ($results);
                $space = '';
-               foreach ($ldap_displayname_attrs as $attr)
+               foreach (explode (' ', $LDAP_options['displayname_attrs']) as $attr)
                {
                        $ret['displayed_name'] .= $space . $info[0][$attr][0];
                        $space = ' ';
index 7c3d4d931295e8cba77957309ceadfda16d4cb35..3b044e2fa3c99c60c292b61c20ee7131717d63a2 100644 (file)
@@ -3941,4 +3941,10 @@ function deleteLDAPCacheRecord ($form_username)
        return useDeleteBlade ('LDAPCache', 'presented_username', "'${form_username}'");
 }
 
+function discardLDAPCache ()
+{
+       global $dbxlink;
+       $dbxlink->exec ('TRUNCATE TABLE LDAPCache');
+}
+
 ?>
index b46736418196ece0fc27034cf97240a5ac9382fa..1605228bb8139bbadd890c061578d6e79934d15b 100644 (file)
@@ -14,20 +14,24 @@ $user_auth_src = 'database';
 $require_valid_user = TRUE;
 
 // This is only necessary for 'ldap' authentication source
-$ldap_server = 'some.server';
-$ldap_domain = 'some.domain';
-
-#$ldap_search_dn = 'ou=people,O=YourCompany';
-$ldap_search_attr = 'uid';
+$LDAP_options = array
+(
+       'server' => 'some.server',
+       'domain' => 'some.domain',
+#      'search_dn' => 'ou=people,O=YourCompany',
+       'search_attr' => 'uid',
+#      'displayname_attrs' => 'givenname familyname',
 
 // LDAP cache, values in seconds. Refresh, retry and expiry values are
-// treated exactly as for DNS SOA record.
-// Unconditionally remeber success for 5 minutes, then contact server, if
-// possible. If this didn't work for whatever reason, repeat attempts each
-// 15 seconds. After 10 minutes from the first successful authentication
-// discard the cache for that user.
-$ldap_cache_refresh = 300;
-$ldap_cache_retry = 15;
-$ldap_cache_expiry = 600;
+// treated exactly as those for DNS SOA record. Example values 300-15-600:
+// unconditionally remeber successful auth for 5 minutes, after that still
+// permit user access, but try to revalidate username and password on the
+// server (not more often, than once in 15 seconds). After 10 minutes of
+// unsuccessful retries give up and deny access, so someone goes to fix
+// LDAP server.
+       'cache_refresh' => 300,
+       'cache_retry' => 15,
+       'cache_expiry' => 600,
+);
 
 ?>