describe what the ldap detailler does
[auerswald-callnotifier.git] / src / callnotifier / CallMonitor / Detailler / LDAP.php
index 833fd46c41254ffb7f1ee729c6aafa394033cc22..72fe07bb160ebb0bc72b9b23aea1aced4f550eb7 100644 (file)
@@ -1,10 +1,43 @@
 <?php
 namespace callnotifier;
 
+/**
+ * Fetch caller names from a LDAP address book.
+ *
+ * The following attributes are searched:
+ * - companyPhone
+ * - homePhone
+ * - mobile
+ * - otherPhone
+ * - telephoneNumber
+ *
+ * For the first result, the displayName is used if defined.
+ * If it does not exist, the givenName + sn are used.
+ *
+ * Set "toName" or "fromName", depending on call type.
+ *
+ * Uses the Net_LDAP2 PEAR package
+ */
 class CallMonitor_Detailler_LDAP implements CallMonitor_Detailler
 {
-    public function __construct()
+    /**
+     * Create new ldap name resolver
+     *
+     * @param array $ldapConfig Array of Net_LDAP2 configuration parameters.
+     *                          Some of those you might want to use:
+     *                          - host   - LDAP server host name
+     *                          - basedn - root DN that gets searched
+     *                          - binddn - Username to authenticate with
+     *                          - bindpw - Password for username
+     */
+    public function __construct($ldapConfig)
     {
+        $this->ldap = \Net_LDAP2::connect($ldapConfig);
+        if (\PEAR::isError($this->ldap)) {
+            throw new \Exception(
+                'Could not connect to LDAP-server: ' . $this->ldap->getMessage()
+            );
+        }
     }
 
     public function loadCallDetails(CallMonitor_Call $call)
@@ -18,7 +51,40 @@ class CallMonitor_Detailler_LDAP implements CallMonitor_Detailler
 
     protected function loadName($number)
     {
-        return 'foo';
+        $filter = \Net_LDAP2_Filter::combine(
+            'or',
+            array(
+                \Net_LDAP2_Filter::create('companyPhone', 'equals', $number),
+                \Net_LDAP2_Filter::create('homePhone', 'equals', $number),
+                \Net_LDAP2_Filter::create('mobile', 'equals', $number),
+                \Net_LDAP2_Filter::create('otherPhone', 'equals', $number),
+                \Net_LDAP2_Filter::create('telephoneNumber', 'equals', $number),
+            )
+        );
+        $options = array(
+            'scope' => 'sub',
+            'attributes' => array('displayName', 'givenName', 'sn', 'cn')
+        );
+
+        $search = $this->ldap->search(null, $filter, $options);
+        if (\PEAR::isError($search)) {
+            throw new \Exception(
+                'Error searching LDAP: ' . $search->getMessage()
+            );
+        }
+        if ($search->count() == 0) {
+            return null;
+        }
+
+        $arEntry = $search->shiftEntry()->getValues();
+        if (isset($arEntry['displayName'])) {
+            return $arEntry['displayName'];
+        } else if (isset($arEntry['sn']) && $arEntry['givenName']) {
+            return $arEntry['givenName'] . ' ' . $arEntry['sn'];
+        } else if (isset($arEntry['cn'])) {
+            return $arEntry['cn'];
+        }
+        return null;
     }
 
 }