about summary refs log tree commit diff
path: root/LibMatrix.Federation
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-12-05 13:49:02 +0100
committerRory& <root@rory.gay>2025-12-05 13:49:02 +0100
commitdc58a7878faf1ee567e0f1239d8c8869502fd03d (patch)
tree0c82a8fbabd4e9f3d6df498e9c4753191ab11b1e /LibMatrix.Federation
parentUpdate deps (diff)
downloadLibMatrix-dc58a7878faf1ee567e0f1239d8c8869502fd03d.tar.xz
Federation work
Diffstat (limited to 'LibMatrix.Federation')
-rw-r--r--LibMatrix.Federation/AuthenticatedFederationClient.cs9
-rw-r--r--LibMatrix.Federation/Extensions/Ed25519Extensions.cs1
-rw-r--r--LibMatrix.Federation/Extensions/XMatrixAuthorizationSchemeExtensions.cs11
-rw-r--r--LibMatrix.Federation/XMatrixAuthorizationScheme.cs10
4 files changed, 25 insertions, 6 deletions
diff --git a/LibMatrix.Federation/AuthenticatedFederationClient.cs b/LibMatrix.Federation/AuthenticatedFederationClient.cs

index ee4bb25..95af72f 100644 --- a/LibMatrix.Federation/AuthenticatedFederationClient.cs +++ b/LibMatrix.Federation/AuthenticatedFederationClient.cs
@@ -4,13 +4,13 @@ using LibMatrix.Homeservers; namespace LibMatrix.Federation; -public class AuthenticatedFederationClient(string federationEndpoint, AuthenticatedFederationClient.AuthenticatedFederationConfiguration config, string? proxy = null) : FederationClient(federationEndpoint, proxy) { - +public class AuthenticatedFederationClient(string federationEndpoint, AuthenticatedFederationClient.AuthenticatedFederationConfiguration config, string? proxy = null) + : FederationClient(federationEndpoint, proxy) { public class AuthenticatedFederationConfiguration { - public required VersionedHomeserverPrivateKey PrivateKey { get; set; } + public required VersionedHomeserverPrivateKey PrivateKey { get; set; } public required string OriginServerName { get; set; } } - + // public async Task<UserDeviceListResponse> GetUserDevicesAsync(string userId) { // var response = await HttpClient.SendAsync(new XMatrixAuthorizationScheme.XMatrixRequestSignature() { // OriginServerName = config.OriginServerName, @@ -20,5 +20,4 @@ public class AuthenticatedFederationClient(string federationEndpoint, Authentica // }.ToSignedHttpRequestMessage(config.PrivateKey)); // return response; // } - } \ No newline at end of file diff --git a/LibMatrix.Federation/Extensions/Ed25519Extensions.cs b/LibMatrix.Federation/Extensions/Ed25519Extensions.cs
index e5a9e5d..ada6a3d 100644 --- a/LibMatrix.Federation/Extensions/Ed25519Extensions.cs +++ b/LibMatrix.Federation/Extensions/Ed25519Extensions.cs
@@ -6,5 +6,6 @@ namespace LibMatrix.Federation.Extensions; public static class Ed25519Extensions { public static string ToUnpaddedBase64(this Ed25519PublicKeyParameters key) => UnpaddedBase64.Encode(key.GetEncoded()); + public static string ToUnpaddedBase64(this Ed25519PrivateKeyParameters key) => UnpaddedBase64.Encode(key.GetEncoded()); public static Ed25519PrivateKeyParameters GetPrivateEd25519Key(this VersionedHomeserverPrivateKey key) => new(UnpaddedBase64.Decode(key.PrivateKey), 0); } \ No newline at end of file diff --git a/LibMatrix.Federation/Extensions/XMatrixAuthorizationSchemeExtensions.cs b/LibMatrix.Federation/Extensions/XMatrixAuthorizationSchemeExtensions.cs
index 792264a..b520b1c 100644 --- a/LibMatrix.Federation/Extensions/XMatrixAuthorizationSchemeExtensions.cs +++ b/LibMatrix.Federation/Extensions/XMatrixAuthorizationSchemeExtensions.cs
@@ -4,13 +4,22 @@ using LibMatrix.Abstractions; namespace LibMatrix.Federation.Extensions; public static class XMatrixAuthorizationSchemeExtensions { - public static HttpRequestMessage ToSignedHttpRequestMessage(this XMatrixAuthorizationScheme.XMatrixRequestSignature requestSignature, VersionedHomeserverPrivateKey privateKey) { + public static HttpRequestMessage ToSignedHttpRequestMessage(this XMatrixAuthorizationScheme.XMatrixRequestSignature requestSignature, + VersionedHomeserverPrivateKey privateKey) { var signature = requestSignature.Sign(privateKey); var requestMessage = new HttpRequestMessage { Method = new HttpMethod(requestSignature.Method), RequestUri = new Uri(requestSignature.Uri, UriKind.Relative) }; + var headerValue = new XMatrixAuthorizationScheme.XMatrixAuthorizationHeader() { + Origin = requestSignature.OriginServerName, + Key = privateKey.KeyId, + Destination = requestSignature.DestinationServerName, + Signature = signature.Signatures[requestSignature.OriginServerName][privateKey.KeyId] + }.ToHeaderValue(); + requestMessage.Headers.Add("Authorization", headerValue); + if (requestSignature.Content != null) { requestMessage.Content = JsonContent.Create(requestSignature.Content); } diff --git a/LibMatrix.Federation/XMatrixAuthorizationScheme.cs b/LibMatrix.Federation/XMatrixAuthorizationScheme.cs
index 45899b8..392cd93 100644 --- a/LibMatrix.Federation/XMatrixAuthorizationScheme.cs +++ b/LibMatrix.Federation/XMatrixAuthorizationScheme.cs
@@ -2,6 +2,8 @@ using System.Net.Http.Headers; using System.Text.Json.Nodes; using System.Text.Json.Serialization; using ArcaneLibs.Extensions; +using LibMatrix.Abstractions; +using LibMatrix.Responses.Federation; using Microsoft.Extensions.Primitives; namespace LibMatrix.Federation; @@ -48,6 +50,14 @@ public class XMatrixAuthorizationScheme { }; } + public static XMatrixAuthorizationHeader FromSignedObject(SignedObject<XMatrixRequestSignature> signedObj, VersionedHomeserverPrivateKey currentKey) => + new() { + Origin = signedObj.TypedContent.OriginServerName, + Destination = signedObj.TypedContent.DestinationServerName, + Signature = signedObj.Signatures[signedObj.TypedContent.OriginServerName][currentKey.KeyId], + Key = currentKey.KeyId + }; + public string ToHeaderValue() => $"{Scheme} origin=\"{Origin}\", destination=\"{Destination}\", key=\"{Key}\", sig=\"{Signature}\""; }