Code

Added branches container for old stuff
[gosa.git] / gosa-plugins / gofon / gofon / phoneaccount / class_phoneAccount.inc
index e665c36c0a7b7808b5c0c8c8c6ab24ad1450a2ef..cdde338d23707dc1633d2ef41693645db15bd4ef 100644 (file)
@@ -3,9 +3,9 @@
 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();
@@ -32,19 +32,24 @@ class phoneAccount extends plugin
   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)
   {
@@ -58,22 +63,40 @@ class phoneAccount extends plugin
       }
     }
 
-    /* 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 parent object to tab object */
-    $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];
+    }
+    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)){
+      $this->cn   =&$this->parent->by_object['user']->cn;
     }
-    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']->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 
@@ -137,7 +160,7 @@ class phoneAccount extends plugin
      * Search for all available phone hardware  
      */
     $tmp = get_sub_list("(objectClass=goFonHardware)","phone",array(get_ou("phoneou")),
-                  $this->config->current['BASE'],array("cn","description"), GL_NO_ACL_CHECK);
+                  $this->config->current['BASE'],array("cn","description"), GL_SUBSEARCH);
     foreach($tmp as $attrs){
       $cn= $attrs['cn'][0];
       $description= "";
@@ -164,7 +187,7 @@ class phoneAccount extends plugin
         get_ou("phoneou"));
 
     $tmp = get_sub_list("(goFonHardware=*)","phone",$deps_a,$this->config->current['BASE'],
-        array('cn','dn','goFonHardware'),GL_NO_ACL_CHECK);
+        array('cn','dn','goFonHardware'),GL_SUBSEARCH);
     foreach($tmp as $attrs){
       $cn = $attrs['goFonHardware'][0];
       if(isset($this->hardware_list[$cn])){
@@ -174,11 +197,11 @@ class phoneAccount extends plugin
 
 
     /* 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))","gofonmacro",array(get_ou("macroou")),
-                  $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn","cn"), GL_NONE);
+                  $this->config->current['BASE'],array("displayName","goFonMacroParameter","dn","cn"), GL_NO_ACL_CHECK | GL_SUBSEARCH );
     
 
     /* Add none for no macro*/
@@ -188,6 +211,16 @@ class phoneAccount extends plugin
     /* 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']);
 
@@ -279,11 +312,17 @@ class phoneAccount extends plugin
       if($r_con){
         $r_db  =  @mysql_select_db($cur_cfg['DB'],$r_con);
   
-        $query_tmp = "SELECT ".$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."'";
+        $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."'";
+
 
         $res = mysql_query($query_tmp);
         $vp  = mysql_fetch_assoc($res);
+  
         @DEBUG (DEBUG_MYSQL, __LINE__, __FUNCTION__, __FILE__,$query_tmp, "Database query");
         if((isset($vp['password']))&&(!empty($vp['password']))){
           $this->goFonPINVoice = $vp['password'];
@@ -291,6 +330,9 @@ class phoneAccount extends plugin
         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'];
+        }
       }
     }
     $this->lastmacro=$this->macro;
@@ -365,8 +407,6 @@ class phoneAccount extends plugin
 
     $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){
@@ -376,13 +416,9 @@ class phoneAccount extends plugin
       $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))){
@@ -391,11 +427,11 @@ class phoneAccount extends plugin
       $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('*'));
@@ -632,20 +668,31 @@ class phoneAccount extends plugin
 
       $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)){
@@ -653,6 +700,7 @@ class phoneAccount extends plugin
         /********************** 
          * Update Voice mail entry  
          **********************/
+
         $result = mysql_fetch_assoc($rid)  ;
 
         foreach($voice_data_array as $name => $value){
@@ -661,14 +709,14 @@ class phoneAccount extends plugin
           }
         }
 
-        /* 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{
@@ -676,7 +724,7 @@ class phoneAccount extends plugin
         /********************** 
          * 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 
@@ -822,6 +870,7 @@ class phoneAccount extends plugin
 
     $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 */
@@ -918,7 +967,7 @@ class phoneAccount extends plugin
     /* Assign contexts */
     $smarty->assign("contexts",$this->get_asterisk_contexts());
     $smarty->assign("context" ,$this->context);
-    $smarty->assign("goFonContextACL", $this->getacl("context"));
+    $smarty->assign("voice_context" ,$this->voice_context);
 
     /* check if there is a FON server created */
     if(!count($this->goFonHomeServer)){
@@ -1042,7 +1091,7 @@ class phoneAccount extends plugin
     /* 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 */
@@ -1103,6 +1152,14 @@ class phoneAccount extends plugin
       }
     }
 
+    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);
@@ -1132,6 +1189,7 @@ class phoneAccount extends plugin
 
       /* Every macro in the select box are available */
       if((isset($_POST['macro']))){
+        $this->macro = $_POST['macro'];
         $this->macrostillavailable=true;
       }
 
@@ -1147,6 +1205,14 @@ class phoneAccount extends plugin
         $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; 
@@ -1159,9 +1225,11 @@ class phoneAccount extends plugin
       /* 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']])){
@@ -1181,9 +1249,13 @@ class phoneAccount extends plugin
                 }
               }
             }
+            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;
           }
         }
       }
@@ -1338,12 +1410,6 @@ class phoneAccount extends plugin
   {
     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
@@ -1372,14 +1438,6 @@ class phoneAccount extends plugin
 
       $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
@@ -1390,7 +1448,17 @@ class phoneAccount extends plugin
         $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";
 
@@ -1470,8 +1538,6 @@ class phoneAccount extends plugin
     }
 
     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]);
@@ -1535,17 +1601,19 @@ class phoneAccount extends plugin
           "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"))
           ));
@@ -1596,6 +1664,7 @@ class phoneAccount extends plugin
       }
 
       if(isset($_POST['macro']) && $_POST['macro'] != $this->macro){
+        $this->macro = $_POST['macro'];
         $this->is_modified =true;
       }
 
@@ -1617,7 +1686,7 @@ class phoneAccount extends plugin
           }
         }
         if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
-          $this->modified = TRUE;
+          $this->is_modified = TRUE;
         }
       }
     }