From 84b1b017026bb1d0a37a8d3ef553f073225b4e8d Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 10 Apr 2023 17:26:25 +0200 Subject: [PATCH] lib/modules: Only interpret class declaration in non-shorthand mode This is to avoid stealing keys from submodules. `class` might be common enough that reinterpreting existing `class` attributes in configurations as a declaration leads to fairly widespread problems. --- lib/modules.nix | 2 +- lib/tests/modules.sh | 2 ++ lib/tests/modules/class-check.nix | 1 + .../define-freeform-keywords-shorthand.nix | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 lib/tests/modules/define-freeform-keywords-shorthand.nix diff --git a/lib/modules.nix b/lib/modules.nix index 9377c2e1e9dc..4533252c60e2 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -511,7 +511,7 @@ let imports = m.require or [] ++ m.imports or []; options = {}; config = addFreeformType (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]); - class = m.class or null; + class = null; }; applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }: diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index c2a8e566cb8c..116a0778aebc 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -255,6 +255,8 @@ checkConfigError 'A definition for option .* is not of type .*' \ ## Freeform modules # Assigning without a declared option should work checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix +# Shorthand modules interpret `meta` and `class` as config items +checkConfigOutput '^true$' options._module.args.value.result ./freeform-attrsOf.nix ./define-freeform-keywords-shorthand.nix # No freeform assignments shouldn't make it error checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix # but only if the type matches diff --git a/lib/tests/modules/class-check.nix b/lib/tests/modules/class-check.nix index 6e02f8c30920..f492c844abfb 100644 --- a/lib/tests/modules/class-check.nix +++ b/lib/tests/modules/class-check.nix @@ -25,6 +25,7 @@ ./module-class-is-nixos.nix { _file = "foo.nix#darwinModules.default"; class = "darwin"; + config = {}; imports = []; } ]; diff --git a/lib/tests/modules/define-freeform-keywords-shorthand.nix b/lib/tests/modules/define-freeform-keywords-shorthand.nix new file mode 100644 index 000000000000..8de1ec6a7475 --- /dev/null +++ b/lib/tests/modules/define-freeform-keywords-shorthand.nix @@ -0,0 +1,15 @@ +{ config, ... }: { + class = { "just" = "data"; }; + a = "one"; + b = "two"; + meta = "meta"; + + _module.args.result = + let r = builtins.removeAttrs config [ "_module" ]; + in builtins.trace (builtins.deepSeq r r) (r == { + a = "one"; + b = "two"; + class = { "just" = "data"; }; + meta = "meta"; + }); +}