From 109ddde944ae17621c4680d9c7172eb585b1626d Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 10 Oct 2013 01:21:05 +0200 Subject: [PATCH] Wizard: autodetection of group-member-assoc attribute --- apps/user_ldap/ajax/wizard.php | 1 + apps/user_ldap/js/settings.js | 16 ++++++++ apps/user_ldap/lib/wizard.php | 61 +++++++++++++++++++++++++++++ apps/user_ldap/lib/wizardresult.php | 7 +++- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/ajax/wizard.php b/apps/user_ldap/ajax/wizard.php index ebeedaee95..c90efdf7e9 100644 --- a/apps/user_ldap/ajax/wizard.php +++ b/apps/user_ldap/ajax/wizard.php @@ -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': diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index 049df9b8b1..6b1f363bba 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -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' diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php index 86cf8d75af..2538fe4a2c 100644 --- a/apps/user_ldap/lib/wizard.php +++ b/apps/user_ldap/lib/wizard.php @@ -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 diff --git a/apps/user_ldap/lib/wizardresult.php b/apps/user_ldap/lib/wizardresult.php index 4c3b563c0c..542f106cad 100644 --- a/apps/user_ldap/lib/wizardresult.php +++ b/apps/user_ldap/lib/wizardresult.php @@ -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() {