%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/www/admin1/vendor/mitchbred/entrust/src/Entrust/Traits/ |
Upload File : |
<?php namespace Trebol\Entrust\Traits;
/**
* This file is part of Entrust,
* a role & permission management solution for Laravel.
*
* @license MIT
* @package Trebol\Entrust
*/
use Illuminate\Cache\TaggableStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Str;
use InvalidArgumentException;
trait EntrustUserTrait
{
/**
* Big block of caching functionality.
*
* @return mixed Roles
*/
public function cachedRoles()
{
$userPrimaryKey = $this->primaryKey;
$cacheKey = 'entrust_roles_for_user_'.$this->$userPrimaryKey;
if(Cache::getStore() instanceof TaggableStore) {
return Cache::tags(Config::get('entrust.role_user_table'))->remember($cacheKey, Config::get('cache.ttl'), function () {
return $this->roles()->get();
});
}
else return $this->roles()->get();
}
/**
* {@inheritDoc}
*/
public function save(array $options = [])
{ //both inserts and updates
if(Cache::getStore() instanceof TaggableStore) {
Cache::tags(Config::get('entrust.role_user_table'))->flush();
}
return parent::save($options);
}
/**
* {@inheritDoc}
*/
public function delete(array $options = [])
{ //soft or hard
$result = parent::delete($options);
if(Cache::getStore() instanceof TaggableStore) {
Cache::tags(Config::get('entrust.role_user_table'))->flush();
}
return $result;
}
/**
* {@inheritDoc}
*/
public function restore()
{ //soft delete undo's
$result = parent::restore();
if(Cache::getStore() instanceof TaggableStore) {
Cache::tags(Config::get('entrust.role_user_table'))->flush();
}
return $result;
}
/**
* Many-to-Many relations with Role.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany(Config::get('entrust.role'), Config::get('entrust.role_user_table'), Config::get('entrust.user_foreign_key'), Config::get('entrust.role_foreign_key'));
}
/**
* Boot the user model
* Attach event listener to remove the many-to-many records when trying to delete
* Will NOT delete any records if the user model uses soft deletes.
*
* @return void|bool
*/
public static function boot()
{
parent::boot();
static::deleting(function($user) {
if (!method_exists(Config::get('auth.providers.users.model'), 'bootSoftDeletes')) {
$user->roles()->sync([]);
}
return true;
});
}
/**
* Checks if the user has a role by its name.
*
* @param string|array $name Role name or array of role names.
* @param bool $requireAll All roles in the array are required.
*
* @return bool
*/
public function hasRole($name, $requireAll = false)
{
if (is_array($name)) {
foreach ($name as $roleName) {
$hasRole = $this->hasRole($roleName);
if ($hasRole && !$requireAll) {
return true;
} elseif (!$hasRole && $requireAll) {
return false;
}
}
// If we've made it this far and $requireAll is FALSE, then NONE of the roles were found
// If we've made it this far and $requireAll is TRUE, then ALL of the roles were found.
// Return the value of $requireAll;
return $requireAll;
} else {
foreach ($this->cachedRoles() as $role) {
if ($role->name == $name) {
return true;
}
}
}
return false;
}
/**
* Check if user has a permission by its name.
*
* @param string|array $permission Permission string or array of permissions.
* @param bool $requireAll All permissions in the array are required.
*
* @return bool
*/
public function cans($permission, $requireAll = false)
{
if (is_array($permission)) {
foreach ($permission as $permName) {
$hasPerm = $this->cans($permName);
if ($hasPerm && !$requireAll) {
return true;
} elseif (!$hasPerm && $requireAll) {
return false;
}
}
// If we've made it this far and $requireAll is FALSE, then NONE of the perms were found
// If we've made it this far and $requireAll is TRUE, then ALL of the perms were found.
// Return the value of $requireAll;
return $requireAll;
} else {
foreach ($this->cachedRoles() as $role) {
// Validate against the Permission table
foreach ($role->cachedPermissions() as $perm) {
if (Str::is( $permission, $perm->name) ) {
return true;
}
}
}
}
return false;
}
/**
* Checks role(s) and permission(s).
*
* @param string|array $roles Array of roles or comma separated string
* @param string|array $permissions Array of permissions or comma separated string.
* @param array $options validate_all (true|false) or return_type (boolean|array|both)
*
* @throws \InvalidArgumentException
*
* @return array|bool
*/
public function ability($roles, $permissions, $options = [])
{
// Convert string to array if that's what is passed in.
if (!is_array($roles)) {
$roles = explode(',', $roles);
}
if (!is_array($permissions)) {
$permissions = explode(',', $permissions);
}
// Set up default values and validate options.
if (!isset($options['validate_all'])) {
$options['validate_all'] = false;
} else {
if ($options['validate_all'] !== true && $options['validate_all'] !== false) {
throw new InvalidArgumentException();
}
}
if (!isset($options['return_type'])) {
$options['return_type'] = 'boolean';
} else {
if ($options['return_type'] != 'boolean' &&
$options['return_type'] != 'array' &&
$options['return_type'] != 'both') {
throw new InvalidArgumentException();
}
}
// Loop through roles and permissions and check each.
$checkedRoles = [];
$checkedPermissions = [];
foreach ($roles as $role) {
$checkedRoles[$role] = $this->hasRole($role);
}
foreach ($permissions as $permission) {
$checkedPermissions[$permission] = $this->cans($permission);
}
// If validate all and there is a false in either
// Check that if validate all, then there should not be any false.
// Check that if not validate all, there must be at least one true.
if(($options['validate_all'] && !(in_array(false,$checkedRoles) || in_array(false,$checkedPermissions))) ||
(!$options['validate_all'] && (in_array(true,$checkedRoles) || in_array(true,$checkedPermissions)))) {
$validateAll = true;
} else {
$validateAll = false;
}
// Return based on option
if ($options['return_type'] == 'boolean') {
return $validateAll;
} elseif ($options['return_type'] == 'array') {
return ['roles' => $checkedRoles, 'permissions' => $checkedPermissions];
} else {
return [$validateAll, ['roles' => $checkedRoles, 'permissions' => $checkedPermissions]];
}
}
/**
* Alias to eloquent many-to-many relation's attach() method.
*
* @param mixed $role
*/
public function attachRole($role)
{
if(is_object($role)) {
$role = $role->getKey();
}
if(is_array($role)) {
$role = $role['id'];
}
$this->roles()->attach($role);
}
/**
* Alias to eloquent many-to-many relation's detach() method.
*
* @param mixed $role
*/
public function detachRole($role)
{
if (is_object($role)) {
$role = $role->getKey();
}
if (is_array($role)) {
$role = $role['id'];
}
$this->roles()->detach($role);
}
/**
* Attach multiple roles to a user
*
* @param mixed $roles
*/
public function attachRoles($roles)
{
foreach ($roles as $role) {
$this->attachRole($role);
}
}
/**
* Detach multiple roles from a user
*
* @param mixed $roles
*/
public function detachRoles($roles=null)
{
if (!$roles) $roles = $this->roles()->get();
foreach ($roles as $role) {
$this->detachRole($role);
}
}
/**
*Filtering users according to their role
*
*@param string $role
*@return users collection
*/
public function scopeWithRole($query, $role)
{
return $query->whereHas('roles', function ($query) use ($role)
{
$query->where('name', $role);
});
}
}