From 4f92dcba3b0033e12d63348eac6caf36dd5cb48f Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Thu, 28 Jul 2005 05:41:04 +0000 Subject: [PATCH] MOST of user edits and new users are now supported. Still need to fix a change of an extension. Still need to clean up error handling and output. Major progress! git-svn-id: https://svn.alkaloid.net/gpl/shout/trunk@70 06cd67b6-e706-0410-b29e-9de616bca6e9 --- lib/Driver/ldap.php | 131 ++++++++++++++++++++++++++++++++++++++++++++++++---- lib/User.php | 24 ++-------- shout.webprj | 12 ++--- users/save.php | 42 +++++++++++++---- 4 files changed, 166 insertions(+), 43 deletions(-) diff --git a/lib/Driver/ldap.php b/lib/Driver/ldap.php index dea475c89..014b224d5 100644 --- a/lib/Driver/ldap.php +++ b/lib/Driver/ldap.php @@ -46,7 +46,7 @@ class Shout_Driver_ldap extends Shout_Driver $filterperms = null) { static $entries = array(); - if (array_key_exists($searchfilters, $entries)) { + if (isset($entries[$searchfilters])) { return $entries[$searchfilters]; } @@ -183,7 +183,7 @@ type"); { static $entries = array(); - if (array_key_exists($context, $entries)) { + if (isset($entries[$context])) { return $entries[$context]; } $search = ldap_search($this->_LDAP, @@ -250,7 +250,7 @@ type"); } // }}} - // {{{ _getHomeContext method + // {{{ getHomeContext method /** * Returns the name of the user's default context * @@ -340,7 +340,7 @@ for $context")); function &getDialplan($context) { static $dialplans = array(); - if (array_key_exists($context, $dialplans)) { + if (isset($dialplans[$context])) { return $dialplans[$context]; } @@ -459,14 +459,14 @@ for $context")); 'voicemailboxesmax', 'asteriskusers'); - if(is_null($extension) && !is_null($context)) { + if(!is_null($extension) && is_null($context)) { return PEAR::raiseError("Extension specified but no context " . "given."); } - if (!is_null($context) && array_key_exists($context, $limits)) { + if (!is_null($context) && isset($limits[$context])) { if (!is_null($extension) && - array_key_exists($extension, $limits[$context])) { + isset($limits[$context][$extension])) { return $limits[$context][$extension]; } return $limits[$context]; @@ -477,12 +477,12 @@ for $context")); # Initialize the limits with defaults if (count($cachedlimits) < 1) { foreach ($limits as $limit) { - $cachedlimits[$limit] = -1; + $cachedlimits[$limit] = 99999; } } # Collect the global limits - $res = ldap_search($this->_LDAP, + $res = @ldap_search($this->_LDAP, SHOUT_ASTERISK_BRANCH.','.$this->_params['basedn'], '(&(objectClass=asteriskLimits)(cn=globals))', $limits); @@ -535,7 +535,7 @@ for $context")); } if (isset($extension)) { - $res = ldap_search($this->_LDAP, + $res = @ldap_search($this->_LDAP, SHOUT_USERS_BRANCH.','.$this->_params['basedn'], "(&(objectClass=asteriskLimits)(voiceMailbox=$extension)". "(context=$context))"); @@ -569,6 +569,117 @@ for $context")); } } // }}} + + // {{{ + /** + * Save a user to the LDAP tree + * + * @param string $context Context to which the user should be added + * + * @param string $extension Extension to be saved + * + * @param array $userdetails Phone numbers, PIN, options, etc to be saved + * + * @return TRUE on success, PEAR::Error object on error + */ + function saveUser($context, $extension, $userdetails) + { + + $dn = $this->_params['uid']; + switch ($this->_params['uid']) { + case 'mail': + $uid = 'email'; + break; + case 'cn': + $uid = 'name'; + break; + case 'voiceMailbox': + return PEAR::raiseError("Unsupported user key/DN"); + } + + + + # FIXME Access Control/Authorization + $entry = array( + 'cn' => $userdetails['name'], + 'mail' => $userdetails['email'], + 'voiceMailbox' => $userdetails['newextension'], + 'voiceMailboxPin' => $userdetails['pin'], + 'context' => $context, + 'asteriskUserDialOptions' => $userdetails['dialopts'], + ); + if (!empty($userdetails['telephonenumbers'])) { + $entry['telephoneNumber'] = $userdetails['telephonenumbers']; + } + + $validusers = &$this->getUsers($context); + if (!isset($validusers[$extension])) { + # FIXME: What if just the extension changed? + + # We must be adding a new user. + $dn .= '='.$userdetails[$uid].','; + $dn .= SHOUT_USERS_BRANCH.','.$this->_params['basedn']; + + $entry['objectClass'] = array( + 'top', + 'person', + 'organizationalPerson', + 'inetOrgPerson', + 'hordePerson', + 'asteriskUser', + 'asteriskVoiceMailbox' + ); + + # Check to see if the maximum number of users for this context + # has been reached + $limits = $this->getLimits($context); + if (is_a($limits, "PEAR_Error")) { + return $limits; + } + if (count($validusers) >= $limits['asteriskusers']) { + print count($validusers).$limits['asteriskusers']; + return PEAR::raiseError('Maximum number of users reached.'); + } + + $res = ldap_add($this->_LDAP, $dn, $entry); + if (!$res) { + print $dn; + print_r($entry); + return PEAR::raiseError('LDAP Add failed: ' . + ldap_error($this->_LDAP)); + } + + return true; + } else { + $key = $this->_params['uid']; + if ($validusers[$extension][$uid] != $entry[$key]) { + print "need rename\n"; + $oldrdn = $key.'='.$validusers[$extension][$uid]; + $oldparent = SHOUT_USERS_BRANCH.','.$this->_params['basedn']; + $newrdn = $key.'='.$entry[$key]; + $res = ldap_rename($this->_LDAP, "$oldrdn,$oldparent", + $newrdn, $oldparent, true); + if (!$res) { + print $oldrdn; + print $newrdn; + print_r($entry); + return PEAR::raiseError('LDAP Rename failed: ' . + ldap_error($this->_LDAP)); + } + } + $dn = $key.'='.$entry[$key]; + $dn .= ','.SHOUT_USERS_BRANCH.','.$this->_params['basedn']; + $res = ldap_modify($this->_LDAP, $dn, $entry); + print_r($entry); + if (!$res) { + print $dn; + print_r($entry); + return PEAR::raiseError('LDAP Modify failed: ' . + ldap_error($this->_LDAP)); + } + return true; + } + } // {{{ _connect method /** diff --git a/lib/User.php b/lib/User.php index 62604958e..04143f13e 100644 --- a/lib/User.php +++ b/lib/User.php @@ -10,21 +10,6 @@ * @package Shout */ -// {{{ Shout_User class -/** - * Class defining a single Asterisk user - * - * @package Shout - */ -class Shout_User { - var $_name; - var $_extension; - var $_email; - var $_pager; - var $_pin; -} - - // {{{ class UserDetailsForm extends Horde_Form { @@ -48,13 +33,13 @@ class UserDetailsForm extends Horde_Form { parent::Horde_Form($vars, _("$formtitle - Context: $context")); $this->addHidden('', 'context', 'text', true); - $this->addHidden('', 'oldextension', 'text', true); - $vars->set('oldextension', $extension); + $this->addHidden('', 'curextension', 'text', true); + $vars->set('curextension', $extension); $this->addHidden('', 'action', 'text', true); $vars->set('action', 'save'); $this->addVariable(_("Full Name"), 'name', 'text', true); - $this->addVariable(_("Extension"), 'extension', 'int', true); - $this->addVariable(_("E-Mail Address"), 'email', 'text', false); + $this->addVariable(_("Extension"), 'newextension', 'int', true); + $this->addVariable(_("E-Mail Address"), 'email', 'text', true); # TODO: Integrate with To-Be-Written user manager and possibly make this # TODO: new user also an email account. $this->addVariable(_("PIN"), 'pin', 'int', true); @@ -93,6 +78,7 @@ class UserDetailsForm extends Horde_Form { $vars->set('name', $userdetails['name']); $vars->set('email', @$userdetails['email']); $vars->set('pin', $userdetails['mailboxpin']); + $vars->set('newextension', $vars->get('extension')); $i = 1; foreach($userdetails['phonenumbers'] as $number) { diff --git a/shout.webprj b/shout.webprj index 5c115564d..01daea048 100644 --- a/shout.webprj +++ b/shout.webprj @@ -9,7 +9,7 @@ - + @@ -28,12 +28,12 @@ - + - + @@ -73,7 +73,7 @@ - + @@ -118,14 +118,14 @@ - + - + diff --git a/users/save.php b/users/save.php index e1813f32f..24d80153b 100644 --- a/users/save.php +++ b/users/save.php @@ -17,7 +17,6 @@ $wereerrors = 0; $vars = &Variables::getDefaultVariables(); $formname = $vars->get('formname'); -print_r($vars); $UserDetailsForm = &Horde_Form::singleton('UserDetailsForm', $vars); $UserDetailsFormValid = $UserDetailsForm->validate($vars, true); @@ -26,12 +25,39 @@ if (!$UserDetailsFormValid) { echo "Invalid Form!"; } -$oldextension = Util::getFormData('oldextension'); -$extension = Util::getFormData('extension'); +$name = Util::getFormData('name'); +$curextension = Util::getFormData('curextension'); +$newextension = Util::getFormData('newextension'); +$email = Util::getFormData('email'); +$pin = Util::getFormData('pin'); -#$user = &new Shout_User(); -#$user->define($context, $oldextension); -#$user->set('name', Util::getFormData('name')); -#$user->set('extension', Util::getFormData('extension')); -#$user->set('telephone' +$limits = $shout->getLimits($context, $curextension); + +$userdetails = array("newextension" => $newextension, + "name" => $name, + "pin" => $pin, + "email" => $email); + +$i = 1; +$userdetails['telephonenumbers'] = array(); +while ($i <= $limits['telephonenumbersmax']) { + $tmp = Util::getFormData("telephone$i"); + if (!empty($tmp)) { + $userdetails['telephonenumbers'][] = $tmp; + } + $i++; +} + +$userdetails['dialopts'] = array(); +if (Util::getFormData('moh')) { + $userdetails['dialopts'][] = 'm'; +} +if (Util::getFormData('transfer')) { + $userdetails['dialopts'][] = 't'; +} + +$res = $shout->saveUser($context, $curextension, $userdetails); +if (is_a($res, 'PEAR_Error')) { + print $res->getMessage(); +} \ No newline at end of file -- 2.11.0