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:
@@ -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:
|
||||||
|
|||||||
@@ -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")"
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user