mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 05:36:00 +00:00
Prevent revision encoding issues
This commit is contained in:
parent
8ea75b0fdf
commit
3fd2613ab7
@ -196,13 +196,19 @@ class PageController extends Controller
|
|||||||
return view('pages/revision', ['page' => $page, 'book' => $book]);
|
return view('pages/revision', ['page' => $page, 'book' => $book]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restores a page using the content of the specified revision.
|
||||||
|
* @param $bookSlug
|
||||||
|
* @param $pageSlug
|
||||||
|
* @param $revisionId
|
||||||
|
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||||
|
*/
|
||||||
public function restoreRevision($bookSlug, $pageSlug, $revisionId)
|
public function restoreRevision($bookSlug, $pageSlug, $revisionId)
|
||||||
{
|
{
|
||||||
$this->checkPermission('page-update');
|
$this->checkPermission('page-update');
|
||||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||||
$revision = $this->pageRepo->getRevisionById($revisionId);
|
$page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
|
||||||
$page = $this->pageRepo->updatePage($page, $book->id, $revision->toArray());
|
|
||||||
Activity::add($page, 'page_restore', $book->id);
|
Activity::add($page, 'page_restore', $book->id);
|
||||||
return redirect($page->getUrl());
|
return redirect($page->getUrl());
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,6 @@ class PageRepo
|
|||||||
$page->updated_by = auth()->user()->id;
|
$page->updated_by = auth()->user()->id;
|
||||||
|
|
||||||
$book->pages()->save($page);
|
$book->pages()->save($page);
|
||||||
$this->saveRevision($page);
|
|
||||||
return $page;
|
return $page;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,13 +201,37 @@ class PageRepo
|
|||||||
*/
|
*/
|
||||||
public function updatePage(Page $page, $book_id, $input)
|
public function updatePage(Page $page, $book_id, $input)
|
||||||
{
|
{
|
||||||
|
// Save a revision before updating
|
||||||
|
if ($page->html !== $input['html'] || $page->name !== $input['name']) {
|
||||||
|
$this->saveRevision($page);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update with new details
|
||||||
$page->fill($input);
|
$page->fill($input);
|
||||||
$page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id);
|
$page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id);
|
||||||
$page->html = $this->formatHtml($input['html']);
|
$page->html = $this->formatHtml($input['html']);
|
||||||
$page->text = strip_tags($page->html);
|
$page->text = strip_tags($page->html);
|
||||||
$page->updated_by = Auth::user()->id;
|
$page->updated_by = auth()->user()->id;
|
||||||
$page->save();
|
$page->save();
|
||||||
|
return $page;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restores a revision's content back into a page.
|
||||||
|
* @param Page $page
|
||||||
|
* @param Book $book
|
||||||
|
* @param int $revisionId
|
||||||
|
* @return Page
|
||||||
|
*/
|
||||||
|
public function restoreRevision(Page $page, Book $book, $revisionId)
|
||||||
|
{
|
||||||
$this->saveRevision($page);
|
$this->saveRevision($page);
|
||||||
|
$revision = $this->getRevisionById($revisionId);
|
||||||
|
$page->fill($revision->toArray());
|
||||||
|
$page->slug = $this->findSuitableSlug($page->name, $book->id, $page->id);
|
||||||
|
$page->text = strip_tags($page->html);
|
||||||
|
$page->updated_by = auth()->user()->id;
|
||||||
|
$page->save();
|
||||||
return $page;
|
return $page;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,15 +240,12 @@ class PageRepo
|
|||||||
* @param Page $page
|
* @param Page $page
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function saveRevision(Page $page)
|
private function saveRevision(Page $page)
|
||||||
{
|
{
|
||||||
$lastRevision = $this->getLastRevision($page);
|
|
||||||
if ($lastRevision && ($lastRevision->html === $page->html && $lastRevision->name === $page->name)) {
|
|
||||||
return $page;
|
|
||||||
}
|
|
||||||
$revision = $this->pageRevision->fill($page->toArray());
|
$revision = $this->pageRevision->fill($page->toArray());
|
||||||
$revision->page_id = $page->id;
|
$revision->page_id = $page->id;
|
||||||
$revision->created_by = Auth::user()->id;
|
$revision->created_by = auth()->user()->id;
|
||||||
|
$revision->created_at = $page->updated_at;
|
||||||
$revision->save();
|
$revision->save();
|
||||||
// Clear old revisions
|
// Clear old revisions
|
||||||
if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
|
if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
|
||||||
@ -235,17 +255,6 @@ class PageRepo
|
|||||||
return $revision;
|
return $revision;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the most recent revision for a page.
|
|
||||||
* @param Page $page
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getLastRevision(Page $page)
|
|
||||||
{
|
|
||||||
return $this->pageRevision->where('page_id', '=', $page->id)
|
|
||||||
->orderBy('created_at', 'desc')->first();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a single revision via it's id.
|
* Gets a single revision via it's id.
|
||||||
* @param $id
|
* @param $id
|
||||||
@ -266,12 +275,17 @@ class PageRepo
|
|||||||
public function doesSlugExist($slug, $bookId, $currentId = false)
|
public function doesSlugExist($slug, $bookId, $currentId = false)
|
||||||
{
|
{
|
||||||
$query = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId);
|
$query = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId);
|
||||||
if ($currentId) {
|
if ($currentId) $query = $query->where('id', '!=', $currentId);
|
||||||
$query = $query->where('id', '!=', $currentId);
|
|
||||||
}
|
|
||||||
return $query->count() > 0;
|
return $query->count() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the book id for the specified page.
|
||||||
|
* Changes the book id of any relations to the page that store the book id.
|
||||||
|
* @param int $bookId
|
||||||
|
* @param Page $page
|
||||||
|
* @return Page
|
||||||
|
*/
|
||||||
public function setBookId($bookId, Page $page)
|
public function setBookId($bookId, Page $page)
|
||||||
{
|
{
|
||||||
$page->book_id = $bookId;
|
$page->book_id = $bookId;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<!-- Meta-->
|
<!-- Meta-->
|
||||||
<meta name="viewport" content="width=device-width">
|
<meta name="viewport" content="width=device-width">
|
||||||
<meta name="token" content="{{ csrf_token() }}">
|
<meta name="token" content="{{ csrf_token() }}">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
<!-- Styles and Fonts -->
|
<!-- Styles and Fonts -->
|
||||||
<link rel="stylesheet" href="/css/styles.css">
|
<link rel="stylesheet" href="/css/styles.css">
|
||||||
|
Loading…
Reference in New Issue
Block a user