Add support for adding trust entries during activation

Instead of trusting whole taps automatically, let the user configure
what to trust. I think this implementation better aligns with upstream
intent.

Fixes #156.
This commit is contained in:
Zhaofeng Li
2026-06-13 17:55:36 -04:00
parent 5e721fc775
commit df1ada99b7
3 changed files with 126 additions and 0 deletions
+30
View File
@@ -64,6 +64,17 @@ If you haven't installed Homebrew before, use the following configuration:
# #
# With mutableTaps disabled, taps can no longer be added imperatively with `brew tap`. # With mutableTaps disabled, taps can no longer be added imperatively with `brew tap`.
mutableTaps = false; mutableTaps = false;
# Optional: Declarative Homebrew tap trust entries.
#
# Note: The trust entries are _not_ removed if you remove them from those lists!
# Use the `brew untrust` command to remove a trust entry.
trust = {
formulae = [ ];
casks = [ ];
commands = [ ];
taps = [ ];
};
}; };
} }
# Optional: Align homebrew taps config with nix-homebrew # Optional: Align homebrew taps config with nix-homebrew
@@ -83,6 +94,25 @@ With `nix-homebrew.mutableTaps = false`, taps can be removed by deleting the cor
Setting `homebrew.taps` to equal `nix-homebrew.taps` attribute names reduces configuration mismatches. Setting `homebrew.taps` to equal `nix-homebrew.taps` attribute names reduces configuration mismatches.
For non-official taps, Homebrew requires [explicit trust](https://docs.brew.sh/Tap-Trust).
You may use imperative `brew trust`/`brew untrust` commands, or configure `nix-homebrew` to add trust entries during activation:
```nix
nix-homebrew.trust = {
formulae = [ "user/repo/formula" ];
casks = [ "user/repo/cask" ];
commands = [ "user/repo/command" ];
# To quote upstream documentation:
# > Trust a whole tap only when you are comfortable with all current and
# > future formulae, casks and external commands from that tap being loaded
# > by Homebrew.
taps = [ "user/repo" ];
};
```
Note that when you remove items from those lists, the corresponding trust entries are _not_ removed automatically.
Use the `brew untrust` command to remove a trust entry.
### B. Existing Homebrew Installation ### B. Existing Homebrew Installation
If you've already installed Homebrew with the official script, you can let `nix-homebrew` automatically migrate it: If you've already installed Homebrew with the official script, you can let `nix-homebrew` automatically migrate it:
+21
View File
@@ -83,6 +83,12 @@ let
mkdir -p "$out/Casks/u" mkdir -p "$out/Casks/u"
touch "$out/Casks/u/ungoogled-chromium.rb" touch "$out/Casks/u/ungoogled-chromium.rb"
''; '';
fakeThirdPartyTap = pkgs.runCommandLocal "thirdparty-test-tap" { } ''
mkdir -p "$out/Formula" "$out/Casks" "$out/cmd"
touch "$out/Formula/foo.rb"
touch "$out/Casks/test-cask.rb"
touch "$out/cmd/brew-test-command.rb"
'';
in in
{ {
imports = [ imports = [
@@ -96,6 +102,12 @@ let
autoMigrate = true; autoMigrate = true;
taps = { taps = {
"homebrew/homebrew-cask" = fakeCaskTap; "homebrew/homebrew-cask" = fakeCaskTap;
"thirdparty/homebrew-testtap" = fakeThirdPartyTap;
};
trust = {
formulae = [ "thirdparty/testtap/foo" ];
casks = [ "thirdparty/testtap/test-cask" ];
commands = [ "thirdparty/testtap/test-command" ];
}; };
}; };
@@ -113,6 +125,15 @@ let
test -f "$cask_path" test -f "$cask_path"
>&2 echo "Checking declarative Homebrew trust entries"
brew trust --json=v1 --formula | grep '"thirdparty/testtap/foo"'
brew trust --json=v1 --cask | grep '"thirdparty/testtap/test-cask"'
brew trust --json=v1 --command | grep '"thirdparty/testtap/test-command"'
if brew trust --json=v1 --tap | grep '"thirdparty/testtap"'; then
>&2 echo "Expected thirdparty/testtap not to be trusted as a whole tap"
exit 1
fi
tap_root_real="$(${pkgs.coreutils}/bin/realpath "$tap_root")" tap_root_real="$(${pkgs.coreutils}/bin/realpath "$tap_root")"
cask_real="$(${pkgs.coreutils}/bin/realpath "$cask_path")" cask_real="$(${pkgs.coreutils}/bin/realpath "$cask_path")"
+75
View File
@@ -252,6 +252,19 @@ let
exit 1 exit 1
fi fi
/bin/ln -shf "${makeBinBrew prefix}" "$BIN_BREW" /bin/ln -shf "${makeBinBrew prefix}" "$BIN_BREW"
${setupTrust}
'';
setupTrust = let
trustEntries = flag: entries: lib.concatMapStrings (entry: ''
/usr/bin/sudo -n -u ${lib.escapeShellArg cfg.user} -H "$BIN_BREW" trust ${flag} ${lib.escapeShellArg entry} >/dev/null
'') entries;
in ''
${trustEntries "--tap" cfg.trust.taps}
${trustEntries "--formula" cfg.trust.formulae}
${trustEntries "--cask" cfg.trust.casks}
${trustEntries "--command" cfg.trust.commands}
''; '';
setupTaps = taps: setupTaps = taps:
@@ -390,6 +403,68 @@ in {
type = types.bool; type = types.bool;
default = true; default = true;
}; };
trust = lib.mkOption {
description = ''
Tap trust entries to be added during activation.
Note: The trust entries are _not_ removed if you remove them from
those lists! Use the `brew untrust` command to remove a trust entry.
Refer to upstream documentations for more information:
<https://docs.brew.sh/Tap-Trust>
'';
type = types.submodule {
options = {
taps = lib.mkOption {
description = ''
Taps to trust in their entirety.
This should be used with caution. To quote upstream documentation:
> Trust a whole tap only when you are comfortable with all current and
> future formulae, casks and external commands from that tap being loaded
> by Homebrew.
'';
type = types.listOf types.str;
default = [];
example = [
"user/repo"
];
};
formulae = lib.mkOption {
description = ''
Fully-qualified formulae to trust.
'';
type = types.listOf types.str;
default = [];
example = [
"user/repo/formula"
];
};
casks = lib.mkOption {
description = ''
Fully-qualified casks to trust.
'';
type = types.listOf types.str;
default = [];
example = [
"user/repo/cask"
];
};
commands = lib.mkOption {
description = ''
Fully-qualified external commands to trust.
'';
type = types.listOf types.str;
default = [];
example = [
"user/repo/command"
];
};
};
};
default = {};
};
autoMigrate = lib.mkOption { autoMigrate = lib.mkOption {
description = '' description = ''
Whether to allow nix-homebrew to automatically migrate existing Homebrew installations. Whether to allow nix-homebrew to automatically migrate existing Homebrew installations.