X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fgofon%2Fphoneaccount%2Fclass_phoneAccount.inc;h=819b5b2da46c90e7cf98e978c41d8d63e0d55bd8;hb=bf00497bf90223b2c4b175f60f6d787e879d335d;hp=0181f5763374ae5749cebbdb67a6e85064af5a59;hpb=b9635d93694f48c73ed531cf00bb9924a9b92e8b;p=gosa.git
diff --git a/plugins/gofon/phoneaccount/class_phoneAccount.inc b/plugins/gofon/phoneaccount/class_phoneAccount.inc
index 0181f5763..819b5b2da 100644
--- a/plugins/gofon/phoneaccount/class_phoneAccount.inc
+++ b/plugins/gofon/phoneaccount/class_phoneAccount.inc
@@ -10,20 +10,22 @@ class phoneAccount extends plugin
/* Attributes */
var $telephoneNumber = "";
var $goFonHardware = "";
- var $goFonForwarding = "";
var $goFonFormat = "";
var $goFonPIN = "";
+ var $goFonVoicePIN = "";
var $goFonDeliveryMode = "";
var $phoneNumbers = array();
- var $forwarders = array();
var $mail = "";
var $hardware_list = array();
var $used_hardware = array();
var $goFonMacro = "";
- var $macro = 0; // Selected Macor
+ var $macro = 0; // Selected Macro
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";
@@ -31,8 +33,8 @@ class phoneAccount extends plugin
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", "goFonMacro","macro");
+ var $attributes = array("goFonDeliveryMode", "goFonFormat","uid","cn","mail",
+ "goFonHardware","goFonPIN", "telephoneNumber", "goFonMacro","macro");
var $objectclasses= array("goFonAccount");
function phoneAccount ($config, $dn= NULL)
@@ -57,16 +59,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'])){
@@ -74,6 +66,35 @@ class phoneAccount extends plugin
}
}
+ $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;
+ }
+ }
+
+ $attrs = @mysql_fetch_row(@mysql_query("SELECT * FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id=".$this->phoneNumbers[$first].";"));
+ if($attrs){
+ $this->goFonPINVoice = $attrs[4];
+ }else{
+ $this->goFonPINVoice = false;
+ }
+
/* Load hardware list */
$ldap= $this->config->get_ldap_link();
$ldap->cd($this->config->current['BASE']);
@@ -89,10 +110,6 @@ class phoneAccount extends plugin
}
- /* Prepare templating */
- $smarty= get_smarty();
-
-
/* Perform search, to get Macro Parameters,Name,Dn,Displayname etc*/
$ldap->search("(objectClass=goFonMacro)", array("*"));
@@ -124,18 +141,20 @@ class phoneAccount extends plugin
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']="N/A";
- $this->macroarray[$attrs['dn']][$id]['id'] = $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
@@ -168,13 +187,13 @@ class phoneAccount extends plugin
/* 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){
@@ -186,14 +205,383 @@ 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;
+ }
+
+ /* Set PINs to false,
+ * to avoid setting them before we explicitly
+ * pressed set voicemail PIN or Phone PIN
+ */
+
+ if(count(split("\|",$this->goFonPIN))==2){
+ $tmp = split("\|",$this->goFonPIN);
+ $this->goFonPIN = $tmp[0];
+ $this->goFonVoicePIN = $tmp[1];
+ }else{
+ $this->goFonVoicePIN = $this->goFonPIN;
+ }
+
+ // Unset goFonPIN, to avoid save_object for this attribute
+ foreach($this->attributes as $key=>$val){
+ if($val == "goFonPIN"){
+ unset($this->attributes[$key]);
+ }
+ }
+
+ }
+
+
+ // Generate MySQL Syntax
+ function generate_mysql_entension_entries($save = false){
+
+ // 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_connect($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;
+ }
+
+ $existence = @mysql_fetch_row(@mysql_query( "SELECT * FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';"));
+
+ if(!$existence&&((empty($this->goFonPIN))||(empty($this->goFonVoicePIN)))){
+ $this->generate_error = _("You are currently creating a new phone account, please specify a value for phone PIN and voice PIN.");
+ return(false);
+ }
+
+ if((empty($this->goFonPIN))&&(empty($existence[27]))){
+ $this->generate_error = _("The PIN attribute is missing in database entry. Please assign a valid phone PIN.");
+ return(false);
+ }
+
+ if(isset($existence[15])){
+ $voice = @mysql_fetch_row(@mysql_query("SELECT password FROM ".$a_SETUP['VOICE_TABLE']." where customer_id='".$existence[15]."'"));
+ if((empty($this->goFonVoicePIN))&&(empty($voice[0]))){
+ $this->generate_error = _("The voice PIN attribute is missing in database entry. Please assign a valid voice PIN.");
+ 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){
+
+ /* Get old voice passwword if no new isset */
+ if($this->goFonPIN==false){
+ $pin = @mysql_fetch_row(@mysql_query("SELECT secret FROM ".$a_SETUP['SIP_TABLE']." where name='".$this->uid."'"));
+ $this->goFonPIN = $pin[0];
+ }
+
+ // 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'] = $s_pin;
+ $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($this->phoneNumbers);
+ $i_new_key = key($this->phoneNumbers);
+ $sip_entry['callerid'] =$this->phoneNumbers[$i_new_key];
+ $sip_entry['mailbox'] =$this->phoneNumbers[$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 = "";
+ }
+
+
+ /* Get old voice passwword if no new isset */
+ if($this->goFonVoicePIN==false){
+ $voice = @mysql_fetch_row(@mysql_query("SELECT password FROM ".$a_SETUP['VOICE_TABLE']." where customer_id=".$this->phoneNumbers[$i_new_key].""));
+ $this->goFonVoicePIN = $voice[0];
+ }
+
+ /* Get old voice passwword if no new isset */
+ if($this->goFonPIN==false){
+ $pin = @mysql_fetch_row(@mysql_query("SELECT secret FROM ".$a_SETUP['SIP_TABLE']." where name='".$this->uid."'"));
+ $this->goFonPIN = $pin[0];
+ }
+
+ // $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=".$this->phoneNumbers[$i_new_key].";";
+
+ // 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.");";
+
+ // Delete old entries
+ $b_first_deleted =false;
+ foreach($this->a_old_telenums 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(empty($this->goFonPINVoice)){
+ $this->goFonPINVoice = $this->goFonPIN;
+ }
+
+ /* 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 ('".$this->phoneNumbers[$i_new_key]."',
+ 'default',
+ '".$this->phoneNumbers[$i_new_key]."',
+ '".$this->goFonVoicePIN."',
+ '".$CNname."',
+ '".$s_mail."',
+ '');";
+ $i_is_accounted=false;
+
+ $i = 0;
+
+ // Entension entries Hint / Dial / Goto
+ foreach($this->phoneNumbers as $s_telenums){
+
+ /* Mapping : Name TO Number*/
+ $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;
+ }
+
+ $EXT[$i]['context'] = 'GOsa';
+ $EXT[$i]['exten'] = $s_telenums;
+ $EXT[$i]['priority']= 2;
+ $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;
+ }
+ }
+ }
+ return true;
}
function execute()
{
+ /* 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;
@@ -204,9 +592,33 @@ class phoneAccount extends plugin
$this->macro ="none";
}
+ if(isset($_POST['goFonVoicePINSet'])){
+ if((strlen($_POST['goFonVoicePIN'])==0)||(strlen($_POST['goFonVoicePIN'])>4)){
+ print_red(_("Voicemail PIN must be between 1-4 characters."));
+ }else{
+ if(preg_match("/[^0-9]/",$_POST['goFonVoicePIN'])){
+ print_red(_("The specified Voicemail PIN contains invalid characters, only numeric values are allowed here."));
+ }else{
+ $this->goFonVoicePIN=$_POST['goFonVoicePIN'];
+ }
+ }
+ }
+
+ if(isset($_POST['goFonPINSet'])){
+ if((strlen($_POST['goFonPIN'])!=4)){
+ print_red(_("Phone PIN must be 4 characters long."));
+ }else{
+ if(preg_match("/[^0-9]/",$_POST['goFonVoicePIN'])){
+ print_red(_("The specified phone PIN contains invalid characters, only numeric values are allowed here."));
+ }else{
+ $this->goFonPIN=$_POST['goFonPIN'];
+ }
+ }
+ }
+
/* tell user that the pluging selected is no longer available*/
if((!$this->macrostillavailable)&&($this->macro!="none")){
- print_red(_("The macro you selected in the past, is no longer available for you, please choose another one."));
+ print_red(_("The macro you selected, is no longer available for you, please choose another one."));
}
/* Prepare templating */
@@ -223,6 +635,36 @@ class phoneAccount extends plugin
$macrotab ="