diff --git a/app/Http/Controllers/FileFunctions/EditController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php similarity index 92% rename from app/Http/Controllers/FileFunctions/EditController.php rename to app/Http/Controllers/FileFunctions/EditItemsController.php index baf27f13..0c85006f 100644 --- a/app/Http/Controllers/FileFunctions/EditController.php +++ b/app/Http/Controllers/FileFunctions/EditItemsController.php @@ -17,7 +17,7 @@ use App\FileManagerFile; use Response; -class EditController extends Controller +class EditItemsController extends Controller { /** * Create new folder @@ -64,11 +64,10 @@ class EditController extends Controller * @param Request $request * @return mixed */ - public function rename_item(Request $request) + public function rename_item(Request $request, $unique_id) { // Validate request $validator = Validator::make($request->all(), [ - 'unique_id' => 'required|integer', 'name' => 'required|string', 'type' => 'required|string', ]); @@ -82,7 +81,7 @@ class EditController extends Controller // Update folder name if ($request->type === 'folder') { - $item = FileManagerFolder::where('unique_id', $request->unique_id) + $item = FileManagerFolder::where('unique_id', $unique_id) ->where('user_id', $user_id) ->firstOrFail(); @@ -96,7 +95,7 @@ class EditController extends Controller } else { - $item = FileManagerFile::where('unique_id', $request->unique_id) + $item = FileManagerFile::where('unique_id', $unique_id) ->where('user_id', $user_id) ->firstOrFail(); @@ -117,13 +116,13 @@ class EditController extends Controller * Delete item * * @param Request $request + * @param $unique_id * @throws \Exception */ - public function delete_item(Request $request) + public function delete_item(Request $request, $unique_id) { // Validate request $validator = Validator::make($request->all(), [ - 'unique_id' => 'required|integer', 'type' => 'required|string', 'force_delete' => 'required|boolean', ]); @@ -141,7 +140,7 @@ class EditController extends Controller $folder = FileManagerFolder::withTrashed() ->with(['folders']) ->where('user_id', $user->id) - ->where('unique_id', $request->unique_id) + ->where('unique_id', $unique_id) ->first(); // Check permission to delete for authenticated public editor @@ -158,7 +157,7 @@ class EditController extends Controller // Get children files $files = FileManagerFile::onlyTrashed() ->where('user_id', $user->id) - ->whereIn('folder_id', Arr::flatten([$request->unique_id, $child_folders])) + ->whereIn('folder_id', Arr::flatten([$unique_id, $child_folders])) ->get(); // Remove all children files @@ -180,7 +179,7 @@ class EditController extends Controller } else { // Remove folder from user favourites - $user->favourites()->detach($request->unique_id); + $user->favourites()->detach($unique_id); // Soft delete folder record $folder->delete(); @@ -189,7 +188,7 @@ class EditController extends Controller $file = FileManagerFile::withTrashed() ->where('user_id', $user->id) - ->where('unique_id', $request->unique_id) + ->where('unique_id', $unique_id) ->first(); // Check permission to delete for authenticated public editor @@ -298,13 +297,13 @@ class EditController extends Controller * Move item * * @param Request $request + * @param $unique_id * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response */ - public function move_item(Request $request) + public function move_item(Request $request, $unique_id) { // Validate request $validator = Validator::make($request->all(), [ - 'from_unique_id' => 'required|integer', 'to_unique_id' => 'required|integer', 'from_type' => 'required|string', ]); @@ -319,7 +318,7 @@ class EditController extends Controller // Move folder $item = FileManagerFolder::where('user_id', $user_id) - ->where('unique_id', $request->from_unique_id) + ->where('unique_id', $unique_id) ->firstOrFail(); $item->parent_id = $request->to_unique_id; @@ -328,7 +327,7 @@ class EditController extends Controller // Move file under new folder $item = FileManagerFile::where('user_id', $user_id) - ->where('unique_id', $request->from_unique_id) + ->where('unique_id', $unique_id) ->firstOrFail(); $item->folder_id = $request->to_unique_id; diff --git a/app/Http/Controllers/FileFunctions/FavouriteController.php b/app/Http/Controllers/FileFunctions/FavouriteController.php index 1bca8335..783c502e 100644 --- a/app/Http/Controllers/FileFunctions/FavouriteController.php +++ b/app/Http/Controllers/FileFunctions/FavouriteController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\FileFunctions; +use App\FileManagerFolder; use Illuminate\Support\Facades\Validator; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; @@ -15,7 +16,7 @@ class FavouriteController extends Controller * @param Request $request * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response */ - public function add_to_favourites(Request $request) + public function store(Request $request) { // Validate request $validator = Validator::make($request->all(), [ @@ -25,8 +26,12 @@ class FavouriteController extends Controller // Return error if ($validator->fails()) abort(400, 'Bad input'); - // Get user + // Get user & folder $user = Auth::user(); + $folder = FileManagerFolder::where('unique_id', $request->unique_id)->first(); + + // Check ownership + if ($folder->user_id !== $user->id) abort(403); // Add folder to user favourites $user->favourites()->attach($request->unique_id); @@ -38,24 +43,16 @@ class FavouriteController extends Controller /** * Remove folder from user favourites * - * @param Request $request + * @param $unique_id * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response */ - public function remove_from_favourites(Request $request) + public function destroy($unique_id) { - // Validate request - $validator = Validator::make($request->all(), [ - 'unique_id' => 'required|integer', - ]); - - // Return error - if ($validator->fails()) abort(400, 'Bad input'); - // Get user $user = Auth::user(); // Remove folder from user favourites - $user->favourites()->detach($request->unique_id); + $user->favourites()->detach($unique_id); // Return updated favourites return $user->favourites->makeHidden(['pivot']); diff --git a/app/Http/Controllers/FileFunctions/ShareController.php b/app/Http/Controllers/FileFunctions/ShareController.php index e453190a..9ea3ffe9 100644 --- a/app/Http/Controllers/FileFunctions/ShareController.php +++ b/app/Http/Controllers/FileFunctions/ShareController.php @@ -2,29 +2,42 @@ namespace App\Http\Controllers\FileFunctions; +use App\Http\Requests\Share\CreateShareRequest; +use App\Http\Requests\Share\UpdateShareRequest; +use App\Http\Resources\ShareResource; use Illuminate\Contracts\Routing\ResponseFactory; use App\Http\Controllers\Controller; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; -use Illuminate\Http\Request; -use Illuminate\Support\Arr; use Illuminate\Support\Str; use App\Share; class ShareController extends Controller { + /** + * Get shared record + * + * @return ShareResource + */ + public function show($token) + { + // Get record + $shared = Share::where(DB::raw('BINARY `token`'), $token) + ->firstOrFail(); + + return new ShareResource($shared); + } /** * Generate file share link * - * @param Request $request - * @return array + * @param CreateShareRequest $request + * @return ShareResource */ - public function store(Request $request) + public function store(CreateShareRequest $request) { - // TODO: validation - do { // Generate unique token $token = Str::random(16); @@ -33,61 +46,61 @@ class ShareController extends Controller // Create shared options $options = [ - 'token' => $token, - 'user_id' => Auth::id(), - 'item_id' => $request->unique_id, - 'permission' => $request->permission, - 'protected' => $request->isPassword, - 'type' => $request->type === 'folder' ? 'folder' : 'file', 'password' => $request->has('password') ? Hash::make($request->password) : null, + 'type' => $request->type === 'folder' ? 'folder' : 'file', + 'protected' => $request->isPassword, + 'permission' => $request->permission, + 'item_id' => $request->unique_id, + 'user_id' => Auth::id(), + 'token' => $token, ]; - // Store shared item - $shared = Share::create($options); - - // Return shared record - return Arr::except($shared, ['password', 'user_id', 'updated_at', 'created_at']); + // Return created shared record + return new ShareResource(Share::create($options)); } /** * Update sharing * - * @param Request $request - * @return mixed + * @param UpdateShareRequest $request + * @param $token + * @return ShareResource */ - public function update(Request $request) + public function update(UpdateShareRequest $request, $token) { - // TODO: validacia - // Get sharing record - $shared = Share::where('token', $request->get('token'))->firstOrFail(); + $shared = Share::where('token', $token) + ->where('user_id', Auth::id()) + ->firstOrFail(); // Update sharing record $shared->update([ 'permission' => $request->permission, - 'protected' => $request->isProtected, - 'password' => $request->has('password') ? Hash::make($request->password) : $shared->password, + 'protected' => $request->protected, + 'password' => $request->password ? Hash::make($request->password) : $shared->password, ]); // Return shared record - return Arr::except($shared, ['password', 'user_id', 'updated_at', 'created_at']); + return new ShareResource($shared); } /** * Delete sharing item * - * @param Request $request + * @param $token * @return ResponseFactory|\Illuminate\Http\Response */ - public function delete(Request $request) + public function destroy($token) { // Get sharing record - $shared = Share::where('token', $request->get('token'))->firstOrFail(); + $shared = Share::where('token', $token) + ->where('user_id', Auth::id()) + ->firstOrFail(); // Delete shared record $shared->delete(); // Done - return response('Done!', 202); + return response('Done!', 204); } } diff --git a/app/Http/Controllers/FileFunctions/TrashController.php b/app/Http/Controllers/FileFunctions/TrashController.php index ede6963a..1e52465a 100644 --- a/app/Http/Controllers/FileFunctions/TrashController.php +++ b/app/Http/Controllers/FileFunctions/TrashController.php @@ -51,13 +51,13 @@ class TrashController extends Controller * Restore item from trash * * @param Request $request + * @param $unique_id * @return ResponseFactory|\Illuminate\Http\Response */ - public function restore(Request $request) + public function restore(Request $request, $unique_id) { // Validate request $validator = Validator::make($request->all(), [ - 'unique_id' => 'required|integer', 'type' => 'required|string', 'to_home' => 'boolean', ]); @@ -72,7 +72,10 @@ class TrashController extends Controller if ($request->type === 'folder') { // Get folder - $item = FileManagerFolder::onlyTrashed()->where('user_id', $user_id)->where('unique_id', $request->unique_id)->first(); + $item = FileManagerFolder::onlyTrashed() + ->where('user_id', $user_id) + ->where('unique_id', $unique_id) + ->first(); // Restore item to home directory if ($request->has('to_home') && $request->to_home) { @@ -82,7 +85,10 @@ class TrashController extends Controller } else { // Get item - $item = FileManagerFile::onlyTrashed()->where('user_id', $user_id)->where('unique_id', $request->unique_id)->first(); + $item = FileManagerFile::onlyTrashed() + ->where('user_id', $user_id) + ->where('unique_id', $unique_id) + ->first(); // Restore item to home directory if ($request->has('to_home') && $request->to_home) { diff --git a/app/Http/Controllers/Sharing/FileSharingController.php b/app/Http/Controllers/Sharing/FileSharingController.php index 8be39bbc..6561194d 100644 --- a/app/Http/Controllers/Sharing/FileSharingController.php +++ b/app/Http/Controllers/Sharing/FileSharingController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\Sharing; use App\Http\Controllers\Controller; +use App\Http\Requests\Share\AuthenticateShareRequest; +use App\Http\Resources\ShareResource; use Illuminate\Contracts\View\Factory; use Illuminate\Support\Facades\Cookie; use Illuminate\Support\Facades\DB; @@ -27,7 +29,7 @@ class FileSharingController extends Controller { // Get shared token $shared = Share::where(DB::raw('BINARY `token`'), $token) - ->firstOrFail(['token', 'item_id', 'type', 'permission', 'protected']); + ->firstOrFail(); // Delete old access_token if exist Cookie::queue('access_token', '', -1); @@ -43,30 +45,15 @@ class FileSharingController extends Controller return view("index"); } - /** - * Get shared record - * - * @param Request $request - * @return mixed - */ - public function show($token) - { - // Get sharing record - return Share::where(DB::raw('BINARY `token`'), $token) - ->firstOrFail(['token', 'item_id', 'type', 'permission', 'protected']); - } - /** * Check Password for protected item * - * @param Request $request + * @param AuthenticateShareRequest $request * @param $token * @return array */ - public function authenticate(Request $request, $token) + public function authenticate(AuthenticateShareRequest $request, $token) { - // TODO: validacia - // Get sharing record $shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail(); @@ -86,7 +73,7 @@ class FileSharingController extends Controller $token = $user->createToken('access_token', [$scope])->accessToken; // Return authorize token with shared options - return response(Arr::except($shared, ['password', 'user_id', 'updated_at', 'created_at']), 200) + return response(new ShareResource($shared), 200) ->cookie('shared_token', $shared->token, 43200) ->cookie('access_token', $token, 43200); } @@ -98,7 +85,7 @@ class FileSharingController extends Controller * @param $unique_id * @return Collection */ - public function browse_private(Request $request, $unique_id) + public function get_private_folders(Request $request, $unique_id) { // Check if token exist if (! $request->hasCookie('shared_token') ) @@ -110,14 +97,8 @@ class FileSharingController extends Controller // Check if user can get directory $this->check_folder_access($unique_id, $shared); - // Get folders and files - $folders = FileManagerFolder::where('user_id', $shared->user_id) - ->where('parent_id', $unique_id) - ->get(); - - $files = FileManagerFile::where('user_id', $shared->user_id) - ->where('folder_id', $unique_id) - ->get(); + // Get files and folders + list($folders, $files) = $this->get_items($unique_id, $shared); // Collect folders and files to single array return collect([$folders, $files])->collapse(); @@ -126,11 +107,10 @@ class FileSharingController extends Controller /** * Browse public folders * - * @param Request $request * @param $unique_id * @return Collection */ - public function browse_public($token, $unique_id) + public function get_public_folders($unique_id, $token) { // Get sharing record $shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail(); @@ -143,24 +123,8 @@ class FileSharingController extends Controller // Check if user can get directory $this->check_folder_access($unique_id, $shared); - // Get folders and files - $folders = FileManagerFolder::where('user_id', $shared->user_id) - ->where('parent_id', $unique_id) - ->get(); - - $files = FileManagerFile::where('user_id', $shared->user_id) - ->where('folder_id', $unique_id) - ->get(); - - // Add shared token to file - /*if ($shared->protected) { - - $files->map(function ($file) use ($shared) { - //$file->thumbnail = $file->getOriginal('thumbnail') . '?token=' . $shared->token; - - $file->thumbnail = route('thumbnail-public', ['name' => $file->getOriginal('thumbnail')]); - }); - }*/ + // Get files and folders + list($folders, $files) = $this->get_items($unique_id, $shared); // Collect folders and files to single array return collect([$folders, $files])->collapse(); @@ -235,4 +199,24 @@ class FileSharingController extends Controller if ($request->cookie('shared_token') !== $request->token) abort(401, "Sorry, you don't have permission"); } + + /** + * Get folders and files + * + * @param $unique_id + * @param $shared + * @return array + */ + private function get_items($unique_id, $shared): array + { + $folders = FileManagerFolder::where('user_id', $shared->user_id) + ->where('parent_id', $unique_id) + ->get(); + + $files = FileManagerFile::where('user_id', $shared->user_id) + ->where('folder_id', $unique_id) + ->get(); + + return [$folders, $files]; + } } diff --git a/app/Http/Requests/Share/AuthenticateShareRequest.php b/app/Http/Requests/Share/AuthenticateShareRequest.php new file mode 100644 index 00000000..0813ed7d --- /dev/null +++ b/app/Http/Requests/Share/AuthenticateShareRequest.php @@ -0,0 +1,20 @@ + 'required|string', + ]; + } +} diff --git a/app/Http/Requests/Share/CreateShareRequest.php b/app/Http/Requests/Share/CreateShareRequest.php new file mode 100644 index 00000000..0b34e4c0 --- /dev/null +++ b/app/Http/Requests/Share/CreateShareRequest.php @@ -0,0 +1,35 @@ + 'required|boolean', + 'unique_id' => 'required|integer', + 'type' => 'required|string', + 'permission' => 'string', + 'password' => 'string', + ]; + } +} diff --git a/app/Http/Requests/Share/UpdateShareRequest.php b/app/Http/Requests/Share/UpdateShareRequest.php new file mode 100644 index 00000000..f618a98a --- /dev/null +++ b/app/Http/Requests/Share/UpdateShareRequest.php @@ -0,0 +1,33 @@ + 'required|boolean', + 'permission' => 'required|string', + 'password' => 'string', + ]; + } +} diff --git a/app/Http/Resources/ShareResource.php b/app/Http/Resources/ShareResource.php new file mode 100644 index 00000000..cbd4a726 --- /dev/null +++ b/app/Http/Resources/ShareResource.php @@ -0,0 +1,34 @@ + [ + 'id' => (string)$this->id, + 'type' => 'shares', + 'attributes' => [ + 'permission' => $this->permission, + 'protected' => $this->protected, + 'item_id' => $this->item_id, + 'token' => $this->token, + 'link' => $this->link, + 'type' => $this->type, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ] + ] + ]; + } +} diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 6448a87f..6208fc4e 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -300,5 +300,31 @@ "/js/main.591c675411457ff698d7.hot-update.js": "/js/main.591c675411457ff698d7.hot-update.js", "/js/main.cccd40ca7d095723a593.hot-update.js": "/js/main.cccd40ca7d095723a593.hot-update.js", "/js/main.a109b65ef389a64af5d7.hot-update.js": "/js/main.a109b65ef389a64af5d7.hot-update.js", - "/js/main.22245e61bfcf217f706c.hot-update.js": "/js/main.22245e61bfcf217f706c.hot-update.js" + "/js/main.22245e61bfcf217f706c.hot-update.js": "/js/main.22245e61bfcf217f706c.hot-update.js", + "/js/main.8c11dfdfaf17845cf09a.hot-update.js": "/js/main.8c11dfdfaf17845cf09a.hot-update.js", + "/js/main.9aff70c5a90a45f159ad.hot-update.js": "/js/main.9aff70c5a90a45f159ad.hot-update.js", + "/js/main.a6168da255f2e7292bcb.hot-update.js": "/js/main.a6168da255f2e7292bcb.hot-update.js", + "/js/main.4242915892933878df4c.hot-update.js": "/js/main.4242915892933878df4c.hot-update.js", + "/js/main.1c80def7a370934633e7.hot-update.js": "/js/main.1c80def7a370934633e7.hot-update.js", + "/js/main.cd80b1fb07f07420d608.hot-update.js": "/js/main.cd80b1fb07f07420d608.hot-update.js", + "/js/main.1ccf6e520ad498fb2dce.hot-update.js": "/js/main.1ccf6e520ad498fb2dce.hot-update.js", + "/js/main.296239d53f66ab2fe920.hot-update.js": "/js/main.296239d53f66ab2fe920.hot-update.js", + "/js/main.dbc6bc0bff80198fcc64.hot-update.js": "/js/main.dbc6bc0bff80198fcc64.hot-update.js", + "/js/main.895bd9fbff26fa41b091.hot-update.js": "/js/main.895bd9fbff26fa41b091.hot-update.js", + "/js/main.3f23297a5d372abb53b1.hot-update.js": "/js/main.3f23297a5d372abb53b1.hot-update.js", + "/js/main.982c4e64795569baaf11.hot-update.js": "/js/main.982c4e64795569baaf11.hot-update.js", + "/js/main.0c91d51f2932b21309cf.hot-update.js": "/js/main.0c91d51f2932b21309cf.hot-update.js", + "/js/main.489c51acf78aba232d2a.hot-update.js": "/js/main.489c51acf78aba232d2a.hot-update.js", + "/js/main.d5ebd32402e90e219490.hot-update.js": "/js/main.d5ebd32402e90e219490.hot-update.js", + "/js/main.cf74f45631e4e7b5ac5c.hot-update.js": "/js/main.cf74f45631e4e7b5ac5c.hot-update.js", + "/js/main.c38976e7274736bb0902.hot-update.js": "/js/main.c38976e7274736bb0902.hot-update.js", + "/js/main.a8a7587e5999f33b671b.hot-update.js": "/js/main.a8a7587e5999f33b671b.hot-update.js", + "/js/main.083f5f31b0cee3b68c36.hot-update.js": "/js/main.083f5f31b0cee3b68c36.hot-update.js", + "/js/main.31b6183ff88b806a8468.hot-update.js": "/js/main.31b6183ff88b806a8468.hot-update.js", + "/js/main.3541bb5c59c00646fcec.hot-update.js": "/js/main.3541bb5c59c00646fcec.hot-update.js", + "/js/main.f3b8c97d25f214197e22.hot-update.js": "/js/main.f3b8c97d25f214197e22.hot-update.js", + "/js/main.03abfdfa85dbfadbb25a.hot-update.js": "/js/main.03abfdfa85dbfadbb25a.hot-update.js", + "/js/main.91ddc8d424d3311b18bc.hot-update.js": "/js/main.91ddc8d424d3311b18bc.hot-update.js", + "/js/main.5f442f8e52b045ff877e.hot-update.js": "/js/main.5f442f8e52b045ff877e.hot-update.js", + "/js/main.027e65e5617c5e8ebc36.hot-update.js": "/js/main.027e65e5617c5e8ebc36.hot-update.js" } diff --git a/resources/js/components/VueFileManagerComponents/FilesView/ContextMenu.vue b/resources/js/components/VueFileManagerComponents/FilesView/ContextMenu.vue index f9f19d11..a1be9755 100644 --- a/resources/js/components/VueFileManagerComponents/FilesView/ContextMenu.vue +++ b/resources/js/components/VueFileManagerComponents/FilesView/ContextMenu.vue @@ -8,7 +8,7 @@ >
@@ -36,7 +36,7 @@