diff --git a/common/ASC.Api.Core/Security/DocSpaceLinksHelper.cs b/common/ASC.Api.Core/Security/DocSpaceLinksHelper.cs index f74ae1d15c..abab5040b3 100644 --- a/common/ASC.Api.Core/Security/DocSpaceLinksHelper.cs +++ b/common/ASC.Api.Core/Security/DocSpaceLinksHelper.cs @@ -62,9 +62,9 @@ public class DocSpaceLinkHelper return _signature.Create(linkId); } - public string MakeKey(string email) + public string MakeKey(string email, EmployeeType employeeType) { - return email + ConfirmType.LinkInvite.ToStringFast() + EmployeeType.User.ToStringFast(); + return email + ConfirmType.LinkInvite.ToStringFast() + employeeType.ToStringFast(); } public Guid Parse(string key) @@ -72,14 +72,14 @@ public class DocSpaceLinkHelper return _signature.Read(key); } - public ValidationResult Validate(string key, string email) + public ValidationResult Validate(string key, string email, EmployeeType employeeType) { - return string.IsNullOrEmpty(email) ? ValidateExternalLink(key) : ValidateEmailLink(email, key); + return string.IsNullOrEmpty(email) ? ValidateRoomExternalLink(key) : ValidateEmailLink(email, key, employeeType); } - private ValidationResult ValidateEmailLink(string email, string key) + public ValidationResult ValidateEmailLink(string email, string key, EmployeeType employeeType) { - var result = _emailValidationKeyProvider.ValidateEmailKey(MakeKey(email), key, ExpirationInterval); + var result = _emailValidationKeyProvider.ValidateEmailKey(MakeKey(email, employeeType), key, ExpirationInterval); if (result == ValidationResult.Ok) { @@ -94,16 +94,16 @@ public class DocSpaceLinkHelper return result; } - private ValidationResult ValidateExternalLink(string key) + public ValidationResult ValidateRoomExternalLink(string key) { var payload = Parse(key); - if (payload == default) - { - return ValidationResult.Invalid; - } + return payload == default ? ValidationResult.Invalid : ValidationResult.Ok; + } - return ValidationResult.Ok; + public ValidationResult ValidateExtarnalLink(string key, EmployeeType employeeType) + { + return _emailValidationKeyProvider.ValidateEmailKey(ConfirmType.LinkInvite.ToStringFast() + (int)employeeType, key); } private bool CanUsed(string email, string key, TimeSpan interval) diff --git a/common/ASC.Api.Core/Security/EmailValidationKeyModelHelper.cs b/common/ASC.Api.Core/Security/EmailValidationKeyModelHelper.cs index 21f3231af7..a8c101a89f 100644 --- a/common/ASC.Api.Core/Security/EmailValidationKeyModelHelper.cs +++ b/common/ASC.Api.Core/Security/EmailValidationKeyModelHelper.cs @@ -110,11 +110,12 @@ public class EmailValidationKeyModelHelper break; case ConfirmType.LinkInvite: - checkKeyResult = _docSpaceLinkHelper.Validate(key, email); + checkKeyResult = string.IsNullOrEmpty(email) ? _docSpaceLinkHelper.ValidateRoomExternalLink(key) + : _docSpaceLinkHelper.ValidateEmailLink(email, key, emplType ?? default); if (checkKeyResult == ValidationResult.Invalid) { - checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)emplType, key, _provider.ValidEmailKeyInterval); + checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)(emplType ?? default), key, _provider.ValidEmailKeyInterval); } break; diff --git a/products/ASC.Files/Core/Core/FileStorageService.cs b/products/ASC.Files/Core/Core/FileStorageService.cs index 181de5dfb0..8eb5f7beb2 100644 --- a/products/ASC.Files/Core/Core/FileStorageService.cs +++ b/products/ASC.Files/Core/Core/FileStorageService.cs @@ -3139,7 +3139,7 @@ public class FileStorageService //: IFileStorageService continue; } - var link = _roomLinkService.GetInvitationLink(user.Email, _authContext.CurrentAccount.ID); + var link = _roomLinkService.GetInvitationLink(user.Email, share.Access, _authContext.CurrentAccount.ID); _studioNotifyService.SendEmailRoomInvite(user.Email, link); } } diff --git a/products/ASC.Files/Core/Core/VirtualRooms/RoomLinkService.cs b/products/ASC.Files/Core/Core/VirtualRooms/RoomLinkService.cs index 1c5fb4cd3a..4c2add4f56 100644 --- a/products/ASC.Files/Core/Core/VirtualRooms/RoomLinkService.cs +++ b/products/ASC.Files/Core/Core/VirtualRooms/RoomLinkService.cs @@ -47,26 +47,33 @@ public class RoomLinkService return _commonLinkUtility.GetConfirmationUrl(key, ConfirmType.LinkInvite, createdBy); } - public string GetInvitationLink(string email, Guid createdBy) + public string GetInvitationLink(string email, FileShare share, Guid createdBy) { - var link = _commonLinkUtility.GetConfirmationEmailUrl(email, ConfirmType.LinkInvite, EmployeeType.User, createdBy) - + $"&emplType={EmployeeType.User:d}"; + var type = DocSpaceHelper.PaidRights.Contains(share) ? EmployeeType.User : EmployeeType.Visitor; + + var link = _commonLinkUtility.GetConfirmationEmailUrl(email, ConfirmType.LinkInvite, type, createdBy) + + $"&emplType={type:d}"; + + return link; + } + + public string GetInvitationLink(string email, EmployeeType employeeType, Guid createdBy) + { + var link = _commonLinkUtility.GetConfirmationEmailUrl(email, ConfirmType.LinkInvite, employeeType, createdBy) + + $"&emplType={employeeType:d}"; return link; } public async Task GetOptionsAsync(string key, string email) + { + return await GetOptionsAsync(key, email, EmployeeType.All); + } + + public async Task GetOptionsAsync(string key, string email, EmployeeType employeeType) { var options = new LinkOptions(); - if (string.IsNullOrEmpty(key)) - { - options.Type = LinkType.DefaultInvintation; - options.IsCorrect = true; - - return options; - } - var payload = _docSpaceLinksHelper.Parse(key); if (payload != default) @@ -76,16 +83,24 @@ public class RoomLinkService if (record != null) { options.IsCorrect = true; - options.Type = LinkType.InvintationToRoom; + options.LinkType = LinkType.InvintationToRoom; options.RoomId = record.EntryId.ToString(); options.Share = record.Share; options.Id = record.Subject; + options.EmployeeType = DocSpaceHelper.PaidRights.Contains(record.Share) ? EmployeeType.User : EmployeeType.Visitor; } } - else if (_docSpaceLinksHelper.Validate(key, email) == EmailValidationKeyProvider.ValidationResult.Ok) + else if (_docSpaceLinksHelper.ValidateEmailLink(email, key, employeeType) == EmailValidationKeyProvider.ValidationResult.Ok) { options.IsCorrect = true; - options.Type = LinkType.InvintationByEmail; + options.LinkType = LinkType.InvintationByEmail; + options.EmployeeType = employeeType; + } + else if (_docSpaceLinksHelper.ValidateExtarnalLink(key, employeeType) == EmailValidationKeyProvider.ValidationResult.Ok) + { + options.LinkType = LinkType.DefaultInvintation; + options.IsCorrect = true; + options.EmployeeType = employeeType; } return options; @@ -107,7 +122,8 @@ public class LinkOptions public Guid Id { get; set; } public string RoomId { get; set; } public FileShare Share { get; set; } - public LinkType Type { get; set; } + public LinkType LinkType { get; set; } + public EmployeeType EmployeeType { get; set; } public bool IsCorrect { get; set; } } diff --git a/products/ASC.Files/Core/Helpers/DocSpaceHelper.cs b/products/ASC.Files/Core/Helpers/DocSpaceHelper.cs index fa86f089b5..6bb6bfe4df 100644 --- a/products/ASC.Files/Core/Helpers/DocSpaceHelper.cs +++ b/products/ASC.Files/Core/Helpers/DocSpaceHelper.cs @@ -28,6 +28,8 @@ namespace ASC.Files.Core.Helpers; public static class DocSpaceHelper { + public static HashSet PaidRights { get; } = new HashSet { FileShare.RoomManager }; + private static readonly HashSet _fillingFormRoomConstraints = new HashSet { FileShare.RoomManager, FileShare.ReadWrite, FileShare.FillForms, FileShare.Read }; private static readonly HashSet _editingRoomConstraints diff --git a/products/ASC.Files/Core/Utils/FileSharing.cs b/products/ASC.Files/Core/Utils/FileSharing.cs index dcc141c93b..dac7115ccb 100644 --- a/products/ASC.Files/Core/Utils/FileSharing.cs +++ b/products/ASC.Files/Core/Utils/FileSharing.cs @@ -157,7 +157,7 @@ public class FileSharingAceHelper if (!string.IsNullOrEmpty(w.Email)) { - var link = _roomLinkService.GetInvitationLink(w.Email, _authContext.CurrentAccount.ID); + var link = _roomLinkService.GetInvitationLink(w.Email, share, _authContext.CurrentAccount.ID); _studioNotifyService.SendEmailRoomInvite(w.Email, link); _logger.Debug(link); }