diff --git a/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs b/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs index e66d4b4..9713831 100644 --- a/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs +++ b/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Groups.cs @@ -149,6 +149,52 @@ public partial class LightlessHub await DbContext.SaveChangesAsync().ConfigureAwait(false); } + [Authorize(Policy = "Identified")] + public async Task GroupClearFinder(GroupDto dto) + { + _logger.LogCallInfo(LightlessHubLogger.Args(dto)); + + var (hasRights, group) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false); + if (!hasRights) return; + + var groupPairs = await DbContext.GroupPairs.Include(p => p.GroupUser).Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false); + var finder_only = groupPairs.Where(g => g.FromFinder && !g.IsPinned && !g.IsModerator).ToList(); + + if (finder_only.Count == 0) + { + _logger.LogCallInfo(LightlessHubLogger.Args(dto, "No Users To Clear")); + return; + } + + await Clients.Users(finder_only.Select(g => g.GroupUserUID)).Client_GroupDelete(new GroupDto(group.ToGroupData())).ConfigureAwait(false); + + _logger.LogCallInfo(LightlessHubLogger.Args(dto, "Cleared Finder users ", finder_only.Count)); + + DbContext.GroupPairs.RemoveRange(finder_only); + + foreach (var pair in finder_only) + { + await Clients.Users(groupPairs.Where(p => p.IsPinned || p.IsModerator).Select(g => g.GroupUserUID)).Client_GroupPairLeft(new GroupPairDto(dto.Group, pair.GroupUser.ToUserData())).ConfigureAwait(false); + + var pairIdent = await GetUserIdent(pair.GroupUserUID).ConfigureAwait(false); + if (string.IsNullOrEmpty(pairIdent)) continue; + + var allUserPairs = await GetAllPairInfo(pair.GroupUserUID).ConfigureAwait(false); + + var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false); + + DbContext.CharaDataAllowances.RemoveRange(sharedData); + + foreach (var groupUserPair in groupPairs.Where(p => !string.Equals(p.GroupUserUID, pair.GroupUserUID, StringComparison.Ordinal))) + { + await UserGroupLeave(pair, pairIdent, allUserPairs, pair.GroupUserUID).ConfigureAwait(false); + } + } + + await DbContext.SaveChangesAsync().ConfigureAwait(false); + } + + [Authorize(Policy = "Identified")] public async Task GroupCreate() { @@ -340,7 +386,8 @@ public partial class LightlessHub var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false); var groupGid = group?.GID ?? string.Empty; var existingPair = await DbContext.GroupPairs.AsNoTracking().SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.GroupUserUID == UserUID).ConfigureAwait(false); - var hashedPw = dto.Password.Length == 64 && dto.Password.All(IsHex) + var isHashedPassword = dto.Password.Length == 64 && dto.Password.All(IsHex); + var hashedPw = isHashedPassword ? dto.Password : StringUtils.Sha256String(dto.Password); var existingUserCount = await DbContext.GroupPairs.AsNoTracking().CountAsync(g => g.GroupGID == groupGid).ConfigureAwait(false); @@ -371,7 +418,7 @@ public partial class LightlessHub GroupGID = group.GID, GroupUserUID = UserUID, JoinedGroupOn = DateTime.UtcNow, - FromFinder = dto.Finder + FromFinder = isHashedPassword }; var preferredPermissions = await DbContext.GroupPairPreferredPermissions.SingleOrDefaultAsync(u => u.UserUID == UserUID && u.GroupGID == group.GID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);