]> BookStack Code Mirror - bookstack/commitdiff
Fixed misalignment of page and chapter parent book
authorDan Brown <redacted>
Sat, 13 Mar 2021 15:18:37 +0000 (15:18 +0000)
committerDan Brown <redacted>
Sat, 13 Mar 2021 15:18:37 +0000 (15:18 +0000)
Could occur when a chapter was moved with deleted pages.
Fixes #2632

app/Auth/Permissions/PermissionService.php
app/Entities/Models/BookChild.php
tests/Entity/SortTest.php

index 89c8a5fbb25a55fe54fd95cc8d2721c27c6b9334..342be543e34127abeb8d15d3a0cb5dbf0b9d43a5 100644 (file)
@@ -3,8 +3,10 @@
 use BookStack\Auth\Permissions;
 use BookStack\Auth\Role;
 use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Entity;
 use BookStack\Entities\EntityProvider;
+use BookStack\Entities\Models\Page;
 use BookStack\Model;
 use BookStack\Traits\HasCreatorAndUpdater;
 use BookStack\Traits\HasOwner;
@@ -112,21 +114,16 @@ class PermissionService
 
     /**
      * Get a chapter via ID, Checks local cache
-     * @param $chapterId
-     * @return \BookStack\Entities\Models\Book
      */
-    protected function getChapter($chapterId)
+    protected function getChapter(int $chapterId): ?Chapter
     {
         if (isset($this->entityCache['chapter']) && $this->entityCache['chapter']->has($chapterId)) {
             return $this->entityCache['chapter']->get($chapterId);
         }
 
-        $chapter = $this->entityProvider->chapter->find($chapterId);
-        if ($chapter === null) {
-            $chapter = false;
-        }
-
-        return $chapter;
+        return $this->entityProvider->chapter->newQuery()
+            ->withTrashed()
+            ->find($chapterId);
     }
 
     /**
@@ -460,7 +457,7 @@ class PermissionService
         $hasPermissiveAccessToParents = !$book->restricted;
 
         // For pages with a chapter, Check if explicit permissions are set on the Chapter
-        if ($entity->isA('page') && $entity->chapter_id !== 0 && $entity->chapter_id !== '0') {
+        if ($entity instanceof Page && intval($entity->chapter_id) !== 0) {
             $chapter = $this->getChapter($entity->chapter_id);
             $hasPermissiveAccessToParents = $hasPermissiveAccessToParents && !$chapter->restricted;
             if ($chapter->restricted) {
index 8b968cc8b8d8268ae755bbc79ad42bd24419031e..c73fa3959423598da0e1619c07d9720760374a39 100644 (file)
@@ -1,8 +1,5 @@
 <?php namespace BookStack\Entities\Models;
 
-use BookStack\Entities\Models\Chapter;
-use BookStack\Entities\Models\Entity;
-use BookStack\Entities\Models\Book;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 
@@ -49,7 +46,7 @@ abstract class BookChild extends Entity
 
         // Update all child pages if a chapter
         if ($this instanceof Chapter) {
-            foreach ($this->pages as $page) {
+            foreach ($this->pages()->withTrashed()->get() as $page) {
                 $page->changeBook($newBookId);
             }
         }
index d75a134ea5c298bac5d0f6d826436b24e6dbbd70..d3838c53c11e58e4d72b867dba1aa7e3fd884c04 100644 (file)
@@ -196,6 +196,24 @@ class SortTest extends TestCase
         $this->assertTrue($chapter->book->id == $newBook->id, 'Page book is now the new book');
     }
 
+    public function test_chapter_move_changes_book_for_deleted_pages_within()
+    {
+        /** @var Chapter $chapter */
+        $chapter = Chapter::query()->whereHas('pages')->first();
+        $currentBook = $chapter->book;
+        $pageToCheck = $chapter->pages->first();
+        $newBook = Book::query()->where('id', '!=', $currentBook->id)->first();
+
+        $pageToCheck->delete();
+
+        $this->asEditor()->put($chapter->getUrl('/move'), [
+            'entity_selection' => 'book:' . $newBook->id
+        ]);
+
+        $pageToCheck->refresh();
+        $this->assertEquals($newBook->id, $pageToCheck->book_id);
+    }
+
     public function test_book_sort()
     {
         $oldBook = Book::query()->first();