Code

w3c
[gosa.git] / plugins / gofon / phoneaccount / class_phoneAccount.inc
index 5fd9f63a2bd2bd988e87799f17eecc7fa0245876..40694034e5466ceabe5d2b28dd8aacb518adece1 100644 (file)
@@ -10,22 +10,23 @@ class phoneAccount extends plugin
   /* Attributes */
   var $telephoneNumber        = "";
   var $goFonHardware          = "";
-  var $goFonForwarding        = "";
   var $goFonFormat            = "";
   var $goFonPIN               = "";
+  var $goFonVoicemailPIN      = "";
   var $goFonDeliveryMode      = "";
   var $phoneNumbers           = array();
-  var $forwarders             = array();
   var $mail                   = "";
   var $hardware_list          = array();
   var $used_hardware          = array();
   var $goFonMacro             = "";
-  var $macro                  = 0;              // Selected Macor
+  var $macro                  = 0;              // Selected Macroi
+  var $lastmacro              = "";
   var $macros                 = array();        // List of macros for smarty select box
   var $macroarray             = array();        // All needed macro informations
   var $macrostillavailable    = false;
   var $generate_error         = "";
-  var $a_old_telenums           = array();
+  var $a_old_telenums         = array();
+  var $goFonPINVoice          = "";
 
   /* CLI vars */
   var $cli_summary            = "Manage users phone account";
@@ -33,8 +34,8 @@ class phoneAccount extends plugin
   var $cli_parameters         = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
 
   /* attribute list for save action */
-  var $attributes             = array("goFonDeliveryMode", "goFonForwarding", "goFonFormat",
-      "goFonHardware", "goFonPIN", "telephoneNumber", "goFonMacro","macro");
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn","mail",
+      "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
   function phoneAccount ($config, $dn= NULL)
@@ -58,15 +59,6 @@ class phoneAccount extends plugin
         $this->phoneNumbers[$number]= $number;
       }
     }
-    /* Assemble forwarders */
-    if (isset($this->attrs['goFonForwarding'])){
-      for ($i= 0; $i<$this->attrs['goFonForwarding']['count']; $i++){
-        list($num, $v1, $v2) =split(';', $this->attrs['goFonForwarding'][$i]);
-        $this->forwarders[$num]= "$v1;$v2";
-      }
-    } else {
-      $this->forwarders= array("");
-    }
 
     /* Set up has_mailAccount */
     if (isset($this->attrs['objectClass'])){
@@ -75,6 +67,34 @@ class phoneAccount extends plugin
       }
     }
 
+    $a_SETUP= array();
+    if(array_key_exists('config',$_SESSION) &&
+       array_key_exists('SERVERS',$_SESSION['config']->data) &&
+       array_key_exists('FON',$_SESSION['config']->data['SERVERS']) &&
+       is_callable("mysql_connect")
+       ) {
+      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
+      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+      if(!$r_con){
+        $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
+        gosa_log(mysql_error());
+        return false;
+      }
+      $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
+      if(!$db){
+        $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
+        gosa_log(mysql_error());
+        return false;
+      }
+      $first = false; 
+      foreach($this->phoneNumbers as $key => $val){
+        if(!$first){
+          $first = $key;
+        }
+      }
+    }
 
     /* Load hardware list */
     $ldap= $this->config->get_ldap_link();
@@ -91,10 +111,6 @@ class phoneAccount extends plugin
 
     }
 
-    /* Prepare templating */
-    $smarty= get_smarty();
-
-
     /* Perform search, to get Macro Parameters,Name,Dn,Displayname etc*/
     $ldap->search("(objectClass=goFonMacro)", array("*"));
 
@@ -120,7 +136,9 @@ class phoneAccount extends plugin
         }
 
         /* Parse macro data, unset count for parameterarrays  */
-        unset($attrs['goFonMacroParameter']['count']);
+        if (isset($attrs['goFonMacroParameter']['count'])){
+          unset($attrs['goFonMacroParameter']['count']);
+        }
 
         /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
         if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
@@ -132,13 +150,8 @@ class phoneAccount extends plugin
             /* Set all attrs */
             $id = $data[0];
             $this->macroarray[$attrs['dn']][$id]['var']    ="var".$id;
-            $string= $data[3];
-//            $string = preg_replace("/%uid/",$this->attrs['uid'][0],$data[3]);
-//            $string = preg_replace("/%telephoneNumber/",$this->attrs['telephoneNumber'][0],$string);
-//            $string = preg_replace("/%cn/",$this->attrs['cn'][0],$string);
-            $this->macroarray[$attrs['dn']][$id]['choosen']= $string; 
-
-            $this->macroarray[$attrs['dn']][$id]['id']     = $id;
+            $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3]; 
+            $this->macroarray[$attrs['dn']][$id]['id']     =$id;
             $this->macroarray[$attrs['dn']][$id]['name']   =$data[1];
             $this->macroarray[$attrs['dn']][$id]['type']   =$data[2];
             $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
@@ -198,20 +211,84 @@ class phoneAccount extends plugin
     $this->hardware_list["automatic"]= _("automatic");
     ksort($this->hardware_list);
     $this->a_old_telenums = $this->phoneNumbers;
-  }
 
+    if($this->is_account){
+      $this->is_modified = true;
+    }
+
+
+    /* Get voicemail PIN from MySQL DB 
+     * Because every user can change his PIN directly from the phone
+     *  without any update to the ldap
+     * This means, the PIN in the DB is up to date
+     */
+    // Connect to DB server
+    if((is_callable("mysql_pconnect"))&&(isset($a_SETUP))&&(isset($a_SETUP['SERVER']))&&(isset($a_SETUP['LOGIN']))&&(isset($a_SETUP['PASSWORD']))){
+      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+      if($r_con){
+        $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
+        $vp = mysql_fetch_row(mysql_query("SELECT ".$a_SETUP['VOICE_TABLE'].".password FROM  ".$a_SETUP['VOICE_TABLE'].", ".$a_SETUP['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
+
+        if((isset($vp[0]))&&(!empty($vp[0]))){
+          $this->goFonPINVoice = $vp[0];
+        }
+      }
+    }
+    $this->lastmacro=$this->macro;
 
+    if(is_callable("mysql_close")&&(isset($r_con))&&($r_con)){
+      @mysql_close($r_con) ;
+    }
+  }
 
 
   // Generate MySQL Syntax
   function generate_mysql_entension_entries($save = false){
 
+    if(!isset($_SESSION['config']->data['SERVERS']['FON'])){
+      if($save)
+      print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+      return(true);
+    }
+
+    if(!is_callable("mysql_pconnect")){
+      if($save)
+      print_red(_("Can't save any changes to asterisk database, there is no mysql extension available."));
+      return(true);
+    }
+  
     // Get Configuration for Mysql database Server
-    $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
-    $s_parameter  ="";
+    $a_SETUP        = $_SESSION['config']->data['SERVERS']['FON'];  // DB Configuration
+    $s_parameter    = "";                                           // Contains paramter for selected Macro 
+    $r_con          = false;                                        // DB connection
+    $r_db           = false;                                        // Selected DB
+    $r_res          = false;                                        // Result resource
+    $a_ldap_attrs   = array();                                      //  
+
+    $s_ip           = NULL;                   // Contains ip for Sip entry
+    $s_host         = NULL;                   // Contains host for Sip entry
+    $s_qualify      = NULL;                   // Qualify entry
+    $s_pin          = NULL;                   // Entry for secret
+    $s_type         = NULL;                   // Entry for phone type (friend , peer ..)
+
+    $sip_data_array = array();                // Contains complete sip entry, to generate SQL syntax
+    $i_old_key      = false;                  // Contains index for first old phonenumber, to delete old entries corectly
+    $i_new_key      = false;                  // Contains index for first new phonenumber, to generate new  entries corectly
+
+    $s_sip_values   = "";     // Contains string with all values for given attributes in SQL syntax
+    $s_sip_keys     = "";     // Contains all needed attributes to generate sip entry in DB
+
+    $s_sip_key      = "";     // Key for SIP entry index      
+    $s_sip_val      = "";     // Value for SIP entry index      
+
+    $b_first_deleted= false;  // Only delete first entry, 
+    $s_telenums     = "";     // for each value variable
+
+    $i_is_accounted =false;   // Ensure that extension entry, for name to number is only once in table
+
 
     // Connect to DB server
-    $r_con =  @mysql_connect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
 
     // Check if we are  connected correctly
     if(!$r_con){
@@ -222,179 +299,222 @@ class phoneAccount extends plugin
     }
 
     // Select database for Extensions
-    $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
+    $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
 
     // Test if we have the database selected correctly
-    if(!$db){
+    if(!$r_db){
       $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
       gosa_log(mysql_error());
       return false;
     }
 
     // Get phonehardware to setup sip entry
-    $ldap= $this->config->get_ldap_link();
-    $res = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
-    $attrs = $ldap->fetch();
+    $ldap         = $this->config->get_ldap_link();
+    $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
+    $a_ldap_attrs = $ldap->fetch();
 
-    // Attribute GoFonDefaultIP set ?
-    if(((isset($attrs['goFonDefaultIP'][0]))&&($attrs['goFonDefaultIP'][0] != "dynamic"))){
-      $ip = $attrs['goFonDefaultIP'][0];
-      $host = $ip;
-    }else{
-      $ip = NULL;
-      $host = "dynamic";
-    }
-
-    // Attribute GoFonQualify set ?
-    if(!isset($attrs['goFonQualify'])){
-      $qualify = NULL;
-    }else{
-      $qualify = $attrs['goFonQualify'][0];
-    }
-
-    // Attribute GoFonPIN set ?
-    if(!isset($this->goFonPIN)){
-      $pin = NULL;
-    }else{
-      $pin = $this->goFonPIN;
-    }
-
-    // Attribute GoFonType set ?
-    if(!isset($attrs['goFonType'])){
-      $type = NULL;
-    }else{
-      $type = $attrs['goFonType'][0];
+    if($this->is_number_used()){
+      $this->generate_error = $this->is_number_used(); 
+      return false;
     }
 
-    // generate SIP entry
-    $sip_data_array['id']           = "";
-    $sip_data_array['name']         = $this->uid;
-    $sip_data_array['accountcode']  = NULL;          
-    $sip_data_array['amaflags']     = NULL;
-    $sip_data_array['callgroup']    = NULL;
-    $sip_data_array['callerid']     = "";
-    $sip_data_array['canreinvite']  = "yes";
-
-    // Must be default and the name of an entry that already exists
-    $sip_data_array['context']      = "default";
-    $sip_data_array['defaultip']    = NULL;
-
-    if(isset($attrs['goFonDmtfMode'][0])){
-      $sip_data_array['dtmfmode']     = $attrs['goFonDmtfMode'][0];
-    }else{
-      $sip_data_array['dtmfmode']     ="rfc2833";
-    }
-    $sip_data_array['fromuser']     = NULL;
-    $sip_data_array['fromdomain']   = NULL;
-    $sip_data_array['host']         = $host;
-    $sip_data_array['insecure']     = NULL;
-    $sip_data_array['language']     = NULL;
-    $sip_data_array['mailbox']      = "asterisk";
-    $sip_data_array['md5secret']    = NULL;
-    $sip_data_array['nat']          = "no";
-    $sip_data_array['permit']       = NULL;
-    $sip_data_array['deny']         = NULL;
-    $sip_data_array['mask']         = NULL;
-    $sip_data_array['pickupgroup']  = NULL;
-    $sip_data_array['port']         = NULL;
-    $sip_data_array['qualify']      = $qualify;
-    $sip_data_array['restrictcid']  = "n";
-    $sip_data_array['rtptimeout']   = NULL;
-    $sip_data_array['rtpholdtimeout']=NULL;
-    $sip_data_array['secret']       = $pin;
-    $sip_data_array['type']         = $type ;
-    $sip_data_array['username']     = $this->uid;
-    $sip_data_array['disallow']     = NULL;
-    $sip_data_array['allow']        = NULL;
-    $sip_data_array['musiconhold']  = NULL;
-    $sip_data_array['regseconds']   = NULL;
-    $sip_data_array['ipaddr']       = $ip;
-    $sip_data_array['regexten']     = NULL;
-    $sip_data_array['cancallforward']=NULL;
-
-    // Get selected Macro Parameter and create parameter entry 
-    if(isset($this->macroarray[$this->macro])){
-      foreach($this->macroarray[$this->macro] as $key => $val ){
-        $s_parameter .= $val['choosen']."|";
+    /* If Save == true, we should save something.
+     * Generate SQL, for drop of old entries
+     * Generate SQL, for insert new entries
+     */ 
+    if($save == true){
+      
+      foreach($this->a_old_telenums as $tele){
+        $oldnums[]= preg_replace("/[^0-9]/","",$tele);
       }
-      $s_parameter = preg_replace("/\|$/","",$s_parameter);
-    }
-
 
+      foreach($this->phoneNumbers as $tele){
+        $newnums[]= preg_replace("/[^0-9]/","",$tele);
+      }
 
+      // Attribute GoFonDefaultIP set ?
+      if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
+        $s_ip       = $a_ldap_attrs['goFonDefaultIP'][0];
+        $s_host     = $s_ip;
+      }else{
+        $s_ip       = NULL;
+        $s_host     = "dynamic";
+      }
 
+      // Attribute GoFonQualify set ?
+      if(isset($a_ldap_attrs['goFonQualify'])){
+        $s_qualify = $a_ldap_attrs['goFonQualify'][0];
+      }
 
+      // Attribute GoFonPIN set ?
+      if(isset($this->goFonPIN)){
+        $s_pin      = $this->goFonPIN;
+      }
 
+      // Attribute GoFonType set ?
+      if(isset($a_ldap_attrs['goFonType'])){
+        $s_type = $a_ldap_attrs['goFonType'][0];
+      }
 
-    // $SQL contains all queries
-    $SQL = array();
-    $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
-    $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
+      if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
+        $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
+      }else{
+        $sip_data_array['dtmfmode']     ="rfc2833";
+      }
 
-    // Create new SIP entry ...
-    $sip_entry = $sip_data_array;
+      // generate SIP entry
+      $sip_data_array['id']           = "";
+      $sip_data_array['name']         = $this->uid;
+      $sip_data_array['accountcode']  = NULL;          
+      $sip_data_array['amaflags']     = NULL;
+      $sip_data_array['callgroup']    = NULL;
+      $sip_data_array['callerid']     = "";
+      $sip_data_array['canreinvite']  = "no";
+      $sip_data_array['context']      = "default";
+      $sip_data_array['defaultip']    = NULL;
+      $sip_data_array['fromuser']     = NULL;
+      $sip_data_array['fromdomain']   = NULL;
+      $sip_data_array['host']         = $s_host;
+      $sip_data_array['insecure']     = NULL;
+      $sip_data_array['language']     = NULL;
+      $sip_data_array['mailbox']      = "asterisk";
+      $sip_data_array['md5secret']    = NULL;
+      $sip_data_array['nat']          = "no";
+      $sip_data_array['permit']       = NULL;
+      $sip_data_array['deny']         = NULL;
+      $sip_data_array['mask']         = NULL;
+      $sip_data_array['pickupgroup']  = NULL;
+      $sip_data_array['port']         = NULL;
+      $sip_data_array['qualify']      = $s_qualify;
+      $sip_data_array['restrictcid']  = "n";
+      $sip_data_array['rtptimeout']   = NULL;
+      $sip_data_array['rtpholdtimeout']=NULL;
+      $sip_data_array['secret']       = $this->goFonPIN;
+      $sip_data_array['type']         = $s_type ;
+      $sip_data_array['username']     = $this->uid;
+      $sip_data_array['disallow']     = NULL;
+      $sip_data_array['allow']        = NULL;
+      $sip_data_array['musiconhold']  = NULL;
+      $sip_data_array['regseconds']   = NULL;
+      $sip_data_array['ipaddr']       = $s_ip;
+      $sip_data_array['regexten']     = NULL;
+      $sip_data_array['cancallforward']=NULL;
+
+      // Get selected Macro Parameter and create parameter entry 
+      if(isset($this->macroarray[$this->macro])){
+        foreach($this->macroarray[$this->macro] as $key => $val ){
+          $s_parameter .= $val['choosen']."|";
+        }
+        $s_parameter = preg_replace("/\|$/","",$s_parameter);
+      }
 
-    reset($this->phoneNumbers);
+      if($this->is_number_used()){
+        $this->generate_error = $this->is_number_used(); 
+        return false;
+      }
 
-    $key = key($this->phoneNumbers);
-    $sip_entry['callerid']  =$this->phoneNumbers[$key];
-    $sip_entry['mailbox']   =$this->phoneNumbers[$key];
+      // Create new SIP entry ...
+      $sip_entry = $sip_data_array;
+      reset($newnums);
+      $i_new_key = key($newnums);
+      $sip_entry['callerid']  =$newnums[$i_new_key];
+      $sip_entry['mailbox']   =$newnums[$i_new_key];
 
-    if($this->is_number_used()){
-      $this->generate_error = $this->is_number_used(); 
-      return false;
-    }
-
-    if($save == true){
-      if(isset($this->parent->by_object['mailAccount']->mail)){
-        $mail = $this->parent->by_object['mailAccount']->mail;
+      if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
+        $s_mail = $this->parent->by_object['mailAccount']->mail;
       }else{
-        $mail = "";
+        $s_mail = "";
       }
 
+      // $SQL contains all queries
+      $SQL   = array();
+      $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
+      $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
+      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$newnums[$i_new_key].";"; 
+      // Delete old entries
+      $b_first_deleted  =false;
+      foreach($oldnums as $s_telenums){
+        $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
+        if(!$b_first_deleted){
+          $b_first_deleted=true;
+          $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$s_telenums.";";
+        }
+      }
 
-      $SQL[]= "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$this->phoneNumbers[$key]."';"; 
-      $SQL[]= "INSERT INTO ".$a_SETUP['VOICE_TABLE']." 
-        (`customer_id`,`context`,`mailbox`,`password`,`fullname`,`email`,`pager`) 
-        VALUES 
-        ('".$this->phoneNumbers[$key]."','default','".$this->phoneNumbers[$key]."','".$this->goFonPIN."','".$this->sn."','".$mail."','');";
+      if($this->goFonHardware=="automatic"){
+        foreach($SQL as $query ){
+          mysql_query($query) ;
+        }
+        return;
+      }
 
       // Generate Strings with keys and values 
-      $values = "";
-      $keys   = "";
-      foreach($sip_entry as $key=>$val){
-        if($val == NULL) continue;
-        $values.="'".$val."',";
-        $keys  .="`".$key."`,";
+      foreach($sip_entry as $s_sip_key=>$s_sip_val){
+        if($s_sip_val == NULL) continue;
+        $s_sip_values.="'".$s_sip_val."',";
+        $s_sip_keys  .="`".$s_sip_key."`,";
       }
       // Remove last ,
-      $values =  preg_replace("/,$/","",$values);
-      $keys   =  preg_replace("/,$/","",$keys);
+      $s_sip_values =  preg_replace("/,$/","",$s_sip_values);
+      $s_sip_keys   =  preg_replace("/,$/","",$s_sip_keys);
 
       // Append SIP Entry 
-      $SQL[] ="INSERT INTO ".$a_SETUP['SIP_TABLE']." (".$keys.") VALUES (".$values.");";
+      $SQL[] ="INSERT INTO ".$a_SETUP['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
 
-      // Delete old entries
-      foreach($this->a_old_telenums as $s_telenums){
-        $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
+      /* If deletion starts from userslist, cn uid are not set */
+      if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
+        $this->uid = $this->parent->by_object['user']->uid;
       }
 
-      $i_is_accounted=false;
+      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+        $this->cn  = $this->parent->by_object['user']->cn;
+      }
+
+      if((!isset($this->cn))||(empty($this->cn))){
+        $CNname= $this->uid;
+      }else{
+        $CNname= $this->cn;
+      }
 
+      $SQL[]= "INSERT INTO ".$a_SETUP['VOICE_TABLE']." (`customer_id`,`context`,`mailbox`,`password`,`fullname`,`email`,`pager`)
+          VALUES   ('".$newnums[$i_new_key]."',
+                    'default',
+                    '".$newnums[$i_new_key]."',
+                    '".$this->goFonVoicemailPIN."',
+                    '".$CNname."',
+                    '".$s_mail."',
+                    '');";
+      $i_is_accounted=false;
+    
+      $i = 0; 
+      $is_inserted_once = false;
       // Entension entries  Hint / Dial / Goto
-      foreach($this->phoneNumbers as $s_telenums){
-        // Entry  to call by name
-        $s_entry_name['context']  = 'GOsa';
-        $s_entry_name['exten']    = $this->uid;
-        $s_entry_name['priority'] = 1;
-        $s_entry_name['app']      = 'Goto';
-        $s_entry_name['appdata']  = $s_telenums."|1";
-
-        // hint
-        $s_entry_hint['context']  = 'GOsa';
-        $s_entry_hint['exten']    = $s_telenums;
-        $s_entry_hint['app']      = 'hint';
-        $s_entry_hint['appdata']  = 'SIP/'.$this->uid;
+      foreach($newnums as $s_telenums){
+
+        if(!$is_inserted_once){
+          $is_inserted_once = true;
+          $EXT[$i]['context'] = 'GOsa';
+          $EXT[$i]['exten']   = $this->uid;
+          $EXT[$i]['priority']= 1;
+          $EXT[$i]['app']     = "Goto";
+          $EXT[$i]['appdata'] = $s_telenums."|1";
+          $i ++;
+        }
+        /* Hint Entry */
+        $EXT[$i]['context'] = 'GOsa';
+        $EXT[$i]['exten']   = $s_telenums;
+        $EXT[$i]['priority']= "Hint";
+        $EXT[$i]['app']     = 'SIP/'.$this->uid;
+        $i ++;  
+        /* SetCID */
+        //$EXT[$i]['context'] = 'GOsa';
+        //$EXT[$i]['exten']   = $s_telenums;
+        //$EXT[$i]['priority']= 1;
+        //$EXT[$i]['app']     = "SetCIDName";
+        //$EXT[$i]['appdata'] = $CNname;
+        //$i ++;  
 
         // If no macro is selected use Dial
         if($this->macro!="none"){ 
@@ -404,74 +524,98 @@ class phoneAccount extends plugin
           $s_par = $macroname."|".$s_parameter; 
         }else{
           $s_app = "Dial";
-          $s_par = 'SIP/'.$this->uid;
+          $s_par = 'SIP/'.$this->uid."|20|r";
         }
 
-        // Entry  to call by number
-        $s_entry_phone['context']  = 'GOsa';
-        $s_entry_phone['exten']    = $s_telenums;
-        $s_entry_phone['priority'] = 1;
-        $s_entry_phone['app']      = $s_app;
-        $s_entry_phone['appdata']  = $s_par;
-
-        // append name entry only once
-        if(!$i_is_accounted){ 
-          $i_is_accounted = true;
-          $entries[]=array("hint"=>$s_entry_hint,"phone"=>$s_entry_phone,"name"=>$s_entry_name); 
-        }else{
-          $entries[]=array("hint"=>$s_entry_hint,"phone"=>$s_entry_phone);
-        }
+        $EXT[$i]['context'] = 'GOsa';
+        $EXT[$i]['exten']   = $s_telenums;
+        $EXT[$i]['priority']= 1;
+        $EXT[$i]['app']     = $s_app;
+        $EXT[$i]['appdata'] = $s_par;
+        $i ++;
+
       }
 
       // Append all these Entries 
-      foreach($entries as $num => $val){
-        foreach($val as $entr){
-          $SQL_syn = "INSERT INTO ".$a_SETUP['EXT_TABLE']." (";
-          foreach($entr as $key2 => $val2){
-            $SQL_syn.= "`".$key2."`,";
-          }
-          $SQL_syn = preg_replace("/,$/","",$SQL_syn);
-          $SQL_syn .= ") VALUES ("; 
-          foreach($entr as $key2 => $val2){
-            $SQL_syn .= "'".$val2."',";
-          }
-          $SQL_syn = preg_replace("/,$/","",$SQL_syn);
-          $SQL_syn .=");\n";
-          $SQL[] =$SQL_syn;
-          $SQL_syn ="";
+      foreach($EXT as $entr){
+        $SQL_syn = "INSERT INTO ".$a_SETUP['EXT_TABLE']." (";
+        foreach($entr as $key2 => $val2){
+          $SQL_syn.= "`".$key2."`,";
+        }
+        $SQL_syn = preg_replace("/,$/","",$SQL_syn);
+        $SQL_syn .= ") VALUES ("; 
+        foreach($entr as $key2 => $val2){
+          $SQL_syn .= "'".$val2."',";
         }
+        $SQL_syn = preg_replace("/,$/","",$SQL_syn);
+        $SQL_syn .=");\n";
+        $SQL[] =$SQL_syn;
+        $SQL_syn ="";
       }
 
       // Perform queries ...
       foreach($SQL as $query){
-        if(!mysql_query($query,$r_con)){
-          print_red(_("Error while performing query ".mysql_error()));
+        if(!@mysql_query($query,$r_con)){
+          print_red(_("Error while performing query:")." ".mysql_error());
           return false;
         }
       }
     }
+    @mysql_close($r_con);
     return true;
   }
 
 
+  function execute()
+  {
+       /* Call parent execute */
+       plugin::execute();
 
+    $display = "";
 
+    if(empty($this->macro)&&(!empty($this->goFonMacro))){
 
+      /* Go through already saved values, for a parameter */
+      $tmp = split("!",$this->goFonMacro);
 
+      /* it is possible that nothing has been saved yet */
+      if(is_array($tmp)){
 
+        /* First value is the macroname */
+        $this->macro = $tmp[0];
 
+        /* Macroname saved, delete that index */
+        unset($tmp[0]);
 
+        /* Check if makro has been removed */
+        if(!isset($this->macroarray[$this->macro])){
+          $this->macrostillavailable = false;
+        }else{
+          $this->macrostillavailable = true;
+        }
 
+        /* for each parametervalues ( parameterID#value like 25#twentyfive) */
+        foreach($tmp as $var){
 
+          /* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
+          $varar = split("#",$var);
 
-
-
-  function execute()
-  {
-    /* force postmodify event, to restart phones */
+          /* Only insert if the parameter still exists */
+          if(isset($this->macroarray[$this->macro][$varar[0]])){
+            /* Assign value */
+            $this->macroarray[$this->macro][$varar[0]]['choosen']=$varar[1];
+          }
+        }
+      }
+    }
     
-    $this->parent->by_object['user']->is_modified=TRUE;
-    $this->is_modified=TRUE; 
+    /* Do we represent a valid account? */
+    if (!$this->is_account && $this->parent == NULL){
+      $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
+        _("This account has no phone extensions.")."</b>";
+      $display.= back_to_main();
+      return ($display);
+    }
 
     /* Do we need to flip is_account state? */
     if (isset($_POST['modify_state'])){
@@ -483,18 +627,23 @@ class phoneAccount extends plugin
       $this->macro ="none";
     }
 
+    /* Prepare templating */
+    $smarty= get_smarty();
+
     /* tell user that the pluging selected is no longer available*/
     if((!$this->macrostillavailable)&&($this->macro!="none")){
-      print_red(_("The macro you selected in the past, is no longer available for you, please choose another one."));
+      print_red(_("The macro you selected, is no longer available for you, please choose another one."));
     }
 
-    /* Prepare templating */
-    $smarty= get_smarty();
-
     /* Assing macroselectbox values  */
     $smarty->assign("macros",$this->macros);   
     $smarty->assign("macro", $this->macro);   
 
+    /* check if there is a FON server created */
+    if(!isset($_SESSION['config']->data['SERVERS']['FON'])){
+      print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+    }
+
     /* Create parameter table, skip if no parameters given */
     if(!isset($this->macroarray[$this->macro])){
       $macrotab="";
@@ -503,6 +652,35 @@ class phoneAccount extends plugin
       $macrotab ="<table summary=\""._("Parameter")."\">";
       /* for every single parameter-> display textfile,combo, or true false switch*/
 
+      foreach($this->phoneNumbers as $phonenum){
+        $tmp[] = $phonenum;
+      }
+
+      
+    
+      if($this->macro != $this->lastmacro){
+        /* Go through all params */
+        foreach($this->macroarray[$this->macro] as $key => $paras){
+
+          $string = $paras['default'];
+
+          $string=preg_replace("/%uid/i",$this->uid,$string);
+
+          if(isset($this->cn)){
+            $string=preg_replace("/%cn/i",$this->cn,$string);
+          }
+
+          for($i = 0 ; $i < 10; $i++){
+            if(isset($tmp[$i])){
+              $string = preg_replace("/%telephoneNumber_".($i+1)."/i",$tmp[$i],$string);
+            }
+          }
+          if(isset($tmp[0])){
+            $string = preg_replace("/%telephoneNumber/i",$tmp[0],$string);
+          }
+          $this->macroarray[$this->macro][$key]['choosen']=$string;
+        }
+      }
 
       foreach($this->macroarray[$this->macro] as $paras){
 
@@ -519,7 +697,7 @@ class phoneAccount extends plugin
         switch ($type){
 
           case "combo":
-            $str= "<select name='".$var."' ".chkacl($this->acl, "goFonMacro")."  ".chkacl($this->acl, "goFonMacro").">";
+            $str= "<select name='".$var."' ".chkacl($this->acl, "goFonMacro")." >";
           foreach(split(":",$default) as $choice){
             if($choosen==$choice){
               $str.= "\n<option value='".$choice."' selected>".$choice."&nbsp;</option>";
@@ -528,7 +706,7 @@ class phoneAccount extends plugin
             }
           }
           $str.="</select>";
-          $macrotab.= "<td>$name</td><td>$str";
+          $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
           break;
 
           case "bool":
@@ -537,20 +715,12 @@ class phoneAccount extends plugin
             }else{
               $str="\n<input type='checkbox' name='".$var."' value='1' checked  ".chkacl($this->acl, "goFonMacro").">";
             }
-          $macrotab.= "<td colspan='2'>$str&nbsp;$name";
+          $macrotab.= "<td colspan='2'>$str&nbsp;".base64_decode($name)."";
           break;
 
           case "string":
-            $choosen = preg_replace("/%uid/",$this->attrs['uid'][0],$choosen);
-            foreach($this->phoneNumbers as  $phone){
-              $tmp_phone[] = $phone;
-            }            
-  
-            $choosen = preg_replace("/%telephoneNumber/",$tmp_phone[0],$choosen);
-            $choosen = preg_replace("/%cn/",$this->attrs['cn'][0],$choosen);
-
-            $str="<input name='".$var."' value='".$choosen."' ".chkacl($this->acl, "goFonMacro").">";
-          $macrotab.= "<td>$name</td><td>$str";
+            $str="<input name='".$var."' value='".$choosen."' ".chkacl($this->acl, "goFonMacro")." style='width:340px;'>";
+          $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
           break;
 
         }
@@ -579,8 +749,13 @@ class phoneAccount extends plugin
         $display= $this->show_header(_("Remove phone account"),
             _("This account has phone features enabled. You can disable them by clicking below."));
       } else {
-        $display= $this->show_header(_("Create phone account"),
-            _("This account has phone features disabled. You can enable them by clicking below."));
+        if(empty($this->uid)){
+          $display= $this->show_header(_("Create phone account"),
+              _("This account has phone features disabled. You can't enable them while no uid is set."),TRUE,TRUE);
+        }else{
+          $display= $this->show_header(_("Create phone account"),
+              _("This account has phone features disabled. You can enable them by clicking below."));
+        }
         return ($display);
       }
     }
@@ -604,22 +779,14 @@ class phoneAccount extends plugin
       }
     }
 
-    /* Check for forwarding action */
-    foreach ($this->forwarders as $nr => $fw){
-
-      /* Buttons pressed? */
-      if (isset($_POST["add_fw$nr"])){
-        $this->forwarders= $this->insert_after("", $nr, $this->forwarders);
-      }
-      if (isset($_POST["remove_fw$nr"])){
-        unset($this->forwarders[$nr]);
-      }
-    }
-
     /* Transfer ACL's */
     foreach($this->attributes as $val){
-      $smarty->assign($val."ACL", chkacl($this->acl, "$val"));
-      $smarty->assign($val,$this->$val);
+      $smarty->assign($val."ACL", chkacl($this->acl,$val));
+      if(isset($this->$val)){
+        $smarty->assign($val,$this->$val);
+      }else{
+        $smarty->assign($val,"");
+      }
     }
 
     /* Fill arrays */
@@ -647,29 +814,8 @@ class phoneAccount extends plugin
     $hl.= "</select>\n";
     $smarty->assign ("hardware_list", $hl);
 
-    /* Generate forwarder view */
-    $forwarder_list="";
-    $acl= chkacl($this->acl, "goFonForwaring");
-    foreach ($this->forwarders as $nr => $fw){
-      if ($fw == ""){
-        $number= ""; $timeout= "";
-      } else {
-        list($number, $timeout)= split(";", $fw);
-      }
-      $forwarder_list.= "<tr><td>";
-      $forwarder_list.= "<input name=\"fwn$nr\" size=25 align=\"middle\" maxlength=60 value=\"$number\" $acl>";
-      $forwarder_list.= "</td><td>";
-      $forwarder_list.= "<input name=\"fwt$nr\" size=5 align=\"middle\" maxlength=5 value=\"$timeout\" $acl>";
-      $forwarder_list.= "</td><td>";
-      $forwarder_list.= "<input type=\"submit\" value=\""._("Add")."\" name=\"add_fw$nr\" $acl>";
-      if (count($this->forwarders) > 1){
-        $forwarder_list.= "<input type=\"submit\" value=\""._("Remove")."\" name=\"remove_fw$nr\" $acl>";
-      }
-      $forwarder_list.= "</td></tr>";
-    }
-    $smarty->assign("forwarder_list", $forwarder_list);
-
     /* Show main page */
+    $this->lastmacro = $this->macro;
     $display.= $smarty->fetch(get_template_path('generic.tpl', TRUE, dirname(__FILE__)));
     return($display);
   }
@@ -693,34 +839,30 @@ class phoneAccount extends plugin
         $this->goFonDeliveryMode= $tmp;
       }
 
-      /* Save forwarding numbers and timeouts */
-      if (chkacl ($this->acl, "goFonForwarder") == ""){
-        foreach ($this->forwarders as $nr => $fw){
-          $tmp= $_POST["fwn$nr"].";".$_POST["fwt$nr"];
-          if ($this->forwarders[$nr] != $tmp){
-            $this->is_modified= TRUE;
-          }
-          $this->forwarders[$nr]= $tmp;
-        }
-      }
-
       /* Every macro in the select box are available */
       if((isset($_POST['macro']))){
         $this->macrostillavailable=true;
       }
 
+      if(is_array($this->phoneNumbers)){
+        foreach($this->phoneNumbers as $telenumms) {
+          $nummsinorder[]=$telenumms; 
+        }
+      }else{
+        $nummsinorder=array("");
+      }
 
       /* get all Postvars */
       if(isset($this->macroarray[$this->macro])){ 
         foreach($this->macroarray[$this->macro] as $key => $paras){
           if(isset($_POST[$paras['var']])){
-            $this->macroarray[$this->macro][$key]['choosen'] = $_POST[$paras['var']]; 
+            $this->macroarray[$this->macro][$key]['choosen'] = $_POST[$paras['var']];
           }
 
           /* Checkboxes are special, they are not Posted if they are not selected, so the won't be changed with the above code 
              We need this code below to read and save checkboxes correct
            */
-  
+
           if(isset($_POST['post_success'])){
             if($this->macroarray[$this->macro][$key]['type']=="bool"){
               if(isset($_POST[$this->macroarray[$this->macro][$key]['var']])) {
@@ -740,41 +882,29 @@ class phoneAccount extends plugin
     /* Reset message array */
     $message= array();
 
-    if(!$this->generate_mysql_entension_entries()){
-      $message[] = $this->generate_error;
-    }
-
-    /* We need at least one phone number */
-    if (count($this->phoneNumbers) == 0){
-      $message[]= sprintf(_("You need to specify at least one phone number!"));
+    if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
+      $message[]=(_("Voicemail PIN must be between 1-4 characters."));
+    }else{
+      if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN)){
+        $message[]=(_("The specified Voicemail PIN contains invalid characters, only numeric values are allowed here."));
+      }
     }
 
-    if(($this->goFonPIN)==""){
-      $message[]= sprintf(_("You need to specify a Phone PIN."));
+    if((strlen($this->goFonPIN)<=0)){
+      $message[]=(_("Phone PIN must be at least one character long."));
     }else{
-      if(strcmp ((int)($this->goFonPIN),($this->goFonPIN))){
-        $message[] = sprintf(_("The given PIN is not valid, only numbers are allowed for this type."));
-      }elseif(strlen($this->goFonPIN) < 4){
-        $message[] = sprintf(_("The given PIN is too short"));
+      if(preg_match("/[^0-9a-z]/i",$this->goFonPIN)){
+        $message[]=(_("The specified phone PIN contains invalid characters, only aphanumeric values are allowed here."));
       }
-
     }
-    /* Check timestamps and phonenumbers */
-    foreach ($this->forwarders as $fw){
 
-      /* Skip empty values */
-      if ($fw == ";"){
-        continue;
-      }                
+    if(!$this->generate_mysql_entension_entries()){
+      $message[] = $this->generate_error;
+    }
 
-      /* Check */
-      list($number, $timeout)= split(";", $fw);
-      if (!is_phone_nr($number)){
-        $message[]= sprintf(_("The number '%s' is no valid phone number!"), $number);
-      }
-      if (!is_id($timeout)){
-        $message[]= sprintf(_("The timeout '%s' contains invalid characters!"), $timeout);
-      }
+    /* We need at least one phone number */
+    if (count($this->phoneNumbers) == 0){
+      $message[]= sprintf(_("You need to specify at least one phone number!"));
     }
 
     /* check for ! in any parameter setting*/
@@ -799,10 +929,6 @@ class phoneAccount extends plugin
     foreach ($this->phoneNumbers as $number){
       $this->attrs['telephoneNumber'][]= $number;
     }
-    $this->attrs['goFonForwarding']= array();
-    foreach ($this->forwarders as $index => $number){
-      $this->attrs['goFonForwarding'][]= "$index;$number";
-    }
 
     /* Save settings, or remove goFonMacro attribute*/
     if($this->macro!="none"){    
@@ -817,11 +943,16 @@ class phoneAccount extends plugin
     }
     unset($this->attrs['macro'])  ;
 
+    $this->attrs['goFonForwarding']=array();
+
     $this->generate_mysql_entension_entries(true);
 
     if($this->attrs['goFonMacro']==""){
       $this->attrs['goFonMacro']=array();
     }
+
+    unset($this->attrs['cn']);
+
     /* Write back to ldap */
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->dn);
@@ -829,7 +960,7 @@ class phoneAccount extends plugin
     show_ldap_error($ldap->get_error());
 
     /* Optionally execute a command after we're done */
-    
+
     if ($this->initially_was_account == $this->is_account){
       if ($this->is_modified){
         $this->handle_post_events("modify");
@@ -874,73 +1005,81 @@ class phoneAccount extends plugin
         $this->phoneNumbers[$number]= $number;
       }
     }
-
-    /* Assemble forwarders */
-    if (isset($this->attrs['goFonForwarding'])){
-      for ($i= 0; $i<$this->attrs['goFonForwarding']['count']; $i++){
-        list($num, $v1, $v2) =split(';', $this->attrs['goFonForwarding'][$i]);
-        $this->forwarders[$num]= "$v1;$v2";
-      }
-    } else {
-      $this->forwarders= array("");
-    }
   }
 
 
   function remove_from_parent()
   {
-    // Get Configuration for Mysql database Server
-    $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
-    $s_parameter  ="";
+  
+    foreach($this->attributes as $key=>$val){
+      if(in_array($val,array("uid","cn","mail"))){
+        unset($this->attributes[$key]);
+        unset($this->$val);
+      }
+    }
 
-    // Connect to DB server
-    $r_con =  @mysql_connect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    if(array_key_exists('config', $_SESSION) &&
+       array_key_exists('SERVERS', $_SESSION['config']->data) &&
+       array_key_exists('FON', $_SESSION['config']->data['SERVERS'])) {
+      // Get Configuration for Mysql database Server
+      $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
+      $s_parameter  ="";
+
+      // Connect to DB server
+      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+
+      // Check if we are  connected correctly
+      if(!$r_con){
+        $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+            $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
+        gosa_log(@mysql_error());
+        return false;
+      }
 
-    // Check if we are  connected correctly
-    if(!$r_con){
-      $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
-      gosa_log(mysql_error());
-      return false;
-    }
+      // Select database for Extensions
+      $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
 
-    // Select database for Extensions
-    $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
+      // Test if we have the database selected correctly
+      if(!$db){
+        $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
+        gosa_log(@mysql_error());
+        return false;
+      }
 
-    // Test if we have the database selected correctly
-    if(!$db){
-      $this->generate_error = sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']);
-      gosa_log(mysql_error());
-      return false;
-    }
+      $SQL="";
 
-    $SQL="";
+      /* If deletion starts from userslist, cn uid are not set */
+      if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
+        $this->uid = $this->parent->by_object['user']->uid;
+      }
 
-    
+      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+        $this->cn  = $this->parent->by_object['user']->cn;
+      }
 
-    $first_num = false;
-    // Delete old entries
-    foreach($this->a_old_telenums as $s_telenums){
-      if(!$first_num){
-        $first_num = $s_telenums;
+      $first_num = false;
+      // Delete old entries
+      foreach($this->a_old_telenums as $s_telenums){
+        if(!$first_num){
+          $first_num = $s_telenums;
+        }
+        $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
       }
-      $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
-    }
 
-    $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$first_num."';";
-    $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
-    $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
+      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$first_num."';";
+      $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
+      $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
 
 
-    foreach($SQL as $query){
-      if(!mysql_query($query,$r_con)){
-        print_red(_("Stop".mysql_error()));
-        return false;
+      foreach($SQL as $query){
+        if(!@mysql_query($query,$r_con)){
+          print_red(_("Stop".mysql_error()));
+          return false;
+        }
       }
     }
 
 
-
     /* unset macro attr, it will cause an error */
     $tmp = array_flip($this->attributes);
     unset($tmp['macro']);
@@ -955,7 +1094,7 @@ class phoneAccount extends plugin
 
     /* Just keep one phone number */
     if (count($this->telephoneNumber) && $this->telephoneNumber != ""){
-      $this->attrs['telephoneNumber']= $this->telephoneNumber[0];
+      $this->attrs['telephoneNumber']= $this->telephoneNumber;
     } else {
       $this->attrs['telephoneNumber']= array();
     }
@@ -977,6 +1116,7 @@ class phoneAccount extends plugin
     show_ldap_error($ldap->get_error());
 
     /* Optionally execute a command after we're done */
+    @mysql_close($r_con);
     $this->handle_post_events('remove');
   }
 
@@ -987,7 +1127,7 @@ class phoneAccount extends plugin
   {
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(|(objectClass=goFonAccount)(objectClass=goFonQueue))", array("telephoneNumber","cn","uid"));
+    $ldap->search("(|(objectClass=goFonAccount)(objectClass=goFonQueue)(objectClass=goFonConference))", array("telephoneNumber","cn","uid"));
     while($attrs = $ldap->fetch()) {
       unset($attrs['telephoneNumber']['count']);
       foreach($attrs['telephoneNumber'] as $tele){
@@ -1009,8 +1149,6 @@ class phoneAccount extends plugin
       }
     }
   }
-
-
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: