From f77bde46ed4c750d88eff39c7c5ed43966bf162e Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sat, 21 Oct 2023 19:30:33 +0200 Subject: [PATCH] update server lol --- MareAPI | 2 +- .../Hubs/MareHub.Groups.cs | 82 --------- .../Hubs/MareHub.Permissions.cs | 172 ++++++++++++++++++ .../MareSynchronosServer/Hubs/MareHub.User.cs | 81 --------- 4 files changed, 173 insertions(+), 164 deletions(-) create mode 100644 MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Permissions.cs diff --git a/MareAPI b/MareAPI index 9199d9c..edaa0dd 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 9199d9c66721a225e32083e76c44df0f8fdabd01 +Subproject commit edaa0ddb5123b2eb78d694b844bb7ad6cc13192d diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs index 3f8104a..961e332 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Groups.cs @@ -63,88 +63,6 @@ public partial class MareHub await Clients.Users(groupPairs).Client_GroupChangePermissions(new GroupPermissionDto(dto.Group, dto.Permissions)).ConfigureAwait(false); } - [Authorize(Policy = "Identified")] - public async Task GroupChangeIndividualPermissionState(GroupPairUserPermissionDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - var (inGroup, groupPair) = await TryValidateUserInGroup(dto.Group.GID).ConfigureAwait(false); - if (!inGroup) return; - - var groupPreferredPermissions = await _dbContext.GroupPairPreferredPermissions - .SingleAsync(u => u.UserUID == UserUID && u.GroupGID == dto.Group.GID).ConfigureAwait(false); - - var wasPaused = groupPreferredPermissions.IsPaused; - groupPreferredPermissions.DisableSounds = dto.GroupPairPermissions.IsDisableSounds(); - groupPreferredPermissions.DisableAnimations = dto.GroupPairPermissions.IsDisableAnimations(); - groupPreferredPermissions.IsPaused = dto.GroupPairPermissions.IsPaused(); - groupPreferredPermissions.DisableVFX = dto.GroupPairPermissions.IsDisableVFX(); - - // set the permissions for every group pair that is not sticky - var allPairs = (await GetAllPairInfo(UserUID).ConfigureAwait(false)) - .Where(u => !u.Value.OwnPermissions.Sticky) - .ToDictionary(d => d.Key, d => d.Value, StringComparer.Ordinal); - - var affectedGroupPairs = allPairs.Where(u => u.Value.GIDs.Contains(dto.GID, StringComparer.Ordinal)).ToList(); - var groupUserUids = affectedGroupPairs.Select(g => g.Key).ToList(); - var affectedPerms = await _dbContext.Permissions.Where(u => u.UserUID == UserUID - && groupUserUids.Any(c => c == u.OtherUserUID)) - .ToListAsync().ConfigureAwait(false); - - foreach (var perm in affectedPerms) - { - perm.DisableSounds = groupPreferredPermissions.DisableSounds; - perm.DisableAnimations = groupPreferredPermissions.DisableAnimations; - perm.IsPaused = groupPreferredPermissions.IsPaused; - perm.DisableVFX = groupPreferredPermissions.DisableVFX; - } - await _dbContext.SaveChangesAsync().ConfigureAwait(false); - - // send messages - UserPermissions permissions = UserPermissions.NoneSet; - permissions.SetPaused(groupPreferredPermissions.IsPaused); - permissions.SetDisableAnimations(groupPreferredPermissions.DisableAnimations); - permissions.SetDisableSounds(groupPreferredPermissions.DisableSounds); - permissions.SetDisableVFX(groupPreferredPermissions.DisableVFX); - - // send apporpriate permission set to each user - await Clients.Users(affectedGroupPairs - .Select(k => k.Key)) - .Client_UserUpdateOtherPairPermissions(new(new(UserUID), permissions)).ConfigureAwait(false); - - await Clients.User(UserUID).Client_GroupChangeUserPairPermissions(dto).ConfigureAwait(false); - foreach (var item in affectedGroupPairs.Select(k => k.Key)) - { - await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new(new(item), permissions)).ConfigureAwait(false); - } - - var self = await _dbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false); - - if (wasPaused == groupPreferredPermissions.IsPaused) return; - - foreach (var groupUserPair in affectedGroupPairs) - { - var groupUserIdent = await GetUserIdent(groupUserPair.Key).ConfigureAwait(false); - if (!string.IsNullOrEmpty(groupUserIdent)) - { - // if we changed to paused and other was not paused before, we send offline - if (groupPreferredPermissions.IsPaused && !groupUserPair.Value.OtherPermissions.IsPaused) - { - await Clients.User(UserUID).Client_UserSendOffline(new(new(groupUserPair.Key, groupUserPair.Value.Alias))).ConfigureAwait(false); - await Clients.User(groupUserPair.Key) - .Client_UserSendOffline(new(self.ToUserData())).ConfigureAwait(false); - } - // if we changed to unpaused and other was not paused either we send online - else if (!groupPreferredPermissions.IsPaused && !groupUserPair.Value.OtherPermissions.IsPaused) - { - await Clients.User(UserUID).Client_UserSendOnline(new(new(groupUserPair.Key, groupUserPair.Value.Alias), groupUserIdent)).ConfigureAwait(false); - await Clients.User(groupUserPair.Key) - .Client_UserSendOnline(new(self.ToUserData(), UserCharaIdent)).ConfigureAwait(false); - } - } - } - } - [Authorize(Policy = "Identified")] public async Task GroupChangeOwnership(GroupPairDto dto) { diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Permissions.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Permissions.cs new file mode 100644 index 0000000..66833dc --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Permissions.cs @@ -0,0 +1,172 @@ +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; +using MareSynchronos.API.Data.Extensions; +using MareSynchronosServer.Utils; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; + +namespace MareSynchronosServer.Hubs; + +public partial class MareHub +{ + [Authorize(Policy = "Authenticated")] + public async Task UserUpdateDefaultPermissions(DefaultPermissionsDto defaultPermissions) + { + _logger.LogCallInfo(MareHubLogger.Args(defaultPermissions)); + + var permissions = await _dbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false); + + permissions.DisableGroupAnimations = defaultPermissions.DisableGroupAnimations; + permissions.DisableGroupSounds = defaultPermissions.DisableGroupSounds; + permissions.DisableGroupVFX = defaultPermissions.DisableGroupVFX; + permissions.DisableIndividualAnimations = defaultPermissions.DisableIndividualAnimations; + permissions.DisableIndividualSounds = defaultPermissions.DisableIndividualSounds; + permissions.DisableIndividualVFX = defaultPermissions.DisableIndividualVFX; + permissions.IndividualIsSticky = defaultPermissions.IndividualIsSticky; + + _dbContext.Update(permissions); + await _dbContext.SaveChangesAsync().ConfigureAwait(false); + + await Clients.Caller.Client_UserUpdateDefaultPermissions(defaultPermissions).ConfigureAwait(false); + } + + [Authorize(Policy = "Identified")] + public async Task SetBulkPermissions(BulkPermissionsDto dto) + { + _logger.LogCallInfo(MareHubLogger.Args( + "Individual", string.Join(';', dto.AffectedUsers.Select(g => g.Key + ":" + g.Value)), + "Group", string.Join(';', dto.AffectedGroups.Select(g => g.Key + ":" + g.Value)))); + + // remove self + dto.AffectedUsers.Remove(UserUID, out _); + if (!dto.AffectedUsers.Any() && !dto.AffectedGroups.Any()) return; + + // get all current pairs in any form + var allUsers = await GetAllPairInfo(UserUID).ConfigureAwait(false); + var ownDefaultPerms = await _dbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false); + + foreach (var user in dto.AffectedUsers) + { + bool setSticky = false; + var newPerm = user.Value; + if (!allUsers.TryGetValue(user.Key, out var pairData)) continue; + if (!pairData.OwnPermissions.Sticky && !newPerm.IsSticky()) + { + setSticky = ownDefaultPerms.IndividualIsSticky; + } + + var pauseChange = pairData.OwnPermissions.IsPaused != newPerm.IsPaused(); + var prevPermissions = await _dbContext.Permissions.SingleAsync(u => u.UserUID == UserUID && u.OtherUserUID == user.Key).ConfigureAwait(false); + + prevPermissions.IsPaused = newPerm.IsPaused(); + prevPermissions.DisableAnimations = newPerm.IsDisableAnimations(); + prevPermissions.DisableSounds = newPerm.IsDisableSounds(); + prevPermissions.DisableVFX = newPerm.IsDisableVFX(); + prevPermissions.Sticky = newPerm.IsSticky() || setSticky; + _dbContext.Update(prevPermissions); + + // send updated data to pair + var permCopy = newPerm; + permCopy.SetSticky(newPerm.IsSticky() || setSticky); + var permToOther = permCopy; + permToOther.SetSticky(false); + + await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new(new(user.Key), permCopy)).ConfigureAwait(false); + if (pairData.OtherPermissions == null) continue; + + await Clients.User(user.Key).Client_UserUpdateOtherPairPermissions(new(new(UserUID), permToOther)).ConfigureAwait(false); + + // check if pause change and send online or offline respectively + if (pauseChange && !pairData.OtherPermissions.IsPaused) + { + var otherCharaIdent = await GetUserIdent(user.Key).ConfigureAwait(false); + + if (UserCharaIdent == null || otherCharaIdent == null) continue; + + if (newPerm.IsPaused()) + { + await Clients.User(UserUID).Client_UserSendOffline(new(new(user.Key))).ConfigureAwait(false); + await Clients.User(user.Key).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false); + } + else + { + await Clients.User(UserUID).Client_UserSendOnline(new(new(user.Key), otherCharaIdent)).ConfigureAwait(false); + await Clients.User(user.Key).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false); + } + } + } + + foreach (var group in dto.AffectedGroups) + { + var (inGroup, groupPair) = await TryValidateUserInGroup(group.Key).ConfigureAwait(false); + if (!inGroup) continue; + + var groupPreferredPermissions = await _dbContext.GroupPairPreferredPermissions + .SingleAsync(u => u.UserUID == UserUID && u.GroupGID == group.Key).ConfigureAwait(false); + + var wasPaused = groupPreferredPermissions.IsPaused; + groupPreferredPermissions.DisableSounds = group.Value.IsDisableSounds(); + groupPreferredPermissions.DisableAnimations = group.Value.IsDisableAnimations(); + groupPreferredPermissions.IsPaused = group.Value.IsPaused(); + groupPreferredPermissions.DisableVFX = group.Value.IsDisableVFX(); + + var nonStickyPairs = allUsers.Where(u => !u.Value.OwnPermissions.Sticky).ToList(); + var affectedGroupPairs = nonStickyPairs.Where(u => u.Value.GIDs.Contains(group.Key, StringComparer.Ordinal)).ToList(); + var groupUserUids = affectedGroupPairs.Select(g => g.Key).ToList(); + var affectedPerms = await _dbContext.Permissions.Where(u => u.UserUID == UserUID + && groupUserUids.Any(c => c == u.OtherUserUID)) + .ToListAsync().ConfigureAwait(false); + + foreach (var perm in affectedPerms) + { + perm.DisableSounds = groupPreferredPermissions.DisableSounds; + perm.DisableAnimations = groupPreferredPermissions.DisableAnimations; + perm.IsPaused = groupPreferredPermissions.IsPaused; + perm.DisableVFX = groupPreferredPermissions.DisableVFX; + } + + UserPermissions permissions = UserPermissions.NoneSet; + permissions.SetPaused(groupPreferredPermissions.IsPaused); + permissions.SetDisableAnimations(groupPreferredPermissions.DisableAnimations); + permissions.SetDisableSounds(groupPreferredPermissions.DisableSounds); + permissions.SetDisableVFX(groupPreferredPermissions.DisableVFX); + + await Clients.Users(affectedGroupPairs + .Select(k => k.Key)) + .Client_UserUpdateOtherPairPermissions(new(new(UserUID), permissions)).ConfigureAwait(false); + + await Clients.User(UserUID).Client_GroupChangeUserPairPermissions(new GroupPairUserPermissionDto(new(group.Key), new(UserUID), group.Value)).ConfigureAwait(false); + foreach (var item in affectedGroupPairs.Select(k => k.Key)) + { + await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new(new(item), permissions)).ConfigureAwait(false); + } + + if (wasPaused == groupPreferredPermissions.IsPaused) continue; + + foreach (var groupUserPair in affectedGroupPairs) + { + var groupUserIdent = await GetUserIdent(groupUserPair.Key).ConfigureAwait(false); + if (!string.IsNullOrEmpty(groupUserIdent) && !groupUserPair.Value.OtherPermissions.IsPaused) + { + // if we changed to paused and other was not paused before, we send offline + if (groupPreferredPermissions.IsPaused) + { + await Clients.User(UserUID).Client_UserSendOffline(new(new(groupUserPair.Key, groupUserPair.Value.Alias))).ConfigureAwait(false); + await Clients.User(groupUserPair.Key).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false); + } + // if we changed to unpaused and other was not paused either we send online + else + { + await Clients.User(UserUID).Client_UserSendOnline(new(new(groupUserPair.Key, groupUserPair.Value.Alias), groupUserIdent)).ConfigureAwait(false); + await Clients.User(groupUserPair.Key).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false); + } + } + } + } + + await _dbContext.SaveChangesAsync().ConfigureAwait(false); + } +} diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs index 8d71956..1385950 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs @@ -372,66 +372,6 @@ public partial class MareHub await Clients.Users(dto.User.UID).Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); } - [Authorize(Policy = "Identified")] - public async Task UserSetPairPermissions(UserPermissionsDto dto) - { - _logger.LogCallInfo(MareHubLogger.Args(dto)); - - if (string.Equals(dto.User.UID, UserUID, StringComparison.Ordinal)) return; - UserPermissionSet prevPermissions = await _dbContext.Permissions.SingleOrDefaultAsync(w => w.UserUID == UserUID && w.OtherUserUID == dto.User.UID).ConfigureAwait(false); - if (prevPermissions == null) return; // you always should have permissions to another user - - var oldPairData = await GetPairInfo(UserUID, dto.User.UID).ConfigureAwait(false); - bool setSticky = false; - if (!oldPairData.GIDs.Contains(Constants.IndividualKeyword, StringComparer.Ordinal)) - { - if (!oldPairData.OwnPermissions.Sticky && !dto.Permissions.IsSticky()) - { - var defaultPermissions = await _dbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false); - setSticky = defaultPermissions.IndividualIsSticky; - } - } - - var pauseChange = prevPermissions.IsPaused != dto.Permissions.IsPaused(); - - prevPermissions.IsPaused = dto.Permissions.IsPaused(); - prevPermissions.DisableAnimations = dto.Permissions.IsDisableAnimations(); - prevPermissions.DisableSounds = dto.Permissions.IsDisableSounds(); - prevPermissions.DisableVFX = dto.Permissions.IsDisableVFX(); - prevPermissions.Sticky = dto.Permissions.IsSticky() || setSticky; - _dbContext.Update(prevPermissions); - await _dbContext.SaveChangesAsync().ConfigureAwait(false); - - _logger.LogCallInfo(MareHubLogger.Args(dto, "Success")); - - var permCopy = dto.Permissions; - permCopy.SetSticky(dto.Permissions.IsSticky() || setSticky); - - await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new UserPermissionsDto(dto.User, permCopy)).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserUpdateOtherPairPermissions(new UserPermissionsDto(new UserData(UserUID), dto.Permissions)).ConfigureAwait(false); - - var newPairData = await GetPairInfo(UserUID, dto.User.UID).ConfigureAwait(false); - - if (newPairData.OwnPermissions.IsPaused != oldPairData.OwnPermissions.IsPaused) - { - var otherCharaIdent = await GetUserIdent(dto.User.UID).ConfigureAwait(false); - var otherPermissions = newPairData.OtherPermissions; - - if (UserCharaIdent == null || otherCharaIdent == null || (otherPermissions?.IsPaused ?? true)) return; - - if (newPairData.OwnPermissions.IsPaused) - { - await Clients.User(UserUID).Client_UserSendOffline(dto).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false); - } - else - { - await Clients.User(UserUID).Client_UserSendOnline(new(dto.User, otherCharaIdent)).ConfigureAwait(false); - await Clients.User(dto.User.UID).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false); - } - } - } - [Authorize(Policy = "Identified")] public async Task UserSetProfile(UserProfileDto dto) { @@ -515,27 +455,6 @@ public partial class MareHub await Clients.Caller.Client_UserUpdateProfile(new(dto.User)).ConfigureAwait(false); } - [Authorize(Policy = "Authenticated")] - public async Task UserUpdateDefaultPermissions(DefaultPermissionsDto defaultPermissions) - { - _logger.LogCallInfo(MareHubLogger.Args(defaultPermissions)); - - var permissions = await _dbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false); - - permissions.DisableGroupAnimations = defaultPermissions.DisableGroupAnimations; - permissions.DisableGroupSounds = defaultPermissions.DisableGroupSounds; - permissions.DisableGroupVFX = defaultPermissions.DisableGroupVFX; - permissions.DisableIndividualAnimations = defaultPermissions.DisableIndividualAnimations; - permissions.DisableIndividualSounds = defaultPermissions.DisableIndividualSounds; - permissions.DisableIndividualVFX = defaultPermissions.DisableIndividualVFX; - permissions.IndividualIsSticky = defaultPermissions.IndividualIsSticky; - - _dbContext.Update(permissions); - await _dbContext.SaveChangesAsync().ConfigureAwait(false); - - await Clients.Caller.Client_UserUpdateDefaultPermissions(defaultPermissions).ConfigureAwait(false); - } - [GeneratedRegex(@"^([a-z0-9_ '+&,\.\-\{\}]+\/)+([a-z0-9_ '+&,\.\-\{\}]+\.[a-z]{3,4})$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.ECMAScript)] private static partial Regex GamePathRegex();