diff --git a/lib/types.nix b/lib/types.nix index 354714b28733..d7655bc1a6a2 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -55,6 +55,7 @@ let concatMapStringsSep concatStringsSep escapeNixString + hasInfix isCoercibleToString ; inherit (lib.trivial) @@ -360,6 +361,11 @@ rec { deprecationMessage = "See https://github.com/NixOS/nixpkgs/pull/66346 for better alternative types."; }; + passwdEntry = entryType: addCheck entryType (str: !(hasInfix ":" str || hasInfix "\n" str)) // { + name = "passwdEntry ${entryType.name}"; + description = "${entryType.description}, not containing newlines or colons"; + }; + attrs = mkOptionType { name = "attrs"; description = "attribute set"; diff --git a/nixos/modules/config/users-groups.nix b/nixos/modules/config/users-groups.nix index d3bdf218c339..85dfb9365619 100644 --- a/nixos/modules/config/users-groups.nix +++ b/nixos/modules/config/users-groups.nix @@ -6,12 +6,6 @@ let ids = config.ids; cfg = config.users; - isPasswdCompatible = str: !(hasInfix ":" str || hasInfix "\n" str); - passwdEntry = type: lib.types.addCheck type isPasswdCompatible // { - name = "passwdEntry ${type.name}"; - description = "${type.description}, not containing newlines or colons"; - }; - # Check whether a password hash will allow login. allowsLogin = hash: hash == "" # login without password @@ -60,7 +54,7 @@ let options = { name = mkOption { - type = passwdEntry types.str; + type = types.passwdEntry types.str; apply = x: assert (builtins.stringLength x < 32 || abort "Username '${x}' is longer than 31 characters which is not allowed!"); x; description = '' The name of the user account. If undefined, the name of the @@ -69,7 +63,7 @@ let }; description = mkOption { - type = passwdEntry types.str; + type = types.passwdEntry types.str; default = ""; example = "Alice Q. User"; description = '' @@ -134,7 +128,7 @@ let }; home = mkOption { - type = passwdEntry types.path; + type = types.passwdEntry types.path; default = "/var/empty"; description = "The user's home directory."; }; @@ -169,7 +163,7 @@ let }; shell = mkOption { - type = types.nullOr (types.either types.shellPackage (passwdEntry types.path)); + type = types.nullOr (types.either types.shellPackage (types.passwdEntry types.path)); default = pkgs.shadow; defaultText = literalExpression "pkgs.shadow"; example = literalExpression "pkgs.bashInteractive"; @@ -349,7 +343,7 @@ let options = { name = mkOption { - type = passwdEntry types.str; + type = types.passwdEntry types.str; description = '' The name of the group. If undefined, the name of the attribute set will be used. diff --git a/nixos/modules/system/boot/systemd/initrd.nix b/nixos/modules/system/boot/systemd/initrd.nix index cdec7f532917..5f93a8ac3c73 100644 --- a/nixos/modules/system/boot/systemd/initrd.nix +++ b/nixos/modules/system/boot/systemd/initrd.nix @@ -192,7 +192,7 @@ in { }; emergencyAccess = mkOption { - type = with types; oneOf [ bool singleLineStr ]; + type = with types; oneOf [ bool (nullOr (passwdEntry str)) ]; visible = false; description = '' Set to true for unauthenticated emergency access, and false for