about summary refs log tree commit diff
path: root/Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-06-20 21:15:16 +0200
committerRory& <root@rory.gay>2025-06-20 21:15:16 +0200
commit8a756489789a1f5bf7ce6e31ac4bb867e38ee52d (patch)
treef4a2f158a0a79471a959736fb0214e7f6cf8a53f /Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs
parentX-Matrix fixes (diff)
downloadLibMatrix-8a756489789a1f5bf7ce6e31ac4bb867e38ee52d.tar.xz
Oops, fix project path for federation test server
Diffstat (limited to 'Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs')
-rw-r--r--Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs41
1 files changed, 41 insertions, 0 deletions
diff --git a/Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs b/Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs
new file mode 100644

index 0000000..33d0b99 --- /dev/null +++ b/Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs
@@ -0,0 +1,41 @@ +using LibMatrix.Federation.Extensions; +using LibMatrix.Federation.Utilities; +using LibMatrix.FederationTest.Services; +using LibMatrix.Homeservers; +using Microsoft.AspNetCore.Mvc; + +namespace LibMatrix.FederationTest.Controllers; + +[ApiController] +[Route("_matrix/key/v2/")] +public class FederationKeysController(FederationTestConfiguration config, FederationKeyStore keyStore) { + static FederationKeysController() { + Console.WriteLine("INFO | FederationKeysController initialized."); + } + + private static SignedObject<ServerKeysResponse>? _cachedServerKeysResponse; + private static SemaphoreSlim _serverKeyCacheLock = new SemaphoreSlim(1, 1); + + [HttpGet("server")] + public async Task<SignedObject<ServerKeysResponse>> GetServerKeys() { + await _serverKeyCacheLock.WaitAsync(); + if (_cachedServerKeysResponse == null || _cachedServerKeysResponse.TypedContent.ValidUntil < DateTime.Now + TimeSpan.FromSeconds(30)) { + var keys = keyStore.GetCurrentSigningKey(); + _cachedServerKeysResponse = new ServerKeysResponse() { + ValidUntil = DateTime.Now + TimeSpan.FromMinutes(1), + ServerName = config.ServerName, + OldVerifyKeys = [], + VerifyKeysById = new() { + { + new() { Algorithm = "ed25519", KeyId = "0" }, new ServerKeysResponse.CurrentVerifyKey() { + Key = keys.publicKey.ToUnpaddedBase64(), + } + } + } + }.Sign(config.ServerName, new ServerKeysResponse.VersionedKeyId() { Algorithm = "ed25519", KeyId = "0" }, keys.privateKey); + } + _serverKeyCacheLock.Release(); + + return _cachedServerKeysResponse; + } +} \ No newline at end of file