diff --git a/autoload/pass/get.vim b/autoload/pass/get.vim index ea3d2e5..a0eec2c 100644 --- a/autoload/pass/get.vim +++ b/autoload/pass/get.vim @@ -69,28 +69,39 @@ endfunction " '' or passphrase function! pass#get#passphrase() abort - if exists('s:_passphrase') - return s:_passphrase + if exists('s:_get_passphrase') + return s:_get_passphrase() endif " passphrase detect - let s:_passphrase = '' if g:pass_use_agent " work pinentry - return s:_passphrase + return '' endif " check loop + let s:_passphrase = '' + for i in range(g:pass_passphrase_verify_retry) let s:_passphrase = inputsecret('passphrase: ') " verify if pass#util#passphrase_verify(pass#get#id(), s:_passphrase) " success redraw! + " setup passphrase closure + function! s:_generate_get_passphrase_closure(passphrase) + return {-> a:passphrase} + endfunction + + let s:_get_passphrase = s:_generate_get_passphrase_closure(s:_passphrase) + + unlet s:_passphrase " exit break endif + unlet s:_passphrase + " failure redraw! if (i + 1) == g:pass_passphrase_verify_retry @@ -98,7 +109,7 @@ function! pass#get#passphrase() abort \ string(i + 1) . '/' . \ string(g:pass_passphrase_verify_retry) . ']' . \ ' abort' - unlet s:_passphrase + " All failed, throw exception throw 'vim-pss: passphrase verify all failed' else echo 'passphrase verify failed [' . @@ -110,7 +121,8 @@ function! pass#get#passphrase() abort endif endfor - return get(s:, '_passphrase', '') + " Passed verification + return s:_get_passphrase() endfunction " path