"Eins ist toll", "zwei" => "Zwei ist noch besser"); /* attribute list for save action */ var $CopyPasteVars = array("phoneNumbers"); var $attributes = array("goFonDeliveryMode", "goFonFormat","uid","cn", "goFonHardware","goFonPIN","goFonVoicemailPIN", "telephoneNumber", "goFonMacro","macro"); var $objectclasses= array("goFonAccount"); function phoneAccount ($config, $dn= NULL) { plugin::plugin ($config, $dn); /* Set phone hardware */ if (!isset($this->attrs['goFonHardware'])){ $this->goFonHardware= "automatic"; } /* Preset voice format */ if (!isset($this->attrs['goFonFormat'])){ $this->goFonFormat= "wav"; } /* Assemble phone numbers */ if (isset($this->attrs['telephoneNumber'])){ for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){ $number= $this->attrs['telephoneNumber'][$i]; $this->phoneNumbers[$number]= $number; } } /* Set up has_mailAccount */ if (isset($this->attrs['objectClass'])){ if (in_array("gosaMailAccount", $this->attrs['objectClass'])){ $this->has_mailAccount= TRUE; } } $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']); $ldap->search("(objectClass=goFonHardware)", array('cn', 'description')); while ($attrs= $ldap->fetch()){ $cn= $attrs['cn'][0]; if (isset($attrs['description'])){ $description= " - ".$attrs['description'][0]; } else { $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){ $ldap->search("(goFonHardware=$cn)", array('cn')); if ($ldap->count() > 0){ $ldap->fetch(); if ($ldap->getDN() != $this->dn){ $this->used_hardware[$cn]= $ldap->getDN(); } } } $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 = "yes"; // 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; if(isset($oldnums) && is_array($oldnums)){ foreach($oldnums as $s_telenums){ $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n"; if(!$b_first_deleted){ $b_first_deleted=true; $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$s_telenums.";"; } } } if($this->goFonHardware=="automatic"){ foreach($SQL as $query ){ mysql_query($query) ; } return; } // Generate Strings with keys and values foreach($sip_entry as $s_sip_key=>$s_sip_val){ 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= " ". _("This account has no phone extensions.").""; $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 ="
".base64_decode($name)." | $str"; break; case "bool": if(!$choosen){ $str="\nacl, "goFonMacro")." ".$dis.">"; }else{ $str="\nacl, "goFonMacro")." ".$dis.">"; } $macrotab.= " | $str ".base64_decode($name).""; break; case "string": $str="acl, "goFonMacro")." style='width:340px;' ".$dis.">"; $macrotab.= " | ".base64_decode($name)." | $str"; break; } $macrotab.= " |