From d8c428472356abd70aaf1f514b99114464ee7f61 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 7 May 2024 20:15:17 +0200
Subject: [PATCH] Ensure custom favicon is converted to PNG and ICO (#30208)

---
 app/models/site_upload.rb               | 19 +++++++++++++++++--
 app/views/layouts/application.html.haml |  2 +-
 config/imagemagick/policy.xml           |  2 +-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb
index b3926ec7e..6431d1007 100644
--- a/app/models/site_upload.rb
+++ b/app/models/site_upload.rb
@@ -26,8 +26,23 @@ class SiteUpload < ApplicationRecord
   APP_ICON_SIZES = (APPLE_ICON_SIZES + ANDROID_ICON_SIZES).uniq.freeze
 
   STYLES = {
-    app_icon: APP_ICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
-    favicon: FAVICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
+    app_icon:
+      APP_ICON_SIZES.to_h do |size|
+        [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
+      end.freeze,
+
+    favicon: {
+      ico: {
+        format: 'ico',
+        geometry: '48x48#',
+        file_geometry_parser: FastGeometryParser,
+      }.freeze,
+    }.merge(
+      FAVICON_SIZES.to_h do |size|
+        [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
+      end
+    ).freeze,
+
     thumbnail: {
       '@1x': {
         format: 'png',
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 56857b2b6..e3d05226e 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,7 +11,7 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
-    %link{ rel: 'icon', href: site_icon_path('favicon') || '/favicon.ico', type: 'image/x-icon' }/
+    %link{ rel: 'icon', href: site_icon_path('favicon', 'ico') || '/favicon.ico', type: 'image/x-icon' }/
 
     - SiteUpload::FAVICON_SIZES.each do |size|
       %link{ rel: 'icon', sizes: "#{size}x#{size}", href: site_icon_path('favicon', size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
diff --git a/config/imagemagick/policy.xml b/config/imagemagick/policy.xml
index e2aa202f2..2730a9f84 100644
--- a/config/imagemagick/policy.xml
+++ b/config/imagemagick/policy.xml
@@ -23,5 +23,5 @@
   <!-- Disallow any coder by default, and only enable ones required by Mastodon -->
   <policy domain="coder" rights="none" pattern="*" />
   <policy domain="coder" rights="read | write" pattern="{JPEG,PNG,GIF,WEBP,HEIC,AVIF}" />
-  <policy domain="coder" rights="write" pattern="{HISTOGRAM,RGB,INFO}" />
+  <policy domain="coder" rights="write" pattern="{HISTOGRAM,RGB,INFO,ICO}" />
 </policymap>