{ self, ... }: { flake.nixosModules.sshInbound = { config, lib, ... }: let cfg = config.chiasson.ssh.inbound; inventory = self.lib.sshInventory; resolveSelection = selection: if selection == "all" then inventory.authorizedKeys else let missing = builtins.filter (name: !(builtins.hasAttr name inventory.hosts)) selection; in if missing != [ ] then throw "ssh.inbound: unknown host keys: ${builtins.concatStringsSep ", " missing}" else lib.unique ( builtins.filter (key: key != null) ( builtins.map (hostName: inventory.hosts.${hostName}.publicKey) selection ) ); in { options.chiasson.ssh.inbound = { enable = lib.mkEnableOption "Apply `authorizedKeys` from the SSH inventory."; userAuthorizedHosts = lib.mkOption { type = lib.types.attrsOf (lib.types.either (lib.types.enum [ "all" ]) (lib.types.listOf lib.types.str)); default = { }; example = { olivier = "all"; admin = [ "14900k" "t2mbp" ]; }; description = '' Per user: `"all"` or a list of inventory host names whose keys land in `authorized_keys`. ''; }; }; config = lib.mkIf cfg.enable { users.users = lib.mapAttrs (_user: selection: { openssh.authorizedKeys.keys = resolveSelection selection; }) cfg.userAuthorizedHosts; }; }; }