People: Added thirdparty/signup method

This commit is contained in:
pavelbannov 2021-04-15 14:34:22 +03:00
parent 69fb52026f
commit 741c3a17ab
2 changed files with 167 additions and 8 deletions

View File

@ -8,6 +8,7 @@ using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Security;
using System.Threading;
using ASC.Api.Core;
using ASC.Common;
@ -83,8 +84,10 @@ namespace ASC.Employee.Core.Controllers
private EmployeeWraperFullHelper EmployeeWraperFullHelper { get; }
private EmployeeWraperHelper EmployeeWraperHelper { get; }
private UserFormatter UserFormatter { get; }
public PasswordHasher PasswordHasher { get; }
public ILog Log { get; }
private PasswordHasher PasswordHasher { get; }
private UserHelpTourHelper UserHelpTourHelper { get; }
private PersonalSettingsHelper PersonalSettingsHelper { get; }
private ILog Log { get; }
public PeopleController(
MessageService messageService,
@ -119,7 +122,9 @@ namespace ASC.Employee.Core.Controllers
EmployeeWraperFullHelper employeeWraperFullHelper,
EmployeeWraperHelper employeeWraperHelper,
UserFormatter userFormatter,
PasswordHasher passwordHasher)
PasswordHasher passwordHasher,
UserHelpTourHelper userHelpTourHelper,
PersonalSettingsHelper personalSettingsHelper)
{
Log = option.Get("ASC.Api");
Log.Debug("Test");
@ -155,6 +160,8 @@ namespace ASC.Employee.Core.Controllers
EmployeeWraperHelper = employeeWraperHelper;
UserFormatter = userFormatter;
PasswordHasher = passwordHasher;
UserHelpTourHelper = userHelpTourHelper;
PersonalSettingsHelper = personalSettingsHelper;
}
[Read("info")]
@ -451,7 +458,7 @@ namespace ASC.Employee.Core.Controllers
? true
: ("female".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null);
user.BirthDate = memberModel.Birthday != null && memberModel.Birthday != DateTime.MinValue ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : (DateTime?)null;
user.BirthDate = memberModel.Birthday != null && memberModel.Birthday != DateTime.MinValue ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : null;
user.WorkFromDate = memberModel.Worksfrom != null && memberModel.Worksfrom != DateTime.MinValue ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Worksfrom)) : DateTime.UtcNow.Date;
UpdateContacts(memberModel.Contacts, user);
@ -520,7 +527,7 @@ namespace ASC.Employee.Core.Controllers
? true
: ("female".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null);
user.BirthDate = memberModel.Birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : (DateTime?)null;
user.BirthDate = memberModel.Birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : null;
user.WorkFromDate = memberModel.Worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Worksfrom)) : DateTime.UtcNow.Date;
UpdateContacts(memberModel.Contacts, user);
@ -665,7 +672,7 @@ namespace ASC.Employee.Core.Controllers
if (memberModel.Disable.HasValue)
{
user.Status = memberModel.Disable.Value ? EmployeeStatus.Terminated : EmployeeStatus.Active;
user.TerminatedDate = memberModel.Disable.Value ? DateTime.UtcNow : (DateTime?)null;
user.TerminatedDate = memberModel.Disable.Value ? DateTime.UtcNow : null;
}
if (self && !isAdmin)
@ -1515,6 +1522,147 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.UserUnlinkedSocialAccount, GetMeaningfulProviderName(provider));
}
[AllowAnonymous]
[Create("thirdparty/signup")]
public void SignupAccountFromBody([FromBody] LinkAccountModel model)
{
LinkAccount(model);
}
[AllowAnonymous]
[Update("thirdparty/linkaccount")]
[Consumes("application/x-www-form-urlencoded")]
public void SignupAccountFromForm([FromForm] LinkAccountModel model)
{
LinkAccount(model);
}
public void SignupAccount(SignupAccountModel model)
{
var employeeType = model.EmplType ?? EmployeeType.User;
var passwordHash = model.PasswordHash;
var mustChangePassword = false;
if (string.IsNullOrEmpty(passwordHash))
{
passwordHash = UserManagerWrapper.GeneratePassword();
mustChangePassword = true;
}
var thirdPartyProfile = new LoginProfile(Signature, InstanceCrypto, model.SerializedProfile);
var newUser = CreateNewUser(GetFirstName(model, thirdPartyProfile), GetLastName(model, thirdPartyProfile), GetEmailAddress(model, thirdPartyProfile), passwordHash, employeeType, false);
var messageAction = employeeType == EmployeeType.User ? MessageAction.UserCreatedViaInvite : MessageAction.GuestCreatedViaInvite;
MessageService.Send(MessageInitiator.System, messageAction, MessageTarget.Create(newUser.ID), newUser.DisplayUserName(false, DisplayUserSettingsHelper));
var userID = newUser.ID;
if (!string.IsNullOrEmpty(thirdPartyProfile.Avatar))
{
SaveContactImage(userID, thirdPartyProfile.Avatar);
}
GetLinker().AddLink(userID.ToString(), thirdPartyProfile);
var user = UserManager.GetUsers(userID);
var cookiesKey = SecurityContext.AuthenticateMe(user.Email, passwordHash);
CookiesManager.SetCookies(CookiesType.AuthKey, cookiesKey);
MessageService.Send(MessageAction.LoginSuccess);
StudioNotifyService.UserHasJoin();
if (mustChangePassword)
{
StudioNotifyService.UserPasswordChange(user);
}
UserHelpTourHelper.IsNewUser = true;
if (CoreBaseSettings.Personal)
PersonalSettingsHelper.IsNewUser = true;
}
protected string GetEmailAddress(SignupAccountModel model)
{
if (!string.IsNullOrEmpty(model.Email))
return model.Email.Trim();
return string.Empty;
}
private string GetEmailAddress(SignupAccountModel model, LoginProfile account)
{
var value = GetEmailAddress(model);
return string.IsNullOrEmpty(value) ? account.EMail : value;
}
protected string GetFirstName(SignupAccountModel model)
{
var value = string.Empty;
if (!string.IsNullOrEmpty(model.FirstName)) value = model.FirstName.Trim();
return HtmlUtil.GetText(value);
}
private string GetFirstName(SignupAccountModel model, LoginProfile account)
{
var value = GetFirstName(model);
return string.IsNullOrEmpty(value) ? account.FirstName : value;
}
protected string GetLastName(SignupAccountModel model)
{
var value = string.Empty;
if (!string.IsNullOrEmpty(model.LastName)) value = model.LastName.Trim();
return HtmlUtil.GetText(value);
}
private string GetLastName(SignupAccountModel model, LoginProfile account)
{
var value = GetLastName(model);
return string.IsNullOrEmpty(value) ? account.LastName : value;
}
private UserInfo CreateNewUser(string firstName, string lastName, string email, string passwordHash, EmployeeType employeeType, bool fromInviteLink)
{
var isVisitor = employeeType == EmployeeType.Visitor;
if (SetupInfo.IsSecretEmail(email))
{
fromInviteLink = false;
}
var userInfo = new UserInfo
{
FirstName = string.IsNullOrEmpty(firstName) ? UserControlsCommonResource.UnknownFirstName : firstName,
LastName = string.IsNullOrEmpty(lastName) ? UserControlsCommonResource.UnknownLastName : lastName,
Email = email,
};
if (CoreBaseSettings.Personal)
{
userInfo.ActivationStatus = EmployeeActivationStatus.Activated;
userInfo.CultureName = CoreBaseSettings.CustomMode ? "ru-RU" : Thread.CurrentThread.CurrentUICulture.Name;
}
return UserManagerWrapper.AddUser(userInfo, passwordHash, true, true, isVisitor, fromInviteLink);
}
private void SaveContactImage(Guid userID, string url)
{
using (var memstream = new MemoryStream())
{
var req = WebRequest.Create(url);
using (var response = req.GetResponse())
using (var stream = response.GetResponseStream())
{
var buffer = new byte[512];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
memstream.Write(buffer, 0, bytesRead);
var bytes = memstream.ToArray();
UserPhotoManager.SaveOrUpdatePhoto(userID, bytes);
}
}
}
private AccountLinker GetLinker()
{
return AccountLinker.Get("webstudio");

View File

@ -1,7 +1,18 @@
namespace ASC.People.Models
using ASC.Core.Users;
namespace ASC.People.Models
{
public class LinkAccountModel
{
public string SerializedProfile{get;set;}
public string SerializedProfile { get; set; }
}
public class SignupAccountModel: LinkAccountModel
{
public EmployeeType? EmplType { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string PasswordHash { get; set; }
}
}