fuzzy-bitwarden-clipboard/bwc

98 lines
2.2 KiB
Bash
Executable file

#!/bin/zsh
set -ef
local scriptname=$(basename "$0")
local sessionfile="$HOME/.bitwarden_session"
get_saved_sessionkey () {
sudo touch $sessionfile
echo $(sudo cat $sessionfile)
}
save_sessionkey () {
local sessionkey=$1
sudo chmod 600 $sessionfile
sudo sh -c "echo $sessionkey > $sessionfile"
}
process_item () {
local id=$1
local login=$2
local sessionkey=$3
echo ""
echo "$(jq -r ".id" <<< $login)"
echo "$(jq -r ".name" <<< $login)"
echo ""
local username="$(jq -r ".login.username" <<< $login)"
echo $username | xclip -sel clip
echo "Username '$username' copied to clipboard."
read -s -k $'?[Press any key to copy the password]\n'
jq -r ".login.password" <<< $login | xclip -sel clip
echo "Password copied to clipboard."
local totp=$(jq -r ".login.totp" <<< $login)
if [[ $totp != "" && $totp != "null" ]]; then
read -s -k $'[Press any key to copy the TOTP Token]\n'
bw get totp $id --session $sessionkey | xclip -sel clip
echo "Token copied to clipboard."
fi
}
main() {
# Check the search term
local searchterm=$1
if [[ -z $searchterm ]] ; then
echo "Usage: $scriptname <search-term>"
exit 1
fi
# Check the session key
local sessionkey=$(get_saved_sessionkey)
if [[ -z $sessionkey ]] ; then
# Get and save a new session key
sessionkey=$(bw unlock --raw)
save_sessionkey $sessionkey
else
echo "Using the existing session key from '$sessionfile'."
fi
# Get a list of matching items
echo "Searching for '$searchterm'..."
local logins=$(bw list items \
--search "$searchterm" \
--session "$sessionkey" \
--nointeraction
)
if [[ -z $logins ]] ; then
sudo rm $sessionfile
echo "The existing session key is invalid and has been deleted."
exit 0
fi
# Pick one with the fzf
local id=$(
jq -r '.[] | "\(.name)\t\(.login.username)\t\(.id)"' <<< $logins \
| fzf --reverse --with-nth=1,2 --delimiter="\t" --select-1 --exit-0 \
| awk -F"\t" '{print $3}'
)
if [[ -n $id ]]; then
# Process the selected item
local login="$(jq ".[] | select(.id == \"$id\")" <<< $logins)"
process_item $id $login $sessionkey
else
echo "No entry found. You might want to run 'bw sync' and try again."
fi
}
main "$@"