From aa51696d72cca0013c0ea16028f72e8c0efe57bb Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 4 Mar 2024 02:26:19 +0300 Subject: [PATCH] Added Data URL support for browser extension base64 image uploads --- ShareX.HelpersLib/Helpers/WebHelpers.cs | 50 +++++++++++++++++++------ ShareX.HelpersLib/MimeTypes.cs | 12 +++++- ShareX/TaskHelpers.cs | 4 +- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/ShareX.HelpersLib/Helpers/WebHelpers.cs b/ShareX.HelpersLib/Helpers/WebHelpers.cs index 0a68288c9..6580254a0 100644 --- a/ShareX.HelpersLib/Helpers/WebHelpers.cs +++ b/ShareX.HelpersLib/Helpers/WebHelpers.cs @@ -26,10 +26,10 @@ using System; using System.Drawing; using System.IO; -using System.Linq; using System.Net; using System.Net.Http; using System.Net.Sockets; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ShareX.HelpersLib @@ -92,16 +92,7 @@ public static async Task DownloadImageAsync(string url) { string mediaType = responseMessage.Content.Headers.ContentType.MediaType; - string[] supportedImageTypes = new string[] - { - "image/png", - "image/jpeg", - "image/gif", - "image/bmp", - "image/tiff" - }; - - if (supportedImageTypes.Contains(mediaType, StringComparer.OrdinalIgnoreCase)) + if (MimeTypes.IsImageMimeType(mediaType)) { byte[] data = await responseMessage.Content.ReadAsByteArrayAsync(); MemoryStream memoryStream = new MemoryStream(data); @@ -152,6 +143,43 @@ public static async Task GetFileNameFromWebServerAsync(string url) return fileName; } + // https://en.wikipedia.org/wiki/Data_URI_scheme + public static Bitmap DataURLToImage(string url) + { + if (!string.IsNullOrEmpty(url) && url.StartsWith("data:", StringComparison.OrdinalIgnoreCase)) + { + Match match = Regex.Match(url, @"^data:(?[\w\/]+);base64,(?.+)$", RegexOptions.IgnoreCase); + + if (match.Success) + { + string mediaType = match.Groups["mediaType"].Value; + + if (MimeTypes.IsImageMimeType(mediaType)) + { + string data = match.Groups["data"].Value; + + if (!string.IsNullOrEmpty(data)) + { + try + { + byte[] dataBytes = Convert.FromBase64String(data); + + using (MemoryStream ms = new MemoryStream(dataBytes)) + { + return new Bitmap(ms); + } + } + catch + { + } + } + } + } + } + + return null; + } + public static bool IsSuccessStatusCode(HttpStatusCode statusCode) { int statusCodeNum = (int)statusCode; diff --git a/ShareX.HelpersLib/MimeTypes.cs b/ShareX.HelpersLib/MimeTypes.cs index 061bfb18e..edf07dbf1 100644 --- a/ShareX.HelpersLib/MimeTypes.cs +++ b/ShareX.HelpersLib/MimeTypes.cs @@ -79,8 +79,18 @@ public static string GetMimeTypeFromFileName(string fileName) return DefaultMimeType; } + public static bool IsImageMimeType(string mimeType) + { + return !string.IsNullOrEmpty(mimeType) && + (mimeType.Equals(Mappings["png"], StringComparison.OrdinalIgnoreCase) || + mimeType.Equals(Mappings["jpeg"], StringComparison.OrdinalIgnoreCase) || + mimeType.Equals(Mappings["gif"], StringComparison.OrdinalIgnoreCase) || + mimeType.Equals(Mappings["bmp"], StringComparison.OrdinalIgnoreCase) || + mimeType.Equals(Mappings["tiff"], StringComparison.OrdinalIgnoreCase)); + } + // http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types - private static Dictionary Mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) + private static Dictionary Mappings = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "123", "application/vnd.lotus-1-2-3" }, { "3dml", "text/vnd.in3d.3dml" }, diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index 62e461d13..29152e3e9 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -1956,9 +1956,9 @@ public static async Task HandleNativeMessagingInput(string filePath, TaskSetting case NativeMessagingAction.UploadImage: if (!string.IsNullOrEmpty(nativeMessagingInput.URL)) { - Bitmap bmp = null; + Bitmap bmp = WebHelpers.DataURLToImage(nativeMessagingInput.URL); - if (taskSettings.AdvancedSettings.ProcessImagesDuringExtensionUpload) + if (bmp == null && taskSettings.AdvancedSettings.ProcessImagesDuringExtensionUpload) { try {