]> BookStack Code Mirror - bookstack/blobdiff - app/Uploads/FaviconHandler.php
added routes for zip export
[bookstack] / app / Uploads / FaviconHandler.php
index 2e756c587962e00c6809cab4d5f72e329dc91e0e..d5044943cb7305eb43b03023ab6fcc8acd8aacad 100644 (file)
@@ -3,13 +3,15 @@
 namespace BookStack\Uploads;
 
 use Illuminate\Http\UploadedFile;
-use Intervention\Image\ImageManager;
 
 class FaviconHandler
 {
+    protected string $path;
+
     public function __construct(
-        protected ImageManager $imageTool
+        protected ImageResizer $imageResizer,
     ) {
+        $this->path = public_path('favicon.ico');
     }
 
     /**
@@ -17,32 +19,58 @@ class FaviconHandler
      */
     public function saveForUploadedImage(UploadedFile $file): void
     {
-        $targetPath = public_path('favicon.ico');
-        if (!is_writeable($targetPath)) {
+        if (!is_writeable($this->path)) {
             return;
         }
 
         $imageData = file_get_contents($file->getRealPath());
-        $image = $this->imageTool->make($imageData);
-        $image->resize(32, 32);
-        $bmpData = $image->encode('png');
-        $icoData = $this->pngToIco($bmpData, 32, 32);
+        $pngData = $this->imageResizer->resizeImageData($imageData, 32, 32, false, 'png');
+        $icoData = $this->pngToIco($pngData, 32, 32);
 
-        file_put_contents($targetPath, $icoData);
+        file_put_contents($this->path, $icoData);
     }
 
     /**
      * Restore the original favicon image.
+     * Returned boolean indicates if the copy occurred.
      */
-    public function restoreOriginal(): void
+    public function restoreOriginal(): bool
     {
-        $targetPath = public_path('favicon.ico');
-        $original = public_path('icon.ico');
-        if (!is_writeable($targetPath)) {
-            return;
+        $permissionItem = file_exists($this->path) ? $this->path : dirname($this->path);
+        if (!is_writeable($permissionItem)) {
+            return false;
+        }
+
+        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(): bool
+    {
+        if (file_exists($this->path)) {
+            return true;
         }
 
-        copy($original, $targetPath);
+        return $this->restoreOriginal();
+    }
+
+    /**
+     * Get the path to the favicon file.
+     */
+    public function getPath(): string
+    {
+        return $this->path;
+    }
+
+    /**
+     * Get the path of the original favicon copy.
+     */
+    public function getOriginalPath(): string
+    {
+        return public_path('icon.ico');
     }
 
     /**
@@ -50,7 +78,7 @@ class FaviconHandler
      * Built following the file format info from Wikipedia:
      * https://en.wikipedia.org/wiki/ICO_(file_format)
      */
-    protected function pngToIco(string $bmpData, int $width, int $height): string
+    protected function pngToIco(string $pngData, int $width, int $height): string
     {
         // ICO header
         $header = pack('v', 0x00); // Reserved. Must always be 0
@@ -69,11 +97,11 @@ class FaviconHandler
         // via intervention from png typically provides this as 24.
         $entry .= pack('v', 0x00);
         // Size of the image data in bytes
-        $entry .= pack('V', strlen($bmpData));
+        $entry .= pack('V', strlen($pngData));
         // Offset of the bmp data from file start
         $entry .= pack('V', strlen($header) + strlen($entry) + 4);
 
         // Join & return the combined parts of the ICO image data
-        return $header . $entry . $bmpData;
+        return $header . $entry . $pngData;
     }
 }