diff --git a/plugins/gofon/phoneaccount/class_phoneAccount.inc b/plugins/gofon/phoneaccount/class_phoneAccount.inc
index c1a81694d92c95c5bb21ad45bcd34a622d41e333..40694034e5466ceabe5d2b28dd8aacb518adece1 100644 (file)
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)
}
}
- /* 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'])){
}
}
+ $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']);
$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){
}
}
}
-
$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\"> <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." </option>";
+ }else{
+ $str.= "\n<option value='".$choice."'>".$choice." </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 ".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 src=\"images/stop.png\" align=center> <b>".
+ $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
_("This account has no phone extensions.")."</b>";
$display.= back_to_main();
return($display);
$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);
}
}
}
}
- /* 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 */
$smarty->assign ("goFonHardware", $this->goFonHardware);
- $smarty->assign ("phoneNumbers", $this->phoneNumbers);
+ if (!count($this->phoneNumbers)){
+ $smarty->assign ("phoneNumbers", array(""));
+ } else {
+ $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";
} else {
$color= "";
}
- $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description</option>\n";
+ $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description </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=center maxlength=60 value=\"$number\" $acl>";
- $forwarder_list.= "</td><td>";
- $forwarder_list.= "<input name=\"fwt$nr\" size=5 align=center 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);
}
$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()
/* 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);
}
{
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();
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");
$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: