// (c) Copyright Ascensio System SIA 2010-2022 // // This program is a free software product. // You can redistribute it and/or modify it under the terms // of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software // Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended // to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of // any third-party rights. // // This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see // the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html // // You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. // // The interactive user interfaces in modified source and object code versions of the Program must // display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. // // Pursuant to Section 7(b) of the License you must retain the original Product logo when // distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under // trademark law for use of our trademarks. // // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode using UnknownImageFormatException = SixLabors.ImageSharp.UnknownImageFormatException; namespace ASC.Web.Core.WhiteLabel; [Serializable] public class TenantWhiteLabelSettings : ISettings { public const string DefaultLogoText = BaseWhiteLabelSettings.DefaultLogoText; #region Logos information: extension, isDefault, text for img auto generating public string LogoLightSmallExt { get; set; } [JsonPropertyName("DefaultLogoLightSmall")] public bool IsDefaultLogoLightSmall { get; set; } public string LogoDarkExt { get; set; } [JsonPropertyName("DefaultLogoDark")] public bool IsDefaultLogoDark { get; set; } public string LogoFaviconExt { get; set; } [JsonPropertyName("DefaultLogoFavicon")] public bool IsDefaultLogoFavicon { get; set; } public string LogoDocsEditorExt { get; set; } [JsonPropertyName("DefaultLogoDocsEditor")] public bool IsDefaultLogoDocsEditor { get; set; } public string LogoDocsEditorEmbedExt { get; set; } [JsonPropertyName("DefaultLogoDocsEditorEmbed")] public bool IsDefaultLogoDocsEditorEmbed { get; set; } public string LogoLeftMenuExt { get; set; } [JsonPropertyName("DefaultLogoLeftMenu")] public bool IsDefaultLogoLeftMenu { get; set; } public string LogoAboutPageExt { get; set; } [JsonPropertyName("DefaultLogoAboutPage")] public bool IsDefaultLogoAboutPage { get; set; } public string LogoText { get; set; } public string GetLogoText(SettingsManager settingsManager) { if (!string.IsNullOrEmpty(LogoText) && LogoText != DefaultLogoText) { return LogoText; } var partnerSettings = settingsManager.LoadForDefaultTenant(); return string.IsNullOrEmpty(partnerSettings.LogoText) ? DefaultLogoText : partnerSettings.LogoText; } public void SetLogoText(string val) { LogoText = val; } #endregion #region Logo available sizes public static readonly Size LogoLightSmallSize = new Size(422, 48); public static readonly Size LogoLoginPageSize = new Size(810, 92); public static readonly Size LogoFaviconSize = new Size(32, 32); public static readonly Size LogoDocsEditorSize = new Size(172, 40); public static readonly Size LogoDocsEditorEmbedSize = new Size(172, 40); public static readonly Size LogoLeftMenuSize = new Size(56, 56); public static readonly Size LogoAboutPageSize = new Size(810, 92); public static Size GetSize(WhiteLabelLogoTypeEnum type) { return type switch { WhiteLabelLogoTypeEnum.LightSmall => LogoLightSmallSize, WhiteLabelLogoTypeEnum.LoginPage => LogoLoginPageSize, WhiteLabelLogoTypeEnum.Favicon => LogoFaviconSize, WhiteLabelLogoTypeEnum.DocsEditor => LogoDocsEditorSize, WhiteLabelLogoTypeEnum.DocsEditorEmbed => LogoDocsEditorEmbedSize, WhiteLabelLogoTypeEnum.LeftMenu => LogoLeftMenuSize, WhiteLabelLogoTypeEnum.AboutPage => LogoAboutPageSize, _ => new Size(), }; } #endregion #region ISettings Members public TenantWhiteLabelSettings GetDefault() { return new TenantWhiteLabelSettings { LogoLightSmallExt = null, LogoDarkExt = null, LogoFaviconExt = null, LogoDocsEditorExt = null, LogoDocsEditorEmbedExt = null, LogoLeftMenuExt = null, LogoAboutPageExt = null, IsDefaultLogoLightSmall = true, IsDefaultLogoDark = true, IsDefaultLogoFavicon = true, IsDefaultLogoDocsEditor = true, IsDefaultLogoDocsEditorEmbed = true, IsDefaultLogoLeftMenu = true, IsDefaultLogoAboutPage = true, LogoText = null }; } #endregion [JsonIgnore] public Guid ID { get { return new Guid("{05d35540-c80b-4b17-9277-abd9e543bf93}"); } } #region Get/Set IsDefault and Extension internal bool GetIsDefault(WhiteLabelLogoTypeEnum type) { return type switch { WhiteLabelLogoTypeEnum.LightSmall => IsDefaultLogoLightSmall, WhiteLabelLogoTypeEnum.LoginPage => IsDefaultLogoDark, WhiteLabelLogoTypeEnum.Favicon => IsDefaultLogoFavicon, WhiteLabelLogoTypeEnum.DocsEditor => IsDefaultLogoDocsEditor, WhiteLabelLogoTypeEnum.DocsEditorEmbed => IsDefaultLogoDocsEditorEmbed, WhiteLabelLogoTypeEnum.LeftMenu => IsDefaultLogoLeftMenu, WhiteLabelLogoTypeEnum.AboutPage => IsDefaultLogoAboutPage, _ => true, }; } internal void SetIsDefault(WhiteLabelLogoTypeEnum type, bool value) { switch (type) { case WhiteLabelLogoTypeEnum.LightSmall: IsDefaultLogoLightSmall = value; break; case WhiteLabelLogoTypeEnum.LoginPage: IsDefaultLogoDark = value; break; case WhiteLabelLogoTypeEnum.Favicon: IsDefaultLogoFavicon = value; break; case WhiteLabelLogoTypeEnum.DocsEditor: IsDefaultLogoDocsEditor = value; break; case WhiteLabelLogoTypeEnum.DocsEditorEmbed: IsDefaultLogoDocsEditorEmbed = value; break; case WhiteLabelLogoTypeEnum.LeftMenu: IsDefaultLogoLeftMenu = value; break; case WhiteLabelLogoTypeEnum.AboutPage: IsDefaultLogoAboutPage = value; break; } } internal string GetExt(WhiteLabelLogoTypeEnum type) { return type switch { WhiteLabelLogoTypeEnum.LightSmall => LogoLightSmallExt, WhiteLabelLogoTypeEnum.LoginPage => LogoDarkExt, WhiteLabelLogoTypeEnum.Favicon => LogoFaviconExt, WhiteLabelLogoTypeEnum.DocsEditor => LogoDocsEditorExt, WhiteLabelLogoTypeEnum.DocsEditorEmbed => LogoDocsEditorEmbedExt, WhiteLabelLogoTypeEnum.LeftMenu => LogoLeftMenuExt, WhiteLabelLogoTypeEnum.AboutPage => LogoAboutPageExt, _ => "", }; } internal void SetExt(WhiteLabelLogoTypeEnum type, string fileExt) { switch (type) { case WhiteLabelLogoTypeEnum.LightSmall: LogoLightSmallExt = fileExt; break; case WhiteLabelLogoTypeEnum.LoginPage: LogoDarkExt = fileExt; break; case WhiteLabelLogoTypeEnum.Favicon: LogoFaviconExt = fileExt; break; case WhiteLabelLogoTypeEnum.DocsEditor: LogoDocsEditorExt = fileExt; break; case WhiteLabelLogoTypeEnum.DocsEditorEmbed: LogoDocsEditorEmbedExt = fileExt; break; case WhiteLabelLogoTypeEnum.LeftMenu: LogoLeftMenuExt = fileExt; break; case WhiteLabelLogoTypeEnum.AboutPage: LogoAboutPageExt = fileExt; break; } } #endregion } [Scope] public class TenantWhiteLabelSettingsHelper { private const string ModuleName = "whitelabel"; private readonly WebImageSupplier _webImageSupplier; private readonly UserPhotoManager _userPhotoManager; private readonly StorageFactory _storageFactory; private readonly WhiteLabelHelper _whiteLabelHelper; private readonly TenantManager _tenantManager; private readonly SettingsManager _settingsManager; private readonly ILogger _log; public TenantWhiteLabelSettingsHelper( WebImageSupplier webImageSupplier, UserPhotoManager userPhotoManager, StorageFactory storageFactory, WhiteLabelHelper whiteLabelHelper, TenantManager tenantManager, SettingsManager settingsManager, ILogger logger) { _webImageSupplier = webImageSupplier; _userPhotoManager = userPhotoManager; _storageFactory = storageFactory; _whiteLabelHelper = whiteLabelHelper; _tenantManager = tenantManager; _settingsManager = settingsManager; _log = logger; } #region Restore default public bool IsDefault(TenantWhiteLabelSettings tenantWhiteLabelSettings) { var defaultSettings = _settingsManager.GetDefault(); return tenantWhiteLabelSettings.LogoLightSmallExt == defaultSettings.LogoLightSmallExt && tenantWhiteLabelSettings.LogoDarkExt == defaultSettings.LogoDarkExt && tenantWhiteLabelSettings.LogoFaviconExt == defaultSettings.LogoFaviconExt && tenantWhiteLabelSettings.LogoDocsEditorExt == defaultSettings.LogoDocsEditorExt && tenantWhiteLabelSettings.LogoDocsEditorEmbedExt == defaultSettings.LogoDocsEditorEmbedExt && tenantWhiteLabelSettings.LogoLeftMenuExt == defaultSettings.LogoLeftMenuExt && tenantWhiteLabelSettings.LogoAboutPageExt == defaultSettings.LogoAboutPageExt && tenantWhiteLabelSettings.IsDefaultLogoLightSmall == defaultSettings.IsDefaultLogoLightSmall && tenantWhiteLabelSettings.IsDefaultLogoDark == defaultSettings.IsDefaultLogoDark && tenantWhiteLabelSettings.IsDefaultLogoFavicon == defaultSettings.IsDefaultLogoFavicon && tenantWhiteLabelSettings.IsDefaultLogoDocsEditor == defaultSettings.IsDefaultLogoDocsEditor && tenantWhiteLabelSettings.IsDefaultLogoDocsEditorEmbed == defaultSettings.IsDefaultLogoDocsEditorEmbed && tenantWhiteLabelSettings.IsDefaultLogoLeftMenu == defaultSettings.IsDefaultLogoLeftMenu && tenantWhiteLabelSettings.IsDefaultLogoAboutPage == defaultSettings.IsDefaultLogoAboutPage && tenantWhiteLabelSettings.LogoText == defaultSettings.LogoText; } public async Task RestoreDefault(TenantWhiteLabelSettings tenantWhiteLabelSettings, TenantLogoManager tenantLogoManager, int tenantId, IDataStore storage = null) { tenantWhiteLabelSettings.LogoLightSmallExt = null; tenantWhiteLabelSettings.LogoDarkExt = null; tenantWhiteLabelSettings.LogoFaviconExt = null; tenantWhiteLabelSettings.LogoDocsEditorExt = null; tenantWhiteLabelSettings.LogoDocsEditorEmbedExt = null; tenantWhiteLabelSettings.LogoLeftMenuExt = null; tenantWhiteLabelSettings.LogoAboutPageExt = null; tenantWhiteLabelSettings.IsDefaultLogoLightSmall = true; tenantWhiteLabelSettings.IsDefaultLogoDark = true; tenantWhiteLabelSettings.IsDefaultLogoFavicon = true; tenantWhiteLabelSettings.IsDefaultLogoDocsEditor = true; tenantWhiteLabelSettings.IsDefaultLogoDocsEditorEmbed = true; tenantWhiteLabelSettings.IsDefaultLogoLeftMenu = true; tenantWhiteLabelSettings.IsDefaultLogoAboutPage = true; tenantWhiteLabelSettings.SetLogoText(null); var store = storage ?? _storageFactory.GetStorage(tenantId, ModuleName); try { await store.DeleteFilesAsync("", "*", false); } catch (Exception e) { _log.ErrorRestoreDefault(e); } Save(tenantWhiteLabelSettings, tenantId, tenantLogoManager, true); } public async Task RestoreDefault(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type) { if (!tenantWhiteLabelSettings.GetIsDefault(type)) { try { tenantWhiteLabelSettings.SetIsDefault(type, true); var store = _storageFactory.GetStorage(_tenantManager.GetCurrentTenant().Id, ModuleName); await DeleteLogoFromStore(tenantWhiteLabelSettings, store, type, false); await DeleteLogoFromStore(tenantWhiteLabelSettings, store, type, true); } catch (Exception e) { _log.ErrorRestoreDefault(e); } } } #endregion #region Set logo public async Task SetLogo(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, string logoFileExt, byte[] data, bool dark, IDataStore storage = null) { var store = storage ?? _storageFactory.GetStorage(_tenantManager.GetCurrentTenant().Id, ModuleName); #region delete from storage if already exists var isAlreadyHaveBeenChanged = !tenantWhiteLabelSettings.GetIsDefault(type); if (isAlreadyHaveBeenChanged) { try { await DeleteLogoFromStore(tenantWhiteLabelSettings, store, type, dark); } catch (Exception e) { _log.ErrorSetLogo(e); } } #endregion using (var memory = new MemoryStream(data)) { var logoFileName = BuildLogoFileName(type, logoFileExt, dark); memory.Seek(0, SeekOrigin.Begin); await store.SaveAsync(logoFileName, memory); } } public async Task SetLogo(TenantWhiteLabelSettings tenantWhiteLabelSettings, Dictionary> logo, IDataStore storage = null) { foreach (var currentLogo in logo) { var currentLogoType = (WhiteLabelLogoTypeEnum)currentLogo.Key; byte[] darkData; string extDark; var (lightData, extLight) = await GetLogoData(currentLogo.Value.Key); if (currentLogo.Value.Key == currentLogo.Value.Value) { darkData = lightData; extDark = extLight; } else { (darkData, extDark) = await GetLogoData(currentLogo.Value.Value); } if (lightData == null && darkData == null) { return; } if (lightData != null) { await SetLogo(tenantWhiteLabelSettings, currentLogoType, extLight, lightData, false, storage); } if (darkData != null && CanBeDark(currentLogoType)) { await SetLogo(tenantWhiteLabelSettings, currentLogoType, extDark, darkData, true, storage); } tenantWhiteLabelSettings.SetExt(currentLogoType, extLight); tenantWhiteLabelSettings.SetIsDefault(currentLogoType, false); } } private async Task<(byte[], string)> GetLogoData(string logo) { var supportedFormats = new[] { new { mime = "image/jpeg", ext = "jpg" }, new { mime = "image/png", ext = "png" }, new { mime = "image/svg+xml", ext = "svg" } }; string ext = null; if (!string.IsNullOrEmpty(logo)) { byte[] data; var format = supportedFormats.FirstOrDefault(r => logo.StartsWith($"data:{r.mime};base64,")); if (format == null) { var fileName = Path.GetFileName(logo); ext = fileName.Split('.').Last(); data = await _userPhotoManager.GetTempPhotoData(fileName); try { await _userPhotoManager.RemoveTempPhoto(fileName); } catch (Exception ex) { _log.ErrorSetLogo(ex); } } else { ext = format.ext; var xB64 = logo.Substring($"data:{format.mime};base64,".Length); // Get the Base64 string data = Convert.FromBase64String(xB64); // Convert the Base64 string to binary data } return (data, ext); } else { return (null, ext); } } public async Task SetLogoFromStream(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, string fileExt, Stream fileStream, Stream fileDarkStream, IDataStore storage = null) { var lightData = GetData(fileStream); var darkData = GetData(fileDarkStream); if (tenantWhiteLabelSettings.GetIsDefault(type)) { if (lightData == null) { lightData = darkData; } if (darkData == null) { darkData = lightData; } } if ((lightData == null || darkData == null) && tenantWhiteLabelSettings.GetExt(type) != fileExt && CanBeDark(type)) { throw new InvalidOperationException("current logos and downloaded logo have different extention"); } if (lightData != null) { await SetLogo(tenantWhiteLabelSettings, type, fileExt, lightData, false, storage); } if (darkData != null && CanBeDark(type)) { await SetLogo(tenantWhiteLabelSettings, type, fileExt, darkData, true, storage); } tenantWhiteLabelSettings.SetExt(type, fileExt); tenantWhiteLabelSettings.SetIsDefault(type, false); } private byte[] GetData(Stream stream) { if (stream != null) { using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); return memoryStream.ToArray(); } } return null; } #endregion #region Get logo path public async Task GetAbsoluteLogoPath(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, bool dark = false) { if (tenantWhiteLabelSettings.GetIsDefault(type)) { return await GetAbsoluteDefaultLogoPath(type, dark); } return await GetAbsoluteStorageLogoPath(tenantWhiteLabelSettings, type, dark); } private async Task GetAbsoluteStorageLogoPath(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, bool dark) { var store = _storageFactory.GetStorage(_tenantManager.GetCurrentTenant().Id, ModuleName); var fileName = BuildLogoFileName(type, tenantWhiteLabelSettings.GetExt(type), dark); if (await store.IsFileAsync(fileName)) { return (await store.GetUriAsync(fileName)).ToString(); } return await GetAbsoluteDefaultLogoPath(type, dark); } public async Task GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum type, bool dark) { var partnerLogoPath = await GetPartnerStorageLogoPath(type, dark); if (!string.IsNullOrEmpty(partnerLogoPath)) { return partnerLogoPath; } var ext = type switch { WhiteLabelLogoTypeEnum.Favicon => "ico", _ => "svg" }; return _webImageSupplier.GetAbsoluteWebPath($"logo/" + BuildLogoFileName(type, ext, dark)); } private async Task GetPartnerStorageLogoPath(WhiteLabelLogoTypeEnum type, bool dark) { var partnerSettings = _settingsManager.LoadForDefaultTenant(); if (partnerSettings.GetIsDefault(type)) { return null; } var partnerStorage = _storageFactory.GetStorage(null, "static_partnerdata"); if (partnerStorage == null) { return null; } var logoPath = BuildLogoFileName(type, partnerSettings.GetExt(type), dark); return (await partnerStorage.IsFileAsync(logoPath)) ? (await partnerStorage.GetUriAsync(logoPath)).ToString() : null; } #endregion #region Get Whitelabel Logo Stream /// /// Get logo stream or null in case of default whitelabel /// public async Task GetWhitelabelLogoData(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, bool dark = false) { if (tenantWhiteLabelSettings.GetIsDefault(type)) { return await GetPartnerStorageLogoData(type, dark); } return await GetStorageLogoData(tenantWhiteLabelSettings, type, dark); } private async Task GetStorageLogoData(TenantWhiteLabelSettings tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum type, bool dark) { var storage = _storageFactory.GetStorage(_tenantManager.GetCurrentTenant().Id, ModuleName); if (storage == null) { return null; } var fileName = BuildLogoFileName(type, tenantWhiteLabelSettings.GetExt(type), dark); return await storage.IsFileAsync(fileName) ? await storage.GetReadStreamAsync(fileName) : null; } private async Task GetPartnerStorageLogoData(WhiteLabelLogoTypeEnum type, bool dark) { var partnerSettings = _settingsManager.LoadForDefaultTenant(); if (partnerSettings.GetIsDefault(type)) { return null; } var partnerStorage = _storageFactory.GetStorage(null, "static_partnerdata"); if (partnerStorage == null) { return null; } var fileName = BuildLogoFileName(type, partnerSettings.GetExt(type), dark); return await partnerStorage.IsFileAsync(fileName) ? await partnerStorage.GetReadStreamAsync(fileName) : null; } #endregion public static string BuildLogoFileName(WhiteLabelLogoTypeEnum type, string fileExt, bool dark) { if (CanBeDark(type)) { return $"{(dark ? "dark_" : "")}{type.ToString().ToLowerInvariant()}.{fileExt}"; } return $"{type.ToString().ToLowerInvariant()}.{fileExt}"; } public static Size GetSize(WhiteLabelLogoTypeEnum type) { return type switch { WhiteLabelLogoTypeEnum.LightSmall => TenantWhiteLabelSettings.LogoLightSmallSize, WhiteLabelLogoTypeEnum.LoginPage => TenantWhiteLabelSettings.LogoLoginPageSize, WhiteLabelLogoTypeEnum.Favicon => TenantWhiteLabelSettings.LogoFaviconSize, WhiteLabelLogoTypeEnum.DocsEditor => TenantWhiteLabelSettings.LogoDocsEditorSize, WhiteLabelLogoTypeEnum.DocsEditorEmbed => TenantWhiteLabelSettings.LogoDocsEditorEmbedSize, WhiteLabelLogoTypeEnum.LeftMenu => TenantWhiteLabelSettings.LogoLeftMenuSize, WhiteLabelLogoTypeEnum.AboutPage => TenantWhiteLabelSettings.LogoAboutPageSize, _ => new Size(0, 0), }; } private static async Task ResizeLogo(string fileName, byte[] data, long maxFileSize, Size size, IDataStore store) { //Resize synchronously if (data == null || data.Length <= 0) { throw new UnknownImageFormatException("data null"); } if (maxFileSize != -1 && data.Length > maxFileSize) { throw new ImageWeightLimitException(); } try { using var stream = new MemoryStream(data); using var img = Image.Load(stream); if (size != img.Size) { using var img2 = CommonPhotoManager.DoThumbnail(img, size, false, true, false); data = CommonPhotoManager.SaveToBytes(img2); } else { data = CommonPhotoManager.SaveToBytes(img); } //fileExt = CommonPhotoManager.GetImgFormatName(imgFormat); using var stream2 = new MemoryStream(data); await store.SaveAsync(fileName, stream2); } catch (ArgumentException error) { throw new UnknownImageFormatException(error.Message); } } #region Save for Resource replacement private static readonly List _appliedTenants = new List(); public void Apply(TenantWhiteLabelSettings tenantWhiteLabelSettings, int tenantId) { if (_appliedTenants.Contains(tenantId)) { return; } SetNewLogoText(tenantWhiteLabelSettings, tenantId); if (!_appliedTenants.Contains(tenantId)) { _appliedTenants.Add(tenantId); } } public void Save(TenantWhiteLabelSettings tenantWhiteLabelSettings, int tenantId, TenantLogoManager tenantLogoManager, bool restore = false) { _settingsManager.Save(tenantWhiteLabelSettings, tenantId); if (tenantId == Tenant.DefaultTenant) { _appliedTenants.Clear(); } else { SetNewLogoText(tenantWhiteLabelSettings, tenantId, restore); tenantLogoManager.RemoveMailLogoDataFromCache(); } } private void SetNewLogoText(TenantWhiteLabelSettings tenantWhiteLabelSettings, int tenantId, bool restore = false) { _whiteLabelHelper.DefaultLogoText = TenantWhiteLabelSettings.DefaultLogoText; var partnerSettings = _settingsManager.LoadForDefaultTenant(); if (restore && string.IsNullOrEmpty(partnerSettings.GetLogoText(_settingsManager))) { _whiteLabelHelper.RestoreOldText(tenantId); } else { _whiteLabelHelper.SetNewText(tenantId, tenantWhiteLabelSettings.GetLogoText(_settingsManager)); } } #endregion #region Delete from Store private async Task DeleteLogoFromStore(TenantWhiteLabelSettings tenantWhiteLabelSettings, IDataStore store, WhiteLabelLogoTypeEnum type, bool dark) { await DeleteLogoFromStoreByGeneral(tenantWhiteLabelSettings, store, type, dark); } private async Task DeleteLogoFromStoreByGeneral(TenantWhiteLabelSettings tenantWhiteLabelSettings, IDataStore store, WhiteLabelLogoTypeEnum type, bool dark) { var fileExt = tenantWhiteLabelSettings.GetExt(type); var logo = BuildLogoFileName(type, fileExt, dark); if (await store.IsFileAsync(logo)) { await store.DeleteAsync(logo); } } #endregion private static bool CanBeDark(WhiteLabelLogoTypeEnum type) { return type switch { WhiteLabelLogoTypeEnum.Favicon => false, WhiteLabelLogoTypeEnum.DocsEditor => false, WhiteLabelLogoTypeEnum.DocsEditorEmbed => false, _ => true, }; } }