DocSpace-buildtools/products/ASC.People/Controllers/PeopleController.cs

1126 lines
47 KiB
C#
Raw Normal View History

2019-05-27 09:46:04 +00:00
using System;
using System.Collections.Generic;
using System.IO;
2019-05-27 09:46:04 +00:00
using System.Linq;
using System.Net;
using System.Net.Mail;
2019-06-17 11:57:07 +00:00
using System.Security;
2019-06-14 08:15:28 +00:00
using ASC.Api.Core;
2019-06-13 15:01:29 +00:00
using ASC.Common.Web;
2019-05-27 09:46:04 +00:00
using ASC.Core;
using ASC.Core.Tenants;
2019-05-27 09:46:04 +00:00
using ASC.Core.Users;
2019-06-21 10:42:16 +00:00
using ASC.Data.Reassigns;
2019-06-17 11:57:07 +00:00
using ASC.FederatedLogin;
using ASC.FederatedLogin.Profile;
using ASC.MessagingSystem;
using ASC.People.Models;
using ASC.Web.Api.Models;
2019-05-27 12:49:48 +00:00
using ASC.Web.Api.Routing;
2019-06-14 08:15:28 +00:00
using ASC.Web.Core;
2019-06-17 11:57:07 +00:00
using ASC.Web.Core.PublicResources;
2019-06-14 08:15:28 +00:00
using ASC.Web.Core.Users;
2019-06-17 11:57:07 +00:00
using ASC.Web.Studio.Core.Notify;
using ASC.Web.Studio.UserControls.Statistics;
using ASC.Web.Studio.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
2019-06-17 11:57:07 +00:00
using SecurityContext = ASC.Core.SecurityContext;
namespace ASC.Employee.Core.Controllers
{
2019-05-27 12:49:48 +00:00
[DefaultRoute]
[ApiController]
public class PeopleController : ControllerBase
{
2019-06-13 15:01:29 +00:00
public Common.Logging.LogManager LogManager { get; }
2019-06-14 08:15:28 +00:00
public ApiContext ApiContext { get; }
2019-06-17 13:53:10 +00:00
public MessageService MessageService { get; }
2019-06-21 12:42:27 +00:00
public QueueWorkerReassign QueueWorkerReassign { get; }
public QueueWorkerRemove QueueWorkerRemove { get; }
2019-06-13 15:01:29 +00:00
2019-06-21 12:42:27 +00:00
public PeopleController(Common.Logging.LogManager logManager, MessageService messageService, QueueWorkerReassign queueWorkerReassign, QueueWorkerRemove queueWorkerRemove)
2019-06-13 15:01:29 +00:00
{
LogManager = logManager;
2019-06-14 08:15:28 +00:00
ApiContext = HttpContext;
2019-06-17 13:53:10 +00:00
MessageService = messageService;
2019-06-21 12:42:27 +00:00
QueueWorkerReassign = queueWorkerReassign;
QueueWorkerRemove = queueWorkerRemove;
2019-06-13 15:01:29 +00:00
}
2019-06-14 08:15:28 +00:00
[Read, Read(false)]
2019-05-27 09:46:04 +00:00
public IEnumerable<EmployeeWraper> GetAll()
{
return GetByStatus(EmployeeStatus.Active);
}
2019-06-14 08:15:28 +00:00
[Read("status/{status}")]
2019-05-27 09:46:04 +00:00
public IEnumerable<EmployeeWraper> GetByStatus(EmployeeStatus status)
{
if (CoreContext.Configuration.Personal) throw new Exception("Method not available");
var query = CoreContext.UserManager.GetUsers(status).AsEnumerable();
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
var groupId = new Guid(ApiContext.FilterValue);
//Filter by group
query = query.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
ApiContext.SetDataFiltered();
}
2019-06-14 08:15:28 +00:00
return query.Select(x => new EmployeeWraperFull(x, ApiContext));
2019-05-27 09:46:04 +00:00
}
2019-05-27 12:49:48 +00:00
2019-06-14 08:15:28 +00:00
[Read("@self"), Read("@self", false)]
2019-05-27 12:49:48 +00:00
public EmployeeWraper Self()
{
2019-06-14 08:15:28 +00:00
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID), ApiContext);
2019-05-27 12:49:48 +00:00
}
2019-06-13 15:01:29 +00:00
2019-06-14 08:15:28 +00:00
[Read("email"), Read("email", false)]
public EmployeeWraperFull GetByEmail([FromQuery]string email)
{
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner())
throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByEmail(email);
if (user.ID == Constants.LostUser.ID)
{
throw new ItemNotFoundException("User not found");
}
return new EmployeeWraperFull(user);
}
[Read("{username}", Order = int.MaxValue)]
2019-06-13 15:01:29 +00:00
public EmployeeWraperFull GetById(string username)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByUserName(username);
if (user.ID == Constants.LostUser.ID)
{
2019-06-14 08:15:28 +00:00
if (Guid.TryParse(username, out var userId))
2019-06-13 15:01:29 +00:00
{
user = CoreContext.UserManager.GetUsers(userId);
}
else
{
2019-06-14 08:15:28 +00:00
LogManager.Get("ASC.Api").Error(string.Format("Account {0} сould not get user by name {1}", SecurityContext.CurrentAccount.ID, username));
2019-06-13 15:01:29 +00:00
}
}
if (user.ID == Constants.LostUser.ID)
{
throw new ItemNotFoundException("User not found");
}
return new EmployeeWraperFull(user);
}
2019-06-14 08:15:28 +00:00
[Read("@search/{query}")]
public IEnumerable<EmployeeWraperFull> GetSearch(string query)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
try
{
var groupId = Guid.Empty;
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
groupId = new Guid(ApiContext.FilterValue);
}
return CoreContext.UserManager.Search(query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x));
}
catch (Exception error)
{
LogManager.Get("ASC.Api").Error(error);
}
return null;
}
[Read("search"), Read("search", false)]
public IEnumerable<EmployeeWraperFull> GetPeopleSearch([FromQuery]string query)
{
return GetSearch(query);
}
[Read("status/{status}/search"), Read("status/{status}/search", false)]
public IEnumerable<EmployeeWraperFull> GetAdvanced(EmployeeStatus status, [FromQuery]string query)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
try
{
var list = CoreContext.UserManager.GetUsers(status).AsEnumerable();
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
var groupId = new Guid(ApiContext.FilterValue);
//Filter by group
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
ApiContext.SetDataFiltered();
}
list = list.Where(x => x.FirstName != null && x.FirstName.IndexOf(query, StringComparison.OrdinalIgnoreCase) > -1 || (x.LastName != null && x.LastName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) ||
(x.UserName != null && x.UserName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Email != null && x.Email.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Contacts != null && x.Contacts.Any(y => y.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1)));
return list.Select(x => new EmployeeWraperFull(x));
}
catch (Exception error)
{
LogManager.Get("ASC.Api").Error(error);
}
return null;
}
///// <summary>
///// Adds a new portal user from import with the first and last name, email address
///// </summary>
///// <short>
///// Add new import user
///// </short>
///// <param name="userList">The list of users to add</param>
///// <param name="importUsersAsCollaborators" optional="true">Add users as guests (bool type: false|true)</param>
///// <returns>Newly created users</returns>
//[Create("import/save")]
//public void SaveUsers(string userList, bool importUsersAsCollaborators)
//{
// lock (progressQueue.SynchRoot)
// {
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
// if (task != null && task.IsCompleted)
// {
// progressQueue.Remove(task);
// task = null;
// }
// if (task == null)
// {
// progressQueue.Add(new ImportUsersTask(userList, importUsersAsCollaborators, GetHttpHeaders(HttpContext.Current.Request))
// {
// Id = TenantProvider.CurrentTenantID,
// UserId = SecurityContext.CurrentAccount.ID,
// Percentage = 0
// });
// }
// }
//}
//[Read("import/status")]
//public object GetStatus()
//{
// lock (progressQueue.SynchRoot)
// {
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
// if (task == null) return null;
// return new
// {
// Completed = task.IsCompleted,
// Percents = (int)task.Percentage,
// UserCounter = task.GetUserCounter,
// Status = (int)task.Status,
// Error = (string)task.Error,
// task.Data
// };
// }
//}
[Read("filter"), Read("filter", false)]
public IEnumerable<EmployeeWraperFull> GetFullByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
return users.Select(u => new EmployeeWraperFull(u, ApiContext));
}
[Read("simple/filter"), Read("simple/filter", false)]
public IEnumerable<EmployeeWraper> GetSimpleByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
return users.Select(u => new EmployeeWraper(u));
}
private IEnumerable<UserInfo> GetByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() ||
WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
var status = isAdmin ? EmployeeStatus.All : EmployeeStatus.Default;
if (employeeStatus != null)
{
switch (employeeStatus)
{
case EmployeeStatus.Terminated:
case EmployeeStatus.All:
status = isAdmin ? (EmployeeStatus)employeeStatus : EmployeeStatus.Default;
break;
default:
status = (EmployeeStatus)employeeStatus;
break;
}
}
var users = string.IsNullOrEmpty(ApiContext.FilterValue) ?
CoreContext.UserManager.GetUsers(status).AsEnumerable() :
CoreContext.UserManager.Search(ApiContext.FilterValue, status).AsEnumerable();
if (groupId != null && !groupId.Equals(Guid.Empty))
{
users = users.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, (Guid)groupId));
}
if (activationStatus != null)
{
users = activationStatus == EmployeeActivationStatus.Activated ?
users.Where(x => x.ActivationStatus.HasFlag(EmployeeActivationStatus.Activated)) :
users.Where(x => x.ActivationStatus == EmployeeActivationStatus.NotActivated ||
x.ActivationStatus == EmployeeActivationStatus.Pending ||
x.ActivationStatus == EmployeeActivationStatus.AutoGenerated);
}
if (employeeType != null)
{
switch (employeeType)
{
case EmployeeType.User:
users = users.Where(x => !x.IsVisitor());
break;
case EmployeeType.Visitor:
users = users.Where(x => x.IsVisitor());
break;
}
}
if (isAdministrator.HasValue && isAdministrator.Value)
{
users = users.Where(x => x.IsAdmin() || x.GetListAdminModules().Any());
}
ApiContext.TotalCount = users.Count();
switch (ApiContext.SortBy)
{
case "firstname":
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.FirstName) : users.OrderBy(r => r, UserInfoComparer.FirstName);
break;
case "lastname":
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.LastName) : users.OrderBy(r => r, UserInfoComparer.LastName);
break;
default:
users = ApiContext.SortDescending ? users.OrderByDescending(r => r, UserInfoComparer.Default) : users.OrderBy(r => r, UserInfoComparer.Default);
break;
}
users = users.Skip((int)ApiContext.StartIndex).Take((int)ApiContext.Count - 1);
ApiContext.SetDataSorted();
ApiContext.SetDataPaginated();
return users;
}
2019-06-17 11:57:07 +00:00
[Create, Create(false)]
public EmployeeWraperFull AddMember(MemberModel memberModel)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
if (string.IsNullOrEmpty(memberModel.Password))
memberModel.Password = UserManagerWrapper.GeneratePassword();
memberModel.Password = memberModel.Password.Trim();
var user = new UserInfo();
//Validate email
var address = new MailAddress(memberModel.Email);
user.Email = address.Address;
//Set common fields
user.FirstName = memberModel.Firstname;
user.LastName = memberModel.Lastname;
user.Title = memberModel.Title;
user.Location = memberModel.Location;
user.Notes = memberModel.Comment;
user.Sex = "male".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase)
? true
: ("female".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null);
user.BirthDate = memberModel.Birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : (DateTime?)null;
user.WorkFromDate = memberModel.Worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Worksfrom)) : DateTime.UtcNow.Date;
UpdateContacts(memberModel.Contacts, user);
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, true, memberModel.IsVisitor);
var messageAction = memberModel.IsVisitor ? MessageAction.GuestCreated : MessageAction.UserCreated;
2019-06-17 13:53:10 +00:00
MessageService.Send(messageAction, MessageTarget.Create(user.ID), user.DisplayUserName(false));
UpdateDepartments(memberModel.Department, user);
if (memberModel.Files != UserPhotoManager.GetDefaultPhotoAbsoluteWebPath())
{
UpdatePhotoUrl(memberModel.Files, user);
}
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Create("active"), Create("active", false)]
public EmployeeWraperFull AddMemberAsActivated(MemberModel memberModel)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
2019-06-17 11:57:07 +00:00
var user = new UserInfo();
2019-06-17 11:57:07 +00:00
if (string.IsNullOrEmpty(memberModel.Password))
memberModel.Password = UserManagerWrapper.GeneratePassword();
2019-06-17 11:57:07 +00:00
//Validate email
var address = new MailAddress(memberModel.Email);
user.Email = address.Address;
//Set common fields
user.FirstName = memberModel.Firstname;
user.LastName = memberModel.Lastname;
user.Title = memberModel.Title;
user.Location = memberModel.Location;
user.Notes = memberModel.Comment;
user.Sex = "male".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase)
? true
: ("female".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null);
2019-06-17 11:57:07 +00:00
user.BirthDate = memberModel.Birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : (DateTime?)null;
user.WorkFromDate = memberModel.Worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Worksfrom)) : DateTime.UtcNow.Date;
2019-06-17 11:57:07 +00:00
UpdateContacts(memberModel.Contacts, user);
2019-06-17 11:57:07 +00:00
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, false, memberModel.IsVisitor);
2019-06-17 11:57:07 +00:00
user.ActivationStatus = EmployeeActivationStatus.Activated;
2019-06-17 11:57:07 +00:00
UpdateDepartments(memberModel.Department, user);
2019-06-17 11:57:07 +00:00
if (memberModel.Files != UserPhotoManager.GetDefaultPhotoAbsoluteWebPath())
{
2019-06-17 11:57:07 +00:00
UpdatePhotoUrl(memberModel.Files, user);
}
2019-06-17 11:57:07 +00:00
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Update("{userid}")]
public EmployeeWraperFull UpdateMember(UpdateMemberModel memberModel)
{
2019-06-17 11:57:07 +00:00
SecurityContext.DemandPermissions(new UserSecurityProvider(new Guid(memberModel.UserId)), Constants.Action_EditUser);
2019-06-17 11:57:07 +00:00
var user = GetUserInfo(memberModel.UserId);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
var self = SecurityContext.CurrentAccount.ID.Equals(user.ID);
var resetDate = new DateTime(1900, 01, 01);
2019-06-17 11:57:07 +00:00
//Update it
2019-06-17 11:57:07 +00:00
var isLdap = user.IsLDAP();
var isSso = user.IsSSO();
var isAdmin = WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
2019-06-17 11:57:07 +00:00
if (!isLdap && !isSso)
{
//Set common fields
2019-06-17 11:57:07 +00:00
user.FirstName = memberModel.Firstname ?? user.FirstName;
user.LastName = memberModel.Lastname ?? user.LastName;
user.Location = memberModel.Location ?? user.Location;
2019-06-17 11:57:07 +00:00
if (isAdmin)
{
user.Title = memberModel.Title ?? user.Title;
}
}
2019-06-17 11:57:07 +00:00
if (!UserFormatter.IsValidUserName(user.FirstName, user.LastName))
throw new Exception(Resource.ErrorIncorrectUserName);
2019-06-17 11:57:07 +00:00
user.Notes = memberModel.Comment ?? user.Notes;
user.Sex = ("male".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase)
? true
: ("female".Equals(memberModel.Sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null)) ?? user.Sex;
2019-06-17 11:57:07 +00:00
user.BirthDate = memberModel.Birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Birthday)) : user.BirthDate;
2019-06-17 11:57:07 +00:00
if (user.BirthDate == resetDate)
{
user.BirthDate = null;
}
2019-06-17 11:57:07 +00:00
user.WorkFromDate = memberModel.Worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(memberModel.Worksfrom)) : user.WorkFromDate;
2019-06-17 11:57:07 +00:00
if (user.WorkFromDate == resetDate)
{
user.WorkFromDate = null;
}
2019-06-17 11:57:07 +00:00
//Update contacts
UpdateContacts(memberModel.Contacts, user);
UpdateDepartments(memberModel.Department, user);
2019-06-17 11:57:07 +00:00
if (memberModel.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
{
UpdatePhotoUrl(memberModel.Files, user);
}
if (memberModel.Disable.HasValue)
{
user.Status = memberModel.Disable.Value ? EmployeeStatus.Terminated : EmployeeStatus.Active;
user.TerminatedDate = memberModel.Disable.Value ? DateTime.UtcNow : (DateTime?)null;
}
2019-06-17 11:57:07 +00:00
if (self && !isAdmin)
{
StudioNotifyService.Instance.SendMsgToAdminAboutProfileUpdated();
}
2019-06-17 11:57:07 +00:00
// change user type
var canBeGuestFlag = !user.IsOwner() && !user.IsAdmin() && !user.GetListAdminModules().Any() && !user.IsMe();
2019-06-17 11:57:07 +00:00
if (memberModel.IsVisitor && !user.IsVisitor() && canBeGuestFlag)
{
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
2019-06-17 11:57:07 +00:00
if (!self && !memberModel.IsVisitor && user.IsVisitor())
{
var usersQuota = TenantExtra.GetTenantQuota().ActiveUsers;
if (TenantStatisticsProvider.GetUsersCount() < usersQuota)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
else
{
throw new TenantQuotaException(string.Format("Exceeds the maximum active users ({0})", usersQuota));
}
}
2019-06-17 11:57:07 +00:00
CoreContext.UserManager.SaveUserInfo(user, memberModel.IsVisitor);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserUpdated, MessageTarget.Create(user.ID), user.DisplayUserName(false));
2019-06-17 11:57:07 +00:00
if (memberModel.Disable.HasValue && memberModel.Disable.Value)
{
CookiesManager.ResetUserCookie(user.ID);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.CookieSettingsUpdated);
2019-06-17 11:57:07 +00:00
}
2019-06-17 11:57:07 +00:00
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Delete("{userid}")]
public EmployeeWraperFull DeleteMember(string userid)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
2019-06-17 11:57:07 +00:00
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID) || user.IsLDAP())
throw new SecurityException();
2019-06-17 11:57:07 +00:00
if (user.Status != EmployeeStatus.Terminated)
throw new Exception("The user is not suspended");
2019-06-21 10:42:16 +00:00
CheckReassignProccess(new[] { user.ID });
2019-06-17 11:57:07 +00:00
var userName = user.DisplayUserName(false);
2019-06-17 11:57:07 +00:00
UserPhotoManager.RemovePhoto(user.ID);
CoreContext.UserManager.DeleteUser(user.ID);
2019-06-21 12:42:27 +00:00
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserDeleted, MessageTarget.Create(user.ID), userName);
2019-06-17 11:57:07 +00:00
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Update("{userid}/contacts"), Update("{userid}/contacts", false)]
public EmployeeWraperFull UpdateMemberContacts(string userid, UpdateMemberModel memberModel)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
UpdateContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Create("{userid}/contacts"), Create("{userid}/contacts", false)]
public EmployeeWraperFull SetMemberContacts(string userid, UpdateMemberModel memberModel)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
user.Contacts.Clear();
UpdateContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Delete("{userid}/contacts"), Delete("{userid}/contacts", false)]
public EmployeeWraperFull DeleteMemberContacts(string userid, UpdateMemberModel memberModel)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
DeleteContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
}
2019-06-17 11:57:07 +00:00
[Read("{userid}/photo"), Read("{userid}/photo", false)]
public ThumbnailsDataWrapper GetMemberPhoto(string userid)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
return new ThumbnailsDataWrapper(user.ID);
}
2019-06-17 11:57:07 +00:00
[Update("{userid}/photo"), Update("{userid}/photo", false)]
public ThumbnailsDataWrapper UpdateMemberPhoto(string userid, UpdateMemberModel model)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
if (model.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
{
UpdatePhotoUrl(model.Files, user);
}
2019-06-17 11:57:07 +00:00
CoreContext.UserManager.SaveUserInfo(user);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserAddedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
2019-06-17 11:57:07 +00:00
return new ThumbnailsDataWrapper(user.ID);
}
2019-06-17 11:57:07 +00:00
[Delete("{userid}/photo"), Delete("{userid}/photo", false)]
public ThumbnailsDataWrapper DeleteMemberPhoto(string userid)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
2019-06-17 11:57:07 +00:00
UserPhotoManager.RemovePhoto(user.ID);
2019-06-17 11:57:07 +00:00
CoreContext.UserManager.SaveUserInfo(user);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserDeletedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
2019-06-17 11:57:07 +00:00
return new ThumbnailsDataWrapper(user.ID);
}
2019-06-17 11:57:07 +00:00
[Create("{userid}/photo/thumbnails"), Create("{userid}/photo/thumbnails", false)]
public ThumbnailsDataWrapper CreateMemberPhotoThumbnails(string userid, ThumbnailsModel thumbnailsModel)
{
var user = GetUserInfo(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
2019-06-17 11:57:07 +00:00
if (!string.IsNullOrEmpty(thumbnailsModel.TmpFile))
{
var fileName = Path.GetFileName(thumbnailsModel.TmpFile);
var data = UserPhotoManager.GetTempPhotoData(fileName);
2019-06-17 11:57:07 +00:00
var settings = new UserPhotoThumbnailSettings(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height);
settings.SaveForUser(user.ID);
2019-06-17 11:57:07 +00:00
UserPhotoManager.SaveOrUpdatePhoto(user.ID, data);
UserPhotoManager.RemoveTempPhoto(fileName);
}
else
{
UserPhotoThumbnailManager.SaveThumbnails(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height, user.ID);
}
2019-06-17 11:57:07 +00:00
CoreContext.UserManager.SaveUserInfo(user);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserUpdatedAvatarThumbnails, MessageTarget.Create(user.ID), user.DisplayUserName(false));
2019-06-17 11:57:07 +00:00
return new ThumbnailsDataWrapper(user.ID);
}
2019-06-17 11:57:07 +00:00
[AllowAnonymous]
2019-06-25 07:34:27 +00:00
[Create("password", check: false), Create("password", false, check: false)]
2019-06-17 11:57:07 +00:00
public string SendUserPassword(string email)
{
2019-06-17 13:53:10 +00:00
var userInfo = UserManagerWrapper.SendUserPassword(email, MessageService);
2019-06-17 11:57:07 +00:00
return string.Format(Resource.MessageYourPasswordSuccessfullySendedToEmail, userInfo.Email);
}
2019-06-17 11:57:07 +00:00
[Update("{userid}/password"), Update("{userid}/password", false)]
public EmployeeWraperFull ChangeUserPassword(Guid userid, MemberModel memberModel)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(userid), Constants.Action_EditUser);
2019-06-17 11:57:07 +00:00
if (!CoreContext.UserManager.UserExists(userid)) return null;
2019-06-17 11:57:07 +00:00
var user = CoreContext.UserManager.GetUsers(userid);
2019-06-17 11:57:07 +00:00
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
2019-06-17 11:57:07 +00:00
if (!string.IsNullOrEmpty(memberModel.Email))
{
var address = new MailAddress(memberModel.Email);
if (!string.Equals(address.Address, user.Email, StringComparison.OrdinalIgnoreCase))
{
user.Email = address.Address.ToLowerInvariant();
user.ActivationStatus = EmployeeActivationStatus.Activated;
CoreContext.UserManager.SaveUserInfo(user);
}
}
2019-06-17 11:57:07 +00:00
if (!string.IsNullOrEmpty(memberModel.Password))
{
SecurityContext.SetUserPassword(userid, memberModel.Password);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserUpdatedPassword);
2019-06-17 11:57:07 +00:00
CookiesManager.ResetUserCookie(userid);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.CookieSettingsUpdated);
2019-06-17 11:57:07 +00:00
}
2019-06-17 11:57:07 +00:00
return new EmployeeWraperFull(GetUserInfo(userid.ToString()));
}
2019-06-17 11:57:07 +00:00
private static UserInfo GetUserInfo(string userNameOrId)
{
UserInfo user;
try
{
var userId = new Guid(userNameOrId);
user = CoreContext.UserManager.GetUsers(userId);
}
catch (FormatException)
{
user = CoreContext.UserManager.GetUserByUserName(userNameOrId);
}
if (user == null || user.ID == Constants.LostUser.ID)
throw new ItemNotFoundException("user not found");
return user;
}
2019-06-17 11:57:07 +00:00
[Update("activationstatus/{activationstatus}")]
public IEnumerable<EmployeeWraperFull> UpdateEmployeeActivationStatus(EmployeeActivationStatus activationstatus, UpdateMembersModel model)
{
var retuls = new List<EmployeeWraperFull>();
foreach (var id in model.UserIds.Where(userId => !CoreContext.UserManager.IsSystemUser(userId)))
{
SecurityContext.DemandPermissions(new UserSecurityProvider(id), Constants.Action_EditUser);
var u = CoreContext.UserManager.GetUsers(id);
if (u.ID == Constants.LostUser.ID || u.IsLDAP()) continue;
2019-06-17 11:57:07 +00:00
u.ActivationStatus = activationstatus;
CoreContext.UserManager.SaveUserInfo(u);
retuls.Add(new EmployeeWraperFull(u));
}
2019-06-17 11:57:07 +00:00
return retuls;
}
2019-06-17 11:57:07 +00:00
[Update("type/{type}")]
public IEnumerable<EmployeeWraperFull> UpdateUserType(EmployeeType type, UpdateMembersModel model)
{
var users = model.UserIds
.Where(userId => !CoreContext.UserManager.IsSystemUser(userId))
.Select(userId => CoreContext.UserManager.GetUsers(userId))
.ToList();
2019-06-17 11:57:07 +00:00
foreach (var user in users)
{
if (user.IsOwner() || user.IsAdmin() || user.IsMe() || user.GetListAdminModules().Any())
continue;
2019-06-17 11:57:07 +00:00
switch (type)
{
case EmployeeType.User:
if (user.IsVisitor())
{
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
}
break;
case EmployeeType.Visitor:
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
break;
}
}
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UsersUpdatedType, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
2019-06-17 11:57:07 +00:00
return users.Select(user => new EmployeeWraperFull(user));
}
2019-06-17 11:57:07 +00:00
[Update("status/{status}")]
public IEnumerable<EmployeeWraperFull> UpdateUserStatus(EmployeeStatus status, UpdateMembersModel model)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-17 11:57:07 +00:00
var users = model.UserIds.Select(userId => CoreContext.UserManager.GetUsers(userId))
.Where(u => !CoreContext.UserManager.IsSystemUser(u.ID) && !u.IsLDAP())
.ToList();
2019-06-17 11:57:07 +00:00
foreach (var user in users)
{
if (user.IsOwner() || user.IsMe())
continue;
2019-06-17 11:57:07 +00:00
switch (status)
{
case EmployeeStatus.Active:
if (user.Status == EmployeeStatus.Terminated)
{
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers || user.IsVisitor())
{
user.Status = EmployeeStatus.Active;
CoreContext.UserManager.SaveUserInfo(user);
}
}
break;
case EmployeeStatus.Terminated:
user.Status = EmployeeStatus.Terminated;
CoreContext.UserManager.SaveUserInfo(user);
2019-06-17 11:57:07 +00:00
CookiesManager.ResetUserCookie(user.ID);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.CookieSettingsUpdated);
2019-06-17 11:57:07 +00:00
break;
}
}
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UsersUpdatedStatus, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
2019-06-17 11:57:07 +00:00
return users.Select(user => new EmployeeWraperFull(user));
}
2019-06-17 11:57:07 +00:00
[Update("invite"), Update("invite", false)]
public IEnumerable<EmployeeWraperFull> ResendUserInvites(UpdateMembersModel model)
{
var users = model.UserIds
.Where(userId => !CoreContext.UserManager.IsSystemUser(userId))
.Select(userId => CoreContext.UserManager.GetUsers(userId))
.ToList();
2019-06-17 11:57:07 +00:00
foreach (var user in users)
{
if (user.IsActive) continue;
2019-06-17 11:57:07 +00:00
if (user.ActivationStatus == EmployeeActivationStatus.Pending)
{
if (user.IsVisitor())
{
StudioNotifyService.Instance.GuestInfoActivation(user);
}
else
{
StudioNotifyService.Instance.UserInfoActivation(user);
}
}
else
{
StudioNotifyService.Instance.SendEmailActivationInstructions(user, user.Email);
}
}
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UsersSentActivationInstructions, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
2019-06-17 11:57:07 +00:00
return users.Select(user => new EmployeeWraperFull(user));
}
2019-06-17 11:57:07 +00:00
[Update("delete"), Update("delete", false)]
public IEnumerable<EmployeeWraperFull> RemoveUsers(UpdateMembersModel model)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
2019-06-21 10:42:16 +00:00
CheckReassignProccess(model.UserIds);
2019-06-17 11:57:07 +00:00
var users = model.UserIds.Select(userId => CoreContext.UserManager.GetUsers(userId))
.Where(u => !CoreContext.UserManager.IsSystemUser(u.ID) && !u.IsLDAP())
.ToList();
2019-06-17 11:57:07 +00:00
var userNames = users.Select(x => x.DisplayUserName(false)).ToList();
2019-06-17 11:57:07 +00:00
foreach (var user in users)
{
if (user.Status != EmployeeStatus.Terminated) continue;
2019-06-17 11:57:07 +00:00
UserPhotoManager.RemovePhoto(user.ID);
CoreContext.UserManager.DeleteUser(user.ID);
2019-06-21 12:42:27 +00:00
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
2019-06-17 11:57:07 +00:00
}
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UsersDeleted, MessageTarget.Create(users.Select(x => x.ID)), userNames);
2019-06-17 11:57:07 +00:00
return users.Select(user => new EmployeeWraperFull(user));
}
2019-06-17 11:57:07 +00:00
[Update("self/delete"), Update("self/delete", false)]
public string SendInstructionsToDelete()
{
var user = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID);
2019-06-17 11:57:07 +00:00
if (user.IsLDAP())
throw new SecurityException();
2019-06-17 11:57:07 +00:00
StudioNotifyService.Instance.SendMsgProfileDeletion(user);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserSentDeleteInstructions);
2019-06-17 11:57:07 +00:00
return string.Format(Resource.SuccessfullySentNotificationDeleteUserInfoMessage, "<b>" + user.Email + "</b>");
}
2019-06-17 11:57:07 +00:00
[Update("thirdparty/linkaccount"), Update("thirdparty/linkaccount", false)]
public void LinkAccount(string serializedProfile)
{
var profile = new LoginProfile(serializedProfile);
2019-06-17 11:57:07 +00:00
if (string.IsNullOrEmpty(profile.AuthorizationError))
{
GetLinker().AddLink(SecurityContext.CurrentAccount.ID.ToString(), profile);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserLinkedSocialAccount, GetMeaningfulProviderName(profile.Provider));
2019-06-17 11:57:07 +00:00
}
else
{
// ignore cancellation
if (profile.AuthorizationError != "Canceled at provider")
{
throw new Exception(profile.AuthorizationError);
}
}
}
2019-06-17 11:57:07 +00:00
[Delete("thirdparty/unlinkaccount"), Delete("thirdparty/unlinkaccount", false)]
public void UnlinkAccount(string provider)
{
GetLinker().RemoveProvider(SecurityContext.CurrentAccount.ID.ToString(), provider);
2019-06-17 13:53:10 +00:00
MessageService.Send(MessageAction.UserUnlinkedSocialAccount, GetMeaningfulProviderName(provider));
2019-06-17 11:57:07 +00:00
}
2019-06-17 11:57:07 +00:00
private static AccountLinker GetLinker()
{
return new AccountLinker("webstudio");
}
2019-06-17 11:57:07 +00:00
private static string GetMeaningfulProviderName(string providerName)
{
switch (providerName)
{
case "google":
case "openid":
return "Google";
case "facebook":
return "Facebook";
case "twitter":
return "Twitter";
case "linkedin":
return "LinkedIn";
default:
return "Unknown Provider";
}
}
2019-06-21 10:42:16 +00:00
[Read(@"reassign/progress"), Read(@"reassign/progress", false)]
public ReassignProgressItem GetReassignProgress(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 12:42:27 +00:00
return QueueWorkerReassign.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
2019-06-21 10:42:16 +00:00
}
2019-06-21 10:42:16 +00:00
[Update(@"reassign/terminate"), Update(@"reassign/terminate", false)]
public void TerminateReassign(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 12:42:27 +00:00
QueueWorkerReassign.Terminate(TenantProvider.CurrentTenantID, userId);
2019-06-21 10:42:16 +00:00
}
2019-06-21 10:42:16 +00:00
[Create(@"reassign/start"), Create(@"reassign/start", false)]
public ReassignProgressItem StartReassign(Guid fromUserId, Guid toUserId, bool deleteProfile)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 10:42:16 +00:00
var fromUser = CoreContext.UserManager.GetUsers(fromUserId);
2019-06-21 10:42:16 +00:00
if (fromUser == null || fromUser.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + fromUserId + " not found");
2019-06-21 10:42:16 +00:00
if (fromUser.IsOwner() || fromUser.IsMe() || fromUser.Status != EmployeeStatus.Terminated)
throw new ArgumentException("Can not delete user with id = " + fromUserId);
2019-06-21 10:42:16 +00:00
var toUser = CoreContext.UserManager.GetUsers(toUserId);
2019-06-21 10:42:16 +00:00
if (toUser == null || toUser.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + toUserId + " not found");
2019-06-21 10:42:16 +00:00
if (toUser.IsVisitor() || toUser.Status == EmployeeStatus.Terminated)
throw new ArgumentException("Can not reassign data to user with id = " + toUserId);
2019-06-21 12:42:27 +00:00
return QueueWorkerReassign.Start(TenantProvider.CurrentTenantID, fromUserId, toUserId, SecurityContext.CurrentAccount.ID, deleteProfile);
2019-06-21 10:42:16 +00:00
}
2019-06-21 10:42:16 +00:00
private void CheckReassignProccess(IEnumerable<Guid> userIds)
{
foreach (var userId in userIds)
{
2019-06-21 12:42:27 +00:00
var reassignStatus = QueueWorkerReassign.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
2019-06-21 10:42:16 +00:00
if (reassignStatus == null || reassignStatus.IsCompleted)
continue;
2019-06-21 10:42:16 +00:00
var userName = CoreContext.UserManager.GetUsers(userId).DisplayUserName();
throw new Exception(string.Format(Resource.ReassignDataRemoveUserError, userName));
}
}
//#endregion
2019-06-21 10:42:16 +00:00
#region Remove user data
2019-06-21 10:42:16 +00:00
[Read(@"remove/progress"), Read(@"remove/progress", false)]
public RemoveProgressItem GetRemoveProgress(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 12:42:27 +00:00
return QueueWorkerRemove.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
2019-06-21 10:42:16 +00:00
}
2019-06-21 10:42:16 +00:00
[Update(@"remove/terminate"), Update(@"remove/terminate", false)]
public void TerminateRemove(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 12:42:27 +00:00
QueueWorkerRemove.Terminate(TenantProvider.CurrentTenantID, userId);
2019-06-21 10:42:16 +00:00
}
2019-06-21 10:42:16 +00:00
[Create(@"remove/start"), Create(@"remove/start", false)]
public RemoveProgressItem StartRemove(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
2019-06-21 10:42:16 +00:00
var user = CoreContext.UserManager.GetUsers(userId);
2019-06-21 10:42:16 +00:00
if (user == null || user.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + userId + " not found");
2019-06-21 10:42:16 +00:00
if (user.IsOwner() || user.IsMe() || user.Status != EmployeeStatus.Terminated)
throw new ArgumentException("Can not delete user with id = " + userId);
2019-06-21 12:42:27 +00:00
return QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, true);
2019-06-21 10:42:16 +00:00
}
#endregion
2019-06-17 11:57:07 +00:00
private static void UpdateDepartments(IEnumerable<Guid> department, UserInfo user)
{
if (!SecurityContext.CheckPermissions(Constants.Action_EditGroups)) return;
if (department == null) return;
var groups = CoreContext.UserManager.GetUserGroups(user.ID);
var managerGroups = new List<Guid>();
foreach (var groupInfo in groups)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, groupInfo.ID);
var managerId = CoreContext.UserManager.GetDepartmentManager(groupInfo.ID);
if (managerId == user.ID)
{
managerGroups.Add(groupInfo.ID);
CoreContext.UserManager.SetDepartmentManager(groupInfo.ID, Guid.Empty);
}
}
foreach (var guid in department)
{
var userDepartment = CoreContext.UserManager.GetGroupInfo(guid);
if (userDepartment != Constants.LostGroupInfo)
{
CoreContext.UserManager.AddUserIntoGroup(user.ID, guid);
if (managerGroups.Contains(guid))
{
CoreContext.UserManager.SetDepartmentManager(guid, user.ID);
}
}
}
}
private static void UpdateContacts(IEnumerable<Contact> contacts, UserInfo user)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
user.Contacts.Clear();
if (contacts == null) return;
foreach (var contact in contacts)
{
user.Contacts.Add(contact.Type);
user.Contacts.Add(contact.Value);
}
}
private static void DeleteContacts(IEnumerable<Contact> contacts, UserInfo user)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
if (contacts == null) return;
foreach (var contact in contacts)
{
var index = user.Contacts.IndexOf(contact.Type);
if (index != -1)
{
//Remove existing
user.Contacts.RemoveRange(index, 2);
}
}
}
private void UpdatePhotoUrl(string files, UserInfo user)
{
if (string.IsNullOrEmpty(files))
{
return;
}
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
if (!files.StartsWith("http://") && !files.StartsWith("https://"))
{
files = new Uri(ApiContext.HttpContext.Request.GetDisplayUrl()).GetLeftPart(UriPartial.Scheme | UriPartial.Authority) + "/" + files.TrimStart('/');
}
var request = WebRequest.Create(files);
using var response = (HttpWebResponse)request.GetResponse();
using var inputStream = response.GetResponseStream();
using var br = new BinaryReader(inputStream);
var imageByteArray = br.ReadBytes((int)response.ContentLength);
UserPhotoManager.SaveOrUpdatePhoto(user.ID, imageByteArray);
}
}
}