1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

launchd+targets/darwin: Escape XML in plists (#7356)

This patch updates all usage of toPlist such that it escapes any strings
in the final output.

The motication for this change is to avoid confusion when end-users of
home-manager's APIs are not aware that the option values they set end up
being passed un-escaped to XML files.

BREAKING CHANGE: Consumers doing manual escaping will now be doubly escaped.

Co-authored-by: Linnnus <linnnus@users.noreply.github.com>
This commit is contained in:
lignus 2025-08-09 18:22:08 +02:00 committed by GitHub
parent cc2fa2331a
commit 3ec1cd9a07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 35 additions and 4 deletions

View file

@ -43,7 +43,7 @@ let
};
};
toAgent = config: pkgs.writeText "${config.Label}.plist" (toPlist { } config);
toAgent = config: pkgs.writeText "${config.Label}.plist" (toPlist { escape = true; } config);
agentPlists = lib.mapAttrs' (n: v: lib.nameValuePair "${v.config.Label}.plist" (toAgent v.config)) (
lib.filterAttrs (n: v: v.enable) cfg.agents

View file

@ -155,6 +155,18 @@ in
This key maps to the second argument of `execvp(3)`. This key is required in the absence of the Program
key. Please note: many people are confused by this key. Please read `execvp(3)` very carefully!
'';
# TODO: Remove this some time after 25.01.
apply =
value:
if value != null then
map (
item:
lib.warnIf (lib.hasInfix "&amp;" item)
"A value for `ProgramArguments` contains the literal string `&amp;`. This is no longer necessary and will lead to double-escaping, as home-manager now automatically escapes special characters."
item
) value
else
value;
};
EnableGlobbing = mkOption {

View file

@ -0,0 +1,13 @@
{ pkgs, ... }:
{
time = "2025-07-01T20:15:34+00:00";
condition = pkgs.stdenv.hostPlatform.isDarwin;
message = ''
XML characters are escaped for 'targets.darwin.keybindings' and 'launchd.agents.<name>'.
Special characters used in strings passed to 'targets.darwin.keybindings'
and 'launchd.agents.<name>' are now escaped before being included in the
generated plist files. If you were doing manual escaping you will need to
stop to avoid double escaping.
'';
}

View file

@ -8,7 +8,9 @@
let
cfg = config.targets.darwin;
homeDir = config.home.homeDirectory;
confFile = pkgs.writeText "DefaultKeybinding.dict" (lib.generators.toPlist { } cfg.keybindings);
confFile = pkgs.writeText "DefaultKeybinding.dict" (
lib.generators.toPlist { escape = true; } cfg.keybindings
);
in
{
options.targets.darwin.keybindings = lib.mkOption {

View file

@ -11,7 +11,8 @@ let
mkActivationCmds =
isLocal: settings:
let
toDefaultsFile = domain: attrs: pkgs.writeText "${domain}.plist" (lib.generators.toPlist { } attrs);
toDefaultsFile =
domain: attrs: pkgs.writeText "${domain}.plist" (lib.generators.toPlist { escape = true; } attrs);
cliFlags = lib.optionalString isLocal "-currentHost";

View file

@ -14,6 +14,7 @@
};
ProcessType = "Background";
UnrecognizedByHomeManager = "should make it to the resulting plist";
"\"Special\" characters" = "<should be escaped>";
};
};

View file

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>&quot;Special&quot; characters</key>
<string>&lt;should be escaped&gt;</string>
<key>KeepAlive</key>
<dict>
<key>Crashed</key>

View file

@ -14,7 +14,7 @@
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{ "UserKeyMapping": [ { "HIDKeyboardModifierMappingSrc": 0x700000039, "HIDKeyboardModifierMappingDst": 0x70000002A } ] }</string>
<string>{ &quot;UserKeyMapping&quot;: [ { &quot;HIDKeyboardModifierMappingSrc&quot;: 0x700000039, &quot;HIDKeyboardModifierMappingDst&quot;: 0x70000002A } ] }</string>
</array>
<key>RunAtLoad</key>
<true/>