From f333db8e4f7bd164479f7cf437696345f1e52acc Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Thu, 9 Feb 2023 21:16:27 +0000 Subject: [PATCH] Added control-upon-access of the default favicon.ico file --- app/Http/Controllers/HomeController.php | 4 ++-- app/Uploads/FaviconHandler.php | 28 ++++++++++++++++++------- tests/PublicActionTest.php | 12 +++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 84651f653..a82710523 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -136,7 +136,7 @@ class HomeController extends Controller */ public function favicon(FaviconHandler $favicons) { - $favicons->restoreOriginalIfNotExists(); - return response()->file($favicons->getPath()); + $exists = $favicons->restoreOriginalIfNotExists(); + return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath()); } } diff --git a/app/Uploads/FaviconHandler.php b/app/Uploads/FaviconHandler.php index 3dc702ea6..c637356e0 100644 --- a/app/Uploads/FaviconHandler.php +++ b/app/Uploads/FaviconHandler.php @@ -35,25 +35,29 @@ class FaviconHandler /** * Restore the original favicon image. + * Returned boolean indicates if the copy occurred. */ - public function restoreOriginal(): void + public function restoreOriginal(): bool { - $original = public_path('icon.ico'); - if (!is_writeable($this->path)) { - return; + $permissionItem = file_exists($this->path) ? $this->path : dirname($this->path); + if (!is_writeable($permissionItem)) { + return false; } - copy($original, $this->path); + return copy($this->getOriginalPath(), $this->path); } /** * Restore the original favicon image if no favicon image is already in use. + * Returns a boolean to indicate if the file exists. */ - public function restoreOriginalIfNotExists(): void + public function restoreOriginalIfNotExists(): bool { - if (!file_exists($this->path)) { - $this->restoreOriginal(); + if (file_exists($this->path)) { + return true; } + + return $this->restoreOriginal(); } /** @@ -64,6 +68,14 @@ class FaviconHandler return $this->path; } + /** + * Get the path of the original favicon copy. + */ + public function getOriginalPath(): string + { + return public_path('icon.ico'); + } + /** * Convert PNG image data to ICO file format. * Built following the file format info from Wikipedia: diff --git a/tests/PublicActionTest.php b/tests/PublicActionTest.php index afc7fcef3..e21afdf33 100644 --- a/tests/PublicActionTest.php +++ b/tests/PublicActionTest.php @@ -155,6 +155,18 @@ class PublicActionTest extends TestCase $this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /"); } + public function test_default_favicon_file_created_upon_access() + { + $faviconPath = public_path('favicon.ico'); + if (file_exists($faviconPath)) { + unlink($faviconPath); + } + + $this->assertFileDoesNotExist($faviconPath); + $this->get('/favicon.ico'); + $this->assertFileExists($faviconPath); + } + public function test_public_view_then_login_redirects_to_previous_content() { $this->setSettings(['app-public' => 'true']);