102 lines
2.0 KiB
Bash
Executable File
102 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
_help() {
|
|
echo '
|
|
2FA code viewer
|
|
|
|
Usage:
|
|
- Create a (possible encrypted) folder for your service keys
|
|
- When the service presents you the QRCode, you typically can
|
|
view the actual code as text. It looks something like:
|
|
I5XXIY3IMEWCA3LBMRSSA6LPOUQGY33PNMQQU===
|
|
- Store this piece of text in a file: "Service name".key
|
|
- Run 2fa-menu command in the folder
|
|
|
|
Viewer:
|
|
- Codes and service names are printed on the screen
|
|
|
|
'
|
|
|
|
exit
|
|
}
|
|
|
|
for (( i=1; i<=$#; i++ )); do
|
|
value=${!i}
|
|
j=$(( i + 1 ))
|
|
[[ "$value" = "--help" ]] && _help
|
|
[[ "${value}" = "-"* ]] && {
|
|
[[ "$value" =~ -.*h ]] && { _help; }
|
|
continue
|
|
}
|
|
done
|
|
|
|
which oathtool &> /dev/null || {
|
|
echo Missing oathtool
|
|
exit 1
|
|
}
|
|
which smenu &> /dev/null || {
|
|
echo Missing smenu
|
|
exit 1
|
|
}
|
|
|
|
timeadjust=0
|
|
update_frequency=30
|
|
|
|
shopt -s nullglob
|
|
|
|
_exit() {
|
|
clear
|
|
exit
|
|
}
|
|
_get_code() {
|
|
oathtool -b --totp $( cat "$1" | tr -dc '[:print:]' )
|
|
}
|
|
_print_codes() {
|
|
echo "Refresh"
|
|
even=0
|
|
for k in *key; do
|
|
name=${k%.key}
|
|
name=${name//_/ }
|
|
printf "%-${PAD_LENGTH}s [ %s ] \n" \
|
|
"$name" \
|
|
$( _get_code "$k" )
|
|
even=$(( 1 - $even ))
|
|
done
|
|
}
|
|
|
|
|
|
while true; do
|
|
clear
|
|
PAD_LENGTH=0
|
|
for key in *key; do
|
|
name=${key%.key}
|
|
if [[ ${#name} -gt $PAD_LENGTH ]]; then
|
|
PAD_LENGTH=${#name}
|
|
fi
|
|
done
|
|
|
|
set -e
|
|
new_codes=$( _print_codes )
|
|
set +e
|
|
codes=$new_codes
|
|
i=$(( ( $( date +%s ) - $timeadjust ) % $update_frequency ))
|
|
left=$(( $update_frequency - $i ))
|
|
when=$( date -d "now + $left seconds" +"%H:%M:%S" )
|
|
selected=$( echo -e "$codes" | smenu \
|
|
-M -m "Codes change in ${left}s at $when" -W $'\n' \
|
|
-t 1 -n 30 -a c:0/2 i:3 \
|
|
)
|
|
|
|
if [[ -z "$selected" ]]; then
|
|
exit
|
|
fi
|
|
if [[ "$selected" = "Refresh" ]]; then
|
|
continue
|
|
fi
|
|
code=$( echo "$selected" | rev | cut -d" " -f2 | rev )
|
|
echo Copying $code to clipboard
|
|
echo -n $code | xclip -selection clipboard 2> /dev/null
|
|
echo -n $code | xclip 2> /dev/null
|
|
countdown -n 15
|
|
exit
|
|
done
|