2022-03-05 12:57:46 +00:00
|
|
|
|
using SecurityContext = ASC.Core.SecurityContext;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
|
2022-03-05 12:57:46 +00:00
|
|
|
|
namespace ASC.People.Api;
|
|
|
|
|
|
|
|
|
|
public class PhotoController : PeopleControllerBase
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 12:57:46 +00:00
|
|
|
|
private readonly MessageService _messageService;
|
|
|
|
|
private readonly MessageTarget _messageTarget;
|
|
|
|
|
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
|
|
|
|
|
private readonly SecurityContext _securityContext;
|
|
|
|
|
private readonly SettingsManager _settingsManager;
|
|
|
|
|
private readonly FileSizeComment _fileSizeComment;
|
|
|
|
|
private readonly SetupInfo _setupInfo;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
|
2022-03-05 12:57:46 +00:00
|
|
|
|
public PhotoController(
|
|
|
|
|
UserManager userManager,
|
|
|
|
|
PermissionContext permissionContext,
|
|
|
|
|
ApiContext apiContext,
|
|
|
|
|
UserPhotoManager userPhotoManager,
|
|
|
|
|
MessageService messageService,
|
|
|
|
|
MessageTarget messageTarget,
|
|
|
|
|
DisplayUserSettingsHelper displayUserSettingsHelper,
|
|
|
|
|
SecurityContext securityContext,
|
|
|
|
|
SettingsManager settingsManager,
|
|
|
|
|
FileSizeComment fileSizeComment,
|
|
|
|
|
SetupInfo setupInfo,
|
|
|
|
|
IHttpClientFactory httpClientFactory)
|
|
|
|
|
: base(userManager, permissionContext, apiContext, userPhotoManager, httpClientFactory)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 12:57:46 +00:00
|
|
|
|
_messageService = messageService;
|
|
|
|
|
_messageTarget = messageTarget;
|
|
|
|
|
_displayUserSettingsHelper = displayUserSettingsHelper;
|
|
|
|
|
_securityContext = securityContext;
|
|
|
|
|
_settingsManager = settingsManager;
|
|
|
|
|
_fileSizeComment = fileSizeComment;
|
|
|
|
|
_setupInfo = setupInfo;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("{userid}/photo/thumbnails")]
|
2022-03-05 13:20:51 +00:00
|
|
|
|
public ThumbnailsDataDto CreateMemberPhotoThumbnailsFromBody(string userid, [FromBody] ThumbnailsRequestDto inDto)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
return CreateMemberPhotoThumbnails(userid, inDto);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("{userid}/photo/thumbnails")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-05 13:20:51 +00:00
|
|
|
|
public ThumbnailsDataDto CreateMemberPhotoThumbnailsFromForm(string userid, [FromForm] ThumbnailsRequestDto inDto)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
return CreateMemberPhotoThumbnails(userid, inDto);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Delete("{userid}/photo")]
|
|
|
|
|
public ThumbnailsDataDto DeleteMemberPhoto(string userid)
|
|
|
|
|
{
|
2022-03-05 12:57:46 +00:00
|
|
|
|
var user = GetUserInfo(userid);
|
|
|
|
|
|
|
|
|
|
if (_userManager.IsSystemUser(user.Id))
|
|
|
|
|
{
|
|
|
|
|
throw new SecurityException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_permissionContext.DemandPermissions(new UserSecurityProvider(user.Id), Constants.Action_EditUser);
|
|
|
|
|
|
|
|
|
|
_userPhotoManager.RemovePhoto(user.Id);
|
|
|
|
|
_userManager.SaveUserInfo(user);
|
|
|
|
|
_messageService.Send(MessageAction.UserDeletedAvatar, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
|
|
|
|
|
|
|
|
|
|
return new ThumbnailsDataDto(user.Id, _userPhotoManager);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("{userid}/photo")]
|
|
|
|
|
public ThumbnailsDataDto GetMemberPhoto(string userid)
|
|
|
|
|
{
|
2022-03-05 12:57:46 +00:00
|
|
|
|
var user = GetUserInfo(userid);
|
|
|
|
|
|
|
|
|
|
if (_userManager.IsSystemUser(user.Id))
|
|
|
|
|
{
|
|
|
|
|
throw new SecurityException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new ThumbnailsDataDto(user.Id, _userPhotoManager);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/photo")]
|
2022-03-05 13:20:51 +00:00
|
|
|
|
public ThumbnailsDataDto UpdateMemberPhotoFromBody(string userid, [FromBody] UpdateMemberRequestDto inDto)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
return UpdateMemberPhoto(userid, inDto);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/photo")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-05 13:20:51 +00:00
|
|
|
|
public ThumbnailsDataDto UpdateMemberPhotoFromForm(string userid, [FromForm] UpdateMemberRequestDto inDto)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
return UpdateMemberPhoto(userid, inDto);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("{userid}/photo")]
|
2022-03-05 13:20:51 +00:00
|
|
|
|
public FileUploadResultDto UploadMemberPhoto(string userid, IFormCollection formCollection)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-05 12:57:46 +00:00
|
|
|
|
var result = new FileUploadResultDto();
|
2022-03-05 13:20:51 +00:00
|
|
|
|
var autosave = bool.Parse(formCollection["Autosave"]);
|
2022-03-05 12:57:46 +00:00
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
if (formCollection.Files.Count != 0)
|
2022-03-05 12:57:46 +00:00
|
|
|
|
{
|
|
|
|
|
Guid userId;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
userId = new Guid(userid);
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
userId = _securityContext.CurrentAccount.ID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_permissionContext.DemandPermissions(new UserSecurityProvider(userId), Constants.Action_EditUser);
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
var userPhoto = formCollection.Files[0];
|
2022-03-05 12:57:46 +00:00
|
|
|
|
|
|
|
|
|
if (userPhoto.Length > _setupInfo.MaxImageUploadSize)
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = _fileSizeComment.FileImageSizeExceptionString;
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var data = new byte[userPhoto.Length];
|
|
|
|
|
using var inputStream = userPhoto.OpenReadStream();
|
|
|
|
|
|
|
|
|
|
var br = new BinaryReader(inputStream);
|
|
|
|
|
br.Read(data, 0, (int)userPhoto.Length);
|
|
|
|
|
br.Close();
|
|
|
|
|
|
|
|
|
|
CheckImgFormat(data);
|
|
|
|
|
|
|
|
|
|
if (autosave)
|
|
|
|
|
{
|
|
|
|
|
if (data.Length > _setupInfo.MaxImageUploadSize)
|
|
|
|
|
{
|
|
|
|
|
throw new ImageSizeLimitException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var mainPhoto = _userPhotoManager.SaveOrUpdatePhoto(userId, data);
|
|
|
|
|
|
|
|
|
|
result.Data =
|
|
|
|
|
new
|
|
|
|
|
{
|
|
|
|
|
main = mainPhoto,
|
|
|
|
|
retina = _userPhotoManager.GetRetinaPhotoURL(userId),
|
|
|
|
|
max = _userPhotoManager.GetMaxPhotoURL(userId),
|
|
|
|
|
big = _userPhotoManager.GetBigPhotoURL(userId),
|
|
|
|
|
medium = _userPhotoManager.GetMediumPhotoURL(userId),
|
|
|
|
|
small = _userPhotoManager.GetSmallPhotoURL(userId),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result.Data = _userPhotoManager.SaveTempPhoto(data, _setupInfo.MaxImageUploadSize, UserPhotoManager.OriginalFotoSize.Width, UserPhotoManager.OriginalFotoSize.Height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result.Success = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = PeopleResource.ErrorEmptyUploadFileSelected;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Web.Core.Users.UnknownImageFormatException)
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = PeopleResource.ErrorUnknownFileImageType;
|
|
|
|
|
}
|
|
|
|
|
catch (ImageWeightLimitException)
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = PeopleResource.ErrorImageWeightLimit;
|
|
|
|
|
}
|
|
|
|
|
catch (ImageSizeLimitException)
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = PeopleResource.ErrorImageSizetLimit;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
result.Success = false;
|
|
|
|
|
result.Message = ex.Message.HtmlEncode();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
private ThumbnailsDataDto CreateMemberPhotoThumbnails(string userid, ThumbnailsRequestDto inDto)
|
2022-03-05 12:57:46 +00:00
|
|
|
|
{
|
|
|
|
|
var user = GetUserInfo(userid);
|
|
|
|
|
|
|
|
|
|
if (_userManager.IsSystemUser(user.Id))
|
|
|
|
|
{
|
|
|
|
|
throw new SecurityException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_permissionContext.DemandPermissions(new UserSecurityProvider(user.Id), Constants.Action_EditUser);
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
if (!string.IsNullOrEmpty(inDto.TmpFile))
|
2022-03-05 12:57:46 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
var fileName = Path.GetFileName(inDto.TmpFile);
|
2022-03-05 12:57:46 +00:00
|
|
|
|
var data = _userPhotoManager.GetTempPhotoData(fileName);
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
var settings = new UserPhotoThumbnailSettings(inDto.X, inDto.Y, inDto.Width, inDto.Height);
|
2022-03-05 12:57:46 +00:00
|
|
|
|
|
|
|
|
|
_settingsManager.SaveForUser(settings, user.Id);
|
|
|
|
|
_userPhotoManager.RemovePhoto(user.Id);
|
|
|
|
|
_userPhotoManager.SaveOrUpdatePhoto(user.Id, data);
|
|
|
|
|
_userPhotoManager.RemoveTempPhoto(fileName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
UserPhotoThumbnailManager.SaveThumbnails(_userPhotoManager, _settingsManager, inDto.X, inDto.Y, inDto.Width, inDto.Height, user.Id);
|
2022-03-05 12:57:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_userManager.SaveUserInfo(user);
|
|
|
|
|
_messageService.Send(MessageAction.UserUpdatedAvatarThumbnails, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
|
|
|
|
|
|
|
|
|
|
return new ThumbnailsDataDto(user.Id, _userPhotoManager);
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
private ThumbnailsDataDto UpdateMemberPhoto(string userid, UpdateMemberRequestDto inDto)
|
2022-03-05 12:57:46 +00:00
|
|
|
|
{
|
|
|
|
|
var user = GetUserInfo(userid);
|
|
|
|
|
|
|
|
|
|
if (_userManager.IsSystemUser(user.Id))
|
|
|
|
|
{
|
|
|
|
|
throw new SecurityException();
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-05 13:20:51 +00:00
|
|
|
|
if (inDto.Files != _userPhotoManager.GetPhotoAbsoluteWebPath(user.Id))
|
2022-03-05 12:57:46 +00:00
|
|
|
|
{
|
2022-03-05 13:20:51 +00:00
|
|
|
|
UpdatePhotoUrl(inDto.Files, user);
|
2022-03-05 12:57:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_userManager.SaveUserInfo(user);
|
|
|
|
|
_messageService.Send(MessageAction.UserAddedAvatar, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
|
|
|
|
|
|
|
|
|
|
return new ThumbnailsDataDto(user.Id, _userPhotoManager);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void CheckImgFormat(byte[] data)
|
|
|
|
|
{
|
|
|
|
|
IImageFormat imgFormat;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using var img = Image.Load(data, out var format);
|
|
|
|
|
imgFormat = format;
|
|
|
|
|
}
|
|
|
|
|
catch (OutOfMemoryException)
|
|
|
|
|
{
|
|
|
|
|
throw new ImageSizeLimitException();
|
|
|
|
|
}
|
|
|
|
|
catch (ArgumentException error)
|
|
|
|
|
{
|
|
|
|
|
throw new Web.Core.Users.UnknownImageFormatException(error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (imgFormat.Name != "PNG" && imgFormat.Name != "JPEG")
|
|
|
|
|
{
|
|
|
|
|
throw new Web.Core.Users.UnknownImageFormatException();
|
|
|
|
|
}
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
}
|