MOST of user edits and new users are now supported. Still need to fix a change
authorBen Klang <ben@alkaloid.net>
Thu, 28 Jul 2005 05:41:04 +0000 (05:41 +0000)
committerBen Klang <ben@alkaloid.net>
Thu, 28 Jul 2005 05:41:04 +0000 (05:41 +0000)
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
lib/User.php
shout.webprj
users/save.php

index dea475c..014b224 100644 (file)
@@ -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
     /**
index 6260495..04143f1 100644 (file)
  * @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) {
index 5c11556..01daea0 100644 (file)
@@ -9,7 +9,7 @@
     <item url="templates/" uploadstatus="2" />
     <item url="lib/" uploadstatus="2" />
     <item url="lib/Driver/" uploadstatus="2" />
-    <item modified_time="1121832576" url="lib/Driver/ldap.php" uploadstatus="2" />
+    <item modified_time="1122529043" url="lib/Driver/ldap.php" uploadstatus="2" />
     <item modified_time="1120589135" url="lib/base.php" uploadstatus="2" />
     <item modified_time="1121306551" url="lib/Driver.php" uploadstatus="2" />
     <item modified_time="1121623574" url="index.php" uploadstatus="2" />
         <uploadeditem upload_time="1121306551" url="lib/Driver.php" />
         <uploadeditem upload_time="1120022560" url="lib/Driver.php~" />
         <uploadeditem upload_time="0" url="lib/Driver/" />
-        <uploadeditem upload_time="1121832576" url="lib/Driver/ldap.php" />
+        <uploadeditem upload_time="1122529043" url="lib/Driver/ldap.php" />
         <uploadeditem upload_time="1120026921" url="lib/Driver/ldap.php~" />
         <uploadeditem upload_time="1120288491" url="lib/SelectContext.php" />
         <uploadeditem upload_time="1121580048" url="lib/Shout.php" />
         <uploadeditem upload_time="1121623619" url="lib/System.php" />
-        <uploadeditem upload_time="1121832752" url="lib/User.php" />
+        <uploadeditem upload_time="1122514535" url="lib/User.php" />
         <uploadeditem upload_time="1120279975" url="lib/Users.php" />
         <uploadeditem upload_time="1120589135" url="lib/base.php" />
         <uploadeditem upload_time="1120073766" url="lib/defines.php" />
@@ -73,7 +73,7 @@
         <uploadeditem upload_time="1121404120" url="users/add.php" />
         <uploadeditem upload_time="1121821098" url="users/edit.php" />
         <uploadeditem upload_time="1121396278" url="users/index.php" />
-        <uploadeditem upload_time="1121825812" url="users/save.php" />
+        <uploadeditem upload_time="1122514769" url="users/save.php" />
       </profile>
     </uploadprofiles>
     <debuggers>
     <item url="themes/graphics/" uploadstatus="1" />
     <item modified_time="1121300828" url="themes/graphics/add-user.gif" uploadstatus="1" />
     <item url="users/" uploadstatus="1" />
-    <item modified_time="1121832752" url="lib/User.php" uploadstatus="1" />
+    <item modified_time="1122514535" url="lib/User.php" uploadstatus="1" />
     <item url="main/" uploadstatus="1" />
     <item modified_time="1121623690" url="main/dialplan.php" uploadstatus="1" />
     <item modified_time="1120287842" url="main/moh.php" uploadstatus="1" />
     <item modified_time="1120815615" url="main/system.php" uploadstatus="1" />
     <item modified_time="1121623695" url="main/users.php" uploadstatus="1" />
     <item modified_time="1121623747" url="users.php" uploadstatus="1" />
-    <item modified_time="1121825812" url="users/save.php" uploadstatus="1" />
+    <item modified_time="1122514769" url="users/save.php" uploadstatus="1" />
     <item modified_time="1121574328" url="themes/screen.css" uploadstatus="1" />
     <item modified_time="1121821098" url="users/edit.php" uploadstatus="1" />
     <item modified_time="1121578573" url="templates/table-limiter-begin.inc" uploadstatus="1" />
index e1813f3..24d8015 100644 (file)
@@ -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