diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php index 3e4efc5b8dbdb..9dbabe4e3f705 100644 --- a/apps/user_ldap/lib/Access.php +++ b/apps/user_ldap/lib/Access.php @@ -704,7 +704,7 @@ private function ldap2NextcloudNames(array $ldapObjects, bool $isUsers): array { continue; } $sndName = $ldapObject[$sndAttribute][0] ?? ''; - $this->cacheUserDisplayName($ncName, $nameByLDAP, $sndName); + $this->applyUserDisplayName($ncName, $nameByLDAP, $sndName); } elseif ($nameByLDAP !== null) { $this->cacheGroupDisplayName($ncName, $nameByLDAP); } @@ -752,20 +752,16 @@ public function cacheGroupExists(string $gid): void { $this->connection->writeToCache('groupExists' . $gid, true); } - /** - * caches the user display name - * - * @param string $ocName the internal Nextcloud username - * @param string $displayName the display name - * @param string $displayName2 the second display name - * @throws \Exception - */ - public function cacheUserDisplayName(string $ocName, string $displayName, string $displayName2 = ''): void { - $user = $this->userManager->get($ocName); + public function applyUserDisplayName(string $uid, string $displayName, string $displayName2 = ''): void { + $user = $this->userManager->get($uid); if ($user === null) { return; } - $displayName = $user->composeAndStoreDisplayName($displayName, $displayName2); + $composedDisplayName = $user->composeAndStoreDisplayName($displayName, $displayName2); + $this->cacheUserDisplayName($uid, $composedDisplayName); + } + + public function cacheUserDisplayName(string $ocName, string $displayName): void { $cacheKeyTrunk = 'getDisplayName'; $this->connection->writeToCache($cacheKeyTrunk . $ocName, $displayName); } diff --git a/apps/user_ldap/lib/User/User.php b/apps/user_ldap/lib/User/User.php index 2f928d1b67edb..325b7af0d1bf3 100644 --- a/apps/user_ldap/lib/User/User.php +++ b/apps/user_ldap/lib/User/User.php @@ -119,12 +119,8 @@ public function processAttributes(array $ldapEntry): void { $displayName2 = (string)$ldapEntry[$attr][0]; } if ($displayName !== '') { - $this->composeAndStoreDisplayName($displayName, $displayName2); - $this->access->cacheUserDisplayName( - $this->getUsername(), - $displayName, - $displayName2 - ); + $composedDisplayName = $this->composeAndStoreDisplayName($displayName, $displayName2); + $this->access->cacheUserDisplayName($this->getUsername(), $composedDisplayName); } unset($attr); @@ -134,7 +130,8 @@ public function processAttributes(array $ldapEntry): void { $attr = strtolower($this->connection->ldapEmailAttribute); if (isset($ldapEntry[$attr])) { $mailValue = 0; - for ($x = 0; $x < count($ldapEntry[$attr]); $x++) { + $emailValues = count($ldapEntry[$attr]); + for ($x = 0; $x < $emailValues; $x++) { if (filter_var($ldapEntry[$attr][$x], FILTER_VALIDATE_EMAIL)) { $mailValue = $x; break; @@ -457,6 +454,10 @@ public function composeAndStoreDisplayName(string $displayName, string $displayN return $displayName; } + public function fetchStoredDisplayName(): string { + return $this->userConfig->getValueString($this->uid, 'user_ldap', 'displayName', ''); + } + /** * Stores the LDAP Username in the Database */ diff --git a/apps/user_ldap/lib/User_LDAP.php b/apps/user_ldap/lib/User_LDAP.php index c515002a2de95..22475ceccab6e 100644 --- a/apps/user_ldap/lib/User_LDAP.php +++ b/apps/user_ldap/lib/User_LDAP.php @@ -262,7 +262,8 @@ public function getUsers($search = '', $limit = 10, $offset = 0) { /** * checks whether a user is still available on LDAP * - * @param string|User $user either the Nextcloud user id or an instance of that user + * @param string|User $user either the Nextcloud user id or an instance of + * that user * @throws \Exception * @throws ServerNotAvailableException */ @@ -421,26 +422,21 @@ public function getHome($uid) { return $path; } - /** - * get display name of the user - * @param string $uid user ID of the user - * @return string|false display name - */ - public function getDisplayName($uid) { - if ($this->userPluginManager->implementsActions(Backend::GET_DISPLAYNAME)) { - return $this->userPluginManager->getDisplayName($uid); - } - - if (!$this->userExists($uid)) { - return false; + private function getDisplayNameFromDatabase(string $uid): ?string { + $user = $this->access->userManager->get($uid); + if ($user instanceof User) { + $displayName = $user->fetchStoredDisplayName(); + if ($displayName !== '') { + return $displayName; + } } - - $cacheKey = 'getDisplayName' . $uid; - if (!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) { - return $displayName; + if ($user instanceof OfflineUser) { + return $user->getDisplayName(); } + return null; + } - //Check whether the display name is configured to have a 2nd feature + private function getDisplayNameFromLdap(string $uid): string { $additionalAttribute = $this->access->connection->ldapUserDisplayName2; $displayName2 = ''; if ($additionalAttribute !== '') { @@ -462,16 +458,40 @@ public function getDisplayName($uid) { $user = $this->access->userManager->get($uid); if ($user instanceof User) { - $displayName = $user->composeAndStoreDisplayName($displayName, (string)$displayName2); - $this->access->connection->writeToCache($cacheKey, $displayName); + return $user->composeAndStoreDisplayName($displayName, (string)$displayName2); } if ($user instanceof OfflineUser) { - $displayName = $user->getDisplayName(); + return $user->getDisplayName(); } + } + + return ''; + } + + public function getDisplayName($uid): string { + if ($this->userPluginManager->implementsActions(Backend::GET_DISPLAYNAME)) { + return $this->userPluginManager->getDisplayName($uid); + } + + if (!$this->userExists($uid)) { + return ''; + } + + $cacheKey = 'getDisplayName' . $uid; + if (!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) { return $displayName; } - return null; + if ($displayName = $this->getDisplayNameFromDatabase($uid)) { + $this->access->connection->writeToCache($cacheKey, $displayName); + return $displayName; + } + + if ($displayName = $this->getDisplayNameFromLdap($uid)) { + $this->access->connection->writeToCache($cacheKey, $displayName); + } + + return $displayName; } /** @@ -495,7 +515,8 @@ public function setDisplayName($uid, $displayName) { * @param string $search * @param int|null $limit * @param int|null $offset - * @return array an array of all displayNames (value) and the corresponding uids (key) + * @return array an array of all displayNames (value) and the corresponding + * uids (key) */ public function getDisplayNames($search = '', $limit = null, $offset = null) { $cacheKey = 'getDisplayNames-' . $search . '-' . $limit . '-' . $offset; diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index 635292944d245..217b1f8c278d5 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -2605,16 +2605,10 @@ - - - - - - 0)]]>