Add excludable permissions for client view list

This commit is contained in:
David Bomba 2023-02-20 19:52:50 +11:00
parent 4364b4369e
commit 949ea3d523
10 changed files with 143 additions and 352 deletions

View File

@ -11,33 +11,34 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Account; use App\Models\User;
use App\Models\BankIntegration; use App\Utils\Ninja;
use App\Models\BankTransaction; use App\Models\Client;
use App\Models\BankTransactionRule;
use App\Models\CompanyGateway;
use App\Models\Design; use App\Models\Design;
use App\Models\ExpenseCategory; use App\Utils\Statics;
use App\Models\GroupSetting; use App\Models\Account;
use App\Models\PaymentTerm; use App\Models\TaxRate;
use App\Models\Webhook;
use App\Models\Scheduler; use App\Models\Scheduler;
use App\Models\TaskStatus; use App\Models\TaskStatus;
use App\Models\TaxRate; use App\Models\PaymentTerm;
use App\Models\User;
use App\Models\Webhook;
use App\Transformers\ArraySerializer;
use App\Transformers\EntityTransformer;
use App\Utils\Ninja;
use App\Utils\Statics;
use App\Utils\Traits\AppSetup;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Fractal\Manager; use League\Fractal\Manager;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use App\Models\GroupSetting;
use League\Fractal\Resource\Collection; use App\Models\CompanyGateway;
use App\Utils\Traits\AppSetup;
use App\Models\BankIntegration;
use App\Models\BankTransaction;
use App\Models\ExpenseCategory;
use League\Fractal\Resource\Item; use League\Fractal\Resource\Item;
use App\Models\BankTransactionRule;
use App\Transformers\ArraySerializer;
use App\Transformers\EntityTransformer;
use League\Fractal\Resource\Collection;
use Illuminate\Database\Eloquent\Builder;
use League\Fractal\Serializer\JsonApiSerializer; use League\Fractal\Serializer\JsonApiSerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use Illuminate\Contracts\Container\BindingResolutionException;
/** /**
* Class BaseController. * Class BaseController.
@ -68,7 +69,13 @@ class BaseController extends Controller
protected $serializer; protected $serializer;
private array $client_exclusion_fields = ['balance','paid_to_date', 'credit_balance','client_hash']; /* Grouped permissions when we want to hide columns for particular permission groups*/
private array $client_exclusion_fields = ['balance', 'paid_to_date', 'credit_balance', 'client_hash'];
private array $client_excludable_permissions = ['view_client'];
private array $client_excludable_overrides = ['edit_client', 'edit_all', 'view_invoice', 'view_all', 'edit_invoice'];
/* Grouped permissions when we want to hide columns for particular permission groups*/
/** /**
* Fractal manager. * Fractal manager.
* @var object * @var object
@ -293,7 +300,10 @@ class BaseController extends Controller
$query->where('clients.user_id', $user->id)->orWhere('clients.assigned_user_id', $user->id); $query->where('clients.user_id', $user->id)->orWhere('clients.assigned_user_id', $user->id);
}); });
} }
if ($user->hasExcludedPermissions($this->client_excludable_permissions, $this->client_excludable_overrides)) {
$query->exclude($this->client_exclusion_fields);
}
}, },
'company.company_gateways' => function ($query) use ($user) { 'company.company_gateways' => function ($query) use ($user) {
$query->whereNotNull('updated_at')->with('gateway'); $query->whereNotNull('updated_at')->with('gateway');
@ -489,7 +499,6 @@ class BaseController extends Controller
); );
if ($query instanceof Builder) { if ($query instanceof Builder) {
$limit = $this->resolveQueryLimit(); $limit = $this->resolveQueryLimit();
$paginator = $query->paginate($limit); $paginator = $query->paginate($limit);
@ -499,11 +508,8 @@ class BaseController extends Controller
$resource = new Collection($query, $transformer, $this->entity_type); $resource = new Collection($query, $transformer, $this->entity_type);
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
} else { } else {
$resource = new Collection($query, $transformer, $this->entity_type); $resource = new Collection($query, $transformer, $this->entity_type);
} }
return $this->response($this->manager->createData($resource)->toArray()); return $this->response($this->manager->createData($resource)->toArray());
@ -657,10 +663,9 @@ class BaseController extends Controller
}); });
} }
if($user->hasIntersectPermissions(['view_client'])){ if ($user->hasExcludedPermissions($this->client_excludable_permissions, $this->client_excludable_overrides)) {
$query->exclude($this->client_exclusion_fields); $query->exclude($this->client_exclusion_fields);
} }
}, },
'company.company_gateways' => function ($query) use ($user) { 'company.company_gateways' => function ($query) use ($user) {
$query->whereNotNull('created_at')->with('gateway'); $query->whereNotNull('created_at')->with('gateway');
@ -871,32 +876,25 @@ class BaseController extends Controller
$query->with($includes); $query->with($includes);
if (auth()->user() && ! auth()->user()->hasPermission('view_'.Str::snake(class_basename($this->entity_type)))) { if (auth()->user() && ! auth()->user()->hasPermission('view_'.Str::snake(class_basename($this->entity_type)))) {
if (in_array($this->entity_type, [User::class])) { if (in_array($this->entity_type, [User::class])) {
$query->where('id', auth()->user()->id); $query->where('id', auth()->user()->id);
} elseif (in_array($this->entity_type, [BankTransactionRule::class,CompanyGateway::class, TaxRate::class, BankIntegration::class, Scheduler::class, BankTransaction::class, Webhook::class, ExpenseCategory::class])) { //table without assigned_user_id } elseif (in_array($this->entity_type, [BankTransactionRule::class,CompanyGateway::class, TaxRate::class, BankIntegration::class, Scheduler::class, BankTransaction::class, Webhook::class, ExpenseCategory::class])) { //table without assigned_user_id
if ($this->entity_type == BankIntegration::class && !auth()->user()->isSuperUser() && auth()->user()->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) { if ($this->entity_type == BankIntegration::class && !auth()->user()->isSuperUser() && auth()->user()->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) {
$query->exclude(["balance"]); $query->exclude(["balance"]);
} //allows us to selective display bank integrations back to the user if they can view / create bank transactions but without the bank balance being present in the response } //allows us to selective display bank integrations back to the user if they can view / create bank transactions but without the bank balance being present in the response
else { else {
$query->where('user_id', '=', auth()->user()->id); $query->where('user_id', '=', auth()->user()->id);
} }
} elseif (in_array($this->entity_type, [Design::class, GroupSetting::class, PaymentTerm::class, TaskStatus::class])) { } elseif (in_array($this->entity_type, [Design::class, GroupSetting::class, PaymentTerm::class, TaskStatus::class])) {
// nlog($this->entity_type); // nlog($this->entity_type);
} else { } else {
$query->where('user_id', '=', auth()->user()->id)->orWhere('assigned_user_id', auth()->user()->id); $query->where('user_id', '=', auth()->user()->id)->orWhere('assigned_user_id', auth()->user()->id);
} }
} }
// if(auth()->user()->hasIntersectPermissions(['view_client'])){ if ($this->entity_type == Client::class && auth()->user()->hasExcludedPermissions($this->client_excludable_permissions, $this->client_excludable_overrides)) {
// $query->exclude($this->client_exclusion_fields); $query->exclude($this->client_exclusion_fields);
// } }
if (request()->has('updated_at') && request()->input('updated_at') > 0) { if (request()->has('updated_at') && request()->input('updated_at') > 0) {
$query->where('updated_at', '>=', date('Y-m-d H:i:s', intval(request()->input('updated_at')))); $query->where('updated_at', '>=', date('Y-m-d H:i:s', intval(request()->input('updated_at'))));

View File

@ -75,8 +75,8 @@ class UserController extends BaseController
* tags={"users"}, * tags={"users"},
* summary="Gets a list of users", * summary="Gets a list of users",
* description="Lists users, search and filters allow fine grained lists to be generated. * description="Lists users, search and filters allow fine grained lists to be generated.
*
Query parameters can be added to performed more fine grained filtering of the users, these are handled by the UserFilters class which defines the methods available", *Query parameters can be added to performed more fine grained filtering of the users, these are handled by the UserFilters class which defines the methods available",
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"), * @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"), * @OA\Parameter(ref="#/components/parameters/include"),

View File

@ -392,8 +392,7 @@ class User extends Authenticatable implements MustVerifyEmail
} }
} }
return $this->isOwner() || return $this->isSuperUser() ||
$this->isAdmin() ||
(stripos($this->token()->cu->permissions, $permission) !== false) || (stripos($this->token()->cu->permissions, $permission) !== false) ||
(stripos($this->token()->cu->permissions, $all_permission) !== false) || (stripos($this->token()->cu->permissions, $all_permission) !== false) ||
(stripos($this->token()->cu->permissions, $edit_all) !== false) || (stripos($this->token()->cu->permissions, $edit_all) !== false) ||
@ -505,24 +504,26 @@ class User extends Authenticatable implements MustVerifyEmail
public function hasExcludedPermissions(array $matched_permission = [], array $excluded_permissions = []): bool public function hasExcludedPermissions(array $matched_permission = [], array $excluded_permissions = []): bool
{ {
if ($this->isSuperUser()) { if ($this->isSuperUser()) {
nlog("returning false as is superuser");
return false; return false;
} }
foreach ($excluded_permissions as $permission) { foreach ($excluded_permissions as $permission) {
if ($this->hasExactPermission($permission)) { if ($this->hasExactPermission($permission)) {
nlog("returning false as has excluded permission {$permission}");
return false; return false;
} }
} }
foreach($matched_permission as $permission) { foreach($matched_permission as $permission) {
if ($this->hasExactPermission($permission)) { if ($this->hasExactPermission($permission)) {
nlog("returning true as has matched permission {$permission}");
return true; return true;
} }
} }
} }
public function documents() public function documents()
{ {
return $this->morphMany(Document::class, 'documentable'); return $this->morphMany(Document::class, 'documentable');

View File

@ -1,52 +0,0 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Providers;
use App\Utils\CssInlinerPlugin;
use Illuminate\Support\ServiceProvider;
class MailCssInlinerServiceProvider extends ServiceProvider
{
// Thanks to @fedeisas/laravel-mail-css-inliner
/**
* Bootstrap the application events.
*
* @return void
*/
public function boot()
{
$this->publishes([
__DIR__.'/../config/css-inliner.php' => base_path('config/css-inliner.php'),
], 'config');
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
// $this->app->singleton(CssInlinerPlugin::class, function ($app) {
// return new CssInlinerPlugin([]);
// });
// $this->app->singleton(CssInlinerPlugin::class, function ($app) {
// return new CssInlinerPlugin([]);
// });
// $this->app->bind(CssInlinerPlugin::class, function ($app) {
// return new CssInlinerPlugin([]);
// });
}
}

View File

@ -1,140 +0,0 @@
<?php
namespace App\Utils;
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;
class CssInlinerPlugin implements \Swift_Events_SendListener
{
/**
* @var CssToInlineStyles
*/
protected $converter;
/**
* @var string[]
*/
protected $cssCache;
/**
* @var array
*/
protected $options;
/**
* @param array $options options defined in the configuration file.
*/
public function __construct(array $options)
{
$this->converter = new CssToInlineStyles();
$this->options = $options;
}
/**
* @param \Swift_Events_SendEvent $evt
*/
public function beforeSendPerformed(\Swift_Events_SendEvent $evt)
{
$message = $evt->getMessage();
if ($message->getContentType() === 'text/html'
|| ($message->getContentType() === 'multipart/alternative' && $message->getBody())
|| ($message->getContentType() === 'multipart/mixed' && $message->getBody())
) {
[$body, $cssResources] = $this->messageSieve($message->getBody());
$css = $this->concatCss($cssResources);
$message->setBody($this->converter->convert($body, $css));
}
foreach ($message->getChildren() as $part) {
if (strpos($part->getContentType(), 'text/html') === 0) {
[$body, $cssResources] = $this->messageSieve($part->getBody());
$css = $this->concatCss($cssResources);
$part->setBody($this->converter->convert($body, $css));
}
}
}
/**
* Do nothing
*
* @param \Swift_Events_SendEvent $evt
*/
public function sendPerformed(\Swift_Events_SendEvent $evt)
{
// Do Nothing
}
protected function concatCss(array $cssResources): string
{
$output = '';
foreach ($cssResources as $cssResource) {
$output .= $this->fetchCss($cssResource);
}
return $output;
}
protected function fetchCss(string $filename): string
{
if (isset($this->cssCache[$filename])) {
return $this->cssCache[$filename];
}
$fixedFilename = $filename;
// Fix relative protocols on hrefs. Assume https.
if (substr($filename, 0, 2) === '//') {
$fixedFilename = 'https:'.$filename;
}
$content = file_get_contents($fixedFilename);
if (! $content) {
return '';
}
$this->cssCache[$filename] = $content;
return $content;
}
protected function messageSieve(string $message): array
{
$cssResources = [];
// Initialize with config defaults, if any
if (isset($this->options['css-files'])) {
$cssResources = $this->options['css-files'];
}
$dom = new \DOMDocument();
// set error level
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($message);
// Restore error level
libxml_use_internal_errors($internalErrors);
$link_tags = $dom->getElementsByTagName('link');
/** @var \DOMElement $link */
foreach ($link_tags as $link) {
if ($link->getAttribute('rel') === 'stylesheet') {
array_push($cssResources, $link->getAttribute('href'));
}
}
$link_tags = $dom->getElementsByTagName('link');
for ($i = $link_tags->length; --$i >= 0;) {
$link = $link_tags->item($i);
if ($link->getAttribute('rel') === 'stylesheet') {
$link->parentNode->removeChild($link);
}
}
if (count($cssResources)) {
return [$dom->saveHTML(), $cssResources];
}
return [$message, []];
}
}

View File

@ -87,7 +87,6 @@
"symfony/http-client": "^6.0", "symfony/http-client": "^6.0",
"symfony/mailgun-mailer": "^6.1", "symfony/mailgun-mailer": "^6.1",
"symfony/postmark-mailer": "^6.1", "symfony/postmark-mailer": "^6.1",
"tijsverkoyen/css-to-inline-styles": "^2.2",
"turbo124/beacon": "^1.3", "turbo124/beacon": "^1.3",
"twilio/sdk": "^6.40", "twilio/sdk": "^6.40",
"webpatser/laravel-countries": "dev-master#75992ad", "webpatser/laravel-countries": "dev-master#75992ad",

189
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "55a62c4290c3a07d0c38c8e4aeea61e0", "content-hash": "6156afb5e414466a8cd7b5903bbcbc6a",
"packages": [ "packages": [
{ {
"name": "afosto/yaac", "name": "afosto/yaac",
@ -379,16 +379,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.258.10", "version": "3.259.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "e164c9c5faf3965bd27ff2a4e9b7b3048ba8a337" "reference": "096711644ebe5c956a97ef449fa2cb3b66443c25"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e164c9c5faf3965bd27ff2a4e9b7b3048ba8a337", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/096711644ebe5c956a97ef449fa2cb3b66443c25",
"reference": "e164c9c5faf3965bd27ff2a4e9b7b3048ba8a337", "reference": "096711644ebe5c956a97ef449fa2cb3b66443c25",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -467,9 +467,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.258.10" "source": "https://github.com/aws/aws-sdk-php/tree/3.259.0"
}, },
"time": "2023-02-14T19:21:16+00:00" "time": "2023-02-17T19:21:38+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -1504,28 +1504,27 @@
}, },
{ {
"name": "doctrine/lexer", "name": "doctrine/lexer",
"version": "2.1.0", "version": "3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/lexer.git", "url": "https://github.com/doctrine/lexer.git",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" "reference": "84a527db05647743d50373e0ec53a152f2cde568"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "reference": "84a527db05647743d50373e0ec53a152f2cde568",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/deprecations": "^1.0", "php": "^8.1"
"php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9 || ^10", "doctrine/coding-standard": "^10",
"phpstan/phpstan": "^1.3", "phpstan/phpstan": "^1.9",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^9.5",
"psalm/plugin-phpunit": "^0.18.3", "psalm/plugin-phpunit": "^0.18.3",
"vimeo/psalm": "^4.11 || ^5.0" "vimeo/psalm": "^5.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -1562,7 +1561,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/lexer/issues", "issues": "https://github.com/doctrine/lexer/issues",
"source": "https://github.com/doctrine/lexer/tree/2.1.0" "source": "https://github.com/doctrine/lexer/tree/3.0.0"
}, },
"funding": [ "funding": [
{ {
@ -1578,7 +1577,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-12-14T08:49:07+00:00" "time": "2022-12-15T16:57:16+00:00"
}, },
{ {
"name": "dragonmantank/cron-expression", "name": "dragonmantank/cron-expression",
@ -2168,16 +2167,16 @@
}, },
{ {
"name": "google/apiclient-services", "name": "google/apiclient-services",
"version": "v0.287.0", "version": "v0.288.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git", "url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "ed58596d34272a5cd0dc2c0595d9a678b9834880" "reference": "de6cfa1556faf4a23d9ab5844508bb576f44fdd7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/ed58596d34272a5cd0dc2c0595d9a678b9834880", "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/de6cfa1556faf4a23d9ab5844508bb576f44fdd7",
"reference": "ed58596d34272a5cd0dc2c0595d9a678b9834880", "reference": "de6cfa1556faf4a23d9ab5844508bb576f44fdd7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2206,9 +2205,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues", "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.287.0" "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.288.0"
}, },
"time": "2023-02-12T01:08:11+00:00" "time": "2023-02-18T01:16:11+00:00"
}, },
{ {
"name": "google/auth", "name": "google/auth",
@ -4232,16 +4231,16 @@
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
"version": "2.3.8", "version": "2.3.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/commonmark.git", "url": "https://github.com/thephpleague/commonmark.git",
"reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47" "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47", "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c1e114f74e518daca2729ea8c4bf1167038fa4b5",
"reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47", "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4334,7 +4333,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-12-10T16:02:17+00:00" "time": "2023-02-15T14:07:24+00:00"
}, },
{ {
"name": "league/config", "name": "league/config",
@ -4504,16 +4503,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.12.2", "version": "3.12.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f" "reference": "81e87e74dd5213795c7846d65089712d2dda90ce"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f", "reference": "81e87e74dd5213795c7846d65089712d2dda90ce",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4575,7 +4574,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.12.2" "source": "https://github.com/thephpleague/flysystem/tree/3.12.3"
}, },
"funding": [ "funding": [
{ {
@ -4591,7 +4590,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-19T12:02:19+00:00" "time": "2023-02-18T15:32:41+00:00"
}, },
{ {
"name": "league/flysystem-aws-s3-v3", "name": "league/flysystem-aws-s3-v3",
@ -4928,16 +4927,16 @@
}, },
{ {
"name": "livewire/livewire", "name": "livewire/livewire",
"version": "v2.11.2", "version": "v2.11.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/livewire/livewire.git", "url": "https://github.com/livewire/livewire.git",
"reference": "e92233f31dc1b88fb1ac242b32afe1ab7525ee05" "reference": "5ab6266a12c637f645d38a2f0f61f84182f6249d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/livewire/livewire/zipball/e92233f31dc1b88fb1ac242b32afe1ab7525ee05", "url": "https://api.github.com/repos/livewire/livewire/zipball/5ab6266a12c637f645d38a2f0f61f84182f6249d",
"reference": "e92233f31dc1b88fb1ac242b32afe1ab7525ee05", "reference": "5ab6266a12c637f645d38a2f0f61f84182f6249d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4989,7 +4988,7 @@
"description": "A front-end framework for Laravel.", "description": "A front-end framework for Laravel.",
"support": { "support": {
"issues": "https://github.com/livewire/livewire/issues", "issues": "https://github.com/livewire/livewire/issues",
"source": "https://github.com/livewire/livewire/tree/v2.11.2" "source": "https://github.com/livewire/livewire/tree/v2.11.3"
}, },
"funding": [ "funding": [
{ {
@ -4997,7 +4996,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-01-29T23:45:02+00:00" "time": "2023-02-20T03:52:35+00:00"
}, },
{ {
"name": "microsoft/microsoft-graph", "name": "microsoft/microsoft-graph",
@ -13071,25 +13070,25 @@
}, },
{ {
"name": "beyondcode/laravel-query-detector", "name": "beyondcode/laravel-query-detector",
"version": "1.6.0", "version": "1.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/beyondcode/laravel-query-detector.git", "url": "https://github.com/beyondcode/laravel-query-detector.git",
"reference": "8261d80c71c97e994c1021fe5c3bd2a1c27106fc" "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/beyondcode/laravel-query-detector/zipball/8261d80c71c97e994c1021fe5c3bd2a1c27106fc", "url": "https://api.github.com/repos/beyondcode/laravel-query-detector/zipball/40c7e168fcf7eeb80d8e96f7922e05ab194269c8",
"reference": "8261d80c71c97e994c1021fe5c3bd2a1c27106fc", "reference": "40c7e168fcf7eeb80d8e96f7922e05ab194269c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0", "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0|^10.0",
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"laravel/legacy-factories": "^1.0", "laravel/legacy-factories": "^1.0",
"orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0", "orchestra/testbench": "^3.0 || ^4.0 || ^5.0 || ^6.0|^8.0",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
}, },
"type": "library", "type": "library",
@ -13125,9 +13124,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/beyondcode/laravel-query-detector/issues", "issues": "https://github.com/beyondcode/laravel-query-detector/issues",
"source": "https://github.com/beyondcode/laravel-query-detector/tree/1.6.0" "source": "https://github.com/beyondcode/laravel-query-detector/tree/1.7.0"
}, },
"time": "2022-02-12T16:23:40+00:00" "time": "2023-02-15T10:37:22+00:00"
}, },
{ {
"name": "brianium/paratest", "name": "brianium/paratest",
@ -13703,30 +13702,30 @@
}, },
{ {
"name": "doctrine/annotations", "name": "doctrine/annotations",
"version": "1.14.3", "version": "2.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/annotations.git", "url": "https://github.com/doctrine/annotations.git",
"reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
"reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/lexer": "^1 || ^2", "doctrine/lexer": "^2 || ^3",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"php": "^7.1 || ^8.0", "php": "^7.2 || ^8.0",
"psr/cache": "^1 || ^2 || ^3" "psr/cache": "^1 || ^2 || ^3"
}, },
"require-dev": { "require-dev": {
"doctrine/cache": "^1.11 || ^2.0", "doctrine/cache": "^2.0",
"doctrine/coding-standard": "^9 || ^10", "doctrine/coding-standard": "^10",
"phpstan/phpstan": "~1.4.10 || ^1.8.0", "phpstan/phpstan": "^1.8.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"symfony/cache": "^4.4 || ^5.4 || ^6", "symfony/cache": "^5.4 || ^6",
"vimeo/psalm": "^4.10" "vimeo/psalm": "^4.10"
}, },
"suggest": { "suggest": {
@ -13773,9 +13772,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/annotations/issues", "issues": "https://github.com/doctrine/annotations/issues",
"source": "https://github.com/doctrine/annotations/tree/1.14.3" "source": "https://github.com/doctrine/annotations/tree/2.0.1"
}, },
"time": "2023-02-01T09:20:38+00:00" "time": "2023-02-02T22:02:53+00:00"
}, },
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
@ -14082,27 +14081,27 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.14.2", "version": "v3.14.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "14f0541651841b63640e7aafad041ad55dc7aa88" "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/14f0541651841b63640e7aafad041ad55dc7aa88", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b",
"reference": "14f0541651841b63640e7aafad041ad55dc7aa88", "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer/semver": "^3.3", "composer/semver": "^3.3",
"composer/xdebug-handler": "^3.0.3", "composer/xdebug-handler": "^3.0.3",
"doctrine/annotations": "^1.14.2 || ^2", "doctrine/annotations": "^2",
"doctrine/lexer": "^2", "doctrine/lexer": "^2 || ^3",
"ext-json": "*", "ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"php": "^7.4 || ^8.0", "php": "^7.4 || ^8.0",
"sebastian/diff": "^4.0", "sebastian/diff": "^4.0 || ^5.0",
"symfony/console": "^5.4 || ^6.0", "symfony/console": "^5.4 || ^6.0",
"symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0",
"symfony/filesystem": "^5.4 || ^6.0", "symfony/filesystem": "^5.4 || ^6.0",
@ -14160,7 +14159,7 @@
"description": "A tool to automatically fix PHP code style", "description": "A tool to automatically fix PHP code style",
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.2" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4"
}, },
"funding": [ "funding": [
{ {
@ -14168,7 +14167,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-01-29T23:47:01+00:00" "time": "2023-02-09T21:49:13+00:00"
}, },
{ {
"name": "hamcrest/hamcrest-php", "name": "hamcrest/hamcrest-php",
@ -14223,24 +14222,24 @@
}, },
{ {
"name": "laracasts/cypress", "name": "laracasts/cypress",
"version": "3.0.0", "version": "3.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laracasts/cypress.git", "url": "https://github.com/laracasts/cypress.git",
"reference": "9a9e5d25a51d2cbb410393e6a0d9883aa3304bf5" "reference": "dd4e61188d4edaf65ffa18851a5df38d0fa0619a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laracasts/cypress/zipball/9a9e5d25a51d2cbb410393e6a0d9883aa3304bf5", "url": "https://api.github.com/repos/laracasts/cypress/zipball/dd4e61188d4edaf65ffa18851a5df38d0fa0619a",
"reference": "9a9e5d25a51d2cbb410393e6a0d9883aa3304bf5", "reference": "dd4e61188d4edaf65ffa18851a5df38d0fa0619a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/support": "^6.0|^7.0|^8.0|^9.0", "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0",
"php": "^8.0" "php": "^8.0"
}, },
"require-dev": { "require-dev": {
"orchestra/testbench": "^6.0|^7.0", "orchestra/testbench": "^6.0|^7.0|^8.0",
"phpunit/phpunit": "^8.0|^9.5.10", "phpunit/phpunit": "^8.0|^9.5.10",
"spatie/laravel-ray": "^1.29" "spatie/laravel-ray": "^1.29"
}, },
@ -14276,9 +14275,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/laracasts/cypress/issues", "issues": "https://github.com/laracasts/cypress/issues",
"source": "https://github.com/laracasts/cypress/tree/3.0.0" "source": "https://github.com/laracasts/cypress/tree/3.0.1"
}, },
"time": "2022-06-27T13:49:35+00:00" "time": "2023-02-16T20:00:16+00:00"
}, },
{ {
"name": "laravel/dusk", "name": "laravel/dusk",
@ -15086,16 +15085,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.9.17", "version": "1.9.18",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2" "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f2d5cf71be91172a57c649770b73c20ebcffb0bf",
"reference": "204e459e7822f2c586463029f5ecec31bb45a1f2", "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -15125,7 +15124,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpstan/phpstan/issues", "issues": "https://github.com/phpstan/phpstan/issues",
"source": "https://github.com/phpstan/phpstan/tree/1.9.17" "source": "https://github.com/phpstan/phpstan/tree/1.9.18"
}, },
"funding": [ "funding": [
{ {
@ -15141,7 +15140,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-08T12:25:00+00:00" "time": "2023-02-17T15:01:27+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
@ -17310,30 +17309,28 @@
}, },
{ {
"name": "zircote/swagger-php", "name": "zircote/swagger-php",
"version": "3.3.7", "version": "3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/zircote/swagger-php.git", "url": "https://github.com/zircote/swagger-php.git",
"reference": "e8c3bb316e385e93a0c7e8b2aa0681079244c381" "reference": "9d172471e56433b5c7061006b9a766f262a3edfd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/zircote/swagger-php/zipball/e8c3bb316e385e93a0c7e8b2aa0681079244c381", "url": "https://api.github.com/repos/zircote/swagger-php/zipball/9d172471e56433b5c7061006b9a766f262a3edfd",
"reference": "e8c3bb316e385e93a0c7e8b2aa0681079244c381", "reference": "9d172471e56433b5c7061006b9a766f262a3edfd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/annotations": "^1.7", "doctrine/annotations": "*",
"ext-json": "*", "ext-json": "*",
"php": ">=7.2", "php": ">=7.2",
"psr/log": "^1.1 || ^2.0 || ^3.0",
"symfony/finder": ">=2.2", "symfony/finder": ">=2.2",
"symfony/yaml": ">=3.3" "symfony/yaml": ">=3.3"
}, },
"require-dev": { "require-dev": {
"composer/package-versions-deprecated": "1.11.99.2", "friendsofphp/php-cs-fixer": "^2.16",
"friendsofphp/php-cs-fixer": "^2.17 || ^3.0", "phpunit/phpunit": ">=8"
"phpunit/phpunit": ">=8.5.14"
}, },
"bin": [ "bin": [
"bin/openapi" "bin/openapi"
@ -17377,9 +17374,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/zircote/swagger-php/issues", "issues": "https://github.com/zircote/swagger-php/issues",
"source": "https://github.com/zircote/swagger-php/tree/3.3.7" "source": "https://github.com/zircote/swagger-php/tree/3.1.0"
}, },
"time": "2023-01-03T21:17:10+00:00" "time": "2020-09-03T20:18:43+00:00"
} }
], ],
"aliases": [], "aliases": [],

View File

@ -201,7 +201,6 @@ return [
App\Providers\MultiDBProvider::class, App\Providers\MultiDBProvider::class,
App\Providers\ClientPortalServiceProvider::class, App\Providers\ClientPortalServiceProvider::class,
App\Providers\NinjaTranslationServiceProvider::class, App\Providers\NinjaTranslationServiceProvider::class,
// App\Providers\MailCssInlinerServiceProvider::class,
], ],
/* /*

View File

@ -1,18 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Css Files
|--------------------------------------------------------------------------
|
| Css file of your style for your emails
| The content of these files will be added directly into the inliner
| Use absolute paths, ie. public_path('css/main.css')
|
*/
'css-files' => [],
];

View File

@ -82,6 +82,13 @@ class PermissionsTest extends TestCase
$low_cu->save(); $low_cu->save();
$this->assertTrue($this->user->hasExcludedPermissions(["view_client"])); $this->assertTrue($this->user->hasExcludedPermissions(["view_client"]));
$low_cu = CompanyUser::where(['company_id' => $this->company->id, 'user_id' => $this->user->id])->first();
$low_cu->permissions = 'view_client';
$low_cu->save();
$this->assertTrue($this->user->hasExcludedPermissions(["view_client"]));
} }
public function testHasExcludedPermissions2() public function testHasExcludedPermissions2()