pelican-panel-mirror/app/Policies/ServerPolicy.php
Boy132 03745eb4be
Allow to assign nodes to roles (node ownership) (#1231)
* allow to assign nodes to roles

* fix typo

* fix node policy

* small ui improvements

* add missing translation

* make phpstan happy

* fix migration on mysql

* also restrict mounts & database hosts to allowed nodes

* fix migration on mysql v2

* changes from review

* fix hasManyThrough

* change `accessibleNodes` to builder

Co-authored-by: RMartinOscar <40749467+RMartinOscar@users.noreply.github.com>

---------

Co-authored-by: RMartinOscar <40749467+RMartinOscar@users.noreply.github.com>
2025-05-05 12:58:55 +02:00

54 lines
1.4 KiB
PHP

<?php
namespace App\Policies;
use App\Models\Server;
use App\Models\User;
class ServerPolicy
{
use DefaultPolicies;
protected string $modelName = 'server';
/**
* Runs before any of the functions are called. Used to determine if the (sub-)user has permissions.
*/
public function before(User $user, string $ability, string|Server $server): ?bool
{
// For "viewAny" the $server param is the class name
if (is_string($server)) {
return null;
}
// Make sure user can target node of the server
if (!$user->canTarget($server->node)) {
return false;
}
// Owner has full server permissions
if ($server->owner_id === $user->id) {
return true;
}
$subuser = $server->subusers->where('user_id', $user->id)->first();
// If the user is a subuser check their permissions
if ($subuser && in_array($ability, $subuser->permissions)) {
return true;
}
// Return null to let default policies take over
return null;
}
/**
* This is a horrendous hack to avoid Laravel's "smart" behavior that does
* not call the before() function if there isn't a function matching the
* policy permission.
*/
public function __call(string $name, mixed $arguments): void
{
// do nothing
}
}