"Eins ist toll", "zwei" => "Zwei ist noch besser");
/* attribute list for save action */
var $attributes = array("goFonDeliveryMode", "goFonFormat","uid","cn","mail",
"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 = 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= " ".
_("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")." >"; }else{ $str="\nacl, "goFonMacro").">"; } $macrotab.= " | $str ".base64_decode($name).""; break; case "string": $str="acl, "goFonMacro")." style='width:340px;'>"; $macrotab.= " | ".base64_decode($name)." | $str"; break; } $macrotab.= " |