permissions.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 643 行 · 第 1/2 页

SVN-BASE
643
字号
<?php/** * $Id$ * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/>. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * Contributor( s): ______________________________________ */require_once(KT_LIB_DIR . '/actions/folderaction.inc.php');require_once(KT_LIB_DIR . '/permissions/permission.inc.php');require_once(KT_LIB_DIR . '/permissions/permissionutil.inc.php');require_once(KT_LIB_DIR . '/browse/browseutil.inc.php');require_once(KT_LIB_DIR . '/foldermanagement/folderutil.inc.php');require_once(KT_LIB_DIR . '/roles/Role.inc');class KTFolderPermissionsAction extends KTFolderAction {    var $sName = 'ktcore.actions.folder.permissions';    var $_sEditShowPermission = 'ktcore.permissions.security';    var $_sShowPermission = 'ktcore.permissions.security';    var $_bAdminAlwaysAvailable = true;    var $bAutomaticTransaction = true;    function getDisplayName() {        return _kt('Permissions');    }    function do_main() {        $this->oPage->setBreadcrumbDetails(_kt('Permissions'));        $oTemplate = $this->oValidator->validateTemplate('ktcore/folder/view_permissions');        $oPO = KTPermissionObject::get($this->oFolder->getPermissionObjectID());        $aPermissions = KTPermission::getList();        $aMapPermissionGroup = array();        $aMapPermissionRole = array();        $aMapPermissionUser = array();        $aAllGroups = Group::getList();   // probably small enough        $aAllRoles = Role::getList();     // probably small enough.        // users are _not_ fetched this way.        $aActiveGroups = array();        $aActiveUsers = array();        $aActiveRoles = array();        foreach ($aPermissions as $oPermission) {            $oPLA = KTPermissionAssignment::getByPermissionAndObject($oPermission, $oPO);            if (PEAR::isError($oPLA)) {                continue;            }            $oDescriptor = KTPermissionDescriptor::get($oPLA->getPermissionDescriptorID());            $iPermissionID = $oPermission->getID();            $aIDs = $oDescriptor->getGroups();            $aMapPermissionGroup[$iPermissionID] = array();            foreach ($aIDs as $iID) {                $aMapPermissionGroup[$iPermissionID][$iID] = true;                $aActiveGroups[$iID] = true;            }            $aIds = $oDescriptor->getRoles();            $aMapPermissionRole[$iPermissionID] = array();            foreach ($aIds as $iId) {                $aMapPermissionRole[$iPermissionID][$iId] = true;                $aActiveRoles[$iId] = true;            }            $aIds = $oDescriptor->getUsers();            $aMapPermissionUser[$iPermissionID] = array();            foreach ($aIds as $iId) {                $aMapPermissionUser[$iPermissionID][$iId] = true;                $aActiveUsers[$iId] = true;            }        }        // now we constitute the actual sets.        $users = array();        $groups = array();        $roles = array(); // should _always_ be empty, barring a bug in permissions::updatePermissionLookup        // this should be quite limited - direct role -> user assignment is typically rare.        foreach ($aActiveUsers as $id => $marker) {            $oUser = User::get($id);            if (is_null($oUser)) continue; // this is just a patch in case there is a db integrity issue.            $users[$oUser->getName()] = $oUser;        }        asort($users); // ascending, per convention.        foreach ($aActiveGroups as $id => $marker) {            $oGroup = Group::get($id);            if (is_null($oGroup)) continue; // this is just a patch in case there is a db integrity issue.            $groups[$oGroup->getName()] = $oGroup;        }        asort($groups);        foreach ($aActiveRoles as $id => $marker) {            $oRole = Role::get($id);            if (is_null($oRole)) continue; // this is just a patch in case there is a db integrity issue.            $roles[$oRole->getName()] = $oRole;        }        asort($roles);        $bEdit = KTPermissionUtil::userHasPermissionOnItem($this->oUser, $this->_sEditShowPermission, $this->oFolder);        if (KTBrowseUtil::inAdminMode($this->oUser, $this->oFolder)) {            $bEdit = true;        }        $sInherited = '';        $oInherited = KTPermissionUtil::findRootObjectForPermissionObject($oPO);        // This is fine, since a folder can only inherit permissions        // from a folder.        if ($oInherited->getId() !== $this->oFolder->getId()) {            $iInheritedFolderId = $oInherited->getId();            $sInherited = join(' > ', $oInherited->getPathArray());        }        // only allow inheritance if not inherited, -and- folders is editable        $bInheritable = $bEdit && ($oInherited->getId() !== $this->oFolder->getId());        // only allow edit if the folder is editable.        $bEdit = $bEdit && ($oInherited->getId() == $this->oFolder->getId());        $aConditions = array();        $aDynConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO);        foreach ($aDynConditions as $oDynCondition) {            $g = Group::get($oDynCondition->getGroupId());			if (is_null($g)) continue; // db integrity catch            if (PEAR::isError($g)) { continue; }            $c = KTSavedSearch::get($oDynCondition->getConditionId());            if (is_null($c)) continue; // db integrity catch            if (PEAR::isError($c)) { continue; }            $aInfo = array(                'group' => $g->getName(),                'name' => $c->getName(),            );            $aAssign = $oDynCondition->getAssignment();            $perms = array();            foreach ($aAssign as $iPermissionId) {                $perms[$iPermissionId] = true;            }            $aInfo['perms'] = $perms;            $aConditions[] = $aInfo;        }        $aTemplateData = array(            'context' => $this,            'permissions' => $aPermissions,            'groups' => $groups,            'users' => $users,            'roles' => $roles,            'oFolder' => $this->oFolder,            'aMapPermissionGroup' => $aMapPermissionGroup,            'aMapPermissionRole' => $aMapPermissionRole,            'aMapPermissionUser' => $aMapPermissionUser,            'edit' => $bEdit,            'inheritable' => $bInheritable,            'inherited' => $sInherited,            'conditions' => $aConditions,        );        return $oTemplate->render($aTemplateData);    }    function do_resolved_users() {        $this->oPage->setBreadcrumbDetails(_kt('Permissions'));        $oTemplate = $this->oValidator->validateTemplate('ktcore/folder/resolved_permissions_user');        $oPL = KTPermissionLookup::get($this->oFolder->getPermissionLookupID());        $aPermissions = KTPermission::getList();        $aMapPermissionGroup = array();        $aMapPermissionRole = array();        $aMapPermissionUser = array();        $aActiveUsers = array();        $aUsers = User::getList();        foreach ($aPermissions as $oPermission) {            $oPLA = KTPermissionLookupAssignment::getByPermissionAndLookup($oPermission, $oPL);            if (PEAR::isError($oPLA)) {                continue;            }            $oDescriptor =& KTPermissionDescriptor::get($oPLA->getPermissionDescriptorID());            $iPermissionID = $oPermission->getID();            $aMapPermissionGroup[$iPermissionID] = array();            $hasPermission = false;			$everyone = $oDescriptor->hasRoles(array(-3));			$authenticated = $oDescriptor->hasRoles(array(-4));			// TODO : paginate this page, when there are too many users			foreach ($aUsers as $oUser) {				if ($everyone || ($authenticated && $oUser->isAnonymous()) ||					KTPermissionUtil::userHasPermissionOnItem($oUser, $oPermission, $this->oFolder)){					$aMapPermissionUser[$iPermissionID][$oUser->getId()] = true;					$aActiveUsers[$oUser->getId()] = $oUser->getName();				}             }        }        // now we constitute the actual sets.        $users = array();        $groups = array();        $roles = array(); // should _always_ be empty, barring a bug in permissions::updatePermissionLookup        $users = $aActiveUsers;        asort($users); // ascending, per convention.        $bEdit = false;        $sInherited = '';        $aTemplateData = array(            'context' => $this,            'permissions' => $aPermissions,            'groups' => $groups,            'users' => $users,            'roles' => $roles,            'oFolder' => $this->oFolder,            'aMapPermissionGroup' => $aMapPermissionGroup,            'aMapPermissionRole' => $aMapPermissionRole,            'aMapPermissionUser' => $aMapPermissionUser,            'edit' => $bEdit,            'inherited' => $sInherited,            'foldername' => $this->oFolder->getName(),            'iFolderId' => $this->oFolder->getId(),        );        return $oTemplate->render($aTemplateData);    }    function _copyPermissions() {        $oTransaction = KTFolderTransaction::createFromArray(array(            'folderid' => $this->oFolder->getId(),            'comment' => _kt('Override permissions from parent'),            'transactionNS' => 'ktcore.transactions.permissions_change',            'userid' => $_SESSION['userID'],            'ip' => Session::getClientIP(),        ));        $aOptions = array(            'defaultmessage' => _kt('Error updating permissions'),            'redirect_to' => array('edit', sprintf('fFolderId=%d', $this->oFolder->getId())),        );        $this->oValidator->notErrorFalse($oTransaction, $aOptions);        KTPermissionUtil::copyPermissionObject($this->oFolder);    }    function do_edit() {        $this->oPage->setBreadcrumbDetails(_kt('Viewing Permissions'));        $oPO = KTPermissionObject::get($this->oFolder->getPermissionObjectId());	$aOptions = array('redirect_to' => array('main', 'fFolderId=' .  $this->oFolder->getId()));        if (!KTBrowseUtil::inAdminMode($this->oUser, $this->oFolder)) {            $this->oValidator->userHasPermissionOnItem($this->oUser, $this->_sEditShowPermission, $this->oFolder, $aOptions);        }    	// copy permissions if they were inherited        $oInherited = KTPermissionUtil::findRootObjectForPermissionObject($oPO);        if ($oInherited->getId() !== $this->oFolder->getId()) {            $override = KTUtil::arrayGet($_REQUEST, 'override', false);            if (empty($override)) {                $this->errorRedirectToMain(_kt('This folder does not override its permissions'), sprintf('fFolderId=%d', $this->oFolder->getId()));            }            $this->startTransaction();    	    $this->_copyPermissions();            $this->commitTransaction();            $oPO = KTPermissionObject::get($this->oFolder->getPermissionObjectId());        }	// permissions in JS format	$aPermissionsToJSON = array();	$aPermList = KTPermission::getList();	foreach($aPermList as $oP) {	    $aPermissionsToJSON[] = array('id'=>$oP->getId(), 'name'=>$oP->getHumanName());	}	$oJSON = new Services_JSON;	$sJSONPermissions = $oJSON->encode($aPermissionsToJSON);	// dynamic conditions        $aDynamicConditions = KTPermissionDynamicCondition::getByPermissionObject($oPO);	// templating        $oTemplating =& KTTemplating::getSingleton();        $oTemplate = $oTemplating->loadTemplate('ktcore/folder/permissions');        $bCanInherit = ($this->oFolder->getId() != 1);        $perms = $aPermList;        $docperms = KTPermission::getDocumentRelevantList();        $aTemplateData = array(

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?