DocSpace-buildtools/web/ASC.Web.Api/Controllers/SettingsController.cs

1843 lines
75 KiB
C#
Raw Normal View History

2019-08-12 10:53:12 +00:00
/*
*
* (c) Copyright Ascensio System Limited 2010-2018
*
* This program is freeware. You can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7(a) of the GNU GPL 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 more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales@onlyoffice.com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software. If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute.
* Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks.
*
*/
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Net;
2020-07-24 14:01:20 +00:00
using System.Net.Mail;
using System.Security;
2019-08-12 10:53:12 +00:00
using System.ServiceModel.Security;
using System.Text.RegularExpressions;
2019-08-12 10:53:12 +00:00
using System.Web;
2019-08-12 10:53:12 +00:00
using ASC.Api.Collections;
using ASC.Api.Core;
using ASC.Api.Utils;
2020-02-17 08:58:14 +00:00
using ASC.Common;
2019-08-12 10:53:12 +00:00
using ASC.Common.Logging;
2019-12-03 15:20:21 +00:00
using ASC.Common.Utils;
using ASC.Common.Web;
2019-08-12 10:53:12 +00:00
using ASC.Core;
using ASC.Core.Billing;
using ASC.Core.Common.Configuration;
2019-10-31 13:54:43 +00:00
using ASC.Core.Common.Settings;
2019-08-12 10:53:12 +00:00
using ASC.Core.Tenants;
using ASC.Core.Users;
2019-09-13 11:18:27 +00:00
using ASC.Data.Storage;
2019-08-12 10:53:12 +00:00
using ASC.Data.Storage.Configuration;
using ASC.Data.Storage.Migration;
using ASC.FederatedLogin;
using ASC.FederatedLogin.LoginProviders;
using ASC.FederatedLogin.Profile;
2019-08-12 10:53:12 +00:00
using ASC.IPSecurity;
using ASC.MessagingSystem;
2019-09-17 12:42:32 +00:00
using ASC.Security.Cryptography;
2019-08-12 10:53:12 +00:00
using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.Mobile;
2019-08-12 10:53:12 +00:00
using ASC.Web.Core.PublicResources;
using ASC.Web.Core.Sms;
2019-09-09 12:56:33 +00:00
using ASC.Web.Core.Users;
2019-08-12 10:53:12 +00:00
using ASC.Web.Core.Utility;
using ASC.Web.Core.Utility.Settings;
using ASC.Web.Core.WebZones;
using ASC.Web.Core.WhiteLabel;
using ASC.Web.Studio.Core;
using ASC.Web.Studio.Core.Notify;
using ASC.Web.Studio.Core.Quota;
using ASC.Web.Studio.Core.SMS;
using ASC.Web.Studio.Core.Statistic;
using ASC.Web.Studio.Core.TFA;
using ASC.Web.Studio.UserControls.CustomNavigation;
2020-07-02 14:11:59 +00:00
using ASC.Web.Studio.UserControls.FirstTime;
2019-09-09 12:56:33 +00:00
using ASC.Web.Studio.UserControls.Statistics;
2019-08-12 10:53:12 +00:00
using ASC.Web.Studio.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
2020-07-24 14:01:20 +00:00
using Microsoft.Extensions.Caching.Memory;
2019-09-23 12:20:08 +00:00
using Microsoft.Extensions.Configuration;
2019-10-17 15:55:35 +00:00
using Microsoft.Extensions.Options;
2019-08-12 10:53:12 +00:00
namespace ASC.Api.Settings
{
2019-11-06 15:03:09 +00:00
[DefaultRoute]
2019-08-12 10:53:12 +00:00
[ApiController]
public partial class SettingsController : ControllerBase
{
2019-10-14 08:23:45 +00:00
//private const int ONE_THREAD = 1;
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
//private static readonly DistributedTaskQueue quotaTasks = new DistributedTaskQueue("quotaOperations", ONE_THREAD);
//private static DistributedTaskQueue LDAPTasks { get; } = new DistributedTaskQueue("ldapOperations");
//private static DistributedTaskQueue SMTPTasks { get; } = new DistributedTaskQueue("smtpOperations");
2019-08-12 10:53:12 +00:00
public Tenant Tenant { get { return ApiContext.Tenant; } }
public ApiContext ApiContext { get; }
2020-08-12 09:58:08 +00:00
private MessageService MessageService { get; }
private StudioNotifyService StudioNotifyService { get; }
private IWebHostEnvironment WebHostEnvironment { get; }
private IServiceProvider ServiceProvider { get; }
private EmployeeWraperHelper EmployeeWraperHelper { get; }
private ConsumerFactory ConsumerFactory { get; }
private SmsProviderManager SmsProviderManager { get; }
private TimeZoneConverter TimeZoneConverter { get; }
private CustomNamingPeople CustomNamingPeople { get; }
private IPSecurity.IPSecurity IpSecurity { get; }
private IMemoryCache MemoryCache { get; }
private ProviderManager ProviderManager { get; }
private MobileDetector MobileDetector { get; }
private IOptionsSnapshot<AccountLinker> AccountLinker { get; }
private FirstTimeTenantSettings FirstTimeTenantSettings { get; }
2020-08-12 09:58:08 +00:00
private UserManager UserManager { get; }
private TenantManager TenantManager { get; }
private TenantExtra TenantExtra { get; }
private TenantStatisticsProvider TenantStatisticsProvider { get; }
private AuthContext AuthContext { get; }
private CookiesManager CookiesManager { get; }
private WebItemSecurity WebItemSecurity { get; }
private StudioNotifyHelper StudioNotifyHelper { get; }
private LicenseReader LicenseReader { get; }
private PermissionContext PermissionContext { get; }
private SettingsManager SettingsManager { get; }
private TfaManager TfaManager { get; }
private WebItemManager WebItemManager { get; }
private WebItemManagerSecurity WebItemManagerSecurity { get; }
private TenantInfoSettingsHelper TenantInfoSettingsHelper { get; }
private TenantWhiteLabelSettingsHelper TenantWhiteLabelSettingsHelper { get; }
private StorageHelper StorageHelper { get; }
private TenantLogoManager TenantLogoManager { get; }
private TenantUtil TenantUtil { get; }
private CoreBaseSettings CoreBaseSettings { get; }
private CommonLinkUtility CommonLinkUtility { get; }
private ColorThemesSettingsHelper ColorThemesSettingsHelper { get; }
private IConfiguration Configuration { get; }
private SetupInfo SetupInfo { get; }
private BuildVersion BuildVersion { get; }
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
private StatisticManager StatisticManager { get; }
private IPRestrictionsService IPRestrictionsService { get; }
private CoreConfiguration CoreConfiguration { get; }
private MessageTarget MessageTarget { get; }
private StudioSmsNotificationSettingsHelper StudioSmsNotificationSettingsHelper { get; }
private CoreSettings CoreSettings { get; }
private StorageSettingsHelper StorageSettingsHelper { get; }
2019-10-17 15:55:35 +00:00
public ILog Log { get; set; }
2019-08-12 10:53:12 +00:00
2019-09-18 12:14:15 +00:00
public SettingsController(
2019-11-06 15:03:09 +00:00
IOptionsMonitor<ILog> option,
2019-08-12 10:53:12 +00:00
MessageService messageService,
StudioNotifyService studioNotifyService,
2019-09-09 12:56:33 +00:00
ApiContext apiContext,
UserManager userManager,
TenantManager tenantManager,
TenantExtra tenantExtra,
TenantStatisticsProvider tenantStatisticsProvider,
AuthContext authContext,
CookiesManager cookiesManager,
WebItemSecurity webItemSecurity,
StudioNotifyHelper studioNotifyHelper,
LicenseReader licenseReader,
2019-09-10 14:29:37 +00:00
PermissionContext permissionContext,
SettingsManager settingsManager,
TfaManager tfaManager,
WebItemManager webItemManager,
2019-09-13 11:18:27 +00:00
WebItemManagerSecurity webItemManagerSecurity,
TenantInfoSettingsHelper tenantInfoSettingsHelper,
TenantWhiteLabelSettingsHelper tenantWhiteLabelSettingsHelper,
2019-09-13 11:18:27 +00:00
StorageHelper storageHelper,
2019-09-17 12:42:32 +00:00
TenantLogoManager tenantLogoManager,
2019-09-18 15:19:30 +00:00
TenantUtil tenantUtil,
2019-09-19 15:55:44 +00:00
CoreBaseSettings coreBaseSettings,
2019-09-20 13:06:10 +00:00
CommonLinkUtility commonLinkUtility,
ColorThemesSettingsHelper colorThemesSettingsHelper,
2019-09-23 12:20:08 +00:00
IConfiguration configuration,
2019-09-24 10:32:12 +00:00
SetupInfo setupInfo,
BuildVersion buildVersion,
DisplayUserSettingsHelper displayUserSettingsHelper,
2019-10-10 08:52:21 +00:00
StatisticManager statisticManager,
2019-10-10 10:59:22 +00:00
IPRestrictionsService iPRestrictionsService,
2019-10-22 11:21:44 +00:00
CoreConfiguration coreConfiguration,
MessageTarget messageTarget,
StudioSmsNotificationSettingsHelper studioSmsNotificationSettingsHelper,
CoreSettings coreSettings,
StorageSettingsHelper storageSettingsHelper,
2019-11-08 15:11:30 +00:00
IWebHostEnvironment webHostEnvironment,
IServiceProvider serviceProvider,
2019-12-03 15:20:21 +00:00
EmployeeWraperHelper employeeWraperHelper,
2019-12-20 11:17:01 +00:00
ConsumerFactory consumerFactory,
SmsProviderManager smsProviderManager,
2020-01-16 15:01:07 +00:00
TimeZoneConverter timeZoneConverter,
2020-07-24 14:01:20 +00:00
CustomNamingPeople customNamingPeople,
IPSecurity.IPSecurity ipSecurity,
IMemoryCache memoryCache,
ProviderManager providerManager,
MobileDetector mobileDetector,
IOptionsSnapshot<AccountLinker> accountLinker,
2020-07-02 14:11:59 +00:00
FirstTimeTenantSettings firstTimeTenantSettings)
2019-08-12 10:53:12 +00:00
{
2019-10-17 15:55:35 +00:00
Log = option.Get("ASC.Api");
WebHostEnvironment = webHostEnvironment;
2019-11-08 15:11:30 +00:00
ServiceProvider = serviceProvider;
EmployeeWraperHelper = employeeWraperHelper;
2019-12-20 11:17:01 +00:00
ConsumerFactory = consumerFactory;
SmsProviderManager = smsProviderManager;
2019-12-03 15:20:21 +00:00
TimeZoneConverter = timeZoneConverter;
2020-01-16 15:01:07 +00:00
CustomNamingPeople = customNamingPeople;
2020-07-24 14:01:20 +00:00
IpSecurity = ipSecurity;
MemoryCache = memoryCache;
ProviderManager = providerManager;
MobileDetector = mobileDetector;
AccountLinker = accountLinker;
2020-07-02 14:11:59 +00:00
FirstTimeTenantSettings = firstTimeTenantSettings;
2019-08-12 10:53:12 +00:00
MessageService = messageService;
StudioNotifyService = studioNotifyService;
ApiContext = apiContext;
2019-09-09 12:56:33 +00:00
UserManager = userManager;
TenantManager = tenantManager;
TenantExtra = tenantExtra;
TenantStatisticsProvider = tenantStatisticsProvider;
AuthContext = authContext;
CookiesManager = cookiesManager;
WebItemSecurity = webItemSecurity;
StudioNotifyHelper = studioNotifyHelper;
LicenseReader = licenseReader;
PermissionContext = permissionContext;
SettingsManager = settingsManager;
2019-09-10 14:29:37 +00:00
TfaManager = tfaManager;
WebItemManager = webItemManager;
WebItemManagerSecurity = webItemManagerSecurity;
TenantInfoSettingsHelper = tenantInfoSettingsHelper;
TenantWhiteLabelSettingsHelper = tenantWhiteLabelSettingsHelper;
2019-09-13 11:18:27 +00:00
StorageHelper = storageHelper;
2019-09-16 14:51:39 +00:00
TenantLogoManager = tenantLogoManager;
2019-09-17 12:42:32 +00:00
TenantUtil = tenantUtil;
2019-09-18 15:19:30 +00:00
CoreBaseSettings = coreBaseSettings;
2019-09-19 15:55:44 +00:00
CommonLinkUtility = commonLinkUtility;
ColorThemesSettingsHelper = colorThemesSettingsHelper;
2019-09-23 12:20:08 +00:00
Configuration = configuration;
SetupInfo = setupInfo;
2019-09-24 10:32:12 +00:00
BuildVersion = buildVersion;
DisplayUserSettingsHelper = displayUserSettingsHelper;
2019-10-10 08:52:21 +00:00
StatisticManager = statisticManager;
IPRestrictionsService = iPRestrictionsService;
2019-10-10 10:59:22 +00:00
CoreConfiguration = coreConfiguration;
2019-10-22 11:21:44 +00:00
MessageTarget = messageTarget;
StudioSmsNotificationSettingsHelper = studioSmsNotificationSettingsHelper;
CoreSettings = coreSettings;
StorageSettingsHelper = storageSettingsHelper;
2019-08-12 10:53:12 +00:00
}
2020-08-03 15:34:53 +00:00
[Read("", Check = false)]
2019-08-16 12:11:38 +00:00
[AllowAnonymous]
2019-08-12 10:53:12 +00:00
public SettingsWrapper GetSettings()
{
var settings = new SettingsWrapper
{
Culture = Tenant.GetCulture().ToString(),
GreetingSettings = Tenant.Name
2019-08-12 10:53:12 +00:00
};
2019-08-16 12:11:38 +00:00
2019-09-09 12:56:33 +00:00
if (AuthContext.IsAuthenticated)
2019-08-16 12:11:38 +00:00
{
settings.TrustedDomains = Tenant.TrustedDomains;
settings.TrustedDomainsType = Tenant.TrustedDomainsType;
var timeZone = Tenant.TimeZone;
2019-12-03 15:20:21 +00:00
settings.Timezone = timeZone;
settings.UtcOffset = TimeZoneConverter.GetTimeZone(timeZone).GetUtcOffset(DateTime.UtcNow);
2019-08-16 12:11:38 +00:00
settings.UtcHoursOffset = settings.UtcOffset.TotalHours;
settings.OwnerId = Tenant.OwnerId;
2020-01-20 15:29:30 +00:00
settings.NameSchemaId = CustomNamingPeople.Current.Id;
}
else
{
if (!SettingsManager.Load<WizardSettings>().Completed)
{
settings.WizardToken = CommonLinkUtility.GetToken("", ConfirmType.Wizard, userId: Tenant.OwnerId);
}
settings.EnabledJoin =
(Tenant.TrustedDomainsType == TenantTrustedDomainsType.Custom &&
Tenant.TrustedDomains.Count > 0) ||
Tenant.TrustedDomainsType == TenantTrustedDomainsType.All;
var studioAdminMessageSettings = SettingsManager.Load<StudioAdminMessageSettings>();
settings.EnableAdmMess = studioAdminMessageSettings.Enable || TenantExtra.IsNotPaid();
settings.ThirdpartyEnable = SetupInfo.ThirdPartyAuthEnabled && ProviderManager.IsNotEmpty;
}
2020-01-20 15:29:30 +00:00
return settings;
}
2020-01-16 15:01:07 +00:00
[Create("messagesettings")]
2020-07-24 14:01:20 +00:00
public ContentResult EnableAdminMessageSettings(AdminMessageSettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
SettingsManager.Save(new StudioAdminMessageSettings { Enable = model.TurnOn });
MessageService.Send(MessageAction.AdministratorMessageSettingsUpdated);
2020-07-24 14:01:20 +00:00
return new ContentResult() { Content = Resource.SuccessfullySaveSettingsMessage };
}
[AllowAnonymous]
[Create("sendadmmail")]
public ContentResult SendAdmMail(AdminMessageSettingsModel model)
{
var studioAdminMessageSettings = SettingsManager.Load<StudioAdminMessageSettings>();
var enableAdmMess = studioAdminMessageSettings.Enable || TenantExtra.IsNotPaid();
if (!enableAdmMess)
throw new MethodAccessException("Method not available");
if (!model.Email.TestEmailRegex())
throw new Exception(Resource.ErrorNotCorrectEmail);
if (string.IsNullOrEmpty(model.Message))
throw new Exception(Resource.ErrorEmptyMessage);
CheckCache("sendadmmail");
StudioNotifyService.SendMsgToAdminFromNotAuthUser(model.Email, model.Message);
MessageService.Send(MessageAction.ContactAdminMailSent);
return new ContentResult() { Content = Resource.AdminMessageSent };
}
[Create("maildomainsettings")]
2020-07-24 14:01:20 +00:00
public ContentResult SaveMailDomainSettings(MailDomainSettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
if (model.Type == TenantTrustedDomainsType.Custom)
{
Tenant.TrustedDomains.Clear();
foreach (var d in model.Domains.Select(domain => (domain ?? "").Trim().ToLower()))
{
if (!(!string.IsNullOrEmpty(d) && new Regex("^[a-z0-9]([a-z0-9-.]){1,98}[a-z0-9]$").IsMatch(d)))
2020-07-24 14:01:20 +00:00
return new ContentResult() { Content = Resource.ErrorNotCorrectTrustedDomain };
Tenant.TrustedDomains.Add(d);
}
if (Tenant.TrustedDomains.Count == 0)
model.Type = TenantTrustedDomainsType.None;
}
Tenant.TrustedDomainsType = model.Type;
SettingsManager.Save(new StudioTrustedDomainSettings { InviteUsersAsVisitors = model.InviteUsersAsVisitors });
TenantManager.SaveTenant(Tenant);
MessageService.Send(MessageAction.TrustedMailDomainSettingsUpdated);
2020-07-24 14:01:20 +00:00
return new ContentResult { Content = Resource.SuccessfullySaveSettingsMessage };
}
[AllowAnonymous]
[Create("sendjoininvite")]
public ContentResult SendJoinInviteMail(AdminMessageSettingsModel model)
{
try
{
var email = model.Email;
if (!(
(Tenant.TrustedDomainsType == TenantTrustedDomainsType.Custom &&
Tenant.TrustedDomains.Count > 0) ||
Tenant.TrustedDomainsType == TenantTrustedDomainsType.All))
throw new MethodAccessException("Method not available");
if (!email.TestEmailRegex())
throw new Exception(Resource.ErrorNotCorrectEmail);
CheckCache("sendjoininvite");
var user = UserManager.GetUserByEmail(email);
if (!user.ID.Equals(Constants.LostUser.ID))
throw new Exception(CustomNamingPeople.Substitute<Resource>("ErrorEmailAlreadyExists"));
var settings = SettingsManager.Load<IPRestrictionsSettings>();
if (settings.Enable && !IpSecurity.Verify())
throw new Exception(Resource.ErrorAccessRestricted);
var trustedDomainSettings = SettingsManager.Load<StudioTrustedDomainSettings>();
var emplType = trustedDomainSettings.InviteUsersAsVisitors ? EmployeeType.Visitor : EmployeeType.User;
var enableInviteUsers = TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers;
if (!enableInviteUsers)
emplType = EmployeeType.Visitor;
switch (Tenant.TrustedDomainsType)
{
case TenantTrustedDomainsType.Custom:
{
var address = new MailAddress(email);
if (Tenant.TrustedDomains.Any(d => address.Address.EndsWith("@" + d, StringComparison.InvariantCultureIgnoreCase)))
{
StudioNotifyService.SendJoinMsg(email, emplType);
MessageService.Send(MessageInitiator.System, MessageAction.SentInviteInstructions, email);
return new ContentResult() { Content = Resource.FinishInviteJoinEmailMessage };
}
throw new Exception(Resource.ErrorEmailDomainNotAllowed);
}
case TenantTrustedDomainsType.All:
{
StudioNotifyService.SendJoinMsg(email, emplType);
MessageService.Send(MessageInitiator.System, MessageAction.SentInviteInstructions, email);
return new ContentResult() { Content = Resource.FinishInviteJoinEmailMessage };
}
default:
throw new Exception(Resource.ErrorNotCorrectEmail);
}
}
catch (FormatException)
{
return new ContentResult() { Content = Resource.ErrorNotCorrectEmail };
}
catch (Exception e)
{
return new ContentResult() { Content = e.Message.HtmlEncode() };
}
}
2020-01-20 15:29:30 +00:00
[Read("customschemas")]
public List<SchemaModel> PeopleSchemas()
{
return CustomNamingPeople
.GetSchemas()
2020-01-16 15:01:07 +00:00
.Select(r =>
{
var names = CustomNamingPeople.GetPeopleNames(r.Key);
var schemaItem = new SchemaItemModel
{
Id = names.Id,
UserCaption = names.UserCaption,
UsersCaption = names.UsersCaption,
GroupCaption = names.GroupCaption,
GroupsCaption = names.GroupsCaption,
UserPostCaption = names.UserPostCaption,
RegDateCaption = names.RegDateCaption,
GroupHeadCaption = names.GroupHeadCaption,
GuestCaption = names.GuestCaption,
GuestsCaption = names.GuestsCaption,
};
return new SchemaModel
{
Id = r.Key,
Name = r.Value,
Items = schemaItem
};
})
.ToList();
2019-08-12 10:53:12 +00:00
}
[Read("customschemas/{id}")]
public SchemaItemModel PeopleSchema(string id)
{
var names = CustomNamingPeople.GetPeopleNames(id);
var schemaItem = new SchemaItemModel
{
Id = names.Id,
UserCaption = names.UserCaption,
UsersCaption = names.UsersCaption,
GroupCaption = names.GroupCaption,
GroupsCaption = names.GroupsCaption,
UserPostCaption = names.UserPostCaption,
RegDateCaption = names.RegDateCaption,
GroupHeadCaption = names.GroupHeadCaption,
GuestCaption = names.GuestCaption,
GuestsCaption = names.GuestsCaption,
};
return schemaItem;
}
2019-08-12 10:53:12 +00:00
[Read("quota")]
public QuotaWrapper GetQuotaUsed()
{
return new QuotaWrapper(Tenant, CoreBaseSettings, CoreConfiguration, TenantExtra, TenantStatisticsProvider, AuthContext, SettingsManager, WebItemManager);
2019-08-12 10:53:12 +00:00
}
[AllowAnonymous]
[Read("authproviders")]
public ICollection<AccountInfo> GetAuthProviders(bool inviteView, bool settingsView, string clientCallback, string fromOnly)
{
ICollection<AccountInfo> infos = new List<AccountInfo>();
IEnumerable<LoginProfile> linkedAccounts = new List<LoginProfile>();
if (AuthContext.IsAuthenticated)
{
linkedAccounts = AccountLinker.Get("webstudio").GetLinkedProfiles(AuthContext.CurrentAccount.ID.ToString());
}
fromOnly = string.IsNullOrWhiteSpace(fromOnly) ? string.Empty : fromOnly.ToLower();
foreach (var provider in ProviderManager.AuthProviders.Where(provider => string.IsNullOrEmpty(fromOnly) || fromOnly == provider || (provider == "google" && fromOnly == "openid")))
{
if (inviteView && provider.ToLower() == "twitter") continue;
var loginProvider = ProviderManager.GetLoginProvider(provider);
if (loginProvider != null && loginProvider.IsEnabled)
{
var url = VirtualPathUtility.ToAbsolute("~/login.ashx") + $"?auth={provider}";
var mode = (settingsView || inviteView || (!MobileDetector.IsMobile() && !Request.DesktopApp())
? ("&mode=popup&callback=" + clientCallback)
: ("&mode=Redirect&returnurl="
+ HttpUtility.UrlEncode(new Uri(Request.GetUrlRewriter(),
"Auth.aspx"
+ (Request.DesktopApp() ? "?desktop=true" : "")
).ToString())));
infos.Add(new AccountInfo
{
Linked = linkedAccounts.Any(x => x.Provider == provider),
Provider = provider,
Url = url + mode
});
}
}
return infos;
}
2019-09-23 13:19:01 +00:00
[AllowAnonymous]
2020-08-03 14:06:37 +00:00
[Read("cultures", Check = false)]
public IEnumerable<object> GetSupportedCultures()
2019-09-23 13:19:01 +00:00
{
2020-06-03 15:51:01 +00:00
return SetupInfo.EnabledCultures.Select(r => r.Name).ToArray();
2019-09-23 13:19:01 +00:00
}
2020-07-08 08:29:44 +00:00
[Authorize(AuthenticationSchemes = "confirm", Roles = "Wizard,Administrators")]
2020-08-03 14:06:37 +00:00
[Read("timezones", Check = false)]
2020-07-08 08:29:44 +00:00
public List<TimezonesModel> GetTimeZones()
{
2020-07-08 08:29:44 +00:00
ApiContext.AuthByClaim();
2019-10-31 11:28:30 +00:00
var timeZones = TimeZoneInfo.GetSystemTimeZones().ToList();
if (timeZones.All(tz => tz.Id != "UTC"))
{
timeZones.Add(TimeZoneInfo.Utc);
}
2020-07-08 08:29:44 +00:00
var listOfTimezones = new List<TimezonesModel>();
foreach (var tz in timeZones.OrderBy(z => z.BaseUtcOffset))
{
var displayName = tz.DisplayName;
if (!displayName.StartsWith("(UTC") && !displayName.StartsWith("UTC"))
{
if (tz.BaseUtcOffset != TimeSpan.Zero)
{
displayName = string.Format("(UTC{0}{1}) ", tz.BaseUtcOffset < TimeSpan.Zero ? "-" : "+", tz.BaseUtcOffset.ToString(@"hh\:mm")) + displayName;
}
else
{
displayName = "(UTC) " + displayName;
}
}
listOfTimezones.Add(new TimezonesModel { Id = tz.Id, DisplayName = displayName });
}
return listOfTimezones;
}
2020-07-08 08:29:44 +00:00
[Authorize(AuthenticationSchemes = "confirm", Roles = "Wizard")]
2020-08-03 14:06:37 +00:00
[Read("machine", Check = false)]
2020-07-08 08:29:44 +00:00
public string GetMachineName()
{
return Dns.GetHostName().ToLowerInvariant();
}
/* [Read("greetingsettings")]
public string GetGreetingSettings()
{
return Tenant.Name;
}*/
[Create("greetingsettings")]
public object SaveGreetingSettings(GreetingSettingsModel model)
{
try
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
Tenant.Name = model.Title;
TenantManager.SaveTenant(Tenant);
MessageService.Send(MessageAction.GreetingSettingsUpdated);
return new { Status = 1, Message = Resource.SuccessfullySaveGreetingSettingsMessage };
}
catch (Exception e)
{
return new { Status = 0, Message = e.Message.HtmlEncode() };
}
}
[Create("greetingsettings/restore")]
public object RestoreGreetingSettings()
{
try
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
TenantInfoSettingsHelper.RestoreDefaultTenantName();
return new
{
Status = 1,
Message = Resource.SuccessfullySaveGreetingSettingsMessage,
CompanyName = Tenant.Name
};
}
catch (Exception e)
{
return new { Status = 0, Message = e.Message.HtmlEncode() };
}
}
2019-10-14 08:23:45 +00:00
//[Read("recalculatequota")]
//public void RecalculateQuota()
//{
// SecurityContext.DemandPermissions(Tenant, SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// var operations = quotaTasks.GetTasks()
// .Where(t => t.GetProperty<int>(QuotaSync.TenantIdKey) == Tenant.TenantId);
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// if (operations.Any(o => o.Status <= DistributedTaskStatus.Running))
// {
// throw new InvalidOperationException(Resource.LdapSettingsTooManyOperations);
// }
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// var op = new QuotaSync(Tenant.TenantId, ServiceProvider);
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// quotaTasks.QueueTask(op.RunJob, op.GetDistributedTask());
//}
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
//[Read("checkrecalculatequota")]
//public bool CheckRecalculateQuota()
//{
// PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// var task = quotaTasks.GetTasks().FirstOrDefault(t => t.GetProperty<int>(QuotaSync.TenantIdKey) == Tenant.TenantId);
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// if (task != null && task.Status == DistributedTaskStatus.Completed)
// {
// quotaTasks.RemoveTask(task.Id);
// return false;
// }
2019-08-12 10:53:12 +00:00
2019-10-14 08:23:45 +00:00
// return task != null;
//}
2019-08-12 10:53:12 +00:00
[AllowAnonymous]
[Read("version/build", false)]
public BuildVersion GetBuildVersions()
{
return BuildVersion.GetCurrentBuildVersion();
}
[Read("version")]
public TenantVersionWrapper GetVersions()
{
2019-09-09 12:56:33 +00:00
return new TenantVersionWrapper(Tenant.Version, TenantManager.GetTenantVersions());
2019-08-12 10:53:12 +00:00
}
[Update("version")]
public TenantVersionWrapper SetVersion(SettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2019-09-09 12:56:33 +00:00
TenantManager.GetTenantVersions().FirstOrDefault(r => r.Id == model.VersionId).NotFoundIfNull();
TenantManager.SetTenantVersion(Tenant, model.VersionId);
2019-08-12 10:53:12 +00:00
return GetVersions();
}
[Read("security")]
public IEnumerable<SecurityWrapper> GetWebItemSecurityInfo(IEnumerable<string> ids)
{
if (ids == null || !ids.Any())
{
ids = WebItemManager.GetItemsAll().Select(i => i.ID.ToString());
2019-08-12 10:53:12 +00:00
}
var subItemList = WebItemManager.GetItemsAll().Where(item => item.IsSubItem()).Select(i => i.ID.ToString());
2019-08-12 10:53:12 +00:00
return ids.Select(r => WebItemSecurity.GetSecurityInfo(r))
2019-08-12 10:53:12 +00:00
.Select(i => new SecurityWrapper
2019-08-15 12:04:42 +00:00
{
WebItemId = i.WebItemId,
Enabled = i.Enabled,
Users = i.Users.Select(EmployeeWraperHelper.Get),
Groups = i.Groups.Select(g => new GroupWrapperSummary(g, UserManager)),
2019-08-15 12:04:42 +00:00
IsSubItem = subItemList.Contains(i.WebItemId),
}).ToList();
2019-08-12 10:53:12 +00:00
}
[Read("security/{id}")]
public bool GetWebItemSecurityInfo(Guid id)
{
var module = WebItemManager[id];
2019-08-12 10:53:12 +00:00
2019-09-16 14:51:39 +00:00
return module != null && !module.IsDisabled(WebItemSecurity, AuthContext);
2019-08-12 10:53:12 +00:00
}
[Read("security/modules")]
public object GetEnabledModules()
{
2019-09-16 14:51:39 +00:00
var EnabledModules = WebItemManagerSecurity.GetItems(WebZoneType.All, ItemAvailableState.Normal)
2019-08-12 10:53:12 +00:00
.Where(item => !item.IsSubItem() && item.Visible)
.ToList()
.Select(item => new
{
id = item.ProductClassName.HtmlEncode(),
title = item.Name.HtmlEncode()
});
return EnabledModules;
}
[Read("security/password", Check = false)]
[Authorize(AuthenticationSchemes = "confirm", Roles = "Everyone")]
2019-08-12 10:53:12 +00:00
public object GetPasswordSettings()
{
var UserPasswordSettings = SettingsManager.Load<PasswordSettings>();
2019-08-12 10:53:12 +00:00
return UserPasswordSettings;
}
[Update("security")]
public IEnumerable<SecurityWrapper> SetWebItemSecurity(WebItemSecurityModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
WebItemSecurity.SetSecurity(model.Id, model.Enabled, model.Subjects?.ToArray());
var securityInfo = GetWebItemSecurityInfo(new List<string> { model.Id });
if (model.Subjects == null) return securityInfo;
var productName = GetProductName(new Guid(model.Id));
if (!model.Subjects.Any())
{
MessageService.Send(MessageAction.ProductAccessOpened, productName);
}
else
{
foreach (var info in securityInfo)
{
if (info.Groups.Any())
{
MessageService.Send(MessageAction.GroupsOpenedProductAccess, productName, info.Groups.Select(x => x.Name));
}
if (info.Users.Any())
{
MessageService.Send(MessageAction.UsersOpenedProductAccess, productName, info.Users.Select(x => HttpUtility.HtmlDecode(x.DisplayName)));
}
}
}
return securityInfo;
}
[Update("security/access")]
public IEnumerable<SecurityWrapper> SetAccessToWebItems(WebItemSecurityModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var itemList = new ItemDictionary<string, bool>();
foreach (var item in model.Items)
{
if (!itemList.ContainsKey(item.Key))
itemList.Add(item.Key, item.Value);
}
var defaultPageSettings = SettingsManager.Load<StudioDefaultPageSettings>();
2019-08-12 10:53:12 +00:00
foreach (var item in itemList)
{
Guid[] subjects = null;
var productId = new Guid(item.Key);
if (item.Value)
{
if (WebItemManager[productId] is IProduct webItem)
2019-08-12 10:53:12 +00:00
{
var productInfo = WebItemSecurity.GetSecurityInfo(item.Key);
2019-08-12 10:53:12 +00:00
var selectedGroups = productInfo.Groups.Select(group => group.ID).ToList();
var selectedUsers = productInfo.Users.Select(user => user.ID).ToList();
selectedUsers.AddRange(selectedGroups);
if (selectedUsers.Count > 0)
{
subjects = selectedUsers.ToArray();
}
}
}
else if (productId == defaultPageSettings.DefaultProductID)
{
2019-11-08 15:11:30 +00:00
SettingsManager.Save(defaultPageSettings.GetDefault(ServiceProvider) as StudioDefaultPageSettings);
2019-08-12 10:53:12 +00:00
}
WebItemSecurity.SetSecurity(item.Key, item.Value, subjects);
}
MessageService.Send(MessageAction.ProductsListUpdated);
return GetWebItemSecurityInfo(itemList.Keys.ToList());
}
[Read("security/administrator/{productid}")]
public IEnumerable<EmployeeWraper> GetProductAdministrators(Guid productid)
{
return WebItemSecurity.GetProductAdministrators(productid)
.Select(EmployeeWraperHelper.Get)
2019-08-12 10:53:12 +00:00
.ToList();
}
[Read("security/administrator")]
public object IsProductAdministrator(Guid productid, Guid userid)
{
var result = WebItemSecurity.IsProductAdministrator(productid, userid);
2019-08-12 10:53:12 +00:00
return new { ProductId = productid, UserId = userid, Administrator = result, };
}
[Update("security/administrator")]
public object SetProductAdministrator(SecurityModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
WebItemSecurity.SetProductAdministrator(model.ProductId, model.UserId, model.Administrator);
2019-08-12 10:53:12 +00:00
2019-09-09 12:56:33 +00:00
var admin = UserManager.GetUsers(model.UserId);
2019-08-12 10:53:12 +00:00
if (model.ProductId == Guid.Empty)
{
var messageAction = model.Administrator ? MessageAction.AdministratorOpenedFullAccess : MessageAction.AdministratorDeleted;
MessageService.Send(messageAction, MessageTarget.Create(admin.ID), admin.DisplayUserName(false, DisplayUserSettingsHelper));
2019-08-12 10:53:12 +00:00
}
else
{
var messageAction = model.Administrator ? MessageAction.ProductAddedAdministrator : MessageAction.ProductDeletedAdministrator;
MessageService.Send(messageAction, MessageTarget.Create(admin.ID), GetProductName(model.ProductId), admin.DisplayUserName(false, DisplayUserSettingsHelper));
2019-08-12 10:53:12 +00:00
}
return new { model.ProductId, model.UserId, model.Administrator };
}
[Read("logo")]
public string GetLogo()
{
return TenantInfoSettingsHelper.GetAbsoluteCompanyLogoPath(SettingsManager.Load<TenantInfoSettings>());
2019-08-12 10:53:12 +00:00
}
///<visible>false</visible>
[Create("whitelabel/save")]
public void SaveWhiteLabelSettings(WhiteLabelModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
if (!TenantLogoManager.WhiteLabelEnabled || !TenantLogoManager.WhiteLabelPaid)
{
throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel");
}
var _tenantWhiteLabelSettings = SettingsManager.Load<TenantWhiteLabelSettings>();
2019-08-12 10:53:12 +00:00
if (model.Logo != null)
{
var logoDict = new Dictionary<int, string>();
model.Logo.ToList().ForEach(n => logoDict.Add(n.Key, n.Value));
TenantWhiteLabelSettingsHelper.SetLogo(_tenantWhiteLabelSettings, logoDict);
2019-08-12 10:53:12 +00:00
}
_tenantWhiteLabelSettings.SetLogoText(model.LogoText);
TenantWhiteLabelSettingsHelper.Save(_tenantWhiteLabelSettings, Tenant.TenantId, TenantLogoManager);
2019-08-12 10:53:12 +00:00
}
///<visible>false</visible>
[Create("whitelabel/savefromfiles")]
public void SaveWhiteLabelSettingsFromFiles(WhiteLabelModel model)
{
if (model.Attachments != null && model.Attachments.Any())
{
var _tenantWhiteLabelSettings = SettingsManager.Load<TenantWhiteLabelSettings>();
2019-08-12 10:53:12 +00:00
foreach (var f in model.Attachments)
{
var parts = f.FileName.Split('.');
var logoType = (WhiteLabelLogoTypeEnum)(Convert.ToInt32(parts[0]));
var fileExt = parts[1];
using var inputStream = f.OpenReadStream();
TenantWhiteLabelSettingsHelper.SetLogoFromStream(_tenantWhiteLabelSettings, logoType, fileExt, inputStream);
2019-08-12 10:53:12 +00:00
}
TenantWhiteLabelSettingsHelper.Save(_tenantWhiteLabelSettings, Tenant.TenantId, TenantLogoManager);
2019-08-12 10:53:12 +00:00
}
else
{
throw new InvalidOperationException("No input files");
}
}
///<visible>false</visible>
[Read("whitelabel/sizes")]
public object GetWhiteLabelSizes()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
if (!TenantLogoManager.WhiteLabelEnabled)
{
throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel");
}
return
new[]
{
new {type = (int)WhiteLabelLogoTypeEnum.LightSmall, name = WhiteLabelLogoTypeEnum.LightSmall.ToString(), height = TenantWhiteLabelSettings.logoLightSmallSize.Height, width = TenantWhiteLabelSettings.logoLightSmallSize.Width},
new {type = (int)WhiteLabelLogoTypeEnum.Dark, name = WhiteLabelLogoTypeEnum.Dark.ToString(), height = TenantWhiteLabelSettings.logoDarkSize.Height, width = TenantWhiteLabelSettings.logoDarkSize.Width},
new {type = (int)WhiteLabelLogoTypeEnum.Favicon, name = WhiteLabelLogoTypeEnum.Favicon.ToString(), height = TenantWhiteLabelSettings.logoFaviconSize.Height, width = TenantWhiteLabelSettings.logoFaviconSize.Width},
new {type = (int)WhiteLabelLogoTypeEnum.DocsEditor, name = WhiteLabelLogoTypeEnum.DocsEditor.ToString(), height = TenantWhiteLabelSettings.logoDocsEditorSize.Height, width = TenantWhiteLabelSettings.logoDocsEditorSize.Width}
};
}
///<visible>false</visible>
[Read("whitelabel/logos")]
public Dictionary<int, string> GetWhiteLabelLogos(bool retina)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
if (!TenantLogoManager.WhiteLabelEnabled)
{
throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel");
}
var _tenantWhiteLabelSettings = SettingsManager.Load<TenantWhiteLabelSettings>();
2019-08-12 10:53:12 +00:00
var result = new Dictionary<int, string>
{
{ (int)WhiteLabelLogoTypeEnum.LightSmall, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.LightSmall, !retina)) },
{ (int)WhiteLabelLogoTypeEnum.Dark, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.Dark, !retina)) },
{ (int)WhiteLabelLogoTypeEnum.Favicon, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.Favicon, !retina)) },
{ (int)WhiteLabelLogoTypeEnum.DocsEditor, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettingsHelper.GetAbsoluteLogoPath(_tenantWhiteLabelSettings, WhiteLabelLogoTypeEnum.DocsEditor, !retina)) }
2019-08-12 10:53:12 +00:00
};
return result;
}
///<visible>false</visible>
[Read("whitelabel/logotext")]
public string GetWhiteLabelLogoText()
{
if (!TenantLogoManager.WhiteLabelEnabled)
{
throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel");
}
var whiteLabelSettings = SettingsManager.Load<TenantWhiteLabelSettings>();
2019-08-12 10:53:12 +00:00
return whiteLabelSettings.GetLogoText(SettingsManager) ?? TenantWhiteLabelSettings.DefaultLogoText;
2019-08-12 10:53:12 +00:00
}
///<visible>false</visible>
[Update("whitelabel/restore")]
public void RestoreWhiteLabelOptions()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
if (!TenantLogoManager.WhiteLabelEnabled || !TenantLogoManager.WhiteLabelPaid)
{
throw new BillingException(Resource.ErrorNotAllowedOption, "WhiteLabel");
}
var _tenantWhiteLabelSettings = SettingsManager.Load<TenantWhiteLabelSettings>();
TenantWhiteLabelSettingsHelper.RestoreDefault(_tenantWhiteLabelSettings, TenantLogoManager);
2019-08-12 10:53:12 +00:00
var _tenantInfoSettings = SettingsManager.Load<TenantInfoSettings>();
TenantInfoSettingsHelper.RestoreDefaultLogo(_tenantInfoSettings, TenantLogoManager);
SettingsManager.Save(_tenantInfoSettings);
2019-08-12 10:53:12 +00:00
}
[Read("iprestrictions")]
public IEnumerable<IPRestriction> GetIpRestrictions()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
return IPRestrictionsService.Get(Tenant.TenantId);
}
[Update("iprestrictions")]
public IEnumerable<string> SaveIpRestrictions(IpRestrictionsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
return IPRestrictionsService.Save(model.Ips, Tenant.TenantId);
}
[Update("iprestrictions/settings")]
public IPRestrictionsSettings UpdateIpRestrictionsSettings(IpRestrictionsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var settings = new IPRestrictionsSettings { Enable = model.Enable };
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
return settings;
}
[Update("tips")]
public TipsSettings UpdateTipsSettings(SettingsModel model)
{
var settings = new TipsSettings { Show = model.Show };
SettingsManager.SaveForCurrentUser(settings);
2019-08-12 10:53:12 +00:00
if (!model.Show && !string.IsNullOrEmpty(SetupInfo.TipsAddress))
{
try
{
using var client = new WebClient();
var data = new NameValueCollection
{
2019-09-09 12:56:33 +00:00
["userId"] = AuthContext.CurrentAccount.ID.ToString(),
2019-08-12 10:53:12 +00:00
["tenantId"] = Tenant.TenantId.ToString(CultureInfo.InvariantCulture)
};
client.UploadValues(string.Format("{0}/tips/deletereaded", SetupInfo.TipsAddress), data);
}
catch (Exception e)
{
2019-10-17 15:55:35 +00:00
Log.Error(e.Message, e);
2019-08-12 10:53:12 +00:00
}
}
return settings;
}
[Update("tips/change/subscription")]
public bool UpdateTipsSubscription()
{
return StudioPeriodicNotify.ChangeSubscription(AuthContext.CurrentAccount.ID, StudioNotifyHelper);
2019-08-12 10:53:12 +00:00
}
2020-08-03 14:06:37 +00:00
[Update("wizard/complete", Check = false)]
2020-07-02 14:11:59 +00:00
[Authorize(AuthenticationSchemes = "confirm", Roles = "Wizard")]
public WizardSettings CompleteWizard(WizardModel wizardModel)
2019-08-12 10:53:12 +00:00
{
2020-07-02 14:11:59 +00:00
ApiContext.AuthByClaim();
2019-08-12 10:53:12 +00:00
2020-07-02 14:11:59 +00:00
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2020-07-02 14:11:59 +00:00
return FirstTimeTenantSettings.SaveData(wizardModel);
2019-08-12 10:53:12 +00:00
}
2020-07-02 14:11:59 +00:00
2019-08-12 10:53:12 +00:00
[Update("tfaapp")]
public bool TfaSettings(TfaModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var result = false;
MessageAction action;
var settings = SettingsManager.Load<TfaAppAuthSettings>();
2019-08-12 10:53:12 +00:00
switch (model.Type)
{
case "sms":
if (!StudioSmsNotificationSettingsHelper.IsVisibleSettings())
2019-08-12 10:53:12 +00:00
throw new Exception(Resource.SmsNotAvailable);
if (!SmsProviderManager.Enabled())
throw new MethodAccessException();
StudioSmsNotificationSettingsHelper.Enable = true;
2019-08-12 10:53:12 +00:00
action = MessageAction.TwoFactorAuthenticationEnabledBySms;
if (settings.EnableSetting)
2019-08-12 10:53:12 +00:00
{
settings.EnableSetting = false;
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
}
result = true;
break;
case "app":
if (!TfaAppAuthSettings.IsVisibleSettings)
{
throw new Exception(Resource.TfaAppNotAvailable);
}
settings.EnableSetting = true;
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
action = MessageAction.TwoFactorAuthenticationEnabledByTfaApp;
if (StudioSmsNotificationSettingsHelper.IsVisibleSettings() && StudioSmsNotificationSettingsHelper.Enable)
2019-08-12 10:53:12 +00:00
{
StudioSmsNotificationSettingsHelper.Enable = false;
2019-08-12 10:53:12 +00:00
}
result = true;
break;
default:
if (settings.EnableSetting)
2019-08-12 10:53:12 +00:00
{
settings.EnableSetting = false;
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
}
if (StudioSmsNotificationSettingsHelper.IsVisibleSettings() && StudioSmsNotificationSettingsHelper.Enable)
2019-08-12 10:53:12 +00:00
{
StudioSmsNotificationSettingsHelper.Enable = false;
2019-08-12 10:53:12 +00:00
}
action = MessageAction.TwoFactorAuthenticationDisabled;
break;
}
if (result)
{
2019-09-09 12:56:33 +00:00
CookiesManager.ResetTenantCookie();
2019-08-12 10:53:12 +00:00
}
MessageService.Send(action);
return result;
}
///<visible>false</visible>
[Read("tfaappcodes")]
public IEnumerable<object> TfaAppGetCodes()
{
2019-09-09 12:56:33 +00:00
var currentUser = UserManager.GetUsers(AuthContext.CurrentAccount.ID);
2019-08-12 10:53:12 +00:00
if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(SettingsManager, currentUser.ID))
2019-08-12 10:53:12 +00:00
throw new Exception(Resource.TfaAppNotAvailable);
if (currentUser.IsVisitor(UserManager) || currentUser.IsOutsider(UserManager))
2019-08-12 10:53:12 +00:00
throw new NotSupportedException("Not available.");
return SettingsManager.LoadForCurrentUser<TfaAppUserSettings>().CodesSetting.Select(r => new { r.IsUsed, r.Code }).ToList();
2019-08-12 10:53:12 +00:00
}
[Update("tfaappnewcodes")]
public IEnumerable<object> TfaAppRequestNewCodes()
{
var currentUser = UserManager.GetUsers(AuthContext.CurrentAccount.ID);
2019-08-12 10:53:12 +00:00
if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(SettingsManager, currentUser.ID))
2019-08-12 10:53:12 +00:00
throw new Exception(Resource.TfaAppNotAvailable);
if (currentUser.IsVisitor(UserManager) || currentUser.IsOutsider(UserManager))
2019-08-12 10:53:12 +00:00
throw new NotSupportedException("Not available.");
2019-09-10 14:29:37 +00:00
var codes = TfaManager.GenerateBackupCodes(currentUser).Select(r => new { r.IsUsed, r.Code }).ToList();
MessageService.Send(MessageAction.UserConnectedTfaApp, MessageTarget.Create(currentUser.ID), currentUser.DisplayUserName(false, DisplayUserSettingsHelper));
2019-08-12 10:53:12 +00:00
return codes;
}
[Update("tfaappnewapp")]
public string TfaAppNewApp(TfaModel model)
{
var isMe = model.Id.Equals(Guid.Empty);
2019-09-09 12:56:33 +00:00
var user = UserManager.GetUsers(isMe ? AuthContext.CurrentAccount.ID : model.Id);
2019-08-12 10:53:12 +00:00
if (!isMe && !PermissionContext.CheckPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser))
2019-08-12 10:53:12 +00:00
throw new SecurityAccessDeniedException(Resource.ErrorAccessDenied);
if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(SettingsManager, user.ID))
2019-08-12 10:53:12 +00:00
throw new Exception(Resource.TfaAppNotAvailable);
if (user.IsVisitor(UserManager) || user.IsOutsider(UserManager))
2019-08-12 10:53:12 +00:00
throw new NotSupportedException("Not available.");
2019-11-08 15:11:30 +00:00
TfaAppUserSettings.DisableForUser(ServiceProvider, SettingsManager, user.ID);
MessageService.Send(MessageAction.UserDisconnectedTfaApp, MessageTarget.Create(user.ID), user.DisplayUserName(false, DisplayUserSettingsHelper));
2019-08-12 10:53:12 +00:00
if (isMe)
{
2019-09-19 15:55:44 +00:00
return CommonLinkUtility.GetConfirmationUrl(user.Email, ConfirmType.TfaActivation);
2019-08-12 10:53:12 +00:00
}
2019-09-17 12:42:32 +00:00
StudioNotifyService.SendMsgTfaReset(user);
2019-08-12 10:53:12 +00:00
return string.Empty;
}
///<visible>false</visible>
[Update("welcome/close")]
public void CloseWelcomePopup()
{
2019-09-09 12:56:33 +00:00
var currentUser = UserManager.GetUsers(AuthContext.CurrentAccount.ID);
2019-08-12 10:53:12 +00:00
var collaboratorPopupSettings = SettingsManager.LoadForCurrentUser<CollaboratorSettings>();
2019-08-12 10:53:12 +00:00
if (!(currentUser.IsVisitor(UserManager) && collaboratorPopupSettings.FirstVisit && !currentUser.IsOutsider(UserManager)))
2019-08-12 10:53:12 +00:00
throw new NotSupportedException("Not available.");
collaboratorPopupSettings.FirstVisit = false;
SettingsManager.SaveForCurrentUser(collaboratorPopupSettings);
2019-08-12 10:53:12 +00:00
}
///<visible>false</visible>
[Update("colortheme")]
public void SaveColorTheme(SettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
ColorThemesSettingsHelper.SaveColorTheme(model.Theme);
2019-08-12 10:53:12 +00:00
MessageService.Send(MessageAction.ColorThemeChanged);
}
///<visible>false</visible>
[Update("timeandlanguage")]
public string TimaAndLanguage(SettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var culture = CultureInfo.GetCultureInfo(model.Lng);
var changelng = false;
if (SetupInfo.EnabledCultures.Find(c => string.Equals(c.Name, culture.Name, StringComparison.InvariantCultureIgnoreCase)) != null)
{
if (!string.Equals(Tenant.Language, culture.Name, StringComparison.InvariantCultureIgnoreCase))
{
Tenant.Language = culture.Name;
changelng = true;
}
}
var oldTimeZone = Tenant.TimeZone;
var timeZones = TimeZoneInfo.GetSystemTimeZones().ToList();
if (timeZones.All(tz => tz.Id != "UTC"))
{
timeZones.Add(TimeZoneInfo.Utc);
}
2019-12-03 15:20:21 +00:00
Tenant.TimeZone = timeZones.FirstOrDefault(tz => tz.Id == model.TimeZoneID)?.Id ?? TimeZoneInfo.Utc.Id;
2019-08-12 10:53:12 +00:00
2019-09-09 12:56:33 +00:00
TenantManager.SaveTenant(Tenant);
2019-08-12 10:53:12 +00:00
2019-12-03 15:20:21 +00:00
if (!Tenant.TimeZone.Equals(oldTimeZone) || changelng)
2019-08-12 10:53:12 +00:00
{
2019-12-03 15:20:21 +00:00
if (!Tenant.TimeZone.Equals(oldTimeZone))
2019-08-12 10:53:12 +00:00
{
MessageService.Send(MessageAction.TimeZoneSettingsUpdated);
}
if (changelng)
{
MessageService.Send(MessageAction.LanguageSettingsUpdated);
}
}
return Resource.SuccessfullySaveSettingsMessage;
}
[Create("owner")]
public object SendOwnerChangeInstructions(SettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
var curTenant = TenantManager.GetCurrentTenant();
var owner = UserManager.GetUsers(curTenant.OwnerId);
var newOwner = UserManager.GetUsers(model.OwnerId);
if (newOwner.IsVisitor(UserManager)) throw new System.Security.SecurityException("Collaborator can not be an owner");
if (!owner.ID.Equals(AuthContext.CurrentAccount.ID) || Guid.Empty.Equals(newOwner.ID))
{
return new { Status = 0, Message = Resource.ErrorAccessDenied };
}
var confirmLink = CommonLinkUtility.GetConfirmationUrl(owner.Email, ConfirmType.PortalOwnerChange, newOwner.ID, newOwner.ID);
StudioNotifyService.SendMsgConfirmChangeOwner(owner, newOwner, confirmLink);
MessageService.Send(MessageAction.OwnerSentChangeOwnerInstructions, MessageTarget.Create(owner.ID), owner.DisplayUserName(false, DisplayUserSettingsHelper));
var emailLink = string.Format("<a href=\"mailto:{0}\">{0}</a>", owner.Email);
return new { Status = 1, Message = Resource.ChangePortalOwnerMsg.Replace(":email", emailLink) };
}
[Update("owner")]
[Authorize(AuthenticationSchemes = "confirm", Roles = "PortalOwnerChange")]
public void Owner(SettingsModel model)
{
var newOwner = Constants.LostUser;
try
{
newOwner = UserManager.GetUsers(model.OwnerId);
}
catch
{
}
if (Constants.LostUser.Equals(newOwner))
{
throw new Exception(Resource.ErrorUserNotFound);
}
if (UserManager.IsUserInGroup(newOwner.ID, Constants.GroupVisitor.ID))
{
throw new Exception(Resource.ErrorUserNotFound);
}
var curTenant = TenantManager.GetCurrentTenant();
curTenant.OwnerId = newOwner.ID;
TenantManager.SaveTenant(curTenant);
MessageService.Send(MessageAction.OwnerUpdated, newOwner.DisplayUserName(false, DisplayUserSettingsHelper));
}
2019-08-12 10:53:12 +00:00
///<visible>false</visible>
[Update("defaultpage")]
public string SaveDefaultPageSettings(SettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
SettingsManager.Save(new StudioDefaultPageSettings { DefaultProductID = model.DefaultProductID });
2019-08-12 10:53:12 +00:00
MessageService.Send(MessageAction.DefaultStartPageSettingsUpdated);
return Resource.SuccessfullySaveSettingsMessage;
}
private string GetProductName(Guid productId)
2019-08-12 10:53:12 +00:00
{
var product = WebItemManager[productId];
2019-08-12 10:53:12 +00:00
return productId == Guid.Empty ? "All" : product != null ? product.Name : productId.ToString();
}
2020-08-11 08:52:39 +00:00
[Read("license/refresh", Check = false)]
2019-08-12 10:53:12 +00:00
public bool RefreshLicense()
{
2019-09-18 15:19:30 +00:00
if (!CoreBaseSettings.Standalone) return false;
2019-08-12 10:53:12 +00:00
LicenseReader.RefreshLicense();
return true;
}
[AllowAnonymous]
2020-08-03 14:06:37 +00:00
[Read("license/required", Check = false)]
public bool RequestLicense()
{
return FirstTimeTenantSettings.RequestLicense;
}
2020-08-03 14:06:37 +00:00
[Create("license", Check = false)]
[Authorize(AuthenticationSchemes = "confirm", Roles = "Wizard")]
2020-08-07 14:32:55 +00:00
public object UploadLicense([FromForm]UploadLicenseModel model)
{
try
{
if (!AuthContext.IsAuthenticated && SettingsManager.Load<WizardSettings>().Completed) throw new SecurityException(Resource.PortalSecurity);
if (!model.Files.Any()) throw new Exception(Resource.ErrorEmptyUploadFileSelected);
ApiContext.AuthByClaim();
var licenseFile = model.Files.First();
var dueDate = LicenseReader.SaveLicenseTemp(licenseFile.OpenReadStream());
return dueDate >= DateTime.UtcNow.Date
? Resource.LicenseUploaded
: string.Format(Resource.LicenseUploadedOverdue,
"",
"",
dueDate.Date.ToLongDateString());
}
catch (LicenseExpiredException ex)
{
Log.Error("License upload", ex);
throw new Exception(Resource.LicenseErrorExpired);
}
catch (LicenseQuotaException ex)
{
Log.Error("License upload", ex);
throw new Exception(Resource.LicenseErrorQuota);
}
catch (LicensePortalException ex)
{
Log.Error("License upload", ex);
throw new Exception(Resource.LicenseErrorPortal);
}
catch (Exception ex)
{
Log.Error("License upload", ex);
throw new Exception(Resource.LicenseError);
}
}
2019-08-12 10:53:12 +00:00
[Read("customnavigation/getall")]
public List<CustomNavigationItem> GetCustomNavigationItems()
{
return SettingsManager.Load<CustomNavigationSettings>().Items;
2019-08-12 10:53:12 +00:00
}
[Read("customnavigation/getsample")]
public CustomNavigationItem GetCustomNavigationItemSample()
{
return CustomNavigationItem.GetSample();
}
[Read("customnavigation/get/{id}")]
public CustomNavigationItem GetCustomNavigationItem(Guid id)
{
return SettingsManager.Load<CustomNavigationSettings>().Items.FirstOrDefault(item => item.Id == id);
2019-08-12 10:53:12 +00:00
}
[Create("customnavigation/create")]
public CustomNavigationItem CreateCustomNavigationItem(CustomNavigationItem item)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var settings = SettingsManager.Load<CustomNavigationSettings>();
2019-08-12 10:53:12 +00:00
var exist = false;
foreach (var existItem in settings.Items)
{
if (existItem.Id != item.Id) continue;
existItem.Label = item.Label;
existItem.Url = item.Url;
existItem.ShowInMenu = item.ShowInMenu;
existItem.ShowOnHomePage = item.ShowOnHomePage;
if (existItem.SmallImg != item.SmallImg)
{
StorageHelper.DeleteLogo(existItem.SmallImg);
2019-09-13 11:18:27 +00:00
existItem.SmallImg = StorageHelper.SaveTmpLogo(item.SmallImg);
2019-08-12 10:53:12 +00:00
}
if (existItem.BigImg != item.BigImg)
{
StorageHelper.DeleteLogo(existItem.BigImg);
2019-09-13 11:18:27 +00:00
existItem.BigImg = StorageHelper.SaveTmpLogo(item.BigImg);
2019-08-12 10:53:12 +00:00
}
exist = true;
break;
}
if (!exist)
{
item.Id = Guid.NewGuid();
2019-09-13 11:18:27 +00:00
item.SmallImg = StorageHelper.SaveTmpLogo(item.SmallImg);
item.BigImg = StorageHelper.SaveTmpLogo(item.BigImg);
2019-08-12 10:53:12 +00:00
settings.Items.Add(item);
}
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
MessageService.Send(MessageAction.CustomNavigationSettingsUpdated);
return item;
}
[Delete("customnavigation/delete/{id}")]
public void DeleteCustomNavigationItem(Guid id)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var settings = SettingsManager.Load<CustomNavigationSettings>();
2019-08-12 10:53:12 +00:00
var terget = settings.Items.FirstOrDefault(item => item.Id == id);
if (terget == null) return;
StorageHelper.DeleteLogo(terget.SmallImg);
StorageHelper.DeleteLogo(terget.BigImg);
settings.Items.Remove(terget);
SettingsManager.Save(settings);
2019-08-12 10:53:12 +00:00
MessageService.Send(MessageAction.CustomNavigationSettingsUpdated);
}
[Update("emailactivation")]
public EmailActivationSettings UpdateEmailActivationSettings(bool show)
{
var settings = new EmailActivationSettings { Show = show };
SettingsManager.SaveForCurrentUser(settings);
2019-08-12 10:53:12 +00:00
return settings;
}
///<visible>false</visible>
[Read("companywhitelabel")]
public List<CompanyWhiteLabelSettings> GetCompanyWhiteLabelSettings()
{
var result = new List<CompanyWhiteLabelSettings>();
var instance = CompanyWhiteLabelSettings.Instance(SettingsManager);
2019-08-12 10:53:12 +00:00
result.Add(instance);
if (!instance.IsDefault(CoreSettings) && !instance.IsLicensor)
2019-08-12 10:53:12 +00:00
{
2019-11-08 15:11:30 +00:00
result.Add(instance.GetDefault(ServiceProvider) as CompanyWhiteLabelSettings);
2019-08-12 10:53:12 +00:00
}
return result;
}
[Read("statistics/spaceusage/{id}")]
public List<UsageSpaceStatItemWrapper> GetSpaceUsageStatistics(Guid id)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2019-09-16 14:51:39 +00:00
var webtem = WebItemManagerSecurity.GetItems(WebZoneType.All, ItemAvailableState.All)
2019-08-12 10:53:12 +00:00
.FirstOrDefault(item =>
item != null &&
item.ID == id &&
item.Context != null &&
item.Context.SpaceUsageStatManager != null);
if (webtem == null) return new List<UsageSpaceStatItemWrapper>();
return webtem.Context.SpaceUsageStatManager.GetStatData()
.ConvertAll(it => new UsageSpaceStatItemWrapper
2019-08-15 12:04:42 +00:00
{
Name = it.Name.HtmlEncode(),
Icon = it.ImgUrl,
Disabled = it.Disabled,
Size = FileSizeComment.FilesSizeToString(it.SpaceUsage),
Url = it.Url
});
2019-08-12 10:53:12 +00:00
}
[Read("statistics/visit")]
public List<ChartPointWrapper> GetVisitStatistics(ApiDateTime fromDate, ApiDateTime toDate)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var from = TenantUtil.DateTimeFromUtc(fromDate);
var to = TenantUtil.DateTimeFromUtc(toDate);
var points = new List<ChartPointWrapper>();
if (from.CompareTo(to) >= 0) return points;
for (var d = new DateTime(from.Ticks); d.Date.CompareTo(to.Date) <= 0; d = d.AddDays(1))
{
points.Add(new ChartPointWrapper
2019-08-15 12:04:42 +00:00
{
DisplayDate = d.Date.ToShortDateString(),
Date = d.Date,
Hosts = 0,
Hits = 0
});
2019-08-12 10:53:12 +00:00
}
2019-09-02 15:10:27 +00:00
var hits = StatisticManager.GetHitsByPeriod(Tenant.TenantId, from, to);
var hosts = StatisticManager.GetHostsByPeriod(Tenant.TenantId, from, to);
2019-08-12 10:53:12 +00:00
if (hits.Count == 0 || hosts.Count == 0) return points;
hits.Sort((x, y) => x.VisitDate.CompareTo(y.VisitDate));
hosts.Sort((x, y) => x.VisitDate.CompareTo(y.VisitDate));
for (int i = 0, n = points.Count, hitsNum = 0, hostsNum = 0; i < n; i++)
{
while (hitsNum < hits.Count && points[i].Date.CompareTo(hits[hitsNum].VisitDate.Date) == 0)
{
points[i].Hits += hits[hitsNum].VisitCount;
hitsNum++;
}
while (hostsNum < hosts.Count && points[i].Date.CompareTo(hosts[hostsNum].VisitDate.Date) == 0)
{
points[i].Hosts++;
hostsNum++;
}
}
return points;
}
[Read("storage")]
public List<StorageWrapper> GetAllStorages()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
var current = SettingsManager.Load<StorageSettings>();
2019-08-12 10:53:12 +00:00
var consumers = ConsumerFactory.GetAll<DataStoreConsumer>().ToList();
return consumers.Select(consumer => new StorageWrapper(consumer, current)).ToList();
}
[Read("storage/progress", false)]
public double GetStorageProgress()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
2019-09-18 15:19:30 +00:00
if (!CoreBaseSettings.Standalone) return -1;
2019-08-12 10:53:12 +00:00
2019-08-15 15:08:40 +00:00
using var migrateClient = new ServiceClient();
return migrateClient.GetProgress(Tenant.TenantId);
2019-08-12 10:53:12 +00:00
}
[Update("storage")]
public StorageSettings UpdateStorage(StorageModel model)
{
2020-01-21 12:44:05 +00:00
try
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
if (!CoreBaseSettings.Standalone) return null;
2019-08-12 10:53:12 +00:00
2020-01-21 12:44:05 +00:00
var consumer = ConsumerFactory.GetByKey(model.Module);
if (!consumer.IsSet)
throw new ArgumentException("module");
2019-08-12 10:53:12 +00:00
2020-01-21 12:44:05 +00:00
var settings = SettingsManager.Load<StorageSettings>();
if (settings.Module == model.Module) return settings;
2019-08-12 10:53:12 +00:00
2020-01-21 12:44:05 +00:00
settings.Module = model.Module;
settings.Props = model.Props.ToDictionary(r => r.Key, b => b.Value);
2019-08-12 10:53:12 +00:00
StartMigrate(settings);
2020-01-21 12:44:05 +00:00
return settings;
2019-08-12 10:53:12 +00:00
}
catch (Exception e)
{
2019-10-17 15:55:35 +00:00
Log.Error("UpdateStorage", e);
2019-08-12 10:53:12 +00:00
throw;
}
}
[Delete("storage")]
public void ResetStorageToDefault()
{
2020-01-21 12:44:05 +00:00
try
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
if (!CoreBaseSettings.Standalone) return;
2019-08-12 10:53:12 +00:00
2020-01-21 12:44:05 +00:00
var settings = SettingsManager.Load<StorageSettings>();
settings.Module = null;
settings.Props = null;
2019-08-12 10:53:12 +00:00
StartMigrate(settings);
}
catch (Exception e)
{
2019-10-17 15:55:35 +00:00
Log.Error("ResetStorageToDefault", e);
2019-08-12 10:53:12 +00:00
throw;
}
}
[Read("storage/cdn")]
public List<StorageWrapper> GetAllCdnStorages()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-09-18 15:19:30 +00:00
if (!CoreBaseSettings.Standalone) return null;
2019-08-12 10:53:12 +00:00
var current = SettingsManager.Load<CdnStorageSettings>();
2019-08-12 10:53:12 +00:00
var consumers = ConsumerFactory.GetAll<DataStoreConsumer>().Where(r => r.Cdn != null).ToList();
return consumers.Select(consumer => new StorageWrapper(consumer, current)).ToList();
}
[Update("storage/cdn")]
public CdnStorageSettings UpdateCdn(StorageModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-09-18 15:19:30 +00:00
if (!CoreBaseSettings.Standalone) return null;
2019-08-12 10:53:12 +00:00
2019-12-20 11:17:01 +00:00
var consumer = ConsumerFactory.GetByKey(model.Module);
2019-08-12 10:53:12 +00:00
if (!consumer.IsSet)
throw new ArgumentException("module");
var settings = SettingsManager.Load<CdnStorageSettings>();
2019-08-12 10:53:12 +00:00
if (settings.Module == model.Module) return settings;
settings.Module = model.Module;
settings.Props = model.Props.ToDictionary(r => r.Key, b => b.Value);
try
{
2019-08-15 15:08:40 +00:00
using var migrateClient = new ServiceClient();
migrateClient.UploadCdn(Tenant.TenantId, "/", WebHostEnvironment.ContentRootPath, settings);
2019-08-12 10:53:12 +00:00
}
catch (Exception e)
{
2019-10-17 15:55:35 +00:00
Log.Error("UpdateCdn", e);
2019-08-12 10:53:12 +00:00
throw;
}
return settings;
}
[Delete("storage/cdn")]
public void ResetCdnToDefault()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2019-09-18 15:19:30 +00:00
if (!CoreBaseSettings.Standalone) return;
2019-08-12 10:53:12 +00:00
StorageSettingsHelper.Clear(SettingsManager.Load<CdnStorageSettings>());
2019-08-12 10:53:12 +00:00
}
//[Read("storage/backup")]
//public List<StorageWrapper> GetAllBackupStorages()
//{
2019-09-09 12:56:33 +00:00
// PermissionContext.DemandPermissions(Tenant, SecutiryConstants.EditPortalSettings);
2019-08-12 10:53:12 +00:00
// var schedule = new BackupAjaxHandler().GetSchedule();
// var current = new StorageSettings();
// if (schedule != null && schedule.StorageType == Contracts.BackupStorageType.ThirdPartyConsumer)
// {
// current = new StorageSettings
// {
// Module = schedule.StorageParams["module"],
// Props = schedule.StorageParams.Where(r => r.Key != "module").ToDictionary(r => r.Key, r => r.Value)
// };
// }
// var consumers = ConsumerFactory.GetAll<DataStoreConsumer>().ToList();
// return consumers.Select(consumer => new StorageWrapper(consumer, current)).ToList();
//}
private void StartMigrate(StorageSettings settings)
{
using (var migrateClient = new ServiceClient())
{
migrateClient.Migrate(Tenant.TenantId, settings);
}
Tenant.SetStatus(TenantStatus.Migrating);
2020-01-21 12:44:05 +00:00
TenantManager.SaveTenant(Tenant);
2019-08-12 10:53:12 +00:00
}
[Read("socket")]
public object GetSocketSettings()
{
2019-09-23 12:20:08 +00:00
var hubUrl = Configuration["web:hub"] ?? string.Empty;
2019-08-12 10:53:12 +00:00
if (hubUrl != string.Empty)
{
if (!hubUrl.EndsWith("/"))
{
hubUrl += "/";
}
}
return new { Url = hubUrl };
}
2020-07-24 14:01:20 +00:00
private readonly int maxCount = 10;
private readonly int expirationMinutes = 2;
private void CheckCache(string basekey)
{
var key = ApiContext.HttpContextAccessor.HttpContext.Request.GetUserHostAddress() + basekey;
if (MemoryCache.TryGetValue<int>(key, out var count))
{
if (count > maxCount)
throw new Exception(Resource.ErrorRequestLimitExceeded);
}
MemoryCache.Set(key, ++count, TimeSpan.FromMinutes(expirationMinutes));
}
2019-08-12 10:53:12 +00:00
}
2019-10-31 13:54:43 +00:00
public static class SettingsControllerExtension
2019-10-31 13:54:43 +00:00
{
2020-02-17 08:58:14 +00:00
public static DIHelper AddSettingsController(this DIHelper services)
2019-10-31 13:54:43 +00:00
{
return services
.AddMessageTargetService()
.AddCoreConfigurationService()
.AddIPRestrictionsService()
.AddDisplayUserSettingsService()
.AddSetupInfo()
.AddCommonLinkUtilityService()
.AddCoreBaseSettingsService()
.AddTenantUtilService()
.AddEmailValidationKeyProviderService()
.AddMessageServiceService()
.AddStudioNotifyServiceService()
.AddApiContextService()
.AddUserManagerService()
.AddTenantManagerService()
.AddTenantExtraService()
.AddTenantStatisticsProviderService()
.AddUserPhotoManagerService()
.AddAuthContextService()
.AddCookiesManagerService()
.AddWebItemSecurity()
.AddStudioNotifyHelperService()
.AddLicenseReaderService()
.AddPermissionContextService()
.AddWebItemManager()
.AddWebItemManagerSecurity()
.AddCdnStorageSettingsService()
.AddStorageSettingsService()
.AddStorageFactoryService()
.AddStorageFactoryConfigService()
.AddSettingsManagerService()
2019-10-31 13:54:43 +00:00
.AddTenantInfoSettingsService()
.AddColorThemesSettingsHelperService()
2019-10-31 13:54:43 +00:00
.AddTenantWhiteLabelSettingsService()
.AddStudioSmsNotificationSettingsService()
.AddTfaManagerService()
.AddStorageHelperService()
.AddTenantLogoManagerService()
.AddBuildVersionService()
2019-11-12 08:47:49 +00:00
.AddStatisticManagerService()
2019-12-20 11:17:01 +00:00
.AddEmployeeWraper()
.AddConsumerFactoryService()
2020-01-16 15:01:07 +00:00
.AddSmsProviderManagerService()
.AddCustomNamingPeopleService()
.AddProviderManagerService()
.AddAccountLinker()
.AddMobileDetectorService()
2020-07-02 14:11:59 +00:00
.AddFirstTimeTenantSettings();
2019-10-31 13:54:43 +00:00
}
}
2019-08-12 10:53:12 +00:00
}