Code

Added option to select asterisk extensions delimiter
[gosa.git] / gosa-plugins / gofon / gofon / phoneaccount / class_phoneAccount.inc
index 54048a4f6cbc8c1fe01bceee530292d7100e1f86..b4f4dede09b12f06af36c6ecc8284ccfe41e9470 100644 (file)
@@ -7,6 +7,8 @@ class phoneAccount extends plugin
   var $plDescription= "This does something";
   var $plIcon       = "plugins/gofon/images/phoneAccount.png";
 
+  var $delimiter = "|";
+
   /* Attributes */
   var $telephoneNumber        = array();
   var $goFonHardware          = "automatic";
@@ -32,7 +34,9 @@ class phoneAccount extends plugin
   var $goFonHomeServers       = array();        // Contains all available server configurations 
 
   var $context                = "default";
+  var $sip_contexts           = array();
   var $voice_context          = "default";
+  var $voicemail_contexts     = array();
 
   /* attribute list for save action */
   var $CopyPasteVars          = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
@@ -55,6 +59,8 @@ class phoneAccount extends plugin
   {
     plugin::plugin ($config, $dn, $parent);
 
+    $this->delimiter = $config->get_cfg_value("asteriskParameterDelimiter","|");
+
     /* Assemble phone numbers */
     if (isset($this->attrs['telephoneNumber'])){
       for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
@@ -63,6 +69,9 @@ class phoneAccount extends plugin
       }
     }
 
+    $this->sip_contexts = $this->get_asterisk_sip_contexts();
+    $this->voicemail_contexts = $this->get_asterisk_voicemail_contexts();
+
     /* Set parent object to tab object */
     if(is_object($parent)){
       $this->parent = $parent->parent;
@@ -239,23 +248,49 @@ class phoneAccount extends plugin
 
       /* 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 = explode("!",$attrs['goFonMacroParameter'][$pkey]);
+
+              $string = $data[3];
+              $string=preg_replace("/%uid/i",$this->uid,$string);
+              $string=preg_replace("/%pager/i",$this->pager,$string);
+              $string=preg_replace("/%context/i",$this->context,$string);
+              $string=preg_replace("/%voicemailcontext/i",$this->voice_context,$string);
+
+              if(isset($this->cn)){
+                  $string=preg_replace("/%cn/i",$this->cn,$string);
+              }
 
-        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
+
+              $tmp = array();
+              foreach($this->phoneNumbers as $phonenum){
+                  $tmp[] = $phonenum;
+              }
+
+              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);
+              }
+              $data[3] = $string;
+
+
+              /* 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
     }//while
 
@@ -264,7 +299,7 @@ class phoneAccount extends plugin
      * If we have a macro selected, parse it and set values 
      *  in $this->macroarray[$this->macro]. 
      */
-    $tmp = split("!",$this->goFonMacro);
+    $tmp = explode("!",$this->goFonMacro);
     if(is_array($tmp)){
 
       /* First value is the macroname */
@@ -284,7 +319,7 @@ class phoneAccount extends plugin
       foreach($tmp as $var){
 
         /* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
-        $varar = split("#",$var);
+        $varar = explode("#",$var);
 
         /* Only insert if the parameter still exists */
         if(isset($this->macroarray[$this->macro][$varar[0]])){
@@ -298,20 +333,16 @@ class phoneAccount extends plugin
     $this->a_old_telenums = $this->phoneNumbers;
 
 
-    /* Check table definitions
-     */
-    if(!phoneAccount::checkRealtimeTables($cur_cfg)){
-      msg_dialog::display(_("Warning"),
-          sprintf(_("GOsa identified problems with your MySQL table definition, please activate debugging for details.")),
-          WARNING_DIALOG);
-    }
-
     /* 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
+
+
+    $num = key($this->phoneNumbers);
+
     if( (is_callable("mysql_pconnect"))&&
         (isset($cur_cfg))&&
         (isset($cur_cfg['SERVER']))&&
@@ -320,21 +351,25 @@ class phoneAccount extends plugin
 
       $r_con =  @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
       if($r_con){
+
+        // Try to select the gophone database
         $r_db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
-  
+        if(!$r_db){
+          msg_dialog::display(_("Warning"), msgPool::dbselect($cur_cfg['DB'],mysql_error()), WARNING_DIALOG);
+        }
+
         $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."'";
-
-
+                       WHERE ".$cur_cfg['VOICE_TABLE'].".mailbox = ".$num." 
+                          AND ".$cur_cfg['SIP_TABLE'].".name='".$this->uid."'";
         $res = mysql_query($query_tmp);
         $vp  = mysql_fetch_assoc($res);
         if(!isset($vp['context'])){
           $this->is_modified= TRUE;
-          msg_dialog::display(_("Warning"), sprintf(_("Could not identify telephone extension in database, please try to save again. Activate debugging if error remains.")), WARNING_DIALOG);
+          msg_dialog::display(_("Warning"), sprintf(_("Cannot identify telephone extension in database, please try to save again.")), WARNING_DIALOG);
         } 
  
         @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
@@ -405,6 +440,17 @@ class phoneAccount extends plugin
     return($ret);
   }
 
+  function stripInvalidChars($tele){
+    /* Strip invalid chars, but maintain a leading + for international numbers */
+    $t_tele= preg_replace("/[^0-9]/","",$tele);
+    if (preg_match('/^\+/', $tele)) {
+      $t_tele= "+".$t_tele;
+    }
+    return($t_tele);
+  }
+    
+
+
 
   /* This function generates the Database entries. 
    * The Parameter 'save' could be true or false.
@@ -453,7 +499,8 @@ class phoneAccount extends plugin
     $s_host         = NULL;                   // Contains host for Sip entry
     $s_qualify      = "yes";                  // Qualify entry
     $s_pin          = NULL;                   // Entry for secret
-    $s_type         = NULL;                   // Entry for phone type (friend , peer ..)
+    $s_type         = "friend";               // Entry for phone type (friend , peer ..)
+                                              // Set the default to the default of the db
 
     $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
@@ -472,11 +519,12 @@ class phoneAccount extends plugin
 
     /* Prepare some basic attributes */
     $oldnums = array();
+
     foreach($this->a_old_telenums as $tele){
-      $oldnums[]= preg_replace("/[^0-9]/","",$tele);
+      $oldnums[]= $this->stripInvalidChars($tele);
     }
     foreach($this->phoneNumbers as $tele){
-      $newnums[]= preg_replace("/[^0-9]/","",$tele);
+      $newnums[]= $this->stripInvalidChars($tele);
     }
 
     if(empty($this->uid)) trigger_error("Uid is empty.");
@@ -497,6 +545,7 @@ class phoneAccount extends plugin
 
     /* Get phonehardware to setup sip entry  */
     $ldap         = $this->config->get_ldap_link();
+    $ldap->cd ($this->config->current['BASE']);
     $r_res        = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
     $a_ldap_attrs = $ldap->fetch();
 
@@ -599,6 +648,15 @@ class phoneAccount extends plugin
        * If there is an old entry, get callerid and remove voicemail and extensions 
        */
       if($old_connection){
+
+        /* Check table definitions
+         */
+        if(!phoneAccount::checkRealtimeTables($a_Remove)){
+          msg_dialog::display(_("Warning"),
+              sprintf(_("GOsa identified problems with your MySQL table definition!")),
+              WARNING_DIALOG);
+        }
+
         $query  = "SELECT id,name,callerid FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
         $rid    = mysql_query($query,$old_connection);
         @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, 
@@ -657,11 +715,20 @@ class phoneAccount extends plugin
        * Update / Insert sip_users entry  
        **********************/
 
+      /* Check table definitions
+       */
+      if(!phoneAccount::checkRealtimeTables($a_New)){
+        msg_dialog::display(_("Warning"),
+            sprintf(_("GOsa identified problems with your MySQL table definition!")),
+            WARNING_DIALOG);
+      }
+
+
       /* Set the first given phone number as callerid */
       reset($newnums);        
       $i_new_key = key($newnums);
       $sip_data_array['callerid']  =$newnums[$i_new_key];
-      $sip_data_array['mailbox']   =$newnums[$i_new_key];
+      $sip_data_array['mailbox']   =$newnums[$i_new_key]."@".$this->voice_context;
 
       /* Check if there is already an entry in sip_users for this uid */
       $SQL_query_array = array();
@@ -721,7 +788,7 @@ class phoneAccount extends plugin
         $sip_data_array['host']         = $s_host;
         $sip_data_array['insecure']     = NULL;
         $sip_data_array['language']     = NULL;
-        $sip_data_array['mailbox']      = $newnums[$i_new_key];
+        $sip_data_array['mailbox']      = $newnums[$i_new_key]."@".$this->voice_context;
         $sip_data_array['md5secret']    = NULL;
         $sip_data_array['nat']          = "no";
         $sip_data_array['permit']       = NULL;
@@ -863,9 +930,9 @@ class phoneAccount extends plugin
       // 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 .= $val['choosen'].$this->delimiter;
         }
-        $s_parameter = preg_replace("/\|$/","",$s_parameter);
+        $s_parameter = rtrim($s_parameter, $this->delimiter);
       }
 
       $i = 0; 
@@ -875,7 +942,7 @@ class phoneAccount extends plugin
         $EXT[$i]['exten']   = $this->uid;
         $EXT[$i]['priority']= 1;
         $EXT[$i]['app']     = "Goto";
-        $EXT[$i]['appdata'] = $newnums[$i_new_key]."|1";
+        $EXT[$i]['appdata'] = $newnums[$i_new_key].$this->delimiter."1";
         $i ++;
       }
 
@@ -901,10 +968,10 @@ class phoneAccount extends plugin
           $macroname = preg_replace("/,.*$/","",$this->macro);        
           $macroname = preg_replace("/^.*=/","",$macroname);        
           $s_app = "Macro";$macroname;
-          $s_par = $macroname."|".$s_parameter; 
+          $s_par = $macroname.$this->delimiter.$s_parameter; 
         }else{
           $s_app = "Dial";
-          $s_par = 'SIP/'.$this->uid."|20|r";
+          $s_par = 'SIP/'.$this->uid.$this->delimiter."20".$this->delimiter."r";
         }
 
         $EXT[$i]['context'] = 'GOsa';
@@ -985,7 +1052,7 @@ class phoneAccount extends plugin
     if(empty($this->macro)&&(!empty($this->goFonMacro))){
 
       /* Go through already saved values, for a parameter */
-      $tmp = split("!",$this->goFonMacro);
+      $tmp = explode("!",$this->goFonMacro);
 
       /* it is possible that nothing has been saved yet */
       if(is_array($tmp)){
@@ -1007,7 +1074,7 @@ class phoneAccount extends plugin
         foreach($tmp as $var){
 
           /* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
-          $varar = split("#",$var);
+          $varar = explode("#",$var);
 
           /* Only insert if the parameter still exists */
           if(isset($this->macroarray[$this->macro][$varar[0]])){
@@ -1076,7 +1143,8 @@ class phoneAccount extends plugin
     $smarty->assign("macro", $this->macro);   
 
     /* Assign contexts */
-    $smarty->assign("contexts",$this->get_asterisk_contexts());
+    $smarty->assign("voicemail_contexts",$this->voicemail_contexts);
+    $smarty->assign("sip_contexts",$this->sip_contexts);
     $smarty->assign("context" ,$this->context);
     $smarty->assign("voice_context" ,$this->voice_context);
 
@@ -1106,6 +1174,9 @@ class phoneAccount extends plugin
           $string = $paras['default'];
 
           $string=preg_replace("/%uid/i",$this->uid,$string);
+          $string=preg_replace("/%pager/i",$this->pager,$string);
+          $string=preg_replace("/%context/i",$this->context,$string);
+          $string=preg_replace("/%voicemailcontext/i",$this->voice_context,$string);
 
           if(isset($this->cn)){
             $string=preg_replace("/%cn/i",$this->cn,$string);
@@ -1144,7 +1215,7 @@ class phoneAccount extends plugin
 
           case "combo":
             $str= "<select name='".$var."' ".$dis." >";
-          foreach(split(":",$default) as $choice){
+          foreach(explode(":",$default) as $choice){
             if($choosen==$choice){
               $str.= "\n<option value='".$choice."' selected>".$choice."&nbsp;</option>";
             }else{
@@ -1182,7 +1253,10 @@ class phoneAccount extends plugin
 
     /* Add phone number */
     if (isset($_POST["add_phonenumber"]) && $_POST['phonenumber']){
-      if (tests::is_phone_nr($_POST['phonenumber'])){
+
+      if(strlen(trim($_POST["phonenumber"])) > 20 ){
+        msg_dialog::display(_("Error"), msgPool::toobig("Phone number"), ERROR_DIALOG);
+      }elseif (tests::is_phone_nr($_POST['phonenumber'])){
         $number= trim($_POST["phonenumber"]);
         $this->phoneNumbers[$number]= $number;
         $this->is_modified= TRUE;
@@ -1256,7 +1330,7 @@ class phoneAccount extends plugin
 
 
     foreach($this->attributes as $attr){
-      if(in_array($attr,$this->multi_boxes)){
+      if(in_array_strict($attr,$this->multi_boxes)){
         $smarty->assign("use_".$attr,TRUE);
       }else{
         $smarty->assign("use_".$attr,FALSE);
@@ -1264,7 +1338,7 @@ class phoneAccount extends plugin
     }
 
     foreach(array("goFonVoiceMailContext","goFonContext") as $attr){
-      if(in_array($attr,$this->multi_boxes)){
+      if(in_array_strict($attr,$this->multi_boxes)){
         $smarty->assign("use_".$attr,TRUE);
       }else{
         $smarty->assign("use_".$attr,FALSE);
@@ -1399,7 +1473,7 @@ class phoneAccount extends plugin
     }
 
     if ($this->initially_was_account != $this->is_account || $this->is_modified){
-      $str = $this->generate_mysql_entension_entries(true);
+      $str = $this->generate_mysql_entension_entries(false);
       if(empty($str)){
         msg_dialog::display(_("Error"), $str, ERROR_DIALOG);
       }
@@ -1410,6 +1484,27 @@ class phoneAccount extends plugin
       $message[]= msgPool::required("Phone number");
     }
 
+    /* Do not allow to save duplicate phone numbers 
+     *  this may destroy the extensions table.
+     */ 
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);  
+    $numberFilter = "";
+    foreach($this->phoneNumbers as $number){
+      $numberFilter .= "(telephoneNumber={$number})";
+    }
+    $ldap->search("(&(!(uid=".$this->uid."))(objectClass=goFonAccount)(|{$numberFilter}))",array("dn","telephoneNumber"));
+    $res = array();
+    while($attrs = $ldap->fetch()){
+      unset($attrs['telephoneNumber']['count']);
+      $res = array_merge($res,array_intersect($attrs['telephoneNumber'], $this->phoneNumbers));
+    }
+    $res = array_unique($res);
+    if(count($res)){
+      $message[] = msgPool::duplicated(_("Phone number"))."&nbsp;<br>".
+        implode(array_intersect($res, $this->phoneNumbers), ", ");
+    }
+
     /* check for ! in any parameter setting*/
     if(isset($this->macroarray[$this->macro])){
       foreach($this->macroarray[$this->macro] as $val){
@@ -1462,7 +1557,7 @@ class phoneAccount extends plugin
      */
     $str = $this->generate_mysql_entension_entries(true);
     if(!$str){
-      msg_dialog::display(_("Error"),_("An error occured while updating the database entries, activate debugging for details.") , ERROR_DIALOG);
+      msg_dialog::display(_("Error"),_("An error occured while updating the database entries!") , ERROR_DIALOG);
     }
 
     if($this->attrs['goFonMacro']==""){
@@ -1509,7 +1604,7 @@ class phoneAccount extends plugin
     plugin::adapt_from_template($dn, $skip);
 
     /* Assemble phone numbers */
-    if (isset($this->attrs['telephoneNumber']) && !in_array("telephoneNumber", $skip)){
+    if (isset($this->attrs['telephoneNumber']) && !in_array_strict("telephoneNumber", $skip)){
       for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
         $number= $this->attrs['telephoneNumber'][$i];
         $this->phoneNumbers[$number]= $number;
@@ -1528,6 +1623,14 @@ class phoneAccount extends plugin
       $a_SETUP = $this->goFonHomeServers[$this->init_HomeServer];
       $s_parameter  ="";
 
+      /* Check table definitions
+       */
+      if(!phoneAccount::checkRealtimeTables($a_SETUP)){
+        msg_dialog::display(_("Warning"),
+            sprintf(_("GOsa identified problems with your MySQL table definition!")),
+            WARNING_DIALOG);
+      }
+
       // Connect to DB server
       $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
 
@@ -1604,7 +1707,7 @@ class phoneAccount extends plugin
 
       /* Let changes get active, everything was fine;
        */
-      mysql_query("commit;",$old_connection);
+      mysql_query("commit;",$r_con);
       @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>commit;</b>", "");
       @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Transaction sucessful!---</b>", "");
 
@@ -1637,7 +1740,7 @@ class phoneAccount extends plugin
     $ldap->cd($this->config->current['BASE']);
     $ldap->search("(&(objectClass=goFonQueue)(member=*))", array("member"));
     while($attr = $ldap->fetch()){
-      if(in_array($this->dn,$attr['member'])){
+      if(in_array_strict($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]);
@@ -1835,30 +1938,30 @@ class phoneAccount extends plugin
   {
     $message = plugin::multiple_check();
 
-    if(!count($this->goFonHomeServers) && in_array("goFonHomeServers",$this->multi_boxes)){
+    if(!count($this->goFonHomeServers) && in_array_strict("goFonHomeServers",$this->multi_boxes)){
       $message[] = _("There is currently no asterisk server defined!");
     }
 
-    if(empty($this->goFonHomeServer) && in_array("goFonHomeServers",$this->multi_boxes)){
+    if(empty($this->goFonHomeServer) && in_array_strict("goFonHomeServers",$this->multi_boxes)){
       $message[] = _("Asterisk server is invalid!");
     }
 
-    if(in_array("goFonVoicemailPIN",$this->multi_boxes) && 
+    if(in_array_strict("goFonVoicemailPIN",$this->multi_boxes) && 
         ( (strlen($this->goFonVoicemailPIN)==0)||
           (strlen($this->goFonVoicemailPIN)>4))){
       $message[]=(_("Voicemail PIN must be 4 characters long!"));
     }else{
-      if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN) && in_array("goFonVoicemailPIN",$this->multi_boxes) ){
+      if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN) && in_array_strict("goFonVoicemailPIN",$this->multi_boxes) ){
         $message[]=(_("Voicemail PIN contains invalid characters!"));
       }
     }
 
-    if(preg_match("/[^0-9a-z]/i",$this->goFonPIN) && in_array("goFonPIN",$this->multi_boxes)){
+    if(preg_match("/[^0-9a-z]/i",$this->goFonPIN) && in_array_strict("goFonPIN",$this->multi_boxes)){
       $message[]=(_("Phone pin contains invalid characters!"));
     }
 
     /* check for ! in any parameter setting*/
-    if(isset($this->macroarray[$this->macro]) && in_array("macro",$this->multi_boxes)){
+    if(isset($this->macroarray[$this->macro]) && in_array_strict("macro",$this->multi_boxes)){
       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']);
@@ -1872,7 +1975,7 @@ class phoneAccount extends plugin
   function get_multi_edit_values()
   {
     $ret = plugin::get_multi_edit_values();
-    if(in_array("macro",$this->multi_boxes)){
+    if(in_array_strict("macro",$this->multi_boxes)){
       $ret['macro'] = $this->macro;
       $ret['macroarray'] = $this->macroarray;
       $ret['macros'] = $this->macros;
@@ -1884,18 +1987,24 @@ class phoneAccount extends plugin
   /* Return asterisk contexts
    * Additionaly read contexts from file.
    */
-  function get_asterisk_contexts()
+  function get_asterisk_voicemail_contexts()
+  {
+    return($this->get_asterisk_contexts(CONFIG_DIR."/asterisk/voicemail_context.conf"));
+  }
+  function get_asterisk_sip_contexts()
+  {
+    return($this->get_asterisk_contexts(CONFIG_DIR."/asterisk/sip_context.conf"));
+  }
+  function get_asterisk_contexts($file)
   {
     $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);
       }
+    }else{
+      msg_dialog::display(_("Warning"), msgPool::cannotReadFile($file),WARNING_DIALOG);
+      $contexts[] = "default";
     }
     array_unique($contexts);
     return($contexts);