X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fgofon%2Fphoneaccount%2Fclass_phoneAccount.inc;h=40694034e5466ceabe5d2b28dd8aacb518adece1;hb=964b2aab64c48149f8cec70fe8cfa79307274c01;hp=4c6e0e3e95fce3cf1aa6e27f000133de6e17ffd5;hpb=075b413929a9ba9b563d75384d199718d3b4fb1a;p=gosa.git diff --git a/plugins/gofon/phoneaccount/class_phoneAccount.inc b/plugins/gofon/phoneaccount/class_phoneAccount.inc index 4c6e0e3e9..40694034e 100644 --- a/plugins/gofon/phoneaccount/class_phoneAccount.inc +++ b/plugins/gofon/phoneaccount/class_phoneAccount.inc @@ -8,26 +8,34 @@ class phoneAccount extends plugin 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) @@ -52,16 +60,6 @@ class phoneAccount extends plugin } } - /* 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'])){ @@ -69,6 +67,35 @@ class phoneAccount extends plugin } } + $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']); @@ -81,9 +108,95 @@ class phoneAccount extends plugin $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){ @@ -95,19 +208,531 @@ class phoneAccount extends plugin } } } - $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 =""; + /* 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.= ""; + switch ($type){ + + case "combo": + $str= ""; + $macrotab.= ""; + + } + $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.= "
"; + }//is_array() + + /* Give smarty the table */ + $smarty->assign("macrotab",$macrotab); + /* Do we represent a valid account? */ if (!$this->is_account && $this->parent == NULL){ $display= "\"\" ". @@ -124,8 +749,13 @@ class phoneAccount extends plugin $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); } } @@ -149,24 +779,14 @@ class phoneAccount extends plugin } } - /* 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 */ @@ -177,7 +797,7 @@ class phoneAccount extends plugin $smarty->assign ("phoneNumbers", $this->phoneNumbers); } $hl= "\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.= ""; - $forwarder_list.= ""; - $forwarder_list.= ""; - $forwarder_list.= ""; - $forwarder_list.= ""; - $forwarder_list.= ""; - if (count($this->forwarders) > 1){ - $forwarder_list.= ""; - } - $forwarder_list.= ""; - } - $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); } @@ -261,24 +839,42 @@ class phoneAccount extends plugin $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() @@ -286,29 +882,39 @@ class phoneAccount extends plugin /* 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); } @@ -318,22 +924,34 @@ class phoneAccount extends plugin { 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(); @@ -342,6 +960,7 @@ class phoneAccount extends plugin 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"); @@ -386,45 +1005,150 @@ class phoneAccount extends plugin $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: