| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Tools; | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Actions\ActivityType; | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  | use BookStack\Auth\Permissions\EntityPermission; | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  | use BookStack\Auth\User; | 
					
						
							| 
									
										
										
										
											2022-10-09 23:36:03 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Bookshelf; | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  | use BookStack\Entities\Models\Entity; | 
					
						
							|  |  |  | use BookStack\Facades\Activity; | 
					
						
							|  |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | use Illuminate\Support\Collection; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PermissionsUpdater | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update an entities permissions from a permission form submit request. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function updateFromPermissionsForm(Entity $entity, Request $request) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  |         $permissions = $request->get('permissions', null); | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |         $ownerId = $request->get('owned_by', null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entity->permissions()->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($permissions)) { | 
					
						
							|  |  |  |             $entityPermissionData = $this->formatPermissionsFromRequestToEntityPermissions($permissions); | 
					
						
							|  |  |  |             $entity->permissions()->createMany($entityPermissionData); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($ownerId)) { | 
					
						
							| 
									
										
										
										
											2021-01-02 02:38:54 +08:00
										 |  |  |             $this->updateOwnerFromId($entity, intval($ownerId)); | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entity->save(); | 
					
						
							|  |  |  |         $entity->rebuildPermissions(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  |         Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity); | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update the owner of the given entity. | 
					
						
							|  |  |  |      * Checks the user exists in the system first. | 
					
						
							|  |  |  |      * Does not save the model, just updates it. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function updateOwnerFromId(Entity $entity, int $newOwnerId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $newOwner = User::query()->find($newOwnerId); | 
					
						
							|  |  |  |         if (!is_null($newOwner)) { | 
					
						
							|  |  |  |             $entity->owned_by = $newOwner->id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  |      * Format permissions provided from a permission form to be EntityPermission data. | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  |     protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): array | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-10-08 20:52:59 +08:00
										 |  |  |         $formatted = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($permissions as $roleId => $info) { | 
					
						
							|  |  |  |             $entityPermissionData = ['role_id' => $roleId]; | 
					
						
							|  |  |  |             foreach (EntityPermission::PERMISSIONS as $permission) { | 
					
						
							|  |  |  |                 $entityPermissionData[$permission] = (($info[$permission] ?? false) === "true"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $formatted[] = $entityPermissionData; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $formatted; | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-10-09 23:36:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Copy down the permissions of the given shelf to all child books. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function updateBookPermissionsFromShelf(Bookshelf $shelf, $checkUserPermissions = true): int | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray(); | 
					
						
							| 
									
										
										
										
											2022-10-10 23:58:26 +08:00
										 |  |  |         $shelfBooks = $shelf->books()->get(['id', 'owned_by']); | 
					
						
							| 
									
										
										
										
											2022-10-09 23:36:03 +08:00
										 |  |  |         $updatedBookCount = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** @var Book $book */ | 
					
						
							|  |  |  |         foreach ($shelfBooks as $book) { | 
					
						
							|  |  |  |             if ($checkUserPermissions && !userCan('restrictions-manage', $book)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $book->permissions()->delete(); | 
					
						
							|  |  |  |             $book->permissions()->createMany($shelfPermissions); | 
					
						
							|  |  |  |             $book->rebuildPermissions(); | 
					
						
							|  |  |  |             $updatedBookCount++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $updatedBookCount; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-01-02 01:49:48 +08:00
										 |  |  | } |