Partially revert Mare 0.9 UI/API changes

This commit is contained in:
Loporrit
2023-12-08 12:00:43 +00:00
parent d2ccafd505
commit 78b56aa952
37 changed files with 1795 additions and 1954 deletions

View File

@@ -1,5 +1,4 @@
using MareSynchronos.API.Data;
using MareSynchronos.API.Dto;
using MareSynchronos.API.Dto.User;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Logging;
@@ -7,7 +6,6 @@ using System.Text;
namespace MareSynchronos.WebAPI;
#pragma warning disable MA0040
public partial class ApiController
{
public async Task PushCharacterData(CharacterData data, List<UserData> visibleCharacters)
@@ -16,7 +14,7 @@ public partial class ApiController
try
{
await PushCharacterDataInternal(data, [.. visibleCharacters]).ConfigureAwait(false);
await PushCharacterDataInternal(data, visibleCharacters.ToList()).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
@@ -46,14 +44,14 @@ public partial class ApiController
return await _mareHub!.InvokeAsync<List<OnlineUserIdentDto>>(nameof(UserGetOnlinePairs)).ConfigureAwait(false);
}
public async Task<List<UserFullPairDto>> UserGetPairedClients()
public async Task<List<UserPairDto>> UserGetPairedClients()
{
return await _mareHub!.InvokeAsync<List<UserFullPairDto>>(nameof(UserGetPairedClients)).ConfigureAwait(false);
return await _mareHub!.InvokeAsync<List<UserPairDto>>(nameof(UserGetPairedClients)).ConfigureAwait(false);
}
public async Task<UserProfileDto> UserGetProfile(UserDto dto)
{
if (!IsConnected) return new UserProfileDto(dto.User, Disabled: false, IsNSFW: null, ProfilePictureBase64: null, Description: null);
if (!IsConnected) return new UserProfileDto(dto.User, false, null, null, null);
return await _mareHub!.InvokeAsync<UserProfileDto>(nameof(UserGetProfile), dto).ConfigureAwait(false);
}
@@ -92,12 +90,6 @@ public partial class ApiController
await _mareHub!.InvokeAsync(nameof(UserSetProfile), userDescription).ConfigureAwait(false);
}
public async Task UserUpdateDefaultPermissions(DefaultPermissionsDto defaultPermissionsDto)
{
CheckConnection();
await _mareHub!.InvokeAsync(nameof(UserUpdateDefaultPermissions), defaultPermissionsDto).ConfigureAwait(false);
}
private async Task PushCharacterDataInternal(CharacterData character, List<UserData> visibleCharacters)
{
Logger.LogInformation("Pushing character data for {hash} to {charas}", character.DataHash.Value, string.Join(", ", visibleCharacters.Select(c => c.AliasOrUID)));
@@ -113,5 +105,4 @@ public partial class ApiController
Logger.LogDebug("Chara data contained: {nl} {data}", Environment.NewLine, sb.ToString());
await UserPushData(new(visibleCharacters, character)).ConfigureAwait(false);
}
}
#pragma warning restore MA0040
}

View File

@@ -25,10 +25,14 @@ public partial class ApiController
return Task.CompletedTask;
}
public Task Client_GroupChangeUserPairPermissions(GroupPairUserPermissionDto dto)
public Task Client_GroupPairChangePermissions(GroupPairUserPermissionDto dto)
{
Logger.LogDebug("Client_GroupChangeUserPairPermissions: {dto}", dto);
ExecuteSafely(() => _pairManager.UpdateGroupPairPermissions(dto));
Logger.LogTrace("Client_GroupPairChangePermissions: {dto}", dto);
ExecuteSafely(() =>
{
if (string.Equals(dto.UID, UID, StringComparison.Ordinal)) _pairManager.SetGroupUserPermissions(dto);
else _pairManager.SetGroupPairUserPermissions(dto);
});
return Task.CompletedTask;
}
@@ -109,13 +113,6 @@ public partial class ApiController
return Task.CompletedTask;
}
public Task Client_UpdateUserIndividualPairStatusDto(UserIndividualPairStatusDto dto)
{
Logger.LogDebug("Client_UpdateUserIndividualPairStatusDto: {dto}", dto);
ExecuteSafely(() => _pairManager.UpdateIndividualPairStatus(dto));
return Task.CompletedTask;
}
public Task Client_UserAddClientPair(UserPairDto dto)
{
Logger.LogDebug("Client_UserAddClientPair: {dto}", dto);
@@ -158,13 +155,6 @@ public partial class ApiController
return Task.CompletedTask;
}
public Task Client_UserUpdateDefaultPermissions(DefaultPermissionsDto dto)
{
Logger.LogDebug("Client_UserUpdateDefaultPermissions: {dto}", dto);
_connectionDto!.DefaultPreferredPermissions = dto;
return Task.CompletedTask;
}
public Task Client_UserUpdateOtherPairPermissions(UserPermissionsDto dto)
{
Logger.LogDebug("Client_UserUpdateOtherPairPermissions: {dto}", dto);
@@ -198,10 +188,10 @@ public partial class ApiController
_mareHub!.On(nameof(Client_GroupChangePermissions), act);
}
public void OnGroupChangeUserPairPermissions(Action<GroupPairUserPermissionDto> act)
public void OnGroupPairChangePermissions(Action<GroupPairUserPermissionDto> act)
{
if (_initialized) return;
_mareHub!.On(nameof(Client_GroupChangeUserPairPermissions), act);
_mareHub!.On(nameof(Client_GroupPairChangePermissions), act);
}
public void OnGroupDelete(Action<GroupDto> act)
@@ -252,24 +242,12 @@ public partial class ApiController
_mareHub!.On(nameof(Client_UpdateSystemInfo), act);
}
public void OnUpdateUserIndividualPairStatusDto(Action<UserIndividualPairStatusDto> action)
{
if (_initialized) return;
_mareHub!.On(nameof(Client_UpdateUserIndividualPairStatusDto), action);
}
public void OnUserAddClientPair(Action<UserPairDto> act)
{
if (_initialized) return;
_mareHub!.On(nameof(Client_UserAddClientPair), act);
}
public void OnUserDefaultPermissionUpdate(Action<DefaultPermissionsDto> act)
{
if (_initialized) return;
_mareHub!.On(nameof(Client_UserUpdateDefaultPermissions), act);
}
public void OnUserReceiveCharacterData(Action<OnlineUserCharaDataDto> act)
{
if (_initialized) return;

View File

@@ -42,10 +42,10 @@ public partial class ApiController
await _mareHub!.SendAsync(nameof(GroupClear), group).ConfigureAwait(false);
}
public async Task<GroupJoinDto> GroupCreate()
public async Task<GroupPasswordDto> GroupCreate()
{
CheckConnection();
return await _mareHub!.InvokeAsync<GroupJoinDto>(nameof(GroupCreate)).ConfigureAwait(false);
return await _mareHub!.InvokeAsync<GroupPasswordDto>(nameof(GroupCreate)).ConfigureAwait(false);
}
public async Task<List<string>> GroupCreateTempInvite(GroupDto group, int amount)
@@ -66,16 +66,10 @@ public partial class ApiController
return await _mareHub!.InvokeAsync<List<BannedGroupUserDto>>(nameof(GroupGetBannedUsers), group).ConfigureAwait(false);
}
public async Task<GroupJoinInfoDto> GroupJoin(GroupPasswordDto passwordedGroup)
public async Task<bool> GroupJoin(GroupPasswordDto passwordedGroup)
{
CheckConnection();
return await _mareHub!.InvokeAsync<GroupJoinInfoDto>(nameof(GroupJoin), passwordedGroup).ConfigureAwait(false);
}
public async Task<bool> GroupJoinFinalize(GroupJoinDto passwordedGroup)
{
CheckConnection();
return await _mareHub!.InvokeAsync<bool>(nameof(GroupJoinFinalize), passwordedGroup).ConfigureAwait(false);
return await _mareHub!.InvokeAsync<bool>(nameof(GroupJoin), passwordedGroup).ConfigureAwait(false);
}
public async Task GroupLeave(GroupDto group)
@@ -102,6 +96,12 @@ public partial class ApiController
return await _mareHub!.InvokeAsync<List<GroupFullInfoDto>>(nameof(GroupsGetAll)).ConfigureAwait(false);
}
public async Task<List<GroupPairFullInfoDto>> GroupsGetUsersInGroup(GroupDto group)
{
CheckConnection();
return await _mareHub!.InvokeAsync<List<GroupPairFullInfoDto>>(nameof(GroupsGetUsersInGroup), group).ConfigureAwait(false);
}
public async Task GroupUnbanUser(GroupPairDto groupPair)
{
CheckConnection();

View File

@@ -31,7 +31,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
private bool _doNotNotifyOnNextInfo = false;
private CancellationTokenSource? _healthCheckTokenSource = new();
private bool _initialized;
private string? _lastUsedToken;
private HubConnection? _mareHub;
private ServerState _serverState;
@@ -65,7 +64,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
public Version CurrentClientVersion => _connectionDto?.CurrentClientVersion ?? new Version(0, 0, 0);
public DefaultPermissionsDto? DefaultPermissions => _connectionDto?.DefaultPreferredPermissions ?? null;
public string DisplayName => _connectionDto?.User.AliasOrUID ?? string.Empty;
public bool IsConnected => ServerState == ServerState.Connected;
@@ -140,7 +138,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
try
{
_lastUsedToken = await _tokenProvider.GetOrUpdateToken(token).ConfigureAwait(false);
await _tokenProvider.GetOrUpdateToken(token).ConfigureAwait(false);
}
catch (MareAuthFailureException ex)
{
@@ -267,11 +265,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
{
await Task.Delay(TimeSpan.FromSeconds(30), ct).ConfigureAwait(false);
Logger.LogDebug("Checking Client Health State");
bool requireReconnect = await RefreshToken(ct).ConfigureAwait(false);
if (requireReconnect) continue;
_ = await CheckClientHealth().ConfigureAwait(false);
}
}
@@ -305,8 +298,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
OnUserUpdateSelfPairPermissions(dto => _ = Client_UserUpdateSelfPairPermissions(dto));
OnUserReceiveUploadStatus(dto => _ = Client_UserReceiveUploadStatus(dto));
OnUserUpdateProfile(dto => _ = Client_UserUpdateProfile(dto));
OnUserDefaultPermissionUpdate(dto => _ = Client_UserUpdateDefaultPermissions(dto));
OnUpdateUserIndividualPairStatusDto(dto => _ = Client_UpdateUserIndividualPairStatusDto(dto));
OnGroupChangePermissions((dto) => _ = Client_GroupChangePermissions(dto));
OnGroupDelete((dto) => _ = Client_GroupDelete(dto));
@@ -315,7 +306,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
OnGroupPairLeft((dto) => _ = Client_GroupPairLeft(dto));
OnGroupSendFullInfo((dto) => _ = Client_GroupSendFullInfo(dto));
OnGroupSendInfo((dto) => _ = Client_GroupSendInfo(dto));
OnGroupChangeUserPairPermissions((dto) => _ = Client_GroupChangeUserPairPermissions(dto));
OnGroupPairChangePermissions((dto) => _ = Client_GroupPairChangePermissions(dto));
_healthCheckTokenSource?.Cancel();
_healthCheckTokenSource?.Dispose();
@@ -327,16 +318,24 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
private async Task LoadIninitialPairs()
{
foreach (var userPair in await UserGetPairedClients().ConfigureAwait(false))
{
Logger.LogDebug("Individual Pair: {userPair}", userPair);
_pairManager.AddUserPair(userPair, addToLastAddedUser: false);
}
foreach (var entry in await GroupsGetAll().ConfigureAwait(false))
{
Logger.LogDebug("Group: {entry}", entry);
_pairManager.AddGroup(entry);
}
foreach (var userPair in await UserGetPairedClients().ConfigureAwait(false))
foreach (var group in _pairManager.GroupPairs.Keys)
{
Logger.LogDebug("Individual Pair: {userPair}", userPair);
_pairManager.AddUserPair(userPair);
var users = await GroupsGetUsersInGroup(group).ConfigureAwait(false);
foreach (var user in users)
{
Logger.LogDebug("Group Pair: {user}", user);
_pairManager.AddGroupPair(user);
}
}
}
@@ -395,33 +394,6 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM
Logger.LogWarning(arg, "Connection closed... Reconnecting");
}
private async Task<bool> RefreshToken(CancellationToken ct)
{
Logger.LogDebug("Checking token");
bool requireReconnect = false;
try
{
var token = await _tokenProvider.GetOrUpdateToken(ct).ConfigureAwait(false);
if (!string.Equals(token, _lastUsedToken, StringComparison.Ordinal))
{
Logger.LogDebug("Reconnecting due to updated token");
_doNotNotifyOnNextInfo = true;
await CreateConnections().ConfigureAwait(false);
requireReconnect = true;
}
}
catch (MareAuthFailureException ex)
{
AuthFailureMessage = ex.Reason;
await StopConnection(ServerState.Unauthorized).ConfigureAwait(false);
requireReconnect = true;
}
return requireReconnect;
}
private async Task StopConnection(ServerState state)
{
ServerState = ServerState.Disconnecting;

View File

@@ -35,7 +35,7 @@ public sealed class TokenProvider : IDisposable
_httpClient.Dispose();
}
public async Task<string> GetNewToken(bool isRenewal, CancellationToken token)
public async Task<string> GetNewToken(CancellationToken token)
{
Uri tokenUri;
string response = string.Empty;
@@ -43,32 +43,18 @@ public sealed class TokenProvider : IDisposable
try
{
if (!isRenewal)
{
_logger.LogDebug("GetNewToken: Requesting");
_logger.LogDebug("GetNewToken: Requesting");
tokenUri = MareAuth.AuthFullPath(new Uri(_serverManager.CurrentApiUrl
.Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase)
.Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase)));
var secretKey = _serverManager.GetSecretKey()!;
var auth = secretKey.GetHash256();
result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("auth", auth),
new KeyValuePair<string, string>("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)),
}), token).ConfigureAwait(false);
}
else
tokenUri = MareAuth.AuthFullPath(new Uri(_serverManager.CurrentApiUrl
.Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase)
.Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase)));
var secretKey = _serverManager.GetSecretKey()!;
var auth = secretKey.GetHash256();
result = await _httpClient.PostAsync(tokenUri, new FormUrlEncodedContent(new[]
{
_logger.LogDebug("GetNewToken: Renewal");
tokenUri = MareAuth.RenewTokenFullPath(new Uri(_serverManager.CurrentApiUrl
.Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase)
.Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase)));
HttpRequestMessage request = new(HttpMethod.Get, tokenUri.ToString());
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _tokenCache[CurrentIdentifier]);
result = await _httpClient.SendAsync(request, token).ConfigureAwait(false);
}
new KeyValuePair<string, string>("auth", auth),
new KeyValuePair<string, string>("charaIdent", await _dalamudUtil.GetPlayerNameHashedAsync().ConfigureAwait(false)),
}), token).ConfigureAwait(false);
response = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
result.EnsureSuccessStatusCode();
@@ -88,31 +74,16 @@ public sealed class TokenProvider : IDisposable
throw;
}
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(response);
_logger.LogTrace("GetNewToken: JWT {token}", response);
_logger.LogDebug("GetNewToken: Valid until {date}, ValidClaim until {date}", jwtToken.ValidTo,
new DateTime(long.Parse(jwtToken.Claims.Single(c => string.Equals(c.Type, "expiration_date", StringComparison.Ordinal)).Value), DateTimeKind.Utc));
return response;
}
public async Task<string?> GetOrUpdateToken(CancellationToken ct, bool forceRenew = false)
public async Task<string?> GetOrUpdateToken(CancellationToken ct)
{
bool renewal = forceRenew;
if (!forceRenew && _tokenCache.TryGetValue(CurrentIdentifier, out var token))
{
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(token);
if (jwtToken.ValidTo == DateTime.MinValue || jwtToken.ValidTo.Subtract(TimeSpan.FromMinutes(5)) > DateTime.UtcNow)
{
_logger.LogTrace("GetOrUpdate: Returning token from cache");
return token;
}
renewal = true;
}
if (_tokenCache.TryGetValue(CurrentIdentifier, out var token))
return token;
_logger.LogTrace("GetOrUpdate: Getting new token");
return await GetNewToken(renewal, ct).ConfigureAwait(false);
return await GetNewToken(ct).ConfigureAwait(false);
}
}