Code

w3c
[gosa.git] / plugins / gofon / phoneaccount / class_phoneAccount.inc
index 4c6e0e3e95fce3cf1aa6e27f000133de6e17ffd5..40694034e5466ceabe5d2b28dd8aacb518adece1 100644 (file)
@@ -8,26 +8,34 @@ class phoneAccount extends plugin
   var $has_mailAccount= FALSE;
 
   /* Attributes */
-  var $telephoneNumber= "";
-  var $goFonHardware= "";
-  var $goFonForwarding= "";
-  var $goFonFormat= "";
-  var $goFonPIN= "";
-  var $goFonDeliveryMode= "";
-  var $phoneNumbers= array();
-  var $forwarders= array();
-  var $mail= "";
-  var $hardware_list= array();
-  var $used_hardware= array();
+  var $telephoneNumber        = "";
+  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 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 $goFonPINVoice          = "";
 
   /* CLI vars */
-  var $cli_summary= "Manage users phone account";
-  var $cli_description= "Some longer text\nfor help";
-  var $cli_parameters= array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
+  var $cli_summary            = "Manage users phone account";
+  var $cli_description        = "Some longer text\nfor help";
+  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");
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","uid","cn","mail",
+      "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
   function phoneAccount ($config, $dn= NULL)
@@ -52,16 +60,6 @@ class phoneAccount extends plugin
       }
     }
 
-    /* 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'])){
       if (in_array("gosaMailAccount", $this->attrs['objectClass'])){
@@ -69,6 +67,35 @@ 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();
     $ldap->cd($this->config->current['BASE']);
@@ -81,9 +108,95 @@ class phoneAccount extends plugin
         $description= "";
       }
       $this->hardware_list[$cn]= "$cn$description";
-      
+
+    }
+
+    /* Perform search, to get Macro Parameters,Name,Dn,Displayname etc*/
+    $ldap->search("(objectClass=goFonMacro)", array("*"));
+
+    /* Add none for no macro*/
+    $this->macros['none']=_("no macro");    
+    $this->macro ="none";
+
+
+    /* Fetch all Macros*/
+    while ($attrs= $ldap->fetch()){
+
+      /* Only visisble */
+      if((isset($attrs['goFonMacroVisible'][0]))&&($attrs['goFonMacroVisible'][0] ==1)){
+
+        /* unset Count, we don't need that here */
+        unset($attrs['displayName']['count']);
+
+        /* fill Selectfield variable with Macros */
+        if(isset($attrs['displayName'][0])){
+          $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
+        }else{
+          $this->macros[$attrs['dn']] = _("undefined");
+        }
+
+        /* Parse macro data, unset count for parameterarrays  */
+        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']))){
+
+          foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
+            /* Split Data in readable values, by delimiter !  */
+            $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
+
+            /* Set all attrs */
+            $id = $data[0];
+            $this->macroarray[$attrs['dn']][$id]['var']    ="var".$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];
+            if($data[2] == "bool"){
+              $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
+            }
+          }//foreach
+        }//is_array
+      }//visible = 1
+    }//while
+
+    /* 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);
+
+        /* 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];
+        }
+      }
     }
 
+
     /* Eventually colorize phones */
     $ldap->cd($this->config->current['BASE']);
     foreach ($this->hardware_list as $cn => $desc){
@@ -95,19 +208,531 @@ 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 
+    $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_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;
+    }
+
+    // Select database for Extensions
+    $r_db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
+
+    // Test if we have the database selected correctly
+    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();
+    $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
+    $a_ldap_attrs = $ldap->fetch();
+
+    if($this->is_number_used()){
+      $this->generate_error = $this->is_number_used(); 
+      return false;
+    }
+
+    /* 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);
+      }
+
+      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];
+      }
+
+      if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
+        $sip_data_array['dtmfmode']     = $a_ldap_attrs['goFonDmtfMode'][0];
+      }else{
+        $sip_data_array['dtmfmode']     ="rfc2833";
+      }
+
+      // 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);
+      }
+
+      if($this->is_number_used()){
+        $this->generate_error = $this->is_number_used(); 
+        return false;
+      }
+
+      // 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((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 = "";
+      }
+
+      // $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.";";
+        }
+      }
+
+      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){
+        if($s_sip_val == NULL) continue;
+        $s_sip_values.="'".$s_sip_val."',";
+        $s_sip_keys  .="`".$s_sip_key."`,";
+      }
+      // Remove last ,
+      $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']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
+
+      /* 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;
+      }
+
+      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($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"){ 
+          $macroname = preg_replace("/,.*$/","",$this->macro);        
+          $macroname = preg_replace("/^.*=/","",$macroname);        
+          $s_app = "Macro";$macroname;
+          $s_par = $macroname."|".$s_parameter; 
+        }else{
+          $s_app = "Dial";
+          $s_par = 'SIP/'.$this->uid."|20|r";
+        }
+
+        $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($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());
+          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);
+
+          /* 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'])){
       $this->is_account= !$this->is_account;
     }
 
+    /* Select no macro if, state is empty, this is the case, if the selected macro is no longer available */
+    if(empty($this->macro)){
+      $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, is no longer available for you, please choose another one."));
+    }
+
+    /* 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="";
+    }else{
+
+      $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){
+
+        /* get al vars */
+        $var        = $paras['var'];           
+        $name       = $paras['name'];           
+        $default    = $paras['default'];
+        $type       = $paras['type'];
+        $choosen    = $paras['choosen'] ; 
+        $str        = $default;
+
+        /* in case of a combo box display a combobox with selected attr */
+        $macrotab.= "<tr>";
+        switch ($type){
+
+          case "combo":
+            $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>";
+            }else{
+              $str.= "\n<option value='".$choice."'>".$choice."&nbsp;</option>";
+            }
+          }
+          $str.="</select>";
+          $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
+          break;
+
+          case "bool":
+            if(!$choosen){
+              $str="\n<input type='checkbox' name='".$var."' value='1' ".chkacl($this->acl, "goFonMacro")." >";
+            }else{
+              $str="\n<input type='checkbox' name='".$var."' value='1' checked  ".chkacl($this->acl, "goFonMacro").">";
+            }
+          $macrotab.= "<td colspan='2'>$str&nbsp;".base64_decode($name)."";
+          break;
+
+          case "string":
+            $str="<input name='".$var."' value='".$choosen."' ".chkacl($this->acl, "goFonMacro")." style='width:340px;'>";
+          $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
+          break;
+
+        }
+        $macrotab.= "</td></tr>";
+
+      }
+      $macrotab.="</table><input name='post_success' type='hidden' value='1'>";
+    }//is_array()
+
+    /* Give smarty the table */
+    $smarty->assign("macrotab",$macrotab);
+
     /* Do we represent a valid account? */
     if (!$this->is_account && $this->parent == NULL){
       $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\">&nbsp;<b>".
@@ -124,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);
       }
     }
@@ -149,24 +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]);
-      }
-    }
-
-    /* Prepare templating */
-    $smarty= get_smarty();
-
     /* Transfer ACL's */
     foreach($this->attributes as $val){
-      $smarty->assign($val."ACL", chkacl($this->acl, "$val"));
+      $smarty->assign($val."ACL", chkacl($this->acl,$val));
+      if(isset($this->$val)){
+        $smarty->assign($val,$this->$val);
+      }else{
+        $smarty->assign($val,"");
+      }
     }
 
     /* Fill arrays */
@@ -177,7 +797,7 @@ class phoneAccount extends plugin
       $smarty->assign ("phoneNumbers", $this->phoneNumbers);
     }
     $hl= "<select size=\"1\" name=\"goFonHardware\" title=\"".
-         _("Choose your private phone")."\" ".chkacl($this->acl, "goFonHardware").">\n";
+      _("Choose your private phone")."\" ".chkacl($this->acl, "goFonHardware").">\n";
     foreach ($this->hardware_list as $cn => $description){
       if ($cn == $this->goFonHardware){
         $selected= "selected";
@@ -189,55 +809,13 @@ class phoneAccount extends plugin
       } else {
         $color= "";
       }
-      $hl.= "  <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
+      $hl.= "  <option $color label=\"$cn\" value=\"$cn\" $selected>$description&nbsp;</option>\n";
     }
     $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);
-
-
-
-    /* Check box */
-    if ($this->parent->by_object['mailAccount'] &&
-        $this->parent->by_object['mailAccount']->is_account &&
-        preg_match("/M/i", $this->goFonDeliveryMode)){
-      $smarty->assign("fon_to_mail", "checked");
-    } else {
-      $smarty->assign("fon_to_mail", "");
-    }
-
-    if (!isset($this->parent->by_object['mailAccount'])) {
-      $smarty->assign("has_mailaccount", "false");
-      $this->has_mailAccount= false;
-    } elseif ( !$this->parent->by_object['mailAccount']->is_account){
-      $smarty->assign("has_mailaccount", "false");
-      $this->has_mailAccount= false;
-    } else {
-      $smarty->assign("has_mailaccount", "true");
-    }
-
     /* Show main page */
+    $this->lastmacro = $this->macro;
     $display.= $smarty->fetch(get_template_path('generic.tpl', TRUE, dirname(__FILE__)));
     return($display);
   }
@@ -261,24 +839,42 @@ 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("");
       }
 
-      /* Check if mail account is active and correct the internal
-         reference to represent the current status. */
-      if ($this->parent->by_object['mailAccount']->is_account){
-        $this->has_mailAccount= TRUE;
+      /* 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']];
+          }
+
+          /* 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']])) {
+                $this->macroarray[$this->macro][$key]['choosen']=$_POST[$paras['var']];
+              }else{
+                $this->macroarray[$this->macro][$key]['choosen']=false;
+              }
+            }
+          }
+        }
       }
     }
-
   }
 
   function check()
@@ -286,29 +882,39 @@ class phoneAccount extends plugin
     /* Reset message array */
     $message= array();
 
+    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;
+    }
+
     /* We need at least one phone number */
     if (count($this->phoneNumbers) == 0){
       $message[]= sprintf(_("You need to specify at least one phone number!"));
     }
 
-    /* Check timestamps and phonenumbers */
-    foreach ($this->forwarders as $fw){
-
-      /* Skip empty values */
-      if ($fw == ";"){
-        continue;
-      }                
-
-      /* 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);
+    /* check for ! in any parameter setting*/
+    if(isset($this->macroarray[$this->macro])){
+      foreach($this->macroarray[$this->macro] as $val){
+        if((strstr($val['choosen'],"!"))||(strstr($val['choosen'],"#"))){
+          $message[] = sprintf(_("The parameter %s contains invalid char. '!,#' is used as delimiter"),$val['name']);
+        }
       }
     }
-
     return ($message);
   }
 
@@ -318,22 +924,34 @@ class phoneAccount extends plugin
   {
     plugin::save();
 
-    /* goFonAccount has "mail" as must! Block if no mailaddress is specified... */
-    if (isset($this->parent->by_object['mailAccount']) &&
-        !$this->parent->by_object['mailAccount']->is_account) {
-
-      $this->goFonDeliveryMode= preg_replace("/M/i", "", $this->goFonDeliveryMode);
-    }
-
     /* Save arrays */
     $this->attrs['telephoneNumber']= array();
     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"){    
+      $this->attrs['goFonMacro']=$this->macro;
+      if(isset($this->macroarray[$this->macro])){
+        foreach($this->macroarray[$this->macro] as $paras)  {
+          $this->attrs['goFonMacro'].="!".$paras['id']."#".$paras['choosen'];
+        }
+      }
+    }else{
+      $this->attrs['goFonMacro']=array();
     }
+    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();
@@ -342,6 +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");
@@ -386,45 +1005,150 @@ 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()
   {
+  
+    foreach($this->attributes as $key=>$val){
+      if(in_array($val,array("uid","cn","mail"))){
+        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'])) {
+      // 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;
+      }
+
+      // 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;
+      }
+
+      $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;
+        }
+        $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;
+        }
+      }
+    }
+
+
+    /* unset macro attr, it will cause an error */
+    $tmp = array_flip($this->attributes);
+    unset($tmp['macro']);
+    $this->attributes=array_flip($tmp);
+
     /* Cancel if there's nothing to do here */
     if (!$this->initially_was_account){
       return;
     }
-    
+
     plugin::remove_from_parent();
 
     /* 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();
     }
 
     $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+    $ldap->search("(objectClass=goFonQueue)", array("member"));
+    while($attr = $ldap->fetch()){
+      if(in_array($this->dn,$attr['member'])){
+        $new =new ogrouptabs($this->config, $this->config->data['TABS']['OGROUPTABS'],$attr['dn']);
+        unset($new->by_object['ogroup']->memberList[$this->dn]);
+        unset($new->by_object['ogroup']->member[$this->dn]);
+        $new->save();
+        print_red(sprintf(_("Removed user '%s' from phone queue '%s'."),$this->uid,$new->by_object['ogroup']->attrs['cn']));
+      }
+    }
     $ldap->cd($this->dn);
     $ldap->modify($this->attrs);
     show_ldap_error($ldap->get_error());
 
     /* Optionally execute a command after we're done */
+    @mysql_close($r_con);
     $this->handle_post_events('remove');
   }
 
 
+
+  /* This function checks if the given phonenumbers are available or already in use*/
+  function is_number_used()
+  {
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+    $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){
+        if(!isset($attrs['cn'][0])) $attrs['cn'][0]=$attrs['dn'];
+        if(!isset($attrs['uid'][0])) $attrs['uid'][0]=$attrs['dn'];
+        $numbers[$tele]=$attrs;
+      }
+    }
+
+    foreach($this->phoneNumbers as $num){
+      if(!isset($this->cn)) $this->cn = "";
+
+      if((isset($numbers[$num]))&&(($numbers[$num]['uid'][0]!=$this->uid))){
+        if(isset($numbers[$num]['uid'][0])){
+          return sprintf(_("The specified telephonenumber '%s' is already assigned to '%s'."),$num,$numbers[$num]['uid'][0]);
+        }else{
+          return sprintf(_("The specified telephonenumber '%s' is already assigned to '%s'."),$num,$numbers[$num]['cn'][0]);
+        }
+      }
+    }
+  }
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: