#!/usr/bin/env bash # Prompts for a pass entry, then for a specific field. Similar to passmenu, but # uses rofi, and can resume from a previous session. # # Example: passmenu [RESUME] ROFI_CMD='rofi -dmenu -theme theme/passmenu.rasi' ROFI_MSG_CMD='rofi -theme theme/passmenu.rasi -markup -e' set -e shopt -s nullglob globstar for prog in xclip pass; do if ! command -v "$prog" >/dev/null; then >&2 echo "$prog not installed, aborting" exit 1 fi done if [[ $1 == -r ]]; then resume=1; shift fi url= # Get qutebrowser's current url win=$(xdotool getactivewindow) if [[ -n $win ]]; then winname=$(xdotool getwindowname $win) if [[ $winname =~ " - Mozilla Firefox$" ]]; then url=${winname% - Mozilla*} url=${url##* - } while (( ${#url//[^.]/} > 1 )); do url=${url#*.} done fi fi LAST_ENTRY_FILE=/tmp/_upm if [[ -n $resume && -f $LAST_ENTRY_FILE ]]; then entry="$(<$LAST_ENTRY_FILE)" else prefix=${PASSWORD_STORE_DIR-~/.password-store} password_files=( "$prefix"/**/*.gpg ) password_files=( "${password_files[@]#"$prefix"/}" ) password_files=( "${password_files[@]%.gpg}" ) entry=$(printf "%s\n" "${password_files[@]}" | $ROFI_CMD -p "..." -filter "$url") fi if [[ -z $entry ]]; then $ROFI_MSG_CMD "Failed to select $entry" exit 1 fi echo "$entry" >/tmp/_upm secrets="$(pass show "$entry")" if [[ -n $secrets ]]; then fields=$(awk -F': ' 'NR>1 && !/^otpauth:/ {print $1}' <<<"$secrets") field=$(printf "password\n%s\notp\n" "${fields[@]}" | $ROFI_CMD -p "$entry") case $field in password) pass -c "$entry" ;; otp) printf "%s" "$(pass otp -c "$entry")" ;; *) printf "%s" "$(awk -v "key=$field:" '$1 == key {print $2}' <<<"$secrets")" | xclip -selection clipboard -in ;; esac $ROFI_MSG_CMD "Copied $entry/$field to clipboard for 45s" else $ROFI_MSG_CMD "Failed to retrieve $entry" exit 2 fi