Code

Fixed Ogroup Copy & Paste for workstation startup
[gosa.git] / plugins / gofon / phoneaccount / class_phoneAccount.inc
index 03f69db1371c42426e10581be4a40500854612c7..0cf7ac03a6684df4a90025ec05e5a1f02382b3cc 100644 (file)
@@ -8,24 +8,25 @@ class phoneAccount extends plugin
   var $has_mailAccount= FALSE;
 
   /* Attributes */
-  var $telephoneNumber        = "";
+  var $telephoneNumber        = array();
   var $goFonHardware          = "";
   var $goFonFormat            = "";
   var $goFonPIN               = "";
+  var $goFonVoicemailPIN      = "";
   var $goFonDeliveryMode      = "";
   var $phoneNumbers           = 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 $uid;
-  var $cn;
+  var $a_old_telenums         = array();
+  var $goFonPINVoice          = "";
 
   /* CLI vars */
   var $cli_summary            = "Manage users phone account";
@@ -33,13 +34,18 @@ 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", "goFonFormat",
-      "goFonHardware", "goFonPIN", "telephoneNumber", "goFonMacro","macro");
+  var $CopyPasteVars          = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
+                                      "hardware_list","used_hardware");
+
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn",
+      "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
-  function phoneAccount ($config, $dn= NULL)
+  var $uid;
+
+  function phoneAccount ($config, $dn= NULL, $parent= NULL)
   {
-    plugin::plugin ($config, $dn);
+    plugin::plugin ($config, $dn, $parent);
 
     /* Set phone hardware */
     if (!isset($this->attrs['goFonHardware'])){
@@ -66,6 +72,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();
@@ -82,10 +116,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("*"));
 
@@ -111,7 +141,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']))){
@@ -184,14 +216,52 @@ 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'];  // DB Configuration
     $s_parameter    = "";                                           // Contains paramter for selected Macro 
@@ -202,7 +272,7 @@ class phoneAccount extends plugin
 
     $s_ip           = NULL;                   // Contains ip for Sip entry
     $s_host         = NULL;                   // Contains host for Sip entry
-    $s_qualify      = NULL;                   // Qualify entry
+    $s_qualify      = "yes";                  // Qualify entry
     $s_pin          = NULL;                   // Entry for secret
     $s_type         = NULL;                   // Entry for phone type (friend , peer ..)
 
@@ -219,11 +289,11 @@ class phoneAccount extends plugin
     $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
+    $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){
@@ -253,13 +323,20 @@ class phoneAccount extends plugin
       return false;
     }
 
-
-
     /* If Save == true, we should save something.
      * Generate SQL, for drop of old entries
-     * Generate SQL, for insert of new entries
+     * Generate SQL, for insert new entries
      */ 
     if($save == true){
+      
+      foreach($this->a_old_telenums as $tele){
+        $oldnums[]= preg_replace("/[^0-9]/","",$tele);
+      }
+
+      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];
@@ -297,7 +374,7 @@ class phoneAccount extends plugin
       $sip_data_array['amaflags']     = NULL;
       $sip_data_array['callgroup']    = NULL;
       $sip_data_array['callerid']     = "";
-      $sip_data_array['canreinvite']  = "yes";
+      $sip_data_array['canreinvite']  = "no";
       $sip_data_array['context']      = "default";
       $sip_data_array['defaultip']    = NULL;
       $sip_data_array['fromuser']     = NULL;
@@ -317,7 +394,7 @@ class phoneAccount extends plugin
       $sip_data_array['restrictcid']  = "n";
       $sip_data_array['rtptimeout']   = NULL;
       $sip_data_array['rtpholdtimeout']=NULL;
-      $sip_data_array['secret']       = $s_pin;
+      $sip_data_array['secret']       = $this->goFonPIN;
       $sip_data_array['type']         = $s_type ;
       $sip_data_array['username']     = $this->uid;
       $sip_data_array['disallow']     = NULL;
@@ -343,12 +420,12 @@ class phoneAccount extends plugin
 
       // Create new SIP entry ...
       $sip_entry = $sip_data_array;
-      reset($this->phoneNumbers);
-      $i_new_key = key($this->phoneNumbers);
-      $sip_entry['callerid']  =$this->phoneNumbers[$i_new_key];
-      $sip_entry['mailbox']   =$this->phoneNumbers[$i_new_key];
+      reset($newnums);
+      $i_new_key = key($newnums);
+      $sip_entry['callerid']  =$newnums[$i_new_key];
+      $sip_entry['mailbox']   =$newnums[$i_new_key];
 
-      if((isset($this->parent->by_object['mailAccount']->mail))&&($this->parent->by_object['mailAccount']->is_account==true)){
+      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{
         $s_mail = "";
@@ -358,7 +435,24 @@ class phoneAccount extends plugin
       $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=".$this->phoneNumbers[$i_new_key].";"; 
+      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$newnums[$i_new_key].";"; 
+      // Delete old entries
+      $b_first_deleted  =false;
+      if(isset($oldnums) && is_array($oldnums)){
+        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.";";
+          }
+        }
+      }
+      if($this->goFonHardware=="automatic"){
+        foreach($SQL as $query ){
+          mysql_query($query) ;
+        }
+        return;
+      }
 
       // Generate Strings with keys and values 
       foreach($sip_entry as $s_sip_key=>$s_sip_val){
@@ -373,37 +467,60 @@ class phoneAccount extends plugin
       // Append SIP Entry 
       $SQL[] ="INSERT INTO ".$a_SETUP['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
 
-      // Delete old entries
-      $b_first_deleted  =false;
-      foreach($this->a_old_telenums 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.";";
-        }
+      /* 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;
       }
 
-      $SQL[]= "INSERT INTO ".$a_SETUP['VOICE_TABLE']."
-        (`customer_id`,`context`,`mailbox`,`password`,`fullname`,`email`,`pager`)
-        VALUES
-        ('".$this->phoneNumbers[$i_new_key]."','default','".$this->phoneNumbers[$i_new_key]."','".$this->goFonPIN."','".$this->sn."','".$s_mail."','');";
+      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+        $this->cn  = $this->parent->by_object['user']->cn;
+      }
 
-      $i_is_accounted=false;
+      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['priority']      = 'hint';
-        $s_entry_hint['app']  = '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"){ 
@@ -413,78 +530,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 */
-
-    $this->parent->by_object['user']->is_modified=TRUE;
-    $this->is_modified=TRUE; 
-
-    $this->uid = $this->parent->by_object['user']->uid;
-    $this->cn  = $this->parent->by_object['user']->cn;
-
+          /* 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];
+          }
+        }
+      }
+    }
+    
+    /* 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'])){
@@ -496,18 +633,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="";
@@ -516,28 +658,32 @@ 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;
+      }
 
-      /* Automatic fill out */
-      if(isset($_POST['fillout'])){
-
-        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);
-          $string=preg_replace("/%cn/i",$this->cn,$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;
         }
       }
@@ -557,7 +703,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>";
@@ -641,14 +787,18 @@ class phoneAccount extends plugin
 
     /* 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 */
     $smarty->assign ("goFonHardware", $this->goFonHardware);
     if (!count($this->phoneNumbers)){
-      $smarty->assign ("phoneNumbers", array(""));
+      $smarty->assign ("phoneNumbers", array());
     } else {
       $smarty->assign ("phoneNumbers", $this->phoneNumbers);
     }
@@ -671,6 +821,7 @@ class phoneAccount extends plugin
     $smarty->assign ("hardware_list", $hl);
 
     /* Show main page */
+    $this->lastmacro = $this->macro;
     $display.= $smarty->fetch(get_template_path('generic.tpl', TRUE, dirname(__FILE__)));
     return($display);
   }
@@ -711,25 +862,7 @@ class phoneAccount extends plugin
       if(isset($this->macroarray[$this->macro])){ 
         foreach($this->macroarray[$this->macro] as $key => $paras){
           if(isset($_POST[$paras['var']])){
-            //            $par = $this->macroarray[$this->macro][$key];
-            //            $string = "";
-            //            if(preg_match("/.*%telephoneNumber_.*/",$par['default'])){
-            //              $string = $par['default'];
-            //              foreach($nummsinorder as $nummsinorderkey=> $nummsinorderval){
-            //                $string = (str_replace("%telephoneNumber_".($nummsinorderkey+1),$nummsinorderval,$string));
-            //              }
-            //            }
-
-            //            if(preg_match("/.*%uid.*/",$par['default'])){
-            //              if(empty($string)) $string = $par['default'];
-            //              $string = str_replace("%uid",$this->uid,$string);
-            //            }    
-
-            //            if(!empty($string)){  
-            //              $this->macroarray[$this->macro][$key]['choosen'] = $string; 
-            //            }else{
             $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 
@@ -752,8 +885,24 @@ class phoneAccount extends plugin
 
   function check()
   {
-    /* Reset message array */
-    $message= array();
+    /* Call common method to give check the hook */
+    $message= plugin::check();
+
+    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((strlen($this->goFonPIN)<=0)){
+      $message[]=(_("Phone PIN must be at least one character long."));
+    }else{
+      if(preg_match("/[^0-9a-z]/i",$this->goFonPIN)){
+        $message[]=(_("The specified phone PIN contains invalid characters, only aphanumeric values are allowed here."));
+      }
+    }
 
     if(!$this->generate_mysql_entension_entries()){
       $message[] = $this->generate_error;
@@ -764,17 +913,6 @@ class phoneAccount extends plugin
       $message[]= sprintf(_("You need to specify at least one phone number!"));
     }
 
-    if(($this->goFonPIN)==""){
-      $message[]= sprintf(_("You need to specify a Phone PIN."));
-    }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"));
-      }
-
-    }
-
     /* check for ! in any parameter setting*/
     if(isset($this->macroarray[$this->macro])){
       foreach($this->macroarray[$this->macro] as $val){
@@ -811,25 +949,32 @@ 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);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+
+    show_ldap_error($ldap->get_error(), _("Saving phone account failed"));
 
     /* 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");
+        $this->handle_post_events("modify",array("uid" => $this->uid));
       }
     } else {
-      $this->handle_post_events("add");
+      $this->handle_post_events("add",array("uid" => $this->uid));
     }
 
   }
@@ -873,60 +1018,78 @@ class phoneAccount extends plugin
 
   function remove_from_parent()
   {
-    // Get Configuration for Mysql database Server
-    $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
-    $s_parameter  ="";
-
-    // Connect to DB server
-    $r_con =  @mysql_connect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    if(!$this->initially_was_account) return;
 
-    // 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;
+    foreach($this->attributes as $key=>$val){
+      if(in_array($val,array("uid","cn"))){
+        unset($this->attributes[$key]);
+        unset($this->$val);
+      }
     }
+    if(array_key_exists('config', $_SESSION) &&
+       array_key_exists('SERVERS', $_SESSION['config']->data) &&
+       array_key_exists('FON', $_SESSION['config']->data['SERVERS']) &&
+        is_callable("mysql_pconnect")) {
+      // 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){
+        print_red(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){
+        print_red(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 */
-    $this->uid = $this->parent->by_object['user']->uid;
-    $this->cn  = $this->parent->by_object['user']->cn;
+      /* 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;
+      }
 
-    $first_num = false;
-    // Delete old entries
-    foreach($this->a_old_telenums as $s_telenums){
-      if(!$first_num){
-        $first_num = $s_telenums;
+      if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
+        $this->cn  = $this->parent->by_object['user']->cn;
       }
-      $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";
+      $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['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;
+        }
       }
+    }else{
+      print_red(_("Can't remove phone account, the mysql extension is not present in php configuration."));
+      return false;
     }
 
-
-
     /* unset macro attr, it will cause an error */
     $tmp = array_flip($this->attributes);
     unset($tmp['macro']);
@@ -946,6 +1109,7 @@ class phoneAccount extends plugin
       $this->attrs['telephoneNumber']= array();
     }
 
+
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
     $ldap->search("(objectClass=goFonQueue)", array("member"));
@@ -959,11 +1123,14 @@ class phoneAccount extends plugin
       }
     }
     $ldap->cd($this->dn);
-    $ldap->modify($this->attrs);
-    show_ldap_error($ldap->get_error());
+    $this->cleanup();
+    $ldap->modify ($this->attrs); 
+
+    show_ldap_error($ldap->get_error(), _("Removing phone account failed"));
 
     /* Optionally execute a command after we're done */
-    $this->handle_post_events('remove');
+    @mysql_close($r_con);
+    $this->handle_post_events('remove',array("uid"=> $this->uid));
   }
 
 
@@ -973,7 +1140,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){
@@ -997,6 +1164,39 @@ class phoneAccount extends plugin
   }
 
 
+  /* Create phoneAccount part of copy & paste dialog */
+  function getCopyDialog()
+  { 
+    if(!$this->is_account) return("");
+    $smarty = get_smarty();
+    if (!count($this->phoneNumbers)){
+      $smarty->assign ("phoneNumbers", array(""));
+    } else {
+      $smarty->assign ("phoneNumbers", $this->phoneNumbers);
+    }
+
+    $smarty->assign("goFonVoicemailPIN",$this->goFonVoicemailPIN);
+    $smarty->assign("goFonPIN",$this->goFonPIN);
+
+    $display= $smarty->fetch(get_template_path('paste_generic.tpl', TRUE, dirname(__FILE__)));
+    $ret =array();
+    $ret['string'] = $display;
+    $ret['status'] = "";
+    return($ret);
+  }
+
+  /* Save posts from copy & paste dialog dialog  */
+  function saveCopyDialog()
+  {
+    if(!$this->is_account) return;
+    $this->execute();
+    if(isset($_POST['goFonVoicemailPIN'])) {
+      $this->goFonVoicemailPIN = $_POST['goFonVoicemailPIN'];
+    }
+    if(isset($_POST['goFonPIN'])){
+      $this->goFonPIN = $_POST['goFonPIN'];
+    }
+  }
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: