| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Auth; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Auth\Permissions\JointPermission; | 
					
						
							| 
									
										
										
										
											2019-02-04 01:34:15 +08:00
										 |  |  | use BookStack\Auth\Permissions\RolePermission; | 
					
						
							| 
									
										
										
										
											2020-11-21 02:53:01 +08:00
										 |  |  | use BookStack\Interfaces\Loggable; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Model; | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Collection; | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Factories\HasFactory; | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\BelongsToMany; | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\HasMany; | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-16 23:24:09 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |  * Class Role. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-09-19 04:21:44 +08:00
										 |  |  |  * @property int        $id | 
					
						
							|  |  |  |  * @property string     $display_name | 
					
						
							|  |  |  |  * @property string     $description | 
					
						
							|  |  |  |  * @property string     $external_auth_id | 
					
						
							|  |  |  |  * @property string     $system_name | 
					
						
							|  |  |  |  * @property bool       $mfa_enforced | 
					
						
							| 
									
										
										
										
											2021-09-18 06:44:54 +08:00
										 |  |  |  * @property Collection $users | 
					
						
							| 
									
										
										
										
											2019-11-16 23:24:09 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-11-21 02:53:01 +08:00
										 |  |  | class Role extends Model implements Loggable | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |     use HasFactory; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-16 02:34:42 +08:00
										 |  |  |     protected $fillable = ['display_name', 'description', 'external_auth_id']; | 
					
						
							| 
									
										
										
										
											2015-09-06 00:42:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-03 20:33:26 +08:00
										 |  |  |     protected $hidden = ['pivot']; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * The roles that belong to the role. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |     public function users(): BelongsToMany | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-02-04 01:34:15 +08:00
										 |  |  |         return $this->belongsToMany(User::class)->orderBy('name', 'asc'); | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |      * Get all related JointPermissions. | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |     public function jointPermissions(): HasMany | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->hasMany(JointPermission::class); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |      * The RolePermissions that belong to the role. | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-12-09 07:46:38 +08:00
										 |  |  |     public function permissions(): BelongsToMany | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-02-04 01:34:15 +08:00
										 |  |  |         return $this->belongsToMany(RolePermission::class, 'permission_role', 'role_id', 'permission_id'); | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Check if this role has a permission. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |     public function hasPermission(string $permissionName): bool | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-01 00:16:06 +08:00
										 |  |  |         $permissions = $this->getRelationValue('permissions'); | 
					
						
							|  |  |  |         foreach ($permissions as $permission) { | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |             if ($permission->getRawAttribute('name') === $permissionName) { | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-01 00:16:06 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-01 00:16:06 +08:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add a permission to this role. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-02-04 01:34:15 +08:00
										 |  |  |     public function attachPermission(RolePermission $permission) | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->permissions()->attach($permission->id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 19:37:58 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Detach a single permission from this role. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-02-04 01:34:15 +08:00
										 |  |  |     public function detachPermission(RolePermission $permission) | 
					
						
							| 
									
										
										
										
											2016-04-09 19:37:58 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-12-31 03:42:46 +08:00
										 |  |  |         $this->permissions()->detach([$permission->id]); | 
					
						
							| 
									
										
										
										
											2016-04-09 19:37:58 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-02 22:48:35 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |      * Get the role of the specified display name. | 
					
						
							| 
									
										
										
										
											2016-01-02 22:48:35 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |     public static function getRole(string $displayName): ?self | 
					
						
							| 
									
										
										
										
											2016-01-02 22:48:35 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |         return static::query()->where('display_name', '=', $displayName)->first(); | 
					
						
							| 
									
										
										
										
											2015-09-06 00:42:05 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the role object for the specified system role. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |     public static function getSystemRole(string $systemName): ?self | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |         return static::query()->where('system_name', '=', $systemName)->first(); | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-05 05:36:30 +08:00
										 |  |  |      * Get all visible roles. | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |     public static function visible(): Collection | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         return static::query()->where('hidden', '=', false)->orderBy('name')->get(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the roles that can be restricted. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-04 21:55:01 +08:00
										 |  |  |     public static function restrictable(): Collection | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-05 05:36:30 +08:00
										 |  |  |         return static::query() | 
					
						
							|  |  |  |             ->where('system_name', '!=', 'admin') | 
					
						
							|  |  |  |             ->orderBy('display_name', 'asc') | 
					
						
							|  |  |  |             ->get(); | 
					
						
							| 
									
										
										
										
											2016-05-02 02:36:53 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-21 02:53:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |      * {@inheritdoc} | 
					
						
							| 
									
										
										
										
											2020-11-21 02:53:01 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function logDescriptor(): string | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return "({$this->id}) {$this->display_name}"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  | } |