#!/bin/bash
set -eo pipefail
[ -n "$DEBUG" ] && set -x
ico=$(iconez -fs -n dialog-password-symbolic)
trap '{ notify-send -a secretmenu -i "${ico}" -c error "secretmenu: failed :(" "pipefail"; exit 1; }' ERR
secretmgr=rbw
printpass=
first=
while getopts bpP1h name; do
case ${name} in
b) secretmgr=rbw ;;
p) secretmgr=pass ;;
P) printpass=1 ;;
1) first=1 ;;
h | ?)
echo "usage: secretmenu [-bp] [-P] [-1] [query]"
echo
exit 2
;;
esac
done
shift $((OPTIND - 1))
if [ "$secretmgr" = "rbw" ] && command -v rbw >/dev/null 2>&1; then
__list_secrets() {
rbw list --fields user,name | tr '\t' '@'
}
__query_secret() {
rbw get --full $(awk -F@ '{print $2 " " $1}' <<<"$1") 2>&1
}
fi
if [ "$secretmgr" = "pass" ] && command -v pass >/dev/null 2>&1; then
__list_secrets() {
prefix=${PASSWORD_STORE_DIR-~/.password-store}
prefix=$(readlink -f -- "${prefix}")
fd -e gpg . "${prefix}" |
sed -e "s#${prefix}/##" -e 's#\.gpg$##'
}
__query_secret() {
pass show "$1" 2>&1
}
fi
if [ -n "$printpass" ]; then
__handle() {
awk 'NR==1 {print $0;hit+=1} END{if(hit==0){print("no secret found") >/dev/stderr; exit(1);}}'
}
else
__handle() {
awk 'NR==1 {system("wl-copy -n " $0);hit+=1} /^Username:/ {system("wl-copy -n -p " $2);hit+=1} END{if(hit==0){print("no secret found") >/dev/stderr; exit(1);}}'
}
fi
# check requirements
for tool in bemenu fd fzf $secretmgr; do
if ! command -v "$tool" >/dev/null; then
printf "%s: %s not installed but required\n" "$(basename "$0")" "$tool" >&2
exit 1
fi
done
# TODO:
# typeit=
# if [ "$1" = "--type" ]; then
# typeit=1
# shift
# fi
__menu() {
if [ -n "$first" ]; then
grep "$@" | head -n1
return
fi
if [ -t 1 ]; then
echo "terminal mode not implemented"
exit 1
fi
MENU_PROMPT=" secret" menu --accept-single ${@:+--filter "$@"}
}
pw=$({
__list_secrets
echo ">>pass"
echo ">>rbw"
} |
__menu "$@")
case "$pw" in
"") exit 1 ;;
">>pass") exec "$0" -p ;;
">>rbw") exec "$0" -b ;;
esac
__query_secret "$pw" | __handle
# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
notify-send \
-a secretmenu \
-i "${ico}" \
'secretmenu: secret copied' \
'will be removed after next paste'
else
notify-send \
-a passmenu \
-i "${ico}" \
-c error \
'secretmenu: failed :(' \
"check stderr for details"
exit 1
fi