Include vaguely helpful plugin log information for connections
This commit is contained in:
parent
8c747ba661
commit
ce1285bff9
@ -3,7 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0-windows</TargetFramework>
|
<TargetFramework>net6.0-windows</TargetFramework>
|
||||||
<LangVersion>9.0</LangVersion>
|
<LangVersion>9.0</LangVersion>
|
||||||
<Version>1.16.0.0</Version>
|
<Version>1.17.0.0</Version>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Account;
|
using Account;
|
||||||
|
using Dalamud.Logging;
|
||||||
using Grpc.Core;
|
using Grpc.Core;
|
||||||
using Grpc.Net.Client;
|
using Grpc.Net.Client;
|
||||||
using Palace;
|
using Palace;
|
||||||
@ -39,15 +40,22 @@ namespace Pal.Client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string PartialAccountId =>
|
||||||
|
AccountId?.ToString()?.PadRight(14).Substring(0, 13) ?? "[no account id]";
|
||||||
|
|
||||||
private async Task<(bool Success, string Error)> TryConnect(CancellationToken cancellationToken, bool retry = true)
|
private async Task<(bool Success, string Error)> TryConnect(CancellationToken cancellationToken, bool retry = true)
|
||||||
{
|
{
|
||||||
if (Service.Configuration.Mode != Configuration.EMode.Online)
|
if (Service.Configuration.Mode != Configuration.EMode.Online)
|
||||||
|
{
|
||||||
|
PluginLog.Debug("TryConnect: Not Online, not attempting to establish a connection");
|
||||||
return (false, "You are not online.");
|
return (false, "You are not online.");
|
||||||
|
}
|
||||||
|
|
||||||
if (_channel == null || !(_channel.State == ConnectivityState.Ready || _channel.State == ConnectivityState.Idle))
|
if (_channel == null || !(_channel.State == ConnectivityState.Ready || _channel.State == ConnectivityState.Idle))
|
||||||
{
|
{
|
||||||
Dispose();
|
Dispose();
|
||||||
|
|
||||||
|
PluginLog.Information("TryConnect: Creating new gRPC channel");
|
||||||
_channel = GrpcChannel.ForAddress(remoteUrl, new GrpcChannelOptions
|
_channel = GrpcChannel.ForAddress(remoteUrl, new GrpcChannelOptions
|
||||||
{
|
{
|
||||||
HttpHandler = new SocketsHttpHandler
|
HttpHandler = new SocketsHttpHandler
|
||||||
@ -56,20 +64,26 @@ namespace Pal.Client
|
|||||||
SslOptions = GetSslClientAuthenticationOptions(),
|
SslOptions = GetSslClientAuthenticationOptions(),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
PluginLog.Information($"TryConnect: Connecting to upstream service at {remoteUrl}");
|
||||||
await _channel.ConnectAsync(cancellationToken);
|
await _channel.ConnectAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
var accountClient = new AccountService.AccountServiceClient(_channel);
|
var accountClient = new AccountService.AccountServiceClient(_channel);
|
||||||
if (AccountId == null)
|
if (AccountId == null)
|
||||||
{
|
{
|
||||||
|
PluginLog.Information($"TryConnect: No account information saved for {remoteUrl}, creating new account");
|
||||||
var createAccountReply = await accountClient.CreateAccountAsync(new CreateAccountRequest(), headers: UnauthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
var createAccountReply = await accountClient.CreateAccountAsync(new CreateAccountRequest(), headers: UnauthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
||||||
if (createAccountReply.Success)
|
if (createAccountReply.Success)
|
||||||
{
|
{
|
||||||
AccountId = Guid.Parse(createAccountReply.AccountId);
|
AccountId = Guid.Parse(createAccountReply.AccountId);
|
||||||
|
PluginLog.Information($"TryConnect: Account created with id {PartialAccountId}");
|
||||||
|
|
||||||
Service.Configuration.Save();
|
Service.Configuration.Save();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
PluginLog.Error($"TryConnect: Account creation failed with error {createAccountReply.Error}");
|
||||||
if (createAccountReply.Error == CreateAccountError.UpgradeRequired && !_warnedAboutUpgrade)
|
if (createAccountReply.Error == CreateAccountError.UpgradeRequired && !_warnedAboutUpgrade)
|
||||||
{
|
{
|
||||||
Service.Chat.PrintError("[Palace Pal] Your version of Palace Pal is outdated, please update the plugin using the Plugin Installer.");
|
Service.Chat.PrintError("[Palace Pal] Your version of Palace Pal is outdated, please update the plugin using the Plugin Installer.");
|
||||||
@ -80,19 +94,31 @@ namespace Pal.Client
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (AccountId == null)
|
if (AccountId == null)
|
||||||
|
{
|
||||||
|
PluginLog.Warning("TryConnect: No account id to login with");
|
||||||
return (false, "No account-id after account was attempted to be created.");
|
return (false, "No account-id after account was attempted to be created.");
|
||||||
|
}
|
||||||
|
|
||||||
if (_lastLoginReply == null || string.IsNullOrEmpty(_lastLoginReply.AuthToken) || _lastLoginReply.ExpiresAt.ToDateTime().ToLocalTime() < DateTime.Now)
|
if (_lastLoginReply == null || string.IsNullOrEmpty(_lastLoginReply.AuthToken) || _lastLoginReply.ExpiresAt.ToDateTime().ToLocalTime() < DateTime.Now)
|
||||||
{
|
{
|
||||||
|
PluginLog.Information($"TryConnect: Logging in with account id {PartialAccountId}");
|
||||||
_lastLoginReply = await accountClient.LoginAsync(new LoginRequest { AccountId = AccountId?.ToString() }, headers: UnauthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
_lastLoginReply = await accountClient.LoginAsync(new LoginRequest { AccountId = AccountId?.ToString() }, headers: UnauthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
||||||
if (!_lastLoginReply.Success)
|
if (_lastLoginReply.Success)
|
||||||
{
|
{
|
||||||
|
PluginLog.Information($"TryConnect: Login successful with account id: {PartialAccountId}, auth token: {_lastLoginReply.AuthToken}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PluginLog.Error($"TryConnect: Login failed with error { _lastLoginReply.Error}");
|
||||||
if (_lastLoginReply.Error == LoginError.InvalidAccountId)
|
if (_lastLoginReply.Error == LoginError.InvalidAccountId)
|
||||||
{
|
{
|
||||||
AccountId = null;
|
AccountId = null;
|
||||||
Service.Configuration.Save();
|
Service.Configuration.Save();
|
||||||
if (retry)
|
if (retry)
|
||||||
|
{
|
||||||
|
PluginLog.Information("TryConnect: Attempting connection retry without account id");
|
||||||
return await TryConnect(cancellationToken, retry: false);
|
return await TryConnect(cancellationToken, retry: false);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return (false, "Invalid account id.");
|
return (false, "Invalid account id.");
|
||||||
}
|
}
|
||||||
@ -106,7 +132,10 @@ namespace Pal.Client
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (_lastLoginReply == null)
|
if (_lastLoginReply == null)
|
||||||
|
{
|
||||||
|
PluginLog.Error("TryConnect: No account available");
|
||||||
return (false, "No login information available.");
|
return (false, "No login information available.");
|
||||||
|
}
|
||||||
|
|
||||||
bool success = !string.IsNullOrEmpty(_lastLoginReply?.AuthToken);
|
bool success = !string.IsNullOrEmpty(_lastLoginReply?.AuthToken);
|
||||||
if (!success)
|
if (!success)
|
||||||
@ -129,6 +158,7 @@ namespace Pal.Client
|
|||||||
if (!connectionResult.Success)
|
if (!connectionResult.Success)
|
||||||
return $"Could not connect to server: {connectionResult.Error}";
|
return $"Could not connect to server: {connectionResult.Error}";
|
||||||
|
|
||||||
|
PluginLog.Information("VerifyConnection: Connection established, trying to verify auth token");
|
||||||
var accountClient = new AccountService.AccountServiceClient(_channel);
|
var accountClient = new AccountService.AccountServiceClient(_channel);
|
||||||
await accountClient.VerifyAsync(new VerifyRequest(), headers: AuthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
await accountClient.VerifyAsync(new VerifyRequest(), headers: AuthorizedHeaders(), deadline: DateTime.UtcNow.AddSeconds(10), cancellationToken: cancellationToken);
|
||||||
return "Connection successful.";
|
return "Connection successful.";
|
||||||
@ -227,20 +257,24 @@ namespace Pal.Client
|
|||||||
var bytes = new byte[manifestResourceStream.Length];
|
var bytes = new byte[manifestResourceStream.Length];
|
||||||
manifestResourceStream.Read(bytes, 0, bytes.Length);
|
manifestResourceStream.Read(bytes, 0, bytes.Length);
|
||||||
|
|
||||||
|
var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.DefaultKeySet);
|
||||||
|
PluginLog.Debug($"Using client certificate {certificate.GetCertHashString()}");
|
||||||
return new SslClientAuthenticationOptions
|
return new SslClientAuthenticationOptions
|
||||||
{
|
{
|
||||||
ClientCertificates = new X509CertificateCollection()
|
ClientCertificates = new X509CertificateCollection()
|
||||||
{
|
{
|
||||||
new X509Certificate2(bytes, pass, X509KeyStorageFlags.DefaultKeySet),
|
certificate,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
|
PluginLog.Debug("Not using client certificate");
|
||||||
return null;
|
return null;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
PluginLog.Debug("Disposing gRPC channel");
|
||||||
_channel?.Dispose();
|
_channel?.Dispose();
|
||||||
_channel = null;
|
_channel = null;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using Dalamud.Interface.Components;
|
using Dalamud.Interface.Components;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
|
using Dalamud.Logging;
|
||||||
using ECommons.Reflection;
|
using ECommons.Reflection;
|
||||||
using ECommons.SplatoonAPI;
|
using ECommons.SplatoonAPI;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
@ -9,6 +10,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Pal.Client.Windows
|
namespace Pal.Client.Windows
|
||||||
@ -124,12 +126,17 @@ namespace Pal.Client.Windows
|
|||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
_connectionText = "Testing...";
|
_connectionText = "Testing...";
|
||||||
|
|
||||||
|
CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
|
cts.CancelAfter(TimeSpan.FromSeconds(60));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_connectionText = await Service.RemoteApi.VerifyConnection();
|
_connectionText = await Service.RemoteApi.VerifyConnection(cts.Token);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
PluginLog.Error(e, "Could not establish remote connection");
|
||||||
_connectionText = e.ToString();
|
_connectionText = e.ToString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user