]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'feature-613' of git://github.com/Abijeet/BookStack into Abijeet-feature-613
authorDan Brown <redacted>
Fri, 29 Dec 2017 16:25:15 +0000 (16:25 +0000)
committerDan Brown <redacted>
Fri, 29 Dec 2017 16:25:15 +0000 (16:25 +0000)
app/Console/Commands/DeleteUsers.php [new file with mode: 0644]
app/Exceptions/Handler.php
app/Http/Controllers/PageController.php
app/Http/Kernel.php
app/Repos/UserRepo.php
app/User.php
readme.md
resources/views/errors/404.blade.php
resources/views/errors/500.blade.php
tests/ErrorTest.php [new file with mode: 0644]
version

diff --git a/app/Console/Commands/DeleteUsers.php b/app/Console/Commands/DeleteUsers.php
new file mode 100644 (file)
index 0000000..8829d39
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+namespace BookStack\Console\Commands;
+
+use BookStack\User;
+use BookStack\Repos\UserRepo;
+use Illuminate\Console\Command;
+
+class DeleteUsers extends Command{
+
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'bookstack:delete-users';
+
+    protected $user;
+
+    protected $userRepo;
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Delete users that are not "admin" or system users.';
+
+    public function __construct(User $user, UserRepo $userRepo)
+    {
+        $this->user = $user;
+        $this->userRepo = $userRepo;
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $confirm = $this->ask('This will delete all users from the system that are not "admin" or system users. Are you sure you want to continue? (Type "yes" to continue)');
+        $numDeleted = 0;
+        if (strtolower(trim($confirm)) === 'yes')
+        {
+            $totalUsers = $this->user->count();
+            $users = $this->user->where('system_name', '=', null)->with('roles')->get();
+            foreach ($users as $user)
+            {
+                if ($user->hasSystemRole('admin'))
+                {
+                    // don't delete users with "admin" role
+                    continue;
+                }
+                $this->userRepo->destroy($user);
+                ++$numDeleted;
+            }
+            $this->info("Deleted $numDeleted of $totalUsers total users.");
+        }
+        else
+        {
+            $this->info('Exiting...');
+        }
+    }
+
+}
index 12792e15184dfb0cef7bafaa8c28958e0ae5e9f8..a979072e23822f5fcc54b633696ef4115a86c5bf 100644 (file)
@@ -4,11 +4,14 @@ namespace BookStack\Exceptions;
 
 use Exception;
 use Illuminate\Auth\AuthenticationException;
+use Illuminate\Http\Request;
+use Illuminate\Pipeline\Pipeline;
 use Illuminate\Validation\ValidationException;
 use Illuminate\Database\Eloquent\ModelNotFoundException;
 use Symfony\Component\HttpKernel\Exception\HttpException;
 use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
 use Illuminate\Auth\Access\AuthorizationException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
 class Handler extends ExceptionHandler
 {
@@ -60,9 +63,32 @@ class Handler extends ExceptionHandler
             return response()->view('errors/' . $code, ['message' => $message], $code);
         }
 
+        // Handle 404 errors with a loaded session to enable showing user-specific information
+        if ($this->isExceptionType($e, NotFoundHttpException::class)) {
+            return $this->loadErrorMiddleware($request, function ($request) use ($e) {
+                $message = $e->getMessage() ?: trans('errors.404_page_not_found');
+                return response()->view('errors/404', ['message' => $message], 404);
+            });
+        }
+
         return parent::render($request, $e);
     }
 
+    /**
+     * Load the middleware required to show state/session-enabled error pages.
+     * @param Request $request
+     * @param $callback
+     * @return mixed
+     */
+    protected function loadErrorMiddleware(Request $request, $callback)
+    {
+        $middleware = (\Route::getMiddlewareGroups()['web_errors']);
+        return (new Pipeline($this->container))
+            ->send($request)
+            ->through($middleware)
+            ->then($callback);
+    }
+
     /**
      * Check the exception chain to compare against the original exception type.
      * @param Exception $e
index 13e9284650e4f98e725570d43cfe9b4303c2e34b..9dc7d6401f97c07cd8915f802371ebc9bf395021 100644 (file)
@@ -145,6 +145,7 @@ class PageController extends Controller
      * @param string $bookSlug
      * @param string $pageSlug
      * @return Response
+     * @throws NotFoundException
      */
     public function show($bookSlug, $pageSlug)
     {
@@ -152,7 +153,7 @@ class PageController extends Controller
             $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         } catch (NotFoundException $e) {
             $page = $this->entityRepo->getPageByOldSlug($pageSlug, $bookSlug);
-            if ($page === null) abort(404);
+            if ($page === null) throw $e;
             return redirect($page->getUrl());
         }
 
index cd894de95340471f87e73c876cac8e2a4e49a657..9d2871bbeb828dd4c64ed63f78a35eb63c8806e5 100644 (file)
@@ -33,6 +33,14 @@ class Kernel extends HttpKernel
             \Illuminate\Routing\Middleware\SubstituteBindings::class,
             \BookStack\Http\Middleware\Localization::class
         ],
+        'web_errors' => [
+            \BookStack\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \BookStack\Http\Middleware\VerifyCsrfToken::class,
+            \BookStack\Http\Middleware\Localization::class
+        ],
         'api' => [
             'throttle:60,1',
             'bindings',
index c3546a442cc27dc8fecfc54d04ec66f0b16ceac9..52ad2e47e9a3390dd5ed3665a714fe2d361bcee2 100644 (file)
@@ -115,9 +115,9 @@ class UserRepo
      */
     public function isOnlyAdmin(User $user)
     {
-        if (!$user->roles->pluck('name')->contains('admin')) return false;
+        if (!$user->hasSystemRole('admin')) return false;
 
-        $adminRole = $this->role->getRole('admin');
+        $adminRole = $this->role->getSystemRole('admin');
         if ($adminRole->users->count() > 1) return false;
         return true;
     }
index 8033557e4cb9a0a048c1d7112c90f84dc4e4bf70..fd6879ba007dc1d551b7385c6a93c043aebc98db 100644 (file)
@@ -81,7 +81,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
      */
     public function hasSystemRole($role)
     {
-        return $this->roles->pluck('system_name')->contains('admin');
+        return $this->roles->pluck('system_name')->contains($role);
     }
 
     /**
index 1b3db4a5645c383589c9de1c33f6a4570c9fd138..77f1e88054372c96b7b079885ddfd2ef9dcba73f 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -72,7 +72,13 @@ Some strings have colon-prefixed variables in such as `:userName`. Leave these v
 
 Feel free to create issues to request new features or to report bugs and problems. Just please follow the template given when creating the issue.
 
-Pull requests are very welcome. If the scope of your pull request is very large it may be best to open the pull request early or create an issue for it to discuss how it will fit in to the project and plan out the merge.
+### Pull Request
+
+Pull requests are very welcome. If the scope of your pull request is large it may be best to open the pull request early or create an issue for it to discuss how it will fit in to the project and plan out the merge.
+
+Pull requests should be created from the `master` branch and should be merged back into `master` once done. Please do not build from or request a merge into the `release` branch as this is only for publishing releases.
+
+If you are looking to alter CSS or JavaScript content please edit the source files found in `resources/assets`. Any CSS or JS files within `public` are built from these source files and therefore should not be edited directly. 
 
 ## Website, Docs & Blog 
 
index f6ef850afb2c2375c04109f6c6427ddc02b393d4..7cc67a6776bea41bf451bf86902ebee3f220a18d 100644 (file)
@@ -1,8 +1,6 @@
 @extends('simple-layout')
 
 @section('content')
-
-
 <div class="container">
 
     <p>&nbsp;</p>
@@ -16,7 +14,6 @@
     </div>
 
     @if (setting('app-public') || !user()->isDefault())
-
         <div class="row">
             <div class="col-md-4">
                 <div class="card">
index 71fb78a350242909420e9e6abbfbc26912e92044..a01234d811703a4d069a1fd915c23208d2a837b4 100644 (file)
@@ -6,7 +6,7 @@
         <div class="card">
             <h3 class="text-muted">{{ trans('errors.error_occurred') }}</h3>
             <div class="body">
-                <h5>{{ $message }}</h5>
+                <h5>{{ $message or 'An unknown error occurred' }}</h5>
                 <p><a href="{{ baseUrl('/') }}" class="button outline">{{ trans('errors.return_home') }}</a></p>
             </div>
         </div>
diff --git a/tests/ErrorTest.php b/tests/ErrorTest.php
new file mode 100644 (file)
index 0000000..c9b5a01
--- /dev/null
@@ -0,0 +1,18 @@
+<?php namespace Tests;
+
+class ErrorTest extends TestCase
+{
+
+    public function test_404_page_does_not_show_login()
+    {
+        // Due to middleware being handled differently this will not fail
+        // if our custom, middleware-loaded handler fails but this is here
+        // as a reminder and as a general check in the event of other issues.
+        $editor = $this->getEditor();
+        $this->actingAs($editor);
+        $notFound = $this->get('/fgfdngldfnotfound');
+        $notFound->assertStatus(404);
+        $notFound->assertDontSeeText('Log in');
+        $notFound->assertSeeText($editor->getShortName(9));
+    }
+}
\ No newline at end of file
diff --git a/version b/version
index de0ad77915bab6a1a85aa60ba37a325637f2ada4..0507cd08e3bcd70182796a18b0e80854f9a6c35f 100644 (file)
--- a/version
+++ b/version
@@ -1 +1 @@
-v0.18-dev
+v0.20-dev