Fixed secret retrieval for connection testing while adding a data source

This commit is contained in:
Thorsten Sommer 2025-03-11 13:56:26 +01:00
parent 08df79ca73
commit 0cc870b614
No known key found for this signature in database
GPG Key ID: B0B7E2FC074BF1F5
6 changed files with 37 additions and 22 deletions

View File

@ -199,7 +199,7 @@ public sealed class AgentDataSourceSelection (ILogger<AgentDataSourceSelection>
// Call the ERI server to get the server description: // Call the ERI server to get the server description:
// //
using var eriClient = ERIClientFactory.Get(eriDataSource.Version, eriDataSource)!; using var eriClient = ERIClientFactory.Get(eriDataSource.Version, eriDataSource)!;
var authResponse = await eriClient.AuthenticateAsync(rustService, token); var authResponse = await eriClient.AuthenticateAsync(rustService, cancellationToken: token);
if (authResponse.Successful) if (authResponse.Successful)
{ {
var serverDescriptionResponse = await eriClient.GetDataSourceInfoAsync(token); var serverDescriptionResponse = await eriClient.GetDataSourceInfoAsync(token);

View File

@ -211,7 +211,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId
this.availableAuthMethods = authSchemes.Data!.Select(n => n.AuthMethod).ToList(); this.availableAuthMethods = authSchemes.Data!.Select(n => n.AuthMethod).ToList();
var loginResult = await client.AuthenticateAsync(this.RustService, cts.Token); var loginResult = await client.AuthenticateAsync(this.RustService, this.dataSecret, cts.Token);
if (!loginResult.Successful) if (!loginResult.Successful)
{ {
await this.form.Validate(); await this.form.Validate();

View File

@ -62,7 +62,7 @@ public readonly record struct DataSourceERI_V1 : IERIDataSource
var logger = Program.SERVICE_PROVIDER.GetRequiredService<ILogger<DataSourceERI_V1>>(); var logger = Program.SERVICE_PROVIDER.GetRequiredService<ILogger<DataSourceERI_V1>>();
using var eriClient = ERIClientFactory.Get(this.Version, this)!; using var eriClient = ERIClientFactory.Get(this.Version, this)!;
var authResponse = await eriClient.AuthenticateAsync(rustService, token); var authResponse = await eriClient.AuthenticateAsync(rustService, cancellationToken: token);
if (authResponse.Successful) if (authResponse.Successful)
{ {
var retrievalRequest = new RetrievalRequest var retrievalRequest = new RetrievalRequest

View File

@ -59,7 +59,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource),
} }
} }
public async Task<APIResponse<AuthResponse>> AuthenticateAsync(RustService rustService, CancellationToken cancellationToken = default) public async Task<APIResponse<AuthResponse>> AuthenticateAsync(RustService rustService, string? temporarySecret = null, CancellationToken cancellationToken = default)
{ {
try try
{ {
@ -99,6 +99,9 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource),
} }
case AuthMethod.USERNAME_PASSWORD: case AuthMethod.USERNAME_PASSWORD:
string password;
if (string.IsNullOrWhiteSpace(temporarySecret))
{
var passwordResponse = await rustService.GetSecret(this.dataSource); var passwordResponse = await rustService.GetSecret(this.dataSource);
if (!passwordResponse.Success) if (!passwordResponse.Success)
{ {
@ -109,7 +112,11 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource),
}; };
} }
var password = await passwordResponse.Secret.Decrypt(Program.ENCRYPTION); password = await passwordResponse.Secret.Decrypt(Program.ENCRYPTION);
}
else
password = temporarySecret;
using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}")) using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}"))
{ {
// We must send both values inside the header. The username field is named 'user'. // We must send both values inside the header. The username field is named 'user'.
@ -146,6 +153,9 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource),
} }
case AuthMethod.TOKEN: case AuthMethod.TOKEN:
string token;
if (string.IsNullOrWhiteSpace(temporarySecret))
{
var tokenResponse = await rustService.GetSecret(this.dataSource); var tokenResponse = await rustService.GetSecret(this.dataSource);
if (!tokenResponse.Success) if (!tokenResponse.Success)
{ {
@ -156,7 +166,11 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource),
}; };
} }
var token = await tokenResponse.Secret.Decrypt(Program.ENCRYPTION); token = await tokenResponse.Secret.Decrypt(Program.ENCRYPTION);
}
else
token = temporarySecret;
using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}")) using (var request = new HttpRequestMessage(HttpMethod.Post, $"auth?authMethod={authMethod}"))
{ {
request.Headers.Add("Authorization", $"Bearer {token}"); request.Headers.Add("Authorization", $"Bearer {token}");

View File

@ -19,9 +19,10 @@ public interface IERIClient : IDisposable
/// Authenticate the user to the ERI server. /// Authenticate the user to the ERI server.
/// </summary> /// </summary>
/// <param name="rustService">The Rust service.</param> /// <param name="rustService">The Rust service.</param>
/// <param name="temporarySecret">The temporary secret when adding a new data source, and the secret is not yet stored in the OS.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The authentication response.</returns> /// <returns>The authentication response.</returns>
public Task<APIResponse<AuthResponse>> AuthenticateAsync(RustService rustService, CancellationToken cancellationToken = default); public Task<APIResponse<AuthResponse>> AuthenticateAsync(RustService rustService, string? temporarySecret = null, CancellationToken cancellationToken = default);
/// <summary> /// <summary>
/// Retrieves the data source information from the ERI server. /// Retrieves the data source information from the ERI server.

View File

@ -113,7 +113,7 @@ public sealed class DataSourceService
} }
this.logger.LogInformation($"Authenticating with ERI source '{source.Name}' (id={source.Id})..."); this.logger.LogInformation($"Authenticating with ERI source '{source.Name}' (id={source.Id})...");
var loginResult = await client.AuthenticateAsync(this.rustService, cancellationTokenSource.Token); var loginResult = await client.AuthenticateAsync(this.rustService, cancellationToken: cancellationTokenSource.Token);
if (!loginResult.Successful) if (!loginResult.Successful)
{ {
this.logger.LogWarning($"Authentication with ERI source '{source.Name}' (id={source.Id}) failed. We skip this source. Reason: {loginResult.Message}"); this.logger.LogWarning($"Authentication with ERI source '{source.Name}' (id={source.Id}) failed. We skip this source. Reason: {loginResult.Message}");