diff --git a/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc b/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc
index 7a4fb12918fef7cc7d02a78289ce75ec67142ff2..b4f4dede09b12f06af36c6ecc8284ccfe41e9470 100644 (file)
class phoneAccount extends plugin
{
/* Definitions */
- var $plHeadline= "Phone";
+ var $plHeadline = "Phone";
var $plDescription= "This does something";
- var $has_mailAccount= FALSE;
+ var $plIcon = "plugins/gofon/images/phoneAccount.png";
+
+ var $delimiter = "|";
/* Attributes */
var $telephoneNumber = array();
var $init_HomeServer = "0"; // Contains the dn of the server that manage this account
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- */,
"hardware_list","used_hardware");
- var $attributes = array("goFonDeliveryMode", "goFonFormat","cn","goFonHomeServer",
+ var $attributes = array("goFonDeliveryMode", "goFonFormat","goFonHomeServer",
"goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
var $objectclasses= array("goFonAccount");
var $uid;
+ var $cn;
var $view_logged = FALSE;
var $multiple_support = TRUE;
+ var $mailAddress = "";
+ var $has_mailAccount = FALSE;
+ var $pager = "";
function phoneAccount (&$config, $dn= NULL, $parent= NULL)
{
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++){
}
}
- /* Set up has_mailAccount */
- if (isset($this->attrs['objectClass'])){
- if (in_array("gosaMailAccount", $this->attrs['objectClass'])){
- $this->has_mailAccount= TRUE;
- }
+ $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;
+ }
+
+ /* Get current uid and cn
+ */
+ if(isset($this->attrs['uid'][0])){
+ $this->uid = $this->attrs['uid'][0];
+ }
+ if(isset($this->attrs['cn'][0])){
+ $this->cn = $this->attrs['cn'][0];
+ }
+ if(isset($this->attrs['mail'][0])){
+ $this->mailAddress = $this->attrs['mail'][0];
+ $this->has_mailAccount = true;
+ }
+ if(isset($this->attrs['pager'][0])){
+ $this->pager = $this->attrs['pager'][0];
}
- /* Set uid */
- if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
- $this->uid = $this->parent->by_object['user']->uid;
+ /* If there is a parent object present, use references
+ */
+ if(isset($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->parent->by_object['user']->cn)){
+ $this->cn =&$this->parent->by_object['user']->cn;
+ }
+ if(isset($this->parent->by_object['user']->pager)){
+ $this->pager =&$this->parent->by_object['user']->pager;
+ }
+ if(isset($this->parent->by_object['mailAccount']->mail)){
+ $this->mailAddress = &$this->parent->by_object['mailAccount']->mail;
+ $this->has_mailAccount = &$this->parent->by_object['mailAccount']->is_account;
}
/* Check server configurations
/* Get available phone hardware
* Search for all available phone hardware
*/
- $tmp = get_sub_list("(objectClass=goFonHardware)","",array(get_ou("phoneou")),
- $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
+ $tmp = get_sub_list("(objectClass=goFonHardware)","phone",array(get_ou("phoneRDN")),
+ $this->config->current['BASE'],array("cn","description"), GL_SUBSEARCH);
foreach($tmp as $attrs){
$cn= $attrs['cn'][0];
$description= "";
*/
$deps_a = array(
get_people_ou(),
- get_ou("ogroupou"),
- get_ou("serverou"),
- get_ou("terminalou"),
- get_ou("workstationou"),
- get_ou("printerou"),
- get_ou("componentou"),
- get_ou("phoneou"));
-
- $tmp = get_sub_list("(goFonHardware=*)","",$deps_a,$this->config->current['BASE'],
- array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
+ get_ou("ogroupRDN"),
+ get_ou("serverRDN"),
+ get_ou("terminalRDN"),
+ get_ou("workstationRDN"),
+ get_ou("printerRDN"),
+ get_ou("componentRDN"),
+ get_ou("phoneRDN"));
+
+ $tmp = get_sub_list("(goFonHardware=*)","phone",$deps_a,$this->config->current['BASE'],
+ array('cn','dn','goFonHardware'),GL_SUBSEARCH);
foreach($tmp as $attrs){
$cn = $attrs['goFonHardware'][0];
if(isset($this->hardware_list[$cn])){
/* Get available Macros
- * Search for all Marcos that are visible and create
+ * Search for all Macros that are visible and create
* an array with name and parameters
*/
- $tmp = get_sub_list("(&(objectClass=goFonMacro)(goFonMacroVisible=1))","",array(get_ou("macroou")),
- $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn"), GL_NONE);
+ $tmp = get_sub_list("(&(objectClass=goFonMacro)(goFonMacroVisible=1))","gofonmacro",array(get_ou("phoneMacroRDN")),
+ $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn","cn"), GL_NO_ACL_CHECK | GL_SUBSEARCH );
/* Add none for no macro*/
/* Fetch all Macros*/
foreach($tmp as $attrs){
+ $ui = get_userinfo();
+ $acl = $ui->get_permissions($attrs['dn'],"gofonmacro/macro","");
+
+ /* Skip all macros we are not able to read
+ execpt, the currently selected macro.
+ */
+ if(!preg_match("/r/",$acl) && !preg_match("/^".preg_quote($attrs['dn'], '/')."/",$this->goFonMacro)){
+ continue;
+ }
+
/* unset Count, we don't need that here */
unset($attrs['displayName']['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 = 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;
+
/* 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($cur_cfg))&&(isset($cur_cfg['SERVER']))&&(isset($cur_cfg['LOGIN']))&&(isset($cur_cfg['PASSWORD']))){
+
+
+ $num = key($this->phoneNumbers);
+
+ if( (is_callable("mysql_pconnect"))&&
+ (isset($cur_cfg))&&
+ (isset($cur_cfg['SERVER']))&&
+ (isset($cur_cfg['LOGIN']))&&
+ (isset($cur_cfg['PASSWORD']))){
+
$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);
-
- $query_tmp = "SELECT ".$cur_cfg['VOICE_TABLE'].".password FROM ".$cur_cfg['VOICE_TABLE'].", ".
- $cur_cfg['SIP_TABLE']." WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'";
+ if(!$r_db){
+ msg_dialog::display(_("Warning"), msgPool::dbselect($cur_cfg['DB'],mysql_error()), WARNING_DIALOG);
+ }
- $vp = mysql_fetch_row(mysql_query($query_tmp));
+ $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 ".$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(_("Cannot identify telephone extension in database, please try to save again.")), WARNING_DIALOG);
+ }
+
@DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
- if((isset($vp[0]))&&(!empty($vp[0]))){
- $this->goFonPINVoice = $vp[0];
+ if((isset($vp['password']))&&(!empty($vp['password']))){
+ $this->goFonPINVoice = $vp['password'];
+ }
+ if((isset($vp['context']))&&(!empty($vp['context']))){
+ $this->context = $vp['context'];
+ }
+ if((isset($vp['v_context']))&&(!empty($vp['v_context']))){
+ $this->voice_context = $vp['v_context'];
}
}
}
}
+ /* Transaction will only work with InnoDB tables
+ */
+ public static function checkRealtimeTables($config)
+ {
+ $ret =TRUE;
+
+ // Connect to DB server
+ if( (is_callable("mysql_pconnect"))&&
+ (isset($config))&&
+ (isset($config['SERVER']))&&
+ (isset($config['LOGIN']))&&
+ (isset($config['PASSWORD']))){
+
+ $r_con = @mysql_pconnect($config['SERVER'],$config['LOGIN'],$config['PASSWORD']);
+ if($r_con){
+ $r_db = @mysql_select_db($config['DB'],$r_con);
+
+ /* Validate Table Type - it must be InnoDB to be able to use transactions
+ */
+ $inno_tables = array("SIP_TABLE","EXT_TABLE","VOICE_TABLE","QUEUE_TABLE","QUEUE_MEMBER_TABLE");
+ foreach($inno_tables as $inno_table){
+ $sql = "show table status like '".$config[$inno_table]."';";
+ $res = mysql_query($sql);
+ $vp = mysql_fetch_assoc($res);
+ if(!preg_match("/^InnoDB$/i",$vp['Engine'])){
+
+ /* Not an InnoDB Table type, try to modify type.
+ */
+ $sql = "ALTER TABLE `".$config[$inno_table]."` ENGINE = INNODB; ";
+ $res = mysql_query($sql);
+ if(!$res){
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>".$sql."</b>",
+ "<b>FAILED!</b>. Transactions will not work!");
+ $ret = FALSE;
+ }else{
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>".$sql."</b>",
+ "<i>Table '".$config[$inno_table]."' is now of type InnoDB, this enables transactions.</i>");
+ }
+ }else{
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"",
+ "<i>Table type of '".$config[$inno_table]."' OK, using transactions!</i>");
+ }
+ }
+ }
+ }
+ 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.
* false - means only testing no database transactions.
*/
if(!count($this->goFonHomeServers)){
if($save){
- msg_dialog::display(_("Configuration error"), _("There is currently no asterisk server defined!"), WARNING_DIALOG);
+ msg_dialog::display(_("Configuration error"), msgPool::noserver(_("GOfon")), WARNING_DIALOG);
}
return(true);
}
/* Check if Mysql extension is available */
if(!is_callable("mysql_pconnect")){
if($save){
- msg_dialog::display(_("Configuration error"), sprintf(_("Missing %s PHP extension!"), "mysql"), WARNING_DIALOG);
+ msg_dialog::display(_("Configuration error"), msgPool::missingext("php-mysql"), WARNING_DIALOG);
}
return(true);
}
$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
$i_is_accounted = false; // Ensure that extension entry, for name to number is only once in table
- restore_error_handler();
-
/* 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 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(empty($this->uid)) trigger_error("Uid is empty.");
+
+
/* Create voicemail entry
*/
if((!isset($this->cn))||(empty($this->cn))){
$CNname= $this->cn;
}
- 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 = "";
+ $s_mail = "";
+ if($this->has_mailAccount){
+ $s_mail = $this->mailAddress;;
}
+
/* 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();
$a_New = $this->goFonHomeServers[$this->goFonHomeServer]; // DB Configuration
$new_connection = @mysql_pconnect($a_New['SERVER'],$a_New['LOGIN'],$a_New['PASSWORD']);
if(!$new_connection){
- $this->generate_error = sprintf(
- _("The MySQL Server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
- $a_New['SERVER'],$a_New['LOGIN']);
+ $this->generate_error = msgPool::dbconnect($a_New['SERVER'],@mysql_error($new_connection),
+ _("Abort saving entries to keep the database consistent."));
new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($new_connection));
return false;
}
$new_database = @mysql_select_db($a_New['DB'],$new_connection);
if(!$new_database){
- $this->generate_error = sprintf(
- _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
- $a_New['DB'],$a_New['SERVER']);
+ $this->generate_error = msgPool::dbselect($a_New['DB'],@mysql_error($new_connection),
+ _("Abort saving entries to keep the database consistent."));
new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($new_connection));
return false;
}
*/
$old_connection = @mysql_pconnect($a_Remove['SERVER'],$a_Remove['LOGIN'],$a_Remove['PASSWORD']);
if(!$old_connection){
- $this->generate_error = sprintf(
- _("The old MySQL home server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
- $a_Remove['SERVER'],$a_Remove['LOGIN']);
+ $this->generate_error = msgPool::dbconnect($a_Remove['SERVER'],@mysql_error($old_connection),
+ _("Abort saving entries to keep the database consistent."));
new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($old_connection));
return false;
}
$old_database = @mysql_select_db($a_Remove['DB'],$old_connection);
if(!$old_database){
- $this->generate_error = sprintf(
- _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
- $a_Remove['DB'],$a_Remove['SERVER']);
+ $this->generate_error = msgPool::dbselect($a_Remove['DB'],@mysql_error($old_connection),
+ _("Abort saving entries to keep the database consistent."));
new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error($old_connection));
return false;
}
}
+
/* Save means that we must save changes, not only test */
if($save == true){
* 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, "Database query");
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query,
+ "<i>Reguest callerid to be able to identify the user.</i>");
/* Old entry found, remove it */
$query_a = array();
if(mysql_affected_rows($old_connection)){
$result = mysql_fetch_assoc($rid);
+
+ /* Set mode to strict
+ Strict disallows the addition of entries that do not match the targets field length.
+ */
+ $query_a[]= "SET @@sql_mode = STRICT_ALL_TABLES;";
$query_a[]= "DELETE FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
$query_a[]= "DELETE FROM ".$a_Remove['VOICE_TABLE']." WHERE customer_id='".$result['callerid']."';";
$query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$this->uid."';";
$query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$s_telenums."';";
}
- foreach($query_a as $qry){
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$qry, "Database query");
- if(!mysql_query($qry,$old_connection)){
- trigger_error(mysql_error($old_connection));
+ /* Start transaction, to be able to rollback
+ */
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Removing entry from old server---</b>","");
+
+ mysql_query("begin;",$old_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>begin;</b>","<i>Starting transaction!</i>");
+
+ foreach($query_a as $query){
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>".$query."</b>", "");
+ if(!mysql_query($query,$old_connection)){
+ $err = mysql_error($old_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"\n".$err, "<b>FAILED</b>");
+ msg_dialog::display(_("Error"),
+ msgPool::mysqlerror($err,__CLASS__)." ".
+ "\n<p>"._("Please activate debugging for details!")."</p>",
+ ERROR_DIALOG);
+
+ mysql_query("rollback;",$old_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>rollback;</b>", "<b>ERROR</b> Rollback transaction!");
+ @mysql_close($old_connection);
+ return(false);
}
}
+
+ /* Let changes get active, everything was fine;
+ */
+ mysql_query("commit;",$old_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>commit;</b>", "");
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Transaction sucessful!---</b>", "");
}
}
+
/**********************
* 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();
+
+ /* Enforce strict mode, ensures inout validation, e.g. target field length
+ */
+ $SQL_query_array[] = "SET @@sql_mode = STRICT_ALL_TABLES;";
+
$query = "SELECT * FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';\n";
$rid = mysql_query($query,$new_connection);
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Receive current mysql entries.");
if(mysql_affected_rows($new_connection)){
/**********************
$sip_data_array['type'] = $s_type ;
$sip_data_array['username'] = $this->uid;
$sip_data_array['ipaddr'] = $s_ip;
+ $sip_data_array['context'] = $this->context;
/* Remove not changed attributes, to avoid updating table with same values */
foreach($sip_data_array as $name => $value){
$SQL_query_array[] = $query;
}
} else {
-
+
/**********************
* Insert sip_users entry
**********************/
//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['canreinvite'] = "no";
- $sip_data_array['context'] = "default";
+ $sip_data_array['context'] = $this->context;
$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'] = $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;
**********************/
$customer_id = $newnums[$i_new_key];
+ $query = "SELECT id,name,callerid FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';";
+ $rid = mysql_query($query,$new_connection);
+
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Receive callerid");
+ $result = mysql_fetch_assoc($rid);
+
+ $old_customer_id = "";
+ if($result){
+ $old_customer_id = $result['callerid'];
+ }
$voice_data_array = array(
"customer_id" => $customer_id,
"mailbox" => $customer_id,
"password" => $this->goFonVoicemailPIN,
"fullname" => $CNname,
+ "context" => $this->voice_context,
"email" => $s_mail);
- /* Set pager number if available */
- if(isset($this->parent->by_object['user']->pager)){
- $voice_data_array['pager'] = $this->parent->by_object['user']->pager;
- }
+ $voice_data_array['pager'] = $this->pager;
/* Check if there is already an entry in sip_users for this uid */
- $query_tmp = "SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$customer_id."';\n";
+ $query_tmp = "SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$old_customer_id."';\n";
$rid = mysql_query($query_tmp,$new_connection);
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
+
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Check if voicemail entry exists");
if(mysql_affected_rows($new_connection)){
/**********************
* Update Voice mail entry
**********************/
+
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"", "<i>Voicemail entry exists, adding updating to queue.</i>");
$result = mysql_fetch_assoc($rid) ;
foreach($voice_data_array as $name => $value){
}
}
- /* Only update entry if there is something to uopdate */
+ /* Only update entry if there is something to update */
if(count($voice_data_array)){
$query = "UPDATE ".$a_New['VOICE_TABLE']." SET ";
foreach($voice_data_array as $key => $val){
$query.= "".$key."='".$val."',";
}
$query = preg_replace("/,$/","",$query);
- $query.= " WHERE customer_id='".$customer_id."';";
+ $query.= " WHERE customer_id='".$old_customer_id."';";
$SQL_query_array[] = $query;
}
}else{
/**********************
* Insert Voice mail entry
**********************/
- $voice_data_array['context'] = "default";
-
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"", "<i>No voicemail entry found, add 'create' to queue.</i>");
+ $voice_data_array['context'] = $this->voice_context;
+
/* There is currently no voice mail entry for this user.
* We should create one
*/
$SQL_query_array[] ="INSERT INTO ".$a_New['VOICE_TABLE']." (".$s_voi_keys.") VALUES (".$s_voi_values.");";
}
-
+
/**********************
* Remove/Insert extension entries
**********************/
-
- /* Remove old entries */
- $query = array();
- $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
+
+ /* Initiate transaction
+ */
+ $SQL_query_array[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
+ $oldnums= array();
foreach($oldnums as $s_telenums){
- $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
+ $SQL_query_array[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
}
foreach($newnums as $s_telenums){
- $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
- }
- foreach($query as $qry){
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$qry, "Database query");
- if(!mysql_query($qry,$new_connection)){
- trigger_error(mysql_error($new_connection));
- }
+ $SQL_query_array[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
}
-
+
/**********************
* Insert extension entries
**********************/
-
+
// 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 = array();
if(!is_numeric($this->uid)){
$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 ++;
}
/* Hint Entry */
$EXT[$i]['context'] = 'GOsa';
$EXT[$i]['exten'] = $s_telenums;
- $EXT[$i]['priority']= "Hint";
+ $EXT[$i]['priority']= 0;
$EXT[$i]['app'] = 'SIP/'.$this->uid;
$i ++;
/* SetCID */
$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';
$SQL_syn ="";
}
- // Perform queries ...
- if($this->goFonHardware != "automatic"){
- foreach($SQL_query_array as $query){
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
- if(!@mysql_query($query,$new_connection)){
- msg_dialog::display(_("Error"), sprintf(_("Cannot query %s database!"), "GOfon"), ERROR_DIALOG);
- return false;
- }
- }
+ /* Start transaction, to be able to rollback
+ */
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Insert/Update new entry---</b>","");
+
+ mysql_query("begin;",$new_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>begin;</b>","<i>Starting transaction!</i>");
+
+ foreach($SQL_query_array as $query){
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>".$query."</b>", "");
+ if(!mysql_query($query,$new_connection)){
+ $err = mysql_error($new_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"\n".$err, "<b>FAILED</b>");
+ msg_dialog::display(_("Error"),
+ msgPool::mysqlerror($err,__CLASS__)." ".
+ "\n<p>"._("Please activate debugging for details!")."</p>",
+ ERROR_DIALOG);
+
+ mysql_query("rollback;",$new_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>rollback;</b>", "<b>ERROR</b> Rollback transaction!");
+ @mysql_close($new_connection);
+ return(false);
+ }
}
+
+ /* Let changes get active, everything was fine;
+ */
+ mysql_query("commit;",$new_connection);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>commit;</b>", "Perform transaction!");
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Transaction sucessful!---</b>", "");
}
@mysql_close($new_connection);
return true;
$display = "";
$SkipWrite = (!isset($this->parent) || !$this->parent) && !session::is_set('edit');
+
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]])){
/* Do we represent a valid account? */
if (!$this->is_account && $this->parent === NULL){
- $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
- _("This account has no phone extensions.")."</b>";
+ $display= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\"> <b>".
+ msgPool::noValidExtension(_("Phone"))."</b>";
$display.= back_to_main();
return ($display);
}
/* Do we represent a valid account? */
if (!$this->is_account && $this->parent === NULL){
- $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
- _("This account has no phone extensions.")."</b>";
+ $display= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\"> <b>".
+ msgPool::noValidExtension(_("Phone"))."</b>";
$display.= back_to_main();
return($display);
}
if (!$this->multiple_support_active && $this->parent !== NULL){
if ($this->is_account){
$display= $this->show_disable_header(_("Remove phone account"),
- _("This account has phone features enabled. You can disable them by clicking below."));
+ msgPool::featuresEnabled(_("Phone")));
} else {
if(empty($this->uid)){
$display= $this->show_enable_header(_("Create phone account"),
- _("This account has phone features disabled. You can't enable them while no uid is set."),TRUE,TRUE);
+ msgPool::featuresDisabled(_("Phone"),_("User uid")));
}else{
$display= $this->show_enable_header(_("Create phone account"),
- _("This account has phone features disabled. You can enable them by clicking below."));
+ msgPool::featuresDisabled(_("Phone")));
}
return ($display);
}
$smarty->assign("macros",$this->macros);
$smarty->assign("macro", $this->macro);
+ /* Assign 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);
+
/* check if there is a FON server created */
if(!count($this->goFonHomeServer)){
- msg_dialog::display(_("Configuration error"), _("There is currently no asterisk server defined!"), WARNING_DIALOG);
+ msg_dialog::display(_("Configuration error"), msgPool::noserver(_("GOfon")), WARNING_DIALOG);
}
/* Create html parameter table for selected macro parameters
$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'])){
- $number= $_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;
} else {
- msg_dialog::display(_("Error"), _("Phone number is invalid!"), ERROR_DIALOG);
+ msg_dialog::display(_("Error"), msgPool::invalid("Phone number"), ERROR_DIALOG);
}
}
/* Assign acls */
$tmp = $this->plInfo();
foreach($tmp['plProvidedAcls'] as $name => $translation){
- $smarty->assign($name."ACL",$this->getacl($name));
+ $smarty->assign($name."ACL",$this->getacl($name,$SkipWrite));
}
/* Transfer ACL's */
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_strict($attr,$this->multi_boxes)){
$smarty->assign("use_".$attr,TRUE);
}else{
$smarty->assign("use_".$attr,FALSE);
/* Every macro in the select box are available */
if((isset($_POST['macro']))){
+ $this->macro = $_POST['macro'];
$this->macrostillavailable=true;
}
$this->is_modified =true;
}
+ /* Save context */
+ if(isset($_POST['context'])){
+ if($this->context != $_POST['context']){
+ $this->is_modified= TRUE;
+ }
+ $this->context= $_POST['context'];
+ }
+
+ /* Save voice context */
+ if(isset($_POST['voice_context'])){
+ if($this->voice_context != $_POST['voice_context']){
+ $this->is_modified= TRUE;
+ }
+ $this->voice_context= $_POST['voice_context'];
+ }
+
if(is_array($this->phoneNumbers)){
foreach($this->phoneNumbers as $telenumms) {
$nummsinorder[]=$telenumms;
/* get all Postvars */
if(isset($this->macroarray[$this->macro])){
- if($this->acl_is_writeable("goFonMarco",$SkipWrite)){
+
+ if($this->acl_is_writeable("goFonMacro",$SkipWrite)){
foreach($this->macroarray[$this->macro] as $key => $paras){
+ $old_macro_settings = $this->macroarray[$this->macro][$key];
$backup = $this->macroarray[$this->macro][$key];
if(isset($_POST[$paras['var']])){
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']];
+ $this->macroarray[$this->macro][$key]['choosen']=1;
}else{
- $this->macroarray[$this->macro][$key]['choosen']=false;
+ $this->macroarray[$this->macro][$key]['choosen']=0;
}
}
}
+ if(array_differs($old_macro_settings,$this->macroarray[$this->macro][$key])){
+ $this->is_modified = TRUE;
+ }
}
+
if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
- $this->modified = TRUE;
+ $this->is_modified = TRUE;
}
}
}
}
if(empty($this->goFonHomeServer)){
- $message[] = _("Please select a valid goFonHomeServer.");
+ $message[] = msgPool::invalid(_("Home server"));
}
if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
- $message[]=(_("Voicemail PIN must be between 1-4 characters."));
+ $message[]= msgPool::invalid(_("Voicemail PIN"),"","",_("Between 1-4 charactes"));
}else{
if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN)){
- $message[]=(_("The specified Voicemail PIN contains invalid characters, only numeric values are allowed here."));
+ $message[]= msgPool::invalid(_("Voicemail PIN"),preg_replace("/[0-9]/","X",$this->goFonVoicemailPIN),"/X/");
}
}
if(preg_match("/[^0-9a-z]/i",$this->goFonPIN)){
- $message[]=(_("The specified phone PIN contains invalid characters, only aphanumeric values are allowed here."));
+ $message[]= msgPool::invalid(_("Phone PIN"),preg_replace("/[0-9a-z]/i","X",$this->goFonPIN),"/X/");
}
if ($this->initially_was_account != $this->is_account || $this->is_modified){
- if(!$this->generate_mysql_entension_entries()){
- $message[] = $this->generate_error;
+ $str = $this->generate_mysql_entension_entries(false);
+ if(empty($str)){
+ msg_dialog::display(_("Error"), $str, ERROR_DIALOG);
}
}
/* We need at least one phone number */
if (count($this->phoneNumbers) == 0){
- $message[]= sprintf(_("You need to specify at least one phone number!"));
+ $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){
if((strstr($val['choosen'],"!"))||(strstr($val['choosen'],"#"))){
- $message[] = sprintf(_("The parameter %s contains invalid char. '!,#' is used as delimiter"),$val['name']);
+ $message[] = msgPool::invalid(sprintf(_("macro parameter %s"),$val['name']),$val['choosen'],"/[^\#]/");
}
}
}
$this->attrs['goFonForwarding']=array();
- if ($this->initially_was_account != $this->is_account || $this->is_modified){
- $str = $this->generate_mysql_entension_entries(true);
- if(empty($str)){
- msg_dialog::display(_("Error"), $str, ERROR_DIALOG);
- }
+ /*
+ */
+ $str = $this->generate_mysql_entension_entries(true);
+ if(!$str){
+ msg_dialog::display(_("Error"),_("An error occured while updating the database entries!") , ERROR_DIALOG);
}
if($this->attrs['goFonMacro']==""){
new log("create","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
}
- show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/phone account with dn '%s' failed."),$this->dn));
+ if (!$ldap->success()){
+ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class()));
+ }
/* Optionally execute a command after we're done */
}
- function adapt_from_template($dn)
+ function adapt_from_template($dn, $skip= array())
{
- plugin::adapt_from_template($dn);
+ plugin::adapt_from_template($dn, $skip);
/* Assemble phone numbers */
- if (isset($this->attrs['telephoneNumber'])){
+ 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;
{
if(!$this->initially_was_account) return;
- foreach($this->attributes as $key=>$val){
- if(in_array($val,array("uid","cn"))){
- unset($this->attributes[$key]);
- unset($this->$val);
- }
- }
if(count($this->goFonHomeServers) && !empty($this->init_HomeServer) && is_callable("mysql_pconnect")){
// Get Configuration for initial Mysql database Server
$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']);
// Check if we are connected correctly
if(!$r_con){
- msg_dialog::display(_("Error"), sprintf(_("Cannot connect to %s database!"), "GOfon"), ERROR_DIALOG);
+ msg_dialog::display(_("Error"), msgPool::dbconnect("GOfon",@mysql_error()), ERROR_DIALOG);
new log("debug","gofonreport/".get_class($this),"",array(),@mysql_error());
return false;
}
// Test if we have the database selected correctly
if(!$db){
- msg_dialog::display(_("Error"), sprintf(_("Cannot select %s database!"), "GOfon"), ERROR_DIALOG);
+ msg_dialog::display(_("Error"), msgPool::dbselect("GOfon", @mysql_error()), ERROR_DIALOG);
new log("debug","gofonreport/".get_class($this),"",array(),@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;
- }
+ $SQL[]= "SET @@sql_mode = STRICT_ALL_TABLES;";
$first_num = false;
// Delete old entries
$SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
}
- $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$first_num."';";
+
+ $query = "SELECT id,name,callerid FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';";
+ $rid = mysql_query($query,$r_con);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
+ $result = mysql_fetch_assoc($rid);
+ $callerid = $first_num;
+ if($result){
+ $callerid = $result['callerid'];
+ }
+
+ /* Set mode to strict
+ Strict disallows the addition of entries that do not match the targets field length.
+ */
+ $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$callerid."';";
$SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
$SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
+ /* Start transaction, to be able to rollback
+ */
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Removing entry from server---</b>","");
+
+ mysql_query("begin;",$r_con);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>begin;</b>","<i>Starting transaction!</i>");
+
foreach($SQL as $query){
- @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query, "Database query");
- if(!@mysql_query($query,$r_con)){
- msg_dialog::display(_("Error"), sprintf(_("Cannot query %s database!"), "GOfon"), ERROR_DIALOG);
- return false;
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>".$query."</b>", "");
+
+ if(!mysql_query($query,$r_con)){
+ $err = mysql_error($r_con);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"\n".$err, "<b>FAILED</b>");
+ msg_dialog::display(_("Error"),
+ msgPool::mysqlerror($err,__CLASS__)." ".
+ "\n<p>"._("Please activate debugging for details!")."</p>",
+ ERROR_DIALOG);
+
+ mysql_query("rollback;",$r_con);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>rollback;</b>", "<b>ERROR</b> Rollback transaction!");
+ @mysql_close($r_con);
+ return(false);
}
}
+
+ /* Let changes get active, everything was fine;
+ */
+ mysql_query("commit;",$r_con);
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>commit;</b>", "");
+ @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,"<b>---Transaction sucessful!---</b>", "");
+
}else{
- msg_dialog::display(_("Configuration error"), sprintf(_("Missing %s PHP extension!"), "mysql"), WARNING_DIALOG);
+ msg_dialog::display(_("Configuration error"), msgPool::missingext("php-mysql"), WARNING_DIALOG);
return false;
}
$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]);
$ldap->modify ($this->attrs);
new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
- show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/phone account with dn '%s' failed."),$this->dn));
+ if (!$ldap->success()){
+ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, get_class()));
+ }
/* Optionally execute a command after we're done */
@mysql_close($r_con);
}
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]);
"plSelfModify" => TRUE,
"plDepends" => array("user"),
"plPriority" => 7, // Position in tabs
- "plSection" => "personal", // This belongs to personal
- "plCategory" => array("gofonreport" => array("description" => _("GOfon reports"),
- "objectClass" => "")),
+ "plSection" => array("personal" => _("My account")),
+ "plCategory" => array("users"),
+
"plOptions" => array(),
"plProvidedAcls" => array(
"telephoneNumber" => _("Telephone number"),
- "goFonHomeServer" => _("Home server"),
"goFonMacro" => _("Macro settings"),
"goFonHardware" => _("Phone hardware"),
+ "goFonHomeServer" => _("Home server"),
+ "goFonContext" => _("Phone context"),
+ "goFonVoiceMailContext" => _("Voice mail context"),
"goFonPIN" => _("Telephone pin"),
"goFonVoicemailPIN" => _("Voicemail pin"))
));
}
if(isset($_POST['macro']) && $_POST['macro'] != $this->macro){
+ $this->macro = $_POST['macro'];
$this->is_modified =true;
}
}
}
if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
- $this->modified = TRUE;
+ $this->is_modified = TRUE;
}
}
}
{
$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($ret);
}
+
+
+ /* Return asterisk contexts
+ * Additionaly read contexts from file.
+ */
+ 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();
+ 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);
+ }
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: