diff options
| author | Christian Weiske <cweiske@cweiske.de> | 2014-02-13 20:36:26 +0100 |
|---|---|---|
| committer | Christian Weiske <cweiske@cweiske.de> | 2014-02-13 20:36:26 +0100 |
| commit | e648829c18cf722782a125891715373356117fb0 (patch) | |
| tree | 0f136d3e16232b99ec9757b0a9576a37d18b3217 | |
| parent | fd8a57c746babfc215e0d9be0e13259c3f5e1150 (diff) | |
| download | bdrem-e648829c18cf722782a125891715373356117fb0.tar.gz bdrem-e648829c18cf722782a125891715373356117fb0.zip | |
LDAP source driver
| -rw-r--r-- | README.rst | 34 | ||||
| -rw-r--r-- | data/bdrem.config.php.dist | 12 | ||||
| -rw-r--r-- | src/bdrem/Source/Ldap.php | 118 |
3 files changed, 161 insertions, 3 deletions
@@ -1,12 +1,27 @@ ********************************* bdrem - Birthday reminder by mail ********************************* -Birthday reminder that sends out mails (Text and HTML). +Birthday reminder that sends out e-mails. -It can also generate tables on your console/shell output and -normal HTML pages. +It can also generate ASCII tables on your console/shell and normal HTML pages. +======== +Features +======== + +Data sources +============ +- Any SQL database +- An LDAP server +- Birthday reminder files (``.bdf``) + +Output formats +============== +- ASCII table +- HTML +- Email (text + HTML parts) + ============= Configuration @@ -36,6 +51,19 @@ Use ``dblib`` in the DSN:: dblib:host=192.168.1.1;dbname=Databasename +============ +Dependencies +============ +- PHP 5.3 or higher +- PDO +- PEAR packages: + - Console_CommandLine + - Mail + - Mail_mime + - Console_Table + - Net_LDAP2 + + ======= License ======= diff --git a/data/bdrem.config.php.dist b/data/bdrem.config.php.dist index 076533f..6d259e6 100644 --- a/data/bdrem.config.php.dist +++ b/data/bdrem.config.php.dist @@ -23,6 +23,18 @@ $source = array( ) ); +//Source: LDAP +$source = array( + 'Ldap', + array( + 'host' => 'ldap.example.org', + 'basedn' => 'ou=adressbuch,dc=example,dc=org', + 'binddn' => 'cn=FIXME,ou=users,dc=example,dc=org', + 'bindpw' => 'FIXME' + ) +); + + $daysPrev = 3; $daysNext = 14; $locale = 'de_DE.UTF-8'; diff --git a/src/bdrem/Source/Ldap.php b/src/bdrem/Source/Ldap.php new file mode 100644 index 0000000..802d709 --- /dev/null +++ b/src/bdrem/Source/Ldap.php @@ -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; + } + +} +?> |
