fix getting identifier during zoning
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
namespace MareSynchronos.WebAPI.SignalR;
|
namespace MareSynchronos.WebAPI.SignalR;
|
||||||
|
|
||||||
public record JwtIdentifier(string ApiUrl, string SecretKey);
|
public record JwtIdentifier(string ApiUrl, string CharaHash, string SecretKey)
|
||||||
|
{
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "{JwtIdentifier; Url: " + ApiUrl + ", Chara: " + CharaHash + ", HasSecretKey: " + !string.IsNullOrEmpty(SecretKey) + "}";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,14 +27,22 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
_httpClient = new();
|
_httpClient = new();
|
||||||
var ver = Assembly.GetExecutingAssembly().GetName().Version;
|
var ver = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
Mediator = mareMediator;
|
Mediator = mareMediator;
|
||||||
Mediator.Subscribe<DalamudLogoutMessage>(this, (_) => _tokenCache.Clear());
|
Mediator.Subscribe<DalamudLogoutMessage>(this, (_) =>
|
||||||
Mediator.Subscribe<DalamudLoginMessage>(this, (_) => _tokenCache.Clear());
|
{
|
||||||
|
_lastJwtIdentifier = null;
|
||||||
|
_tokenCache.Clear();
|
||||||
|
});
|
||||||
|
Mediator.Subscribe<DalamudLoginMessage>(this, (_) =>
|
||||||
|
{
|
||||||
|
_lastJwtIdentifier = null;
|
||||||
|
_tokenCache.Clear();
|
||||||
|
});
|
||||||
_httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MareSynchronos", ver!.Major + "." + ver!.Minor + "." + ver!.Build));
|
_httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MareSynchronos", ver!.Major + "." + ver!.Minor + "." + ver!.Build));
|
||||||
}
|
}
|
||||||
|
|
||||||
public MareMediator Mediator { get; }
|
public MareMediator Mediator { get; }
|
||||||
|
|
||||||
private JwtIdentifier CurrentIdentifier => new(_serverManager.CurrentApiUrl, _serverManager.GetSecretKey()!);
|
private JwtIdentifier? _lastJwtIdentifier;
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
@@ -42,7 +50,7 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
_httpClient.Dispose();
|
_httpClient.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> GetNewToken(bool isRenewal, CancellationToken token)
|
public async Task<string> GetNewToken(bool isRenewal, JwtIdentifier identifier, CancellationToken token)
|
||||||
{
|
{
|
||||||
Uri tokenUri;
|
Uri tokenUri;
|
||||||
string response = string.Empty;
|
string response = string.Empty;
|
||||||
@@ -73,17 +81,17 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
.Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase)
|
.Replace("wss://", "https://", StringComparison.OrdinalIgnoreCase)
|
||||||
.Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase)));
|
.Replace("ws://", "http://", StringComparison.OrdinalIgnoreCase)));
|
||||||
HttpRequestMessage request = new(HttpMethod.Get, tokenUri.ToString());
|
HttpRequestMessage request = new(HttpMethod.Get, tokenUri.ToString());
|
||||||
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _tokenCache[CurrentIdentifier]);
|
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _tokenCache[identifier]);
|
||||||
result = await _httpClient.SendAsync(request, token).ConfigureAwait(false);
|
result = await _httpClient.SendAsync(request, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
response = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
|
response = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
result.EnsureSuccessStatusCode();
|
result.EnsureSuccessStatusCode();
|
||||||
_tokenCache[CurrentIdentifier] = response;
|
_tokenCache[identifier] = response;
|
||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException ex)
|
||||||
{
|
{
|
||||||
_tokenCache.TryRemove(CurrentIdentifier, out _);
|
_tokenCache.TryRemove(identifier, out _);
|
||||||
|
|
||||||
_logger.LogError(ex, "GetNewToken: Failure to get token");
|
_logger.LogError(ex, "GetNewToken: Failure to get token");
|
||||||
|
|
||||||
@@ -108,7 +116,7 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
var tokenTime = jwtToken.ValidTo.Subtract(TimeSpan.FromHours(6));
|
var tokenTime = jwtToken.ValidTo.Subtract(TimeSpan.FromHours(6));
|
||||||
if (tokenTime <= dateTimeMinus10 || tokenTime >= dateTimePlus10)
|
if (tokenTime <= dateTimeMinus10 || tokenTime >= dateTimePlus10)
|
||||||
{
|
{
|
||||||
_tokenCache.TryRemove(CurrentIdentifier, out _);
|
_tokenCache.TryRemove(identifier, out _);
|
||||||
Mediator.Publish(new NotificationMessage("Invalid system clock", "The clock of your computer is invalid. " +
|
Mediator.Publish(new NotificationMessage("Invalid system clock", "The clock of your computer is invalid. " +
|
||||||
"Mare will not function properly if the time zone is not set correctly. " +
|
"Mare will not function properly if the time zone is not set correctly. " +
|
||||||
"Please set your computers time zone correctly and keep your clock synchronized with the internet.",
|
"Please set your computers time zone correctly and keep your clock synchronized with the internet.",
|
||||||
@@ -118,9 +126,38 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private JwtIdentifier? GetIdentifier()
|
||||||
|
{
|
||||||
|
JwtIdentifier jwtIdentifier;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
jwtIdentifier = new(_serverManager.CurrentApiUrl,
|
||||||
|
_dalamudUtil.GetPlayerNameHashedAsync().GetAwaiter().GetResult(),
|
||||||
|
_serverManager.GetSecretKey()!);
|
||||||
|
_lastJwtIdentifier = jwtIdentifier;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (_lastJwtIdentifier == null)
|
||||||
|
{
|
||||||
|
_logger.LogError("GetOrUpdate: No last identifier found, aborting");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogWarning(ex, "GetOrUpdate: Could not get JwtIdentifier for some reason or another, reusing last identifier {identifier}", _lastJwtIdentifier);
|
||||||
|
jwtIdentifier = _lastJwtIdentifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug("GetOrUpdate: Using identifier {identifier}", jwtIdentifier);
|
||||||
|
return jwtIdentifier;
|
||||||
|
}
|
||||||
|
|
||||||
public string? GetToken()
|
public string? GetToken()
|
||||||
{
|
{
|
||||||
if (_tokenCache.TryGetValue(CurrentIdentifier, out var token))
|
JwtIdentifier? jwtIdentifier = GetIdentifier();
|
||||||
|
if (jwtIdentifier == null) return null;
|
||||||
|
|
||||||
|
if (_tokenCache.TryGetValue(jwtIdentifier, out var token))
|
||||||
{
|
{
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
@@ -130,8 +167,11 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
|
|
||||||
public async Task<string?> GetOrUpdateToken(CancellationToken ct)
|
public async Task<string?> GetOrUpdateToken(CancellationToken ct)
|
||||||
{
|
{
|
||||||
|
JwtIdentifier? jwtIdentifier = GetIdentifier();
|
||||||
|
if (jwtIdentifier == null) return null;
|
||||||
|
|
||||||
bool renewal = false;
|
bool renewal = false;
|
||||||
if (_tokenCache.TryGetValue(CurrentIdentifier, out var token))
|
if (_tokenCache.TryGetValue(jwtIdentifier, out var token))
|
||||||
{
|
{
|
||||||
var handler = new JwtSecurityTokenHandler();
|
var handler = new JwtSecurityTokenHandler();
|
||||||
var jwt = handler.ReadJwtToken(token);
|
var jwt = handler.ReadJwtToken(token);
|
||||||
@@ -150,6 +190,6 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber
|
|||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogTrace("GetOrUpdate: Getting new token");
|
_logger.LogTrace("GetOrUpdate: Getting new token");
|
||||||
return await GetNewToken(renewal, ct).ConfigureAwait(false);
|
return await GetNewToken(renewal, jwtIdentifier, ct).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user