DocSpace-buildtools/web/ASC.Web.Api/Core/FirstTimeTenantSettings.cs

290 lines
10 KiB
C#
Raw Normal View History

2022-03-15 18:00:53 +00:00
// (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
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
namespace ASC.Web.Studio.UserControls.FirstTime;
[Transient]
public class FirstTimeTenantSettings
2020-07-02 14:11:59 +00:00
{
2022-05-26 09:01:54 +00:00
private readonly ILogger<FirstTimeTenantSettings> _log;
2022-03-01 10:58:02 +00:00
private readonly TenantManager _tenantManager;
private readonly TenantExtra _tenantExtra;
private readonly SettingsManager _settingsManager;
private readonly UserManager _userManager;
private readonly SetupInfo _setupInfo;
private readonly SecurityContext _securityContext;
private readonly PaymentManager _paymentManager;
private readonly MessageService _messageService;
private readonly LicenseReader _licenseReader;
private readonly StudioNotifyService _studioNotifyService;
private readonly TimeZoneConverter _timeZoneConverter;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly IHttpClientFactory _clientFactory;
public FirstTimeTenantSettings(
ILogger<FirstTimeTenantSettings> logger,
2022-03-01 10:58:02 +00:00
TenantManager tenantManager,
TenantExtra tenantExtra,
SettingsManager settingsManager,
UserManager userManager,
SetupInfo setupInfo,
SecurityContext securityContext,
PaymentManager paymentManager,
MessageService messageService,
LicenseReader licenseReader,
StudioNotifyService studioNotifyService,
TimeZoneConverter timeZoneConverter,
CoreBaseSettings coreBaseSettings,
IHttpClientFactory clientFactory)
2020-07-02 14:11:59 +00:00
{
2022-03-18 08:12:16 +00:00
_log = logger;
2022-03-01 10:58:02 +00:00
_tenantManager = tenantManager;
_tenantExtra = tenantExtra;
_settingsManager = settingsManager;
_userManager = userManager;
_setupInfo = setupInfo;
_securityContext = securityContext;
_paymentManager = paymentManager;
_messageService = messageService;
_licenseReader = licenseReader;
_studioNotifyService = studioNotifyService;
_timeZoneConverter = timeZoneConverter;
_coreBaseSettings = coreBaseSettings;
_clientFactory = clientFactory;
}
2020-07-02 14:11:59 +00:00
2022-03-15 10:56:22 +00:00
public WizardSettings SaveData(WizardRequestsDto inDto)
2022-03-01 10:58:02 +00:00
{
try
2020-07-02 14:11:59 +00:00
{
2022-03-15 10:56:22 +00:00
var (email, passwordHash, lng, timeZone, promocode, amiid, subscribeFromSite) = inDto;
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
var tenant = _tenantManager.GetCurrentTenant();
var settings = _settingsManager.Load<WizardSettings>();
if (settings.Completed)
{
throw new Exception("Wizard passed.");
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (!string.IsNullOrEmpty(_setupInfo.AmiMetaUrl) && IncorrectAmiId(amiid))
{
//throw new Exception(Resource.EmailAndPasswordIncorrectAmiId); TODO
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (tenant.OwnerId == Guid.Empty)
{
Thread.Sleep(TimeSpan.FromSeconds(6)); // wait cache interval
tenant = _tenantManager.GetTenant(tenant.Id);
2020-07-02 14:11:59 +00:00
if (tenant.OwnerId == Guid.Empty)
{
2022-05-13 13:09:13 +00:00
_log.ErrorOwnerEmpty(tenant.Id);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
var currentUser = _userManager.GetUsers(_tenantManager.GetCurrentTenant().OwnerId);
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (!UserManagerWrapper.ValidateEmail(email))
{
throw new Exception(Resource.EmailAndPasswordIncorrectEmail);
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (string.IsNullOrEmpty(passwordHash))
2022-03-17 15:01:39 +00:00
{
2022-03-01 10:58:02 +00:00
throw new Exception(Resource.ErrorPasswordEmpty);
2022-03-17 15:01:39 +00:00
}
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
_securityContext.SetUserPasswordHash(currentUser.Id, passwordHash);
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
email = email.Trim();
if (currentUser.Email != email)
{
currentUser.Email = email;
currentUser.ActivationStatus = EmployeeActivationStatus.NotActivated;
}
_userManager.SaveUserInfo(currentUser);
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (!string.IsNullOrWhiteSpace(promocode))
{
try
2020-07-02 14:11:59 +00:00
{
2022-03-01 10:58:02 +00:00
_paymentManager.ActivateKey(promocode);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
catch (Exception err)
2020-07-02 14:11:59 +00:00
{
2022-05-13 13:09:13 +00:00
_log.ErrorIncorrectPromo(promocode, err);
2022-03-01 10:58:02 +00:00
throw new Exception(Resource.EmailAndPasswordIncorrectPromocode);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (RequestLicense)
{
TariffSettings.SetLicenseAccept(_settingsManager);
_messageService.Send(MessageAction.LicenseKeyUploaded);
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
_licenseReader.RefreshLicense();
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
settings.Completed = true;
_settingsManager.Save(settings);
2020-08-03 12:01:02 +00:00
2022-03-01 10:58:02 +00:00
TrySetLanguage(tenant, lng);
2020-08-03 12:01:02 +00:00
2022-03-01 10:58:02 +00:00
tenant.TimeZone = _timeZoneConverter.GetTimeZone(timeZone).Id;
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
_tenantManager.SaveTenant(tenant);
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
_studioNotifyService.SendCongratulations(currentUser);
_studioNotifyService.SendRegData(currentUser);
if (subscribeFromSite && _tenantExtra.Opensource && !_coreBaseSettings.CustomMode)
2020-07-02 14:11:59 +00:00
{
2022-03-01 10:58:02 +00:00
SubscribeFromSite(currentUser);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
return settings;
}
catch (BillingNotFoundException)
2020-07-02 14:11:59 +00:00
{
2022-03-01 10:58:02 +00:00
throw new Exception(UserControlsCommonResource.LicenseKeyNotFound);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
catch (BillingNotConfiguredException)
{
throw new Exception(UserControlsCommonResource.LicenseKeyNotCorrect);
}
catch (BillingException)
{
throw new Exception(UserControlsCommonResource.LicenseException);
}
catch (Exception ex)
2020-07-02 14:11:59 +00:00
{
2022-05-13 13:09:13 +00:00
_log.ErrorFirstTimeTenantSettings(ex);
2022-03-01 10:58:02 +00:00
throw;
}
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
public bool RequestLicense
{
get
{
return _tenantExtra.EnableTariffSettings && _tenantExtra.Enterprise
&& !File.Exists(_licenseReader.LicensePath);
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
private void TrySetLanguage(Tenant tenant, string lng)
{
2022-03-17 15:01:39 +00:00
if (string.IsNullOrEmpty(lng))
{
return;
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
try
{
var culture = CultureInfo.GetCultureInfo(lng);
tenant.Language = culture.Name;
}
catch (Exception err)
2020-07-02 14:11:59 +00:00
{
2022-05-13 13:09:13 +00:00
_log.ErrorTrySetLanguage(err);
2022-03-01 10:58:02 +00:00
}
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
private static string _amiId;
2021-10-12 10:14:33 +00:00
2022-03-01 10:58:02 +00:00
private bool IncorrectAmiId(string customAmiId)
{
customAmiId = (customAmiId ?? "").Trim();
2022-03-17 15:01:39 +00:00
if (string.IsNullOrEmpty(customAmiId))
{
return true;
}
2020-07-02 14:11:59 +00:00
2022-03-01 10:58:02 +00:00
if (string.IsNullOrEmpty(_amiId))
{
var getAmiIdUrl = _setupInfo.AmiMetaUrl + "instance-id";
2022-04-14 19:23:57 +00:00
var request = new HttpRequestMessage
{
RequestUri = new Uri(getAmiIdUrl)
};
2022-03-01 10:58:02 +00:00
try
{
var httpClient = _clientFactory.CreateClient();
using (var response = httpClient.Send(request))
using (var responseStream = response.Content.ReadAsStream())
using (var reader = new StreamReader(responseStream))
2020-07-02 14:11:59 +00:00
{
2022-03-01 10:58:02 +00:00
_amiId = reader.ReadToEnd();
2020-07-02 14:11:59 +00:00
}
2022-05-13 13:09:13 +00:00
_log.DebugInstanceId(_amiId);
2022-03-01 10:58:02 +00:00
}
catch (Exception e)
{
2022-05-13 13:09:13 +00:00
_log.ErrorRequestAMIId(e);
2022-03-01 10:58:02 +00:00
}
2020-07-02 14:11:59 +00:00
}
2022-03-01 10:58:02 +00:00
return string.IsNullOrEmpty(_amiId) || _amiId != customAmiId;
}
private void SubscribeFromSite(UserInfo user)
{
try
2020-09-18 14:45:59 +00:00
{
2022-03-01 10:58:02 +00:00
var url = (_setupInfo.TeamlabSiteRedirect ?? "").Trim().TrimEnd('/');
2020-12-28 13:22:08 +00:00
2022-03-17 15:01:39 +00:00
if (string.IsNullOrEmpty(url))
{
return;
}
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
url += "/post.ashx";
2022-04-14 19:23:57 +00:00
var request = new HttpRequestMessage
{
RequestUri = new Uri(url)
};
2022-03-01 10:58:02 +00:00
var values = new NameValueCollection
{
{ "type", "sendsubscription" },
{ "subscr_type", "Opensource" },
{ "email", user.Email }
};
var data = JsonSerializer.Serialize(values);
request.Content = new StringContent(data);
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
var httpClient = _clientFactory.CreateClient();
using var response = httpClient.Send(request);
2021-10-12 10:14:33 +00:00
2022-05-13 13:09:13 +00:00
_log.DebugSubscribeResponse(response);//toto write
2020-09-18 14:45:59 +00:00
2022-03-01 10:58:02 +00:00
}
catch (Exception e)
{
2022-05-13 13:09:13 +00:00
_log.ErrorSubscribeRequest(e);
2020-09-18 14:45:59 +00:00
}
2020-07-02 14:11:59 +00:00
}
}