Vim で auth-source ライクなパスワード秘匿プラグインを作った


vim-pass

以前から、gpg活用のひとつとして Pass: The Standard Unix Password Manager のフレームワークを使っていました。

それとは別としてemacsでは、設定ファイル内の秘匿情報についてauth-sourceで暗号化できる仕組があり、有用性を感じていました。(こちらは専用のファイルに暗号化して保存する)

結果、Vimで(目標は)password-store形式のデータのAPIを整備しつつ、auth-sourceの利便性を持ち込もうとし、その結果となります。

まだまだ不具合だらけかもしれませんが(とくに異常系はあまり試せてない、CIとテストないし...)、どうぞよろしく。

用法

README参照

" in vimrc
" configured at end of vim startup
call pass#get_startup('g:test_gh_token','Develop/Github')
call pass#get_startup('g:test_gh_username','Develop/Github','username')

function! test() abort
  let password = pass#get('Service/foobar')
  " ...
endfunction
# in plugin setting(dein's toml)
[[plugins]]
repo = 'tsuyoshicho/vim-pass'

[[plugins]] # https://pixe.la/
repo = 'mattn/vim-pixela'
depends = ['open-browser.vim','vim-pass']
hook_add = '''
  " let g:pixela_username = 'user'
  " let g:pixela_token    = 'token'

  call pass#get_startup('g:pixela_username','Develop/Pixela','username')
  " VimPixela work OK
  call pass#get_startup('g:pixela_token','Develop/Pixela')
  " startup-time countup do not correct work.
  " It work or does not work depending on the processing order of events
'''

[[plugins]] # Slack
repo = 'mizukmb/slackstatus.vim'
depends = ['webapi-vim','vim-pass']
hook_add = '''
  " let g:slackstatus_token = '<YOUR_SLACK_TOKEN>'
  " my hoge
  call pass#get_startup('g:slackstatus_token','Message/Slack/myhoge.legacy')
  " vim-jp
  " call pass#get_startup('g:slackstatus_token','Message/Slack/vim-jp.legacy')
  "
  function! s:slack_list(A,L,P) abort
    let slacklist = ['myhoge','vim-jp']
    return slacklist
  endfunction

  function s:slackstatus_change_token(team) abort
    let path = 'Message/Slack/' . a:team . '.legacy'
    let g:slackstatus_token = pass#get(path)
  endfunction

  command! -nargs=1 -complete=customlist,<SID>slack_list SlackStatusChange :call <SID>slackstatus_change_token(<f-args>)
'''

起動時にパスフレーズのキーボード入力をVim上でできませんので、起動後にまとめて設定するpass#get_setupを用意しました。
通常使いにはpass#getがあります。
コンソールモードを捨てて、gpgのpinentryまかせなら、この手間はなくていいのですが...、それやると酷いことになりますからね。

制限

なお、リモートでは強制でpinentryなし環境の設定にしていますが、ローカルかつnon-GUIな環境だと手動設定しないと悲惨なことになると思います(未テスト)

他にも
- 目標は十分な操作APIだけど、現状はgetのみ
- Vimレジスタに転写し、一定時間後に消滅するAPIを考えていますが、これも未整備
- デフォルト項目のパスワード以外を指定した場合について、その項目の確認は文字列比較(exact match)
- 起動時に~といいつつ、起動時に値が設定されていることが必要なプラグインの設定値について、VimEnterのイベント処理の順序によっては、期待する動作をしたりしなかったりがある

と制限てんこもりです。

あとがき

メンテどれだけがんばれるかわかんないので、派生大歓迎。