// (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 namespace ASC.Web.Api.Controllers.Settings; public class WhitelabelController : BaseSettingsController { private Tenant Tenant { get { return ApiContext.Tenant; } } private readonly TenantManager _tenantManager; private readonly TenantExtra _tenantExtra; private readonly PermissionContext _permissionContext; private readonly SettingsManager _settingsManager; private readonly TenantInfoSettingsHelper _tenantInfoSettingsHelper; private readonly TenantWhiteLabelSettingsHelper _tenantWhiteLabelSettingsHelper; private readonly TenantLogoManager _tenantLogoManager; private readonly CoreBaseSettings _coreBaseSettings; private readonly CommonLinkUtility _commonLinkUtility; private readonly StorageFactory _storageFactory; public WhitelabelController( ApiContext apiContext, TenantManager tenantManager, TenantExtra tenantExtra, PermissionContext permissionContext, SettingsManager settingsManager, WebItemManager webItemManager, TenantInfoSettingsHelper tenantInfoSettingsHelper, TenantWhiteLabelSettingsHelper tenantWhiteLabelSettingsHelper, TenantLogoManager tenantLogoManager, CoreBaseSettings coreBaseSettings, CommonLinkUtility commonLinkUtility, IMemoryCache memoryCache, StorageFactory storageFactory, IHttpContextAccessor httpContextAccessor) : base(apiContext, memoryCache, webItemManager, httpContextAccessor) { _tenantManager = tenantManager; _tenantExtra = tenantExtra; _permissionContext = permissionContext; _settingsManager = settingsManager; _tenantInfoSettingsHelper = tenantInfoSettingsHelper; _tenantWhiteLabelSettingsHelper = tenantWhiteLabelSettingsHelper; _tenantLogoManager = tenantLogoManager; _coreBaseSettings = coreBaseSettings; _commonLinkUtility = commonLinkUtility; _storageFactory = storageFactory; } ///false [HttpPost("whitelabel/save")] public bool SaveWhiteLabelSettings(WhiteLabelRequestsDto inDto, [FromQuery] WhiteLabelQueryRequestsDto inQueryDto) { _permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!_tenantLogoManager.WhiteLabelEnabled || !_tenantLogoManager.WhiteLabelPaid) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } if (inQueryDto.IsDefault) { DemandRebrandingPermission(); SaveWhiteLabelSettingsForDefaultTenant(inDto); } else { SaveWhiteLabelSettingsForCurrentTenant(inDto); } return true; } private void SaveWhiteLabelSettingsForCurrentTenant(WhiteLabelRequestsDto inDto) { var settings = _settingsManager.Load(); SaveWhiteLabelSettingsForTenant(settings, null, Tenant.Id, inDto); } private void SaveWhiteLabelSettingsForDefaultTenant(WhiteLabelRequestsDto inDto) { var settings = _settingsManager.LoadForDefaultTenant(); var storage = _storageFactory.GetStorage(string.Empty, "static_partnerdata"); SaveWhiteLabelSettingsForTenant(settings, storage, Tenant.DefaultTenant, inDto); } private void SaveWhiteLabelSettingsForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId, WhiteLabelRequestsDto inDto) { if (inDto.Logo != null) { var logoDict = new Dictionary(); foreach (var l in inDto.Logo) { logoDict.Add(Int32.Parse(l.Key), l.Value); } _tenantWhiteLabelSettingsHelper.SetLogo(settings, logoDict, storage); } settings.SetLogoText(inDto.LogoText); _tenantWhiteLabelSettingsHelper.Save(settings, tenantId, _tenantLogoManager); } ///false [HttpPost("whitelabel/savefromfiles")] public bool SaveWhiteLabelSettingsFromFiles([FromQuery] WhiteLabelQueryRequestsDto inDto) { _permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!_tenantLogoManager.WhiteLabelEnabled || !_tenantLogoManager.WhiteLabelPaid) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } if (HttpContext.Request.Form?.Files == null || HttpContext.Request.Form.Files.Count == 0) { throw new InvalidOperationException("No input files"); } if (inDto.IsDefault) { DemandRebrandingPermission(); SaveWhiteLabelSettingsFromFilesForDefaultTenant(); } else { SaveWhiteLabelSettingsFromFilesForCurrentTenant(); } return true; } private void SaveWhiteLabelSettingsFromFilesForCurrentTenant() { var settings = _settingsManager.Load(); SaveWhiteLabelSettingsFromFilesForTenant(settings, null, Tenant.Id); } private void SaveWhiteLabelSettingsFromFilesForDefaultTenant() { var settings = _settingsManager.LoadForDefaultTenant(); var storage = _storageFactory.GetStorage(string.Empty, "static_partnerdata"); SaveWhiteLabelSettingsFromFilesForTenant(settings, storage, Tenant.DefaultTenant); } private void SaveWhiteLabelSettingsFromFilesForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId) { foreach (var f in HttpContext.Request.Form.Files) { var parts = f.FileName.Split('.'); var logoType = (WhiteLabelLogoTypeEnum)Convert.ToInt32(parts[0]); var fileExt = parts[1]; _tenantWhiteLabelSettingsHelper.SetLogoFromStream(settings, logoType, fileExt, f.OpenReadStream(), storage); } _settingsManager.SaveForTenant(settings, tenantId); } ///false [HttpGet("whitelabel/sizes")] public object GetWhiteLabelSizes() { _permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!_tenantLogoManager.WhiteLabelEnabled) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } return new[] { new {type = (int)WhiteLabelLogoTypeEnum.LightSmall, name = nameof(WhiteLabelLogoTypeEnum.LightSmall), height = TenantWhiteLabelSettings.LogoLightSmallSize.Height, width = TenantWhiteLabelSettings.LogoLightSmallSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.Dark, name = nameof(WhiteLabelLogoTypeEnum.Dark), height = TenantWhiteLabelSettings.LogoDarkSize.Height, width = TenantWhiteLabelSettings.LogoDarkSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.Favicon, name = nameof(WhiteLabelLogoTypeEnum.Favicon), height = TenantWhiteLabelSettings.LogoFaviconSize.Height, width = TenantWhiteLabelSettings.LogoFaviconSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.DocsEditor, name = nameof(WhiteLabelLogoTypeEnum.DocsEditor), height = TenantWhiteLabelSettings.LogoDocsEditorSize.Height, width = TenantWhiteLabelSettings.LogoDocsEditorSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.DocsEditorEmbed, name = nameof(WhiteLabelLogoTypeEnum.DocsEditorEmbed), height = TenantWhiteLabelSettings.LogoDocsEditorEmbedSize.Height, width = TenantWhiteLabelSettings.LogoDocsEditorEmbedSize.Width} }; } ///false [HttpGet("whitelabel/logos")] public Dictionary GetWhiteLabelLogos([FromQuery] WhiteLabelQueryRequestsDto inDto) { _permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!_tenantLogoManager.WhiteLabelEnabled) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } Dictionary result; if (inDto.IsDefault) { result = new Dictionary { { ((int)WhiteLabelLogoTypeEnum.LightSmall).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.LightSmall, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.Dark).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Dark, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.Favicon).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Favicon, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.DocsEditor).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.DocsEditorEmbed).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, !inDto.IsRetina)) } }; } else { var _tenantWhiteLabelSettings = _settingsManager.Load(); result = new Dictionary { { ((int)WhiteLabelLogoTypeEnum.LightSmall).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.LightSmall, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.Dark).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.Dark, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.Favicon).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.Favicon, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.DocsEditor).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.DocsEditor, !inDto.IsRetina)) }, { ((int)WhiteLabelLogoTypeEnum.DocsEditorEmbed).ToString(), _commonLinkUtility.GetFullAbsolutePath(_tenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings,WhiteLabelLogoTypeEnum.DocsEditorEmbed, !inDto.IsRetina)) } }; } return result; } ///false [HttpGet("whitelabel/logotext")] public object GetWhiteLabelLogoText([FromQuery] WhiteLabelQueryRequestsDto inDto) { if (!_tenantLogoManager.WhiteLabelEnabled) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } var settings = inDto.IsDefault ? _settingsManager.LoadForDefaultTenant() : _settingsManager.Load(); return settings.LogoText ?? TenantWhiteLabelSettings.DefaultLogoText; } ///false [HttpPut("whitelabel/restore")] public bool RestoreWhiteLabelOptions(WhiteLabelQueryRequestsDto inDto) { _permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!_tenantLogoManager.WhiteLabelEnabled || !_tenantLogoManager.WhiteLabelPaid) { throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel"); } if (inDto.IsDefault) { DemandRebrandingPermission(); RestoreWhiteLabelOptionsForDefaultTenant(); } else { RestoreWhiteLabelOptionsForCurrentTenant(); } return true; } private void RestoreWhiteLabelOptionsForCurrentTenant() { var settings = _settingsManager.Load(); RestoreWhiteLabelOptionsForTenant(settings, null, Tenant.Id); var tenantInfoSettings = _settingsManager.Load(); _tenantInfoSettingsHelper.RestoreDefaultLogo(tenantInfoSettings, _tenantLogoManager); _settingsManager.Save(tenantInfoSettings); } private void RestoreWhiteLabelOptionsForDefaultTenant() { var settings = _settingsManager.LoadForDefaultTenant(); var storage = _storageFactory.GetStorage(string.Empty, "static_partnerdata"); RestoreWhiteLabelOptionsForTenant(settings, storage, Tenant.DefaultTenant); } private void RestoreWhiteLabelOptionsForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId) { _tenantWhiteLabelSettingsHelper.RestoreDefault(settings, _tenantLogoManager, tenantId, storage); } ///false [HttpGet("companywhitelabel")] public List GetLicensorData() { var result = new List(); var instance = CompanyWhiteLabelSettings.Instance(_settingsManager); result.Add(instance); if (!instance.IsDefault() && !instance.IsLicensor) { result.Add(_settingsManager.GetDefault()); } return result; } ///false [HttpPost("rebranding/company")] public bool SaveCompanyWhiteLabelSettings(CompanyWhiteLabelSettingsWrapper companyWhiteLabelSettingsWrapper) { if (companyWhiteLabelSettingsWrapper.Settings == null) { throw new ArgumentNullException("settings"); } DemandRebrandingPermission(); companyWhiteLabelSettingsWrapper.Settings.IsLicensor = false; //TODO: CoreContext.TenantManager.GetTenantQuota(TenantProvider.CurrentTenantID).Branding && settings.IsLicensor _settingsManager.SaveForDefaultTenant(companyWhiteLabelSettingsWrapper.Settings); return true; } ///false [HttpGet("rebranding/company")] public CompanyWhiteLabelSettings GetCompanyWhiteLabelSettings() { return _settingsManager.LoadForDefaultTenant(); } ///false [HttpDelete("rebranding/company")] public CompanyWhiteLabelSettings DeleteCompanyWhiteLabelSettings() { DemandRebrandingPermission(); var defaultSettings = _settingsManager.GetDefault(); _settingsManager.SaveForDefaultTenant(defaultSettings); return defaultSettings; } ///false [HttpPost("rebranding/additional")] public bool SaveAdditionalWhiteLabelSettings(AdditionalWhiteLabelSettingsWrapper wrapper) { if (wrapper.Settings == null) { throw new ArgumentNullException("settings"); } DemandRebrandingPermission(); _settingsManager.SaveForDefaultTenant(wrapper.Settings); return true; } ///false [HttpGet("rebranding/additional")] public AdditionalWhiteLabelSettings GetAdditionalWhiteLabelSettings() { return _settingsManager.LoadForDefaultTenant(); } ///false [HttpDelete("rebranding/additional")] public AdditionalWhiteLabelSettings DeleteAdditionalWhiteLabelSettings() { DemandRebrandingPermission(); var defaultSettings = _settingsManager.GetDefault(); _settingsManager.SaveForDefaultTenant(defaultSettings); return defaultSettings; } ///false [HttpPost("rebranding/mail")] public bool SaveMailWhiteLabelSettingsFromBody([FromBody] MailWhiteLabelSettings settings) { return SaveMailWhiteLabelSettings(settings); } ///false [HttpPost("rebranding/mail")] public bool SaveMailWhiteLabelSettingsFromForm([FromForm] MailWhiteLabelSettings settings) { return SaveMailWhiteLabelSettings(settings); } private bool SaveMailWhiteLabelSettings(MailWhiteLabelSettings settings) { ArgumentNullException.ThrowIfNull(settings); DemandRebrandingPermission(); _settingsManager.SaveForDefaultTenant(settings); return true; } ///false [HttpPut("rebranding/mail")] public bool UpdateMailWhiteLabelSettings(MailWhiteLabelSettingsRequestsDto inDto) { DemandRebrandingPermission(); var settings = _settingsManager.LoadForDefaultTenant(); settings.FooterEnabled = inDto.FooterEnabled; _settingsManager.SaveForDefaultTenant(settings); return true; } ///false [HttpGet("rebranding/mail")] public MailWhiteLabelSettings GetMailWhiteLabelSettings() { return _settingsManager.LoadForDefaultTenant(); } ///false [HttpDelete("rebranding/mail")] public MailWhiteLabelSettings DeleteMailWhiteLabelSettings() { DemandRebrandingPermission(); var defaultSettings = _settingsManager.GetDefault(); _settingsManager.SaveForDefaultTenant(defaultSettings); return defaultSettings; } private void DemandRebrandingPermission() { _tenantExtra.DemandControlPanelPermission(); if (!_tenantManager.GetTenantQuota(Tenant.Id).SSBranding) { throw new BillingException(Resource.ErrorNotAllowedOption, "SSBranding"); } if (_coreBaseSettings.CustomMode) { throw new SecurityException(); } } }