diff --git a/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc b/gosa-plugins/gofon/gofon/phoneaccount/class_phoneAccount.inc
index e6a15e66cb4af6a155d5d202ed170b3d8009fcb8..cdde338d23707dc1633d2ef41693645db15bd4ef 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";
/* 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 $voice_context = "default";
+
/* 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)
{
}
}
- /* Set up has_mailAccount */
- if (isset($this->attrs['objectClass'])){
- if (in_array("gosaMailAccount", $this->attrs['objectClass'])){
- $this->has_mailAccount= TRUE;
- }
+ /* Set parent object to tab object */
+ if(is_object($parent)){
+ $this->parent = $parent->parent;
}
- /* 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;
+ /* 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];
}
- 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->attrs['pager'][0])){
+ $this->pager = $this->attrs['pager'][0];
+ }
+
+ /* 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)){
+ $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("phoneou")),
+ $this->config->current['BASE'],array("cn","description"), GL_SUBSEARCH);
foreach($tmp as $attrs){
$cn= $attrs['cn'][0];
$description= "";
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);
+ $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("macroou")),
+ $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("/^".normalizePreg($attrs['dn'])."/",$this->goFonMacro)){
+ continue;
+ }
+
/* unset Count, we don't need that here */
unset($attrs['displayName']['count']);
* 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']))){
+ 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){
$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."'";
+ $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."'";
+
- $vp = mysql_fetch_row(mysql_query($query_tmp));
+ $res = mysql_query($query_tmp);
+ $vp = mysql_fetch_assoc($res);
+
@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'];
}
}
}
$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){
$newnums[]= preg_replace("/[^0-9]/","",$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();
$r_res = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
$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){
$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;
$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, "Database query");
+ $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");
if(mysql_affected_rows($new_connection)){
/**********************
* Update Voice mail entry
**********************/
+
$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";
+ $voice_data_array['context'] = $this->voice_context;
/* There is currently no voice mail entry for this user.
* We should create one
/* Remove old entries */
$query = array();
$query[]= "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."\";";
}
$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 */
/* Do we represent a valid account? */
if (!$this->is_account && $this->parent === NULL){
- $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <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>".
+ $display= "<img alt=\"\" src=\"images/small-error.png\" align=\"middle\"> <b>".
msgPool::noValidExtension(_("Phone"))."</b>";
$display.= back_to_main();
return($display);
$smarty->assign("macros",$this->macros);
$smarty->assign("macro", $this->macro);
+ /* Assign contexts */
+ $smarty->assign("contexts",$this->get_asterisk_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"), msgPool::noserver(_("GOfon")), WARNING_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(array("goFonVoiceMailContext","goFonContext") as $attr){
+ if(in_array($attr,$this->multi_boxes)){
+ $smarty->assign("use_".$attr,TRUE);
+ }else{
+ $smarty->assign("use_".$attr,FALSE);
+ }
+ }
+
/* Show main page */
$this->lastmacro = $this->macro;
$smarty->assign("multiple_support",$this->multiple_support_active);
/* 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(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;
}
}
}
}
- 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("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
$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
$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'];
+ }
+
+ $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";
}
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;
}
}
}
}
return($ret);
}
+
+
+ /* Return asterisk contexts
+ * Additionaly read contexts from file.
+ */
+ function get_asterisk_contexts()
+ {
+ $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);
+ }
+ }
+ array_unique($contexts);
+ return($contexts);
+ }
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: