From: Dan Brown Date: Tue, 1 Sep 2015 17:28:50 +0000 (+0100) Subject: Added image user checking before deletion. Fixes #13. X-Git-Tag: v0.5.0~55 X-Git-Url: http://source.bookstackapp.com/bookstack/commitdiff_plain/69eff86ff5359d430f72047a3bdd8aa11957b3c3 Added image user checking before deletion. Fixes #13. --- diff --git a/app/Http/Controllers/ImageController.php b/app/Http/Controllers/ImageController.php index 6d01fe2cc..8eafc79b5 100644 --- a/app/Http/Controllers/ImageController.php +++ b/app/Http/Controllers/ImageController.php @@ -9,6 +9,7 @@ use Intervention\Image\Facades\Image as ImageTool; use Illuminate\Support\Facades\DB; use Oxbow\Http\Requests; use Oxbow\Image; +use Oxbow\Repos\PageRepo; class ImageController extends Controller { @@ -27,42 +28,6 @@ class ImageController extends Controller parent::__construct(); } - /** - * Returns an image from behind the public-facing application. - * @param Request $request - * @return \Illuminate\Http\Response - */ - public function getImage(Request $request) - { - $cacheTime = 60 * 60 * 24; - $path = storage_path() . '/' . $request->path(); - $modifiedTime = $this->file->lastModified($path); - $eTag = md5($modifiedTime . $path); - $headerLastModified = gmdate('r', $modifiedTime); - $headerExpires = gmdate('r', $modifiedTime + $cacheTime); - - $headers = [ - 'Last-Modified' => $headerLastModified, - 'Cache-Control' => 'must-revalidate', - 'Pragma' => 'public', - 'Expires' => $headerExpires, - 'Etag' => $eTag - ]; - - $browserModifiedSince = $request->header('If-Modified-Since'); - $browserNoneMatch = $request->header('If-None-Match'); - if ($browserModifiedSince !== null && file_exists($path) && ($browserModifiedSince == $headerLastModified || $browserNoneMatch == $eTag)) { - return response()->make('', 304, $headers); - } - - if (file_exists($path)) { - return response()->make(file_get_contents($path), 200, array_merge($headers, [ - 'Content-Type' => $this->file->mimeType($path), - 'Content-Length' => filesize($path), - ])); - } - abort(404); - } /** * Get all images, Paginated @@ -167,14 +132,23 @@ class ImageController extends Controller /** * Deletes an image and all thumbnail/image files - * @param $id + * @param PageRepo $pageRepo + * @param Request $request + * @param int $id * @return \Illuminate\Http\JsonResponse */ - public function destroy($id) + public function destroy(PageRepo $pageRepo, Request $request, $id) { $this->checkPermission('image-delete'); $image = $this->image->findOrFail($id); + // Check if this image is used on any pages + $pageSearch = $pageRepo->searchForImage($image->url); + $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true); + if ($pageSearch !== false && !$isForced) { + return response()->json($pageSearch, 400); + } + // Delete files $folder = public_path() . dirname($image->url); $fileName = basename($image->url); diff --git a/app/Http/routes.php b/app/Http/routes.php index b4e515f3e..92e416da8 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -59,7 +59,6 @@ Route::group(['middleware' => 'auth'], function () { Route::put('/images/update/{imageId}', 'ImageController@update'); Route::delete('/images/{imageId}', 'ImageController@destroy'); Route::get('/images/all/{page}', 'ImageController@getAll'); - Route::get('/images/{any}', 'ImageController@getImage')->where('any', '.*'); // Links Route::get('/link/{id}', 'PageController@redirectFromLink'); diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index 1d2e08580..d150f6268 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -92,6 +92,22 @@ class PageRepo return $pages; } + /** + * Search for image usage. + * @param $imageString + * @return mixed + */ + public function searchForImage($imageString) + { + $pages = $this->page->where('html', 'like', '%'.$imageString.'%')->get(); + foreach($pages as $page) { + $page->url = $page->getUrl(); + $page->html = ''; + $page->text = ''; + } + return count($pages) > 0 ? $pages : false; + } + /** * Updates a page with any fillable data and saves it into the database. * @param Page $page diff --git a/resources/assets/js/jquery-extensions.js b/resources/assets/js/jquery-extensions.js index c28c5d150..f4302b12b 100644 --- a/resources/assets/js/jquery-extensions.js +++ b/resources/assets/js/jquery-extensions.js @@ -40,4 +40,8 @@ jQuery.fn.showFailure = function (messageMap) { }); }); +}; + +jQuery.fn.submitForm = function() { + $(this).closest('form').submit(); }; \ No newline at end of file diff --git a/resources/assets/sass/image-manager.scss b/resources/assets/sass/image-manager.scss index fc2d2f368..4e9ce7053 100644 --- a/resources/assets/sass/image-manager.scss +++ b/resources/assets/sass/image-manager.scss @@ -15,9 +15,6 @@ left: 0; z-index: 999; display: flex; - p, h1, h2, h3, h4, label, input { - color: #444; - } h1, h2, h3 { font-weight: 300; } diff --git a/resources/views/chapters/form.blade.php b/resources/views/chapters/form.blade.php index cc66c15e0..7603fb443 100644 --- a/resources/views/chapters/form.blade.php +++ b/resources/views/chapters/form.blade.php @@ -12,6 +12,6 @@
- Cancel + Cancel
diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index ed23a9fc2..5a78ba0b4 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -14,8 +14,8 @@
diff --git a/resources/views/pages/image-manager.blade.php b/resources/views/pages/image-manager.blade.php index 1a3897811..4e822941c 100644 --- a/resources/views/pages/image-manager.blade.php +++ b/resources/views/pages/image-manager.blade.php @@ -1,6 +1,6 @@
-