index 52b3235c510b5db49fffb57cc8b1fd79c3084134..0180a8529a50fc25e108417911f1fecfdd84d9ad 100644 (file)
*/
class plugin
-{
+{
+ /*! \brief The title shown in path menu while this plugin is visible.
+ */
+ var $pathTitle = "";
+
/*!
\brief Reference to parent object
\param dn Distinguished name to initialize plugin from
\sa plugin()
*/
- function plugin (&$config, $dn= NULL, $parent= NULL)
+ function plugin (&$config, $dn= NULL, $object= NULL)
{
+
+ $this->initTime = microtime(TRUE);
+
/* Configuration is fine, allways */
$this->config= &$config;
$this->dn= $dn;
+ // Ensure that we've a valid acl_category set.
+ if(empty($this->acl_category)){
+ $tmp = $this->plInfo();
+ if (isset($tmp['plCategory'])) {
+ $c = key($tmp['plCategory']);
+ if(is_numeric($c)){
+ $c = $tmp['plCategory'][0];
+ }
+ $this->acl_category = $c."/";
+ }
+ }
+
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'open',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+
/* Handle new accounts, don't read information from LDAP */
if ($dn == "new"){
return;
if ($dn !== NULL){
/* Load data to 'attrs' and save 'dn' */
- if ($parent !== NULL){
- $this->attrs= $parent->attrs;
+ if ($object !== NULL){
+ $this->attrs= $object->attrs;
} else {
$ldap= $this->config->get_ldap_link();
$ldap->cat ($dn);
}
- /*! \brief execute plugin
-
- Generates the html output for this node
+ /*! \brief Generates the html output for this node
*/
function execute()
{
session::set('LOCK_VARS_TO_USE',array());
session::set('LOCK_VARS_USED_GET',array());
session::set('LOCK_VARS_USED_POST',array());
+ session::set('LOCK_VARS_USED_REQUEST',array());
+
+ pathNavigator::registerPlugin($this);
+
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'view',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
}
- /*! \brief execute plugin
- Removes object from parent
+ /*! \brief Removes object from parent
*/
function remove_from_parent()
{
/*
$ldap->modify($this->attrs);
*/
+ if($this->initially_was_account){
+ $this->handle_pre_events('remove');
+
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'remove',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+ }
}
- /*! \brief Save HTML posted data to object
+ /*! \brief Save HTML posted data to object
*/
function save_object()
{
/* Save values to object */
foreach ($this->attributes as $val){
- if ($this->acl_is_writeable($val) && isset ($_POST["$val"])){
+ if (isset ($_POST["$val"]) && $this->acl_is_writeable($val)){
+
/* Check for modifications */
- if (get_magic_quotes_gpc()) {
- $data= stripcslashes($_POST["$val"]);
- } else {
- $data= $this->$val = $_POST["$val"];
- }
+ $data= get_post($val);
if ($this->$val != $data){
$this->is_modified= TRUE;
}
+ $this->$val = $data;
/* Okay, how can I explain this fix ...
* In firefox, disabled option fields aren't selectable ... but in IE you can select these fileds.
}
- /* Save data to LDAP, depending on is_account we save or delete */
+ /*! \brief Save data to LDAP, depending on is_account we save or delete */
function save()
{
/* include global link_info */
/* Handle tagging */
$this->tag_attrs($this->attrs);
+
+ if($this->is_new){
+ $this->handle_pre_events('add');
+
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'create',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+ }else{
+ $this->handle_pre_events('modify');
+
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'modify',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+ }
+ }
+
+
+ /*! \brief Forward command execution requests
+ * to the hook execution method.
+ */
+ function handle_pre_events($mode, $addAttrs= array())
+ {
+ if(!in_array($mode, array('add','remove','modify'))){
+ trigger_error(sprintf("Invalid pre event type given %s! Valid types are [add,modify,remove].", $mode));
+ return;
+ }
+ switch ($mode){
+ case "add":
+ plugin::callHook($this,"PRECREATE", $addAttrs);
+ break;
+
+ case "modify":
+ plugin::callHook($this,"PREMODIFY", $addAttrs);
+ break;
+
+ case "remove":
+ plugin::callHook($this,"PREREMOVE", $addAttrs);
+ break;
+ }
}
}
}
- /* Check formular input */
+ /*! \brief Check formular input */
function check()
{
$message= array();
}
/* Find hooks entries for this class */
- $command= $this->config->search(get_class($this), "CHECK", array('menu', 'tabs'));
-
+ $command = $this->config->configRegistry->getPropertyValue(get_class($this),"check");
if ($command != ""){
if (!check_command($command)){
$current_csn = getEntryCSN($this->dn);
if($current_csn != $this->entryCSN && !empty($this->entryCSN) && !empty($current_csn)){
$this->entryCSN = $current_csn;
- $message[] = _("The object has changed since opened in GOsa. All changes that may be done by others get lost if you save this entry!");
+ $message[] = _("The current object has been altered while beeing edited. If you save this entry, changes that have been made by others will be discarded!");
}
}
return ($message);
$ldap->cat ($dn);
$this->attrs= $ldap->fetch();
- /* Walk through attributes */
- foreach ($this->attributes as $val){
+ $values = array();
+ foreach(array('uid','sn','givenName') as $name){
+ if(isset($this->parent->$name)){
+ $value = $this->parent->$name;
+ if(is_numeric($name)) continue;
+ if(is_string($value)) $values[$name] = $value;
+ if(is_array($value) && isset($value[0])) $values[$name] = $value[0];
+ }
+ }
- /* Skip the ones in skip list */
- if (in_array($val, $skip)){
- continue;
- }
+ foreach($this->attributes as $name){
- if (isset($this->attrs["$val"][0])){
+ // Skip the ones in skip list
+ if (in_array($name, $skip)) continue;
+ if (!isset($this->attrs[$name]['count'])) continue;
- /* If attribute is set, replace dynamic parts:
- %sn, %givenName and %uid. Fill these in our local variables. */
- $value= $this->attrs["$val"][0];
+ $value= $this->attrs[$name][0];
- foreach (array("sn", "givenName", "uid") as $repl){
- if (preg_match("/%$repl/i", $value)){
- $value= preg_replace ("/%$repl/i", $this->parent->$repl, $value);
- }
+ if($this->attrs[$name]['count'] == 1){
+ $value = fillReplacements($this->attrs[$name][0], $values);
+ }else{
+ $value = array();
+ for($i=0;$i<$this->attrs[$name]['count'];$i++){
+ $value[] = fillReplacements($this->attrs[$name][$i], $values);
+ }
}
- $this->$val= $value;
- }
+ $this->$name = $value;
}
/* Is Account? */
$found= TRUE;
foreach ($this->objectclasses as $obj){
- if (preg_match('/top/i', $obj)){
- continue;
- }
+ if (preg_match('/top/i', $obj)) continue;
if (!in_array_ics ($obj, $this->attrs['objectClass'])){
$found= FALSE;
break;
}
}
- if ($found){
- $this->is_account= TRUE;
- }
+ $this->is_account = $found;
}
- /* Indicate whether a password change is needed or not */
+ /* \brief Indicate whether a password change is needed or not */
function password_change_needed()
{
return FALSE;
}
- /* Show header message for tab dialogs */
+ /*! \brief Show header message for tab dialogs */
function show_enable_header($button_text, $text, $disabled= FALSE)
{
if (($disabled == TRUE) || (!$this->acl_is_createable())){
} else {
$state= "";
}
- $display= "<table summary=\"\" width=\"100%\"><tr>\n<td colspan=2><p><b>$text</b></p>\n";
- $display.= "<input type=submit value=\"$button_text\" name=\"modify_state\" ".$state.
- "><p class=\"seperator\"> </p></td></tr></table>";
+ $display = "<div class='plugin-enable-header'>\n";
+ $display.= "<p>$text</p>\n";
+ $display.= "<button type='submit' name=\"modify_state\" ".$state.">$button_text</button>\n";
+ $display.= "</div>\n";
return($display);
}
- /* Show header message for tab dialogs */
+ /*! \brief Show header message for tab dialogs */
function show_disable_header($button_text, $text, $disabled= FALSE)
{
if (($disabled == TRUE) || !$this->acl_is_removeable()){
} else {
$state= "";
}
- $display= "<table summary=\"\" width=\"100%\"><tr>\n<td colspan=2><p><b>$text</b></p>\n";
- $display.= "<input type=submit value=\"$button_text\" name=\"modify_state\" ".$state.
- "><p class=\"seperator\"> </p></td></tr></table>";
-
+ $display = "<div class='plugin-disable-header'>\n";
+ $display.= "<p>$text</p>\n";
+ $display.= "<button type='submit' name=\"modify_state\" ".$state.">$button_text</button>\n";
+ $display.= "</div>\n";
return($display);
}
- /* Show header message for tab dialogs */
- function show_header($button_text, $text, $disabled= FALSE)
- {
- echo "FIXME: show_header should be replaced by show_disable_header and show_enable_header<br>";
- if ($disabled == TRUE){
- $state= "disabled";
- } else {
- $state= "";
- }
- $display= "<table summary=\"\" width=\"100%\"><tr>\n<td colspan=2><p><b>$text</b></p>\n";
- $display.= "<input type=submit value=\"$button_text\" name=\"modify_state\" ".
- ($this->acl_is_createable()?'':'disabled')." ".$state.
- "><p class=\"seperator\"> </p></td></tr></table>";
- return($display);
- }
-
-
- function postcreate($add_attrs= array())
+ /* Create unique DN */
+ function create_unique_dn2($data, $base)
{
- /* Find postcreate entries for this class */
- $command= $this->config->search(get_class($this), "POSTCREATE",array('menu', 'tabs'));
-
- if ($command != ""){
-
- /* Walk through attribute list */
- foreach ($this->attributes as $attr){
- if (!is_array($this->$attr)){
- $add_attrs[$attr] = $this->$attr;
- }
- }
- $add_attrs['dn']=$this->dn;
-
- $tmp = array();
- foreach($add_attrs as $name => $value){
- $tmp[$name] = strlen($name);
- }
- arsort($tmp);
-
- /* Additional attributes */
- foreach ($tmp as $name => $len){
- $value = $add_attrs[$name];
- $command= str_replace("%$name", "$value", $command);
- }
+ $ldap= $this->config->get_ldap_link();
+ $base= preg_replace("/^,*/", "", $base);
- if (check_command($command)){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $command, "Execute");
- exec($command,$arr);
- foreach($arr as $str){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $command, "Result: ".$str);
- }
- } else {
- $message= msgPool::cmdnotfound("POSTCREATE", get_class($this));
- msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
- }
+ /* Try to use plain entry first */
+ $dn= "$data,$base";
+ $attribute= preg_replace('/=.*$/', '', $data);
+ $ldap->cat ($dn, array('dn'));
+ if (!$ldap->fetch()){
+ return ($dn);
}
- }
- function postmodify($add_attrs= array())
- {
- /* Find postcreate entries for this class */
- $command= $this->config->search(get_class($this), "POSTMODIFY",array('menu','tabs'));
-
- if ($command != ""){
-
- /* Walk through attribute list */
- foreach ($this->attributes as $attr){
- if (!is_array($this->$attr)){
- $add_attrs[$attr] = $this->$attr;
- }
- }
- $add_attrs['dn']=$this->dn;
-
- $tmp = array();
- foreach($add_attrs as $name => $value){
- $tmp[$name] = strlen($name);
- }
- arsort($tmp);
-
- /* Additional attributes */
- foreach ($tmp as $name => $len){
- $value = $add_attrs[$name];
- $command= str_replace("%$name", "$value", $command);
+ /* Look for additional attributes */
+ foreach ($this->attributes as $attr){
+ if ($attr == $attribute || $this->$attr == ""){
+ continue;
}
- if (check_command($command)){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command, "Execute");
- exec($command,$arr);
- foreach($arr as $str){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $command, "Result: ".$str);
- }
- } else {
- $message= msgPool::cmdnotfound("POSTMODIFY", get_class($this));
- msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ $dn= "$data+$attr=".$this->$attr.",$base";
+ $ldap->cat ($dn, array('dn'));
+ if (!$ldap->fetch()){
+ return ($dn);
}
}
- }
-
- function postremove($add_attrs= array())
- {
- /* Find postremove entries for this class */
- $command= $this->config->search(get_class($this), "POSTREMOVE",array('menu','tabs'));
- if ($command != ""){
-
- /* Walk through attribute list */
- foreach ($this->attributes as $attr){
- if (!is_array($this->$attr)){
- $add_attrs[$attr] = $this->$attr;
- }
- }
- $add_attrs['dn']=$this->dn;
-
- $tmp = array();
- foreach($add_attrs as $name => $value){
- $tmp[$name] = strlen($name);
- }
- arsort($tmp);
-
- /* Additional attributes */
- foreach ($tmp as $name => $len){
- $value = $add_attrs[$name];
- $command= str_replace("%$name", "$value", $command);
- }
-
- if (check_command($command)){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $command, "Execute");
- exec($command,$arr);
- foreach($arr as $str){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,
- $command, "Result: ".$str);
- }
- } else {
- $message= msgPool::cmdnotfound("POSTREMOVE", get_class($this));
- msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
- }
- }
+ /* None found */
+ return ("none");
}
- /* Create unique DN */
+
+ /*! \brief Create unique DN */
function create_unique_dn($attribute, $base)
{
$ldap= $this->config->get_ldap_link();
return ("none");
}
+
function rebind($ldap, $referral)
{
$credentials= LDAP::get_credentials($referral, $this->config->current['REFERRAL']);
/* FAIvariable=.../..., cn=..
could not be saved, because the attribute FAIvariable was different to
the dn FAIvariable=..., cn=... */
+
+ if(!is_array($new['objectClass'])) $new['objectClass'] = array($new['objectClass']);
+
if(in_array_ics("FAIdebconfInfo",$new['objectClass'])){
$new['FAIvariable'] = $ldap->fix($new['FAIvariable']);
}
- /*! \brief Move a given ldap object indentified by $src_dn \
- to the given destination $dst_dn \
- * Ensure that all references are updated (ogroups) \
- * Update ACLs \
- * Update accessTo \
- @param String The source dn.
- @param String The destination dn.
- @return Boolean TRUE on success else FALSE.
+ /*! \brief Rename/Move a given src_dn to the given dest_dn
+ *
+ * Move a given ldap object indentified by $src_dn to the
+ * given destination $dst_dn
+ *
+ * - Ensure that all references are updated (ogroups)
+ * - Update ACLs
+ * - Update accessTo
+ *
+ * \param string 'src_dn' the source DN.
+ * \param string 'dst_dn' the destination DN.
+ * \return boolean TRUE on success else FALSE.
*/
function rename($src_dn, $dst_dn)
{
$ldap->cd($this->config->current['BASE']);
$ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$dst_dn));
if (!$ldap->rename_dn($src_dn,$dst_dn)){
-# msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $src_dn, "", get_class()));
- new log("debug","Ldap Protocol v3 implementation error, ldap_rename failed, falling back to manual copy.","FROM: $src_dn -- TO: $dst_dn",array(),$ldap->get_error());
+ new log("debug","LDAP protocol v3 implementation error, ldap_rename failed, falling back to manual copy.","FROM: $src_dn -- TO: $dst_dn",array(),$ldap->get_error());
@DEBUG(DEBUG_LDAP,__LINE__,__FUNCTION__,__FILE__,"Rename failed FROM: $src_dn -- TO: $dst_dn",
"Ldap Protocol v3 implementation error, falling back to maunal method.");
return(FALSE);
array("dn","objectClass"),GL_SUBSEARCH | GL_NO_ACL_CHECK);
foreach($leaf_objs as $obj){
$new_dn = $obj['dn'];
- $old_dn = preg_replace("/".preg_quote($dst_dn, '/')."$/i",$src_dn,$new_dn);
+ $old_dn = preg_replace("/".preg_quote(LDAP::convert($dst_dn), '/')."$/i",$src_dn,LDAP::convert($new_dn));
$this->update_acls($old_dn,$new_dn);
}
// Migrate objectgroups if needed
- $ogroups = get_sub_list("(&(objectClass=gosaGroupOfNames)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","ogroups", array(get_ou("ogroupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+ $ogroups = get_sub_list("(&(objectClass=gosaGroupOfNames)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))",
+ "ogroups", array(get_ou("group", "ogroupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
// Walk through all objectGroups
foreach($ogroups as $ogroup){
// Migrate old to new dn
$o_ogroup= new ogroup($this->config,$ogroup['dn']);
- unset($o_ogroup->member[$src_dn]);
+ if (isset($o_ogroup->member[$src_dn])) {
+ unset($o_ogroup->member[$src_dn]);
+ }
$o_ogroup->member[$dst_dn]= $dst_dn;
// Save object group
$o_ogroup->save();
}
+ // Migrate objectgroups if needed
+ $objects = get_sub_list("(&(objectClass=gotoEnvironment)(gotoHotplugDeviceDN=".LDAP::prepare4filter(LDAP::fix($src_dn))."))",
+ "users",array(get_ou("core","userRDN"), get_ou("core","groupRDN")),
+ $this->config->current['BASE'],array("dn", "gotoHotplugDeviceDN"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+ $ldap = $this->config->get_ldap_link();
+ foreach($objects as $obj){
+ $deviceDNS = array();
+ for($i=0; $i < $obj["gotoHotplugDeviceDN"]['count']; $i++){
+ $odn = $obj["gotoHotplugDeviceDN"][$i];
+ if($odn == $src_dn){
+ $odn = $dst_dn;
+ }
+ $deviceDNS[] = $odn;
+ }
+ $ldap->cd($obj['dn']);
+ $ldap->modify(array('gotoHotplugDeviceDN'=>$deviceDNS));
+ if(!$ldap->success()){
+ trigger_error(sprintf("Failed to update gotoHotplugDeviceDN for %s: %s", bold($obj['dn']), $ldap->get_error()));
+ }
+ }
+
// Migrate rfc groups if needed
- $groups = get_sub_list("(&(objectClass=posixGroups)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","groups", array(get_ou("groupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+ $groups = get_sub_list("(&(objectClass=posixGroup)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","groups", array(get_ou("core", "groupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
// Walk through all POSIX groups
foreach($groups as $group){
+
// Migrate old to new dn
$o_group= new group($this->config,$group['dn']);
- unset($o_group->member[$src_dn]);
- $o_group->member[$dst_dn]= $dst_dn;
-
- // Save object group
$o_group->save();
}
/* Update roles to use the new entry dn */
- $roles = get_sub_list("(&(objectClass=organizationalRole)(roleOccupant=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","roles", array(get_ou("roleRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
-
- // Walk through all roles
- foreach($roles as $role){
- $role = new roleGeneric($this->config,$role['dn']);
- $key= array_search($src_dn, $role->roleOccupant);
- if($key !== FALSE){
- $role->roleOccupant[$key] = $dst_dn;
- $role->save();
+ if(class_available('roleGeneric')){
+ $roles = get_sub_list("(&(objectClass=organizationalRole)(roleOccupant=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","roles", array(get_ou("roleGeneric", "roleRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+
+ // Walk through all roles
+ foreach($roles as $role){
+ $role = new roleGeneric($this->config,$role['dn']);
+ $key= array_search($src_dn, $role->roleOccupant);
+ if($key !== FALSE){
+ $role->roleOccupant[$key] = $dst_dn;
+ $role->save();
+ }
+ }
+ }
+
+ // Update 'manager' attributes from gosaDepartment and inetOrgPerson
+ $filter = "(&(objectClass=inetOrgPerson)(manager=".LDAP::prepare4filter(LDAP::fix($src_dn))."))";
+ $ocs = $ldap->get_objectclasses();
+ if(isset($ocs['gosaDepartment']['MAY']) && in_array('manager', $ocs['gosaDepartment']['MAY'])){
+ $filter = "(|".$filter."(&(objectClass=gosaDepartment)(manager=".LDAP::prepare4filter(LDAP::fix($src_dn)).")))";
+ }
+ $leaf_deps= get_list($filter,array("all"),$this->config->current['BASE'],
+ array("manager","dn","objectClass"),GL_SUBSEARCH | GL_NO_ACL_CHECK);
+ foreach($leaf_deps as $entry){
+ $update = array('manager' => $dst_dn);
+ $ldap->cd($entry['dn']);
+ $ldap->modify($update);
+ if(!$ldap->success()){
+ trigger_error(sprintf("Failed to update manager for %s: %s", bold($entry['dn']), $ldap->get_error()));
}
}
+
+ // Migrate 'dyn-groups' here. labeledURIObject
+ if(class_available('DynamicLdapGroup')) {
+ DynamicLdapGroup::moveDynGroup($this->config,$src_dn,$dst_dn);
+ }
/* Check if there are gosa departments moved.
If there were deps moved, the force reload of config->deps.
}
-
+
function move($src_dn, $dst_dn)
{
/* Do not copy if only upper- lowercase has changed */
return(TRUE);
}
-
+ // Create statistic table entry
+ stats::log('plugin', $class = get_class($this), $category = array($this->acl_category), $action = 'move',
+ $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+
/* Try to move the entry instead of copy & delete
*/
if(TRUE){
}
- /* Move/Rename complete trees */
+ /* \brief Move/Rename complete trees */
function recursive_move($src_dn, $dst_dn)
{
/* Check if the destination entry exists */
}
- function handle_post_events($mode, $add_attrs= array())
- {
- switch ($mode){
- case "add":
- $this->postcreate($add_attrs);
- break;
-
- case "modify":
- $this->postmodify($add_attrs);
- break;
-
- case "remove":
- $this->postremove($add_attrs);
- break;
- }
- }
-
-
function saveCopyDialog(){
}
}
+ /*! \brief Prepare for Copy & Paste */
function PrepareForCopyPaste($source)
{
$todo = $this->attributes;
if (isset($source[$var])){
if(isset($source[$var]['count'])){
if($source[$var]['count'] > 1){
- $this->$var = array();
- $tmp = array();
- for($i = 0 ; $i < $source[$var]['count']; $i++){
- $tmp = $source[$var][$i];
- }
+ $tmp= $source[$var];
+ unset($tmp['count']);
$this->$var = $tmp;
}else{
$this->$var = $source[$var][0];
}
}
- function tag_attrs(&$at, $dn= "", $tag= "", $show= false)
- {
- /* Skip tagging?
+ /*! \brief Get gosaUnitTag for the given DN
If this is called from departmentGeneric, we have to skip this
tagging procedure.
- */
+ */
+ function tag_attrs(&$at, $dn= "", $tag= "", $show= false)
+ {
+ /* Skip tagging? */
if($this->skipTagging){
return;
}
}
}
}
-
+
+ /*! \brief Add unit tag */
/* Remove tags that may already be here... */
remove_objectClass("gosaAdministrativeUnitTag", $at);
if (isset($at['gosaUnitTag'])){
}
- /* Add possibility to stop remove process */
+ /*! \brief Test for removability of the object
+ *
+ * Allows testing of conditions for removal of object. If removal should be aborted
+ * the function needs to remove an error message.
+ * */
function allow_remove()
{
$reason= "";
}
- /* Create a snapshot of the current object */
- function create_snapshot($type= "snapshot", $description= array())
- {
-
- /* Check if snapshot functionality is enabled */
- if(!$this->snapshotEnabled()){
- return;
- }
-
- /* Get configuration from gosa.conf */
- $config = $this->config;
-
- /* Create lokal ldap connection */
- $ldap= $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
-
- /* check if there are special server configurations for snapshots */
- if($config->get_cfg_value("snapshotURI") == ""){
-
- /* Source and destination server are both the same, just copy source to dest obj */
- $ldap_to = $ldap;
- $snapldapbase = $this->config->current['BASE'];
-
- }else{
- $server = $config->get_cfg_value("snapshotURI");
- $user = $config->get_cfg_value("snapshotAdminDn");
- $password = $this->config->get_credentials($config->get_cfg_value("snapshotAdminPassword"));
- $snapldapbase = $config->get_cfg_value("snapshotBase");
-
- $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server));
- $ldap_to -> cd($snapldapbase);
-
- if (!$ldap_to->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class()));
- }
-
- }
-
- /* check if the dn exists */
- if ($ldap->dn_exists($this->dn)){
-
- /* Extract seconds & mysecs, they are used as entry index */
- list($usec, $sec)= explode(" ", microtime());
-
- /* Collect some infos */
- $base = $this->config->current['BASE'];
- $snap_base = $config->get_cfg_value("snapshotBase");
- $base_of_object = preg_replace ('/^[^,]+,/i', '', $this->dn);
- $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base;
-
- /* Create object */
-#$data = preg_replace('/^dn:.*\n/', '', $ldap->gen_ldif($this->dn,"(!(objectClass=gosaDepartment))"));
- $data = $ldap->gen_ldif($this->dn,"(&(!(objectClass=gosaDepartment))(!(objectClass=FAIclass)))");
- $newName = str_replace(".", "", $sec."-".$usec);
- $target= array();
- $target['objectClass'] = array("top", "gosaSnapshotObject");
- $target['gosaSnapshotData'] = gzcompress($data, 6);
- $target['gosaSnapshotType'] = $type;
- $target['gosaSnapshotDN'] = $this->dn;
- $target['description'] = $description;
- $target['gosaSnapshotTimestamp'] = $newName;
-
- /* Insert the new snapshot
- But we have to check first, if the given gosaSnapshotTimestamp
- is already used, in this case we should increment this value till there is
- an unused value. */
- $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base;
- $ldap_to->cat($new_dn);
- while($ldap_to->count()){
- $ldap_to->cat($new_dn);
- $newName = str_replace(".", "", $sec."-".($usec++));
- $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base;
- $target['gosaSnapshotTimestamp'] = $newName;
- }
-
- /* Inset this new snapshot */
- $ldap_to->cd($snapldapbase);
- $ldap_to->create_missing_trees($snapldapbase);
- $ldap_to->create_missing_trees($new_base);
- $ldap_to->cd($new_dn);
- $ldap_to->add($target);
- if (!$ldap_to->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $new_dn, LDAP_ADD, get_class()));
- }
-
- if (!$ldap->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $new_base, "", get_class()));
- }
-
- }
- }
-
- function remove_snapshot($dn)
- {
- $ui = get_userinfo();
- $old_dn = $this->dn;
- $this->dn = $dn;
- $ldap = $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $ldap->rmdir_recursive($this->dn);
- if(!$ldap->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn));
- }
- $this->dn = $old_dn;
- }
-
-
- /* returns true if snapshots are enabled, and false if it is disalbed
- There will also be some errors psoted, if the configuration failed */
+ /*! \brief Test if snapshotting is enabled
+ *
+ * Test weither snapshotting is enabled or not. There will also be some errors posted,
+ * if the configuration failed
+ * \return TRUE if snapshots are enabled, and FALSE if it is disabled
+ */
function snapshotEnabled()
{
- return $this->config->snapshotEnabled();
+ return $this->config->snapshotEnabled();
}
- /* Return available snapshots for the given base
+ /*! \brief Return plugin informations for acl handling
+ * See class_core.inc for examples.
*/
- function Available_SnapsShots($dn,$raw = false)
- {
- if(!$this->snapshotEnabled()) return(array());
-
- /* Create an additional ldap object which
- points to our ldap snapshot server */
- $ldap= $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $cfg= &$this->config->current;
-
- /* check if there are special server configurations for snapshots */
- if($this->config->get_cfg_value("snapshotURI") == ""){
- $ldap_to = $ldap;
- }else{
- $server = $this->config->get_cfg_value("snapshotURI");
- $user = $this->config->get_cfg_value("snapshotAdminDn");
- $password = $this->config->get_credentials($this->config->get_cfg_value("snapshotAdminPassword"));
- $snapldapbase = $this->config->get_cfg_value("snapshotBase");
- $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server));
- $ldap_to -> cd($snapldapbase);
- if (!$ldap_to->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class()));
- }
- }
-
- /* Prepare bases and some other infos */
- $base = $this->config->current['BASE'];
- $snap_base = $this->config->get_cfg_value("snapshotBase");
- $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn);
- $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base;
- $tmp = array();
-
- /* Fetch all objects with gosaSnapshotDN=$dn */
- $ldap_to->cd($new_base);
- $ldap_to->ls("(&(objectClass=gosaSnapshotObject)(gosaSnapshotDN=".$dn."))",$new_base,
- array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description"));
-
- /* Put results into a list and add description if missing */
- while($entry = $ldap_to->fetch()){
- if(!isset($entry['description'][0])){
- $entry['description'][0] = "";
- }
- $tmp[] = $entry;
- }
-
- /* Return the raw array, or format the result */
- if($raw){
- return($tmp);
- }else{
- $tmp2 = array();
- foreach($tmp as $entry){
- $tmp2[base64_encode($entry['dn'])] = $entry['description'][0];
- }
- }
- return($tmp2);
- }
-
-
- function getAllDeletedSnapshots($base_of_object,$raw = false)
- {
- if(!$this->snapshotEnabled()) return(array());
-
- /* Create an additional ldap object which
- points to our ldap snapshot server */
- $ldap= $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $cfg= &$this->config->current;
-
- /* check if there are special server configurations for snapshots */
- if($this->config->get_cfg_value("snapshotURI") == ""){
- $ldap_to = $ldap;
- }else{
- $server = $this->config->get_cfg_value("snapshotURI");
- $user = $this->config->get_cfg_value("snapshotAdminDn");
- $password = $this->config->get_credentials($this->config->get_cfg_value("snapshotAdminPassword"));
- $snapldapbase = $this->config->get_cfg_value("snapshotBase");
- $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server));
- $ldap_to -> cd($snapldapbase);
- if (!$ldap_to->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class()));
- }
- }
-
- /* Prepare bases */
- $base = $this->config->current['BASE'];
- $snap_base = $this->config->get_cfg_value("snapshotBase");
- $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base;
-
- /* Fetch all objects and check if they do not exist anymore */
- $ui = get_userinfo();
- $tmp = array();
- $ldap_to->cd($new_base);
- $ldap_to->ls("(objectClass=gosaSnapshotObject)",$new_base,array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description"));
- while($entry = $ldap_to->fetch()){
-
- $chk = str_replace($new_base,"",$entry['dn']);
- if(preg_match("/,ou=/",$chk)) continue;
-
- if(!isset($entry['description'][0])){
- $entry['description'][0] = "";
- }
- $tmp[] = $entry;
- }
-
- /* Check if entry still exists */
- foreach($tmp as $key => $entry){
- $ldap->cat($entry['gosaSnapshotDN'][0]);
- if($ldap->count()){
- unset($tmp[$key]);
- }
- }
-
- /* Format result as requested */
- if($raw) {
- return($tmp);
- }else{
- $tmp2 = array();
- foreach($tmp as $key => $entry){
- $tmp2[base64_encode($entry['dn'])] = $entry['description'][0];
- }
- }
- return($tmp2);
- }
-
-
- /* Restore selected snapshot */
- function restore_snapshot($dn)
- {
- if(!$this->snapshotEnabled()) return(array());
-
- $ldap= $this->config->get_ldap_link();
- $ldap->cd($this->config->current['BASE']);
- $cfg= &$this->config->current;
-
- /* check if there are special server configurations for snapshots */
- if($this->config->get_cfg_value("snapshotURI") == ""){
- $ldap_to = $ldap;
- }else{
- $server = $this->config->get_cfg_value("snapshotURI");
- $user = $this->config->get_cfg_value("snapshotAdminDn");
- $password = $this->config->get_credentials($this->config->get_cfg_value("snapshotAdminPassword"));
- $snapldapbase = $this->config->get_cfg_value("snapshotBase");
- $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server));
- $ldap_to -> cd($snapldapbase);
- if (!$ldap_to->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class()));
- }
- }
-
- /* Get the snapshot */
- $ldap_to->cat($dn);
- $restoreObject = $ldap_to->fetch();
-
- /* Prepare import string */
- $data = gzuncompress($ldap_to->get_attribute($dn,'gosaSnapshotData'));
-
- /* Import the given data */
- $err = "";
- $ldap->import_complete_ldif($data,$err,false,false);
- if (!$ldap->success()){
- msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $dn, "", get_class()));
- }
- }
-
-
- function showSnapshotDialog($base,$baseSuffixe,&$parent)
- {
- $once = true;
- $ui = get_userinfo();
- $this->parent = $parent;
-
- foreach($_POST as $name => $value){
-
- /* Create a new snapshot, display a dialog */
- if(preg_match("/^CreateSnapShotDialog_[^_]*_[xy]$/",$name) && $once){
-
- $entry = base64_decode(preg_replace("/^CreateSnapShotDialog_([^_]*)_[xy]$/","\\1",$name));
- $once = false;
- $entry = preg_replace("/^CreateSnapShotDialog_/","",$entry);
-
- if(!empty($entry) && $ui->allow_snapshot_create($entry,$this->parent->acl_module)){
- $this->snapDialog = new SnapShotDialog($this->config,$entry,$this);
- }else{
- msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to create a snapshot for %s."),$entry),ERROR_DIALOG);
- }
- }
-
- /* Restore a snapshot, display a dialog with all snapshots of the current object */
- if(preg_match("/^RestoreSnapShotDialog_/",$name) && $once){
- $once = false;
- $entry = base64_decode(preg_replace("/^RestoreSnapShotDialog_([^_]*)_[xy]$/i","\\1",$name));
- if(!empty($entry) && $ui->allow_snapshot_restore($this->dn,$this->parent->acl_module)){
- $this->snapDialog = new SnapShotDialog($this->config,$entry,$this);
- $this->snapDialog->display_restore_dialog = true;
- }else{
- msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$entry),ERROR_DIALOG);
- }
- }
-
- /* Restore one of the already deleted objects */
- if(((isset($_POST['menu_action']) && $_POST['menu_action'] == "RestoreDeletedSnapShot")
- || preg_match("/^RestoreDeletedSnapShot_/",$name)) && $once){
- $once = false;
-
- if($ui->allow_snapshot_restore($this->dn,$this->parent->acl_module)){
- $this->snapDialog = new SnapShotDialog($this->config,"",$this);
- $this->snapDialog->set_snapshot_bases($baseSuffixe);
- $this->snapDialog->display_restore_dialog = true;
- $this->snapDialog->display_all_removed_objects = true;
- }else{
- msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$base),ERROR_DIALOG);
- }
- }
-
- /* Restore selected snapshot */
- if(preg_match("/^RestoreSnapShot_/",$name) && $once){
- $once = false;
- $entry = base64_decode(preg_replace("/^RestoreSnapShot_([^_]*)_[xy]$/i","\\1",$name));
-
- if(!empty($entry) && $ui->allow_snapshot_restore($this->dn,$this->parent->acl_module)){
- $this->restore_snapshot($entry);
- $this->snapDialog = NULL;
- }else{
- msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$entry),ERROR_DIALOG);
- }
- }
- }
-
- /* Create a new snapshot requested, check
- the given attributes and create the snapshot*/
- if(isset($_POST['CreateSnapshot']) && is_object($this->snapDialog)){
- $this->snapDialog->save_object();
- $msgs = $this->snapDialog->check();
- if(count($msgs)){
- foreach($msgs as $msg){
- msg_dialog::display(_("Error"), $msg, ERROR_DIALOG);
- }
- }else{
- $this->dn = $this->snapDialog->dn;
- $this->create_snapshot("snapshot",$this->snapDialog->CurrentDescription);
- $this->snapDialog = NULL;
- }
- }
-
- /* Restore is requested, restore the object with the posted dn .*/
- if((isset($_POST['RestoreSnapshot'])) && (isset($_POST['SnapShot']))){
- }
-
- if(isset($_POST['CancelSnapshot'])){
- $this->snapDialog = NULL;
- }
-
- if(is_object($this->snapDialog )){
- $this->snapDialog->save_object();
- return($this->snapDialog->execute());
- }
- }
-
-
static function plInfo()
{
return array();
function set_acl_base($base)
{
+ @DEBUG (DEBUG_ACL, __LINE__, __FUNCTION__, __FILE__,"<b>".$base."</b>","<b>ACL-Base:</b> ");
$this->acl_base= $base;
}
function set_acl_category($category)
{
+ @DEBUG (DEBUG_ACL, __LINE__, __FUNCTION__, __FILE__,"<b>".$category."</b>(/".get_class($this).")","<b>ACL-Category:</b> ");
$this->acl_category= "$category/";
}
}
- /*! \brief Returns a list of all available departments for this object.
- If this object is new, all departments we are allowed to create a new user in are returned.
- If this is an existing object, return all deps. we are allowed to move tis object too.
-
- @return Array [dn] => "..name" // All deps. we are allowed to act on.
+ /*! \brief Returns a list of all available departments for this object.
+ *
+ * If this object is new, all departments we are allowed to create a new user in
+ * are returned. If this is an existing object, return all deps.
+ * We are allowed to move tis object too.
+ * \return array [dn] => "..name" // All deps. we are allowed to act on.
*/
function get_allowed_bases()
{
/* This function updates ACL settings if $old_dn was used.
- * $old_dn specifies the actually used dn
- * $new_dn specifies the destiantion dn
+ * \param string 'old_dn' specifies the actually used dn
+ * \param string 'new_dn' specifies the destiantion dn
*/
function update_acls($old_dn,$new_dn,$output_changes = FALSE)
{
$ui = session::global_get('ui');
if($ui->dn == $old_dn){
$ui->dn = $new_dn;
+ $ui->loadACL();
session::global_set('ui',$ui);
new log("view","acl/".get_class($this),$this->dn,array(),"Updated current object dn from '".$old_dn."' to '".$new_dn."'");
}
$acls = array();
$found = false;
for($i = 0 ; $i < $attrs['gosaAclEntry']['count'] ; $i ++ ){
- $acl_parts = split(":",$attrs['gosaAclEntry'][$i]);
+ $acl_parts = explode(":",$attrs['gosaAclEntry'][$i]);
/* Roles uses antoher data storage order, members are stored int the third part,
while the members in direct ACL assignments are stored in the second part.
/* Acls for this object must be adjusted */
if($found){
- $debug_info= _("Changing ACL dn")." : <br> -"._("from")." <b> ".
- $old_dn."</b><br> -"._("to")." <b>".$new_dn."</b><br>";
+ $debug_info= sprintf(_("Changing ACL DN from %s to %s"), bold($old_dn), bold($new_dn));
@DEBUG (DEBUG_ACL, __LINE__, __FUNCTION__, __FILE__,$debug_info,"ACL");
$update[$attrs['dn']] =array();
- /* This function enables the entry Serial ID check.
- * If an entry was edited while we have edited the entry too,
- * an error message will be shown.
+ /*! \brief Enable the Serial ID check
+ *
+ * This function enables the entry Serial ID check. If an entry was edited while
+ * we have edited the entry too, an error message will be shown.
* To configure this check correctly read the FAQ.
*/
function enable_CSN_check()
/*! \brief Prepares the plugin to be used for multiple edit
* Update plugin attributes with given array of attribtues.
- * @param array Array with attributes that must be updated.
+ * \param array Array with attributes that must be updated.
*/
function init_multiple_support($attrs,$all)
{
/*! \brief Returns all values that have been modfied in multiple edit mode.
- @return array Cotaining all mdofied values.
+ \return array Cotaining all modified values.
*/
function get_multi_edit_values()
{
}
- /*! \brief execute plugin
-
- Generates the html output for this node
- */
+ /*! \brief Generates the html output for this node for multi edit*/
function multiple_execute()
{
/* This one is empty currently. Fabian - please fill in the docu code */
/* Reset Lock message POST/GET check array, to prevent perg_match errors*/
session::set('LOCK_VARS_TO_USE',array());
- session::set('LOCK_VARS_USED',array());
+ session::set('LOCK_VARS_USED_GET',array());
+ session::set('LOCK_VARS_USED_POST',array());
+ session::set('LOCK_VARS_USED_REQUEST',array());
return("Multiple edit is currently not implemented for this plugin.");
}
- /*! \brief Save HTML posted data to object for multiple edit
+ /*! \brief Save HTML posted data to object for multiple edit
*/
function multiple_save_object()
{
$this->multi_boxes[] = $val;
}
- if ($this->acl_is_writeable($val) && isset ($_POST["$val"])){
+ if (isset ($_POST["$val"]) && $this->acl_is_writeable($val)){
- /* Check for modifications */
- if (get_magic_quotes_gpc()) {
- $data= stripcslashes($_POST["$val"]);
- } else {
- $data= $this->$val = $_POST["$val"];
- }
+ $data= $this->$val = get_post($val);
if ($this->$val != $data){
$this->is_modified= TRUE;
}
}
- /*! \brief Returns all attributes of this plugin,
+ /*! \brief Returns all attributes of this plugin,
to be able to detect multiple used attributes
in multi_plugg::detect_multiple_used_attributes().
@return array Attributes required for intialization of multi_plug
/*! \brief Check given values in multiple edit
- @return array Error messages
+ \return array Error messages
*/
function multiple_check()
{
return($message);
}
-
- /*! \brief Returns the snapshot header part for "Actions" menu in management dialogs
- @param $layer_menu
- */
- function get_snapshot_header($base,$category)
+ function get_used_snapshot_bases()
{
- $str = "";
- $ui = get_userinfo();
- if($this->snapshotEnabled() && $ui->allow_snapshot_restore($base,$category)){
-
- $ok = false;
- foreach($this->get_used_snapshot_bases() as $base){
- $ok |= count($this->getAllDeletedSnapshots($base)) >= 1 ;
- }
+ return(array());
+ }
- if($ok){
- $str = "..|<img class='center' src='images/lists/restore.png' ".
- "alt='"._("Restore")."'> "._("Restore"). "|RestoreDeletedSnapShot|\n";
- }else{
- $str = "..|<img class='center' src='images/lists/restore_grey.png' alt=''> "._("Restore")."||\n";
- }
- }
- return($str);
+ function is_modal_dialog()
+ {
+ return(isset($this->dialog) && $this->dialog);
}
- function get_snapshot_action($base,$category)
+ /*! \brief Forward command execution requests
+ * to the hook execution method.
+ */
+ function handle_post_events($mode, $addAttrs= array())
{
- $str= "";
- $ui = get_userinfo();
- if($this->snapshotEnabled()){
- if ($ui->allow_snapshot_restore($base,$category)){
-
- if(count($this->Available_SnapsShots($base))){
- $str.= "<input class='center' type='image' src='images/lists/restore.png'
- alt='"._("Restore snapshot")."' name='RestoreSnapShotDialog_".base64_encode($base)."' title='"._("Restore snapshot")."'> ";
- } else {
- $str = "<img class='center' src='images/lists/restore_grey.png' alt=''> ";
- }
- }
- if($ui->allow_snapshot_create($base,$category)){
- $str.= "<input class='center' type='image' src='images/snapshot.png'
- alt='"._("Create snapshot")."' name='CreateSnapShotDialog_".base64_encode($base)."'
- title='"._("Create a new snapshot from this object")."'> ";
- }else{
- $str = "<img class='center' src='images/empty.png' alt=' '> ";
- }
+ if(!in_array($mode, array('add','remove','modify'))){
+ trigger_error(sprintf("Invalid post event type given %s! Valid types are [add,modify,remove].", bold($mode)));
+ return;
}
+ switch ($mode){
+ case "add":
+ plugin::callHook($this,"POSTCREATE", $addAttrs);
+ break;
- return($str);
+ case "modify":
+ plugin::callHook($this,"POSTMODIFY", $addAttrs);
+ break;
+
+ case "remove":
+ plugin::callHook($this,"POSTREMOVE", $addAttrs);
+ break;
+ }
}
- function get_copypaste_action($base,$category,$class,$copy = TRUE, $cut = TRUE)
+ /*! \brief Calls external hooks which are defined for this plugin (gosa.conf)
+ * Replaces placeholder by class values of this plugin instance.
+ * @param Allows to a add special replacements.
+ */
+ static function callHook($plugin, $cmd, $addAttrs= array(), &$returnOutput = array(),
+ &$returnCode = NULL, &$errorOutput = array(), $displayErrors = TRUE)
{
- $ui = get_userinfo();
- $action = "";
- if($this->CopyPasteHandler){
- if($cut){
- if($ui->is_cutable($base,$category,$class)){
- $action .= "<input class='center' type='image'
- src='images/lists/cut.png' alt='"._("cut")."' name='cut_%KEY%' title='"._("Cut this entry")."'> ";
- }else{
- $action.="<img src='images/empty.png' alt=' ' class='center'> ";
- }
- }
- if($copy){
- if($ui->is_copyable($base,$category,$class)){
- $action.= "<input class='center' type='image'
- src='images/lists/copy.png' alt='"._("copy")."' name='copy_%KEY%' title='"._("Copy this entry")."'> ";
- }else{
- $action.="<img src='images/empty.png' alt=' ' class='center'> ";
- }
- }
- }
+ global $config;
+ $command = $config->configRegistry->getPropertyValue(get_class($plugin),$cmd);
- return($action);
- }
+ $returnCode = 0; // Simulate a return code to tell the caller that everythin is fine.
+ $returnOutput = array();
+ $arr = array();
+ if (!empty($command)){
- function get_copypaste_header($base,$category,$copy = TRUE, $cut = TRUE)
- {
- $s = "";
- $ui =get_userinfo();
+ // Walk trough attributes list and add the plugins attributes.
+ foreach ($plugin->attributes as $attr){
+ if (!is_array($plugin->$attr)){
+ $addAttrs[$attr] = $plugin->$attr;
+ }
+ }
+ $ui = get_userinfo();
+ $addAttrs['callerDN']=$ui->dn;
+ $addAttrs['dn']=$plugin->dn;
+ $addAttrs['location']=$config->current['NAME'];
+
+ // Sort attributes by length, ensures correct replacement
+ $tmp = array();
+ foreach($addAttrs as $name => $value){
+ $tmp[$name] = strlen($name);
+ }
+ arsort($tmp);
+
+ // Now replace the placeholder
+ $command = fillReplacements($command, $addAttrs, TRUE);
+
+ // If there are still some %.. in our command, try to fill these with some other class vars
+ if(preg_match("/%/",$command)){
+ $attrs = get_object_vars($plugin);
+ foreach($attrs as $name => $value){
+ if(is_array($value)){
+ $s = "";
+ foreach($value as $val){
+ if(is_string($val) || is_int($val) || is_float($val) || is_bool($val)){
+ $s .= '"'.$val.'",';
+ }
+ }
+ $value = '['.trim($s,',').']';
+ }
+ if(!is_string($value) && !is_int($value) && !is_float($value) && !is_bool($value)){
+ continue;
+ }
+ $command= preg_replace("/%$name/", escapeshellarg($value), $command);
+ }
+ }
- if(!is_array($category)){
- $category = array($category);
- }
+ if (check_command($command)){
- /* Check permissions for each category, if there is at least one category which
- support read or paste permissions for the given base, then display the specific actions.
- */
- $readable = $pasteable = false;
- foreach($category as $cat){
- $readable= $readable || preg_match('/r/', $ui->get_category_permissions($base, $cat));
- $pasteable= $pasteable || $ui->is_pasteable($base, $cat) == 1;
- }
-
- if(($cut || $copy) && isset($this->CopyPasteHandler) && is_object($this->CopyPasteHandler)){
- if($readable){
- $s.= "..|---|\n";
- if($copy){
- $s.= "..|<img src='images/lists/copy.png' alt='' border='0' class='center'>".
- " "._("Copy")."|"."multiple_copy_systems|\n";
- }
- if($cut){
- $s.= "..|<img src='images/lists/cut.png' alt='' border='0' class='center'>".
- " "._("Cut")."|"."multiple_cut_systems|\n";
- }
- }
+ // Create list of process pipes
+ $descriptorspec = array(
+ 0 => array("pipe", "r"), // stdin
+ 1 => array("pipe", "w"), // stdout
+ 2 => array("pipe", "w")); // stderr
- if($pasteable){
- if($this->CopyPasteHandler->entries_queued()){
- $img = "<img border='0' class='center' src='images/lists/paste.png' alt=''>";
- $s.="..|".$img." "._("Paste")."|editPaste|\n";
- }else{
- $img = "<img border='0' class='center' src='images/lists/paste-grey.png' alt=''>";
- $s.="..|".$img." "._("Paste")."\n";
- }
- }
- }
- return($s);
- }
+ // Try to open the process
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command,"Execute");
+ $process = proc_open($command, $descriptorspec, $pipes);
+ if (is_resource($process)) {
+ // Write the password to stdin
+ // fwrite($pipes[0], $pwd);
+ fclose($pipes[0]);
- function get_used_snapshot_bases()
- {
- return(array());
- }
+ // Get results from stdout and stderr
+ $arr = stream_get_contents($pipes[1]);
+ $err = stream_get_contents($pipes[2]);
+ fclose($pipes[1]);
- function is_modal_dialog()
- {
- return(isset($this->dialog) && $this->dialog);
+ // Close the process and check its return value
+ $returnCode = proc_close($process);
+ $returnOutput = preg_split("/\n/", $arr,0,PREG_SPLIT_NO_EMPTY);
+ $errorOutput = preg_split("/\n/",$err,0,PREG_SPLIT_NO_EMPTY);
+ }
+
+ if($returnCode != 0){
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execution failed code: ".$returnCode);
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$err);
+ if($displayErrors){
+ $message= msgPool::cmdexecfailed($cmd,$command, get_class($plugin));
+ msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ }
+ }elseif(is_array($arr)){
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$arr);
+ }
+ } elseif($displayErrors) {
+ $message= msgPool::cmdinvalid($cmd,$command, get_class($plugin));
+ msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ }
+ }
}
}