summaryrefslogtreecommitdiffstats
path: root/nixos/modules/security/acme/mk-cert-ownership-assertion.nix
blob: ff87ea8c3d45c24b71aa0808dc1e37dddae8064a (plain)
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
lib:

{
  cert,
  groups,
  services,
}:
let
  catSep = builtins.concatStringsSep;

  svcUser = svc: svc.serviceConfig.User or "root";
  svcGroups =
    svc:
    (lib.optional (svc.serviceConfig ? Group) svc.serviceConfig.Group)
    ++ lib.toList (svc.serviceConfig.SupplementaryGroups or [ ]);
in
{
  assertion = builtins.all (
    svc:
    svcUser svc == "root"
    || builtins.elem (svcUser svc) groups.${cert.group}.members
    || builtins.elem cert.group (svcGroups svc)
  ) services;

  message = "Certificate ${cert.domain} (group=${cert.group}) must be readable by service(s) ${
    catSep ", " (
      map (svc: "${svc.name} (user=${svcUser svc} groups=${catSep "," (svcGroups svc)})") services
    )
  }";
}