LDAP source driver
[bdrem.git] / src / bdrem / Source / Ldap.php
diff --git a/src/bdrem/Source/Ldap.php b/src/bdrem/Source/Ldap.php
new file mode 100644 (file)
index 0000000..802d709
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+namespace bdrem;
+
+/**
+ * Fetch data from an LDAP server.
+ * Works fine with evolutionPerson schema.
+ */
+class Source_Ldap
+{
+    protected $config;
+
+    /**
+     * Create new ldap source
+     *
+     * @param array $config 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($config)
+    {
+        $this->config = $config;
+    }
+
+    /**
+     * @param string $strDate Date the events shall be found for, YYYY-MM-DD
+     */
+    public function getEvents($strDate, $nDaysPrevious, $nDaysNext)
+    {
+        //Net_LDAP2 is not E_STRICT compatible
+        error_reporting(error_reporting() & ~E_STRICT);
+
+        $ldap = \Net_LDAP2::connect($this->config);
+        if (\PEAR::isError($ldap)) {
+            throw new \Exception(
+                'Could not connect to LDAP-server: ' . $ldap->getMessage()
+            );
+        }
+
+        $dateAttributes = array(
+            'birthDate'   => 'Birthday',
+            'anniversary' => 'Anniversary',
+        );
+
+        $arDays   = $this->getDates($strDate, $nDaysPrevious, $nDaysNext);
+        $arEvents = array();
+
+        foreach ($dateAttributes as $dateAttribute => $attributeTitle) {
+            $filters = array();
+            foreach ($arDays as $day) {
+                $filters[] = \Net_LDAP2_Filter::create($dateAttribute, 'ends', $day);
+            }
+
+            $filter  = \Net_LDAP2_Filter::combine('or', $filters);
+            $options = array(
+                'scope'      => 'sub',
+                'attributes' => array(
+                    'displayName', 'givenName', 'sn', 'cn', $dateAttribute
+                )
+            );
+
+            $search = $ldap->search(null, $filter, $options);
+            if (!$search instanceof \Net_LDAP2_Search) {
+                throw new \Exception(
+                    'Error searching LDAP: ' . $search->getMessage()
+                );
+            } else if ($search->count() == 0) {
+                continue;
+            }
+
+            while ($entry = $search->shiftEntry()) {
+                $event = new Event(
+                    $this->getNameFromEntry($entry),
+                    $attributeTitle,
+                    $entry->getValue($dateAttribute, 'single')
+                );
+                if ($event->isWithin($strDate, $nDaysPrevious, $nDaysNext)) {
+                    $arEvents[] = $event;
+                }
+            }
+        }
+
+        return $arEvents;
+    }
+
+    protected function getNameFromEntry(\Net_LDAP2_Entry $entry)
+    {
+        $arEntry = $entry->getValues();
+        if (isset($arEntry['displayName'])) {
+            return $arEntry['displayName'];
+        } else if (isset($arEntry['sn']) && isset($arEntry['givenName'])) {
+            return $arEntry['givenName'] . ' ' . $arEntry['sn'];
+        } else if (isset($arEntry['cn'])) {
+            return $arEntry['cn'];
+        }
+        return null;
+    }
+
+    /**
+     * @return array Values like "-01-24" ("-$month-$day")
+     */
+    protected function getDates($strDate, $nDaysPrevious, $nDaysNext)
+    {
+        $ts = strtotime($strDate) - 86400 * $nDaysPrevious;
+        $numDays = $nDaysPrevious + $nDaysNext;
+
+        $arDays = array();
+        do {
+            $arDays[] = date('-m-d', $ts);
+            $ts += 86400;
+        } while (--$numDays >= 0);
+        return $arDays;
+    }
+
+}
+?>