Setup agent handling after determining gnupg's version

Starting with release 2.1, gnupg will automatically run gpg-agent rather
than requiring it to be run as a daemon.  The “--no-use-agent” switch
was also marked deprecated, since it no longer does anything.

This commit moves the --(no-)use-agent handling until after it is known
what version of gpg is being used.

Closes #37

Signed-off-by: James McCoy <vega.james@gmail.com>
This commit is contained in:
James McCoy 2015-07-16 23:13:12 -04:00
parent dd8e4adb4d
commit ac5d94519e
No known key found for this signature in database
GPG Key ID: DFE691AE331BA3DB

View File

@ -1,5 +1,5 @@
" Name: gnupg.vim " Name: gnupg.vim
" Last Change: 2015 Mar 21 " Last Change: 2015 Jul 16
" Maintainer: James McCoy <vega.james@gmail.com> " Maintainer: James McCoy <vega.james@gmail.com>
" Original Author: Markus Braun <markus.braun@krawel.de> " Original Author: Markus Braun <markus.braun@krawel.de>
" Summary: Vim plugin for transparent editing of gpg encrypted files. " Summary: Vim plugin for transparent editing of gpg encrypted files.
@ -298,36 +298,7 @@ function s:GPGInit(bufread)
" print version " print version
call s:GPGDebug(1, "gnupg.vim ". g:loaded_gnupg) call s:GPGDebug(1, "gnupg.vim ". g:loaded_gnupg)
" determine if gnupg can use the gpg-agent let s:GPGCommand = g:GPGExecutable
if (exists("$GPG_AGENT_INFO") && g:GPGUseAgent == 1)
if (!exists("$GPG_TTY") && !has("gui_running"))
" Need to determine the associated tty by running a command in the
" shell. We can't use system() here because that doesn't run in a shell
" connected to a tty, so it's rather useless.
"
" Save/restore &modified so the buffer isn't incorrectly marked as
" modified just by detecting the correct tty value.
" Do the &undolevels dance so the :read and :delete don't get added into
" the undo tree, as the user needn't be aware of these.
let [mod, levels] = [&l:modified, &undolevels]
set undolevels=-1
silent read !tty
let $GPG_TTY = getline('.')
silent delete
let [&l:modified, &undolevels] = [mod, levels]
" redraw is needed since we're using silent to run !tty, c.f. :help :!
redraw!
if (v:shell_error)
let $GPG_TTY = ""
echohl GPGWarning
echom "$GPG_TTY is not set and the `tty` command failed! gpg-agent might not work."
echohl None
endif
endif
let s:GPGCommand = g:GPGExecutable . " --use-agent"
else
let s:GPGCommand = g:GPGExecutable . " --no-use-agent"
endif
" don't use tty in gvim except for windows: we get their a tty for free. " don't use tty in gvim except for windows: we get their a tty for free.
" FIXME find a better way to avoid an error. " FIXME find a better way to avoid an error.
@ -372,11 +343,43 @@ function s:GPGInit(bufread)
" find the supported algorithms " find the supported algorithms
let output = s:GPGSystem({ 'level': 2, 'args': '--version' }) let output = s:GPGSystem({ 'level': 2, 'args': '--version' })
let gpgversion = substitute(output, '^gpg (GnuPG) \([0-9]\+\.\d\+\).*', '\1', '')
let s:GPGPubkey = substitute(output, ".*Pubkey: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGPubkey = substitute(output, ".*Pubkey: \\(.\\{-}\\)\n.*", "\\1", "")
let s:GPGCipher = substitute(output, ".*Cipher: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGCipher = substitute(output, ".*Cipher: \\(.\\{-}\\)\n.*", "\\1", "")
let s:GPGHash = substitute(output, ".*Hash: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGHash = substitute(output, ".*Hash: \\(.\\{-}\\)\n.*", "\\1", "")
let s:GPGCompress = substitute(output, ".*Compress.\\{-}: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGCompress = substitute(output, ".*Compress.\\{-}: \\(.\\{-}\\)\n.*", "\\1", "")
" determine if gnupg can use the gpg-agent
if (str2float(gpgversion) >= 2.1 || (exists("$GPG_AGENT_INFO") && g:GPGUseAgent == 1))
if (!exists("$GPG_TTY") && !has("gui_running"))
" Need to determine the associated tty by running a command in the
" shell. We can't use system() here because that doesn't run in a shell
" connected to a tty, so it's rather useless.
"
" Save/restore &modified so the buffer isn't incorrectly marked as
" modified just by detecting the correct tty value.
" Do the &undolevels dance so the :read and :delete don't get added into
" the undo tree, as the user needn't be aware of these.
let [mod, levels] = [&l:modified, &undolevels]
set undolevels=-1
silent read !tty
let $GPG_TTY = getline('.')
silent delete
let [&l:modified, &undolevels] = [mod, levels]
" redraw is needed since we're using silent to run !tty, c.f. :help :!
redraw!
if (v:shell_error)
let $GPG_TTY = ""
echohl GPGWarning
echom "$GPG_TTY is not set and the `tty` command failed! gpg-agent might not work."
echohl None
endif
endif
let s:GPGCommand = s:GPGCommand . " --use-agent"
else
let s:GPGCommand = s:GPGCommand . " --no-use-agent"
endif
call s:GPGDebug(2, "public key algorithms: " . s:GPGPubkey) call s:GPGDebug(2, "public key algorithms: " . s:GPGPubkey)
call s:GPGDebug(2, "cipher algorithms: " . s:GPGCipher) call s:GPGDebug(2, "cipher algorithms: " . s:GPGCipher)
call s:GPGDebug(2, "hashing algorithms: " . s:GPGHash) call s:GPGDebug(2, "hashing algorithms: " . s:GPGHash)