diff --git a/general.nix b/general.nix index 5b543bf..080041b 100644 --- a/general.nix +++ b/general.nix @@ -108,6 +108,19 @@ in enable = true; enableSSHSupport = true; }; + + systemd.user.services.gpg-agent = let + pinentrySwitcher = pkgs.callPackage ./packages/pinentry.nix {}; + cfg = config.programs.gnupg; + in { + restartTriggers = [ pinentrySwitcher ]; + restartIfChanged = true; + + serviceConfig.ExecStart = [ "" '' + ${cfg.package}/bin/gpg-agent --supervised \ + --pinentry-program ${pinentrySwitcher}/bin/pinentry + '' ]; + }; documentation.man.generateCaches = true; diff --git a/packages/pinentry.nix b/packages/pinentry.nix new file mode 100644 index 0000000..01d3a58 --- /dev/null +++ b/packages/pinentry.nix @@ -0,0 +1,36 @@ +{ writeShellScriptBin, pinentry, ... }: +writeShellScriptBin "pinentry" '' + flavor= + if [ -n "$XDG_CURRENT_DESKTOP" ]; then + case "$XDG_CURRENT_DESKTOP" in + KDE|LXQT) + flavor="qt" ;; + XFCE) + flavor="gtk2" ;; + Gnome) + flavor="gnome3" ;; + *) + echo "Unknown desktop '$XDG_CURRENT_DESKTOP', use 'gnome3'" >&2 + flavor="gnome3" ;; + esac + elif [ -z "$XAUTHORITY" -a -z "$WAYLAND_DISPLAY" ]; then + echo "No Xauthority nor Wayland display, using curses" >&2 + flavor="curses" + fi + + if [ -z "$flavor" ]; then + echo "WARNING: pinentry flavor could not be detected, use 'curses'" >&2 + flavor="curses" + fi + + declare -A pinentryFlavors + pinentryFlavors["qt"]="${pinentry.qt}" + pinentryFlavors["gtk2"]="${pinentry.gtk2}" + pinentryFlavors["gnome"]="${pinentry.gnome3}" + pinentryFlavors["curses"]="${pinentry.curses}" + + echo "Selected flavor: $flavor" >&2 + + exec ''${pinentryFlavors[$flavor]}/bin/pinentry +'' +