]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'Copy-For-View-Only' of git://github.com/mark-james/BookStack into mark...
authorDan Brown <redacted>
Sat, 9 Mar 2019 16:12:12 +0000 (16:12 +0000)
committerDan Brown <redacted>
Sat, 9 Mar 2019 16:12:12 +0000 (16:12 +0000)
1  2 
app/Auth/Permissions/PermissionService.php
app/Http/Controllers/PageController.php
resources/views/pages/show.blade.php

index af2a5e1fd8c694ee36d2e5e25134e0b3f5ec991d,fa375b4ddf18893735dbeb6723b26042d2719bf2..b28f59cc5018b127eaf15365b20148761de791de
@@@ -190,10 -190,10 +190,10 @@@ class PermissionServic
      {
          return $this->entityProvider->book->newQuery()
              ->select(['id', 'restricted', 'created_by'])->with(['chapters' => function ($query) {
 -            $query->select(['id', 'restricted', 'created_by', 'book_id']);
 -        }, 'pages'  => function ($query) {
 -            $query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
 -        }]);
 +                $query->select(['id', 'restricted', 'created_by', 'book_id']);
 +            }, 'pages'  => function ($query) {
 +                $query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
 +            }]);
      }
  
      /**
          return $q;
      }
  
+     /**
+      * Checks if a user has a book or chapter available to create a page
+      * @param Ownable $ownable
+      * @param $permission
+      * @return bool
+      */
+     public function checkAvailableCreatePageAccess()
+     {
+         $userRoleIds = $this->currentUser()->roles()->pluck('id')->toArray();
+         $userId = $this->currentUser()->id;
+         $canCreatePage = $this->db->table('joint_permissions')
+             ->where('action', '=', 'page-create')
+             ->whereIn('role_id', $userRoleIds)
+             ->where(function ($query) use ($userId) {
+                 $query->where('has_permission', '=', 1)
+                 ->orWhere(function ($query2) use ($userId) {
+                     $query2->where('has_permission_own', '=', 1)
+                     ->where('created_by', '=', $userId);
+                 });       
+             })
+             ->get()->count() > 0;
+         return $canCreatePage;
+     }
      /**
       * Check if an entity has restrictions set on itself or its
       * parent tree.
          $entities = $this->entityProvider;
          $pageSelect = $this->db->table('pages')->selectRaw($entities->page->entityRawQuery($fetchPageContent))
              ->where('book_id', '=', $book_id)->where(function ($query) use ($filterDrafts) {
 -            $query->where('draft', '=', 0);
 -            if (!$filterDrafts) {
 -                $query->orWhere(function ($query) {
 -                    $query->where('draft', '=', 1)->where('created_by', '=', $this->currentUser()->id);
 -                });
 -            }
 -        });
 +                $query->where('draft', '=', 0);
 +                if (!$filterDrafts) {
 +                    $query->orWhere(function ($query) {
 +                        $query->where('draft', '=', 1)->where('created_by', '=', $this->currentUser()->id);
 +                    });
 +                }
 +            });
          $chapterSelect = $this->db->table('chapters')->selectRaw($entities->chapter->entityRawQuery())->where('book_id', '=', $book_id);
          $query = $this->db->query()->select('*')->from($this->db->raw("({$pageSelect->toSql()} UNION {$chapterSelect->toSql()}) AS U"))
              ->mergeBindings($pageSelect)->mergeBindings($chapterSelect);
index b68655241485c572a0ea277f400ffd98e880f461,de3720f9752bb84f8e224b14640e08d8320fb699..d95e02470bee10c63d436421ac7a53cdcff6577c
@@@ -586,7 -586,6 +586,7 @@@ class PageController extends Controlle
      {
          $page = $this->pageRepo->getPageBySlug($pageSlug, $bookSlug);
          $this->checkOwnablePermission('page-update', $page);
 +        $this->checkOwnablePermission('page-delete', $page);
          return view('pages/move', [
              'book' => $page->book,
              'page' => $page
      {
          $page = $this->pageRepo->getPageBySlug($pageSlug, $bookSlug);
          $this->checkOwnablePermission('page-update', $page);
 +        $this->checkOwnablePermission('page-delete', $page);
  
          $entitySelection = $request->get('entity_selection', null);
          if ($entitySelection === null || $entitySelection === '') {
      public function showCopy($bookSlug, $pageSlug)
      {
          $page = $this->pageRepo->getPageBySlug($pageSlug, $bookSlug);
-         $this->checkOwnablePermission('page-update', $page);
+         $this->checkOwnablePermission('page-view', $page);
          session()->flashInput(['name' => $page->name]);
          return view('pages/copy', [
              'book' => $page->book,
      public function copy($bookSlug, $pageSlug, Request $request)
      {
          $page = $this->pageRepo->getPageBySlug($pageSlug, $bookSlug);
-         $this->checkOwnablePermission('page-update', $page);
+         $this->checkOwnablePermission('page-view', $page);
  
          $entitySelection = $request->get('entity_selection', null);
          if ($entitySelection === null || $entitySelection === '') {
index afe007d45fe057df7dc24f58065d40a1985b41a0,011158dfbfd84440e92cd73dc4129b69809a0d97..6f221edee92b37be1fa361dd582cac883cfb148c
              @if(userCan('page-update', $page))
                  <a href="{{ $page->getUrl('/edit') }}" class="text-primary text-button" >@icon('edit'){{ trans('common.edit') }}</a>
              @endif
-             @if(userCan('page-update', $page) || userCan('restrictions-manage', $page) || userCan('page-delete', $page))
+             @if((userCan('page-view', $page) && userCanCreatePage()) || userCan('page-update', $page) || userCan('restrictions-manage', $page) || userCan('page-delete', $page))
                  <div dropdown class="dropdown-container">
                      <a dropdown-toggle class="text-primary text-button">@icon('more') {{ trans('common.more') }}</a>
                      <ul>
-                         @if(userCan('page-update', $page))
+                         @if(userCanCreatePage())
                              <li><a href="{{ $page->getUrl('/copy') }}" class="text-primary" >@icon('copy'){{ trans('common.copy') }}</a></li>
-                             @if(userCan('page-delete', $page))
-                                 <li><a href="{{ $page->getUrl('/move') }}" class="text-primary" >@icon('folder'){{ trans('common.move') }}</a></li>
-                             @endif
+                         @endif
 -                        @if(userCan('page-update', $page))
++                        @if(userCan('page-delete', $page) && userCan('page-update, $page))
+                             <li><a href="{{ $page->getUrl('/move') }}" class="text-primary" >@icon('folder'){{ trans('common.move') }}</a></li>
++                        @endif
++                        @if(userCan('page-update', $page))
                              <li><a href="{{ $page->getUrl('/revisions') }}" class="text-primary">@icon('history'){{ trans('entities.revisions') }}</a></li>
                          @endif
                          @if(userCan('restrictions-manage', $page))