diff --git a/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs b/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs index eba0487d5e..5c07e7653a 100644 --- a/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs +++ b/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs @@ -39,16 +39,17 @@ public class SubscriptionManager { Constants.DocSpaceAdmin.ID, Constants.Everyone.ID, - Constants.RoomAdmin.ID + Constants.RoomAdmin.ID, + Constants.Collaborator.ID, }; - + public SubscriptionManager(CachedSubscriptionService service, TenantManager tenantManager, ICache cache) { _service = service ?? throw new ArgumentNullException("subscriptionManager"); _tenantManager = tenantManager; _cache = cache; - } - + } + public void Subscribe(string sourceID, string actionID, string objectID, string recipientID) { var s = new SubscriptionRecord @@ -79,7 +80,7 @@ public class SubscriptionManager _service.SaveSubscription(s); } - + public void Unsubscribe(string sourceID, string actionID, string objectID, string recipientID) { var s = new SubscriptionRecord @@ -110,17 +111,17 @@ public class SubscriptionManager _service.SaveSubscription(s); } - + public void UnsubscribeAll(string sourceID, string actionID, string objectID) { _service.RemoveSubscriptions(GetTenant(), sourceID, actionID, objectID); } - + public void UnsubscribeAll(string sourceID, string actionID) { _service.RemoveSubscriptions(GetTenant(), sourceID, actionID); } - + public string[] GetSubscriptionMethod(string sourceID, string actionID, string recipientID) { IEnumerable methods; @@ -144,27 +145,27 @@ public class SubscriptionManager return m != null ? m.Methods : Array.Empty(); } - + public string[] GetRecipients(string sourceID, string actionID, string objectID) { return _service.GetRecipients(GetTenant(), sourceID, actionID, objectID); } - + public object GetSubscriptionRecord(string sourceID, string actionID, string recipientID, string objectID) { return _service.GetSubscription(GetTenant(), sourceID, actionID, recipientID, objectID); } - + public string[] GetSubscriptions(string sourceID, string actionID, string recipientID, bool checkSubscribe = true) { return _service.GetSubscriptions(GetTenant(), sourceID, actionID, recipientID, checkSubscribe); } - + public bool IsUnsubscribe(string sourceID, string recipientID, string actionID, string objectID) { return _service.IsUnsubscribe(GetTenant(), sourceID, actionID, recipientID, objectID); } - + public void UpdateSubscriptionMethod(string sourceID, string actionID, string recipientID, string[] senderNames) { var m = new SubscriptionMethod @@ -215,5 +216,5 @@ public class SubscriptionManager private int GetTenant() { return _tenantManager.GetCurrentTenant().Id; - } -} + } +} diff --git a/common/ASC.Core.Common/Context/Impl/UserManager.cs b/common/ASC.Core.Common/Context/Impl/UserManager.cs index 1c3859adba..0bb0b0c332 100644 --- a/common/ASC.Core.Common/Context/Impl/UserManager.cs +++ b/common/ASC.Core.Common/Context/Impl/UserManager.cs @@ -886,16 +886,23 @@ public class UserManager } UserGroupRef r; - if (groupId == Constants.GroupManager.ID || groupId == Constants.GroupUser.ID) + if (groupId == Constants.GroupManager.ID || groupId == Constants.GroupUser.ID || groupId == Constants.GroupCollaborator.ID) { - var user = refs.TryGetValue(UserGroupRef.CreateKey(Tenant.Id, userId, Constants.GroupUser.ID, UserGroupRefType.Contains), out r) && !r.Removed; + var exists = refs.TryGetValue(UserGroupRef.CreateKey(Tenant.Id, userId, Constants.GroupUser.ID, UserGroupRefType.Contains), out r) && !r.Removed; if (groupId == Constants.GroupUser.ID) { - return user; + return exists; } + + exists = refs.TryGetValue(UserGroupRef.CreateKey(Tenant.Id, userId, Constants.GroupCollaborator.ID, UserGroupRefType.Contains), out r) && !r.Removed; + if (groupId == Constants.GroupCollaborator.ID) + { + return exists; + } + if (groupId == Constants.GroupManager.ID) { - return !user; + return !exists; } } diff --git a/common/ASC.Core.Common/Core/EmployeeType.cs b/common/ASC.Core.Common/Core/EmployeeType.cs index 17d3372e53..19d5ff085e 100644 --- a/common/ASC.Core.Common/Core/EmployeeType.cs +++ b/common/ASC.Core.Common/Core/EmployeeType.cs @@ -38,4 +38,5 @@ public enum EmployeeType RoomAdmin = 1, User = 2, DocSpaceAdmin = 3, -} + Collaborator = 4, +} \ No newline at end of file diff --git a/common/ASC.Core.Common/Users/Constants.cs b/common/ASC.Core.Common/Users/Constants.cs index 6d931bccd7..cd2f126a91 100644 --- a/common/ASC.Core.Common/Users/Constants.cs +++ b/common/ASC.Core.Common/Users/Constants.cs @@ -24,9 +24,9 @@ // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode -using Action = ASC.Common.Security.Authorizing.Action; -using AuthConst = ASC.Common.Security.Authorizing.Constants; - +using Action = ASC.Common.Security.Authorizing.Action; +using AuthConst = ASC.Common.Security.Authorizing.Constants; + namespace ASC.Core.Users; [Singletone] @@ -59,7 +59,7 @@ public sealed class Constants private readonly IConfiguration _configuration; - #region system group and category groups + #region system group and category groups public static readonly Guid SysGroupCategoryId = new Guid("{7717039D-FBE9-45ad-81C1-68A1AA10CE1F}"); @@ -87,12 +87,19 @@ public sealed class Constants Name = AuthConst.DocSpaceAdmin.Name, }; + public static readonly GroupInfo GroupCollaborator = new(SysGroupCategoryId) + { + ID = AuthConst.Collaborator.ID, + Name = AuthConst.Collaborator.Name, + }; + public static readonly GroupInfo[] BuildinGroups = new[] - { - GroupEveryone, - GroupUser, - GroupManager, - GroupAdmin, + { + GroupEveryone, + GroupUser, + GroupManager, + GroupAdmin, + GroupCollaborator, }; public static readonly UserInfo LostUser = new UserInfo @@ -119,10 +126,10 @@ public sealed class Constants Name = "Unknown" }; - #endregion + #endregion - #region authorization rules module to work with users + #region authorization rules module to work with users public static readonly Action Action_EditUser = new Action( new Guid("{EF5E6790-F346-4b6e-B662-722BC28CB0DB}"), @@ -136,5 +143,5 @@ public sealed class Constants new Guid("{1D4FEEAC-0BF3-4aa9-B096-6D6B104B79B5}"), "Edit categories and groups"); - #endregion -} + #endregion +} diff --git a/common/ASC.Core.Common/Users/UserExtensions.cs b/common/ASC.Core.Common/Users/UserExtensions.cs index 7041fe89ce..9e78f7f00d 100644 --- a/common/ASC.Core.Common/Users/UserExtensions.cs +++ b/common/ASC.Core.Common/Users/UserExtensions.cs @@ -65,6 +65,17 @@ public static class UserExtensions return ui != null && userManager.IsUserInGroup(ui.Id, Constants.GroupUser.ID); } + public static bool IsCollaborator(this UserManager userManager, UserInfo userInfo) + { + return userInfo != null && userManager.IsUserInGroup(userInfo.Id, Constants.GroupCollaborator.ID); + } + + public static bool IsCollaborator(this UserManager userManager, Guid id) + { + var userInfo = userManager.GetUsers(id); + return userManager.IsCollaborator(userInfo); + } + public static bool IsOutsider(this UserManager userManager, Guid id) { return userManager.IsUser(id) && id == Constants.OutsideUser.Id; @@ -98,7 +109,10 @@ public static class UserExtensions public static EmployeeType GetUserType(this UserManager userManager, Guid id) { - return userManager.IsDocSpaceAdmin(id) ? EmployeeType.DocSpaceAdmin : userManager.IsUser(id) ? EmployeeType.User : EmployeeType.RoomAdmin; + return userManager.IsDocSpaceAdmin(id) ? EmployeeType.DocSpaceAdmin : + userManager.IsUser(id) ? EmployeeType.User : + userManager.IsCollaborator(id) ? EmployeeType.Collaborator : + EmployeeType.RoomAdmin; } private const string _extMobPhone = "extmobphone"; @@ -146,4 +160,4 @@ public static class UserExtensions ui.ContactsList = newContacts; } -} +}