diff --git a/src/Icons/Controllers/IconsController.cs b/src/Icons/Controllers/IconsController.cs index 186904bc8a..a0ea8815f6 100644 --- a/src/Icons/Controllers/IconsController.cs +++ b/src/Icons/Controllers/IconsController.cs @@ -20,12 +20,17 @@ namespace Bit.Icons.Controllers AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }); private static string _pngMediaType = "image/png"; + private static byte[] _pngHeader = new byte[] { 137, 80, 78, 71 }; private static string _icoMediaType = "image/x-icon"; + private static string _icoAltMediaType = "image/vnd.microsoft.icon"; + private static byte[] _icoHeader = new byte[] { 00, 00, 01, 00 }; private static string _jpegMediaType = "image/jpeg"; + private static byte[] _jpegHeader = new byte[] { 255, 216, 255 }; private static string _octetMediaType = "application/octet-stream"; private static readonly HashSet _allowedMediaTypes = new HashSet{ _pngMediaType, _icoMediaType, + _icoAltMediaType, _jpegMediaType, _octetMediaType }; @@ -62,7 +67,7 @@ namespace Bit.Icons.Controllers if(!_memoryCache.TryGetValue(mappedDomain, out Icon icon)) { var iconUrl = new Uri($"{_iconsSettings.BestIconBaseUrl}/icon" + - $"?url={mappedDomain}&size=16..32..200&fallback_icon_url=" + + $"?url={mappedDomain}&size=16..32..256&fallback_icon_url=" + $"https://raw.githubusercontent.com/bitwarden/web/master/src/images/fa-globe.png"); var response = await _httpClient.GetAsync(iconUrl); response = await FollowRedirectsAsync(response, 1); @@ -81,16 +86,15 @@ namespace Bit.Icons.Controllers if(icon.Format == _octetMediaType) { - if(response.RequestMessage.RequestUri.AbsoluteUri.EndsWith(".ico")) + if(HeaderMatch(icon, _icoHeader)) { icon.Format = _icoMediaType; } - else if(response.RequestMessage.RequestUri.AbsoluteUri.EndsWith(".png")) + else if(HeaderMatch(icon, _pngHeader)) { icon.Format = _pngMediaType; } - else if(response.RequestMessage.RequestUri.AbsoluteUri.EndsWith(".jpeg") || - response.RequestMessage.RequestUri.AbsoluteUri.EndsWith(".jpg")) + else if(HeaderMatch(icon, _jpegHeader)) { icon.Format = _jpegMediaType; } @@ -149,5 +153,10 @@ namespace Bit.Icons.Controllers return response; } + + private bool HeaderMatch(Icon icon, byte[] header) + { + return icon.Image.Length >= header.Length && header.SequenceEqual(icon.Image.Take(header.Length)); + } } }