rosehill/libraries/framework/classes/LDAPEntry.php

527 lines
11 KiB
PHP
Raw Normal View History

<?php
/**
* A class for working with entries in LDAP.
*
* This class is written specifically for the City of Bloomington's
* LDAP layout. If you are going to be doing LDAP authentication
* with your own LDAP server, you will probably need to customize
* the fields used in this class.
*
* @copyright 2006-2009 City of Bloomington, Indiana
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.txt
* @author Cliff Ingham <inghamn@bloomington.in.gov>
*/
class LDAPEntry
{
private static $connection;
private $ou;
private $uid;
private $userPassword;
private $givenName;
private $sn;
private $cn;
private $displayName;
private $businessCategory;
private $departmentNumber;
private $physicalDeliveryOfficeName;
private $title;
private $mail;
private $telephoneNumber;
private $preferredTelephoneNumber;
private $webTelephoneNumber;
private $facsimileTelephoneNumber;
private $homePhone;
private $mobile;
private $dialupAccess;
private $jpegPhoto;
private $sambaLMPassword;
private $sambaNTPassword;
private $sambaSID;
private $objectClasses = array();
// Used to keep track of changes we make to this entry. This is because LDAP
// requires us to send seperate modify, add, and delete commands.
private $modifiedAttributes = array();
private $addedAttributes = array();
private $deletedAttributes = array();
/**
* Loads an entry from the LDAP server for the given user
* @param string $username
*/
public function __construct($username=null)
{
$this->openConnection();
if ($username) {
$result = ldap_search(LDAPEntry::$connection,LDAP_DN,
LDAP_USERNAME_ATTRIBUTE."=$username");
if (ldap_count_entries(LDAPEntry::$connection,$result)) {
$entries = ldap_get_entries(LDAPEntry::$connection, $result);
$this->uid = $username;
if (isset($entries[0]['ou'])) {
$this->ou = $entries[0]['ou'][0];
}
if (isset($entries[0]['givenname'])) {
$this->givenName = $entries[0]['givenname'][0];
}
if (isset($entries[0]['sn'])) {
$this->sn = $entries[0]['sn'][0];
}
if (isset($entries[0]['cn'])) {
$this->cn = $entries[0]['cn'][0];
}
if (isset($entries[0]['displayname'])) {
$this->displayName = $entries[0]['displayname'][0];
}
if (isset($entries[0]['businesscategory'])) {
$this->businessCategory = $entries[0]['businesscategory'][0];
}
if (isset($entries[0]['departmentnumber'])) {
$this->departmentNumber = $entries[0]['departmentnumber'][0];
}
if (isset($entries[0]['physicaldeliveryofficename'])) {
$this->physicalDeliveryOfficeName = $entries[0]['physicaldeliveryofficename'][0];
}
if (isset($entries[0]['title'])) {
$this->title = $entries[0]['title'][0];
}
if (isset($entries[0]['mail'])) {
$this->mail = $entries[0]['mail'][0];
}
if (isset($entries[0]['telephonenumber'])) {
$this->telephoneNumber = $entries[0]['telephonenumber'][0];
}
if (isset($entries[0]['preferredtelephonenumber'])) {
$this->preferredTelephoneNumber = $entries[0]['preferredtelephonenumber'][0];
}
if (isset($entries[0]['webtelephonenumber'])) {
$this->webTelephoneNumber = $entries[0]['webtelephonenumber'][0];
}
if (isset($entries[0]['facsimiletelephonenumber'])) {
$this->facsimileTelephoneNumber = $entries[0]['facsimiletelephonenumber'][0];
}
if (isset($entries[0]['homephone'])) {
$this->homePhone = $entries[0]['homephone'][0];
}
if (isset($entries[0]['mobile'])) {
$this->mobile = $entries[0]['mobile'][0];
}
if (isset($entries[0]['dialupaccess'])) {
$this->dialupAccess = $entries[0]['dialupaccess'][0];
}
if (isset($entries[0]['objectclass'])) {
$this->objectClasses = $entries[0]['objectclass'];
}
if (isset($entries[0]['jpegphoto'])) {
$photo = ldap_get_values_len(LDAPEntry::$connection,
ldap_first_entry(LDAPEntry::$connection,$result),
'jpegphoto');
$this->jpegPhoto = $photo[0];
}
}
else {
throw new Exception("ldap/unknownUser");
}
}
}
/**
* Creates the connection to the LDAP server
*/
private function openConnection()
{
if (!LDAPEntry::$connection) {
if (LDAPEntry::$connection = ldap_connect(LDAP_SERVER)) {
ldap_set_option(LDAPEntry::$connection,LDAP_OPT_PROTOCOL_VERSION,3);
if (LDAP_ADMIN_USER) {
if (!ldap_bind(LDAPEntry::$connection,
LDAP_USERNAME_ATTRIBUTE."=".LDAP_ADMIN_USER.",o=".LDAP_DOMAIN,
LDAP_ADMIN_PASS)) {
throw new Exception(ldap_error(LDAPEntry::$connection));
}
}
else {
if (!ldap_bind(LDAPEntry::$connection)) {
throw new Exception(ldap_error(LDAPEntry::$connection));
}
}
}
else {
throw new Exception(ldap_error(LDAPEntry::$connection));
}
}
}
/**
* Saves any changed information back to the LDAP server
*/
public function save()
{
$dn = "uid={$this->uid},ou=people,o=".LDAP_DOMAIN;
if (count($this->modifiedAttributes)) {
ldap_mod_replace(LDAPEntry::$connection,$dn,$this->modifiedAttributes)
or die(print_r($this->modifiedAttributes).ldap_error(LDAPEntry::$connection));
}
if (count($this->addedAttributes)) {
ldap_mod_add(LDAPEntry::$connection,$dn,$this->addedAttributes)
or die(print_r($this->addedAttributes).ldap_error(LDAPEntry::$connection));
}
if (count($this->deletedAttributes)) {
ldap_mod_del(LDAPEntry::$connection,$dn,$this->deletedAttributes)
or die(print_r($this->deletedAttributes).ldap_error(LDAPEntry::$connection));
}
}
/**
* Escapes any problematic characters
* @param string $str
*/
private function sanitize($str)
{
$tmp = trim($str);
$tmp = str_replace('\\', '\\\\', $tmp);
$tmp = str_replace('(', '\(', $tmp);
$tmp = str_replace(')', '\)', $tmp);
$tmp = str_replace('*', '\*', $tmp);
return $tmp;
}
/**
* Keeps track of what properties have been changed
*
* All setters should call this function. Otherwise, we won't
* know what's been changed in order to do the appropriate calls in LDAP
* @param string $property
* @param string $value
*/
private function changeProperty($property,$value)
{
if ($value) {
if ($value != $this->{$property}) {
if ($this->{$property}) {
$this->modifiedAttributes[$property] = $value;
}
else {
$this->addedAttributes[$property] = $value;
}
$this->{$property} = $value;
}
}
else {
if ($this->{$property}) {
$this->{$property} = '';
$this->deletedAttributes[$property] = array();
}
}
}
/**
* @return string
*/
public function getOU()
{
return $this->ou;
}
/**
* @return string
*/
public function getUID()
{
return $this->uid;
}
/**
* @return string
*/
public function getUsername()
{
return $this->uid;
}
/**
* @return string
*/
public function getFirstname()
{
return $this->givenName;
}
/**
* @return string
*/
public function getLastname()
{
return $this->sn;
}
/**
* @return string
*/
public function getCommonName()
{
return $this->cn;
}
/**
* @return string
*/
public function getDisplayName()
{
return $this->displayName;
}
/**
* @return string
*/
public function getBusinessCategory()
{
return $this->businessCategory;
}
/**
* @return string
*/
public function getDepartment()
{
return $this->departmentNumber;
}
/**
* @return string
*/
public function getOffice()
{
return $this->physicalDeliveryOfficeName;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @return string
*/
public function getEmail()
{
return $this->mail;
}
/**
* @return string
*/
public function getPhone()
{
return $this->telephoneNumber;
}
/**
* @return string
*/
public function getPreferredPhone()
{
return $this->preferredTelephoneNumber;
}
/**
* @return string
*/
public function getWebPhone()
{
return $this->webTelephoneNumber;
}
/**
* @return string
*/
public function getFax()
{
return $this->facsimileTelephoneNumber;
}
/**
* @return string
*/
public function getHomePhone()
{
return $this->homePhone;
}
/**
* @return string
*/
public function getCellPhone()
{
return $this->mobile;
}
/**
* @return string
*/
public function getDialup()
{
return $this->dialupAccess;
}
/**
* @return string
*/
public function getSambaLMPassword()
{
return $this->sambaLMPassword;
}
/**
* @return string
*/
public function getSambaNTPassword()
{
return $this->sambaNTPassword;
}
/**
* @return string
*/
public function getSambaSID()
{
return $this->sambaSID;
}
/**
* @return string
*/
public function getObjectClasses()
{
return $this->objectClasses;
}
/**
* @return raw
*/
public function getPhoto()
{
return $this->jpegPhoto;
}
/**
* @param string $string
*/
public function setUsername($string)
{
$this->changeProperty("uid",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setFirstname($string)
{
$this->changeProperty("givenName",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setLastname($string)
{
$this->changeProperty("sn",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setCommonName($string)
{
$this->changeProperty("cn",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setDisplayName($string)
{
$this->changeProperty("displayName",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setBusinessCategory($string)
{
$this->changeProperty("businessCategory",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setDepartment($string)
{
$this->changeProperty("departmentNumber",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setOffice($string)
{
$this->changeProperty("physicalDeliveryOfficeName",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setTitle($string)
{
$this->changeProperty("title",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setEmail($string)
{
$this->changeProperty("mail",$this->sanitize($string));
}
/**
* @param string $string
*/
public function setPhone($string)
{
$this->changeProperty("telephoneNumber",preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setPreferredPhone($string)
{
$this->changeProperty('preferredTelephoneNumber',
preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setWebPhone($string)
{
$this->changeProperty('webTelephoneNumber',
preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setFax($string)
{
$this->changeProperty('facsimileTelephoneNumber',
preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setHomePhone($string)
{
$this->changeProperty('homePhone',preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setCellPhone($string)
{
$this->changeProperty('mobile',preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $string
*/
public function setDialup($string)
{
$this->changeProperty('dialupAccess',preg_replace('/[^0-9ext\-\s]/','',$string));
}
/**
* @param string $filePath
*/
public function setPhoto($filePath)
{
$this->changeProperty("jpegPhoto",file_get_contents($filePath));
}
}