diff options
author | Aaron LI <aly@aaronly.me> | 2018-02-20 22:34:56 +0800 |
---|---|---|
committer | Aaron LI <aly@aaronly.me> | 2018-02-20 22:34:56 +0800 |
commit | 6808da56ad6ecd8c1ebf7ca6a39495df4f7ebbd2 (patch) | |
tree | 80142bdab04ebf9d3de3398e912ffda275556659 /_zsh/80-gpg.zsh | |
parent | 3f80c4abe8f866d6ed730518af2289a51b5097a5 (diff) | |
download | dotfiles-6808da56ad6ecd8c1ebf7ca6a39495df4f7ebbd2.tar.bz2 |
gpg: rewrite gpg-agent handling with zsh
* do not hack to force to use `pinentry-curses` with custom `pinentry`
and `gpg2-x11` shims
* explain to use the `pinentry-gtk-2`, which will fallback to text mode
* simply launch `gpg-agent` with `gpgconf --launch`
Diffstat (limited to '_zsh/80-gpg.zsh')
-rw-r--r-- | _zsh/80-gpg.zsh | 67 |
1 files changed, 12 insertions, 55 deletions
diff --git a/_zsh/80-gpg.zsh b/_zsh/80-gpg.zsh index ef1f153..d9d5dbb 100644 --- a/_zsh/80-gpg.zsh +++ b/_zsh/80-gpg.zsh @@ -3,75 +3,32 @@ # # NOTE: -# ZSH is configured to launch `gpg-agent' on login, so it may be necessary -# to disable its launch by systemd, e.g., -# $ systemctl --global --user mask --now \ -# gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket \ -# gpg-agent-extra.socket gpg-agent-browser.socket +# Install both the `pinentry-gtk-2' and `pinentry-curses', and symlink +# `pinentry-gtk-2' to `pinentry' as the default pinentry program, which +# will fallback to the text mode when X11 is not avaiable (i.e., +# `$DISPLAY' is not set), e.g., through SSH logins. +# `pinentry-gnome3' seems to have problem that cannot fallback to the +# text mode ... (for reason unkown ...) # This `GPG_TTY' variable should be set to the correct TTY where the shell # is running. See `gpg-agent(1)' for more details. export GPG_TTY=$(tty) -# Set SSH to use `gpg-agent' as the SSH agent support is enabled -# See `gpg-agent(1)' for more details. +# Make SSH to use `gpg-agent'. unset SSH_AGENT_PID if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" fi -# Restart `gpg-agent' -restart-gpg-agent() { - local pinentry_arg - [ -x "${HOME}/bin/pinentry" ] && \ - pinentry_arg="--pinentry-program ${HOME}/bin/pinentry" || \ - pinentry_arg="" - gpgconf --kill gpg-agent >/dev/null - gpg-agent --daemon --enable-ssh-support ${pinentry_arg} >/dev/null -} - -# Let pinentry know which console to display in for `ssh-agent'. -# -# Since the 'ssh-agent' protocol does not contain a mechanism for telling -# the agent on which terminal/display it is running, gpg-agent's -# ssh-support can just use the TTY or X display when `gpg-agent' has been -# started, which may be before the X session startup. Therefore, when the -# switched to the X session, or login remotely through SSH, the `pinentry' -# will get popped up on whatever display the `gpg-agent' has been started -# or may just fail. In this case, a manual update is necessary. -# -# This will set startup TTY and X11 DISPLAY variables to the values of -# this session. -# -# Credits: -# * GnuPG: Commonly Seen Problems -# https://www.gnupg.org/documentation/manuals/gnupg/Common-Problems.html -# * `gpg-agent(1)': option `--enable-ssh-support' -# -update-gpg-tty() { - gpg-connect-agent updatestartuptty /bye >/dev/null 2>&1 -} - -update-pinentry-app() { - echo "term" > ${XDG_RUNTIME_DIR}/pinentry-app -} - -# Hook the above functions to be exec'ed before every command execuation -# -# Credit: http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html -# -autoload -U add-zsh-hook -zsh-preexec() { - update-gpg-tty && update-pinentry-app || true -} -add-zsh-hook preexec zsh-preexec - +# Use curses-based pinentry for SSH logins +# Credit: https://wiki.gentoo.org/wiki/GnuPG +if [ -n "${SSH_CONNECTION}" ] ;then + export PINENTRY_USER_DATA="USE_CURSES=1" +fi # Delete all identities from the `gpg-agent', which is similar to # `ssh-add -D`. -# # Credit: http://blog.mrloop.com/workflow/2017/02/09/pin-entry.html -# ssh-delete() { grep -o '^[A-Z0-9]*' ${HOME}/.gnupg/sshcontrol | \ xargs -I'%' rm ${HOME}/.gnupg/private-keys-v1.d/'%'.key |