{ lib, config, ... }: # Does not implement everything .netrc allows # (starting with: changing the .netrc position) # but neither do clients anyways. let cfg = config.frogeye.netrc; in { config = { frogeye.passwordFiles = [ { path = "${config.home.homeDirectory}/.netrc"; text = lib.trivial.pipe cfg [ builtins.attrValues (builtins.map ( n: "machine ${n.machine} login @${n.machine}_login@ password @${n.machine}_password@" )) lib.strings.concatLines ]; passwords = lib.trivial.pipe cfg [ builtins.attrValues (builtins.map (n: [ { name = "@${n.machine}_login@"; value = { inherit (n) path; selector = n.login; }; } { name = "@${n.machine}_password@"; value = { inherit (n) path; selector = n.password; }; } ])) lib.lists.flatten builtins.listToAttrs ]; } ]; }; options = { frogeye.netrc = lib.mkOption { default = { }; description = "Entries to add to .netrc"; type = lib.types.attrsOf ( lib.types.submodule ( { config, name, ... }: { options = { machine = lib.mkOption { type = lib.types.str; default = name; readOnly = true; internal = true; }; login = lib.mkOption { type = lib.types.nullOr lib.types.str; default = "email"; description = "Password selector that will be used as the login field"; }; password = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; description = "Password selector that will be used as the password field"; }; path = lib.mkOption { type = lib.types.str; description = "Path to the password store entry"; }; }; } ) ); }; }; }