2022-04-17 19:41:18 -04:00
|
|
|
<?php
|
|
|
|
namespace PonePaste\Helpers;
|
|
|
|
|
|
|
|
use PonePaste\Models\User;
|
|
|
|
use PonePaste\Models\Paste;
|
|
|
|
|
|
|
|
class AbilityHelper {
|
2023-05-13 20:05:10 -04:00
|
|
|
private array $modelToActions = [];
|
2022-04-17 19:41:18 -04:00
|
|
|
private User | null $user;
|
|
|
|
|
|
|
|
public function __construct(User | null $user) {
|
|
|
|
$this->user = $user;
|
2023-05-13 20:05:10 -04:00
|
|
|
$this->setupAllowedActions();
|
2022-04-17 19:41:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public function can(string $action, mixed $subject) : bool {
|
2023-05-13 21:19:35 -04:00
|
|
|
if ($this->user !== null
|
|
|
|
&& $this->user->role == User::ROLE_ADMIN) { // Admins can do anything
|
2022-04-17 19:41:18 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2023-05-13 20:05:10 -04:00
|
|
|
return $this->modelToActions[$subject::class][$action]($this->user, $subject);
|
|
|
|
}
|
2022-04-17 19:41:18 -04:00
|
|
|
|
2023-05-13 20:05:10 -04:00
|
|
|
private function setupAllowedActions() : void {
|
|
|
|
$this->modelToActions['PonePaste\\Models\\Paste'] = [
|
|
|
|
'view' => function(User | null $user, Paste $paste) {
|
2023-05-13 21:19:35 -04:00
|
|
|
$publicly_visible = ((int) $paste->visible !== Paste::VISIBILITY_PRIVATE) && !$paste->is_hidden;
|
|
|
|
|
|
|
|
return $publicly_visible // Everyone can see public pastes
|
|
|
|
|| ($user !== null && $user->id === $paste->user_id) // Creators of pastes can see their own private pastes
|
2024-04-25 12:08:25 -04:00
|
|
|
|| ($user !== null && $user->role >= User::ROLE_MODERATOR); // Moderators and above can see all pastes
|
2023-05-13 20:05:10 -04:00
|
|
|
},
|
|
|
|
'edit' => function(User | null $user, Paste $paste) {
|
2023-05-13 21:19:35 -04:00
|
|
|
return $user !== null
|
|
|
|
&& $user->id === $paste->user_id; // Creators of non-anonymous pastes can edit their own pastes
|
2023-05-13 20:05:10 -04:00
|
|
|
},
|
|
|
|
'hide' => function(User | null $user, Paste $paste) {
|
2023-05-13 21:19:35 -04:00
|
|
|
return $user !== null
|
|
|
|
&& $user->role >= User::ROLE_MODERATOR; // Moderators and above can hide pastes
|
2023-05-13 20:05:10 -04:00
|
|
|
},
|
|
|
|
'delete' => function(User | null $user, Paste $paste) {
|
2023-05-13 21:19:35 -04:00
|
|
|
return $user !== null
|
|
|
|
&& ($user->id === $paste->user_id // Creators of pastes can delete their own pastes
|
|
|
|
|| $user->role >= User::ROLE_ADMIN); // Admins can delete all pastes
|
2023-08-29 03:25:35 -04:00
|
|
|
},
|
|
|
|
'blank' => function(User | null $user, Paste $paste) {
|
|
|
|
return $user !== null
|
|
|
|
&& $user->role >= User::ROLE_ADMIN; // Only admins can blank pastes
|
|
|
|
},
|
2023-05-13 20:05:10 -04:00
|
|
|
];
|
|
|
|
$this->modelToActions['PonePaste\\Models\\User'] = [
|
|
|
|
'view' => function(User | null $user, User $subject) {
|
2023-05-13 21:19:35 -04:00
|
|
|
return true; // Everyone can view users
|
2023-05-13 20:05:10 -04:00
|
|
|
},
|
|
|
|
'edit' => function(User | null $user, User $subject) {
|
2023-05-13 21:19:35 -04:00
|
|
|
return $user !== null
|
|
|
|
&& $user->id === $subject->id; // Users can edit their own profiles
|
2023-05-13 20:05:10 -04:00
|
|
|
},
|
2023-05-15 12:44:04 -04:00
|
|
|
'administrate' => function(User | null $user, User $subject) {
|
|
|
|
return $user !== null
|
|
|
|
&& $user->role >= User::ROLE_ADMIN; // Admins can edit all users
|
|
|
|
}
|
2023-05-13 20:05:10 -04:00
|
|
|
];
|
2022-04-17 19:41:18 -04:00
|
|
|
}
|
2023-02-24 06:26:40 -05:00
|
|
|
}
|