Code

Added phoneAccount image.
[gosa.git] / gosa-plugins / gofon / gofon / phoneaccount / class_phoneAccount.inc
index efced502080ed04957f9c1cb6e08ee2983b6a026..cdde338d23707dc1633d2ef41693645db15bd4ef 100644 (file)
@@ -3,9 +3,9 @@
 class phoneAccount extends plugin
 {
   /* Definitions */
-  var $plHeadline= "Phone";
+  var $plHeadline   = "Phone";
   var $plDescription= "This does something";
-  var $has_mailAccount= FALSE;
+  var $plIcon       = "plugins/gofon/images/phoneAccount.png";
 
   /* Attributes */
   var $telephoneNumber        = array();
@@ -31,23 +31,25 @@ class phoneAccount extends plugin
   var $init_HomeServer        = "0";            // Contains the dn of the server that manage this account 
   var $goFonHomeServers       = array();        // Contains all available server configurations 
 
-  /* 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 $context                = "default";
+  var $voice_context          = "default";
 
   /* attribute list for save action */
   var $CopyPasteVars          = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
                                       "hardware_list","used_hardware");
 
-  var $attributes             = array("goFonDeliveryMode", "goFonFormat","cn","goFonHomeServer",
+  var $attributes             = array("goFonDeliveryMode", "goFonFormat","goFonHomeServer",
       "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
   var $objectclasses= array("goFonAccount");
 
   var $uid;
+  var $cn;
 
   var $view_logged = FALSE;
   var $multiple_support = TRUE;
+  var $mailAddress      = "";
+  var $has_mailAccount  = FALSE;
+  var $pager      = "";
 
   function phoneAccount (&$config, $dn= NULL, $parent= NULL)
   {
@@ -61,19 +63,40 @@ class phoneAccount extends plugin
       }
     }
 
-    /* Set up has_mailAccount */
-    if (isset($this->attrs['objectClass'])){
-      if (in_array("gosaMailAccount", $this->attrs['objectClass'])){
-        $this->has_mailAccount= TRUE;
-      }
+    /* Set parent object to tab object */
+    if(is_object($parent)){
+      $this->parent = $parent->parent;
+    }
+
+    /* Get current uid and cn 
+     */
+    if(isset($this->attrs['uid'][0])){
+      $this->uid = $this->attrs['uid'][0];
+    }
+    if(isset($this->attrs['cn'][0])){
+      $this->cn = $this->attrs['cn'][0];
+    }
+    if(isset($this->attrs['mail'][0])){
+      $this->mailAddress = $this->attrs['mail'][0];
+    }
+    if(isset($this->attrs['pager'][0])){
+      $this->pager = $this->attrs['pager'][0];
     }
 
-    /* Set uid */
-    if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
-      $this->uid = $this->parent->by_object['user']->uid;
+    /* If there is a parent object present, use references 
+     */
+    if(isset($this->parent->by_object['user']->uid)){
+      $this->uid = &$this->parent->by_object['user']->uid;
+    }
+    if(isset($this->parent->by_object['user']->cn)){
+      $this->cn   =&$this->parent->by_object['user']->cn;
+    }
+    if(isset($this->parent->by_object['user']->pager)){
+      $this->pager   =&$this->parent->by_object['user']->pager;
     }
-    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->parent->by_object['mailAccount']->mail)){
+      $this->mailAddress      = &$this->parent->by_object['mailAccount']->mail;
+      $this->has_mailAccount  = &$this->parent->by_object['mailAccount']->is_account;
     }
 
     /* Check server configurations 
@@ -136,8 +159,8 @@ class phoneAccount extends plugin
     /* Get available phone hardware  
      * Search for all available phone hardware  
      */
-    $tmp = get_sub_list("(objectClass=goFonHardware)","",array(get_ou("phoneou")),
-                  $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
+    $tmp = get_sub_list("(objectClass=goFonHardware)","phone",array(get_ou("phoneou")),
+                  $this->config->current['BASE'],array("cn","description"), GL_SUBSEARCH);
     foreach($tmp as $attrs){
       $cn= $attrs['cn'][0];
       $description= "";
@@ -163,8 +186,8 @@ class phoneAccount extends plugin
         get_ou("componentou"),
         get_ou("phoneou"));
 
-    $tmp = get_sub_list("(goFonHardware=*)","",$deps_a,$this->config->current['BASE'],
-        array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
+    $tmp = get_sub_list("(goFonHardware=*)","phone",$deps_a,$this->config->current['BASE'],
+        array('cn','dn','goFonHardware'),GL_SUBSEARCH);
     foreach($tmp as $attrs){
       $cn = $attrs['goFonHardware'][0];
       if(isset($this->hardware_list[$cn])){
@@ -174,11 +197,11 @@ class phoneAccount extends plugin
 
 
     /* Get available Macros  
-     * Search for all Marcos that are visible and create 
+     * Search for all Macros that are visible and create 
      *  an array with name and parameters 
      */
-    $tmp = get_sub_list("(&(objectClass=goFonMacro)(goFonMacroVisible=1))","",array(get_ou("macroou")),
-                  $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn"), GL_NONE);
+    $tmp = get_sub_list("(&(objectClass=goFonMacro)(goFonMacroVisible=1))","gofonmacro",array(get_ou("macroou")),
+                  $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn","cn"), GL_NO_ACL_CHECK | GL_SUBSEARCH );
     
 
     /* Add none for no macro*/
@@ -188,6 +211,16 @@ class phoneAccount extends plugin
     /* Fetch all Macros*/
     foreach($tmp as $attrs){
 
+      $ui = get_userinfo(); 
+      $acl = $ui->get_permissions($attrs['dn'],"gofonmacro/macro","");
+
+      /* Skip all macros we are not able to read 
+          execpt, the currently selected macro.
+       */
+      if(!preg_match("/r/",$acl) && !preg_match("/^".normalizePreg($attrs['dn'])."/",$this->goFonMacro)){
+        continue;
+      }
+
       /* unset Count, we don't need that here */
       unset($attrs['displayName']['count']);
 
@@ -269,18 +302,36 @@ class phoneAccount extends plugin
      * This means, the PIN in the DB is up to date
      */
     // Connect to DB server
-    if((is_callable("mysql_pconnect"))&&(isset($cur_cfg))&&(isset($cur_cfg['SERVER']))&&(isset($cur_cfg['LOGIN']))&&(isset($cur_cfg['PASSWORD']))){
+    if( (is_callable("mysql_pconnect"))&&
+        (isset($cur_cfg))&&
+        (isset($cur_cfg['SERVER']))&&
+        (isset($cur_cfg['LOGIN']))&&
+        (isset($cur_cfg['PASSWORD']))){
+
       $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
       if($r_con){
         $r_db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
   
-        $query_tmp = "SELECT ".$cur_cfg['VOICE_TABLE'].".password FROM  ".$cur_cfg['VOICE_TABLE'].", ".
-                     $cur_cfg['SIP_TABLE']."  WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'";
+        $query_tmp = "SELECT ".$cur_cfg['VOICE_TABLE'].".context as 'v_context', 
+                             ".$cur_cfg['SIP_TABLE'].".context, 
+                             ".$cur_cfg['VOICE_TABLE'].".password 
+                       FROM  ".$cur_cfg['VOICE_TABLE'].", 
+                             ".$cur_cfg['SIP_TABLE']." 
+                       WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'";
 
-        $vp = mysql_fetch_row(mysql_query($query_tmp));
+
+        $res = mysql_query($query_tmp);
+        $vp  = mysql_fetch_assoc($res);
+  
         @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
-        if((isset($vp[0]))&&(!empty($vp[0]))){
-          $this->goFonPINVoice = $vp[0];
+        if((isset($vp['password']))&&(!empty($vp['password']))){
+          $this->goFonPINVoice = $vp['password'];
+        }
+        if((isset($vp['context']))&&(!empty($vp['context']))){
+          $this->context = $vp['context'];
+        }
+        if((isset($vp['v_context']))&&(!empty($vp['v_context']))){
+          $this->voice_context = $vp['v_context'];
         }
       }
     }
@@ -309,7 +360,7 @@ class phoneAccount extends plugin
      */
     if(!count($this->goFonHomeServers)){
       if($save){
-        msg_dialog::display(_("Configuration error"), _("There is currently no asterisk server defined!"), WARNING_DIALOG);
+        msg_dialog::display(_("Configuration error"), msgPool::noserver(_("GOfon")), WARNING_DIALOG);
       }
       return(true);
     }
@@ -317,7 +368,7 @@ class phoneAccount extends plugin
     /* Check if Mysql extension is available */
     if(!is_callable("mysql_pconnect")){
       if($save){
-        msg_dialog::display(_("Configuration error"), sprintf(_("Missing %s PHP extension!"), "mysql"), WARNING_DIALOG);
+        msg_dialog::display(_("Configuration error"), msgPool::missingext("php-mysql"), WARNING_DIALOG);
       }
       return(true);
     }
@@ -356,8 +407,6 @@ class phoneAccount extends plugin
 
     $i_is_accounted = false;  // Ensure that extension entry, for name to number is only once in table
 
-    restore_error_handler();
-
     /* Prepare some basic attributes */
     $oldnums = array();
     foreach($this->a_old_telenums as $tele){
@@ -367,13 +416,9 @@ class phoneAccount extends plugin
       $newnums[]= preg_replace("/[^0-9]/","",$tele);
     }
 
-    /* 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(empty($this->uid)) trigger_error("Uid is empty.");
+
+
     /* Create voicemail entry 
      */
     if((!isset($this->cn))||(empty($this->cn))){
@@ -382,11 +427,11 @@ class phoneAccount extends plugin
       $CNname= $this->cn;
     }
 
-    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 = "";
+    $s_mail = "";
+    if($this->has_mailAccount){
+      $s_mail = $this->mailAddress;;
     }
+
     /* Get phonehardware to setup sip entry  */
     $ldap         = $this->config->get_ldap_link();
     $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
@@ -440,17 +485,15 @@ class phoneAccount extends plugin
     $a_New = $this->goFonHomeServers[$this->goFonHomeServer];  // DB Configuration
     $new_connection =  @mysql_pconnect($a_New['SERVER'],$a_New['LOGIN'],$a_New['PASSWORD']);
     if(!$new_connection){
-      $this->generate_error = sprintf(
-          _("The MySQL Server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
-          $a_New['SERVER'],$a_New['LOGIN']);
+      $this->generate_error =  msgPool::dbconnect($a_New['SERVER'],@mysql_error($new_connection),
+          _("Abort saving entries to keep the database consistent."));
       new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($new_connection));
       return false;
     }
     $new_database  =  @mysql_select_db($a_New['DB'],$new_connection);
     if(!$new_database){
-      $this->generate_error = sprintf(
-          _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
-          $a_New['DB'],$a_New['SERVER']);
+      $this->generate_error =  msgPool::dbselect($a_New['DB'],@mysql_error($new_connection),
+          _("Abort saving entries to keep the database consistent."));
       new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($new_connection));
       return false;
     }
@@ -467,17 +510,15 @@ class phoneAccount extends plugin
        */
       $old_connection =  @mysql_pconnect($a_Remove['SERVER'],$a_Remove['LOGIN'],$a_Remove['PASSWORD']);
       if(!$old_connection){
-        $this->generate_error = sprintf(
-            _("The old MySQL home server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
-            $a_Remove['SERVER'],$a_Remove['LOGIN']);
+        $this->generate_error =  msgPool::dbconnect($a_Remove['SERVER'],@mysql_error($old_connection),
+            _("Abort saving entries to keep the database consistent."));
         new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($old_connection));
         return false;
       }
       $old_database  =  @mysql_select_db($a_Remove['DB'],$old_connection);
       if(!$old_database){
-        $this->generate_error = sprintf(
-            _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
-            $a_Remove['DB'],$a_Remove['SERVER']);
+        $this->generate_error =  msgPool::dbselect($a_Remove['DB'],@mysql_error($old_connection),
+            _("Abort saving entries to keep the database consistent."));
         new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($old_connection));
         return false;
       }
@@ -545,6 +586,7 @@ class phoneAccount extends plugin
         $sip_data_array['type']         = $s_type ;
         $sip_data_array['username']     = $this->uid;
         $sip_data_array['ipaddr']       = $s_ip;
+        $sip_data_array['context']      = $this->context;
 
         /* Remove not changed attributes, to avoid updating table with same values */
         foreach($sip_data_array as $name => $value){
@@ -574,7 +616,7 @@ class phoneAccount extends plugin
         $sip_data_array['amaflags']     = NULL;
         $sip_data_array['callgroup']    = NULL;
         $sip_data_array['canreinvite']  = "no";
-        $sip_data_array['context']      = "default";
+        $sip_data_array['context']      = $this->context;
         $sip_data_array['defaultip']    = NULL;
         $sip_data_array['fromuser']     = NULL;
         $sip_data_array['fromdomain']   = NULL;
@@ -626,20 +668,31 @@ class phoneAccount extends plugin
 
       $customer_id = $newnums[$i_new_key];
 
+      $query  = "SELECT id,name,callerid FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';";
+
+      $rid    = mysql_query($query,$new_connection);
+      @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
+      $result = mysql_fetch_assoc($rid);
+  
+      $old_customer_id = ""; 
+      if($result){
+        $old_customer_id = $result['callerid'];
+      }
+
       $voice_data_array = array(
           "customer_id" => $customer_id,
           "mailbox"     => $customer_id,
           "password"    => $this->goFonVoicemailPIN,
           "fullname"    => $CNname,
+          "context"     => $this->voice_context,
           "email"       => $s_mail);
 
-      /* Set pager number if available */
-      if(isset($this->parent->by_object['user']->pager)){
-        $voice_data_array['pager']   = $this->parent->by_object['user']->pager;
-      }
+      $voice_data_array['pager']   = $this->pager;
 
       /* Check if there is already an entry in sip_users for this uid */
-      $query_tmp = "SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$customer_id."';\n";
+      $query_tmp = "SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$old_customer_id."';\n";
+
+
       $rid = mysql_query($query_tmp,$new_connection);
       @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
       if(mysql_affected_rows($new_connection)){
@@ -647,6 +700,7 @@ class phoneAccount extends plugin
         /********************** 
          * Update Voice mail entry  
          **********************/
+
         $result = mysql_fetch_assoc($rid)  ;
 
         foreach($voice_data_array as $name => $value){
@@ -655,14 +709,14 @@ class phoneAccount extends plugin
           }
         }
 
-        /* Only update entry if there is something to uopdate */
+        /* Only update entry if there is something to update */
         if(count($voice_data_array)){
           $query = "UPDATE ".$a_New['VOICE_TABLE']." SET ";
           foreach($voice_data_array as $key => $val){
             $query.= "".$key."='".$val."',"; 
           } 
           $query = preg_replace("/,$/","",$query);
-          $query.= " WHERE customer_id='".$customer_id."';";
+          $query.= " WHERE customer_id='".$old_customer_id."';";
           $SQL_query_array[] = $query;
         }
       }else{
@@ -670,7 +724,7 @@ class phoneAccount extends plugin
         /********************** 
          * Insert Voice mail entry  
          **********************/
-        $voice_data_array['context'] = "default";
+        $voice_data_array['context'] = $this->voice_context;
   
         /* There is currently no voice mail entry for this user. 
          * We should create one 
@@ -696,6 +750,7 @@ class phoneAccount extends plugin
       /* Remove old entries */
       $query = array();
       $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
+      $oldnums= array();
       foreach($oldnums as $s_telenums){
         $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
       }
@@ -791,7 +846,7 @@ class phoneAccount extends plugin
         foreach($SQL_query_array as $query){
           @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
           if(!@mysql_query($query,$new_connection)){
-            msg_dialog::display(_("Error"), sprintf(_("Cannot query %s database!"), "GOfon"), ERROR_DIALOG);
+            $this->generate_error =  msgPool::dbquery("GOfon",@mysql_error($old_connection));
             return false;
           }
         }
@@ -815,6 +870,7 @@ class phoneAccount extends plugin
 
     $display = "";
     $SkipWrite = (!isset($this->parent) || !$this->parent) && !session::is_set('edit');
+
     if(empty($this->macro)&&(!empty($this->goFonMacro))){
 
       /* Go through already saved values, for a parameter */
@@ -853,8 +909,8 @@ class phoneAccount extends plugin
     
     /* 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= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\">&nbsp;<b>".
+        msgPool::noValidExtension(_("Phone"))."</b>";
       $display.= back_to_main();
       return ($display);
     }
@@ -866,8 +922,8 @@ class phoneAccount extends plugin
 
     /* 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= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\">&nbsp;<b>".
+        msgPool::noValidExtension(_("Phone"))."</b>";
       $display.= back_to_main();
       return($display);
     }
@@ -879,14 +935,14 @@ class phoneAccount extends plugin
     if (!$this->multiple_support_active && $this->parent !== NULL){
       if ($this->is_account){
         $display= $this->show_disable_header(_("Remove phone account"),
-            _("This account has phone features enabled. You can disable them by clicking below."));
+            msgPool::featuresEnabled(_("Phone")));
       } else {
         if(empty($this->uid)){
           $display= $this->show_enable_header(_("Create phone account"),
-              _("This account has phone features disabled. You can't enable them while no uid is set."),TRUE,TRUE);
+            msgPool::featuresDisabled(_("Phone"),_("User uid")));
         }else{
           $display= $this->show_enable_header(_("Create phone account"),
-              _("This account has phone features disabled. You can enable them by clicking below."));
+            msgPool::featuresDisabled(_("Phone")));
         }
         return ($display);
       }
@@ -908,9 +964,14 @@ class phoneAccount extends plugin
     $smarty->assign("macros",$this->macros);   
     $smarty->assign("macro", $this->macro);   
 
+    /* Assign contexts */
+    $smarty->assign("contexts",$this->get_asterisk_contexts());
+    $smarty->assign("context" ,$this->context);
+    $smarty->assign("voice_context" ,$this->voice_context);
+
     /* check if there is a FON server created */
     if(!count($this->goFonHomeServer)){
-      msg_dialog::display(_("Configuration error"), _("There is currently no asterisk server defined!"), WARNING_DIALOG);
+      msg_dialog::display(_("Configuration error"), msgPool::noserver(_("GOfon")), WARNING_DIALOG);
     }
 
     /* Create html parameter table for selected macro parameters 
@@ -1015,7 +1076,7 @@ class phoneAccount extends plugin
         $this->phoneNumbers[$number]= $number;
         $this->is_modified= TRUE;
       } else {
-        msg_dialog::display(_("Error"), _("Phone number is invalid!"), ERROR_DIALOG);
+        msg_dialog::display(_("Error"), msgPool::invalid("Phone number"), ERROR_DIALOG);
       }
     }
 
@@ -1030,7 +1091,7 @@ class phoneAccount extends plugin
     /* Assign acls */
     $tmp = $this->plInfo();
     foreach($tmp['plProvidedAcls'] as $name => $translation){
-      $smarty->assign($name."ACL",$this->getacl($name));
+      $smarty->assign($name."ACL",$this->getacl($name,$SkipWrite));
     }
 
     /* Transfer ACL's */
@@ -1091,6 +1152,14 @@ class phoneAccount extends plugin
       }
     }
 
+    foreach(array("goFonVoiceMailContext","goFonContext") as $attr){
+      if(in_array($attr,$this->multi_boxes)){
+        $smarty->assign("use_".$attr,TRUE);
+      }else{
+        $smarty->assign("use_".$attr,FALSE);
+      }
+    }
+
     /* Show main page */
     $this->lastmacro = $this->macro;
     $smarty->assign("multiple_support",$this->multiple_support_active);
@@ -1120,6 +1189,7 @@ class phoneAccount extends plugin
 
       /* Every macro in the select box are available */
       if((isset($_POST['macro']))){
+        $this->macro = $_POST['macro'];
         $this->macrostillavailable=true;
       }
 
@@ -1127,6 +1197,22 @@ class phoneAccount extends plugin
         $this->is_modified =true;
       }
 
+      /* Save context */
+      if(isset($_POST['context'])){
+        if($this->context != $_POST['context']){
+          $this->is_modified= TRUE;
+        }
+        $this->context= $_POST['context'];
+      }
+
+      /* Save voice context */
+      if(isset($_POST['voice_context'])){
+        if($this->voice_context != $_POST['voice_context']){
+          $this->is_modified= TRUE;
+        }
+        $this->voice_context= $_POST['voice_context'];
+      }
+
       if(is_array($this->phoneNumbers)){
         foreach($this->phoneNumbers as $telenumms) {
           $nummsinorder[]=$telenumms; 
@@ -1139,9 +1225,11 @@ class phoneAccount extends plugin
       /* get all Postvars */
       if(isset($this->macroarray[$this->macro])){
 
-        if($this->acl_is_writeable("goFonMarco",$SkipWrite)){
+
+        if($this->acl_is_writeable("goFonMacro",$SkipWrite)){
           foreach($this->macroarray[$this->macro] as $key => $paras){
 
+            $old_macro_settings = $this->macroarray[$this->macro][$key]; 
             $backup = $this->macroarray[$this->macro][$key];
 
             if(isset($_POST[$paras['var']])){
@@ -1161,9 +1249,13 @@ class phoneAccount extends plugin
                 }
               }
             }
+            if(array_differs($old_macro_settings,$this->macroarray[$this->macro][$key])){
+              $this->is_modified = TRUE;
+            }
           }
+
           if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
-            $this->modified = TRUE;
+            $this->is_modified = TRUE;
           }
         }
       }
@@ -1180,19 +1272,19 @@ class phoneAccount extends plugin
     }
 
     if(empty($this->goFonHomeServer)){
-      $message[] = _("Please select a valid goFonHomeServer.");
+      $message[] = msgPool::invalid(_("Home server"));
     }
 
     if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
-      $message[]=(_("Voicemail PIN must be between 1-4 characters."));
+      $message[]= msgPool::invalid(_("Voicemail PIN"),"","",_("Between 1-4 charactes"));
     }else{
       if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN)){
-        $message[]=(_("The specified Voicemail PIN contains invalid characters, only numeric values are allowed here."));
+        $message[]= msgPool::invalid(_("Voicemail PIN"),preg_replace("/[0-9]/","X",$this->goFonVoicemailPIN),"/X/");
       }
     }
 
     if(preg_match("/[^0-9a-z]/i",$this->goFonPIN)){
-      $message[]=(_("The specified phone PIN contains invalid characters, only aphanumeric values are allowed here."));
+      $message[]= msgPool::invalid(_("Phone PIN"),preg_replace("/[0-9a-z]/i","X",$this->goFonPIN),"/X/");
     }
 
     if ($this->initially_was_account != $this->is_account || $this->is_modified){
@@ -1203,14 +1295,14 @@ class phoneAccount extends plugin
 
     /* We need at least one phone number */
     if (count($this->phoneNumbers) == 0){
-      $message[]= sprintf(_("You need to specify at least one phone number!"));
+      $message[]= msgPool::required("Phone number");
     }
 
     /* 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']);
+          $message[] = msgPool::invalid(sprintf(_("macro parameter %s"),$val['name']),$val['choosen'],"/[^\#]/");
         }
       }
     }
@@ -1283,7 +1375,9 @@ class phoneAccount extends plugin
       new log("create","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
     }
 
-    show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/phone account with dn '%s' failed."),$this->dn));
+    if (!$ldap->success()){
+      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
+    }
 
     /* Optionally execute a command after we're done */
 
@@ -1298,12 +1392,12 @@ class phoneAccount extends plugin
   }
 
 
-  function adapt_from_template($dn)
+  function adapt_from_template($dn, $skip= array())
   {
-    plugin::adapt_from_template($dn);
+    plugin::adapt_from_template($dn, $skip);
 
     /* Assemble phone numbers */
-    if (isset($this->attrs['telephoneNumber'])){
+    if (isset($this->attrs['telephoneNumber']) && !in_array("telephoneNumber", $skip)){
       for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
         $number= $this->attrs['telephoneNumber'][$i];
         $this->phoneNumbers[$number]= $number;
@@ -1316,12 +1410,6 @@ class phoneAccount extends plugin
   {
     if(!$this->initially_was_account) return;
 
-    foreach($this->attributes as $key=>$val){
-      if(in_array($val,array("uid","cn"))){
-        unset($this->attributes[$key]);
-        unset($this->$val);
-      }
-    }
     if(count($this->goFonHomeServers) && !empty($this->init_HomeServer) && is_callable("mysql_pconnect")){
 
       // Get Configuration for initial Mysql database Server
@@ -1333,7 +1421,7 @@ class phoneAccount extends plugin
 
       // Check if we are  connected correctly
       if(!$r_con){
-        msg_dialog::display(_("Error"), sprintf(_("Cannot connect to %s database!"), "GOfon"), ERROR_DIALOG);
+        msg_dialog::display(_("Error"), msgPool::dbconnect("GOfon",@mysql_error()), ERROR_DIALOG);
         new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error());
         return false;
       }
@@ -1343,21 +1431,13 @@ class phoneAccount extends plugin
 
       // Test if we have the database selected correctly
       if(!$db){
-        msg_dialog::display(_("Error"), sprintf(_("Cannot select %s database!"), "GOfon"), ERROR_DIALOG);
+        msg_dialog::display(_("Error"), msgPool::dbselect("GOfon", @mysql_error()), ERROR_DIALOG);
         new log("debug","gofonreport/".get_class($this),"",array(),@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
@@ -1368,19 +1448,29 @@ class phoneAccount extends plugin
         $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
       }
 
-      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$first_num."';";
+
+      $query  = "SELECT id,name,callerid FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';";
+      $rid    = mysql_query($query,$r_con);
+      @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
+      $result = mysql_fetch_assoc($rid);
+      $callerid = $first_num;
+      if($result){
+        $callerid = $result['callerid'];
+      }
+
+      $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$callerid."';";
       $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){
         @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
         if(!@mysql_query($query,$r_con)){
-          msg_dialog::display(_("Error"), sprintf(_("Cannot query %s database!"), "GOfon"), ERROR_DIALOG);
+          msg_dialog::display(_("Error"), msgPool::dbquery("GOfon",@mysql_error()), ERROR_DIALOG);
           return false;
         }
       }
     }else{
-      msg_dialog::display(_("Configuration error"), sprintf(_("Missing %s PHP extension!"), "mysql"), WARNING_DIALOG);
+      msg_dialog::display(_("Configuration error"), msgPool::missingext("php-mysql"), WARNING_DIALOG);
       return false;
     }
 
@@ -1421,7 +1511,9 @@ class phoneAccount extends plugin
     $ldap->modify ($this->attrs); 
 
     new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
-    show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/phone account with dn '%s' failed."),$this->dn));
+    if (!$ldap->success()){
+      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+    }
 
     /* Optionally execute a command after we're done */
     @mysql_close($r_con);
@@ -1446,8 +1538,6 @@ class phoneAccount extends plugin
     }
 
     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]);
@@ -1511,17 +1601,19 @@ class phoneAccount extends plugin
           "plSelfModify"    => TRUE,
           "plDepends"       => array("user"),
           "plPriority"      => 7,                                 // Position in tabs
-          "plSection"       => "personal",                        // This belongs to personal
-          "plCategory"      => array("gofonreport" => array("description" => _("GOfon reports"),
-              "objectClass" => "")),
+          "plSection"         => array("personal" => _("My account")),
+          "plCategory"        => array("users"),
+
 
           "plOptions"       => array(),
 
           "plProvidedAcls"  => array(
             "telephoneNumber"     => _("Telephone number"),
-            "goFonHomeServer"     => _("Home server"),
             "goFonMacro"          => _("Macro settings"),
             "goFonHardware"       => _("Phone hardware"),
+            "goFonHomeServer"     => _("Home server"),
+            "goFonContext"          => _("Phone context"),
+            "goFonVoiceMailContext" => _("Voice mail context"),
             "goFonPIN"            => _("Telephone pin"),
             "goFonVoicemailPIN"   => _("Voicemail pin"))
           ));
@@ -1572,6 +1664,7 @@ class phoneAccount extends plugin
       }
 
       if(isset($_POST['macro']) && $_POST['macro'] != $this->macro){
+        $this->macro = $_POST['macro'];
         $this->is_modified =true;
       }
 
@@ -1593,7 +1686,7 @@ class phoneAccount extends plugin
           }
         }
         if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
-          $this->modified = TRUE;
+          $this->is_modified = TRUE;
         }
       }
     }
@@ -1647,6 +1740,27 @@ class phoneAccount extends plugin
     }
     return($ret);
   }
+
+
+  /* Return asterisk contexts
+   * Additionaly read contexts from file.
+   */
+  function get_asterisk_contexts()
+  {
+    $contexts = array();
+    $contexts[] = "default";
+    $contexts[] = "parkedcalls";
+    $contexts[] = "from-sip";
+    $contexts[] = "from-capi";
+    $file = "/etc/gosa/asterisk_contexts.conf";
+    if(file_exists($file) && is_readable($file)){
+      foreach(file($file) as $context){
+        $contexts[] = trim($context);
+      }
+    }
+    array_unique($contexts);
+    return($contexts);
+  }
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: