Wizard: autodetection of group-member-assoc attribute

This commit is contained in:
Arthur Schiwon 2013-10-10 01:21:05 +02:00
parent 5606b60f36
commit 109ddde944
4 changed files with 84 additions and 1 deletions

View File

@ -46,6 +46,7 @@ $wizard = new \OCA\user_ldap\lib\Wizard($configuration, $ldapWrapper);
switch($action) {
case 'guessPortAndTLS':
case 'guessBaseDN':
case 'determineGroupMemberAssoc':
case 'determineUserObjectClasses':
case 'determineGroupObjectClasses':
case 'determineGroupsForUsers':

View File

@ -226,6 +226,7 @@ var LdapWizard = {
LdapWizard.countUsers();
} else if(type == 'group') {
LdapWizard.countGroups();
LdapWizard.detectGroupMemberAssoc();
}
},
function (result) {
@ -256,6 +257,20 @@ var LdapWizard = {
LdapWizard._countThings('countUsers');
},
detectGroupMemberAssoc: function() {
param = 'action=determineGroupMemberAssoc'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.ajax(param,
function(result) {
//pure background story
},
function (result) {
// error handling
}
);
},
findAttributes: function() {
param = 'action=determineAttributes'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
@ -395,6 +410,7 @@ var LdapWizard = {
LdapWizard.countUsers();
} else if(triggerObj.id == 'ldap_group_filter') {
LdapWizard.countGroups();
LdapWizard.detectGroupMemberAssoc();
}
if(triggerObj.id == 'ldap_loginfilter_username'

View File

@ -230,6 +230,26 @@ class Wizard extends LDAPUtility {
return $this->result;
}
public function determineGroupMemberAssoc() {
if(!$this->checkRequirements(array('ldapHost',
'ldapPort',
'ldapAgentName',
'ldapAgentPassword',
'ldapGroupFilter',
))) {
return false;
}
$attribute = $this->detectGroupMemberAssoc();
if($attribute === false) {
return false;
}
$this->configuration->setConfiguration(array('ldapGroupMemberAssocAttr' => $attribute));
//so it will be saved on destruct
$this->result->markChange();
return $this->result;
}
/**
* @brief detects the available object classes
* @returns the instance's WizardResult instance
@ -462,6 +482,47 @@ class Wizard extends LDAPUtility {
}
}
/**
* @brief tries to detect the group member association attribute which is
* one of 'uniqueMember', 'memberUid', 'member'
* @return mixed, string with the attribute name, false on error
*/
private function detectGroupMemberAssoc() {
$possibleAttrs = array('uniqueMember', 'memberUid', 'member', 'unfugasdfasdfdfa');
$filter = $this->configuration->ldapGroupFilter;
if(empty($filter)) {
return false;
}
$cr = $this->getConnection();
if(!$cr) {
throw new \Excpetion('Could not connect to LDAP');
}
$base = $this->configuration->ldapBase[0];
$rr = $this->ldap->search($cr, $base, $filter, $possibleAttrs);
if(!$this->ldap->isResource($rr)) {
return false;
}
$er = $this->ldap->firstEntry($cr, $rr);
while(is_resource($er)) {
$dn = $this->ldap->getDN($cr, $er);
$attrs = $this->ldap->getAttributes($cr, $er);
$result = array();
for($i = 0; $i < count($possibleAttrs); $i++) {
if(isset($attrs[$possibleAttrs[$i]])) {
$result[$possibleAttrs[$i]] = $attrs[$possibleAttrs[$i]]['count'];
}
}
if(!empty($result)) {
natsort($result);
return key($result);
}
$er = $this->ldap->nextEntry($cr, $er);
}
return false;
}
/**
* @brief Checks whether for a given BaseDN results will be returned
* @param $base the BaseDN to test

View File

@ -26,11 +26,16 @@ namespace OCA\user_ldap\lib;
class WizardResult {
protected $changes = array();
protected $options = array();
protected $markedChange = false;
public function addChange($key, $value) {
$this->changes[$key] = $value;
}
public function markChange() {
$this->markedChange = true;
}
public function addOptions($key, $values) {
if(!is_array($values)) {
$values = array($values);
@ -39,7 +44,7 @@ class WizardResult {
}
public function hasChanges() {
return count($this->changes) > 0;
return (count($this->changes) > 0 || $this->markedChange);
}
public function getResultArray() {