diff --git a/library/Icinga/Protocol/Ldap/LdapCapabilities.php b/library/Icinga/Protocol/Ldap/LdapCapabilities.php index 1ee64eaba..596618d79 100644 --- a/library/Icinga/Protocol/Ldap/LdapCapabilities.php +++ b/library/Icinga/Protocol/Ldap/LdapCapabilities.php @@ -308,12 +308,8 @@ class LdapCapabilities ldap_error($ds) ); } - $cap = new LdapCapabilities( - $connection->cleanupAttributes( - ldap_get_attributes($ds, $entry), - array_flip($fields) - ) - ); + + $cap = new LdapCapabilities($connection->cleanupAttributes(ldap_get_attributes($ds, $entry), $fields)); return $cap; } diff --git a/library/Icinga/Protocol/Ldap/LdapConnection.php b/library/Icinga/Protocol/Ldap/LdapConnection.php index 95d21b987..aa9a1c07e 100644 --- a/library/Icinga/Protocol/Ldap/LdapConnection.php +++ b/library/Icinga/Protocol/Ldap/LdapConnection.php @@ -731,12 +731,7 @@ class LdapConnection implements Selectable, Inspectable $unfoldAttribute = $query->getUnfoldAttribute(); do { if ($unfoldAttribute) { - $rows = $this->cleanupAttributes( - ldap_get_attributes($ds, $entry), - array_flip($fields), - $unfoldAttribute - ); - + $rows = $this->cleanupAttributes(ldap_get_attributes($ds, $entry), $fields, $unfoldAttribute); if (is_array($rows)) { // TODO: Register the DN the same way as a section name in the ArrayDatasource! foreach ($rows as $row) { @@ -760,7 +755,7 @@ class LdapConnection implements Selectable, Inspectable if (! $serverSorting || $offset === 0 || $offset < $count) { $entries[ldap_get_dn($ds, $entry)] = $this->cleanupAttributes( ldap_get_attributes($ds, $entry), - array_flip($fields) + $fields ); } } @@ -874,12 +869,7 @@ class LdapConnection implements Selectable, Inspectable $entry = ldap_first_entry($ds, $results); do { if ($unfoldAttribute) { - $rows = $this->cleanupAttributes( - ldap_get_attributes($ds, $entry), - array_flip($fields), - $unfoldAttribute - ); - + $rows = $this->cleanupAttributes(ldap_get_attributes($ds, $entry), $fields, $unfoldAttribute); if (is_array($rows)) { // TODO: Register the DN the same way as a section name in the ArrayDatasource! foreach ($rows as $row) { @@ -903,7 +893,7 @@ class LdapConnection implements Selectable, Inspectable if (! $serverSorting || $offset === 0 || $offset < $count) { $entries[ldap_get_dn($ds, $entry)] = $this->cleanupAttributes( ldap_get_attributes($ds, $entry), - array_flip($fields) + $fields ); } } @@ -965,8 +955,17 @@ class LdapConnection implements Selectable, Inspectable // necessary to create another array to map attributes case insensitively to their requested counterparts. // This does also apply the virtual alias handling. (Since an LDAP server does not handle such) $loweredFieldMap = array(); - foreach ($requestedFields as $name => $alias) { - $loweredFieldMap[strtolower($name)] = is_string($alias) ? $alias : $name; + foreach ($requestedFields as $alias => $name) { + $loweredName = strtolower($name); + if (isset($loweredFieldMap[$loweredName])) { + if (! is_array($loweredFieldMap[$loweredName])) { + $loweredFieldMap[$loweredName] = array($loweredFieldMap[$loweredName]); + } + + $loweredFieldMap[$loweredName][] = is_string($alias) ? $alias : $name; + } else { + $loweredFieldMap[$loweredName] = is_string($alias) ? $alias : $name; + } } $cleanedAttributes = array(); @@ -984,12 +983,18 @@ class LdapConnection implements Selectable, Inspectable $requestedAttributeName = isset($loweredFieldMap[strtolower($attribute_name)]) ? $loweredFieldMap[strtolower($attribute_name)] : $attribute_name; - $cleanedAttributes[$requestedAttributeName] = $attribute_value; + if (is_array($requestedAttributeName)) { + foreach ($requestedAttributeName as $requestedName) { + $cleanedAttributes[$requestedName] = $attribute_value; + } + } else { + $cleanedAttributes[$requestedAttributeName] = $attribute_value; + } } // The result may not contain all requested fields, so populate the cleaned // result with the missing fields and their value being set to null - foreach ($requestedFields as $name => $alias) { + foreach ($requestedFields as $alias => $name) { if (! is_string($alias)) { $alias = $name; }