permission management

This commit is contained in:
Etienne Roudeix
2013-10-22 15:04:06 +02:00
parent cb0619a7b3
commit c94fa9bc24
9 changed files with 278 additions and 186 deletions

View File

@@ -29,6 +29,7 @@ use Symfony\Component\Console\Output\OutputInterface;
use Thelia\Command\ContainerAwareCommand;
use Thelia\Model\Admin;
use Thelia\Model\Map\ResourceI18nTableMap;
use Thelia\Model\Map\ResourceTableMap;
class GenerateResources extends ContainerAwareCommand
@@ -46,7 +47,7 @@ class GenerateResources extends ContainerAwareCommand
'output',
null,
InputOption::VALUE_OPTIONAL,
'Output format amid (string, sql)',
'Output format amid (string, sql, sql-i18n)',
null
)
;
@@ -55,7 +56,7 @@ class GenerateResources extends ContainerAwareCommand
protected function execute(InputInterface $input, OutputInterface $output)
{
$class = new \ReflectionClass('Thelia\Core\Event\AdminResources');
$class = new \ReflectionClass('Thelia\Core\Security\Resource\AdminResources');
$constants = $class->getConstants();
@@ -69,12 +70,36 @@ class GenerateResources extends ContainerAwareCommand
$output->writeln(
'INSERT INTO ' . ResourceTableMap::TABLE_NAME . ' (`id`, `code`, `created_at`, `updated_at`) VALUES '
);
$compteur = 0;
foreach($constants as $constant => $value) {
if($constant == 'SUPERADMINISTRATOR') {
continue;
}
$compteur++;
$output->writeln(
"(NULL, '$value', NOW(), NOW())" . ($constant === key( array_slice( $constants, -1, 1, TRUE ) ) ? '' : ',')
"($compteur, '$value', NOW(), NOW())" . ($constant === key( array_slice( $constants, -1, 1, true ) ) ? ';' : ',')
);
}
break;
case 'sql-i18n':
$output->writeln(
'INSERT INTO ' . ResourceI18nTableMap::TABLE_NAME . ' (`id`, `locale`, `title`) VALUES '
);
$compteur = 0;
foreach($constants as $constant => $value) {
if($constant == 'SUPERADMINISTRATOR') {
continue;
}
$compteur++;
$title = ucwords( str_replace('.', ' / ', str_replace('admin.', '', $value) ) );
$output->writeln(
"($compteur, 'en_US', '$title'),"
);
$output->writeln(
"($compteur, 'fr_FR', '$title')" . ($constant === key( array_slice( $constants, -1, 1, true ) ) ? ';' : ',')
);
}
break;

View File

@@ -35,6 +35,7 @@
<loop class="Thelia\Core\Template\Loop\Product" name="product"/>
<loop class="Thelia\Core\Template\Loop\ProductSaleElements" name="product_sale_elements"/>
<loop class="Thelia\Core\Template\Loop\Profile" name="profile"/>
<loop class="Thelia\Core\Template\Loop\Resource" name="resource"/>
<loop class="Thelia\Core\Template\Loop\Feed" name="feed"/>
<loop class="Thelia\Core\Template\Loop\Title" name="title"/>
<loop class="Thelia\Core\Template\Loop\Lang" name="lang"/>

View File

@@ -128,7 +128,7 @@ class BaseAdminController extends BaseController
}
// Log the problem
$this->adminLogAppend("User is not granted for permissions %s", implode(", ", $permArr));
$this->adminLogAppend("User is not granted for resources %s with accesses %s", implode(", ", $resources), implode(", ", $accesses));
// Generate the proper response
$response = new Response();

View File

@@ -63,8 +63,9 @@ class AccessManager
$this->accessValue = $accessValue;
foreach($this->accessPows as $type => $value) {
if($accessValue >= $value) {
$accessValue -= $value;
$pow = pow(2, $value);
if($accessValue >= $pow) {
$accessValue -= $pow;
$this->accessGranted[$type] = true;
} else {
$this->accessGranted[$type] = false;

View File

@@ -25,6 +25,7 @@ namespace Thelia\Core\Template\Loop;
use Propel\Runtime\ActiveQuery\Criteria;
use Thelia\Core\Template\Element\BaseI18nLoop;
use Thelia\Core\Template\Element\BaseLoop;
use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow;
@@ -44,7 +45,7 @@ use Thelia\Type\BooleanOrBothType;
* @package Thelia\Core\Template\Loop
* @author Etienne Roudeix <eroudeix@openstudio.fr>
*/
class Admin extends BaseI18nLoop
class Admin extends BaseLoop
{
public $timestampable = true;
@@ -83,17 +84,17 @@ class Admin extends BaseI18nLoop
$search->orderByFirstname(Criteria::ASC);
/* perform search */
$features = $this->search($search, $pagination);
$admins = $this->search($search, $pagination);
$loopResult = new LoopResult($features);
$loopResult = new LoopResult($admins);
foreach ($features as $feature) {
$loopResultRow = new LoopResultRow($loopResult, $feature, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow->set("ID", $feature->getId())
->set("PROFILE",$feature->getProfileId())
->set("FIRSTNAME",$feature->getFirstname())
->set("LASTNAME",$feature->getLastname())
->set("LOGIN",$feature->getLogin())
foreach ($admins as $admin) {
$loopResultRow = new LoopResultRow($loopResult, $admin, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow->set("ID", $admin->getId())
->set("PROFILE",$admin->getProfileId())
->set("FIRSTNAME",$admin->getFirstname())
->set("LASTNAME",$admin->getLastname())
->set("LOGIN",$admin->getLogin())
;
$loopResult->addRow($loopResultRow);

View File

@@ -79,20 +79,20 @@ class Profile extends BaseI18nLoop
$search->orderById(Criteria::ASC);
/* perform search */
$features = $this->search($search, $pagination);
$profiles = $this->search($search, $pagination);
$loopResult = new LoopResult($features);
$loopResult = new LoopResult($profiles);
foreach ($features as $feature) {
$loopResultRow = new LoopResultRow($loopResult, $feature, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow->set("ID", $feature->getId())
->set("IS_TRANSLATED",$feature->getVirtualColumn('IS_TRANSLATED'))
foreach ($profiles as $profile) {
$loopResultRow = new LoopResultRow($loopResult, $profile, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow->set("ID", $profile->getId())
->set("IS_TRANSLATED",$profile->getVirtualColumn('IS_TRANSLATED'))
->set("LOCALE",$locale)
->set("CODE",$feature->getCode())
->set("TITLE",$feature->getVirtualColumn('i18n_TITLE'))
->set("CHAPO", $feature->getVirtualColumn('i18n_CHAPO'))
->set("DESCRIPTION", $feature->getVirtualColumn('i18n_DESCRIPTION'))
->set("POSTSCRIPTUM", $feature->getVirtualColumn('i18n_POSTSCRIPTUM'))
->set("CODE",$profile->getCode())
->set("TITLE",$profile->getVirtualColumn('i18n_TITLE'))
->set("CHAPO", $profile->getVirtualColumn('i18n_CHAPO'))
->set("DESCRIPTION", $profile->getVirtualColumn('i18n_DESCRIPTION'))
->set("POSTSCRIPTUM", $profile->getVirtualColumn('i18n_POSTSCRIPTUM'))
;
$loopResult->addRow($loopResultRow);

View File

@@ -0,0 +1,115 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* 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 3 of the License */
/* */
/* 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/>. */
/* */
/*************************************************************************************/
namespace Thelia\Core\Template\Loop;
use Propel\Runtime\ActiveQuery\Criteria;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Template\Element\BaseI18nLoop;
use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Model\ResourceQuery;
use Thelia\Type;
use Thelia\Type\BooleanOrBothType;
/**
*
* Resource loop
*
*
* Class Resource
* @package Thelia\Core\Template\Loop
* @author Etienne Roudeix <eroudeix@openstudio.fr>
*/
class Resource extends BaseI18nLoop
{
public $timestampable = true;
/**
* @return ArgumentCollection
*/
protected function getArgDefinitions()
{
return new ArgumentCollection(
Argument::createIntTypeArgument('profile')
);
}
/**
* @param $pagination
*
* @return \Thelia\Core\Template\Element\LoopResult
*/
public function exec(&$pagination)
{
$search = ResourceQuery::create();
/* manage translations */
$locale = $this->configureI18nProcessing($search);
$profile = $this->getProfile();
if (null !== $profile) {
$search->leftJoinProfileResource('profile_resource')
->withColumn('profile_resource.access', 'access');
//$search->filterById($id, Criteria::IN);
}
$search->orderById(Criteria::ASC);
/* perform search */
$resources = $this->search($search, $pagination);
$loopResult = new LoopResult($resources);
foreach ($resources as $resource) {
$loopResultRow = new LoopResultRow($loopResult, $resource, $this->versionable, $this->timestampable, $this->countable);
$loopResultRow->set("ID", $resource->getId())
->set("IS_TRANSLATED",$resource->getVirtualColumn('IS_TRANSLATED'))
->set("LOCALE",$locale)
->set("CODE",$resource->getCode())
->set("TITLE",$resource->getVirtualColumn('i18n_TITLE'))
->set("CHAPO", $resource->getVirtualColumn('i18n_CHAPO'))
->set("DESCRIPTION", $resource->getVirtualColumn('i18n_DESCRIPTION'))
->set("POSTSCRIPTUM", $resource->getVirtualColumn('i18n_POSTSCRIPTUM'))
;
if (null !== $profile) {
$accessValue = $resource->getVirtualColumn('access');
$manager = new AccessManager($accessValue);
$loopResultRow->set("VIEWABLE", $manager->can(AccessManager::VIEW))
->set("CREATABLE", $manager->can(AccessManager::CREATE))
->set("UPDATABLE", $manager->can(AccessManager::UPDATE))
->set("DELETABLE", $manager->can(AccessManager::DELETE));
}
$loopResult->addRow($loopResultRow);
}
return $loopResult;
}
}