diff --git a/products/ASC.People/Server/Controllers/PeopleController.cs b/products/ASC.People/Server/Controllers/PeopleController.cs index e1d8adb774..74f2c977a9 100644 --- a/products/ASC.People/Server/Controllers/PeopleController.cs +++ b/products/ASC.People/Server/Controllers/PeopleController.cs @@ -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"); diff --git a/products/ASC.People/Server/Models/LinkAccountModel.cs b/products/ASC.People/Server/Models/LinkAccountModel.cs index c195401f81..e8257db106 100644 --- a/products/ASC.People/Server/Models/LinkAccountModel.cs +++ b/products/ASC.People/Server/Models/LinkAccountModel.cs @@ -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; } } }