Code

Fixed Ogroup Copy & Paste for workstation startup
[gosa.git] / plugins / gofon / conference / class_phoneConferenceGeneric.inc
index 89f1d56da665935ac79c176b036f013de8f644e5..cd62cf5c5d54f99be6d58a4c6289d588dc2bbedd 100644 (file)
@@ -1,22 +1,22 @@
 <?php
 /*
-  This code is part of GOsa (https://gosa.gonicus.de)
-  Copyright (C) 2003  Cajus Pollmeier
+   This code is part of GOsa (https://gosa.gonicus.de)
+   Copyright (C) 2003  Cajus Pollmeier
 
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
 
 class conference extends plugin
 {
@@ -26,7 +26,6 @@ class conference extends plugin
   var $base                              = "";
   var $ou                                              = "";
   var $goFonPIN                                = "";
-  var $acl = "";
   var $old_cn         = "";
 
   var $goFonConferenceOption           = "";
@@ -40,6 +39,8 @@ class conference extends plugin
 
   var $goFonConferenceOwner    = "";
 
+  var $error_shown = false;
+
   var $goFonConferenceOptionFormat             = "";
   var $goFonConferenceOptionLifetime   = "";
   var $telephoneNumber                 = "";
@@ -53,16 +54,18 @@ class conference extends plugin
   var $last_dep_sorting= "invalid";
   var $departments= array();
 
+  var $dialog ;
+
   /* attribute list for save action */
   var $attributes= array("cn","base", "description", "goFonPIN","goFonConferenceOption_P","goFonConferenceOption_r",
-                                                "goFonConferenceOption_M","goFonConferenceOption_s","goFonConferenceOption_i","goFonConferenceOption_c",
-                                                "goFonConferenceOption_D","goFonConferenceOptionFormat","goFonConferenceOptionLifetime","telephoneNumber","goFonConferenceOwner");
+      "goFonConferenceOption_M","goFonConferenceOption_s","goFonConferenceOption_i","goFonConferenceOption_c",
+      "goFonConferenceOption_D","goFonConferenceOptionFormat","goFonConferenceOptionLifetime","telephoneNumber","goFonConferenceOwner");
 
   var $objectclasses= array("top", "goFonConference");
 
-  function conference ($config, $dn)
+  function conference ($config, $dn, $plugin= NULL)
   {
-    plugin::plugin($config, $dn);
+    plugin::plugin($config, $dn, $plugin);
     $this->is_account  = TRUE;
     $this->ui                  = get_userinfo();
     $this->dn                  = $dn;
@@ -72,8 +75,8 @@ class conference extends plugin
     /* Set base */
     if ($this->dn == "new"){
       $ui= get_userinfo();
-      if(isset($_SESSION['conferencefilter']['depselect'])){
-        $this->base = $_SESSION['conferencefilter']['depselect'];
+      if(isset($_SESSION['CurrentMainBase'])){
+        $this->base = $_SESSION['CurrentMainBase'];
       }else{
         $this->base= dn2base($ui->dn);
       }
@@ -81,9 +84,10 @@ class conference extends plugin
       $this->base= preg_replace ("/^[^,]+,/", "", $this->dn);
     }
 
-   $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
-   $this->acl= get_module_permission($acl, "goFonConference", $this->dn);
-   $this->goFonConferenceOwner=$this->ui->dn;
+    $ui= get_userinfo();
+    $acl= get_permissions ($ui->dn, $this->ui->subtreeACL);
+    $this->acl= get_module_permission($acl, "conference", $ui->dn);
+    $this->goFonConferenceOwner=$this->ui->dn;
 
     /* Parse Options ... 
      * Parameter|Lifetime|number
@@ -109,50 +113,74 @@ class conference extends plugin
 
   function execute()
   {
-  $acl= get_permissions ($this->dn, $this->ui->subtreeACL);
-  $this->acl= get_module_permission($acl, "goFonConference", $this->dn);
-
-       $this->config->departments    = get_departments($this->dn);
-       $this->config->make_idepartments();
-       $smarty= get_smarty();
-
-  $smarty->assign("bases" ,array_flip($this->config->departments));
-  $smarty->assign("base"  ,$this->base);
-
-       $smarty->assign("goFonConferenceOptions",                   array("D"=>"Conference ","d"=>"Conference without PIN"));
-       $smarty->assign("goFonConferenceOptionFormats", array("WAV"=>"Wave","GSM"=>"GSM","WAV49"=>"Wave49"));
-       $smarty->assign("goFonConferenceOption",        $this->goFonConferenceOption_D);
-       
-       foreach ($this->attributes as $val){
-               $smarty->assign("$val", $this->$val);
-               $smarty->assign("$val"."ACL", chkacl($this->acl, "$val"));
-               if(!$this->$val){
-                       $smarty->assign($val."CHK", "");
-               }else{
-                       $smarty->assign($val."CHK", " checked ");
-               }
-       }
-
-  if($_SESSION['js']==1){
-    if($this->goFonConferenceOption_P != "P"){
-      $smarty->assign("goFonPINACL"," disabled ");
-      $smarty->assign("goFonPIN","");
+    /* Call parent execute */
+    plugin::execute();
+
+    $smarty= get_smarty();
+
+    $smarty->assign("bases" ,$this->config->idepartments);
+    $smarty->assign("base"  ,$this->base);
+
+    $once = true; 
+    foreach($_POST as $name => $value){
+      if(preg_match("/^chooseBase/",$name) && $once){
+        $once = false;
+        $this->dialog = new baseSelectDialog($this->config);
+        $this->dialog->setCurrentBase($this->base);
+      }
+    }
+
+    /* Dialog handling */
+    if(is_object($this->dialog)){
+      /* Must be called before save_object */
+      $this->dialog->save_object();
+
+      if($this->dialog->isClosed()){
+        $this->dialog = false;
+      }elseif($this->dialog->isSelected()){
+        $this->base = $this->dialog->isSelected();
+        $this->dialog= false;
+      }else{
+        return($this->dialog->execute());
+      }
+    }
+
+    $smarty->assign("goFonConferenceOptions",              array("D"=>"Conference ","d"=>"Conference without PIN"));
+    $smarty->assign("goFonConferenceOptionFormats",    array("WAV"=>"Wave","GSM"=>"GSM","WAV49"=>"Wave49"));
+    $smarty->assign("goFonConferenceOption",        $this->goFonConferenceOption_D);
+
+    foreach ($this->attributes as $val){
+      $smarty->assign("$val", $this->$val);
+      $smarty->assign("$val"."ACL", chkacl($this->acl, "$val"));
+      if(!$this->$val){
+        $smarty->assign($val."CHK", "");
+      }else{
+        $smarty->assign($val."CHK", " checked ");
+      }
     }
-    if($this->goFonConferenceOption_r != "r"){
-      $smarty->assign("goFonConferenceOptionFormatACL"," disabled ");
+
+    if($_SESSION['js']==1){
+      if($this->goFonConferenceOption_P != "P"){
+        $smarty->assign("goFonPINACL"," disabled ");
+        $smarty->assign("goFonPIN","");
+      }
+      if($this->goFonConferenceOption_r != "r"){
+        $smarty->assign("goFonConferenceOptionFormatACL"," disabled ");
+      }
     }
-  }
-       return($smarty->fetch (get_template_path('generic.tpl', TRUE)));
+    return($smarty->fetch (get_template_path('generic.tpl', TRUE)));
   }
 
   function remove_from_parent()
   {
-       $ldap= $this->config->get_ldap_link();
-       $ldap->cd ($this->dn);
-       $ldap->recursive_remove();
+    $this->SQL_remove_me(true); 
 
-       /* Optionally execute a command after we're done */
-       $this->handle_post_events('remove');
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd ($this->dn);
+    $ldap->recursive_remove();
+
+    /* Optionally execute a command after we're done */
+    $this->handle_post_events('remove');
   }
 
 
@@ -163,10 +191,10 @@ class conference extends plugin
     if(isset($_POST['cn'])){
       foreach(array("goFonConferenceOption_P","goFonConferenceOption_r","goFonConferenceOption_M","goFonConferenceOption_s",
             "goFonConferenceOption_i","goFonConferenceOption_c","goFonConferenceOption_D","goFonPIN") as $attrs){
-      if(isset($_POST[$attrs])){
-        $this->$attrs = $_POST[$attrs];
-      }else{
-        $this->$attrs = false;
+        if(isset($_POST[$attrs])){
+          $this->$attrs = $_POST[$attrs];
+        }else{
+          $this->$attrs = false;
         }
       }
     }
@@ -176,54 +204,70 @@ class conference extends plugin
   /* Check values */
   function check()
   {
-       $message= array();
-  if($this->is_number_used()){
-    $message[] =  $this->is_number_used();
-  }
+    /* Call common method to give check the hook */
+    $message= plugin::check();
 
-  if((!empty($this->goFonPIN)||($this->goFonConferenceOption_P=="P"))&&($this->goFonConferenceOption_D=="d")){
-    $message[] =_("You have specified a conference 'without PIN' ... please leave the PIN fields empty.");
-  }
+    if($this->is_number_used()){
+      $message[] =  $this->is_number_used();
+    }
 
-  if((empty($this->goFonPIN))&&($this->goFonConferenceOption_P=="P")&&($this->goFonConferenceOption_D=="D")){
-    $message[]= _("Please enter a PIN.");
-  }
-  if(empty($this->cn)){
-    $message[] =_("Please enter a name for the conference.");
-  }
-  
-  if(!is_numeric($this->telephoneNumber)){
-    $message[] =_("Only numeric chars are allowed in Number field.");
-  }
+    if((!empty($this->goFonPIN)||($this->goFonConferenceOption_P=="P"))&&($this->goFonConferenceOption_D=="d")){
+      $message[] =_("You have specified a conference 'without PIN' ... please leave the PIN fields empty.");
+    }
 
-  if(!is_numeric($this->goFonConferenceOptionLifetime)){
-    $message[] =_("Only numbers are allowed in Lifetime.");
-  }
-  $this->SQL_remove_me(false);
-  $this->SQL_add_me(false);
-  if(!empty($this->generate_error)){
-    $message[]=$this->generate_error;
-    $this->generate_error="";
-  }
+    if((empty($this->goFonPIN))&&($this->goFonConferenceOption_P=="P")&&($this->goFonConferenceOption_D=="D")){
+      $message[]= _("Please enter a PIN.");
+    }
+
+    if(empty($this->cn)){
+      $message[] =_("Please enter a name for the conference.");
+    }
+
+    if(!is_numeric($this->telephoneNumber)){
+      $message[] =_("Only numeric chars are allowed in Number field.");
+    }
+
+    if(!((is_numeric($this->goFonConferenceOptionLifetime))||(empty($this->goFonConferenceOptionLifetime)))){
+      $message[] =_("Only numbers are allowed in Lifetime.");
+    }
+
+    $this->SQL_remove_me(false);
+    $this->SQL_add_me(false);
 
-       return $message;
+    if(!empty($this->generate_error)){
+      $message[]=$this->generate_error;
+      $this->generate_error="";
+    }
+
+    return $message;
   }
 
 
   function SQL_add_me($save){
+
+    if(!isset($_SESSION['config']->data['SERVERS']['FON'])){
+      $this->generate_error = _("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database.");
+      return(false);
+    }
+  
     // Get Configuration for Mysql database Server
     $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
 
     // Connect to DB server
-    $r_con =  @mysql_connect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+    $r_con = false;    
+
+    if(!is_callable("mysql_pconnect")){
+      if(!$this->error_shown){
+        print_red(_("Can't save any changes to asterisk database, there is currently no mysql extension available in your php setup."));
+        $this->error_shown = true;
+      }
+      return(true);
+    }
+    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
 
     // Check if we are  connected correctly
     if(!$r_con){
-      $this->generate_error = sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+      $this->generate_error = sprintf(_("The MySQL server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
           $a_SETUP['SERVER'],$a_SETUP['LOGIN']);
       gosa_log(mysql_error());
       return false;
@@ -238,9 +282,9 @@ class conference extends plugin
       gosa_log(mysql_error());
       return false;
     }
-   
+
     if((!empty($this->telephoneNumber))&&($save==true)){
-      
+
       $EXT=array();
 
       $parameter  ="";
@@ -261,13 +305,13 @@ class conference extends plugin
 
       if($this->goFonConferenceOption_r == "r"){
 
-      // Recordingformat for conference
-      $EXT[$i]['exten']   =$this->telephoneNumber;
-      $EXT[$i]['context'] =$context;
-      $EXT[$i]['priority']= $i;
-      $EXT[$i]['app']     ="Setvar";
-      $EXT[$i]['appdata'] ="MEETME_RECORDINGFORMAT=".$this->goFonConferenceOptionFormat;
-      $i++;      
+        // Recordingformat for conference
+        $EXT[$i]['exten']   =$this->telephoneNumber;
+        $EXT[$i]['context'] =$context;
+        $EXT[$i]['priority']= $i;
+        $EXT[$i]['app']     ="Setvar";
+        $EXT[$i]['appdata'] ="MEETME_RECORDINGFORMAT=".$this->goFonConferenceOptionFormat;
+        $i++;      
 
       }
 
@@ -284,7 +328,7 @@ class conference extends plugin
       $EXT[$i]['context'] =$context;
       $EXT[$i]['priority']=$i;
       $EXT[$i]['app']     ="MeetMe";
-      
+
       if(empty($this->goFonPIN)) {
         $EXT[$i]['appdata'] =$this->telephoneNumber."|".$parameter;
       }else{
@@ -299,10 +343,10 @@ class conference extends plugin
       $EXT[$i]['app']     ="Goto";
       $EXT[$i]['appdata'] =$this->telephoneNumber."|1";
       $SQL=array();
-    
+
       foreach($EXT as $keytop => $valtop){
-      $s_keys = "";
-      $s_values = ""; 
+        $s_keys = "";
+        $s_values = ""; 
         foreach($valtop as $key=>$val){
           $s_keys   .="`".$key."`,";
           $s_values .="'".$val."',";
@@ -315,20 +359,27 @@ class conference extends plugin
         mysql_query($sqlsyn);
       }
     } 
-    
 
 
+    @mysql_close($r_con);
     return(true);
   }
 
   function SQL_remove_me($save){
+    if(!is_callable("mysql_pconnect")){
+      if(!$this->error_shown){
+        print_red(_("Can't save any changes to asterisk database, there is currently no mysql extension available in your php setup."));
+        $this->error_shown = true;
+      }
+      return(true);
+    }
 
     if($this->old_tele_number){
       // Get Configuration for Mysql database Server
       $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'];
 
       // Connect to DB server
-      $r_con =  @mysql_connect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+      $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
 
       // Check if we are  connected correctly
       if(!$r_con){
@@ -348,15 +399,18 @@ class conference extends plugin
         return false;
       }
 
-      $SQL = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE   (exten= '".$this->old_tele_number."') 
-                                                        OR  (exten='".$this->telephoneNumber."') 
-                                                        OR  (exten='".$this->cn."')";
-      
+      $SQL = "DELETE FROM ".$a_SETUP['EXT_TABLE']." 
+      WHERE   (exten='".$this->old_tele_number."') 
+        OR    (exten='".$this->telephoneNumber."') 
+        OR    (exten='".$this->cn."')  
+        OR    (exten='".$this->old_cn."')";
+
       if($save){
         @mysql_query($SQL);
       } 
 
     }//ENDE  old num availiable ...
+    @mysql_close($r_con);
     return(true);
   }
 
@@ -394,50 +448,68 @@ class conference extends plugin
   /* Save to LDAP */
   function save()
   {
-       plugin::save();
 
-  $this->SQL_remove_me(true);
-  $this->SQL_add_me(true);
+    if((!isset($this->attrs['goFonPIN']))){
+      $pin_use = false;
+    }else{
+      $pin_use = true;
+    }
 
-  if(empty($this->goFonConferenceOption_P)){
-    $this->attrs['goFonPIN']=array();
-  }
-  $this->attrs['goFonConferenceOption']="";
-  foreach(array("goFonConferenceOption_P","goFonConferenceOption_r","goFonConferenceOption_M","goFonConferenceOption_s",
-            "goFonConferenceOption_i","goFonConferenceOption_c","goFonConferenceOption_D","goFonConferenceOptionFormat") as $attrs){
-    $this->attrs['goFonConferenceOption'] .= $this->$attrs;
-    unset($this->attrs[$attrs]);         
-  }
+    plugin::save();
+
+    if(empty($this->old_tele_number)){
+      $this->old_tele_number= $this->telephoneNumber;
+    }
+
+    $this->SQL_remove_me(true);
+    $this->SQL_add_me(true);
+
+    if(empty($this->goFonConferenceOption_P)){
+      if($pin_use){
+        $this->attrs['goFonPIN']=array();
+      }else{
+        unset($this->attrs['goFonPIN']);
+      }
+    }
+    $this->attrs['goFonConferenceOption']="";
+    foreach(array("goFonConferenceOption_P","goFonConferenceOption_r","goFonConferenceOption_M","goFonConferenceOption_s",
+          "goFonConferenceOption_i","goFonConferenceOption_c","goFonConferenceOption_D","goFonConferenceOptionFormat") as $attrs){
+      $this->attrs['goFonConferenceOption'] .= $this->$attrs;
+      unset($this->attrs[$attrs]);         
+    }
 
-  $this->attrs['goFonConferenceOption'].="|".$this->goFonConferenceOptionLifetime;
-  unset($this->attrs['goFonConferenceOptionLifetime']);
+    $this->attrs['goFonConferenceOption'].="|".$this->goFonConferenceOptionLifetime;
+    unset($this->attrs['goFonConferenceOptionLifetime']);
 
-  /* Write back to ldap */
+    /* Write back to ldap */
 
-  unset($this->attrs['base']);
+    unset($this->attrs['base']);
 
-  foreach($this->attributes as $atr){
-    if(chkacl($this->acl, $atr)!=""){
-      unset($this->attrs[$atr]);
+    foreach($this->attributes as $atr){
+      if(chkacl($this->acl, $atr)!=""){
+        unset($this->attrs[$atr]);
+      }
     }
-  }
 
-       $ldap= $this->config->get_ldap_link();
-
-       $ldap->cat($this->dn);
-       $a= $ldap->fetch();
-       $ldap->cd($this->dn);
-       if (count($a)){
-               $ldap->modify($this->attrs);
-               $this->handle_post_events('modify');
-       } else {
-               $ldap->add($this->attrs);
-               $this->handle_post_events('add');
-       }
-       show_ldap_error($ldap->get_error());
-
-       /* Optionally execute a command after we're done */
-       $this->postcreate();
+    $ldap= $this->config->get_ldap_link();
+    $ldap->cd($this->config->current['BASE']);
+    $ldap->cat($this->dn, array('dn'));
+
+    if ($ldap->count()){
+      $ldap->cd($this->dn);
+      $this->cleanup();
+      $ldap->modify ($this->attrs); 
+      $this->handle_post_events('modify');
+    } else {
+      $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn));
+      $ldap->cd($this->dn);
+      $ldap->add($this->attrs);
+      $this->handle_post_events('add');
+    }
+    show_ldap_error($ldap->get_error(), _("Saving phone conference failed"));
+
+    /* Optionally execute a command after we're done */
+    $this->postcreate();
   }
 
 }