1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package rpc
4
5import (
6 "context"
7
8 "connectrpc.com/connect"
9
10 pb "bnema.dev/ermite-api/gen/ermite"
11 "bnema.dev/ermite/internal/ports"
12)
13
14// FeatureCommitSignatures is listed by GetVersion when the server verifies
15// commit signatures: Commit.verification and TrustedKeyService (ADR 0030).
16const FeatureCommitSignatures = "commit_signatures"
17
18// trustedKeyService implements ermiteconnect.TrustedKeyServiceHandler. The
19// owner check of add and remove belongs to the use case.
20type trustedKeyService struct {
21 keys ports.TrustedKeyService
22}
23
24func (s *trustedKeyService) ListTrustedKeys(ctx context.Context, _ *connect.Request[pb.ListTrustedKeysRequest]) (*connect.Response[pb.ListTrustedKeysResponse], error) {
25 list, err := s.keys.ListTrustedKeys(ctx, caller(ctx))
26 if err != nil {
27 return nil, connectError(ctx, err)
28 }
29 out := make([]*pb.TrustedKey, 0, len(list))
30 for _, k := range list {
31 out = append(out, trustedKeyToPB(k))
32 }
33 return connect.NewResponse(&pb.ListTrustedKeysResponse{Keys: out}), nil
34}
35
36func (s *trustedKeyService) AddTrustedKey(ctx context.Context, req *connect.Request[pb.AddTrustedKeyRequest]) (*connect.Response[pb.AddTrustedKeyResponse], error) {
37 format, err := signatureFormatFromPB(req.Msg.GetFormat())
38 if err != nil {
39 return nil, connectError(ctx, err)
40 }
41 k, err := s.keys.AddTrustedKey(ctx, caller(ctx), format, req.Msg.GetTitle(), req.Msg.GetPublicKey(), req.Msg.GetEmails())
42 if err != nil {
43 return nil, connectError(ctx, err)
44 }
45 return connect.NewResponse(&pb.AddTrustedKeyResponse{Key: trustedKeyToPB(k)}), nil
46}
47
48func (s *trustedKeyService) RemoveTrustedKey(ctx context.Context, req *connect.Request[pb.RemoveTrustedKeyRequest]) (*connect.Response[pb.RemoveTrustedKeyResponse], error) {
49 if err := s.keys.RemoveTrustedKey(ctx, caller(ctx), req.Msg.GetId()); err != nil {
50 return nil, connectError(ctx, err)
51 }
52 return connect.NewResponse(&pb.RemoveTrustedKeyResponse{}), nil
53}