🔑

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

2020/10/11に公開

この記事は Vim で auth-source ライクなパスワード秘匿プラグインを作った - Qiita と同じものです。


vim-pass

Github card: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のイベント処理の順序によっては、期待する動作をしたりしなかったりがある(別途API作成により解決済み)

と制限てんこもりです。

あとがき

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

Discussion