diff --git a/app/Http/Controllers/AppFunctionsController.php b/app/Http/Controllers/AppFunctionsController.php index 8b347803..92f0fa3d 100644 --- a/app/Http/Controllers/AppFunctionsController.php +++ b/app/Http/Controllers/AppFunctionsController.php @@ -16,6 +16,7 @@ use App\Models\User; use Artisan; use Doctrine\DBAL\Driver\PDOException; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Cookie; use Illuminate\Support\Facades\Mail; use Schema; @@ -70,59 +71,30 @@ class AppFunctionsController extends Controller */ public function og_site($token) { - // Get all settings - $settings = get_settings_in_json(); - - // Get shared token $shared = get_shared($token); - // Get user - $user = User::findOrFail($shared->user_id); + // Get file/folder record + $item = ('App\\Models\\' . ucfirst($shared->type)) + ::where('user_id', $shared->user->id) + ->where('id', $shared->item_id) + ->first(); - // Handle single file - if ($shared->type === 'file') { + if ($item->thumbnail) { + $item->setPublicUrl($token); + } - // Get file record - $file = File::where('user_id', $shared->user_id) - ->where('id', $shared->item_id) - ->first(); - - if ($file->thumbnail) { - $file->setPublicUrl($token); - } - - $metadata = [ + return view("vuefilemanager.crawler.og-view") + ->with('settings', get_settings_in_json()) + ->with('metadata', [ + 'url' => url('/shared', ['token' => $token]), 'is_protected' => $shared->is_protected, - 'url' => url('/shared', ['token' => $token]), - 'user' => $user->name, - 'name' => $file->name, - 'size' => $file->filesize, - 'thumbnail' => $file->thumbnail ? $file->thumbnail : null, - ]; - } - - // Handle single file - if ($shared->type === 'folder') { - - // Get file record - $folder = Folder::where('user_id', $shared->user_id) - ->where('unique_id', $shared->item_id) - ->first(); - - $metadata = [ - 'is_protected' => $shared->protected, - 'url' => url('/shared', ['token' => $token]), - 'user' => $user->name, - 'name' => $folder->name, - 'size' => $folder->items, - 'thumbnail' => null, - ]; - } - - // Return view - return view("og-view") - ->with('settings', $settings) - ->with('metadata', $metadata); + 'user' => $shared->user->settings->name, + 'name' => $item->name, + 'size' => $shared->type === 'folder' + ? $item->items + : $item->filesize, + 'thumbnail' => $item->thumbnail ?? null, + ]); } /** diff --git a/app/Http/Controllers/FileFunctions/ShareController.php b/app/Http/Controllers/FileFunctions/ShareController.php index 7765fc31..01dc65c8 100644 --- a/app/Http/Controllers/FileFunctions/ShareController.php +++ b/app/Http/Controllers/FileFunctions/ShareController.php @@ -94,7 +94,7 @@ class ShareController extends Controller // Update sharing record $shared->update([ 'permission' => $request->permission, - 'protected' => $request->protected, + 'is_protected' => $request->protected, 'expire_in' => $request->expiration, 'password' => $request->password ? Hash::make($request->password) : $shared->password, ]); @@ -149,7 +149,9 @@ class ShareController extends Controller ]); // Return error - if ($validator->fails()) abort(400, 'Bad email input'); + if ($validator->fails()) { + abort(400, 'Bad email input'); + } // Send shared link via email if ($request->has('emails')) { diff --git a/resources/views/og-view.blade.php b/resources/views/vuefilemanager/crawler/og-view.blade.php similarity index 60% rename from resources/views/og-view.blade.php rename to resources/views/vuefilemanager/crawler/og-view.blade.php index 62066b00..8282f604 100644 --- a/resources/views/og-view.blade.php +++ b/resources/views/vuefilemanager/crawler/og-view.blade.php @@ -1,7 +1,7 @@ - + @@ -15,8 +15,8 @@ {{--Show protected og metadata--}} @if($metadata['is_protected']) - - {{ __('vuefilemanager.protected_file') }} | {{ isset($settings->app_title) && $settings->app_title ? $settings->app_title : 'VueFileManager' }} + + {{ __('vuefilemanager.protected_file') }} | {{ $settings->app_title ?? 'VueFileManager' }} @endif {{--Show public og metadata--}} @@ -26,10 +26,9 @@ @endif - - {{ $metadata['name'] }} ({{ $metadata['size'] }}) | {{ isset($settings->app_title) && $settings->app_title ? $settings->app_title : 'VueFileManager' }} + + {{ $metadata['name'] }} ({{ $metadata['size'] }}) | {{ $settings->app_title ?? 'VueFileManager' }} @endif - diff --git a/routes/share.php b/routes/share.php index 6de4d066..c3d0c482 100644 --- a/routes/share.php +++ b/routes/share.php @@ -1,5 +1,6 @@ 'browse'], function () { Route::get('/files/{token}/public', [FileSharingController::class, 'file_public']); Route::get('/shared/{token}', [ShareController::class, 'show']); }); + +Route::get('/og-site/{token}', [AppFunctionsController::class, 'og_site']); \ No newline at end of file diff --git a/tests/Feature/App/AppTest.php b/tests/Feature/App/AppTest.php index 3b6aea66..03a5be2d 100644 --- a/tests/Feature/App/AppTest.php +++ b/tests/Feature/App/AppTest.php @@ -3,7 +3,11 @@ namespace Tests\Feature\App; use App\Http\Mail\SendContactMessage; +use App\Models\File; +use App\Models\Folder; use App\Models\Setting; +use App\Models\Share; +use App\Models\User; use App\Services\SetupService; use Illuminate\Foundation\Testing\DatabaseMigrations; use Mail; @@ -32,6 +36,93 @@ class AppTest extends TestCase ->assertStatus(200); } + /** + * @test + */ + public function it_get_og_page_for_folder() + { + $user = User::factory(User::class) + ->create(); + + $folder = Folder::factory(Folder::class) + ->create([ + 'user_id' => $user->id, + 'name' => 'Folder Title', + ]); + + $share = Share::factory(Share::class) + ->create([ + 'item_id' => $folder->id, + 'user_id' => $user->id, + 'type' => 'folder', + 'is_protected' => false, + ]); + + $this + ->get("/api/og-site/$share->token") + ->assertStatus(200) + ->assertSee('Folder Title'); + } + + /** + * @test + */ + public function it_get_og_page_for_image() + { + $user = User::factory(User::class) + ->create(); + + $file = File::factory(File::class) + ->create([ + 'user_id' => $user->id, + 'name' => 'Fake Image', + 'thumbnail' => 'fake-image-thumbnail.jpg', + ]); + + $share = Share::factory(Share::class) + ->create([ + 'item_id' => $file->id, + 'user_id' => $user->id, + 'type' => 'file', + 'is_protected' => false, + ]); + + $this + ->get("/api/og-site/$share->token") + ->assertStatus(200) + ->assertSee('Fake Image') + ->assertSee('fake-image-thumbnail.jpg'); + } + + /** + * @test + */ + public function it_get_og_page_for_protected_file() + { + $user = User::factory(User::class) + ->create(); + + $file = File::factory(File::class) + ->create([ + 'user_id' => $user->id, + 'name' => 'Fake Image', + 'thumbnail' => 'fake-image-thumbnail.jpg', + ]); + + $share = Share::factory(Share::class) + ->create([ + 'item_id' => $file->id, + 'user_id' => $user->id, + 'type' => 'file', + 'is_protected' => true, + ]); + + $this + ->get("/api/og-site/$share->token") + ->assertStatus(200) + ->assertSee('This link is protected by password'); + } + /** * @test */