sFriendlyName = _kt("Permission Restrictions"); $this->sDescription = _kt("Prevents users who do not have the specified permission from using this transition."); } // override the allow transition hook. function allowTransition($oDocument, $oUser) { if (!$this->isLoaded()) { return true; } // the actual permissions are stored in the array. foreach ($this->aConfig['perms'] as $sPermName) { $oPerm = KTPermission::getByName($sPermName); if (PEAR::isError($oPerm)) { continue; // possible loss of referential integrity, just ignore it for now. } $res = KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oDocument); if (!$res) { return false; } } return true; } function displayConfiguration($args) { // permissions $aPermissions = KTPermission::getList(); $aKeyPermissions = array(); foreach ($aPermissions as $oPermission) { $aKeyPermissions[$oPermission->getName()] = $oPermission; } $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/workflowtriggers/permissions"); $aTemplateData = array( "context" => $this, "perms" => $aKeyPermissions, 'args' => $args, ); return $oTemplate->render($aTemplateData); } function saveConfiguration() { $perms = KTUtil::arrayGet($_REQUEST, 'trigger_perms', array()); if (!is_array($perms)) { $perms = (array) $perms; } $aFinalPerms = array(); foreach ($perms as $sPermName => $ignore) { $oPerm = KTPermission::getByName($sPermName); if (!PEAR::isError($oPerm)) { $aFinalPerms[] = $sPermName; } } $config = array(); $config['perms'] = $aFinalPerms; $this->oTriggerInstance->setConfig($config); $res = $this->oTriggerInstance->update(); return $res; } function getConfigDescription() { if (!$this->isLoaded()) { return _kt('This trigger has no configuration.'); } // the actual permissions are stored in the array. $perms = array(); if (empty($this->aConfig) || is_null($this->aConfig['perms'])) { return _kt('No permissions are required to perform this transition'); } foreach ($this->aConfig['perms'] as $sPermName) { $oPerm = KTPermission::getByName($sPermName); if (!PEAR::isError($oPerm)) { $perms[] = $oPerm->getHumanName(); } } if (empty($perms)) { return _kt('No permissions are required to perform this transition'); } $perm_string = implode(', ', $perms); return sprintf(_kt('The following permissions are required: %s'), $perm_string); } } class RoleGuardTrigger extends KTWorkflowTrigger { var $sNamespace = 'ktcore.workflowtriggers.roleguard'; var $sFriendlyName; var $sDescription; var $oTriggerInstance; var $aConfig = array(); // generic requirements - both can be true var $bIsGuard = true; var $bIsAction = false; function RoleGuardTrigger() { $this->sFriendlyName = _kt("Role Restrictions"); $this->sDescription = _kt("Prevents users who do not have the specified role from using this transition."); } // override the allow transition hook. function allowTransition($oDocument, $oUser) { if (!$this->isLoaded()) { return true; } $iRoleId = $this->aConfig['role_id']; $oRole = Role::get($this->aConfig['role_id']); if (PEAR::isError($oRole)) { return true; // fail safe for cases where the role is deleted. } if ($iRoleId) { $bHaveRole = false; // handle the magic roles if ($iRoleId == -3) { // everyone: just accept $bHaveRole = true; } else if (($iRoleId == -4) && !$oUser->isAnonymous()) { // authenticated $bHaveRole = true; } else { $oRoleAllocation = DocumentRoleAllocation::getAllocationsForDocumentAndRole($oDocument->getId(), $iRoleId); if ($oRoleAllocation == null) { // no role allocation on the doc - check the folder. $oRoleAllocation = RoleAllocation::getAllocationsForFolderAndRole($oDocument->getParentID(), $iRoleId); } // if that's -also- null if ($oRoleAllocation == null) { // no role allocation, no fulfillment. $bHaveRole = false; } else if ($oRoleAllocation->hasMember($oUser)) { $bHaveRole = false; } } if (!$bHaveRole) { continue; } } return true; } function displayConfiguration($args) { // permissions $aKeyedRoles = array(); $aRoles = Role::getList(); foreach ($aRoles as $oRole) { $aKeyedRoles[$oRole->getId()] = $oRole->getName(); } $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/workflowtriggers/roles"); $aTemplateData = array( "context" => $this, "roles" => $aKeyedRoles, "current_role" => KTUtil::arrayGet($this->aConfig, 'role_id'), 'args' => $args, ); return $oTemplate->render($aTemplateData); } function saveConfiguration() { $role_id = KTUtil::arrayGet($_REQUEST, 'role_id', null); $oRole = Role::get($role_id); if (PEAR::isError($oRole)) { // silenty ignore $role_id = null; // $_SESSION['ktErrorMessages'][] = _kt('Unable to use the role you specified.'); } $config = array(); $config['role_id'] = $role_id; $this->oTriggerInstance->setConfig($config); $res = $this->oTriggerInstance->update(); return $res; } function getConfigDescription() { if (!$this->isLoaded()) { return _kt('This trigger has no configuration.'); } // the actual permissions are stored in the array. $perms = array(); if (empty($this->aConfig) || is_null($this->aConfig['role_id'])) { return _kt('No role is required to perform this transition'); } $oRole = Role::get($this->aConfig['role_id']); if (PEAR::isError($oRole)) { return _kt('The role required for this trigger has been deleted, so anyone can perform this action.'); } else { return sprintf(_kt("The user will require the %s role."), htmlentities($oRole->getName(), ENT_NOQUOTES, 'UTF-8')); } } } class GroupGuardTrigger extends KTWorkflowTrigger { var $sNamespace = 'ktcore.workflowtriggers.groupguard'; var $sFriendlyName; var $sDescription; var $oTriggerInstance; var $aConfig = array(); // generic requirements - both can be true var $bIsGuard = true; var $bIsAction = false; function GroupGuardTrigger() { $this->sFriendlyName = _kt("Group Restrictions"); $this->sDescription = _kt("Prevents users who are not members of the specified group from using this transition."); } // override the allow transition hook. function allowTransition($oDocument, $oUser) { if (!$this->isLoaded()) { return true; } $iGroupId = $this->aConfig['group_id']; $oGroup = Group::get($this->aConfig['group_id']); if (PEAR::isError($oGroup)) { return true; // fail safe for cases where the role is deleted. } $res = KTGroupUtil::getMembershipReason($oUser, $oGroup); if (PEAR::isError($res) || is_empty($res)) { // broken setup, or no reason return false; } else { return true; } } function displayConfiguration($args) { // permissions $aKeyedGroups = array(); $aGroups = Group::getList(); foreach ($aGroups as $oGroup) { $aKeyedGroups[$oGroup->getId()] = $oGroup->getName(); } $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/workflowtriggers/group"); $aTemplateData = array( "context" => $this, "groups" => $aKeyedGroups, "current_group" => KTUtil::arrayGet($this->aConfig, 'group_id'), 'args' => $args, ); return $oTemplate->render($aTemplateData); } function saveConfiguration() { $group_id = KTUtil::arrayGet($_REQUEST, 'group_id', null); $oGroup = Group::get($group_id); if (PEAR::isError($oGroup)) { // silenty ignore $group_id = null; // $_SESSION['ktErrorMessages'][] = _kt('Unable to use the group you specified.'); } $config = array(); $config['group_id'] = $group_id; $this->oTriggerInstance->setConfig($config); $res = $this->oTriggerInstance->update(); return $res; } function getConfigDescription() { if (!$this->isLoaded()) { return _kt('This trigger has no configuration.'); } // the actual permissions are stored in the array. $perms = array(); if (empty($this->aConfig) || is_null($this->aConfig['group_id'])) { return _kt('No group is required to perform this transition'); } $oGroup = Group::get($this->aConfig['group_id']); if (PEAR::isError($oGroup)) { return _kt('The group required for this trigger has been deleted, so anyone can perform this action.'); } else { return sprintf(_kt("The user must be a member of the group \"%s\"."), htmlentities($oGroup->getName(), ENT_NOQUOTES, 'UTF-8')); } } } class ConditionGuardTrigger extends KTWorkflowTrigger { var $sNamespace = 'ktcore.workflowtriggers.conditionguard'; var $sFriendlyName; var $sDescription; var $oTriggerInstance; var $aConfig = array(); // generic requirements - both can be true var $bIsGuard = true; var $bIsAction = false; function ConditionGuardTrigger() { $this->sFriendlyName = _kt("Conditional Restrictions"); $this->sDescription = _kt("Prevents this transition from occuring if the condition specified is not met for the document."); } // override the allow transition hook. function allowTransition($oDocument, $oUser) { if (!$this->isLoaded()) { return true; } $iConditionId = $this->aConfig['condition_id']; $oCondition = KTSavedSearch::get($this->aConfig['condition_id']); if (PEAR::isError($oCondition)) { return true; // fail safe for cases where the role is deleted. } return KTSearchUtil::testConditionOnDocument($iConditionId, $oDocument); } function displayConfiguration($args) { // permissions $aKeyedConditions = array(); $aConditions = KTSavedSearch::getConditions(); foreach ($aConditions as $oCondition) { $aKeyedConditions[$oCondition->getId()] = $oCondition->getName(); } $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/workflowtriggers/condition"); $aTemplateData = array( "context" => $this, "conditions" => $aKeyedConditions, "current_group" => KTUtil::arrayGet($this->aConfig, 'group_id'), 'args' => $args, ); return $oTemplate->render($aTemplateData); } function saveConfiguration() { $condition_id = KTUtil::arrayGet($_REQUEST, 'condition_id', null); $oCondition = KTSavedSearch::get($condition_id); if (PEAR::isError($oCondition)) { // silenty ignore $condition_id = null; // $_SESSION['ktErrorMessages'][] = _kt('Unable to use the group you specified.'); } $config = array(); $config['condition_id'] = $condition_id; $this->oTriggerInstance->setConfig($config); $res = $this->oTriggerInstance->update(); return $res; } function getConfigDescription() { if (!$this->isLoaded()) { return _kt('This trigger has no configuration.'); } // the actual permissions are stored in the array. $perms = array(); if (empty($this->aConfig) || is_null($this->aConfig['condition_id'])) { return _kt('No condition must be fulfilled before this transition becomes available.'); } $oCondition = KTSavedSearch::get($this->aConfig['condition_id']); if (PEAR::isError($oCondition)) { return _kt('The condition required for this trigger has been deleted, so it is always available.'); } else { return sprintf(_kt("The document must match condition \"%s\"."), htmlentities($oCondition->getName(), ENT_NOQUOTES, 'UTF-8')); } } } ?>