aboutsummaryrefslogtreecommitdiffstats
path: root/_zsh/80-gpg.zsh
diff options
context:
space:
mode:
authorAaron LI <aly@aaronly.me>2018-02-20 22:34:56 +0800
committerAaron LI <aly@aaronly.me>2018-02-20 22:34:56 +0800
commit6808da56ad6ecd8c1ebf7ca6a39495df4f7ebbd2 (patch)
tree80142bdab04ebf9d3de3398e912ffda275556659 /_zsh/80-gpg.zsh
parent3f80c4abe8f866d6ed730518af2289a51b5097a5 (diff)
downloaddotfiles-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.zsh67
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