Skip to content

Commit

Permalink
1.0.11: This update contains breaking changes that may affect other p…
Browse files Browse the repository at this point in the history
…lugins. Permission methods for PHP code are now accessed by App Service like app('PassageService')::passageKeys() or by alias like PassageService::passageKeys().'
  • Loading branch information
firemankurt committed Nov 23, 2017
1 parent 12381a1 commit 043a667
Show file tree
Hide file tree
Showing 6 changed files with 287 additions and 104 deletions.
127 changes: 33 additions & 94 deletions Plugin.php
@@ -1,12 +1,10 @@
<?php namespace KurtJensen\Passage;

use App;
use Auth;
use Backend;
use BackendAuth;
use Event;
use Illuminate\Foundation\AliasLoader;
use KurtJensen\Passage\Models\Key;
use RainLab\User\Models\UserGroup;
use System\Classes\PluginBase;

Expand Down Expand Up @@ -89,24 +87,9 @@ public function boot() {
], 'primary');
});

App::register('\KurtJensen\Passage\Services\PassageServiceProvider'); // Register aliases
$alias = AliasLoader::getInstance();
$alias->alias('Passage', '\KurtJensen\Passage\Services\PassageServiceProvider');

// App::register('\KurtJensen\Passage\Classes\Keys'); // Register aliases
// $alias = AliasLoader::getInstance();
// $alias->alias('Passage', '\KurtJensen\Passage\Classes\Keys');
}

/**
* Registers any front-end components implemented in this plugin.
*
* @return array
*/
public function registerComponents() {
return [
//'KurtJensen\Passage\Components\Lock' => 'Lock',
];
$alias->alias('PassageService', '\KurtJensen\Passage\Classes\KeyRing');
App::register('\KurtJensen\Passage\Services\PassageServiceProvider');
}

/**
Expand All @@ -128,110 +111,66 @@ public function registerPermissions() {
];
}

/**
* Registers back-end navigation items for this plugin.
*
* @return array
*/
public function registerNavigation() {
return []; // Remove this line to activate
}

public function registerMarkupTags() {
return [
'functions' => [
'can' => function ($lock) {return $this->can($lock);},
'inGroup' => function ($group) {return $this->inGroup($group);},
'inGroupName' => function ($group) {return $this->inGroupName($group);},
'can' => function ($key) {return app('PassageService')::hasKeyName($key);},
'hasKeyName' => function ($key) {return app('PassageService')::hasKeyName($key);},
'hasKeyNames' => function ($keys) {return app('PassageService')::hasKeyNames($keys);},
'hasKey' => function ($key_id) {return app('PassageService')::hasKey($key_id);},
'hasKeys' => function ($key_ids) {return app('PassageService')::hasKeys($key_ids);},

'inGroupName' => function ($group) {return app('PassageService')::inGroupName($group);},
'inGroupNames' => function ($groups) {return app('PassageService')::inGroupNames($groups);},
'inGroup' => function ($group_key) {return app('PassageService')::inGroup($group_key);},
'inGroups' => function ($group_keys) {return app('PassageService')::inGroups($group_keys);},
],
];
}

public static function getUser() {
if (!$user = Auth::getUser()) {
return false;
}
if (!$user->is_activated) {
return false;
}
return $user;
}

private function inGroup($code) {
$answer = array_key_exists($code, $this->passage_groups());
if (!$answer) {
$answer = $this->inGroupName($code);
if ($answer) {
trigger_error("Possible Deprecated use of twig function inGroup. The inGroup funtion now should use the unique user group code rather than the user group name.", E_USER_NOTICE);
}
}
return $answer;
}

private function inGroupName($name) {
if (!$user = self::getUser()) {
return false;
}
return in_array($name, $this->passage_groups());
}

private function can($lock) {
return in_array($lock, self::passage_keys());
}

public static function passage_groups() {
if (self::$groups === null) {
if (!$user = self::getUser()) {
return self::$groups = [];
}
self::$groups = $user->groups->lists('name', 'code');
}
return self::$groups;
}

public static function passage_keys() {
if (self::$keys === null) {
if (!self::getUser()) {
return [];
}
self::$keys = Key::whereHas('groups.users', function ($q) {
$q->where('user_id', self::getUser()->id);
})
->lists('name', 'id');
}
return self::$keys;
}

public static function globalPassageKeys() {
trigger_error("globalPassageKeys() Deprecated use passageKeys() instead.", E_USER_NOTICE);
return \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_keys();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::globalPassageKeys() called. Use PassageService::passageKeys() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::globalPassageKeys() called. Use app('PassageService')::passageKeys() instead.", E_USER_DEPRECATED);
return app('PassageService')::passageKeys();
}

public static function passageKeys() {
return \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_keys();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::passageKeys() called. Use PassageService::passageKeys() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::passageKeys() called. Use app('PassageService')::passageKeys() instead.", E_USER_DEPRECATED);
return app('PassageService')::passageKeys();
}

public static function hasKeyName($key_name) {
$keys = \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_keys();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::hasKeyName() called. Use PassageService::hasKeyName() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::hasKeyName() called. Use app('PassageService')::hasKeyName() instead.", E_USER_DEPRECATED);
$keys = app('PassageService')::passageKeys();
return in_array($key_name, $keys);
}

public static function hasKey($key_id) {
$keys = \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_keys();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::hasKey() called. Use PassageService::hasKey() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::hasKey() called. Use app('PassageService')::hasKey() instead.", E_USER_DEPRECATED);
$keys = app('PassageService')::passageKeys();
return array_key_exists($key_id, $keys);
}

public static function passageGroups() {
return \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_groups();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::passageGroups() called. Use PassageService::passageGroups() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::passageGroups() called. Use app('PassageService')::passageGroups() instead.", E_USER_DEPRECATED);
return app('PassageService')::passageGroups();
}

public static function hasGroupName($group_name) {
$groups = \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_groups();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::hasGroupName() called. Use PassageService::hasGroupName() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::hasGroupName() called. Use app('PassageService')::hasGroupName() instead.", E_USER_DEPRECATED);
$groups = app('PassageService')::passageGroups();
return in_array($group_name, $groups);
}

public static function hasGroup($group_code) {
$groups = \System\Classes\PluginManager::instance()->findByNamespace(__CLASS__)->passage_groups();
traceLog("Deprecated method \KurtJensen\Passage\Plugin::hasGroup() called. Use PassageService::hasGroup() instead. See Passage Upgrade Guide.");
//trigger_error("Deprecated method \KurtJensen\Passage\Plugin::hasGroup() called. Use app('PassageService')::hasGroup() instead.", E_USER_DEPRECATED);
$groups = app('PassageService')::passageGroups();
return array_key_exists($group_code, $groups);
}
}
49 changes: 40 additions & 9 deletions README.md
Expand Up @@ -15,7 +15,7 @@ In the backend under Users you will find a button at the top called __"User Grou

###User Permisions in Pages or Partials######

On a page you may restrict access to a portion of view by using the following code:
On a page you may restrict access to a portion of view by using the following twig functions:

{% if can('calendar_meetings') %}

Expand Down Expand Up @@ -57,12 +57,27 @@ On a page you may restrict access to a portion of view by using the following co
<p>This will show for all users regardless of permissions.</p>


###User Permisions in Your Own Plugins######
##Available Twig Functions##
- can('KeyName') - Check a passage key name
- hasKeyName('KeyName') - Check a passage key name
- hasKeyNames(['KeyName1','KeyName2','KeyName3']) - Check an array of passage key names
- hasKey(KeyId) (where KeyId is an integer) - Check a passage key id
- hasKeys([KeyId1,KeyId2,KeyId3]) - Check an array of passage key ids

- inGroupName('GroupName') - Check a passage group name
- inGroupNames(['Group Name','Group Name 2','Group Name 3']) - Check an array of passage group names
- inGroup('GroupCode') - Check a passage group code
- inGroups(['GroupCode1','GroupCode2','GroupCode3']) - Check an array of passage group codes

###User Permisions in Your Own Plugins######

// Passage Service Methods can be accessed in one of two ways:
$permission_keys_by_name = PassageService::passageKeys(); // by Alias
//OR
$permission_keys_by_name = app('PassageService')::passageKeys(); // by App Service

// Get all permision keys for the user in an array
$permission_keys_by_name = \KurtJensen\Passage\Plugin::passageKeys();
$permission_keys_by_name = app('PassageService')::passageKeys();

/**
* OR
Expand All @@ -71,7 +86,7 @@ On a page you may restrict access to a portion of view by using the following co
**/

// check for permission directly using hasKeyName( $key_name )
$permissionGranted = \KurtJensen\Passage\Plugin::hasKeyName('view_magic_dragon');
$permissionGranted = app('PassageService')::hasKeyName('view_magic_dragon');
if($permissionGranted) {
// Do stuff
}
Expand All @@ -84,12 +99,12 @@ On a page you may restrict access to a portion of view by using the following co
*
* Example:
* $model->perm_id = 5 which came from a dropdown that contained keys
* from \KurtJensen\Passage\Plugin::passageKeys();
* from PassageService::passageKeys();
**/

$model = Model::first();
// check for permission directly using hasKey( $key_id )
if(\KurtJensen\Passage\Plugin::hasKey($model->perm_id)) {
if(PassageService::hasKey($model->perm_id)) {
// Do Stuff
}else{
// Do other Stuff if user does NOT have permission
Expand All @@ -102,7 +117,7 @@ On a page you may restrict access to a portion of view by using the following co
**/

// You can get array of the users groups keyed by the code of the group
$groups = \KurtJensen\Passage\Plugin::passageGroups()
$groups = PassageService::passageGroups()

/**
* OR
Expand All @@ -111,7 +126,7 @@ On a page you may restrict access to a portion of view by using the following co
**/

// use hasGroup($group_code) to check membership
$isCool = \KurtJensen\Passage\Plugin::hasGroup('cool_people')
$isCool = PassageService::hasGroup('cool_people')

/**
* OR
Expand All @@ -122,7 +137,23 @@ On a page you may restrict access to a portion of view by using the following co
**/

// use hasGroupName($group_name) to check membership
$isInGroupNamedCool = \KurtJensen\Passage\Plugin::hasGroupName('Cool')
$isInGroupNamedCool = PassageService::hasGroupName('Cool')

##Available Passage Service Methods##
- passageKeys() - Get an array of all approved passage keys for the user
- can($key_name) - (alias of hasKeyName())
- hasKeyName($key_name) - Check a passage key name
- hasKey(integer $key_id) - Check a passage key id
- hasKeys(array $check_key_ids) - Check an array of passage key ids
- hasKeyNames(array $check_keys) - Check an array of passage key names

- passageGroups() - Get an array of all approved passage groups for the user
- inGroupName($group_name) - Check a passage group name
- hasGroupName($group_name) - (alias of inGroupName())
- inGroup($group_code) - Check a passage group code
- hasGroup($group_code) - (alias of inGroup())
- inGroups(array $check_group_codes) - Check an array of passage group ids
- inGroupNames(array $check_groups) - Check an array of passage group names


## Like this plugin?
Expand Down
20 changes: 20 additions & 0 deletions UPGRADE.md
@@ -1,8 +1,28 @@
# Upgrade guide
- [Upgrading to 1.0.11 from 1.0.10](#upgrade-1.0.11)

- [Upgrading to 1.0.5 from 1.0.4](#upgrade-1.0.5)

- [Upgrading from Shahiem Seymor's Frontend User Roles Manager](#roles)

<a name="upgrade-1.0.11"></a>
## Upgrading To 1.0.11
**This is an important update that contains breaking changes.**
Permission methods for PHP code have changed.
Passage Service Methods can be accessed in one of two ways:

$permission_keys_by_name = PassageService::passageKeys(); // by Alias

or

$permission_keys_by_name = app('PassageService')::passageKeys(); // by App Service

This will no longer work after version future version 1.0.12:

$permission_keys_by_name = \KurtJensen\Passage\Plugin::passageKeys();

If you have other plugins that rely on Passage Permissions it is suggested that you ensure they have been updated to be compatible with version 1.0.12 or application will halt by throwing a Deprecated method error.

<a name="upgrade-1.0.5"></a>
## Upgrading To 1.0.5

Expand Down

0 comments on commit 043a667

Please sign in to comment.