Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Permission/Key/Key.php
Строк: 491
<?php

namespace ConcreteCorePermissionKey;

use 
ConcreteCoreFoundationObject;
use 
GettextTranslations;
use 
Database;
use 
CacheLocal;
use 
Package;
use 
ConcreteCorePackagePackageList;
use 
ConcreteCorePermissionAssignmentAssignment as PermissionAssignment;
use 
User;
use 
ConcreteCorePermissionCategory as PermissionKeyCategory;
use 
Environment;
use 
Core;

abstract class 
Key extends Object
{
    const 
ACCESS_TYPE_INCLUDE 10;
    const 
ACCESS_TYPE_EXCLUDE = -1;
    const 
ACCESS_TYPE_ALL 0;

    protected 
$permissionObject null;

    public function 
getSupportedAccessTypes()
    {
        
$types = array(
            
self::ACCESS_TYPE_INCLUDE => t('Included'),
            
self::ACCESS_TYPE_EXCLUDE => t('Excluded'),
        );

        return 
$types;
    }

    
/**
     * Returns whether a permission key can start a workflow.
     */
    
public function canPermissionKeyTriggerWorkflow()
    {
        return 
$this->pkCanTriggerWorkflow;
    }

    
/**
     * Returns whether a permission key has a custom class.
     */
    
public function permissionKeyHasCustomClass()
    {
        return 
$this->pkHasCustomClass;
    }

    
/**
     * Returns the name for this permission key.
     */
    
public function getPermissionKeyName()
    {
        return 
$this->pkName;
    }

    
/** Returns the display name for this permission key (localized and escaped accordingly to $format)
     * @param string $format = 'html'
     *    Escape the result in html format (if $format is 'html').
     *    If $format is 'text' or any other value, the display name won't be escaped.
     *
     * @return string
     */
    
public function getPermissionKeyDisplayName($format 'html')
    {
        
$value tc('PermissionKeyName'$this->getPermissionKeyName());
        switch (
$format) {
            case 
'html':
                return 
h($value);
            case 
'text':
            default:
                return 
$value;
        }
    }

    
/**
     * Returns the handle for this permission key.
     */
    
public function getPermissionKeyHandle()
    {
        return 
$this->pkHandle;
    }

    
/**
     * Returns the description for this permission key.
     */
    
public function getPermissionKeyDescription()
    {
        return 
$this->pkDescription;
    }

    
/** Returns the display description for this permission key (localized and escaped accordingly to $format)
     * @param string $format = 'html'
     *    Escape the result in html format (if $format is 'html').
     *    If $format is 'text' or any other value, the display description won't be escaped.
     *
     * @return string
     */
    
public function getPermissionKeyDisplayDescription($format 'html')
    {
        
$value tc('PermissionKeyDescription'$this->getPermissionKeyDescription());
        switch (
$format) {
            case 
'html':
                return 
h($value);
            case 
'text':
            default:
                return 
$value;
        }
    }

    
/**
     * Returns the ID for this permission key.
     */
    
public function getPermissionKeyID()
    {
        return 
$this->pkID;
    }

    public function 
getPermissionKeyCategoryID()
    {
        return 
$this->pkCategoryID;
    }

    public function 
getPermissionKeyCategoryHandle()
    {
        return 
$this->pkCategoryHandle;
    }

    public function 
setPermissionObject($object)
    {
        
$this->permissionObject $object;
    }

    public function 
getPermissionObjectToCheck()
    {
        if (isset(
$this->permissionObjectToCheck) && is_object($this->permissionObjectToCheck)) {
            return 
$this->permissionObjectToCheck;
        } else {
            return 
$this->permissionObject;
        }
    }

    public function 
getPermissionObject()
    {
        return 
$this->permissionObject;
    }

    public static function 
loadAll()
    {
        
$db Database::connection();
        
$permissionkeys = array();
        
$txt Core::make('helper/text');
        
$e $db->Execute('select pkID, pkName, pkDescription, pkHandle, pkCategoryHandle, pkCanTriggerWorkflow, pkHasCustomClass, PermissionKeys.pkCategoryID, PermissionKeyCategories.pkgID from PermissionKeys inner join PermissionKeyCategories on PermissionKeyCategories.pkCategoryID = PermissionKeys.pkCategoryID');
        while (
$r $e->FetchRow()) {
            
$class '\Core\Permission\Key\' . $txt->camelcase($r['pkCategoryHandle']) . 'Key';
            if ($r['
pkHasCustomClass']) {
                $class = '
\Core\Permission\Key\' . $txt->camelcase($r['pkHandle'] . '_' . $r['pkCategoryHandle']) . 'Key';
            }
            $pkgHandle = null;
            if ($r['
pkgID']) {
                $pkgHandle = PackageList::getHandle($r['
pkgID']);
            }
            $class = core_class($class, $pkgHandle);
            $pk = Core::make($class);
            $pk->setPropertiesFromArray($r);

            $permissionkeys[$r['
pkHandle']] = $pk;
            $permissionkeys[$r['
pkID']] = $pk;
        }
        CacheLocal::set('
permission_keys', false, $permissionkeys);

        return $permissionkeys;
    }

    protected static function load($key, $loadBy = '
pkID')
    {
        $db = Database::connection();
        $txt = Core::make('
helper/text');
        $r = $db->GetRow('
select pkIDpkNamepkDescriptionpkHandlepkCategoryHandlepkCanTriggerWorkflowpkHasCustomClassPermissionKeys.pkCategoryIDPermissionKeyCategories.pkgID from PermissionKeys inner join PermissionKeyCategories on PermissionKeyCategories.pkCategoryID PermissionKeys.pkCategoryID where ' . $loadBy . ' = ?',
            array($key));
        $class = '
\Core\Permission\Key\' . $txt->camelcase($r['pkCategoryHandle']) . 'Key';
        if (!is_array($r) && (!$r['
pkID'])) {
            return false;
        }

        if ($r['
pkHasCustomClass']) {
            $class = '
\Core\Permission\Key\' . $txt->camelcase($r['pkHandle'] . '_' . $r['pkCategoryHandle']) . 'Key';
        }
        $pkgHandle = null;
        if ($r['
pkgID']) {
            $pkgHandle = PackageList::getHandle($r['
pkgID']);
        }
        $class = core_class($class, $pkgHandle);
        $pk = Core::make($class);
        $pk->setPropertiesFromArray($r);

        return $pk;
    }

    public function hasCustomOptionsForm()
    {
        $env = Environment::get();
        $file = $env->getPath(DIRNAME_ELEMENTS . '
/' . DIRNAME_PERMISSIONS . '/' . DIRNAME_KEYS . '/' . $this->pkHandle . '.php',
            $this->getPackageHandle());

        return file_exists($file);
    }

    public function getPackageID()
    {
        return $this->pkgID;
    }

    public function getPackageHandle()
    {
        return PackageList::getHandle($this->pkgID);
    }

    /**
     * Returns a list of all permissions of this category.
     */
    public static function getList($pkCategoryHandle, $filters = array())
    {
        $db = Database::connection();
        $q = '
select pkID from PermissionKeys inner join PermissionKeyCategories on PermissionKeys.pkCategoryID PermissionKeyCategories.pkCategoryID where pkCategoryHandle = ?';
        foreach ($filters as $key => $value) {
            $q .= ' 
and ' . $key . ' ' . $value . ' ';
        }
        $r = $db->Execute($q, array($pkCategoryHandle));
        $list = array();
        while ($row = $r->FetchRow()) {
            $pk = self::load($row['
pkID']);
            if (is_object($pk)) {
                $list[] = $pk;
            }
        }
        $r->Close();

        return $list;
    }

    public function export($axml)
    {
        $category = PermissionKeyCategory::getByID($this->pkCategoryID)->getPermissionKeyCategoryHandle();
        $pkey = $axml->addChild('
permissionkey');
        $pkey->addAttribute('
handle', $this->getPermissionKeyHandle());
        $pkey->addAttribute('
name', $this->getPermissionKeyName());
        $pkey->addAttribute('
description', $this->getPermissionKeyDescription());
        $pkey->addAttribute('
package', $this->getPackageHandle());
        $pkey->addAttribute('
category', $category);
        $this->exportAccess($pkey);

        return $pkey;
    }

    public static function exportList($xml)
    {
        $categories = PermissionKeyCategory::getList();
        $pxml = $xml->addChild('
permissionkeys');
        foreach ($categories as $cat) {
            $permissions = static::getList($cat->getPermissionKeyCategoryHandle());
            foreach ($permissions as $p) {
                $p->export($pxml);
            }
        }
    }

    /**
     * Note, this queries both the pkgID found on the PermissionKeys table AND any permission keys of a special type
     * installed by that package, and any in categories by that package.
     */
    public static function getListByPackage($pkg)
    {
        $db = Database::connection();

        $kina = array('
-1');
        $kinb = $db->GetCol('
select pkCategoryID from PermissionKeyCategories where pkgID = ?',
            array($pkg->getPackageID()));
        if (is_array($kinb)) {
            $kina = array_merge($kina, $kinb);
        }
        $kinstr = implode('
,', $kina);

        $list = array();
        $r = $db->Execute('
select pkIDpkCategoryID from PermissionKeys where (pkgID = ? or pkCategoryID in (' . $kinstr . ')) order by pkID asc',
            array($pkg->getPackageID()));
        while ($row = $r->FetchRow()) {
            $pkc = PermissionKeyCategory::getByID($row['
pkCategoryID']);
            $pk = $pkc->getPermissionKeyByID($row['
pkID']);
            $list[] = $pk;
        }
        $r->Close();

        return $list;
    }

    public static function import(SimpleXMLElement $pk)
    {
        $pkCategoryHandle = $pk['
category'];
        $pkg = false;
        if ($pk['
package']) {
            $pkg = Package::getByHandle($pk['
package']);
        }
        $pkCanTriggerWorkflow = 0;
        if ($pk['
can-trigger-workflow']) {
            $pkCanTriggerWorkflow = 1;
        }
        $pkHasCustomClass = 0;
        if ($pk['
has-custom-class']) {
            $pkHasCustomClass = 1;
        }
        $pkn = self::add($pkCategoryHandle, $pk['
handle'], $pk['name'], $pk['description'], $pkCanTriggerWorkflow,
            $pkHasCustomClass, $pkg);

        return $pkn;
    }

    public static function getByID($pkID)
    {
        $keys = CacheLocal::getEntry('
permission_keys', false);
        if (!is_array($keys)) {
            $keys = self::loadAll();
        }

        return $keys[$pkID];
    }

    public static function getByHandle($pkHandle)
    {
        $keys = CacheLocal::getEntry('
permission_keys', false);
        if (!is_array($keys)) {
            $keys = self::loadAll();
        }

        return isset($keys[$pkHandle]) ? $keys[$pkHandle] : null;
    }

    /**
     * Adds an permission key.
     */
    public static function add(
        $pkCategoryHandle,
        $pkHandle,
        $pkName,
        $pkDescription,
        $pkCanTriggerWorkflow,
        $pkHasCustomClass,
        $pkg = false
    ) {
        $pkgID = 0;
        $db = Database::connection();

        if (is_object($pkg)) {
            $pkgID = $pkg->getPackageID();
        }

        if ($pkCanTriggerWorkflow) {
            $pkCanTriggerWorkflow = 1;
        } else {
            $pkCanTriggerWorkflow = 0;
        }

        if ($pkHasCustomClass) {
            $pkHasCustomClass = 1;
        } else {
            $pkHasCustomClass = 0;
        }
        $pkCategoryID = $db->GetOne("select pkCategoryID from PermissionKeyCategories where pkCategoryHandle = ?",
            array($pkCategoryHandle));
        $a = array($pkHandle, $pkName, $pkDescription, $pkCategoryID, $pkCanTriggerWorkflow, $pkHasCustomClass, $pkgID);
        $r = $db->query("insert into PermissionKeys (pkHandle, pkName, pkDescription, pkCategoryID, pkCanTriggerWorkflow, pkHasCustomClass, pkgID) values (?, ?, ?, ?, ?, ?, ?)",
            $a);

        if ($r) {
            $pkID = $db->Insert_ID();
            $keys = self::loadAll();

            return $keys[$pkID];
        }
    }

    public function setPermissionKeyHasCustomClass($pkHasCustomClass)
    {
        $db = Database::connection();
        $db->Execute('
update PermissionKeys set pkHasCustomClass = ? where pkID = ?', array(intval($pkHasCustomClass), $this->getPermissionKeyID()));
        self::loadAll();
    }

    /**
     * Legacy support.
     * @access private
     */
    public function can()
    {
        return $this->validate();
    }

    public function validate()
    {
        $u = new User();
        if ($u->isSuperUser()) {
            return true;
        }

        $cache = Core::make('
cache/request');
        $object = $this->getPermissionObject();
        if (is_object($object)) {
            $identifier = sprintf('
permission/key/%s/%s', $this->getPermissionKeyHandle(),
                $object->getPermissionObjectIdentifier());
        } else {
            $identifier = sprintf('
permission/key/%s', $this->getPermissionKeyHandle());
        }

        $item = $cache->getItem($identifier);
        if (!$item->isMiss()) {
            return $item->get();
        }

        $pae = $this->getPermissionAccessObject();

        if (is_object($pae)) {
            $valid = $pae->validate();
        } else {
            $valid = false;
        }

        $item->set($valid);

        return $valid;
    }

    public function delete()
    {
        $db = Database::connection();
        $db->Execute('
delete from PermissionKeys where pkID = ?', array($this->getPermissionKeyID()));
        self::loadAll();
    }

    /**
     * A shortcut for grabbing the current assignment and passing into that object.
     */
    public function getAccessListItems()
    {
        $args = func_get_args();
        $obj = $this->getPermissionAccessObject();
        if (is_object($obj)) {
            return call_user_func_array(array($obj, '
getAccessListItems'), $args);
        } else {
            return array();
        }
    }

    public function getPermissionAssignmentObject()
    {
        if (is_object($this->permissionObject)) {
            $className = $this->permissionObject->getPermissionAssignmentClassName();
            $targ = Core::make($className);
            $targ->setPermissionObject($this->permissionObject);
        } else {
            $targ = new PermissionAssignment();
        }
        $targ->setPermissionKeyObject($this);

        return $targ;
    }

    public function getPermissionAccessObject()
    {
        $targ = $this->getPermissionAssignmentObject();

        return $targ->getPermissionAccessObject();
    }

    public function getPermissionAccessID()
    {
        $pa = $this->getPermissionAccessObject();
        if (is_object($pa)) {
            return $pa->getPermissionAccessID();
        }
    }

    public function exportAccess($pxml)
    {
        // by default we don'
tbut tasks do
    }

    public static function 
exportTranslations()
    {
        
$translations = new Translations();
        
$categories PermissionKeyCategory::getList();
        foreach (
$categories as $cat) {
            
$permissions = static::getList($cat->getPermissionKeyCategoryHandle());
            foreach (
$permissions as $p) {
                
$translations->insert('PermissionKeyName'$p->getPermissionKeyName());
                if (
$p->getPermissionKeyDescription()) {
                    
$translations->insert('PermissionKeyDescription'$p->getPermissionKeyDescription());
                }
            }
        }

        return 
$translations;
    }
}
Онлайн: 2
Реклама