diff --git a/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc b/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc
index 54048a4f6cbc8c1fe01bceee530292d7100e1f86..b4f4dede09b12f06af36c6ecc8284ccfe41e9470 100644 (file)
var $plDescription= "This does something";
var $plIcon = "plugins/gofon/images/phoneAccount.png";
+ var $delimiter = "|";
+
/* Attributes */
var $telephoneNumber = array();
var $goFonHardware = "automatic";
var $goFonHomeServers = array(); // Contains all available server configurations
var $context = "default";
+ var $sip_contexts = array();
var $voice_context = "default";
+ var $voicemail_contexts = array();
/* attribute list for save action */
var $CopyPasteVars = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
{
plugin::plugin ($config, $dn, $parent);
+ $this->delimiter = $config->get_cfg_value("asteriskParameterDelimiter","|");
+
/* Assemble phone numbers */
if (isset($this->attrs['telephoneNumber'])){
for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
}
}
+ $this->sip_contexts = $this->get_asterisk_sip_contexts();
+ $this->voicemail_contexts = $this->get_asterisk_voicemail_contexts();
+
/* Set parent object to tab object */
if(is_object($parent)){
$this->parent = $parent->parent;
/* 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 = explode("!",$attrs['goFonMacroParameter'][$pkey]);
+
+ $string = $data[3];
+ $string=preg_replace("/%uid/i",$this->uid,$string);
+ $string=preg_replace("/%pager/i",$this->pager,$string);
+ $string=preg_replace("/%context/i",$this->context,$string);
+ $string=preg_replace("/%voicemailcontext/i",$this->voice_context,$string);
+
+ if(isset($this->cn)){
+ $string=preg_replace("/%cn/i",$this->cn,$string);
+ }
- 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
+
+ $tmp = array();
+ foreach($this->phoneNumbers as $phonenum){
+ $tmp[] = $phonenum;
+ }
+
+ 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);
+ }
+ $data[3] = $string;
+
+
+ /* 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
}//while
* If we have a macro selected, parse it and set values
* in $this->macroarray[$this->macro].
*/
- $tmp = split("!",$this->goFonMacro);
+ $tmp = explode("!",$this->goFonMacro);
if(is_array($tmp)){
/* First value is the macroname */
foreach($tmp as $var){
/* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
- $varar = split("#",$var);
+ $varar = explode("#",$var);
/* Only insert if the parameter still exists */
if(isset($this->macroarray[$this->macro][$varar[0]])){
$this->a_old_telenums = $this->phoneNumbers;
- /* Check table definitions
- */
- if(!phoneAccount::checkRealtimeTables($cur_cfg)){
- msg_dialog::display(_("Warning"),
- sprintf(_("GOsa identified problems with your MySQL table definition, please activate debugging for details.")),
- WARNING_DIALOG);
- }
-
/* 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
+
+
+ $num = key($this->phoneNumbers);
+
if( (is_callable("mysql_pconnect"))&&
(isset($cur_cfg))&&
(isset($cur_cfg['SERVER']))&&
$r_con = @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
if($r_con){
+
+ // Try to select the gophone database
$r_db = @mysql_select_db($cur_cfg['DB'],$r_con);
-
+ if(!$r_db){
+ msg_dialog::display(_("Warning"), msgPool::dbselect($cur_cfg['DB'],mysql_error()), WARNING_DIALOG);
+ }
+
$query_tmp = "SELECT ".$cur_cfg['VOICE_TABLE'].".context as 'v_context',
".$cur_cfg['SIP_TABLE'].".context,
".$cur_cfg['VOICE_TABLE'].".password
FROM ".$cur_cfg['VOICE_TABLE'].",
".$cur_cfg['SIP_TABLE']."
- WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'";
-
-
+ WHERE ".$cur_cfg['VOICE_TABLE'].".mailbox = ".$num."
+ AND ".$cur_cfg['SIP_TABLE'].".name='".$this->uid."'";
$res = mysql_query($query_tmp);
$vp = mysql_fetch_assoc($res);
if(!isset($vp['context'])){
$this->is_modified= TRUE;
- msg_dialog::display(_("Warning"), sprintf(_("Could not identify telephone extension in database, please try to save again. Activate debugging if error remains.")), WARNING_DIALOG);
+ msg_dialog::display(_("Warning"), sprintf(_("Cannot identify telephone extension in database, please try to save again.")), WARNING_DIALOG);
}
@DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
return($ret);
}
+ function stripInvalidChars($tele){
+ /* Strip invalid chars, but maintain a leading + for international numbers */
+ $t_tele= preg_replace("/[^0-9]/","",$tele);
+ if (preg_match('/^\+/', $tele)) {
+ $t_tele= "+".$t_tele;
+ }
+ return($t_tele);
+ }
+
+
+
/* This function generates the Database entries.
* The Parameter 'save' could be true or false.
$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 ..)
+ $s_type = "friend"; // Entry for phone type (friend , peer ..)
+ // Set the default to the default of the db
$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
/* Prepare some basic attributes */
$oldnums = array();
+
foreach($this->a_old_telenums as $tele){
- $oldnums[]= preg_replace("/[^0-9]/","",$tele);
+ $oldnums[]= $this->stripInvalidChars($tele);
}
foreach($this->phoneNumbers as $tele){
- $newnums[]= preg_replace("/[^0-9]/","",$tele);
+ $newnums[]= $this->stripInvalidChars($tele);
}
if(empty($this->uid)) trigger_error("Uid is empty.");
/* Get phonehardware to setup sip entry */
$ldap = $this->config->get_ldap_link();
+ $ldap->cd ($this->config->current['BASE']);
$r_res = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
$a_ldap_attrs = $ldap->fetch();
* If there is an old entry, get callerid and remove voicemail and extensions
*/
if($old_connection){
+
+ /* Check table definitions
+ */
+ if(!phoneAccount::checkRealtimeTables($a_Remove)){
+ msg_dialog::display(_("Warning"),
+ sprintf(_("GOsa identified problems with your MySQL table definition!")),
+ WARNING_DIALOG);
+ }
+
$query = "SELECT id,name,callerid FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
$rid = mysql_query($query,$old_connection);
@DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query,
* Update / Insert sip_users entry
**********************/
+ /* Check table definitions
+ */
+ if(!phoneAccount::checkRealtimeTables($a_New)){
+ msg_dialog::display(_("Warning"),
+ sprintf(_("GOsa identified problems with your MySQL table definition!")),
+ WARNING_DIALOG);
+ }
+
+
/* Set the first given phone number as callerid */
reset($newnums);
$i_new_key = key($newnums);
$sip_data_array['callerid'] =$newnums[$i_new_key];
- $sip_data_array['mailbox'] =$newnums[$i_new_key];
+ $sip_data_array['mailbox'] =$newnums[$i_new_key]."@".$this->voice_context;
/* Check if there is already an entry in sip_users for this uid */
$SQL_query_array = array();
$sip_data_array['host'] = $s_host;
$sip_data_array['insecure'] = NULL;
$sip_data_array['language'] = NULL;
- $sip_data_array['mailbox'] = $newnums[$i_new_key];
+ $sip_data_array['mailbox'] = $newnums[$i_new_key]."@".$this->voice_context;
$sip_data_array['md5secret'] = NULL;
$sip_data_array['nat'] = "no";
$sip_data_array['permit'] = 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 .= $val['choosen'].$this->delimiter;
}
- $s_parameter = preg_replace("/\|$/","",$s_parameter);
+ $s_parameter = rtrim($s_parameter, $this->delimiter);
}
$i = 0;
$EXT[$i]['exten'] = $this->uid;
$EXT[$i]['priority']= 1;
$EXT[$i]['app'] = "Goto";
- $EXT[$i]['appdata'] = $newnums[$i_new_key]."|1";
+ $EXT[$i]['appdata'] = $newnums[$i_new_key].$this->delimiter."1";
$i ++;
}
$macroname = preg_replace("/,.*$/","",$this->macro);
$macroname = preg_replace("/^.*=/","",$macroname);
$s_app = "Macro";$macroname;
- $s_par = $macroname."|".$s_parameter;
+ $s_par = $macroname.$this->delimiter.$s_parameter;
}else{
$s_app = "Dial";
- $s_par = 'SIP/'.$this->uid."|20|r";
+ $s_par = 'SIP/'.$this->uid.$this->delimiter."20".$this->delimiter."r";
}
$EXT[$i]['context'] = 'GOsa';
if(empty($this->macro)&&(!empty($this->goFonMacro))){
/* Go through already saved values, for a parameter */
- $tmp = split("!",$this->goFonMacro);
+ $tmp = explode("!",$this->goFonMacro);
/* it is possible that nothing has been saved yet */
if(is_array($tmp)){
foreach($tmp as $var){
/* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
- $varar = split("#",$var);
+ $varar = explode("#",$var);
/* Only insert if the parameter still exists */
if(isset($this->macroarray[$this->macro][$varar[0]])){
$smarty->assign("macro", $this->macro);
/* Assign contexts */
- $smarty->assign("contexts",$this->get_asterisk_contexts());
+ $smarty->assign("voicemail_contexts",$this->voicemail_contexts);
+ $smarty->assign("sip_contexts",$this->sip_contexts);
$smarty->assign("context" ,$this->context);
$smarty->assign("voice_context" ,$this->voice_context);
$string = $paras['default'];
$string=preg_replace("/%uid/i",$this->uid,$string);
+ $string=preg_replace("/%pager/i",$this->pager,$string);
+ $string=preg_replace("/%context/i",$this->context,$string);
+ $string=preg_replace("/%voicemailcontext/i",$this->voice_context,$string);
if(isset($this->cn)){
$string=preg_replace("/%cn/i",$this->cn,$string);
case "combo":
$str= "<select name='".$var."' ".$dis." >";
- foreach(split(":",$default) as $choice){
+ foreach(explode(":",$default) as $choice){
if($choosen==$choice){
$str.= "\n<option value='".$choice."' selected>".$choice." </option>";
}else{
/* Add phone number */
if (isset($_POST["add_phonenumber"]) && $_POST['phonenumber']){
- if (tests::is_phone_nr($_POST['phonenumber'])){
+
+ if(strlen(trim($_POST["phonenumber"])) > 20 ){
+ msg_dialog::display(_("Error"), msgPool::toobig("Phone number"), ERROR_DIALOG);
+ }elseif (tests::is_phone_nr($_POST['phonenumber'])){
$number= trim($_POST["phonenumber"]);
$this->phoneNumbers[$number]= $number;
$this->is_modified= TRUE;
foreach($this->attributes as $attr){
- if(in_array($attr,$this->multi_boxes)){
+ if(in_array_strict($attr,$this->multi_boxes)){
$smarty->assign("use_".$attr,TRUE);
}else{
$smarty->assign("use_".$attr,FALSE);
}
foreach(array("goFonVoiceMailContext","goFonContext") as $attr){
- if(in_array($attr,$this->multi_boxes)){
+ if(in_array_strict($attr,$this->multi_boxes)){
$smarty->assign("use_".$attr,TRUE);
}else{
$smarty->assign("use_".$attr,FALSE);
}
if ($this->initially_was_account != $this->is_account || $this->is_modified){
- $str = $this->generate_mysql_entension_entries(true);
+ $str = $this->generate_mysql_entension_entries(false);
if(empty($str)){
msg_dialog::display(_("Error"), $str, ERROR_DIALOG);
}
$message[]= msgPool::required("Phone number");
}
+ /* Do not allow to save duplicate phone numbers
+ * this may destroy the extensions table.
+ */
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+ $numberFilter = "";
+ foreach($this->phoneNumbers as $number){
+ $numberFilter .= "(telephoneNumber={$number})";
+ }
+ $ldap->search("(&(!(uid=".$this->uid."))(objectClass=goFonAccount)(|{$numberFilter}))",array("dn","telephoneNumber"));
+ $res = array();
+ while($attrs = $ldap->fetch()){
+ unset($attrs['telephoneNumber']['count']);
+ $res = array_merge($res,array_intersect($attrs['telephoneNumber'], $this->phoneNumbers));
+ }
+ $res = array_unique($res);
+ if(count($res)){
+ $message[] = msgPool::duplicated(_("Phone number"))." <br>".
+ implode(array_intersect($res, $this->phoneNumbers), ", ");
+ }
+
/* check for ! in any parameter setting*/
if(isset($this->macroarray[$this->macro])){
foreach($this->macroarray[$this->macro] as $val){
*/
$str = $this->generate_mysql_entension_entries(true);
if(!$str){
- msg_dialog::display(_("Error"),_("An error occured while updating the database entries, activate debugging for details.") , ERROR_DIALOG);
+ msg_dialog::display(_("Error"),_("An error occured while updating the database entries!") , ERROR_DIALOG);
}
if($this->attrs['goFonMacro']==""){
plugin::adapt_from_template($dn, $skip);
/* Assemble phone numbers */
- if (isset($this->attrs['telephoneNumber']) && !in_array("telephoneNumber", $skip)){
+ if (isset($this->attrs['telephoneNumber']) && !in_array_strict("telephoneNumber", $skip)){
for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
$number= $this->attrs['telephoneNumber'][$i];
$this->phoneNumbers[$number]= $number;
$a_SETUP = $this->goFonHomeServers[$this->init_HomeServer];
$s_parameter ="";
+ /* Check table definitions
+ */
+ if(!phoneAccount::checkRealtimeTables($a_SETUP)){
+ msg_dialog::display(_("Warning"),
+ sprintf(_("GOsa identified problems with your MySQL table definition!")),
+ WARNING_DIALOG);
+ }
+
// Connect to DB server
$r_con = @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
/* Let changes get active, everything was fine;
*/
- mysql_query("commit;",$old_connection);
+ mysql_query("commit;",$r_con);
@DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>commit;</b>", "");
@DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Transaction sucessful!---</b>", "");
$ldap->cd($this->config->current['BASE']);
$ldap->search("(&(objectClass=goFonQueue)(member=*))", array("member"));
while($attr = $ldap->fetch()){
- if(in_array($this->dn,$attr['member'])){
+ if(in_array_strict($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]);
{
$message = plugin::multiple_check();
- if(!count($this->goFonHomeServers) && in_array("goFonHomeServers",$this->multi_boxes)){
+ if(!count($this->goFonHomeServers) && in_array_strict("goFonHomeServers",$this->multi_boxes)){
$message[] = _("There is currently no asterisk server defined!");
}
- if(empty($this->goFonHomeServer) && in_array("goFonHomeServers",$this->multi_boxes)){
+ if(empty($this->goFonHomeServer) && in_array_strict("goFonHomeServers",$this->multi_boxes)){
$message[] = _("Asterisk server is invalid!");
}
- if(in_array("goFonVoicemailPIN",$this->multi_boxes) &&
+ if(in_array_strict("goFonVoicemailPIN",$this->multi_boxes) &&
( (strlen($this->goFonVoicemailPIN)==0)||
(strlen($this->goFonVoicemailPIN)>4))){
$message[]=(_("Voicemail PIN must be 4 characters long!"));
}else{
- if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN) && in_array("goFonVoicemailPIN",$this->multi_boxes) ){
+ if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN) && in_array_strict("goFonVoicemailPIN",$this->multi_boxes) ){
$message[]=(_("Voicemail PIN contains invalid characters!"));
}
}
- if(preg_match("/[^0-9a-z]/i",$this->goFonPIN) && in_array("goFonPIN",$this->multi_boxes)){
+ if(preg_match("/[^0-9a-z]/i",$this->goFonPIN) && in_array_strict("goFonPIN",$this->multi_boxes)){
$message[]=(_("Phone pin contains invalid characters!"));
}
/* check for ! in any parameter setting*/
- if(isset($this->macroarray[$this->macro]) && in_array("macro",$this->multi_boxes)){
+ if(isset($this->macroarray[$this->macro]) && in_array_strict("macro",$this->multi_boxes)){
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']);
function get_multi_edit_values()
{
$ret = plugin::get_multi_edit_values();
- if(in_array("macro",$this->multi_boxes)){
+ if(in_array_strict("macro",$this->multi_boxes)){
$ret['macro'] = $this->macro;
$ret['macroarray'] = $this->macroarray;
$ret['macros'] = $this->macros;
/* Return asterisk contexts
* Additionaly read contexts from file.
*/
- function get_asterisk_contexts()
+ function get_asterisk_voicemail_contexts()
+ {
+ return($this->get_asterisk_contexts(CONFIG_DIR."/asterisk/voicemail_context.conf"));
+ }
+ function get_asterisk_sip_contexts()
+ {
+ return($this->get_asterisk_contexts(CONFIG_DIR."/asterisk/sip_context.conf"));
+ }
+ function get_asterisk_contexts($file)
{
$contexts = array();
- $contexts[] = "default";
- $contexts[] = "parkedcalls";
- $contexts[] = "from-sip";
- $contexts[] = "from-capi";
- $file = "/etc/gosa/asterisk_contexts.conf";
if(file_exists($file) && is_readable($file)){
foreach(file($file) as $context){
$contexts[] = trim($context);
}
+ }else{
+ msg_dialog::display(_("Warning"), msgPool::cannotReadFile($file),WARNING_DIALOG);
+ $contexts[] = "default";
}
array_unique($contexts);
return($contexts);