aboutsummaryrefslogtreecommitdiff
{ lib, ... }:
let
  inherit (lib) mkOption types;
in
{
  options.flake.keys = mkOption {
    description = ''
      Dateisystempfade zu öffentlichen SSH-Schlüsseln für alle Administratoren

      Kann benutzt werden um entsprechende Systemnutzer in `users.users` automatisch zu erstellen.

      Format der Verzeichniseinträge muss eines der Folgenden sein:
        - Datei mit genau einem Eintrag für den jeweiligen Nutzer
        - Verzeichnis mit Dateien die jeweils einen Eintrag enthalten
    '';
    type = with types; attrsOf (listOf path);
    default =
      let
        # Dateinamen mit öffentlichen SSH-Schlüsseln aus einem Verzeichnis mit Nutzernamen auslesen.
        get-key-files =
          dir:
          let
            key-files =
              username: type:
              with builtins;
              if type == "regular" then
                [ "${dir}/${username}" ]
              else
                map (keyfile: "${dir}/${username}/${keyfile}") (
                  attrValues (lib.filterAttrs (_: keytype: keytype == "regular") subdir)
                );
          in
          with builtins;
          lib.mapAttrs key-files (builtins.readDir dir);
      in
      get-key-files ./keys;
  };
}