X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_plugin.inc;h=ba5c715c72d8504c21f5a1e96a026576399a1f80;hb=f04b7b95f6468a806353f05cdd3faf97dd744d5c;hp=1b45db134f9d88a81b8c7421af14293805132468;hpb=ab0535e5c7d3059d33a6a8c1b1600f3f98eeed3a;p=gosa.git diff --git a/gosa-core/include/class_plugin.inc b/gosa-core/include/class_plugin.inc index 1b45db134..ba5c715c7 100644 --- a/gosa-core/include/class_plugin.inc +++ b/gosa-core/include/class_plugin.inc @@ -145,6 +145,9 @@ class plugin */ function plugin (&$config, $dn= NULL, $object= NULL) { + + $this->initTime = microtime(TRUE); + /* Configuration is fine, allways */ $this->config= &$config; $this->dn= $dn; @@ -161,6 +164,10 @@ class plugin } } + // 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; @@ -282,6 +289,10 @@ class plugin 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 Removes object from parent @@ -319,6 +330,13 @@ class plugin /* $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)); + } } @@ -334,15 +352,13 @@ class plugin /* Save values to object */ foreach ($this->attributes as $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. @@ -400,6 +416,45 @@ class plugin /* 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; + } } @@ -466,7 +521,7 @@ class plugin } /* Find hooks entries for this class */ - $command = $this->config->configRegistry->getPropertyValue(get_class($plugin),"check"); + $command = $this->config->configRegistry->getPropertyValue(get_class($this),"check"); if ($command != ""){ if (!check_command($command)){ @@ -860,7 +915,7 @@ class plugin // 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", 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){ @@ -876,7 +931,7 @@ class plugin } // Migrate rfc groups if needed - $groups = get_sub_list("(&(objectClass=posixGroup)(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){ @@ -887,7 +942,7 @@ class plugin } /* 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); + $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){ @@ -915,6 +970,11 @@ class plugin 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. @@ -942,7 +1002,10 @@ class plugin 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){ @@ -1137,7 +1200,9 @@ class plugin } - /*! \brief Return plugin informations for acl handling */ + /*! \brief Return plugin informations for acl handling + * See class_core.inc for examples. + */ static function plInfo() { return array(); @@ -1442,12 +1507,7 @@ class plugin 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; } @@ -1523,11 +1583,11 @@ class plugin * Replaces placeholder by class values of this plugin instance. * @param Allows to a add special replacements. */ - static function callHook($plugin, $cmd, $addAttrs= array()) + static function callHook($plugin, $cmd, $addAttrs= array(), &$returnOutput = array(), &$returnCode = NULL) { global $config; $command = $config->configRegistry->getPropertyValue(get_class($plugin),$cmd); - + if ($command != ""){ // Walk trough attributes list and add the plugins attributes. @@ -1539,6 +1599,7 @@ class plugin $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(); @@ -1574,14 +1635,22 @@ class plugin } if (check_command($command)){ + @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command,"Execute"); - exec($command,$arr); - if(is_array($arr)){ + exec($command, $arr, $returnCode); + $returnOutput = $arr; + + if($returnCode != 0){ + $str = implode("\n",$arr); + @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execution failed code: ".$returnCode); + $message= msgPool::cmdexecfailed($cmd,$command, get_class($plugin)); + msg_dialog::display(_("Error"), $message, ERROR_DIALOG); + }elseif(is_array($arr)){ $str = implode("\n",$arr); @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$str); } } else { - $message= msgPool::cmdnotfound("POSTCREATE", get_class($plugin)); + $message= msgPool::cmdinvalid($cmd,$command, get_class($plugin)); msg_dialog::display(_("Error"), $message, ERROR_DIALOG); } }