about summary refs log tree commit diff
path: root/LibMatrix/Services/WellKnownResolver
diff options
context:
space:
mode:
Diffstat (limited to 'LibMatrix/Services/WellKnownResolver')
-rw-r--r--LibMatrix/Services/WellKnownResolver/WellKnownResolverService.cs37
-rw-r--r--LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ClientWellKnownResolver.cs11
-rw-r--r--LibMatrix/Services/WellKnownResolver/WellKnownResolvers/PolicyServerWellKnownResolver.cs28
-rw-r--r--LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ServerWellKnownResolver.cs12
-rw-r--r--LibMatrix/Services/WellKnownResolver/WellKnownResolvers/SupportWellKnownResolver.cs4
5 files changed, 61 insertions, 31 deletions
diff --git a/LibMatrix/Services/WellKnownResolver/WellKnownResolverService.cs b/LibMatrix/Services/WellKnownResolver/WellKnownResolverService.cs

index 4c78347..8764096 100644 --- a/LibMatrix/Services/WellKnownResolver/WellKnownResolverService.cs +++ b/LibMatrix/Services/WellKnownResolver/WellKnownResolverService.cs
@@ -14,15 +14,17 @@ public class WellKnownResolverService { private readonly ClientWellKnownResolver _clientWellKnownResolver; private readonly SupportWellKnownResolver _supportWellKnownResolver; private readonly ServerWellKnownResolver _serverWellKnownResolver; + private readonly PolicyServerWellKnownResolver _policyServerWellKnownResolver; private readonly WellKnownResolverConfiguration _configuration; public WellKnownResolverService(ILogger<WellKnownResolverService> logger, ClientWellKnownResolver clientWellKnownResolver, SupportWellKnownResolver supportWellKnownResolver, - WellKnownResolverConfiguration configuration, ServerWellKnownResolver serverWellKnownResolver) { + WellKnownResolverConfiguration configuration, ServerWellKnownResolver serverWellKnownResolver, PolicyServerWellKnownResolver policyServerWellKnownResolver) { _logger = logger; _clientWellKnownResolver = clientWellKnownResolver; _supportWellKnownResolver = supportWellKnownResolver; _configuration = configuration; _serverWellKnownResolver = serverWellKnownResolver; + _policyServerWellKnownResolver = policyServerWellKnownResolver; if (logger is NullLogger<WellKnownResolverService>) { var stackFrame = new StackTrace(true).GetFrame(1); Console.WriteLine( @@ -31,20 +33,26 @@ public class WellKnownResolverService { } public async Task<WellKnownRecords> TryResolveWellKnownRecords(string homeserver, bool includeClient = true, bool includeServer = true, bool includeSupport = true, - WellKnownResolverConfiguration? config = null) { + bool includePolicyServer = true, WellKnownResolverConfiguration? config = null) { WellKnownRecords records = new(); _logger.LogDebug($"Resolving well-knowns for {homeserver}"); - if (includeClient && await _clientWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) is { } clientResult) { - records.ClientWellKnown = clientResult; - } - - if (includeServer && await _serverWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) is { } serverResult) { - records.ServerWellKnown = serverResult; - } - - if (includeSupport && await _supportWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) is { } supportResult) { - records.SupportWellKnown = supportResult; - } + var clientTask = includeClient + ? _clientWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) + : Task.FromResult<WellKnownResolutionResult<ClientWellKnown?>>(null!); + var serverTask = includeServer + ? _serverWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) + : Task.FromResult<WellKnownResolutionResult<ServerWellKnown?>>(null!); + var supportTask = includeSupport + ? _supportWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) + : Task.FromResult<WellKnownResolutionResult<SupportWellKnown?>>(null!); + var policyServerTask = includePolicyServer + ? _policyServerWellKnownResolver.TryResolveWellKnown(homeserver, config ?? _configuration) + : Task.FromResult<WellKnownResolutionResult<PolicyServerWellKnown?>>(null!); + + if (includeClient && await clientTask is { } clientResult) records.ClientWellKnown = clientResult; + if (includeServer && await serverTask is { } serverResult) records.ServerWellKnown = serverResult; + if (includeSupport && await supportTask is { } supportResult) records.SupportWellKnown = supportResult; + if (includePolicyServer && await policyServerTask is { } policyServerResult) records.PolicyServerWellKnown = policyServerResult; return records; } @@ -53,6 +61,7 @@ public class WellKnownResolverService { public WellKnownResolutionResult<ClientWellKnown?>? ClientWellKnown { get; set; } public WellKnownResolutionResult<ServerWellKnown?>? ServerWellKnown { get; set; } public WellKnownResolutionResult<SupportWellKnown?>? SupportWellKnown { get; set; } + public WellKnownResolutionResult<PolicyServerWellKnown?>? PolicyServerWellKnown { get; set; } } public class WellKnownResolutionResult<T> { @@ -75,8 +84,10 @@ public class WellKnownResolverService { public struct WellKnownResolutionWarning { public WellKnownResolutionWarningType Type { get; set; } public string Message { get; set; } + [JsonIgnore] public Exception? Exception { get; set; } + public string? ExceptionMessage => Exception?.Message; [JsonConverter(typeof(JsonStringEnumConverter))] diff --git a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ClientWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ClientWellKnownResolver.cs
index f8de38d..678c077 100644 --- a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ClientWellKnownResolver.cs +++ b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ClientWellKnownResolver.cs
@@ -1,10 +1,10 @@ using System.Text.Json.Serialization; using ArcaneLibs.Collections; -using LibMatrix.Extensions; using Microsoft.Extensions.Logging; using WellKnownType = LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ClientWellKnown; -using ResultType = - LibMatrix.Services.WellKnownResolver.WellKnownResolverService.WellKnownResolutionResult<LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ClientWellKnown?>; +using ResultType = LibMatrix.Services.WellKnownResolver.WellKnownResolverService.WellKnownResolutionResult< + LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ClientWellKnown? +>; namespace LibMatrix.Services.WellKnownResolver.WellKnownResolvers; @@ -14,9 +14,7 @@ public class ClientWellKnownResolver(ILogger<ClientWellKnownResolver> logger, We StoreNulls = false }; - private static readonly MatrixHttpClient HttpClient = new(); - - public Task<WellKnownResolverService.WellKnownResolutionResult<ClientWellKnown>> TryResolveWellKnown(string homeserver, WellKnownResolverConfiguration? config = null) { + public Task<ResultType> TryResolveWellKnown(string homeserver, WellKnownResolverConfiguration? config = null) { config ??= configuration; return ClientWellKnownCache.TryGetOrAdd(homeserver, async () => { logger.LogTrace($"Resolving client well-known: {homeserver}"); @@ -25,7 +23,6 @@ public class ClientWellKnownResolver(ILogger<ClientWellKnownResolver> logger, We await TryGetWellKnownFromUrl($"https://{homeserver}/.well-known/matrix/client", WellKnownResolverService.WellKnownSource.Https); if (result.Content != null) return result; - return result; }); } diff --git a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/PolicyServerWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/PolicyServerWellKnownResolver.cs new file mode 100644
index 0000000..f7ffd62 --- /dev/null +++ b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/PolicyServerWellKnownResolver.cs
@@ -0,0 +1,28 @@ +using System.Text.Json.Serialization; +using Microsoft.Extensions.Logging; +using WellKnownType = LibMatrix.Services.WellKnownResolver.WellKnownResolvers.PolicyServerWellKnown; +using ResultType = LibMatrix.Services.WellKnownResolver.WellKnownResolverService.WellKnownResolutionResult< + LibMatrix.Services.WellKnownResolver.WellKnownResolvers.PolicyServerWellKnown? +>; + +namespace LibMatrix.Services.WellKnownResolver.WellKnownResolvers; + +public class PolicyServerWellKnownResolver(ILogger<PolicyServerWellKnownResolver> logger, WellKnownResolverConfiguration configuration) : BaseWellKnownResolver<WellKnownType> { + public Task<ResultType> TryResolveWellKnown(string homeserver, WellKnownResolverConfiguration? config = null) { + config ??= configuration; + return WellKnownCache.TryGetOrAdd(homeserver, async () => { + logger.LogTrace($"Resolving support well-known: {homeserver}"); + + ResultType result = await TryGetWellKnownFromUrl($"https://{homeserver}/.well-known/matrix/policy_server", WellKnownResolverService.WellKnownSource.Https); + if (result.Content != null) + return result; + + return null; + }); + } +} + +public class PolicyServerWellKnown { + [JsonPropertyName("public_key")] + public string PublicKey { get; set; } = null!; +} \ No newline at end of file diff --git a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ServerWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ServerWellKnownResolver.cs
index a99185c..f4be57d 100644 --- a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ServerWellKnownResolver.cs +++ b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/ServerWellKnownResolver.cs
@@ -1,10 +1,10 @@ using System.Text.Json.Serialization; using ArcaneLibs.Collections; -using LibMatrix.Extensions; using Microsoft.Extensions.Logging; using WellKnownType = LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ServerWellKnown; -using ResultType = - LibMatrix.Services.WellKnownResolver.WellKnownResolverService.WellKnownResolutionResult<LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ServerWellKnown?>; +using ResultType = LibMatrix.Services.WellKnownResolver.WellKnownResolverService.WellKnownResolutionResult< + LibMatrix.Services.WellKnownResolver.WellKnownResolvers.ServerWellKnown? +>; namespace LibMatrix.Services.WellKnownResolver.WellKnownResolvers; @@ -14,9 +14,7 @@ public class ServerWellKnownResolver(ILogger<ServerWellKnownResolver> logger, We StoreNulls = false }; - private static readonly MatrixHttpClient HttpClient = new(); - - public Task<WellKnownResolverService.WellKnownResolutionResult<ServerWellKnown>> TryResolveWellKnown(string homeserver, WellKnownResolverConfiguration? config = null) { + public Task<ResultType> TryResolveWellKnown(string homeserver, WellKnownResolverConfiguration? config = null) { config ??= configuration; return ClientWellKnownCache.TryGetOrAdd(homeserver, async () => { logger.LogTrace($"Resolving client well-known: {homeserver}"); @@ -25,13 +23,11 @@ public class ServerWellKnownResolver(ILogger<ServerWellKnownResolver> logger, We await TryGetWellKnownFromUrl($"https://{homeserver}/.well-known/matrix/server", WellKnownResolverService.WellKnownSource.Https); if (result.Content != null) return result; - return result; }); } } - public class ServerWellKnown { [JsonPropertyName("m.server")] public string Homeserver { get; set; } diff --git a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/SupportWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/SupportWellKnownResolver.cs
index 99313db..4faff62 100644 --- a/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/SupportWellKnownResolver.cs +++ b/LibMatrix/Services/WellKnownResolver/WellKnownResolvers/SupportWellKnownResolver.cs
@@ -1,5 +1,3 @@ -using System.Diagnostics; -using System.Net.Http.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Logging; using WellKnownType = LibMatrix.Services.WellKnownResolver.WellKnownResolvers.SupportWellKnown; @@ -16,7 +14,7 @@ public class SupportWellKnownResolver(ILogger<SupportWellKnownResolver> logger, logger.LogTrace($"Resolving support well-known: {homeserver}"); ResultType result = await TryGetWellKnownFromUrl($"https://{homeserver}/.well-known/matrix/support", WellKnownResolverService.WellKnownSource.Https); - if (result.Content != null) + if (result.Content != null) return result; return null;