diff --git a/apps/user_ldap/js/wizard/view.js b/apps/user_ldap/js/wizard/view.js index 1a89eba35156f..30a00d614ccef 100644 --- a/apps/user_ldap/js/wizard/view.js +++ b/apps/user_ldap/js/wizard/view.js @@ -86,7 +86,8 @@ OCA = OCA || {}; var agent = view.configModel.configuration.ldap_dn; var pwd = view.configModel.configuration.ldap_agent_password; - if((host && port && base) && ((!agent && !pwd) || (agent && pwd))) { + if(((host && port && base) || (host && base && host.indexOf('ldapi://') > -1 )) + && ((!agent && !pwd) || (agent && pwd))) { view.enableTabs(); } else { view.disableTabs(); @@ -107,7 +108,8 @@ OCA = OCA || {}; var userFilter = this.configModel.configuration.ldap_userlist_filter; var loginFilter = this.configModel.configuration.ldap_login_filter; - if(host && port && base && userFilter && loginFilter) { + if((host && port && base && userFilter && loginFilter) || + (host && base && host.indexOf('ldapi://') > -1 && userFilter && loginFilter)) { this.configModel.requestConfigurationTest(); } else { this._updateStatusIndicator(this.STATUS_INCOMPLETE); diff --git a/apps/user_ldap/lib/Wizard.php b/apps/user_ldap/lib/Wizard.php index eb0b775345bd8..82d940ae453b1 100644 --- a/apps/user_ldap/lib/Wizard.php +++ b/apps/user_ldap/lib/Wizard.php @@ -20,6 +20,7 @@ * @author Tobias Perschon * @author Victor Dubiniuk * @author Xuanwo + * @author Vincent Van Houtte * * @license AGPL-3.0 * @@ -95,7 +96,10 @@ public function __destruct() { * @throws \Exception */ public function countEntries(string $filter, string $type): int { - $reqs = ['ldapHost', 'ldapPort', 'ldapBase']; + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } if ($type === 'users') { $reqs[] = 'ldapUserFilter'; } @@ -201,11 +205,11 @@ public function countInBaseDN() { * @return int|bool */ public function countUsersWithAttribute($attr, $existsCheck = false) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -226,11 +230,11 @@ public function countUsersWithAttribute($attr, $existsCheck = false) { * @throws \Exception */ public function detectUserDisplayNameAttribute() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -268,11 +272,11 @@ public function detectUserDisplayNameAttribute() { * @return WizardResult|bool */ public function detectEmailAttribute() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -315,11 +319,11 @@ public function detectEmailAttribute() { * @throws \Exception */ public function determineAttributes() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -344,11 +348,11 @@ public function determineAttributes() { * @throws \Exception */ private function getUserAttributes() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -400,10 +404,11 @@ public function determineGroupsForUsers() { * @throws \Exception */ private function determineGroups($dbKey, $confKey, $testMemberOf = true) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -480,10 +485,11 @@ public function fetchGroups($dbKey, $confKey) { } public function determineGroupMemberAssoc() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapGroupFilter', - ])) { + $reqs = ['ldapHost', 'ldapGroupFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $attribute = $this->detectGroupMemberAssoc(); @@ -502,10 +508,11 @@ public function determineGroupMemberAssoc() { * @throws \Exception */ public function determineGroupObjectClasses() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -529,10 +536,11 @@ public function determineGroupObjectClasses() { * @throws \Exception */ public function determineUserObjectClasses() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -559,10 +567,11 @@ public function determineUserObjectClasses() { * @throws \Exception */ public function getGroupFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } //make sure the use display name is set @@ -583,10 +592,11 @@ public function getGroupFilter() { * @throws \Exception */ public function getUserListFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } //make sure the use display name is set @@ -609,11 +619,11 @@ public function getUserListFilter() { * @throws \Exception */ public function getUserLoginFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -632,11 +642,11 @@ public function getUserLoginFilter() { * @throws \Exception */ public function testLoginName($loginName) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapLoginFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -719,9 +729,11 @@ public function guessPortAndTLS() { * @return WizardResult|false WizardResult on success, false otherwise */ public function guessBaseDN() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - ])) { + $reqs = ['ldapHost']; + if(substr($this->configuration->ldapHost, 0, strlen('ldapi://')) != 'ldapi://') { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -1318,6 +1330,8 @@ private function getConnection() { * @return array */ private function getDefaultLdapPortSettings() { + // LDAPI unix socket support: why are ports 7389 and 389 duplicated here? + // LDAPI unix socket support: why are tls values wrong here? static $settings = [ ['port' => 7636, 'tls' => false], ['port' => 636, 'tls' => false], @@ -1349,6 +1363,8 @@ private function getPortSettingsToTry() { $portSettings[] = ['port' => $port, 'tls' => true]; } $portSettings[] = ['port' => $port, 'tls' => false]; + } elseif ($port === 0) { + $portSettings[] = ['port' => '', 'tls' => false]; } //default ports