Code

Updated for first version of (very incomplete) acl editing.
authorcajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 7 Jul 2006 14:31:42 +0000 (14:31 +0000)
committercajus <cajus@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 7 Jul 2006 14:31:42 +0000 (14:31 +0000)
There's no save yet, there's no interpretation of acl's yet.
Old ACLs may not work anymore.

git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@4052 594d385d-05f5-0310-b6e9-bd551577e9d8

12 files changed:
TODO
include/class_plugin.inc
include/class_pluglist.inc
plugins/addons/notifications/class_msgplug.inc
plugins/addons/notifications/contents.tpl
plugins/admin/acl/class_acl.inc
plugins/admin/acl/contents.tpl
plugins/admin/acl/main.inc
plugins/admin/departments/class_departmentGeneric.inc
plugins/admin/departments/class_departmentManagement.inc
plugins/personal/generic/class_user.inc
plugins/personal/posix/class_posixAccount.inc

diff --git a/TODO b/TODO
index 3018b6517bb7560d4baa6727192818965b585127..0884d9ddcdca8ce0da32844827195d220aa68a55 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,8 @@
 Target for 2.6:
 ===============
 
+* {if $javascript eq 'false'} for all refresh buttons that are not in filter
+
 * Add new smarty gettext plugin -> requires fixing of <b> and <i> tags in
   translations
 
index 1cab881b410202f1926c35ce4d7c3e048c2a21d3..419446592c24640539633e7b269c4e550da13e99 100644 (file)
@@ -111,15 +111,6 @@ class plugin
   /* Plugin identifier */
   var $plHeadline= "";
   var $plDescription= "";
-  var $plObject_name= "";
-  var $plProvided_acls= array();
-  var $plSelf_modify= FALSE;
-  var $plOptions= array();
-  var $plSection= "";
-  var $plTask= array();
-  var $plPriority= 0;
-  var $plDepends= array();
-  var $plConflicts= array();
 
   /*! \brief plugin constructor
 
@@ -1359,6 +1350,22 @@ class plugin
       return($this->snapDialog->execute());
     }
   }
+
+
+  function plInfo()
+  {
+    #var $plObject_name= "";
+    #var $plProvidedAcls= array();
+    #var $plSelfModify= FALSE;
+    #var $plOptions= array();
+    #var $plSection= "";
+    #var $plTask= array();
+    #var $plPriority= 0;
+    #var $plDepends= array();
+    #var $plConflicts= array();
+    return array();
+  }
+
 }
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>
index 42f729db8992deab90bdb9f049bb8ab3fb9a4fc0..4cd8786c472a98dc3c6c3368c4cc1a8ef3d445e3 100644 (file)
@@ -28,6 +28,7 @@ class pluglist {
        var $dirlist= array();
        var $ui= NULL;
        var $current= "";
+       var $info= array();
        var $headlines = array();
 
        function pluglist($config, $ui)
@@ -52,6 +53,10 @@ class pluglist {
                } else {
                        if (isset ($config['PATH']) && is_array($config)){
                                $list[$this->index++]= $config['PATH'];
+                               if (isset($config['CLASS'])){
+                                       $class= $config['CLASS'];
+                                       $this->info[$class]= call_user_func(array($class, 'plInfo'));
+                               }
                        }
                }
                error_reporting(E_ALL);
@@ -131,7 +136,7 @@ class pluglist {
                                                $href= "main.php?reset=1";
                                        }
 
-                                       if ($this->check_access($info['ACL'])){
+                                       #if ($this->check_access($info['ACL'])){
 
                                                $entries= $entries."<p class=\"menuitem\" ".
                                                        "onClick='return question(\""._("You are currently editing a database entry. Do you want to dismiss the changes?")."\", \"$href\");'>".
@@ -144,7 +149,7 @@ class pluglist {
                                                if(!isset($_SESSION['maxC'])){
                                                        $_SESSION['maxC'] = "RO0K9CzEYCSAAOtOICCFhEDBKGSKANyHMKDHAEwFLNTJILwEMODJYPgMRA0F9IOPSPUKNEVCUKyDBAHNbIWFJOIP";
                                                }
-                                       }
+                                       #}
                                }
 
                                /* Append to menu */
@@ -232,7 +237,7 @@ class pluglist {
                                        }
 
 
-                                       if ($this->check_access($info['ACL'])){
+                                       #if ($this->check_access($info['ACL'])){
 
                                                /* Hm this looks doubled */
                                                $image= get_template_path('images/'.$info['ICON']);
@@ -247,7 +252,7 @@ class pluglist {
                                                        _($plHeadline)."</a></td>\n";
                                                $col++ ;
 
-                                       }
+                                       #}
                                }
 
                                /* Append to menu */
index c42840d4015dfe51127cd3157803c9022a662b52..08a2395680029baaef209a5ec5f82b6062666250 100644 (file)
@@ -33,7 +33,7 @@ class msgplug extends plugin
 
     /* Preset values */
     $this->targets= array("user" => _("Users"), "group" => _("Groups"));
-    ksort($this->targets);
+    asort($this->targets);
 
     /* Users */
     $ldap= $config->get_ldap_link();
@@ -41,7 +41,7 @@ class msgplug extends plugin
     if ($tag == ""){
       $ldap->search('(objectClass=gosaAccount)', array('uid', 'cn'));
     } else {
-      $ldap->search('(&(objectClass=gosaAccount)(gosaUnitTag)'.$tag.'))', array('uid', 'cn'));
+      $ldap->search('(&(objectClass=gosaAccount)(gosaUnitTag='.$tag.'))', array('uid', 'cn'));
     }
     while ($attrs= $ldap->fetch()){
       $this->users['U:'.$attrs['uid'][0]]= $attrs['cn'][0].' ['.$attrs['uid'][0].']';
index a4d9d68821410f5276d86a992a69f34c4fb6d259..a7abd2cf49b541776609537b77ed74e8036d6da6 100644 (file)
@@ -9,7 +9,7 @@
         {html_options options=$targets selected=$target}
         <option disabled>&nbsp;</option>
    </select>
-   <input type="submit" value="{t}Apply{/t}" name="refresh"><br><br>
+   {if $javascript eq 'false'}<input type="submit" value="{t}Apply{/t}" name="refresh">{/if}<br><br>
   </td>
   <td>
   </td>
index 49b1cdf561157692fcac227da82742b38fba29a3..c2e7245c66e6b8b770f611a7e19fe3337d6727a6 100644 (file)
@@ -7,14 +7,124 @@ class acl extends plugin
   var $plDescription= "This does something";
 
   /* attribute list for save action */
-  var $attributes= array("target", "nmessage");
+  var $attributes= array('gosaAclEntry');
   var $objectclasses= array();
 
+  /* Helpers */
+  var $dialogState= "head";
+  var $gosaAclEntry= array();
+  var $aclType= "";
+  var $aclObject= "";
+  var $aclContents= array();
+  var $target= "group";
+  var $aclTypes= array();
+  var $aclObjects= array();
+  var $aclMyObjects= array();
+  var $users= array();
+  var $groups= array();
+  var $recipients= array();
+  var $isContainer= FALSE;
+  var $currentIndex= 0;
+  var $wasNewEntry= FALSE;
+  var $ocMapping= array();
+  var $savedAclContents= array();
+
 
   function acl ($config, $dn= NULL)
   {
     /* Include config object */
-    $this->config= $config;
+    plugin::plugin($config, $dn);
+
+    /* Load ACL's */
+    $this->gosaAclEntry= array();
+    if (isset($this->attrs['gosaAclEntry'])){
+      for ($i= 0; $i<$this->attrs['gosaAclEntry']['count']; $i++){
+        $acl= $this->attrs['gosaAclEntry'][$i];
+        $this->gosaAclEntry= array_merge($this->gosaAclEntry, $this->explodeACL($acl));
+      }
+    }
+    ksort($this->gosaAclEntry);
+
+    /* Container? */
+    if (preg_match('/^(ou|c|l|dc)=/i', $dn)){
+      $this->isContainer= TRUE;
+    }
+
+    /* Fill acl types */
+    if ($this->isContainer){
+      $this->aclTypes= array("reset" => _("Reset ACLs"),
+                             "one" => _("One level"),
+                             "base" => _("Current object"),
+                             "sub" => _("Complete subtree"),
+                             "psub" => _("Complete subtree (permanent)"),
+                             "role" => _("Use ACL defined in role"));
+    } else {
+      $this->aclTypes= array("base" => _("Current object"),
+          "role" => _("Use ACL defined in role"));
+    }
+    asort($this->aclTypes);
+    $this->targets= array("user" => _("Users"), "group" => _("Groups"));
+    asort($this->targets);
+
+    /* Users */
+    $ui= get_userinfo();
+    $tag= $ui->gosaUnitTag;
+    $ldap= $config->get_ldap_link();
+    $ldap->cd($config->current['BASE']);
+    if ($tag == ""){
+      $ldap->search('(objectClass=gosaAccount)', array('uid', 'cn'));
+    } else {
+      $ldap->search('(&(objectClass=gosaAccount)(gosaUnitTag='.$tag.'))', array('uid', 'cn'));
+    }
+    while ($attrs= $ldap->fetch()){
+      $this->users['U:'.$attrs['dn']]= $attrs['cn'][0].' ['.$attrs['uid'][0].']';
+    }
+    ksort($this->users);
+
+    /* Groups */
+    $ldap->cd($config->current['BASE']);
+    if ($tag == ""){
+      $ldap->search('(objectClass=posixGroup)', array('cn', 'description'));
+    } else {
+      $ldap->search('(&(objectClass=posixGroup)(gosaUnitTag='.$tag.'))', array('cn', 'description'));
+    }
+    while ($attrs= $ldap->fetch()){
+      $dsc= "";
+      if (isset($attrs['description'][0])){
+        $dsc= $attrs['description'][0];
+      }
+      $this->groups['G:'.$attrs['dn']]= $attrs['cn'][0].' ['.$dsc.']';
+    }
+    ksort($this->groups);
+
+    /* Objects */
+    $tmp= get_global('plist');
+    $plist= $tmp->info;
+    foreach ($plist as $class => $acls){
+      if (isset($acls['plDescription'])){
+        /* Only feed categories */
+        if (isset($acls['plDepends']['description'])){
+          $this->aclObjects[$acls['plDepends']['objectClass']]= $acls['plDepends']['description'];
+        }
+
+        /* Additionally filter the classes we're interested in in "self edit" mode */
+        if (in_array_ics($acls['plDepends']['objectClass'], $this->attrs['objectClass'])){
+          $this->myAclObjects[$class]= $acls['plDescription'];
+        }
+      }
+    }
+    asort($this->aclObjects);
+
+    /* Generate mapping object */
+    foreach ($plist as $oc => $pl){
+      if (isset($pl['plDepends']['objectClass'])){
+        $class= $pl['plDepends']['objectClass'];
+        if (!isset($this->ocMapping[$class])){
+          $this->ocMapping[$class]= array();
+        }
+        $this->ocMapping[$class][]= $oc;
+      }
+    }
   }
 
 
@@ -23,12 +133,558 @@ class acl extends plugin
     /* Call parent execute */
     plugin::execute();
 
+    $tmp= get_global('plist');
+    $plist= $tmp->info;
+
+    /* Handle posts */
+    if (isset($_POST['new_acl'])){
+      $this->dialogState= 'create';
+      $this->currentIndex= count($this->gosaAclEntry);
+      $this->loadAclEntry(TRUE);
+    }
+
+    $new_acl= array();
+    $aclDialog= FALSE;
+    foreach($_POST as $name => $post){
+
+      /* Actions... */
+      if (preg_match('/^acl_edit_.*_x/', $name)){
+        $this->dialogState= 'create';
+        $this->currentIndex= preg_replace('/^acl_edit_([0-9]+).*$/', '\1', $name);
+        $this->loadAclEntry();
+        continue;
+      }
+      if (preg_match('/^acl_del_.*_x/', $name)){
+        unset($this->gosaAclEntry[preg_replace('/^acl_del_([0-9]+).*$/', '\1', $name)]);
+        continue;
+      }
+
+      if (preg_match('/^cat_edit_.*_x/', $name)){
+        $this->aclObject= preg_replace('/^cat_edit_([^_]+)_.*$/', '\1', $name);
+        $this->dialogState= 'edit';
+        foreach ($this->ocMapping[$this->aclObject] as $oc){
+          if (isset($this->aclContents[$oc])){
+            $this->savedAclContents[$oc]= $this->aclContents[$oc];
+          }
+        }
+        continue;
+      }
+      if (preg_match('/^cat_del_.*_x/', $name)){
+        $idx= preg_replace('/^cat_del_([^_]+)_.*$/', '\1', $name);
+        foreach ($this->ocMapping[$idx] as $key){
+          unset($this->aclContents[$key]);
+        }
+        continue;
+      }
+
+      /* Sorting... */
+      if (preg_match('/^sortup_.*_x/', $name)){
+        $index= preg_replace('/^sortup_([0-9]+).*$/', '\1', $name);
+        if ($index > 0){
+          $tmp= $this->gosaAclEntry[$index];
+          $this->gosaAclEntry[$index]= $this->gosaAclEntry[$index-1];
+          $this->gosaAclEntry[$index-1]= $tmp;
+        }
+        continue;
+      }
+      if (preg_match('/^sortdown_.*_x/', $name)){
+        $index= preg_replace('/^sortdown_([0-9]+).*$/', '\1', $name);
+        if ($index < count($this->gosaAclEntry)-1){
+          $tmp= $this->gosaAclEntry[$index];
+          $this->gosaAclEntry[$index]= $this->gosaAclEntry[$index+1];
+          $this->gosaAclEntry[$index+1]= $tmp;
+        }
+        continue;
+      }
+
+      /* ACL saving... */
+      if (preg_match('/^acl_.*_[^xy]$/', $name)){
+        $aclDialog= TRUE;
+        list($dummy, $object, $attribute, $value)= split('_', $name);
+
+        /* Ordinary ACLs */
+        if (!isset($new_acl[$object])){
+          $new_acl[$object]= array();
+        }
+        if (isset($new_acl[$object][$attribute])){
+          $new_acl[$object][$attribute].= $value;
+        } else {
+          $new_acl[$object][$attribute]= $value;
+        }
+      }
+
+    }
+    
+    /* Only be interested in new acl's, if we're in the right _POST place */
+    if ($aclDialog && isset($this->ocMapping[$this->aclObject])){
+      foreach ($this->ocMapping[$this->aclObject] as $oc){
+        unset($this->aclContents[$oc]);
+        if (isset($new_acl[$oc])){
+          $this->aclContents[$oc]= $new_acl[$oc];
+        }
+      }
+    }
+
+    /* Cancel new acl? */
+    if (isset($_POST['cancel_new_acl'])){
+      $this->dialogState= 'head';
+      if ($this->wasNewEntry){
+        unset ($this->gosaAclEntry[$this->currentIndex]);
+      }
+    }
+
+    /* Store ACL in mail object? */
+    if (isset($_POST['submit_new_acl'])){
+      $this->gosaAclEntry[$this->currentIndex]['type']= $this->aclType;
+      $this->gosaAclEntry[$this->currentIndex]['members']= $this->recipients;
+      $this->gosaAclEntry[$this->currentIndex]['acl']= $this->aclContents;
+      $this->dialogState= 'head';
+    }
+
+    /* Cancel edit acl? */
+    if (isset($_POST['cancel_edit_acl'])){
+      $this->dialogState= 'create';
+      foreach ($this->ocMapping[$this->aclObject] as $oc){
+        if (isset($this->savedAclContents[$oc])){
+          $this->aclContents[$oc]= $this->savedAclContents[$oc];
+        }
+      }
+    }
+
+    /* Save edit acl? */
+    if (isset($_POST['submit_edit_acl'])){
+      $this->dialogState= 'create';
+    }
+
+    /* Add acl? */
+    if (isset($_POST['add_acl']) && $_POST['aclObject'] != ""){
+      $this->dialogState= 'edit';
+      $this->savedAclContents= array();
+      foreach ($this->ocMapping[$this->aclObject] as $oc){
+        if (isset($this->aclContents[$oc])){
+          $this->savedAclContents[$oc]= $this->aclContents[$oc];
+        }
+      }
+    }
+
+    /* Add to list? */
+    if (isset($_POST['add']) && isset($_POST['source'])){
+      foreach ($_POST['source'] as $key){
+        if ($this->target == 'user'){
+          $this->recipients[$key]= $this->users[$key];
+        }
+        if ($this->target == 'group'){
+          $this->recipients[$key]= $this->groups[$key];
+        }
+      }
+      ksort($this->recipients);
+    }
+
+    /* Remove from list? */
+    if (isset($_POST['del']) && isset($_POST['recipient'])){
+      foreach ($_POST['recipient'] as $key){
+          unset($this->recipients[$key]);
+      }
+    }
+
+    /* Save common values */
+    foreach (array("aclType", "aclObject", "target") as $key){
+      if (isset($_POST[$key])){
+        $this->$key= validate($_POST[$key]);
+      }
+    }
+
+    /* Create templating instance */
     $smarty= get_smarty();
 
+    if ($this->dialogState == 'head'){
+      /* Draw list */
+      $aclList= new DivSelectBox("aclList");
+      $aclList->SetHeight(450);
+      
+      /* Fill in entries */
+      foreach ($this->gosaAclEntry as $key => $entry){
+        $field1= array("string" => $this->aclTypes[$entry['type']], "attach" => "style='width:100px'");
+        $field2= array("string" => $this->assembleAclSummary($entry));
+        $action= "<input type='image' name='sortup_$key' alt='up' title='"._("Up")."' src='images/sort_up.png' align='top'>";
+        $action.= "<input type='image' name='sortdown_$key' alt='down' title='"._("Down")."' src='images/sort_down.png'>";
+        $action.= "<input class='center' type='image' src='images/edit.png' alt='"._("edit")."' name='acl_edit_$key' title='"._("Edit ACL")."'>";
+        $action.= "<input class='center' type='image' src='images/edittrash.png' alt='"._("delete")."' name='acl_del_$key' title='"._("Delete ACL")."'>";
+
+        $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px';text-align:right");
+        $aclList->AddEntry(array($field1, $field2, $field3));
+      }
+
+      $smarty->assign("aclList", $aclList->DrawList());
+    }
+
+    if ($this->dialogState == 'create'){
+      /* Draw list */
+      $aclList= new DivSelectBox("aclList");
+      $aclList->SetHeight(150);
+
+      /* Add settings for all categories to the (permanent) list */
+      foreach ($this->aclObjects as $oc => $dsc){
+        $summary= "";
+        foreach ($plist as $key => $plugin){
+          if (isset($plugin['plDepends']['objectClass']) && $plugin['plDepends']['objectClass'] == $oc &&
+              isset($this->aclContents[$key])){
+            if (count($this->aclContents[$key]) && isset($this->aclContents[$key][0]) &&
+                $this->aclContents[$key][0] != ""){
+              $summary.= "$key, ";
+            }
+          }
+        }
+
+        /* Set summary... */
+        if ($summary == ""){
+          $summary= _("No ACL settings for this category");
+        } else {
+          $summary= sprintf(_("Contains ACLs for these objects: %s"), preg_replace('/, $/', '', $summary));
+        }
+
+        $field1= array("string" => $dsc, "attach" => "style='width:100px'");
+        $field2= array("string" => $summary);
+        $action= "<input class='center' type='image' src='images/edit.png' alt='"._("edit")."' name='cat_edit_$oc' title='"._("Edit categories ACLs")."'>";
+        $action.= "<input class='center' type='image' src='images/edittrash.png' alt='"._("delete")."' name='cat_del_$oc' title='"._("Clear categories ACLs")."'>";
+        $field3= array("string" => $action, "attach" => "style='border-right:0px;width:50px'");
+        $aclList->AddEntry(array($field1, $field2, $field3));
+      }
+
+      $smarty->assign("aclList", $aclList->DrawList());
+      $smarty->assign("aclType", $this->aclType);
+      $smarty->assign("aclTypes", $this->aclTypes);
+      $smarty->assign("target", $this->target);
+      $smarty->assign("targets", $this->targets);
+
+      /* Assign possible target types */
+      $smarty->assign("targets", $this->targets);
+      foreach ($this->attributes as $attr){
+        $smarty->assign($attr, $this->$attr);
+      }
+
+
+      /* Generate list */
+      $tmp= array();
+      foreach (array("user" => "users", "group" => "groups") as $field => $arr){
+        if ($this->target == $field){
+          foreach ($this->$arr as $key => $value){
+            if (!isset($this->recipients[$key])){
+              $tmp[$key]= $value;
+            }
+          }
+        }
+      }
+      $smarty->assign('sources', $tmp);
+      $smarty->assign('recipients', $this->recipients);
+
+      /* Acl selector if scope is base */
+      if ($this->aclType == 'base'){
+        $smarty->assign('aclSelector', $this->buildAclSelector($this->myAclObjects));
+      }
+    }
+
+    if ($this->dialogState == 'edit'){
+      $smarty->assign('headline', sprintf(_("Edit ACL for '%s', scope is '%s'"), $this->aclObjects[$this->aclObject], $this->aclTypes[$this->aclType]));
+
+      /* Collect objects for selected category */
+      $aclObjects= array();
+      foreach ($plist as $class => $acls){
+        if (isset($acls['plDepends']['objectClass']) && $acls['plDepends']['objectClass'] == $this->aclObject){
+          $aclObjects[$class]= $acls['plDescription'];
+        }
+      }
+
+      $smarty->assign('aclSelector', $this->buildAclSelector($aclObjects));
+    }
+
     /* Show main page */
+    $smarty->assign("dialogState", $this->dialogState);
     return ($smarty->fetch (get_template_path('contents.tpl', TRUE)));
   }
 
+  
+  function buildAclSelector($list)
+  {
+    $display= "";
+    $cols= 4;
+    $tmp= get_global('plist');
+    $plist= $tmp->info;
+    asort($plist);
+
+    foreach ($list as $key => $name){
+
+      /* Create sub acl if it does not exist */
+      if (!isset($this->aclContents[$key])){
+        $this->aclContents[$key]= array();
+      }
+      if (!isset($this->aclContents[$key][0])){
+        $this->aclContents[$key][0]= '';
+      }
+      $currentAcl= $this->aclContents[$key];
+
+      /* Object header */
+      $display.= "<table style='width:100%;border:1px solid #A0A0A0' cellspacing=0 cellpadding=2><tr><td style='background-color:#C8C8C8;height:1.8em' colspan=$cols><b>"._("Object").":</b> $name</td></tr>";
+
+      /* Generate options */
+      $spc= "&nbsp;&nbsp;";
+      if ($this->isContainer && $this->aclType != 'base'){
+        $options= $this->mkchkbx($key."_0_c",  _("Create objects"), preg_match('/c/', $currentAcl[0])).$spc;
+        $options.= $this->mkchkbx($key."_0_m", _("Move objects"), preg_match('/m/', $currentAcl[0])).$spc;
+        $options.= $this->mkchkbx($key."_0_d", _("Remove objects"), preg_match('/d/', $currentAcl[0])).$spc;
+        if ($plist[$key]['plSelfModify']){
+          $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $currentAcl[0])).$spc;
+        }
+      } else {
+        $options= $this->mkchkbx($key."_0_m", _("Move object"), preg_match('/m/', $currentAcl[0])).$spc;
+        $options.= $this->mkchkbx($key."_0_d", _("Remove object"), preg_match('/d/', $currentAcl[0])).$spc;
+        if ($plist[$key]['plSelfModify']){
+          $options.= $this->mkchkbx($key."_0_s", _("Modifyable by owner"), preg_match('/s/', $currentAcl[0])).$spc;
+        }
+      }
+
+      $display.= "<tr><td style='background-color:#E0E0E0' colspan=$cols>$options</td></tr>";
+
+      /* Walk through the list of attributes */
+      $cnt= 1;
+      $splist= $plist[$key];
+      asort($splist);
+      foreach($splist as $attr => $dsc){
+
+        /* Skip pl* attributes, they are internal... */
+        if (preg_match('/^pl[A-Z]+.*$/', $attr)){
+          continue;
+        }
+
+        /* Open table row */
+        if ($cnt == 1){
+          $display.= "<tr>";
+        }
+
+        /* Close table row */
+        if ($cnt == $cols){
+          $cnt= 1;
+          $rb= "";
+          $end= "</tr>";
+        } else {
+          $cnt++;
+          $rb= "border-right:1px solid #A0A0A0;";
+          $end= "";
+        }
+
+        /* Collect list of attributes */
+        $state= "";
+        if (isset($currentAcl[$attr])){
+          $state= $currentAcl[$attr];
+        }
+        $display.= "<td style='border-top:1px solid #A0A0A0;${rb}width:".(int)(100/$cols)."%'><b>$dsc</b> ($attr)<br>".$this->mkrwbx($key."_".$attr, $state)."</td>$end";
+      }
+      
+      /* Fill missing td's if needed */
+      if (--$cnt != $cols){
+       $display.= str_repeat("<td style='border-top:1px solid #A0A0A0'>&nbsp;</td>", $cols-$cnt); 
+      }
+
+      $display.= "</table><br>";
+    }
+
+    return ($display);
+  }
+
+
+  function mkchkbx($name, $text, $state= FALSE)
+  {
+    $state= $state?"checked":"";
+    return "<input id='acl_$name' type=checkbox name='acl_$name' $state><label for='acl_$name'>$text</label>";
+  }
+
+
+  function mkrwbx($name, $state= "")
+  {
+    $rstate= preg_match('/r/', $state)?'checked':'';
+    $wstate= preg_match('/w/', $state)?'checked':'';
+    return ("<input id='acl_${name}_r' type=checkbox name='acl_${name}_r' $rstate><label for='acl_${name}_r'>"._("read")."</label>".
+            "<input id='acl_${name}_w' type=checkbox name='acl_${name}_w' $wstate><label for='acl_${name}_w'>"._("write")."</label>");
+  }
+
+
+  function explodeACL($acl)
+  {
+    list($index, $type)= split(':', $acl);
+    $a= array( $index => array("type" => $type,
+                               "members" => $this->extractMembers($acl)));
+    
+    /* Handle different types */
+    switch ($type){
+
+      case 'psub':
+      case 'sub':
+      case 'one':
+      case 'base':
+        $a[$index]['acl']= $this->extractACL($acl);
+        break;
+      
+      case 'role':
+        echo "Role";
+        break;
+
+      case 'reset':
+        break;
+      
+      default:
+        print_red(sprintf(_("Unkown ACL type '%s'. Don't know how to handle it."), $type));
+        $a= array();
+    }
+    
+    return ($a);
+  }
+
+
+  function extractMembers($acl)
+  {
+    $a= array();
+
+    /* Rip acl off the string, seperate by ',' and place it in an array */
+    $ms= preg_replace('/^[^:]+:[^:]+:([^:]+).*$/', '\1', $acl);
+    $ma= split(',', $ms);
+
+    /* Decode dn's, fill with informations from LDAP */
+    $ldap= $this->config->get_ldap_link();
+    foreach ($ma as $memberdn){
+      $dn= base64_decode($memberdn);
+      $ldap->cat($dn, array('cn', 'objectClass', 'description', 'uid'));
+
+      /* Found entry... */
+      if ($ldap->count()){
+        $attrs= $ldap->fetch();
+        if (in_array_ics('gosaAccount', $attrs['objectClass'])){
+          $a['U:'.$dn]= $attrs['cn'][0]." [".$attrs['uid'][0]."]";
+        } else {
+          $a['G:'.$dn]= $attrs['cn'][0];
+          if (isset($attrs['description'][0])){
+            $a['G:'.$dn].= " [".$attrs['description'][0]."]";
+          }
+        }
+
+      /* ... or not */
+      } else {
+        $a['U:'.$dn]= sprintf(_("Unknown entry '%s'!"), $dn);
+      }
+    }
+
+    return ($a);
+  }
+
+
+  function extractACL($acl)
+  {
+    /* Rip acl off the string, seperate by ',' and place it in an array */
+    $as= preg_replace('/^[^:]+:[^:]+:[^:]+:(.*)$/', '\1', $acl);
+    $aa= split(',', $as);
+    $a= array();
+
+    /* Dis-assemble single ACLs */
+    foreach($aa as $sacl){
+      
+      /* Dis-assemble field ACLs */
+      $ao= split('#', $sacl);
+      $gobject= "";
+      foreach($ao as $idx => $ssacl){
+
+        /* First is department with global acl */
+        $object= preg_replace('/^([^;]+);.*$/', '\1', $ssacl);
+        $gacl=   preg_replace('/^[^;]+;(.*)$/', '\1', $ssacl);
+        if ($idx == 0){
+          /* Create hash for this object */
+          $gobject= $object;
+          $a[$gobject]= array();
+
+          /* Append ACL if set */
+          if ($gacl != ""){
+            $a[$gobject]= array($gacl);
+          }
+        } else {
+
+          /* All other entries get appended... */
+          list($field, $facl)= split(';', $ssacl);
+          $a[$gobject][$field]= $facl;
+        }
+
+      }
+    }
+
+    return ($a);
+  }
+
+  
+  function assembleAclSummary($entry)
+  {
+    $summary= "";
+
+    /* Summarize ACL */
+    if (isset($entry['acl'])){
+      $acl= "";
+      foreach ($entry['acl'] as $name => $object){
+        $acl.= "$name, ";
+      }
+      $summary.= sprintf(_("Contains settings for these objects: %s"), preg_replace('/, $/', '', $acl));
+    }
+
+    /* Summarize members */
+    if ($summary != ""){
+      $summary.= ", ";
+    }
+    $summary.= _("Members:")." ";
+    foreach ($entry['members'] as $cn){
+      $cn= preg_replace('/ \[.*$/', '', $cn);
+      $summary.= $cn.", ";
+    }
+
+    return (preg_replace('/, $/', '', $summary));
+  }
+
+
+  function loadAclEntry($new= FALSE)
+  {
+    /* New entry gets presets... */
+    if ($new){
+      $this->aclType= 'base';
+      $this->recipients= array();
+      $this->aclContents= array();
+    } else {
+      $acl= $this->gosaAclEntry[$this->currentIndex];
+      $this->aclType= $acl['type'];
+      $this->recipients= $acl['members'];
+      $this->aclContents= $acl['acl'];
+    }
+
+    $this->wasNewEntry= $new;
+  }
+
+
+  function aclPostHandler()
+  {
+    if (isset($_POST['save_acl'])){
+      $this->save();
+      return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  function save()
+  {
+    /* Assemble ACL's */
+    print_a($this->gosaAclEntry);
+
+    /* Call main method */
+    plugin::save();
+
+    /* Do LDAP modifications */
+
+  }
+
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
index 3f5c1ab3b4019a482c61c2504586130dda552a0a..d33905909facffa9e7fa97140994dbcdce654a60 100644 (file)
@@ -1,3 +1,96 @@
-<b>Hard coded DN for testing</b>
+<b><font style="color:red">This plugin is only simulating the interface. Therefore it's not functional. Please don't use.</font></b>
 <br>
-Some acl stuff here...
+
+{if $dialogState eq 'head'}
+<h1>{t}Assigned ACLs for current entry{/t}</h1>
+{$aclList}
+<input type="submit" name="new_acl" value="{t}New ACL{/t}">
+<p class="seperator">&nbsp;</p>
+<div style='text-align:right;margin-top:5px'>
+       <input type="submit" name="save_acl" value="{t}Ok{/t}">
+       &nbsp;
+       <input type="submit" name="cancel_acl" value="{t}Cancel{/t}">
+</div>
+{/if}
+
+{if $dialogState eq 'create'}
+<h1>{t}ACL type{/t} <select size="1" name="aclType" title="{t}Select an acl type{/t}" onChange="document.mainform.submit()">&nbsp;</option>{html_options options=$aclTypes selected=$aclType}<option disabled></select>&nbsp;{if $javascript eq 'false'}<input type="submit" value="{t}Apply{/t}" name="refresh">{/if}</h1>
+
+<p class="seperator">&nbsp;</p>
+
+<table style="width:100%">
+ <tr>
+  <td style="width:48%; vertical-align:top;">
+   {t}Use members from{/t}
+   <select name="target" onChange="document.mainform.submit()">
+        {html_options options=$targets selected=$target}
+        <option disabled>&nbsp;</option>
+   </select>
+   {if $javascript eq 'false'}<input type="submit" value="{t}Apply{/t}" name="refresh">{/if}<br><br>
+  </td>
+  <td>
+  </td>
+  <td>
+  </td>
+ </tr>
+ <tr>
+  <td style="width:48%">
+   {t}Available members{/t}<br>
+   <select style="width:100%;height:180px;" name="source[]" size="20" multiple title="{t}List message possible targets{/t}">
+            {html_options options=$sources}
+            <option disabled>&nbsp;</option>
+   </select>
+  </td>
+  <td style="vertical-align:center; text-align:center">
+   <input type="submit" value="&gt;" name="add">
+   <br><br>
+   <input type="submit" value="&lt;" name="del">
+  </td>
+  <td style="width:48%; vertical-align:top;">
+   {t}Members{/t}<br>
+   <select style="width:100%;height:180px;" name="recipient[]" size="20" multiple title="{t}List message recipients{/t}">
+            {html_options options=$recipients}
+            <option disabled>&nbsp;</option>
+   </select>
+  </td>
+ </tr>
+</table>
+
+{if $aclType ne 'reset'}
+{if $aclType ne 'role'}
+{if $aclType ne 'base'}
+<p class="seperator">&nbsp;</p>
+
+<h1>{t}List of available ACL categories{/t}</h1>
+{$aclList}
+{/if}
+{/if}
+{/if}
+
+{if $aclType eq 'base'}
+<p class="seperator">&nbsp;</p>
+<h1>{t}ACLs for this object{/t}</h1>
+{$aclSelector}
+{/if}
+
+<p class="seperator">&nbsp;</p>
+<div style='text-align:right;margin-top:5px'>
+       <input type="submit" name="submit_new_acl" value="{t}Apply{/t}">
+       &nbsp;
+       <input type="submit" name="cancel_new_acl" value="{t}Cancel{/t}">
+</div>
+{/if}
+
+{if $dialogState eq 'edit'}
+
+<h1>{$headline}</h1>
+
+{$aclSelector}
+
+<p class="seperator">&nbsp;</p>
+<div style='text-align:right;margin-top:5px'>
+       <input type="submit" name="submit_edit_acl" value="{t}Apply{/t}">
+       &nbsp;
+       <input type="submit" name="cancel_edit_acl" value="{t}Cancel{/t}">
+</div>
+{/if}
index 97235bbb950a24b2ddc21916063ccf76c2661332..bb40d6ce717a180cc3d95b893a7ceb4999c194a4 100644 (file)
@@ -35,6 +35,9 @@ if (!$remove_lock){
        }
 
        /* Execute formular */
+       if ($aclplug->aclPostHandler()){
+               echo "Saved... But this is not the way it goes normally!";
+       }
        $display= $aclplug->execute();
        $display.= "<input type=\"hidden\" name=\"ignore\">\n";
 
index c1ef6e11d3f79cbe72d45c8c033c54e1bf3be0cc..35923c401c1f1b9607ca9bf81e4e4aa3729ff175 100644 (file)
@@ -511,6 +511,7 @@ class department extends plugin
                        return (TRUE);
                }
        }
+
 }
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>
index 9bb51d3755ed233395f9e600d411000697e92cd9..d622df9e7fe52eb0a0ac38e49bda60573e24a5f8 100644 (file)
@@ -400,6 +400,19 @@ class departmentManagement extends plugin
     $this->config->make_idepartments();
     $this->DivListDepartment->save_object();
   }
+
+  function plInfo()
+  {
+    return (array("plDescription" => _("Departments"),
+                  "plSelfModify" => FALSE,
+                  "plDepends" => array("objectClass" => "gosaDepartment", "description" => _("Departments")),
+                  "description" => _("Description"),
+                  "c" => _("Country"),
+                  "l" => _("Location"),
+                  "telephoneNumber" => _("Telephone"),
+                  "ou" => _("Department name") ));
+  }
+
   
 }
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
index 2d67d8d59d807c3d946f04ca6b090effd792d6b3..679a06355bcefd8065b2a57b669c5f58fcd44bd3 100644 (file)
@@ -1284,6 +1284,17 @@ class user extends plugin
       }
     } 
   }
+
+
+  function plInfo()
+  {
+    return (array("plDescription" => _("Generic user settings"),
+                  "plSelfModify" => TRUE,
+                  "plDepends" => array("objectClass" => "gosaAccount", "description" => _("Users")),
+                  "userPassword" => _("Set password"), "sn" => _("Surename"),
+                  "givenName" => _("Given name")));
+  }
+
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
index a924ebf58335cc08690ed1a4b1af3b0df36f3a35..2e01d28828288caedfcee0a551ca1ad3d71c464b 100644 (file)
@@ -1207,6 +1207,17 @@ class posixAccount extends plugin
     return($ret);
   }
 
+
+  function plInfo()
+  {
+    return (array("plDescription" => _("POSIX account"),
+                  "plSelfModify" => TRUE,
+                  "plDepends" => array("objectClass" => "gosaAccount"),
+                  "homeDirectory" => _("Home directory"), "uidNumber" => _("User ID"),
+                  "gidNumber" => _("Group ID")));
+  }
+
+
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: