]> BookStack Code Mirror - bookstack/blobdiff - app/Access/LdapService.php
Customization: Added parent tag classes
[bookstack] / app / Access / LdapService.php
index ef6d33f4db146b188495dcbf9732456bcbd74e67..0f456efc24719796aa800f7f8e6cb324a02be1db 100644 (file)
@@ -72,25 +72,23 @@ class LdapService
     }
 
     /**
-     * Calculate the display name.
+     * Build the user display name from the (potentially multiple) attributes defined by the configuration.
      */
-    protected function getUserDisplayName(array $displayNameAttr, array $userDetails, string $defaultValue): string
+    protected function getUserDisplayName(array $userDetails, array $displayNameAttrs, string $defaultValue): string
     {
-        $displayName = [];
-        foreach ($displayNameAttr as $dnAttr) {
+        $displayNameParts = [];
+        foreach ($displayNameAttrs as $dnAttr) {
             $dnComponent = $this->getUserResponseProperty($userDetails, $dnAttr, null);
-            if ($dnComponent !== null) {
-                $displayName[] = $dnComponent;
+            if ($dnComponent) {
+                $displayNameParts[] = $dnComponent;
             }
         }
 
-        if (count($displayName) == 0) {
-            $displayName = $defaultValue;
-        } else {
-            $displayName = implode(' ', $displayName);
+        if (empty($displayNameParts)) {
+            return $defaultValue;
         }
 
-        return $displayName;
+        return implode(' ', $displayNameParts);
     }
 
     /**
@@ -103,21 +101,25 @@ class LdapService
     {
         $idAttr = $this->config['id_attribute'];
         $emailAttr = $this->config['email_attribute'];
-        $displayNameAttr = $this->config['display_name_attribute'];
+        $displayNameAttrs = explode('|', $this->config['display_name_attribute']);
         $thumbnailAttr = $this->config['thumbnail_attribute'];
 
-        $user = $this->getUserWithAttributes($userName, array_filter(array_merge($displayNameAttr, [
-            'cn', 'dn', $idAttr, $emailAttr, $thumbnailAttr,
-        ])));
+        $user = $this->getUserWithAttributes($userName, array_filter([
+            'cn', 'dn', $idAttr, $emailAttr, ...$displayNameAttrs, $thumbnailAttr,
+        ]));
 
         if (is_null($user)) {
             return null;
         }
 
-        $userCn = $this->getUserResponseProperty($user, 'cn', null);
+        $nameDefault = $this->getUserResponseProperty($user, 'cn', null);
+        if (is_null($nameDefault)) {
+            $nameDefault = ldap_explode_dn($user['dn'], 1)[0] ?? $user['dn'];
+        }
+
         $formatted = [
             'uid'   => $this->getUserResponseProperty($user, $idAttr, $user['dn']),
-            'name'  => $this->getUserDisplayName($displayNameAttr, $user, $userCn),
+            'name'  => $this->getUserDisplayName($user, $displayNameAttrs, $nameDefault),
             'dn'    => $user['dn'],
             'email' => $this->getUserResponseProperty($user, $emailAttr, null),
             'avatar' => $thumbnailAttr ? $this->getUserResponseProperty($user, $thumbnailAttr, null) : null,