69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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'
 | |
| MSG_CMD='notify-send'
 | |
| 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
 | |
|   $MSG_CMD "Error!" "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
 | |
|   $MSG_CMD "Success!" "Copied <b>$entry/$field</b> to clipboard for 45s"
 | |
| else
 | |
|   $MSG_CMD "Error!" "Failed to retrieve $entry"
 | |
|   exit 2
 | |
| fi
 |