2022-01-31 08:30:08 +00:00
|
|
|
using Constants = ASC.Core.Users.Constants;
|
2022-01-31 14:35:36 +00:00
|
|
|
using System.Threading.Tasks;
|
2019-08-12 10:53:12 +00:00
|
|
|
|
|
|
|
namespace ASC.Web.Studio.Core.SMS
|
|
|
|
{
|
2021-04-26 11:56:38 +00:00
|
|
|
[Scope]
|
2019-09-09 12:56:33 +00:00
|
|
|
public class SmsManager
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
2020-08-12 09:58:08 +00:00
|
|
|
private UserManager UserManager { get; }
|
|
|
|
private SecurityContext SecurityContext { get; }
|
|
|
|
private TenantManager TenantManager { get; }
|
2021-04-26 11:56:38 +00:00
|
|
|
private SmsKeyStorage SmsKeyStorage { get; }
|
|
|
|
private SmsSender SmsSender { get; }
|
2020-08-12 09:58:08 +00:00
|
|
|
private StudioSmsNotificationSettingsHelper StudioSmsNotificationSettingsHelper { get; }
|
2019-09-09 12:56:33 +00:00
|
|
|
|
2019-09-16 14:51:39 +00:00
|
|
|
public SmsManager(
|
|
|
|
UserManager userManager,
|
|
|
|
SecurityContext securityContext,
|
|
|
|
TenantManager tenantManager,
|
2019-09-23 12:20:08 +00:00
|
|
|
SmsKeyStorage smsKeyStorage,
|
2019-11-08 12:21:51 +00:00
|
|
|
SmsSender smsSender,
|
|
|
|
StudioSmsNotificationSettingsHelper studioSmsNotificationSettingsHelper)
|
2019-09-09 12:56:33 +00:00
|
|
|
{
|
|
|
|
UserManager = userManager;
|
|
|
|
SecurityContext = securityContext;
|
2019-09-16 14:51:39 +00:00
|
|
|
TenantManager = tenantManager;
|
2019-09-18 12:14:15 +00:00
|
|
|
SmsKeyStorage = smsKeyStorage;
|
2019-10-17 15:55:35 +00:00
|
|
|
SmsSender = smsSender;
|
2019-11-08 12:21:51 +00:00
|
|
|
StudioSmsNotificationSettingsHelper = studioSmsNotificationSettingsHelper;
|
2019-09-09 12:56:33 +00:00
|
|
|
}
|
|
|
|
|
2022-02-15 13:20:06 +00:00
|
|
|
public Task<string> SaveMobilePhoneAsync(UserInfo user, string mobilePhone)
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
|
|
|
mobilePhone = SmsSender.GetPhoneValueDigits(mobilePhone);
|
|
|
|
|
|
|
|
if (user == null || Equals(user, Constants.LostUser)) throw new Exception(Resource.ErrorUserNotFound);
|
|
|
|
if (string.IsNullOrEmpty(mobilePhone)) throw new Exception(Resource.ActivateMobilePhoneEmptyPhoneNumber);
|
|
|
|
if (!string.IsNullOrEmpty(user.MobilePhone) && user.MobilePhoneActivationStatus == MobilePhoneActivationStatus.Activated) throw new Exception(Resource.MobilePhoneMustErase);
|
|
|
|
|
2022-02-15 13:20:06 +00:00
|
|
|
return InternalSaveMobilePhoneAsync(user, mobilePhone);
|
|
|
|
}
|
|
|
|
|
|
|
|
private async Task<string> InternalSaveMobilePhoneAsync(UserInfo user, string mobilePhone)
|
|
|
|
{
|
2019-08-12 10:53:12 +00:00
|
|
|
user.MobilePhone = mobilePhone;
|
|
|
|
user.MobilePhoneActivationStatus = MobilePhoneActivationStatus.NotActivated;
|
|
|
|
if (SecurityContext.IsAuthenticated)
|
|
|
|
{
|
2020-10-12 19:39:23 +00:00
|
|
|
UserManager.SaveUserInfo(user);
|
2019-08-12 10:53:12 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2021-08-18 14:04:16 +00:00
|
|
|
SecurityContext.AuthenticateMeWithoutCookie(ASC.Core.Configuration.Constants.CoreSystem);
|
2020-10-12 19:39:23 +00:00
|
|
|
UserManager.SaveUserInfo(user);
|
2019-08-12 10:53:12 +00:00
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
SecurityContext.Logout();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-08 12:21:51 +00:00
|
|
|
if (StudioSmsNotificationSettingsHelper.Enable)
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
2022-01-31 14:35:36 +00:00
|
|
|
await PutAuthCodeAsync(user, false);
|
2019-08-12 10:53:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return mobilePhone;
|
|
|
|
}
|
|
|
|
|
2022-02-15 13:20:06 +00:00
|
|
|
public Task PutAuthCodeAsync(UserInfo user, bool again)
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
|
|
|
if (user == null || Equals(user, Constants.LostUser)) throw new Exception(Resource.ErrorUserNotFound);
|
|
|
|
|
2019-11-08 12:21:51 +00:00
|
|
|
if (!StudioSmsNotificationSettingsHelper.IsVisibleSettings() || !StudioSmsNotificationSettingsHelper.Enable) throw new MethodAccessException();
|
2019-08-12 10:53:12 +00:00
|
|
|
|
|
|
|
var mobilePhone = SmsSender.GetPhoneValueDigits(user.MobilePhone);
|
|
|
|
|
2022-02-15 13:20:06 +00:00
|
|
|
if (SmsKeyStorage.ExistsKey(mobilePhone) && !again) return Task.CompletedTask;
|
2019-08-12 10:53:12 +00:00
|
|
|
|
2019-08-15 13:05:50 +00:00
|
|
|
if (!SmsKeyStorage.GenerateKey(mobilePhone, out var key)) throw new Exception(Resource.SmsTooMuchError);
|
2022-02-15 13:20:06 +00:00
|
|
|
return InternalPutAuthCodeAsync(mobilePhone, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
private async Task InternalPutAuthCodeAsync(string mobilePhone, string key)
|
2022-02-23 19:42:34 +00:00
|
|
|
{
|
2022-01-31 14:35:36 +00:00
|
|
|
if (await SmsSender.SendSMSAsync(mobilePhone, string.Format(Resource.SmsAuthenticationMessageToUser, key)))
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
2022-02-15 10:30:05 +00:00
|
|
|
TenantManager.SetTenantQuotaRow(new TenantQuotaRow { Tenant = TenantManager.GetCurrentTenant().Id, Path = "/sms", Counter = 1 }, true);
|
2019-08-12 10:53:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-20 15:53:27 +00:00
|
|
|
public void ValidateSmsCode(UserInfo user, string code)
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
2019-11-08 12:21:51 +00:00
|
|
|
if (!StudioSmsNotificationSettingsHelper.IsVisibleSettings()
|
|
|
|
|| !StudioSmsNotificationSettingsHelper.Enable)
|
2019-08-12 10:53:12 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (user == null || Equals(user, Constants.LostUser)) throw new Exception(Resource.ErrorUserNotFound);
|
|
|
|
|
|
|
|
var valid = SmsKeyStorage.ValidateKey(user.MobilePhone, code);
|
|
|
|
switch (valid)
|
|
|
|
{
|
|
|
|
case SmsKeyStorage.Result.Empty:
|
|
|
|
throw new Exception(Resource.ActivateMobilePhoneEmptyCode);
|
|
|
|
case SmsKeyStorage.Result.TooMuch:
|
|
|
|
throw new BruteForceCredentialException(Resource.SmsTooMuchError);
|
|
|
|
case SmsKeyStorage.Result.Timeout:
|
|
|
|
throw new TimeoutException(Resource.SmsAuthenticationTimeout);
|
|
|
|
case SmsKeyStorage.Result.Invalide:
|
|
|
|
throw new ArgumentException(Resource.SmsAuthenticationMessageError);
|
|
|
|
}
|
|
|
|
if (valid != SmsKeyStorage.Result.Ok) throw new Exception("Error: " + valid);
|
|
|
|
|
|
|
|
if (!SecurityContext.IsAuthenticated)
|
|
|
|
{
|
2022-02-15 10:30:05 +00:00
|
|
|
SecurityContext.AuthenticateMe(user.Id);
|
2019-08-12 10:53:12 +00:00
|
|
|
//CookiesManager.SetCookies(CookiesType.AuthKey, cookiesKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (user.MobilePhoneActivationStatus == MobilePhoneActivationStatus.NotActivated)
|
|
|
|
{
|
|
|
|
user.MobilePhoneActivationStatus = MobilePhoneActivationStatus.Activated;
|
2020-10-12 19:39:23 +00:00
|
|
|
UserManager.SaveUserInfo(user);
|
2019-08-12 10:53:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|