Code

Updated list handling in sudo plugin
authorhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 6 Apr 2010 13:30:10 +0000 (13:30 +0000)
committerhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 6 Apr 2010 13:30:10 +0000 (13:30 +0000)
-We now use the sortable listing

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

gosa-plugins/sudo/admin/sudo/class_sudoGeneric.inc

index 8ed4f033d96c4f65e5d384f56fe725af641ed898..726c747c10edf7cb59cc215af570eb10280ddba7 100644 (file)
 
 
 /*! \brief Sudo generic class. Allow setting User/Host/Command/Runas
-           for a sudo role object.
+  for a sudo role object.
  */
 class sudo extends plugin
 {
 
-  protected $cn= "";
-  protected $description= "";
+    protected $cn= "";
+    protected $description= "";
 
-  protected $sudoUser   = array("ALL");
-  protected $sudoCommand= array();
-  protected $sudoHost   = array("ALL");
-  protected $sudoRunAs  = array("ALL");
-  protected $accessTo         = array();
-  protected $trustModel       = "";
+    protected $sudoUser   = array("ALL");
+    protected $sudoCommand= array();
+    protected $sudoHost   = array("ALL");
+    protected $sudoRunAs  = array("ALL");
+    protected $accessTo         = array();
+    protected $trustModel       = "";
 
-  private $is_default = FALSE;
-  private $was_trust_account= FALSE;
+    private $is_default = FALSE;
+    private $was_trust_account= FALSE;
 
-  public $objectclasses = array("top","sudoRole");
-  public $attributes    = array("cn","description","sudoUser","sudoCommand","sudoHost","sudoRunAs","accessTo","trustModel");
+    public $objectclasses = array("top","sudoRole");
+    public $attributes    = array("cn","description","sudoUser","sudoCommand","sudoHost","sudoRunAs","accessTo","trustModel");
 
-  public $ignore_account = TRUE;
+    public $ignore_account = TRUE;
 
-  public $orig_dn;
+    public $orig_dn;
 
-  protected $trustSelect;
+    protected $trustSelect;
 
-  /*! \brief  Returns to the base department for sudo roles.
-              This department is then used to store new roles.
+    /*! \brief  Returns to the base department for sudo roles.
+      This department is then used to store new roles.
       @param  Object  GOsa configuration object.
       @return String sudo store department
-   */
-  public static function get_sudoers_ou($config)
-  {
-    return(get_ou("sudoRDN").$config->current['BASE']);
-  }
+     */
+    public static function get_sudoers_ou($config)
+    {
+        return(get_ou("sudoRDN").$config->current['BASE']);
+    }
 
-  /*! \brief  Initializes this sudo class, with all required attributes.
+    /*! \brief  Initializes this sudo class, with all required attributes.
       @param  Object $config  GOsa configuration object.
       @param  String $db      "new" or the sudo role dn.
       @return .
-   */
-  function sudo(&$config, $dn= NULL)
-  {
-    plugin::plugin ($config, $dn);
-
-    if($this->initially_was_account){
-      foreach(array("sudoUser","sudoCommand","sudoHost","sudoRunAs") as $attr){
-        $this->$attr = array();
-        if(isset($this->attrs[$attr])){
-          $tmp = array();
-          for($i = 0 ; $i < $this->attrs[$attr]['count']; $i++){
-            $tmp[] = $this->attrs[$attr][$i];
-          }
-          $this->$attr = $tmp;
-        }
-      }
-
-      /* Is this account a trustAccount? */
-      if (isset($this->attrs['trustModel'])){
-        $this->trustModel= $this->attrs['trustModel'][0];
-        $this->was_trust_account= TRUE;
-      } else {
-        $this->was_trust_account= FALSE;
-        $this->trustModel= "";
-      }
-
-      $this->accessTo = array();
-      if (isset($this->attrs['accessTo'])){
-        for ($i= 0; $i<$this->attrs['accessTo']['count']; $i++){
-          $tmp= $this->attrs['accessTo'][$i];
-          $this->accessTo[$tmp]= $tmp;
-        }
-      }
+     */
+    function sudo(&$config, $dn= NULL)
+    {
+        plugin::plugin ($config, $dn);
+
+        if($this->initially_was_account){
+            foreach(array("sudoUser","sudoCommand","sudoHost","sudoRunAs") as $attr){
+                $this->$attr = array();
+                if(isset($this->attrs[$attr])){
+                    $tmp = array();
+                    for($i = 0 ; $i < $this->attrs[$attr]['count']; $i++){
+                        $tmp[] = $this->attrs[$attr][$i];
+                    }
+                    $this->$attr = $tmp;
+                }
+            }
 
-    }
+            /* Is this account a trustAccount? */
+            if (isset($this->attrs['trustModel'])){
+                $this->trustModel= $this->attrs['trustModel'][0];
+                $this->was_trust_account= TRUE;
+            } else {
+                $this->was_trust_account= FALSE;
+                $this->trustModel= "";
+            }
 
-    if(preg_match("/^defaults$/i",$this->cn)){
-      $this->is_default = TRUE;
-    }
+            $this->accessTo = array();
+            if (isset($this->attrs['accessTo'])){
+                for ($i= 0; $i<$this->attrs['accessTo']['count']; $i++){
+                    $tmp= $this->attrs['accessTo'][$i];
+                    $this->accessTo[$tmp]= $tmp;
+                }
+            }
 
-    /* Get global filter config */
-    if (!session::is_set("sysfilter")){
-      $ui= get_userinfo();
-      $base= get_base_from_people($ui->dn);
-      $sysfilter= array( "depselect"       => $base,
-          "regex"           => "*");
-      session::set("sysfilter", $sysfilter);
-    }
+        }
 
-    $this->orig_dn = $this->dn;
-  }
+        if(preg_match("/^defaults$/i",$this->cn)){
+            $this->is_default = TRUE;
+        }
 
+        /* Get global filter config */
+        if (!session::is_set("sysfilter")){
+            $ui= get_userinfo();
+            $base= get_base_from_people($ui->dn);
+            $sysfilter= array( "depselect"       => $base,
+                    "regex"           => "*");
+            session::set("sysfilter", $sysfilter);
+        }
 
-  /*! \brief  Creates the sudo generic ui. 
-      @return String  The generated HTML content for this plugin. 
-   */
-  function execute()
-  {
-    /* Call parent execute */
-    plugin::execute();
-
-    /*********************
-       Access control list / trust mode 
-     *********************/ 
-
-    /* Add user workstation? */
-    if (isset($_POST["add_ws"])){
-      $this->trustSelect= new trustSelect($this->config,get_userinfo());
-      $this->dialog= TRUE;
+        $this->orig_dn = $this->dn;
+
+        // Build sortable lists 
+        foreach(array('sudoUser','sudoCommand','sudoHost','sudoRunAs') as $l){
+            $ll = $l."List";
+            $this->$ll = new sortableListing($this->$l);
+            $this->$ll->setDeleteable(false);
+            $this->$ll->setEditable(false);
+            $this->$ll->setWidth("100%");
+            $this->$ll->setHeight("100px");
+            $this->$ll->setAcl($this->getacl($l));
+        }
+        $this->sudoUserList->setHeader(array("!",_("Type"),_("Member"),_("Option")));
+        $this->sudoUserList->setColspecs(array('24px','24px','*','46px'));
+        $this->sudoHostList->setHeader(array("!",_("System"),_("Option")));
+        $this->sudoHostList->setColspecs(array('24px','*','46px'));
+        $this->sudoCommandList->setHeader(array("!",_("Command"),_("Option")));
+        $this->sudoCommandList->setColspecs(array('24px','*','46px'));
+        $this->sudoRunAsList->setHeader(array("!",_("User"),_("Option")));
+        $this->sudoRunAsList->setColspecs(array('24px','*','46px'));
     }
 
-    // Add selected machines to trusted ones.
-    if (isset($_POST["add_ws_finish"]) &&  $this->trustSelect){
-      $trusts = $this->trustSelect->detectPostActions();
-      if(isset($trusts['targets'])){
-
-        $headpage = $this->trustSelect->getHeadpage();
-        foreach($trusts['targets'] as $id){
-          $attrs = $headpage->getEntry($id);
-          $this->accessTo[$attrs['cn'][0]]= $attrs['cn'][0];
-        }
-        ksort($this->accessTo);
-        $this->is_modified= TRUE;
-      }
-      $this->trustSelect= NULL;
-      $this->dialog= FALSE;
-    }
 
+    /*! \brief  Creates the sudo generic ui. 
+      @return String  The generated HTML content for this plugin. 
+     */
+    function execute()
+    {
+        /* Call parent execute */
+        plugin::execute();
+
+        /*********************
+          Access control list / trust mode 
+         *********************/ 
+
+        /* Add user workstation? */
+        if (isset($_POST["add_ws"])){
+            $this->trustSelect= new trustSelect($this->config,get_userinfo());
+            $this->dialog= TRUE;
+        }
 
-    /* Remove user workstations? */
-    if (isset($_POST["delete_ws"]) && isset($_POST['workstation_list'])){
-      foreach($_POST['workstation_list'] as $name){
-        unset ($this->accessTo[$name]);
-      }
-      $this->is_modified= TRUE;
-    }
+        // Add selected machines to trusted ones.
+        if (isset($_POST["add_ws_finish"]) &&  $this->trustSelect){
+            $trusts = $this->trustSelect->detectPostActions();
+            if(isset($trusts['targets'])){
+
+                $headpage = $this->trustSelect->getHeadpage();
+                foreach($trusts['targets'] as $id){
+                    $attrs = $headpage->getEntry($id);
+                    $this->accessTo[$attrs['cn'][0]]= $attrs['cn'][0];
+                }
+                ksort($this->accessTo);
+                $this->is_modified= TRUE;
+            }
+            $this->trustSelect= NULL;
+            $this->dialog= FALSE;
+        }
 
-    /* Add user workstation finished? */
-    if (isset($_POST["add_ws_finish"]) || isset($_POST["add_ws_cancel"])){
-      $this->trustSelect= NULL;
-      $this->dialog= FALSE;
-    }
 
-    /* Show ws dialog */
-    if ($this->trustSelect){
+        /* Remove user workstations? */
+        if (isset($_POST["delete_ws"]) && isset($_POST['workstation_list'])){
+            foreach($_POST['workstation_list'] as $name){
+                unset ($this->accessTo[$name]);
+            }
+            $this->is_modified= TRUE;
+        }
 
-      // Build up blocklist
-      session::set('filterBlacklist', array('cn' => array_values($this->accessTo)));
-      return($this->trustSelect->execute());
-    }
+        /* Add user workstation finished? */
+        if (isset($_POST["add_ws_finish"]) || isset($_POST["add_ws_cancel"])){
+            $this->trustSelect= NULL;
+            $this->dialog= FALSE;
+        }
 
+        /* Show ws dialog */
+        if ($this->trustSelect){
 
-    /*********************
-       Add users 
-     *********************/ 
-    if(isset($_POST['list_sudoUser']) && !is_object($this->dialog) && $this->acl_is_writeable("sudoUser")){
-      $this->dialog =new userGroupSelect($this->config,get_userinfo());
-    }
-   
-    /* Add selected hosts  to the sudoUser list */ 
-    if(isset($_POST['userGroupSelect_save']) && $this->dialog instanceof userGroupSelect){
-      if($this->acl_is_writeable("sudoUser")){
-        foreach($this->dialog->save() as $entry){
-          if(in_array("posixGroup",$entry['objectClass'])){
-            $name = trim("%".$entry['cn'][0]);
-          }elseif(isset($entry['uid'][0])){
-            $name = trim($entry['uid'][0]);
-          }
-          if(!in_array($name,$this->sudoUser) && !in_array("!".$name,$this->sudoUser)){
-            $this->sudoUser[] = $name;
-          }
-        }   
-      }
-      unset($this->dialog);
-      $this->dialog = NULL;
-    }    
-
-    if(isset($_POST['userGroupSelect_cancel']) && $this->dialog instanceOf userGroupSelect){
-      unset($this->dialog);
-      $this->dialog = NULL;
-    }    
-
-    if($this->dialog instanceOf userGroupSelect){
-      $used = array();
-      foreach($this->sudoUser as $name){
-        $str = preg_replace("/^!/","",$name);
-        if(preg_match("/^%/", $str)){
-          $used['cn'][] = preg_replace("/^%/","",$str);
-        }else{
-          $used['uid'][] = $str;
+            // Build up blocklist
+            session::set('filterBlacklist', array('cn' => array_values($this->accessTo)));
+            return($this->trustSelect->execute());
         }
-      }
 
-      // Build up blocklist
-      session::set('filterBlacklist', $used);
-      return($this->dialog->execute());
-    }
 
+        /*********************
+          Add users 
+         *********************/ 
 
-    /*********************
-       Add systems 
-     *********************/ 
-  
-    if(isset($_POST['list_sudoHost']) && !is_object($this->dialog) && $this->acl_is_writeable("sudoHost")){
-      $this->dialog =new systemSelect($this->config,get_userinfo());
-    }
-   
-    /* Add selected hosts  to the sudoHost list */ 
-    if(isset($_POST['systemSelect_save']) && $this->dialog instanceof systemSelect){
-      if($this->acl_is_writeable("sudoHost")){
-        foreach($this->dialog->save() as $entry){
-          $cn = trim($entry['cn'][0]);
-          if(!in_array($cn,$this->sudoHost) && !in_array("!".$cn,$this->sudoHost)){
-            $this->sudoHost[] = $cn;
-          }
-        }   
-      }   
-      unset($this->dialog);
-      $this->dialog = NULL;
-    }    
-
-    if(isset($_POST['systemSelect_cancel']) && $this->dialog instanceOf systemSelect){
-      unset($this->dialog);
-      $this->dialog = NULL;
-    }    
-
-    if($this->dialog instanceOf systemSelect){
-      $used = array();
-      foreach($this->sudoHost as $name){
-        $used['cn'][] = preg_replace("/^!/","",$name);
-      }
-
-      // Build up blocklist
-      session::set('filterBlacklist', $used);
-      return($this->dialog->execute());
-    }
-  
-    /*********************
-       Dialog handling / display / close  
-     *********************/ 
-  
-    if(is_object($this->dialog)){
-      return($this->dialog->execute());
-    }
+        if(isset($_POST['list_sudoUser']) && !is_object($this->dialog) && $this->acl_is_writeable("sudoUser")){
+            $this->dialog =new userGroupSelect($this->config,get_userinfo());
+        }
 
-    /*********************
-       NEGATE values 
-     *********************/ 
-    foreach($_POST as $name => $value){
-      if(preg_match("/^neg_/",$name)){
-        $attr = preg_replace("/^neg_([^_]*)_.*$/","\\1",$name);
-        $value= preg_replace("/^neg_[^_]*_([0-9]*)$/","\\1",$name);
-        if($this->acl_is_writeable($attr)){
-          $attrs = $this->$attr;
-          if(isset( $attrs[$value])){
-            $v =  $attrs[$value];
-            if(preg_match("/^!/",$v)){
-              $attrs[$value] = preg_replace("/^!/","",$v);
-            }else{
-              $attrs[$value] = "!".$v;
+        /* Add selected hosts  to the sudoUser list */ 
+        if(isset($_POST['userGroupSelect_save']) && $this->dialog instanceof userGroupSelect){
+            if($this->acl_is_writeable("sudoUser")){
+                foreach($this->dialog->save() as $entry){
+                    if(in_array("posixGroup",$entry['objectClass'])){
+                        $name = trim("%".$entry['cn'][0]);
+                    }elseif(isset($entry['uid'][0])){
+                        $name = trim($entry['uid'][0]);
+                    }
+                    if(!in_array($name,$this->sudoUser) && !in_array("!".$name,$this->sudoUser)){
+                        $this->sudoUser[] = $name;
+                    }
+                }   
+            }
+            unset($this->dialog);
+            $this->dialog = NULL;
+        }    
+
+        if(isset($_POST['userGroupSelect_cancel']) && $this->dialog instanceOf userGroupSelect){
+            unset($this->dialog);
+            $this->dialog = NULL;
+        }    
+
+        if($this->dialog instanceOf userGroupSelect){
+            $used = array();
+            foreach($this->sudoUser as $name){
+                $str = preg_replace("/^!/","",$name);
+                if(preg_match("/^%/", $str)){
+                    $used['cn'][] = preg_replace("/^%/","",$str);
+                }else{
+                    $used['uid'][] = $str;
+                }
             }
-            $this->$attr = $attrs;  
-          }
+
+            // Build up blocklist
+            session::set('filterBlacklist', $used);
+            return($this->dialog->execute());
         }
-        break; // Do it once, image inputs will be posted twice
-      }
-    }
-  
-    /*********************
-       Delete values 
-     *********************/ 
-    foreach($_POST as $name => $value){
-      if(preg_match("/^del_/",$name)){
-        $attr = preg_replace("/^del_([^_]*).*$/","\\1",$name);
-        $value= preg_replace("/^del_[^_]*_([0-9]*)$/","\\1",$name);
-        if($this->acl_is_writeable($attr)){
-          $attrs = $this->$attr;
-          if(isset( $attrs[$value])){
-            unset($attrs[$value]);
-            $this->$attr = $attrs;  
-          }
-        }
-        break; // Do it once, image inputs will be posted twice
-      }
-    }
 
 
-    /*********************
-       ADD values 
-     *********************/
-
-    /* User / Host / Runas */ 
-    foreach(array("sudoUser","sudoHost","sudoRunAs") as $attr){
-      if($this->acl_is_writeable($attr) && 
-          isset($_POST["add_".$attr]) && 
-          isset($_POST['new_'.$attr]) && 
-          !empty($_POST['new_'.$attr])){
-        if(preg_match("/^[a-z\.0-9]*$/i",$_POST['new_'.$attr])){
-          $attrs = $this->$attr;
-          $attrs[] =  trim($_POST['new_'.$attr]); 
-          $this->$attr = $attrs;
-        }else{
-          msg_dialog::display(_("Error"),msgPool::invalid($attr,$_POST['new_'.$attr],"/[a-z0-9]/"));
+
+        /*********************
+          Add systems 
+         *********************/ 
+
+        if(isset($_POST['list_sudoHost']) && !is_object($this->dialog) && $this->acl_is_writeable("sudoHost")){
+            $this->dialog =new systemSelect($this->config,get_userinfo());
         }
-      }
-    }
 
-    /* Command */
-    foreach(array("sudoCommand") as $attr){
-      if($this->acl_is_writeable($attr) && isset($_POST["add_".$attr]) && isset($_POST['new_'.$attr])){
-        $attrs = $this->$attr;
-        $attrs[] =  trim($_POST['new_'.$attr]); 
-        $this->$attr = $attrs;
-      }
-    }
+        /* Add selected hosts  to the sudoHost list */ 
+        if(isset($_POST['systemSelect_save']) && $this->dialog instanceof systemSelect){
+            if($this->acl_is_writeable("sudoHost")){
+                foreach($this->dialog->save() as $entry){
+                    $cn = trim($entry['cn'][0]);
+                    if(!in_array($cn,$this->sudoHost) && !in_array("!".$cn,$this->sudoHost)){
+                        $this->sudoHost[] = $cn;
+                    }
+                }   
+            }   
+            unset($this->dialog);
+            $this->dialog = NULL;
+        }    
+
+        if(isset($_POST['systemSelect_cancel']) && $this->dialog instanceOf systemSelect){
+            unset($this->dialog);
+            $this->dialog = NULL;
+        }    
+
+        if($this->dialog instanceOf systemSelect){
+            $used = array();
+            foreach($this->sudoHost as $name){
+                $used['cn'][] = preg_replace("/^!/","",$name);
+            }
 
-    
-    /*********************
-       SMARTY assignments 
-     *********************/
-
-    $smarty = get_smarty();
-    $smarty->assign("is_default",$this->is_default);
-    foreach($this->attributes as $attr){
-      if(is_string($this->$attr)){
-        $smarty->assign($attr,htmlentities($this->$attr));
-      }else{
-        $smarty->assign($attr,$this->$attr);
-      }
-      $smarty->assign($attr."ACL",$this->getacl($attr));
-    }
+            // Build up blocklist
+            session::set('filterBlacklist', $used);
+            return($this->dialog->execute());
+        }
 
-    /* Work on trust modes */
-    $smarty->assign("trusthide", " disabled ");
-    if ($this->trustModel == "fullaccess"){
-      $trustmode= 1;
-    } elseif ($this->trustModel == "byhost"){
-      $trustmode= 2;
-      $smarty->assign("trusthide", "");
-    } else {
-      $trustmode= 0;
-    }
-    $smarty->assign("trustmode", $trustmode);
-    $smarty->assign("trustmodes", array( 
-          0 => _("disabled"), 
-          1 => _("full access"),
-          2 => _("allow access to these hosts")));
-
-    if((count($this->accessTo))==0){
-      $smarty->assign("emptyArrAccess",true);
-    }else{
-      $smarty->assign("emptyArrAccess",false);
-    }
-    $smarty->assign("workstations", $this->accessTo);
-    
-    /* Create lists 
-     */
-    $divlist_sudoUser = new divSelectBox("divlist_sudoUser");
-    $divlist_sudoUser->SetHeight("90");
-    $divlist_sudoHost = new divSelectBox("divlist_sudoHost");
-    $divlist_sudoHost->Setheight("90");
-    $divlist_sudoRunAs = new divSelectBox("divlist_sudoRunAs");
-    $divlist_sudoRunAs->Setheight("90");
-    $divlist_sudoCommand = new divSelectBox("divlist_sudoCommand");
-    $divlist_sudoCommand->Setheight("90");
-
-    /* Fill divlists
-     */
-    $neg_img= image('plugins/sudo/images/negate.png','','!');
-    $option = image('plugins/sudo/images/negate.png','neg_%ATTR%_%KEY%');
-    $option.= image('images/lists/trash.png', 'del_%ATTR%_%KEY%');
-    foreach(array("sudoCommand","sudoHost","sudoRunAs") as $attr){
-      if($this->acl_is_readable($attr)){
-        foreach($this->$attr as $key => $entry){
-          $neg = "";
-          if(preg_match("/^!/",$entry)){
-            $neg = $neg_img;
-          }
-          $entry = preg_replace("/^!/","",$entry);
-          $list_name = "divlist_".$attr;
-          $$list_name->AddEntry(
-              array(
-                array("string" => $neg,"attach" => "style='width:18px;'"),
-                array("string" => $entry),
-                array("string" => preg_replace(array("/%KEY%/","/%ATTR%/"),array($key,$attr),$option),
-                  "attach" => "style='width:40px; border-right: 0px;'")));
-        }
-      }
-    }
+        /*********************
+          Dialog handling / display / close  
+         *********************/ 
 
-    foreach(array("sudoUser") as $attr){
-      $img1 = image('plugins/users/images/select_user.png','',_("User"));
-      $img2 = image('plugins/groups/images/select_group.png','',_("Group"));
-      if($this->acl_is_readable($attr)){
-        foreach($this->$attr as $key => $entry){
-          $neg = "";
-          if(preg_match("/^!/",$entry)){
-            $neg = $neg_img;
-          }
-          $entry = preg_replace("/^!/","",$entry);
-
-          $img = $img1;
-          if(preg_match("/^%/",$entry)){
-            $img = $img2;
-          }
-          $entry = preg_replace("/^%/","",$entry);
-  
-          $list_name = "divlist_".$attr;
-          $$list_name->AddEntry(
-              array(
-                array("string" => $neg,"attach" => "style='width:18px;'"),
-                array("string" => $img,"attach" => "style='width:18px;'"),
-                array("string" => $entry),
-                array("string" => preg_replace(array("/%KEY%/","/%ATTR%/"),array($key,$attr),$option),
-                  "attach" => "style='width:40px; border-right: 0px;'")));
-        }
-      }
-    }
+        if(is_object($this->dialog)){
+            return($this->dialog->execute());
+        }
 
 
+        /*********************
+          NEGATE values 
+         *********************/ 
+        foreach($_POST as $name => $value){
+            if(preg_match("/^neg_/",$name)){
+                $attr = preg_replace("/^neg_([^_]*)_.*$/","\\1",$name);
+                $value= preg_replace("/^neg_[^_]*_([0-9]*)$/","\\1",$name);
+
+                if($this->acl_is_writeable($attr)){
+                    $attrs = $this->$attr;
+                    if(isset( $attrs[$value])){
+                        $v =  $attrs[$value];
+                        if(preg_match("/^!/",$v)){
+                            $attrs[$value] = preg_replace("/^!/","",$v);
+                        }else{
+                            $attrs[$value] = "!".$v;
+                        }
+                        $this->$attr = $attrs;  
+                    }
+                }
+                break; // Do it once, image inputs will be posted twice
+            }
+        }
 
+        /*********************
+          Delete values 
+         *********************/ 
+        foreach($_POST as $name => $value){
+            if(preg_match("/^del_/",$name)){
+                $attr = preg_replace("/^del_([^_]*).*$/","\\1",$name);
+                $value= preg_replace("/^del_[^_]*_([0-9]*)$/","\\1",$name);
+                if($this->acl_is_writeable($attr)){
+                    $attrs = $this->$attr;
+                    if(isset( $attrs[$value])){
+                        unset($attrs[$value]);
+                        $this->$attr = $attrs;  
+                    }
+                }
+                break; // Do it once, image inputs will be posted twice
+            }
+        }
 
-    /* Tell smarty about our divlists 
-     */
-    $smarty->assign("divlist_sudoUser",   $divlist_sudoUser->DrawList());
-    $smarty->assign("divlist_sudoHost",   $divlist_sudoHost->DrawList());
-    $smarty->assign("divlist_sudoRunAs",  $divlist_sudoRunAs->DrawList());
-    $smarty->assign("divlist_sudoCommand",$divlist_sudoCommand->DrawList());
-    return($smarty->fetch(get_template_path('generic.tpl', TRUE)));
-  }
-
-
-  /*! \brief  Remove this sudo role from the ldap server 
-   */
-  function remove_from_parent()
-  {
-    plugin::remove_from_parent();
-
-    $ldap = $this->config->get_ldap_link();
-    $ldap->cd($this->dn);
-    $ldap->rmdir($this->dn);
-
-    /* Send signal to the world that we've done */
-    $this->handle_post_events("remove");
-  }
-
-
-  /*! \brief  Save all relevant HTML posts. 
-   */
-  function save_object()
-  {
-    plugin::save_object();
-    
-    if($this->is_default){
-      $this->cn = "defaults";
-    }  
-
-    /* Trust mode - special handling */
-    if($this->acl_is_writeable("trustModel")){
-      if (isset($_POST['trustmode'])){
-        $saved= $this->trustModel;
-        if ($_POST['trustmode'] == "1"){
-          $this->trustModel= "fullaccess";
-        } elseif ($_POST['trustmode'] == "2"){
-          $this->trustModel= "byhost";
+
+        /*********************
+          ADD values 
+         *********************/
+
+        /* User / Host / Runas */ 
+        foreach(array("sudoUser","sudoHost","sudoRunAs") as $attr){
+            if($this->acl_is_writeable($attr) && 
+                    isset($_POST["add_".$attr]) && 
+                    isset($_POST['new_'.$attr]) && 
+                    !empty($_POST['new_'.$attr])){
+                if(preg_match("/^[a-z\.0-9]*$/i",$_POST['new_'.$attr])){
+                    $attrs = $this->$attr;
+                    $attrs[] =  trim($_POST['new_'.$attr]); 
+                    $this->$attr = $attrs;
+                }else{
+                    msg_dialog::display(_("Error"),msgPool::invalid($attr,$_POST['new_'.$attr],"/[a-z0-9]/"));
+                }
+            }
+        }
+
+        /* Command */
+        foreach(array("sudoCommand") as $attr){
+            if($this->acl_is_writeable($attr) && isset($_POST["add_".$attr]) && isset($_POST['new_'.$attr])){
+                $attrs = $this->$attr;
+                $attrs[] =  trim($_POST['new_'.$attr]); 
+                $this->$attr = $attrs;
+            }
+        }
+
+
+        /*********************
+          SMARTY assignments 
+         *********************/
+
+        $smarty = get_smarty();
+        $smarty->assign("is_default",$this->is_default);
+        foreach($this->attributes as $attr){
+            if(is_string($this->$attr)){
+                $smarty->assign($attr,htmlentities($this->$attr));
+            }else{
+                $smarty->assign($attr,$this->$attr);
+            }
+            $smarty->assign($attr."ACL",$this->getacl($attr));
+        }
+
+        /* Work on trust modes */
+        $smarty->assign("trusthide", " disabled ");
+        if ($this->trustModel == "fullaccess"){
+            $trustmode= 1;
+        } elseif ($this->trustModel == "byhost"){
+            $trustmode= 2;
+            $smarty->assign("trusthide", "");
         } else {
-          $this->trustModel= "";
+            $trustmode= 0;
+        }
+        $smarty->assign("trustmode", $trustmode);
+        $smarty->assign("trustmodes", array( 
+                    0 => _("disabled"), 
+                    1 => _("full access"),
+                    2 => _("allow access to these hosts")));
+
+        if((count($this->accessTo))==0){
+            $smarty->assign("emptyArrAccess",true);
+        }else{
+            $smarty->assign("emptyArrAccess",false);
+        }
+        $smarty->assign("workstations", $this->accessTo);
+
+
+        /* Fill divlists
+         */
+        $neg_img= image('plugins/sudo/images/negate.png','','!');
+        $option = image('plugins/sudo/images/negate.png','neg_%ATTR%_%KEY%');
+        $option.= image('images/lists/trash.png', 'del_%ATTR%_%KEY%');
+        foreach(array('sudoUser','sudoCommand','sudoHost','sudoRunAs') as $l){
+            $l.="Data";
+            $$l = array();
+        }
+
+        foreach(array("sudoCommand","sudoHost","sudoRunAs") as $attr){
+            if($this->acl_is_readable($attr)){
+                $tmp =array();
+                $list = $attr."List";
+                $data = $attr."Data";
+                foreach($this->$attr as $id => $entry){
+                    $neg = "";
+                    if(preg_match("/^!/",$entry)){
+                        $neg = $neg_img;
+                    }
+                    $entry = preg_replace("/^!/","",$entry);
+
+                    $action =preg_replace(array("/%KEY%/","/%ATTR%/"),array($id,$attr),$option);
+                    $tmp[$id] = array('data'=>array($neg,$entry,$action)) ;
+                }
+                $this->$list->setListData($this->$attr, $tmp);
+                $this->$list->update();
+                $smarty->assign("divlist_{$attr}", $this->$list->render());
+            }
         }
-        if ($this->trustModel != $saved){
-          $this->is_modified= TRUE;
+
+
+        if($this->acl_is_readable($attr)){
+            $img1 = image('plugins/users/images/select_user.png','',_("User"));
+            $img2 = image('plugins/groups/images/select_group.png','',_("Group"));
+            $sudoUserData  = array();
+            foreach($this->sudoUser as $id => $entry){
+                $neg = "";
+                if(preg_match("/^!/",$entry)){
+                    $neg = $neg_img;
+                }
+                $entry = preg_replace("/^!/","",$entry);
+
+                $img = $img1;
+                if(preg_match("/^%/",$entry)){
+                    $img = $img2;
+                }
+                $entry = preg_replace("/^%/","",$entry);
+                $action =preg_replace(array("/%KEY%/","/%ATTR%/"),array($id,'sudoUser'),$option);
+                $sudoUserData[$id] = array('data'=>array($neg,$img,$entry,$action)) ;
+            }
+            $this->sudoUserList->setListData($this->sudoUser,$sudoUserData);
+            $this->sudoUserList->update();
+            $smarty->assign("divlist_sudoUser", $this->sudoUserList->render());
         }
-      }
+        return($smarty->fetch(get_template_path('generic.tpl', TRUE)));
     }
-  }
-
-
-  /*! \brief  Save changes into the ldap database.
-   */
-  function save()
-  {
-    plugin::save();
-   /* Trust accounts */
-    $objectclasses= array();
-    foreach ($this->attrs['objectClass'] as $key => $class){
-      if (preg_match('/trustAccount/i', $class)){
-        continue;
-      }
-      $objectclasses[]= $this->attrs['objectClass'][$key];
+
+
+    /*! \brief  Remove this sudo role from the ldap server 
+     */
+    function remove_from_parent()
+    {
+        plugin::remove_from_parent();
+
+        $ldap = $this->config->get_ldap_link();
+        $ldap->cd($this->dn);
+        $ldap->rmdir($this->dn);
+
+        /* Send signal to the world that we've done */
+        $this->handle_post_events("remove");
     }
 
-    $this->attrs['objectClass']= $objectclasses;
-    if ($this->trustModel != ""){
-      $this->attrs['objectClass'][]= "trustAccount";
-      $this->attrs['trustModel']= $this->trustModel;
-      $this->attrs['accessTo']= array();
-      if ($this->trustModel == "byhost"){
-        foreach ($this->accessTo as $host){
-          $this->attrs['accessTo'][]= $host;
-        }
-      }
-    } else {
-      if ($this->was_trust_account){
-        $this->attrs['accessTo']= array();
-        $this->attrs['trustModel']= array();
-      }
+
+    /*! \brief  Save all relevant HTML posts. 
+     */
+    function save_object()
+    {
+        plugin::save_object();
+
+        if($this->is_default){
+            $this->cn = "defaults";
+        }  
+
+        /* Trust mode - special handling */
+        if($this->acl_is_writeable("trustModel")){
+            if (isset($_POST['trustmode'])){
+                $saved= $this->trustModel;
+                if ($_POST['trustmode'] == "1"){
+                    $this->trustModel= "fullaccess";
+                } elseif ($_POST['trustmode'] == "2"){
+                    $this->trustModel= "byhost";
+                } else {
+                    $this->trustModel= "";
+                }
+                if ($this->trustModel != $saved){
+                    $this->is_modified= TRUE;
+                }
+            }
+        }
     }
 
 
-    /* Ensure a correct array index 
-     */ 
-    $this->attrs['sudoHost']    = array_values($this->attrs['sudoHost']);
-    $this->attrs['sudoRunAs']   = array_values($this->attrs['sudoRunAs']);
-    $this->attrs['sudoUser']    = array_values($this->attrs['sudoUser']);
-    $this->attrs['sudoCommand'] = array_values($this->attrs['sudoCommand']);
+    /*! \brief  Save changes into the ldap database.
+     */
+    function save()
+    {
+        plugin::save();
+        /* Trust accounts */
+        $objectclasses= array();
+        foreach ($this->attrs['objectClass'] as $key => $class){
+            if (preg_match('/trustAccount/i', $class)){
+                continue;
+            }
+            $objectclasses[]= $this->attrs['objectClass'][$key];
+        }
 
-    $this->cleanup();
+        $this->attrs['objectClass']= $objectclasses;
+        if ($this->trustModel != ""){
+            $this->attrs['objectClass'][]= "trustAccount";
+            $this->attrs['trustModel']= $this->trustModel;
+            $this->attrs['accessTo']= array();
+            if ($this->trustModel == "byhost"){
+                foreach ($this->accessTo as $host){
+                    $this->attrs['accessTo'][]= $host;
+                }
+            }
+        } else {
+            if ($this->was_trust_account){
+                $this->attrs['accessTo']= array();
+                $this->attrs['trustModel']= array();
+            }
+        }
 
-    $ldap = $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
 
-    if($this->is_new){
-      $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn));
-      $ldap->cd($this->dn);
-      $ldap->add($this->attrs);
+        /* Ensure a correct array index 
+         */ 
+        $this->attrs['sudoHost']    = array_values($this->attrs['sudoHost']);
+        $this->attrs['sudoRunAs']   = array_values($this->attrs['sudoRunAs']);
+        $this->attrs['sudoUser']    = array_values($this->attrs['sudoUser']);
+        $this->attrs['sudoCommand'] = array_values($this->attrs['sudoCommand']);
 
-      /* Send signal to the world that we've done */
-      $this->handle_post_events("create");
-    }else{
-      $ldap->cd($this->dn);
-      $ldap->modify($this->attrs);;
+        $this->cleanup();
 
-      /* Send signal to the world that we've done */
-      $this->handle_post_events("modify");
-    }
+        $ldap = $this->config->get_ldap_link();
+        $ldap->cd($this->config->current['BASE']);
+
+        if($this->is_new){
+            $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn));
+            $ldap->cd($this->dn);
+            $ldap->add($this->attrs);
+
+            /* Send signal to the world that we've done */
+            $this->handle_post_events("create");
+        }else{
+            $ldap->cd($this->dn);
+            $ldap->modify($this->attrs);;
+
+            /* Send signal to the world that we've done */
+            $this->handle_post_events("modify");
+        }
 
-    if (!$ldap->success()){
-      msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_DEL, get_class()));
+        if (!$ldap->success()){
+            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_DEL, get_class()));
+        }
     }
-  }
 
 
-  /*! \brief  Check the given input.
+    /*! \brief  Check the given input.
       @return Array   All error messages in an array();
-   */
-  function check()
-  {
-    $message = plugin::check();
-
-    /* Is a name given? */
-    if($this->cn == ""){
-      $message[] = msgPool::required(_("Name"));
-    }
+     */
+    function check()
+    {
+        $message = plugin::check();
 
-    /* Check if name is reserved */
-    if(!$this->is_default && preg_match("/^defaults$/i",$this->cn)){
-      $message[] = msgPool::reserved(_("Name"));
-    }
+        /* Is a name given? */
+        if($this->cn == ""){
+            $message[] = msgPool::required(_("Name"));
+        }
 
-    /* Check name */
-    if(!preg_match("/^[0-9a-z\@]*$/i",$this->cn)){
-      $message[] = msgPool::invalid(_("Name"),$this->cn,"/[0-9a-z\@]/i");
-    }
+        /* Check if name is reserved */
+        if(!$this->is_default && preg_match("/^defaults$/i",$this->cn)){
+            $message[] = msgPool::reserved(_("Name"));
+        }
 
-    /* Check if this entry will cause duplicated ldap entries */
-    $ldap = $this->config->get_ldap_link();
-    $ldap->cd($this->get_sudoers_ou($this->config));
-    $ldap->search("(&(objectClass=sudoRole)(cn=".$this->cn."))");
-    while($attrs = $ldap->fetch()){
-      if($attrs['dn'] != $this->dn){
-        $message[] = msgPool::duplicated(_("Name"));
-      }
-    }
+        /* Check name */
+        if(!preg_match("/^[0-9a-z\@]*$/i",$this->cn)){
+            $message[] = msgPool::invalid(_("Name"),$this->cn,"/[0-9a-z\@]/i");
+        }
 
-    /* Check if we are allowed to create or move this object
-     */
-    if($this->orig_dn == "new" && !$this->acl_is_createable($this->get_sudoers_ou($this->config))){
-      $message[] = msgPool::permCreate();
-    }
+        /* Check if this entry will cause duplicated ldap entries */
+        $ldap = $this->config->get_ldap_link();
+        $ldap->cd($this->get_sudoers_ou($this->config));
+        $ldap->search("(&(objectClass=sudoRole)(cn=".$this->cn."))");
+        while($attrs = $ldap->fetch()){
+            if($attrs['dn'] != $this->dn){
+                $message[] = msgPool::duplicated(_("Name"));
+            }
+        }
+
+        /* Check if we are allowed to create or move this object
+         */
+        if($this->orig_dn == "new" && !$this->acl_is_createable($this->get_sudoers_ou($this->config))){
+            $message[] = msgPool::permCreate();
+        }
 
-    return ($message);
-  }
+        return ($message);
+    }
 
 
-  /*! \brief Force this entry to be handled and saved as 'default'
+    /*! \brief Force this entry to be handled and saved as 'default'
       @param  BOOL  TRUE -force defaults   FALSE -normal
-   */
-  public function set_default($state)
-  {
-    $this->is_default = TRUE;
-    $this->cn = "defaults";
-  }
+     */
+    public function set_default($state)
+    {
+        $this->is_default = TRUE;
+        $this->cn = "defaults";
+    }
 
 
-  /*! \brief  Add ACL object
+    /*! \brief  Add ACL object
       @return Returns the ACL object.
-   */
-  static function plInfo()
-  {
-    return (array(  
-          "plShortName" => _("Sudo"),
-          "plDescription" => _("Sudo role"),
-          "plSelfModify"  => FALSE,
-          "plDepends"     => array(),
-          "plPriority"    => 0,
-          "plSection"     => array("administration"),
-          "plCategory"    => array("sudo" => array("objectClass" => "sudoRole", "description" => _("Sudo role"))),
-
-          "plProvidedAcls"    => array(
-            "accessTo"          => _("System trust"),
-            "cn"                => _("Name"),
-            "description"       => _("Description"),
-            "sudoUser"          => _("Users"),
-            "sudoHost"          => _("Host"),
-            "sudoCommand"       => _("Command"),
-            "sudoRunAs"         => _("Run as user"),
-            "trustModel"        => _("Access control list"))
-        ));
-  }
-
-
-  /*! \brief  This function will be called if an object gets copied.
-              This function adapts attributes from the source object.
+     */
+    static function plInfo()
+    {
+        return (array(  
+                    "plShortName" => _("Sudo"),
+                    "plDescription" => _("Sudo role"),
+                    "plSelfModify"  => FALSE,
+                    "plDepends"     => array(),
+                    "plPriority"    => 0,
+                    "plSection"     => array("administration"),
+                    "plCategory"    => array("sudo" => array("objectClass" => "sudoRole", "description" => _("Sudo role"))),
+
+                    "plProvidedAcls"    => array(
+                        "accessTo"          => _("System trust"),
+                        "cn"                => _("Name"),
+                        "description"       => _("Description"),
+                        "sudoUser"          => _("Users"),
+                        "sudoHost"          => _("Host"),
+                        "sudoCommand"       => _("Command"),
+                        "sudoRunAs"         => _("Run as user"),
+                        "trustModel"        => _("Access control list"))
+                    ));
+    }
+
+
+    /*! \brief  This function will be called if an object gets copied.
+      This function adapts attributes from the source object.
       @param  Array The source object.
-   */
-  function PrepareForCopyPaste($source)
-  {
-    plugin::PrepareForCopyPaste($source);
-    foreach(array("sudoUser","sudoCommand","sudoHost","sudoRunAs") as $attr){
-      $this->$attr = array();
-      if(isset($source[$attr])){
-        $tmp = array();
-        for($i = 0 ; $i < $source[$attr]['count']; $i++){
-          $tmp[] = $source[$attr][$i];
-        }
-        $this->$attr = $tmp;
-      }
+     */
+    function PrepareForCopyPaste($source)
+    {
+        plugin::PrepareForCopyPaste($source);
+        foreach(array("sudoUser","sudoCommand","sudoHost","sudoRunAs") as $attr){
+            $this->$attr = array();
+            if(isset($source[$attr])){
+                $tmp = array();
+                for($i = 0 ; $i < $source[$attr]['count']; $i++){
+                    $tmp[] = $source[$attr][$i];
+                }
+                $this->$attr = $tmp;
+            }
+        }
+
+        /* Is this account a trustAccount? */
+        if (isset($source['trustModel'])){
+            $this->trustModel= $source['trustModel'][0];
+            $this->was_trust_account= TRUE;
+        } else {
+            $this->was_trust_account= FALSE;
+            $this->trustModel= "";
+        }
+
+        $this->accessTo = array();
+        if (isset($source['accessTo'])){
+            for ($i= 0; $i<$source['accessTo']['count']; $i++){
+                $tmp= $source['accessTo'][$i];
+                $this->accessTo[$tmp]= $tmp;
+            }
+        }
     }
 
-    /* Is this account a trustAccount? */
-    if (isset($source['trustModel'])){
-      $this->trustModel= $source['trustModel'][0];
-      $this->was_trust_account= TRUE;
-    } else {
-      $this->was_trust_account= FALSE;
-      $this->trustModel= "";
+
+    /*! \brief  Used for copy & paste.
+      Returns a HTML input mask, which allows to change the cn of this entry.
+      @param  Array   Array containing current status && a HTML template.              
+     */
+    function getCopyDialog()
+    {
+        $vars = array("cn");
+        $smarty = get_smarty();
+        $smarty->assign("cn", htmlentities($this->cn));
+        $str = $smarty->fetch(get_template_path("paste_generic.tpl",TRUE));
+        $ret = array();
+        $ret['string'] = $str;
+        $ret['status'] = "";
+        return($ret);
     }
 
-    $this->accessTo = array();
-    if (isset($source['accessTo'])){
-      for ($i= 0; $i<$source['accessTo']['count']; $i++){
-        $tmp= $source['accessTo'][$i];
-        $this->accessTo[$tmp]= $tmp;
-      }
+
+    public function get_cn()
+    {
+        return($this->cn);
     }
-  }
 
 
-  /*! \brief  Used for copy & paste.
-              Returns a HTML input mask, which allows to change the cn of this entry.
-      @param  Array   Array containing current status && a HTML template.              
-   */
-  function getCopyDialog()
-  {
-    $vars = array("cn");
-    $smarty = get_smarty();
-    $smarty->assign("cn", htmlentities($this->cn));
-    $str = $smarty->fetch(get_template_path("paste_generic.tpl",TRUE));
-    $ret = array();
-    $ret['string'] = $str;
-    $ret['status'] = "";
-    return($ret);
-  }
-
-
-  public function get_cn()
-  {
-    return($this->cn);
-  }
-
-
-  /*! \brief  Used for copy & paste.
-              Some entries must be renamed to avaoid duplicate entries.
-   */
-  function saveCopyDialog()
-  {
-    if(isset($_POST['cn'])){
-      $this->cn = get_post('cn');
+    /*! \brief  Used for copy & paste.
+      Some entries must be renamed to avaoid duplicate entries.
+     */
+    function saveCopyDialog()
+    {
+        if(isset($_POST['cn'])){
+            $this->cn = get_post('cn');
+        }
     }
-  }
 }
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>