X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/74a5e3113edad8344a5cb2fc8ea58b271353e358..refs/pull/654/head:/app/Repos/EntityRepo.php diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index c2899b136..24c680234 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -4,6 +4,7 @@ use BookStack\Book; use BookStack\Chapter; use BookStack\Entity; use BookStack\Exceptions\NotFoundException; +use BookStack\Exceptions\NotifyException; use BookStack\Page; use BookStack\PageRevision; use BookStack\Services\AttachmentService; @@ -441,9 +442,10 @@ class EntityRepo */ public function updateEntityPermissionsFromRequest($request, Entity $entity) { - $entity->restricted = $request->has('restricted') && $request->get('restricted') === 'true'; + $entity->restricted = $request->get('restricted', '') === 'true'; $entity->permissions()->delete(); - if ($request->has('restrictions')) { + + if ($request->filled('restrictions')) { foreach ($request->get('restrictions') as $roleId => $restrictions) { foreach ($restrictions as $action => $value) { $entity->permissions()->create([ @@ -453,6 +455,7 @@ class EntityRepo } } } + $entity->save(); $this->permissionService->buildJointPermissionsForEntity($entity); } @@ -552,8 +555,9 @@ class EntityRepo */ protected function nameToSlug($name) { - $slug = str_replace(' ', '-', strtolower($name)); - $slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', $slug); + $slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', mb_strtolower($name)); + $slug = preg_replace('/\s{2,}/', ' ', $slug); + $slug = str_replace(' ', '-', $slug); if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5); return $slug; } @@ -686,6 +690,7 @@ class EntityRepo preg_match_all("/{{@\s?([0-9].*?)}}/", $content, $matches); if (count($matches[0]) === 0) return $content; + $topLevelTags = ['table', 'ul', 'ol']; foreach ($matches[1] as $index => $includeId) { $splitInclude = explode('#', $includeId, 2); $pageId = intval($splitInclude[0]); @@ -710,8 +715,13 @@ class EntityRepo continue; } $innerContent = ''; - foreach ($matchingElem->childNodes as $childNode) { - $innerContent .= $doc->saveHTML($childNode); + $isTopLevel = in_array(strtolower($matchingElem->nodeName), $topLevelTags); + if ($isTopLevel) { + $innerContent .= $doc->saveHTML($matchingElem); + } else { + foreach ($matchingElem->childNodes as $childNode) { + $innerContent .= $doc->saveHTML($childNode); + } } $content = str_replace($matches[0][$index], trim($innerContent), $content); } @@ -1073,6 +1083,7 @@ class EntityRepo /** * Destroy a given page along with its dependencies. * @param Page $page + * @throws NotifyException */ public function destroyPage(Page $page) { @@ -1084,6 +1095,12 @@ class EntityRepo $this->permissionService->deleteJointPermissionsForEntity($page); $this->searchService->deleteEntityTerms($page); + // Check if set as custom homepage + $customHome = setting('app-homepage', '0:'); + if (intval($page->id) === intval(explode(':', $customHome)[0])) { + throw new NotifyException(trans('errors.page_custom_home_deletion'), $page->getUrl()); + } + // Delete Attached Files $attachmentService = app(AttachmentService::class); foreach ($page->attachments as $attachment) {