detect user display name attribute and return user count depending on its presence

This commit is contained in:
Arthur Schiwon 2014-10-24 18:26:48 +02:00
parent 288acb55a0
commit cb3af1dce2
3 changed files with 59 additions and 7 deletions

View File

@ -62,6 +62,7 @@ switch($action) {
case 'guessPortAndTLS': case 'guessPortAndTLS':
case 'guessBaseDN': case 'guessBaseDN':
case 'detectEmailAttribute': case 'detectEmailAttribute':
case 'detectUserDisplayNameAttribute':
case 'determineGroupMemberAssoc': case 'determineGroupMemberAssoc':
case 'determineUserObjectClasses': case 'determineUserObjectClasses':
case 'determineGroupObjectClasses': case 'determineGroupObjectClasses':
@ -115,4 +116,3 @@ switch($action) {
//TODO: return 4xx error //TODO: return 4xx error
break; break;
} }

View File

@ -151,8 +151,10 @@ var LdapWizard = {
ajaxRequests: {}, ajaxRequests: {},
ajax: function(param, fnOnSuccess, fnOnError, reqID) { ajax: function(param, fnOnSuccess, fnOnError, reqID) {
if(reqID !== undefined) { if(typeof reqID !== 'undefined') {
if(LdapWizard.ajaxRequests.hasOwnProperty(reqID)) { if(LdapWizard.ajaxRequests.hasOwnProperty(reqID)) {
console.log('aborting ' + reqID);
console.log(param);
LdapWizard.ajaxRequests[reqID].abort(); LdapWizard.ajaxRequests[reqID].abort();
} }
} }
@ -167,7 +169,7 @@ var LdapWizard = {
} }
} }
); );
if(reqID !== undefined) { if(typeof reqID !== 'undefined') {
LdapWizard.ajaxRequests[reqID] = request; LdapWizard.ajaxRequests[reqID] = request;
} }
}, },
@ -342,7 +344,7 @@ var LdapWizard = {
}, },
_countThings: function(method, spinnerID, doneCallback) { _countThings: function(method, spinnerID, doneCallback) {
param = 'action='+method+ var param = 'action='+method+
'&ldap_serverconfig_chooser='+ '&ldap_serverconfig_chooser='+
encodeURIComponent($('#ldap_serverconfig_chooser').val()); encodeURIComponent($('#ldap_serverconfig_chooser').val());
@ -371,7 +373,12 @@ var LdapWizard = {
}, },
countUsers: function(doneCallback) { countUsers: function(doneCallback) {
LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback); //we make user counting depending on having a display name attribute
var param = 'action=detectUserDisplayNameAttribute' +
'&ldap_serverconfig_chooser='+
encodeURIComponent($('#ldap_serverconfig_chooser').val());
LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback);
}, },
detectEmailAttribute: function() { detectEmailAttribute: function() {

View File

@ -56,7 +56,7 @@ class Wizard extends LDAPUtility {
Wizard::$l = \OC::$server->getL10N('user_ldap'); Wizard::$l = \OC::$server->getL10N('user_ldap');
} }
$this->access = $access; $this->access = $access;
$this->result = new WizardResult; $this->result = new WizardResult();
} }
public function __destruct() { public function __destruct() {
@ -120,7 +120,11 @@ class Wizard extends LDAPUtility {
* @throws \Exception * @throws \Exception
*/ */
public function countUsers() { public function countUsers() {
$filter = $this->configuration->ldapUserFilter; $this->detectUserDisplayNameAttribute();
$filter = $this->access->combineFilterWithAnd(array(
$this->configuration->ldapUserFilter,
$this->configuration->ldapUserDisplayName . '=*'
));
$usersTotal = $this->countEntries($filter, 'users'); $usersTotal = $this->countEntries($filter, 'users');
$usersTotal = ($usersTotal !== false) ? $usersTotal : 0; $usersTotal = ($usersTotal !== false) ? $usersTotal : 0;
@ -151,6 +155,47 @@ class Wizard extends LDAPUtility {
return $this->access->countUsers($filter); return $this->access->countUsers($filter);
} }
/**
* detects the display name attribute. If a setting is already present that
* returns at least one hit, the detection will be canceled.
* @return WizardResult|bool
*/
public function detectUserDisplayNameAttribute() {
if(!$this->checkRequirements(array('ldapHost',
'ldapPort',
'ldapBase',
'ldapUserFilter',
))) {
return false;
}
$attr = $this->configuration->ldapUserDisplayName;
if($attr !== 'displayName' && !empty($attr)) {
// most likely not the default value with upper case N,
// verify it still produces a result
$count = intval($this->countUsersWithAttribute($attr));
if($count > 0) {
//no change, but we sent it back to make sure the user interface
//is still correct, even if the ajax call was cancelled inbetween
$this->result->addChange('ldap_display_name', $attr);
return $this->result;
}
}
// first attribute that has at least one result wins
$displayNameAttrs = array('displayname', 'cn');
foreach ($displayNameAttrs as $attr) {
$count = intval($this->countUsersWithAttribute($attr));
if($count > 0) {
$this->applyFind('ldap_display_name', $attr);
return $this->result;
}
};
throw new \Exception(self::$t->l('Could not detect user display name attribute. Please specify it yourself in advanced ldap settings.'));
}
/** /**
* detects the most often used email attribute for users applying to the * detects the most often used email attribute for users applying to the
* user list filter. If a setting is already present that returns at least * user list filter. If a setting is already present that returns at least