mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-03-11 16:35:38 +00:00
support login by email
This commit is contained in:
parent
0017137d0b
commit
2b7f90991a
|
@ -126,7 +126,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
* look like if searching for that user didn't return a dn.
|
||||
*/
|
||||
if (isset($settings->_ldapBaseDN)) {
|
||||
$ldapSearchAttribut = "uid=";
|
||||
$ldapSearchAttribut = "uid";
|
||||
/* $tmpDN will only be used as a last resort if searching for the user failed */
|
||||
$tmpDN = "uid=".$username.",".$settings->_ldapBaseDN;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
/* Active directory has a different base dn */
|
||||
if (isset($settings->_ldapType)) {
|
||||
if ($settings->_ldapType==1) {
|
||||
$ldapSearchAttribut = "sAMAccountName=";
|
||||
$ldapSearchAttribut = "sAMAccountName";
|
||||
/* $tmpDN will only be used as a last resort if searching for the user failed */
|
||||
$tmpDN = $username.'@'.$settings->_ldapAccountDomainName;
|
||||
// Add the following if authentication with an Active Dir doesn't work
|
||||
|
@ -157,7 +157,21 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
} else {
|
||||
$bind = @ldap_bind($ds);
|
||||
}
|
||||
|
||||
$dn = false;
|
||||
|
||||
/* The simplest search is just the username */
|
||||
$ldapsearchterm = $ldapSearchAttribut.'='.$username;
|
||||
/* If login by email is allowed, the search for user name is ored with
|
||||
* the search for the email.
|
||||
*/
|
||||
if($settings->_enableLoginByEmail) {
|
||||
$ldapsearchterm = "|(".$ldapsearchterm.")(mail=".$username.")";
|
||||
}
|
||||
/* If a ldap filter is set, it will be anded */
|
||||
if($settings->_ldapFilter) {
|
||||
$ldapsearchterm = "&(".$ldapsearchterm.")".$settings->_ldapFilter;
|
||||
}
|
||||
/* If bind succeed, then get the dn of the user. If a filter
|
||||
* is set, it will be used to allow only those users to log in
|
||||
* matching the filter criteria. Depending on the type of server,
|
||||
|
@ -165,19 +179,32 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
* 'sAMAccountName=' or 'uid='. All other filters are ANDed.
|
||||
* A common filter is '(mail=*)' to ensure a user has an email
|
||||
* address.
|
||||
* If the previous bind failed, we could try later to bind with
|
||||
* the user's credentials (this was until 6.0.26 and 5.1.33 the case),
|
||||
* but if login by email is allowed, it makes no sense to try it. The
|
||||
* only way to bind is by using a correct dn and that cannot be
|
||||
* formed with an email.
|
||||
*/
|
||||
if ($bind) {
|
||||
/*
|
||||
if (!empty($settings->_ldapFilter)) {
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.'='.$username.")".$settings->_ldapFilter.")");
|
||||
} else {
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.$username);
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.'='.$username);
|
||||
}
|
||||
*/
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, "(".$ldapsearchterm.")");
|
||||
if (!is_bool($search)) {
|
||||
$info = ldap_get_entries($ds, $search);
|
||||
if (!is_bool($info) && $info["count"]>0) {
|
||||
$dn = $info[0]['dn'];
|
||||
/* Set username to login name in case the email was used for authentication */
|
||||
$username = $info[0][$ldapSearchAttribut][0];
|
||||
}
|
||||
}
|
||||
} elseif(!empty($settings->_enableLoginByEmail)) {
|
||||
ldap_close($ds);
|
||||
return null;
|
||||
}
|
||||
|
||||
/* If the previous bind failed, try it with the users creditionals
|
||||
|
@ -190,8 +217,10 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
* If that user was filtered out, because filter was set to '(mail=*)'
|
||||
* and the user doesn't have a mail address, then $dn will not be
|
||||
* set and $tmpDN will be used instead, allowing a successfull bind.
|
||||
* Also do not take the $tmpDN if login by email is allowed, because
|
||||
* the username could be the email and that doesn't form a valid dn.
|
||||
*/
|
||||
if (is_bool($dn) && empty($settings->_ldapFilter)) {
|
||||
if (is_bool($dn) && empty($settings->_ldapFilter) && empty($settings->_enableLoginByEmail)) {
|
||||
$dn = $tmpDN;
|
||||
}
|
||||
|
||||
|
@ -203,6 +232,9 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
|
||||
/* Check if user already exists in the database. Return with an error
|
||||
* only if the sql statements fails, but not if no user was found.
|
||||
* The username may not be the one passed to this function anymore. It
|
||||
* could have been overwritten by uid (or sAMAccountName) derived from
|
||||
* the above ldap search.
|
||||
*/
|
||||
$user = $dms->getUserByLogin($username);
|
||||
if($user === false) {
|
||||
|
@ -219,13 +251,15 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication {
|
|||
|
||||
// Successfully authenticated. Now check to see if the user exists within
|
||||
// the database. If not, add them in if _restricted is not set,
|
||||
// but do not add their password.
|
||||
// but do not set the password of the user.
|
||||
if (!$settings->_restricted) {
|
||||
// Retrieve the user's LDAP information.
|
||||
/* Retrieve the user's LDAP information. At this time the username is
|
||||
* the uid or sAMAccountName, even if the email was used for login.
|
||||
*/
|
||||
if (isset($settings->_ldapFilter) && strlen($settings->_ldapFilter) > 0) {
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.$username.")".$settings->_ldapFilter.")");
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, "(&(".$ldapSearchAttribut.'='.$username.")".$settings->_ldapFilter.")");
|
||||
} else {
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.$username);
|
||||
$search = ldap_search($ds, $settings->_ldapBaseDN, $ldapSearchAttribut.'='.$username);
|
||||
}
|
||||
|
||||
if (!is_bool($search)) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user