permission.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 324 行

PHP
324
字号
<?php
// $Id: permission.php,v 1.3 2005/10/19 17:20:32 phppp Exp $
// ------------------------------------------------------------------------ //
// XOOPS - PHP Content Management System                      //
// Copyright (c) 2000 XOOPS.org                           //
// <http://www.xoops.org/>                             //
// ------------------------------------------------------------------------ //
// This program is free software; you can redistribute it and/or modify     //
// it under the terms of the GNU General Public License as published by     //
// the Free Software Foundation; either version 2 of the License, or        //
// (at your option) any later version.                                      //
// //
// You may not change or alter any portion of this comment or credits       //
// of supporting developers from this source code or any supporting         //
// source code which is considered copyrighted (c) material of the          //
// original comment or credit authors.                                      //
// //
// 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, write to the Free Software              //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
// ------------------------------------------------------------------------ //
// Author: phppp (D.J., infomax@gmail.com)                                  //
// URL: http://xoopsforge.com, http://xoops.org.cn                          //
// Project: Article Project                                                 //
// ------------------------------------------------------------------------ //
if (!defined('FORUM_PERM_ITEMS')) define('FORUM_PERM_ITEMS', 'access,view,post,reply,edit,delete,addpoll,vote,attach,noapprove');
 
if (!defined("XOOPS_ROOT_PATH")) {
	exit();
}

require_once XOOPS_ROOT_PATH."/kernel/groupperm.php";

class NewbbPermissionHandler extends XoopsGroupPermHandler 
{
    /*
	* Returns permissions for a certain type
	*
	* @param string $type "category", "forum"
	* @param int $id id of the item (forum, topic or possibly post) to get permissions for
	*
	* @return array
	*/
    function getPermissions($type = "forum", $id = 0)
    {
        global $xoopsUser;
        static $permissions = array(), $suspension = array();

        $type = (strtolower($type) !="category")?"forum":"category";
        
	    if(is_object($GLOBALS["xoopsModule"]) && $GLOBALS["xoopsModule"]->getVar("dirname")=="newbb"){
        	$modid = $GLOBALS["xoopsModule"]->getVar("mid");
	    }else{
    		$module_handler =& xoops_gethandler('module');
			$xoopsNewBB =& $module_handler->getByDirname('newbb');
			$modid = $xoopsNewBB->getVar("mid");
			unset($xoopsNewBB);
	    }
        
	    $uid = is_object($GLOBALS["xoopsUser"])?$GLOBALS["xoopsUser"]->getVar("uid"):0;
		$ip = newbb_getIP(true);
		if (($type == "forum") && !newbb_isAdmin($id) && !isset($suspension[$uid][$id]) && !empty($GLOBALS["xoopsModuleConfig"]['enable_usermoderate'])){
			$moderate_handler =& xoops_getmodulehandler('moderate', 'newbb');
			if($moderate_handler->verifyUser($uid,"",$id)){
				$suspension[$uid][$ip][$id] = 1;
			}else{
				$suspension[$uid][$ip][$id] = 0;
			}
		}

        if (!isset($permissions[$type]) || ($id && !isset($permissions[$type][$id]))) {
            // Get group permissions handler
            $gperm_handler =& xoops_gethandler('groupperm');
            // Get user's groups
            $groups = is_object($xoopsUser) ? $xoopsUser->getGroups() : array(XOOPS_GROUP_ANONYMOUS);
            // Create string of groupid's separated by commas, inserted in a set of brackets
            if (count($groups) < 1) return false;
            $groupstring = "(" . implode(',', $groups) . ")";
            // Create criteria for getting only the permissions regarding this module and this user's groups
            $criteria = new CriteriaCompo(new Criteria('gperm_modid', $modid));
            $criteria->add(new Criteria('gperm_groupid', $groupstring, 'IN'));
            if ($id) {
                if (is_array($id)) {
                    $counter = 0;
                    $idstring = "(" . implode(',', $id) . ")";
                    $criteria->add(new Criteria('gperm_itemid', $idstring, 'IN'));
                } else {
                    $criteria->add(new Criteria('gperm_itemid', intval($id)));
                }
            }

            switch ($type) {
                case "forum":
                    $items = array_map("trim",explode(',', FORUM_PERM_ITEMS));

                    $full_items = array();
                    foreach($items as $item) {
	                    /* skip access for suspended users */
						if( !empty($suspension[$uid][$ip][$id]) && in_array($item,array("post", "reply", "edit", "delete", "addpoll", "vote", "attach", "noapprove")) ) continue;
                        $full_items[] = "'forum_" . $item . "'";
                    }
                    $gperm_names = implode(',', $full_items);
                    break;

                case "category":
                    $gperm_names = "'category_access'";
                    break;
            }
            // Add criteria for gpermnames
            $criteria->add(new Criteria('gperm_name', "(" . $gperm_names . ")", 'IN'));
            // Get all permission objects in this module and for this user's groups
            $userpermissions =& $gperm_handler->getObjects($criteria, true);
                        
            // Set the granted permissions to 1
            foreach ($userpermissions as $gperm_id => $gperm) {
                $permissions[$type][$gperm->getVar('gperm_itemid')][$gperm->getVar('gperm_name')] = 1;
            }
            unset($userpermissions);
        }
        // Return the permission array
        return isset($permissions[$type]) ? $permissions[$type] : array();
    }

    function &permission_table($permission_set, $forum = 0, $topic_locked = false, $isadmin = false)
    {
        global $xoopsUser;
        $perm = array();

        if (is_object($forum)) $forumid = $forum->getVar('forum_id');
        else $forumid = $forum;

        $perm_items = explode(',', FORUM_PERM_ITEMS);
        foreach($perm_items as $item) {
	        if($item=="access") continue;
            if ($isadmin ||
                (isset($permission_set[$forumid]['forum_' . $item]) && (!$topic_locked || $item=="view"))
                    ) {
                $perm[] = constant('_MD_CAN_' . strtoupper($item));
            } else {
                $perm[] = constant('_MD_CANNOT_' . strtoupper($item));
            }
        }

        return $perm;
    }
    
    function deleteByForum($forum)
    {
        $gperm_handler = &xoops_gethandler('groupperm');
        $criteria = new CriteriaCompo(new Criteria('gperm_modid', $GLOBALS["xoopsModule"]->getVar('mid')));
        $criteria->add(new Criteria('gperm_name', '('.FORUM_PERM_ITEMS.')', 'IN'));
        $criteria->add(new Criteria('gperm_itemid', $forum));
        return $gperm_handler->deleteAll($criteria);
    }
    
    function deleteByCategory($category)
    {
        $gperm_handler = &xoops_gethandler('groupperm');
        $criteria = new CriteriaCompo(new Criteria('gperm_modid', $GLOBALS["xoopsModule"]->getVar('mid')));
        $criteria->add(new Criteria('gperm_name', 'category_access'));
        $criteria->add(new Criteria('gperm_itemid', $category));
        return $gperm_handler->deleteAll($criteria);
    }

    function setCategoryPermission($category, $groups=null)
    {
	    if(is_object($GLOBALS["xoopsModule"]) && $GLOBALS["xoopsModule"]->getVar("dirname")=="newbb"){
		    $mid = $GLOBALS["xoopsModule"]->getVar("mid");
	    }else{
    		$module_handler =& xoops_gethandler('module');
			$newbb =& $module_handler->getByDirname('newbb');
			$mid = $newbb->getVar("mid");
	    }
		//$groupperm_handler =& xoops_gethandler('groupperm');
		if(!is_array($groups)){
		    $member_handler =& xoops_gethandler('member');
		    $glist =& $member_handler->getGroupList();
		    $groups = array_keys($glist);
	    }
		$ids = $this->getGroupIds("category_access", $category, $mid);
	    $ids_add = array_diff($groups, $ids);
	    $ids_rmv = array_diff($ids, $groups);
		foreach($ids_add as $group){
			$this->addRight("category_access", $category, $group, $mid);
		}
		foreach($ids_rmv as $group){
			$this->deleteRight("category_access", $category, $group, $mid);
		}
		
        return true;
    }
    
    function validateRight($perm, $itemid, $groupid, $mid = null)
    {
	    if(empty($mid)){
		    if(is_object($GLOBALS["xoopsModule"]) && $GLOBALS["xoopsModule"]->getVar("dirname")=="newbb"){
			    $mid = $GLOBALS["xoopsModule"]->getVar("mid");
		    }else{
    			$module_handler =& xoops_gethandler('module');
				$newbb =& $module_handler->getByDirname('newbb');
				$mid = $newbb->getVar("mid");
				unset($newbb);
		    }
	    }
		if($this->_checkRight($perm, $itemid, $groupid, $mid)) return true;
		$this->addRight($perm, $itemid, $groupid, $mid);
		return true;
    }

    /**
     * Check permission (directly)
     * 
     * @param	string    $gperm_name       Name of permission
     * @param	int       $gperm_itemid     ID of an item
     * @param	int/array $gperm_groupid    A group ID or an array of group IDs
     * @param	int       $gperm_modid      ID of a module
     * 
     * @return	bool    TRUE if permission is enabled
     */
    function _checkRight($gperm_name, $gperm_itemid, $gperm_groupid, $gperm_modid = 1)
    {
        $criteria = new CriteriaCompo(new Criteria('gperm_modid', $gperm_modid));
        $criteria->add(new Criteria('gperm_name', $gperm_name));
        $gperm_itemid = intval($gperm_itemid);
        if ($gperm_itemid > 0) {
            $criteria->add(new Criteria('gperm_itemid', $gperm_itemid));
        }
        if (is_array($gperm_groupid)) {
            $criteria2 = new CriteriaCompo();
            foreach ($gperm_groupid as $gid) {
                $criteria2->add(new Criteria('gperm_groupid', $gid), 'OR');
            }
            $criteria->add($criteria2);
        } else {
            $criteria->add(new Criteria('gperm_groupid', $gperm_groupid));
        }
        if ($this->getCount($criteria) > 0) {
            return true;
        }
        return false;
    }
    
    function deleteRight($perm, $itemid, $groupid, $mid = null)
    {
	    if(empty($mid)){
		    if(is_object($GLOBALS["xoopsModule"]) && $GLOBALS["xoopsModule"]->getVar("dirname")=="newbb"){
			    $mid = $GLOBALS["xoopsModule"]->getVar("mid");
		    }else{
    			$module_handler =& xoops_gethandler('module');
				$newbb =& $module_handler->getByDirname('newbb');
				$mid = $newbb->getVar("mid");
				unset($newbb);
		    }
	    }
		if(is_callable(array(&$this->XoopsGroupPermHandler, "deleteRight"))){
			return $this->deleteRight($perm, $itemid, $groupid, $mid);
		}else{
	        $criteria = new CriteriaCompo(new Criteria('gperm_name', $perm));
	        $criteria->add(new Criteria('gperm_groupid', $groupid));
	        $criteria->add(new Criteria('gperm_itemid', $itemid));
	        $criteria->add(new Criteria('gperm_modid', $mid));
	        $perms_obj = $this->getObjects($criteria);
	        if (!empty($perms_obj)) {
		        foreach($perms_obj as $perm_obj){
	            	$this->delete($perm_obj);
		        }
	        }
	        unset($criteria, $perms_obj);
		}
		return true;
    }
        
    function applyTemplate($forum, $mid=null)
    {
	    $perm_template = $this->getTemplate();
	    if(empty($perm_template)) return false;
	    
	    if(empty($mid)){
		    if(is_object($GLOBALS["xoopsModule"]) && $GLOBALS["xoopsModule"]->getVar("dirname")=="newbb"){
			    $mid = $GLOBALS["xoopsModule"]->getVar("mid");
		    }else{
    			$module_handler =& xoops_gethandler('module');
				$newbb =& $module_handler->getByDirname('newbb');
				$mid = $newbb->getVar("mid");
				unset($newbb);
		    }
	    }
	    
		//$groupperm_handler =& xoops_gethandler('groupperm');
	    $member_handler =& xoops_gethandler('member');
	    $glist =& $member_handler->getGroupList();
		$perms = array_map("trim",explode(',', FORUM_PERM_ITEMS));
		foreach(array_keys($glist) as $group){
		    foreach($perms as $perm){
			    $perm = "forum_".$perm;
				if(!empty($perm_template[$group][$perm])){
					$this->validateRight($perm, $forum, $group, $mid);
				}else{
					$this->deleteRight($perm, $forum, $group, $mid);
				}
		    }
		}
	    return true;
    }
    
    function &getTemplate()
    {
		$perms = mod_loadCacheFile("perm_template", "newbb");
		return $perms;
    }
    
    function setTemplate($perms)
    {
		return mod_createCacheFile($perms, "perm_template", "newbb");
    }
}

?>

⌨️ 快捷键说明

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