From 114d799f124b15fdb19994c6c31fd218dbc65223 Mon Sep 17 00:00:00 2001 From: schnusch Date: Thu, 20 Feb 2025 11:17:16 +0100 Subject: [PATCH] gopass-jsonapi: add native messaging manifest (#381123) --- .../gopass-jsonapi/browser-jsonapi-wrapper.sh | 4 ++ pkgs/by-name/go/gopass-jsonapi/package.nix | 56 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 pkgs/by-name/go/gopass-jsonapi/browser-jsonapi-wrapper.sh diff --git a/pkgs/by-name/go/gopass-jsonapi/browser-jsonapi-wrapper.sh b/pkgs/by-name/go/gopass-jsonapi/browser-jsonapi-wrapper.sh new file mode 100755 index 000000000000..361215b2cfe8 --- /dev/null +++ b/pkgs/by-name/go/gopass-jsonapi/browser-jsonapi-wrapper.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu +export GPG_TTY=$(tty) +exec @OUT@/bin/gopass-jsonapi listen diff --git a/pkgs/by-name/go/gopass-jsonapi/package.nix b/pkgs/by-name/go/gopass-jsonapi/package.nix index 5a3ad29f431d..c8ac712834e1 100644 --- a/pkgs/by-name/go/gopass-jsonapi/package.nix +++ b/pkgs/by-name/go/gopass-jsonapi/package.nix @@ -5,10 +5,26 @@ buildGoModule, fetchFromGitHub, installShellFiles, + jq, + gnupg, gopass, apple-sdk_14, }: +let + + # https://github.com/gopasspw/gopass-jsonapi/blob/v1.15.15/internal/jsonapi/manifest/manifest_path_linux.go + manifestPaths = { + firefox = "$out/lib/mozilla/native-messaging-hosts/com.justwatch.gopass.json"; + chrome = "$out/etc/opt/chrome/native-messaging-hosts/com.justwatch.gopass.json"; + chromium = "$out/etc/chromium/native-messaging-hosts/com.justwatch.gopass.json"; + brave = "$out/etc/opt/chrome/native-messaging-hosts/com.justwatch.gopass.json"; + vivaldi = "$out/etc/opt/vivaldi/native-messaging-hosts/com.justwatch.gopass.json"; + iridium = "$out/etc/iridium-browser/native-messaging-hosts/com.justwatch.gopass.json"; + slimjet = "$out/etc/opt/slimjet/native-messaging-hosts/com.justwatch.gopass.json"; + }; + +in buildGoModule rec { pname = "gopass-jsonapi"; version = "1.15.15"; @@ -41,6 +57,46 @@ buildGoModule rec { "-X main.commit=${src.rev}" ]; + postInstall = '' + # Generate native messaging manifests for Chrome and Firefox. + export HOME=$(mktemp -d) + ${gnupg}/bin/gpg --batch --passphrase "" --quick-generate-key "user " + ${gopass}/bin/gopass setup --name "user" --email "user@localhost" + + ${lib.concatMapStrings ( + browser: + let + manifestPath = manifestPaths.${browser}; + in + # The options after `--print=false` are of no effect, but if missing + # `gopass-jsonapi configure` will ask for them. (`--libpath` and `--global` + # are overriden by `--manifest-path`. `--libpath` is only used to + # compute Firefox's global manifest path. See + # https://github.com/gopasspw/gopass-jsonapi/blob/v1.15.15/setup_others.go#L33-L46) + # + # `gopass-jsonapi configure` ask for confirmation before writing any files, + # `echo y` gives it. + # Prepend $PATH so we can run gopass-jsonapi before wrapProgram in postFixup. + '' + echo y | PATH="${gopass.wrapperPath}:$PATH" $out/bin/gopass-jsonapi configure \ + --browser ${browser} \ + --path $out/lib/gopass \ + --manifest-path ${manifestPath} \ + --print=false \ + --global \ + --libpath /var/empty + # replace gopass_wrapper.sh with ./browser-jsonapi-wrapper.sh + rm $out/lib/gopass/gopass_wrapper.sh + ${jq}/bin/jq --arg script $out/lib/gopass/browser-jsonapi-wrapper.sh \ + '.path = $script' ${manifestPath} > ${manifestPath}.tmp + mv ${manifestPath}.tmp ${manifestPath} + '' + ) (builtins.attrNames manifestPaths)} + substitute ${./browser-jsonapi-wrapper.sh} $out/lib/gopass/browser-jsonapi-wrapper.sh \ + --replace-fail "@OUT@" "$out" + chmod +x $out/lib/gopass/browser-jsonapi-wrapper.sh + ''; + postFixup = '' wrapProgram $out/bin/gopass-jsonapi \ --prefix PATH : "${gopass.wrapperPath}"