#! /bin/sh # usage: otpmenu [--phase2-method=METHOD] # where METHOD is either copy or type, type being the default. set -efu #PATH= while test $# -gt 0; do case $1 in --phase2-method=copy|--phase2-method=type) export FZMENU_PHASE2_METHOD=${1#*=} shift 1 ;; *) echo "$0: error: bad argument: $1" >&2 exit 1 esac done case ${FZMENU_PHASE-0} in 0) export FZMENU_PHASE=1 exec setsid -f terminal dash "$0" ;; 1) if result=$( PASSWORD_STORE_DIR=${PASSWORD_STORE_DIR-$HOME/.password-store} FZF_DEFAULT_OPTS=${FZMENU_FZF_DEFAULT_OPTS-} if test -n "$FZF_DEFAULT_OPTS"; then export FZF_DEFAULT_OPTS fi find -L "$PASSWORD_STORE_DIR" -type f -name 'otp.gpg' | awk -F / -v PASSWORD_STORE_DIR="$PASSWORD_STORE_DIR" ' { n = length(PASSWORD_STORE_DIR "/") } $NF == "otp.gpg" { print substr($0, 1 + n, length($0)-length("/otp.gpg")-n) } ' | exec fzf \ --history=/dev/null \ --no-sort \ --prompt="${FZMENU_PHASE2_METHOD-type} otp: " \ ) then export FZMENU_PHASE=2 export FZMENU_RESULT="$result" setsid -f "$0" fi ;; 2) # Specify a font, so xvkbd doesn't use the potentially missing # lucidatypewriter, causing a warning to be printed to stderr. font='-*-clean-*-*-*-*-*-*-*-*-*-*-iso10646-1' pass=$(pass otp code "$FZMENU_RESULT/otp") case ${FZMENU_PHASE2_METHOD-type} in copy) printf %s "$pass" | xsel -p -i -t 60000 ;; type) printf %s "$pass" | xvkbd -xrm "xvkbd*Font: $font" -xsendevent -file - ;; *) echo "$0: error: bad phase2 method: $FZMENU_PHASE2_METHOD" >&2 exit -1 esac ;; *) echo "$0: error: bad phase: $FZMENU_PHASE" >&2 exit -1 esac