Added control-upon-access of the default favicon.ico file

This commit is contained in:
Dan Brown 2023-02-09 21:16:27 +00:00
parent da42fc7457
commit f333db8e4f
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
3 changed files with 34 additions and 10 deletions

View File

@ -136,7 +136,7 @@ class HomeController extends Controller
*/ */
public function favicon(FaviconHandler $favicons) public function favicon(FaviconHandler $favicons)
{ {
$favicons->restoreOriginalIfNotExists(); $exists = $favicons->restoreOriginalIfNotExists();
return response()->file($favicons->getPath()); return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath());
} }
} }

View File

@ -35,25 +35,29 @@ class FaviconHandler
/** /**
* Restore the original favicon image. * 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'); $permissionItem = file_exists($this->path) ? $this->path : dirname($this->path);
if (!is_writeable($this->path)) { if (!is_writeable($permissionItem)) {
return; 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. * 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)) { if (file_exists($this->path)) {
$this->restoreOriginal(); return true;
} }
return $this->restoreOriginal();
} }
/** /**
@ -64,6 +68,14 @@ class FaviconHandler
return $this->path; 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. * Convert PNG image data to ICO file format.
* Built following the file format info from Wikipedia: * Built following the file format info from Wikipedia:

View File

@ -155,6 +155,18 @@ class PublicActionTest extends TestCase
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /"); $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() public function test_public_view_then_login_redirects_to_previous_content()
{ {
$this->setSettings(['app-public' => 'true']); $this->setSettings(['app-public' => 'true']);