From 1622abb830aef7c9cb33442e782d78c83bb1b2ed Mon Sep 17 00:00:00 2001 From: Sorin Ionescu Date: Sat, 18 May 2013 19:27:40 -0400 Subject: [PATCH] Make gpg-agent and ssh-agent work with each other --- modules/gpg/README.md | 11 +++++++++++ modules/gpg/init.zsh | 27 ++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/modules/gpg/README.md b/modules/gpg/README.md index 05db901..b13e33e 100644 --- a/modules/gpg/README.md +++ b/modules/gpg/README.md @@ -3,6 +3,17 @@ GPG Provides for an easier use of [GPG][1] by setting up [gpg-agent][2]. +### SSH + +To enable OpenSSH Agent protocol emulation, and make `gpg-agent` a drop-in +replacement for `ssh-agent`, add the following line to +*~/.gnupg/gpg-agent.conf*: + + enable-ssh-support + +When OpenSSH Agent protocol emulation is enabled, this module will load the SSH +module for additional processing. + Authors ------- diff --git a/modules/gpg/init.zsh b/modules/gpg/init.zsh index f175942..2e4c4ea 100644 --- a/modules/gpg/init.zsh +++ b/modules/gpg/init.zsh @@ -10,19 +10,32 @@ if (( ! $+commands[gpg-agent] )); then return 1 fi -# Set the default path to the gpg-agent-info file. -_gpg_agent_info="$HOME/.gpg-agent-info" +# Set the default paths to gpg-agent files. +_gpg_agent_conf="$HOME/.gnupg/gpg-agent.conf" +_gpg_agent_env="$TMPDIR/gpg-agent.env" # Start gpg-agent if not started. -ps -U "$USER" -o ucomm | grep -q gpg-agent \ - || gpg-agent --daemon >! "$_gpg_agent_info" +if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then + eval "$(gpg-agent --daemon | tee "$_gpg_agent_env")" +else + # Export environment variables. + source "$_gpg_agent_env" 2> /dev/null +fi -# Export environment variables. +# Inform gpg-agent of the current TTY for user prompts. export GPG_TTY="$(tty)" -source "$_gpg_agent_info" + +# Integrate with the SSH module. +if grep 'enable-ssh-support' "$_gpg_agent_conf" &> /dev/null; then + # Override the ssh-agent environment file default path. + _ssh_agent_env="$_gpg_agent_env" + + # Load the SSH module for additional processing. + pmodload 'ssh' +fi # Clean up. -unset _gpg_agent_info +unset _gpg_agent_{conf,env} # Disable GUI prompts inside SSH. if [[ -n "$SSH_CONNECTION" ]]; then