about summary refs log tree commit diff
path: root/Utilities/LibMatrix.FederationTest/Controllers/FederationKeysController.cs
blob: 33d0b99ee28cb88742142cef1e340a332fa089eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
    }
}