Code

Implemented new acls methods
[gosa.git] / plugins / personal / environment / class_environment.inc
index f5357a4d6988975a9aeb8a862f1cef974ef0d148..547b6dd32721b738ca4307ce70b8bbf4f7e465b4 100644 (file)
@@ -26,11 +26,11 @@ class environment extends plugin
   var $gotoProfileServer  = "";     // Specifies the selected profile server
   var $gotoProfileServers = array();// Specifies all available and selectable servers
   var $gotoProfileFlags   = "";     // Flags enabled  ? only used to set ACL and save 
-  var $gotoProfileFlag_C  = "";     // Flag is set to C if we have the profile caching fucntion enabled 
+  var $gotoProfileFlagC  = "";     // Flag is set to C if we have the profile caching fucntion enabled 
   
   var $gotoXResolution    = "auto";     // The selected resolution eg: 1024x768
   var $gotoXResolutions   = array();// Contains all available resolutions for this account
-  var $gotoProfileFlag_L  = "";     // Flag is set to L to enable runtime resolution change 
+  var $gotoProfileFlagL  = "";     // Flag is set to L to enable runtime resolution change 
   var $gotoProfileQuota   = "";     // User Quota Settings
 
   /* Logon script section*/
@@ -61,7 +61,7 @@ class environment extends plugin
   /* general settings */
   // Sets the attributes which will kept on page reload, which will be saved, ...
 
-  var $CopyPasteVars      = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlag_L","gotoXResolutions","gotoProfileFlag_C","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn");
+  var $CopyPasteVars      = array("gotoHotplugDevices","newKioskProfiles","gotoAvailableShares","gotoShareSelections","gotoPrinterSel","gotoProfileFlagL","gotoXResolutions","gotoProfileFlagC","gotoProfileServers","useProfile","is_group","in_dialog","OrigCn");
 
   var $attributes         = array("uid","gotoProfileServer","gotoProfileFlags",
                                     "gotoXResolution","gotoProfileQuota",
@@ -162,7 +162,14 @@ class environment extends plugin
         $tmp = split("\|",$share);
         $tmp2['server']      =$tmp[0];
         $tmp2['name']        =$tmp[1];
-        $tmp2['mountPoint']  =$tmp[2];
+        
+        /* Decode base64 if needed */
+        if (!preg_match('%/%', $tmp[2])){
+          $tmp2['mountPoint']  =base64_decode($tmp[2]);
+        } else {
+          $tmp2['mountPoint']  =$tmp[2];
+        }
+
         if(isset($tmp[3])){
           $tmp2['PwdHash']  =$tmp[3];
         }else{
@@ -179,11 +186,11 @@ class environment extends plugin
 
     for($i = 0 ; $i < strlen($this->gotoProfileFlags) ; $i ++){
       $chr = $this->gotoProfileFlags[$i];
-      $name = "gotoProfileFlag_".$chr;
+      $name = "gotoProfileFlag".$chr;
       $this->$name=$chr;
     }
 
-    if((!empty($this->gotoProfileServer))||($this->gotoProfileFlag_C=="C")){
+    if((!empty($this->gotoProfileServer))||($this->gotoProfileFlagC=="C")){
       $this->useProfile = true;
     }else{
       $this->useProfile = false;
@@ -250,12 +257,7 @@ class environment extends plugin
     }
 
     /* Prepare ACL settings*/
-    if(chkacl($this->acl,$s_attr)=="") {
-      $smarty->assign($s_attr."ACL","");
-    }else{
-      $smarty->assign($s_attr."ACL"," disabled ");
-    }
-
+    $smarty->assign($s_attr."ACL",$this->getacl($s_attr));
   }
 
   /* Is accout enabled | are we editing from usermenu or admin menu 
@@ -294,7 +296,7 @@ class environment extends plugin
 
       /* Group Dialog with enabled environment options */
       if ($this->is_account){
-        $display= $this->show_header(_("Remove environment extension"),
+        $display= $this->show_enable_header(_("Remove environment extension"),
             _("Environment extension enabled. You can disable it by clicking below."));
       } else {
   
@@ -304,12 +306,12 @@ class environment extends plugin
        */
         if((isset($this->parent->by_object['group']))||(isset($this->attrs['objectClass']))&&((in_array("posixAccount",$this->attrs['objectClass'])))){
           // 4. There is a PosixAccount
-          $display= $this->show_header(_("Add environment extension"),
+          $display= $this->show_enable_header(_("Add environment extension"),
               _("Environment extension disabled. You can enable it by clicking below."));
           return $display;
         }else{
           // 4. There is no PosixAccount
-          $display= $this->show_header(_("Add environment extension"),
+          $display= $this->show_enable_header(_("Add environment extension"),
               _("Environment extension disabled. You have to setup a posix account before you can enable this feature."));
           return $display;
         }
@@ -331,18 +333,18 @@ class environment extends plugin
 
         // 3. Account enabled . Editing from adminmenu
         if ($this->is_account){
-          $display= $this->show_header(_("Remove environment extension"),
+          $display= $this->show_disable_header(_("Remove environment extension"),
               _("Environment extension enabled. You can disable it by clicking below."));
         } else {
 
           if($this->parent->by_object['posixAccount']->is_account==true){
             // 4. There is a PosixAccount
-            $display= $this->show_header(_("Add environment extension"),
+            $display= $this->show_disable_header(_("Add environment extension"),
                 _("Environment extension disabled. You can enable it by clicking below."));
             return $display;
           }else{
             // 4. There is a PosixAccount
-            $display= $this->show_header(_("Add environment extension"),
+            $display= $this->show_disable_header(_("Add environment extension"),
                 _("Environment extension disabled. You have to setup a posix account before you can enable this feature."),TRUE,TRUE);
             return $display;
           }
@@ -366,42 +368,25 @@ class environment extends plugin
       }
     
       /* Prepare ACL settings*/
-      if(chkacl($this->acl,$s_attr)=="") {
-        $smarty->assign($s_attr."ACL","");
-      }else{
-        $smarty->assign($s_attr."ACL"," disabled ");
-      }
+      $smarty->assign($s_attr."ACL",$this->getacl($s_attr));
  
     }
 
-    foreach(array("gotoHotplugDevice","gotoPrinterSel") as $s_attr){
-      if(chkacl($this->acl,$s_attr)=="") {
-        $smarty->assign($s_attr."ACL","");
-      }else{
-        $smarty->assign($s_attr."ACL"," disabled ");
-      }
+    foreach(array("gotoHotplugDevice","gotoProfileFlagC","gotoProfileFlagL") as $s_attr){
+      $smarty->assign($s_attr."ACL",$this->getacl($s_attr));
     }
 
     if(empty($this->useProfile)){
-      $smarty->assign("gotoProfileACL","disabled");
       $smarty->assign("useProfileCHK","");
+      $smarty->assign("gotoProfileServerACL" , preg_replace("/w/","",$this->getacl("gotoProfileServer")));
+      $smarty->assign("gotoProfileQuotaACL" , preg_replace("/w/","",$this->getacl("gotoProfileQuota")));
+      $smarty->assign("gotoProfileFlagCACL" , preg_replace("/w/","",$this->getacl("gotoProfileFlagC")));
     }else{
-      $smarty->assign("gotoProfileACL","");
       $smarty->assign("useProfileCHK"," checked ");
     }
-
-    $smarty->assign("useProfileACL","");
-    if($this->acl != "#none#"){
-      $smarty->assign("useProfileACL","");
-      $smarty->assign("gotoProfileFlag_CACL"," ");
-      $smarty->assign("gotoProfileQuotaACL"," ");
-    }else{
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("useProfileACL","disabled");
-      $smarty->assign("gotoProfileServer"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
-    }
+   
+     
+    $smarty->assign("gotoProfileACL", $this->getacl("gotoProfileServer").$this->getacl("gotoProfileQuota"));
 
     /* HANDLE Profile Settings here 
      * Assign available Quota and resolution settings
@@ -410,16 +395,16 @@ class environment extends plugin
      * Assign this all to Smarty 
      */
 
-    if(empty($this->gotoProfileFlag_L)){
-      $smarty->assign("gotoProfileFlag_LCHK"," ");
+    if(empty($this->gotoProfileFlagL)){
+      $smarty->assign("gotoProfileFlagLCHK"," ");
     }else{
-      $smarty->assign("gotoProfileFlag_LCHK"," checked ");
+      $smarty->assign("gotoProfileFlagLCHK"," checked ");
     }
 
-    if(empty($this->gotoProfileFlag_C)){
-      $smarty->assign("gotoProfileFlag_CCHK"," ");
+    if(empty($this->gotoProfileFlagC)){
+      $smarty->assign("gotoProfileFlagCCHK"," ");
     }else{
-      $smarty->assign("gotoProfileFlag_CCHK"," checked ");
+      $smarty->assign("gotoProfileFlagCCHK"," checked ");
     }
 
 
@@ -782,19 +767,6 @@ class environment extends plugin
       }
       return($disp);
     }
-    if($this->acl != "#none#"){
-      $smarty->assign("useProfileACL","");
-    }else{
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("gotoProfileServerACL"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
-    }
-
-    if(!$this->useProfile){
-      $smarty->assign("gotoProfileFlag_CACL"," disabled ");
-      $smarty->assign("gotoProfileServerACL"," disabled ");
-      $smarty->assign("gotoProfileQuotaACL"," disabled ");
-    }
 
     /* Als smarty vars are set. Get smarty template and generate output */
     $display.= $smarty->fetch(get_template_path('environment.tpl', TRUE,dirname(__FILE__)));
@@ -848,15 +820,15 @@ class environment extends plugin
       }else{
         $this->useProfile = false;
       }
-      if(isset($_POST['gotoProfileFlag_C'])){
-        $this->gotoProfileFlag_C = $_POST['gotoProfileFlag_C'];
+      if(isset($_POST['gotoProfileFlagC'])){
+        $this->gotoProfileFlagC = $_POST['gotoProfileFlagC'];
       }else{
-        $this->gotoProfileFlag_C = false;
+        $this->gotoProfileFlagC = false;
       }
-      if(isset($_POST['gotoProfileFlag_L'])){
-        $this->gotoProfileFlag_L = $_POST['gotoProfileFlag_L'];
+      if(isset($_POST['gotoProfileFlagL'])){
+        $this->gotoProfileFlagL = $_POST['gotoProfileFlagL'];
       }else{
-        $this->gotoProfileFlag_L = false;
+        $this->gotoProfileFlagL = false;
       }
 
       $tmp= $this->gosaDefaultPrinter;
@@ -944,169 +916,55 @@ class environment extends plugin
       }
     }
 
+    /* 1. Search all printers that have our uid/cn as member 
+     * 2. Delete this uid/cn from every single entry and save it again.
+     * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix
+     * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal 
+     */
+    $types = array( "gotoUserPrinter"       => "AddUser",
+                    "gotoGroupPrinter"      => "AddGroup",
+                    "gotoUserAdminPrinter"  => "AddAdminUser",
+                    "gotoGroupAdminPrinter" => "AddAdminGroup");
 
-    /* Save usersettings to Printer */
-
-    if(chkacl($this->acl,"gotoPrinter")!=""){
-      $this->gotoPrinter = array();
-    }  
-    
     if($this->is_group){
       $s_suffix = "Group";
+      $useVar   = "cn";
     }else{
+      $useVar   = "uid";
       $s_suffix = "User";
     }
-  
 
-    /* 1. Search all printers that have our uid/cn as member 
-     * 2. Delete this uid/cn from every single entry and save it again.
-     * 2.1 There are different types of members: Users / Groups, this will be defined in $suffix
-     * 2.2 And each type has two modes, Admin (e.g. 'gotoUserAdminPrinter') and Normal 
-     */
-    $ldap->search("(&(objectClass=gotoPrinter)(|(goto".$s_suffix."Printer=".$this->uid.")(goto".$s_suffix."AdminPrinter=".$this->uid.")))",array("*"));
+    /* Remove old entries */
+    $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."Printer=".$this->uid."))",array("*"));
     while($attr = $ldap->fetch()){
-
-      /* Walk trough all printers and check if our user id used, if so remove it.
-       * Later we will insert our uid at the right place.
-       */
-
-      /* Remove normal entries (User)*/
-      if(isset($attr['goto'.$s_suffix.'Printer'])) {
-        unset($attr['goto'.$s_suffix.'Printer']['count']);
-        foreach($attr['goto'.$s_suffix.'Printer'] as $key => $user){
-          if($this->uid==$user){
-            unset($attr['goto'.$s_suffix.'Printer'][$key]);
-          }
-        }
-        $tmp = array();
-        foreach($attr['goto'.$s_suffix.'Printer'] as $user){
-          $tmp[] = $user;
-        }
-        $attr['goto'.$s_suffix.'Printer'] = array();  
-        $attr['goto'.$s_suffix.'Printer'] = $tmp;
-      }
-
-      /* Remove administrational entries (Admin)*/
-      if(isset($attr['goto'.$s_suffix.'AdminPrinter'])){
-        unset($attr['goto'.$s_suffix.'AdminPrinter']['count']);
-        foreach($attr['goto'.$s_suffix.'AdminPrinter'] as $key => $user){
-          if($this->uid==$user){
-            unset($attr['goto'.$s_suffix.'AdminPrinter'][$key]);
-          }
-        }    
-        $tmp = array();
-        foreach($attr['goto'.$s_suffix.'AdminPrinter'] as $user){
-          $tmp[] = $user;
-        }
-        $attr['goto'.$s_suffix.'AdminPrinter'] = array();  
-        $attr['goto'.$s_suffix.'AdminPrinter'] = $tmp;
-      }
-
-      /* Extract useable tags, to be able to save all changes 
-       */
-      $attrs_used = array();
-      foreach($attr as $key=>$val){
-
-        /* If index is numeric, skip it ...*/
-        if((!is_numeric($key))&&($key!="count")){
-
-          /* If entry contains 'count' remove it */
-          if(is_array($val)&&isset($val['count'])){
-            unset($val['count']);
-          }
-          $attrs_used[$key]=$val;
-        }
-      }
-      /* the result of cleaning the entry is 
-       *  to be able to directly save this again,
-       *  if all changes are made 
-       */
-      $attr= $attrs_used;
-
-#fix : Id don't know why such an entry was set ... 
-      if(isset($attr['GOTOADMINPRINTER'])){
-        unset($attr['GOTOADMINPRINTER']);
-      }
-
-      /* Save changes */
-      $ldap->cd($attr['dn']);
-      $dn = $attr['dn'];
-      unset($attr['dn']);
-        
-      $ldap->modify ($attr); 
-      show_ldap_error($ldap->get_error(),sprintf(_("Saving printer membership with dn %s failed "),$dn));
+      $printerObj = NULL;
+      $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn']);
+      $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."Printer"],$this->uid);
+      $printerObj->by_object['printgeneric']->save();
     }
 
-    /* All printers are cleaned, (our cn/uid removed) 
-     *  now we must add our uid / cn 
-     *  to the new configured printers.
-     */
-    foreach($this->gotoPrinter as $printer) {
-      $ldap->cat($printer['dn']);
-      $attrs= $ldap->fetch();
-      $attrs_used = array(); 
-      foreach($attrs as $key=>$val){
-        if((!is_numeric($key))&&($key!="count")){
-          if(is_array($val)&&isset($val['count'])){
-            unset($val['count']);
-          }
-          $attrs_used[$key]=$val;
-        }
-      }
-      /* $attrs contains all values 
-       * we need, to save the entry lateron 
-      */
-      $attrs= $attrs_used;
-
-      /* Depending on the type (User/Admin) 
-       *  switch these attributes, that makes it easier
-       */
-      if($printer['mode'] == "user"){
-        $attribute  = "goto".$s_suffix."Printer";
-        $attribute2 = "goto".$s_suffix."AdminPrinter";
-      }else{
-        $attribute  = "goto".$s_suffix."AdminPrinter";
-        $attribute2 = "goto".$s_suffix."Printer";
-      }
+    $ldap->search("(&(objectClass=gotoPrinter)(goto".$s_suffix."AdminPrinter=".$this->uid."))",array("*"));
+    while($attr = $ldap->fetch()){
+      $printerObj = NULL;
+      $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$attr['dn']);
+      $printerObj->by_object['printgeneric']->DelMember($types["goto".$s_suffix."AdminPrinter"],$this->uid);
+      $printerObj->by_object['printgeneric']->save();
+    }
 
-      /* If this user is already assigned to $attribute2 
-       * delete user from $attribute2, to be albe to attach him to $attribute
-       * A user can't be admin and normal user for one printer
-       */
-      if(!isset($printer[$attribute2])){
-        $printer[$attribute2]=array();
-      }else{
-        if(in_array($this->uid,$printer[$attribute2])){ 
-          $tmp = array_flip($printer[$attribute2]);
-          unset($tmp[$this->uid]);
-          $attrs[$attribute2]=array_flip($tmp);
-        }
-        /* If Last entry removed, clear attribute*/
-        if(empty($attrs[$attribute2])){
-          $attrs[$attribute2]=array();
-        }
-      }
-    
-      /* Attach user to the $attribute, if he is'nt already attached
-       */
-      if(!isset($attrs[$attribute])){
-        $attrs[$attribute]=array($this->uid);
+    foreach($this->gotoPrinter as $printer){
+      $printerObj = NULL;
+      $printerObj = new printtabs($this->config,$this->config->data['TABS']['PRINTTABS'],$printer['dn']);
+       
+      if($printer['mode'] == "admin") {
+        $attribute = "goto".$s_suffix."AdminPrinter";
       }else{
-        unset($attrs[$attribute]['count']);
-        if(!in_array($this->uid,$attrs[$attribute])){
-          $attrs[$attribute][]=$this->uid;
-        }
-      }
-
-      $ldap->cd($attrs['dn']);
-      unset($attrs['dn']);
-$ldap->modify ($attrs); 
-
-      if($ldap->get_error()!="Success"){
-        print_red(_("Error while writing printer settings")." : ".$ldap->get_error());
+        $attribute = "goto".$s_suffix."Printer";
       }
-    }
   
+      $printerObj->by_object['printgeneric']->AddMember($types[$attribute],$this->dn);
+      $printerObj->by_object['printgeneric']->save();
+    }
     /* Prepare HotPlug devices */
     $this->attrs['gotoHotplugDevice'] = array();
     foreach($this->gotoHotplugDevices as $name => $device){
@@ -1127,7 +985,11 @@ $ldap->modify ($attrs);
     /* Prepare Shares */
     $this->attrs['gotoShare']=array();
     foreach($this->gotoShares as $name => $share){
-      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$share['mountPoint']."|".$share['PwdHash']."|".$share['Username'];
+      $mntp= $share['mountPoint'];
+      if (!preg_match('=^[a-z0-9+_/%-]+$=i', $mntp)){
+        $mntp= base64_encode($mntp);
+      }
+      $this->attrs['gotoShare'][] =$share['server']."|".$share['name']."|".$mntp."|".$share['PwdHash']."|".$share['Username'];
     }
 
 
@@ -1143,7 +1005,7 @@ $ldap->modify ($attrs);
     }
  
     /* Prepare Flags */
-    $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlag_C.$this->gotoProfileFlag_L);
+    $this->attrs['gotoProfileFlags'] = array($this->gotoProfileFlagC.$this->gotoProfileFlagL);
     if(empty($this->attrs['gotoProfileFlags'][0])){
       $this->attrs['gotoProfileFlags']=array();
       }
@@ -1153,14 +1015,6 @@ $ldap->modify ($attrs);
       $this->attrs['gotoProfileServer']= array(); 
     }
 
-    foreach($this->attributes as $s_attr){
-      if(chkacl($this->acl,$s_attr)!="") {
-        if(isset($this->attrs[$s_attr])){
-          unset($this->attrs[$s_attr]);
-        }
-      }
-    }
-
     $ldap->cat ($this->dn, array('dn'));
     if ($ldap->fetch()){
       $mode= "modify";
@@ -1245,26 +1099,38 @@ function printOutHotPlugDevices()
   }
 
 
+  /* Return plugin informations for acl handling 
+      #FIXME these ACLs should work for groups too */ 
   function plInfo()
   {
-    return (array("plDescription"   => _("Environment settings"),
-                  "plSelfModify"    => TRUE,
-                  "plDepends"       => array("objectClass" => "gotoEnvironment"),
-
-                  "gotoProfileServer"   => _("Profile server") ,
-                  "gotoProfileFlag_L"   => "FIXME"._("Resolution changeable during session") ,  // These variable are flags 
-                  "gotoProfileFlag_C"   => "FIXME"._("Cache profile localy") ,                  // extracted from gotoProfileFlag
-                  "gotoXResolution"     => _("Resolution") ,
-                  "gotoProfileQuota"    => _("Profile quota") ,
-                  "gotoLogonScripts"    => _("Logon script") ,
-                  "gotoPrinter"         => _("Printer") ,
-                  "gosaDefaultPrinter"  => _("Default printer") ,
-                  "gotoKioskProfile"    => _("Kiosk profile") ,
-                  "gotoShare"           => _("Shares") ));
+    return (array("plShortName"     => _("Environment"),
+                  "plDescription"   => _("Environment settings"),         // Description
+                  "plSelfModify"    => TRUE,                              
+                  "plDepends"       => array("user", "posixAccount"),     // This plugin depends on 
+                  "plPriority"      => 2,                                 // Position in tabs 
+                  "plSection"       => "personal",                        // This belongs to personal
+                  "plCategory"      => array("users", "groups"),          // Add to following categories 
+                  "plOptions"       => array("resolution_hook" => array("type" => "string",
+                                                                        "description" => _("Command to extend the list of possible screen resolutions"))),
+
+                  "plProvidedAcls"  => array(
+
+                    "gotoProfileFlagL"    => _("Resolution changeable during session") ,
+                    "gotoProfileFlagC"    => _("Cache profile localy") ,
+
+                    "gotoProfileQuota"    => _("Profile quota") ,
+                    "gotoProfileServer"   => _("Profile server") ,
+
+                    "gotoXResolution"     => _("Resolution") ,
+                    "gotoKioskProfile"    => _("Kiosk profile") ,
+
+                    "gosaDefaultPrinter"  => _("Default printer") ,
+                    "gotoLogonScript"     => _("Logon script") ,
+                    "gotoHotplugDevice"   => _("Hotplug devices"),
+                    "gotoShare"           => _("Shares"))
+                   ));
     }
 }
 
-  
-
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>