commit 6dd9af9eaa67b391d744c7e78410543078aa9d56
parent c6272fae4eaa724a59c096d742672f4edadd8523
Author: Ayush Agarwal <ayush@fastmail.in>
Date: Sun, 14 Nov 2021 14:39:39 +0530
refactor: improve validation checks
The validation functions have been changed to be more modular and more
resistant to invalid input. Instead of using printf to redirect error
messages to stderr and using `exit 1`, use the function `_die` which has
been changed as well. A function called `is_installed` was added as well
to check if the needed binaries are present on the system.
Diffstat:
| M | tessen | | | 136 | +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- |
1 file changed, 81 insertions(+), 55 deletions(-)
diff --git a/tessen b/tessen
@@ -44,7 +44,7 @@ get_pass_file() {
tsn_passfile="$(printf "%s\n" "${tmp_list[@]}" | "$tsn_backend" "$tsn_backend_opts")"
if ! [[ -s "$tsn_prefix/$tsn_passfile".gpg ]]; then
- exit 1
+ _die
fi
}
@@ -126,7 +126,7 @@ get_key() {
fi
done
if [[ "$flag" == "false" ]]; then
- exit 1
+ _die
fi
}
@@ -223,26 +223,52 @@ print_help() {
printf '%s\n' "For more details, visit https://github.com/ayushnix/tessen"
}
-validate_backend() {
- local -a bmn_opt
-
- if [[ "$tsn_backend" == "bemenu" ]]; then
- bmn_opt=("-i -l 10 -w --scrollbar=autohide -n")
- export BEMENU_OPTS="${BEMENU_OPTS:-${bmn_opt[*]}}"
- readonly tsn_backend="bemenu"
- readonly tsn_backend_opts=""
- elif [[ "$tsn_backend" == "rofi" ]]; then
- readonly tsn_backend="rofi"
- readonly tsn_backend_opts="-dmenu"
- elif [[ "$tsn_backend" == "wofi" ]]; then
- readonly tsn_backend="wofi"
- readonly tsn_backend_opts="-d"
+is_installed() {
+ if command -v "$1" > /dev/null 2>&1; then
+ return 0
else
- printf '%s\n' "Please specify a backend: bemenu|rofi|wofi" >&2
- exit 1
+ return 1
fi
}
+set_bemenu() {
+ local -a bmn_opt=("-i -l 10 -w --scrollbar=autohide -n")
+ readonly tsn_backend="bemenu"
+ # use BEMENU_OPTS if set by the user, otherwise use $bmn_opt
+ export BEMENU_OPTS="${BEMENU_OPTS:-${bmn_opt[*]}}"
+ # manually using bemenu options doesn't seem to work
+ readonly tsn_backend_opts=""
+}
+
+set_rofi() {
+ readonly tsn_backend="rofi" tsn_backend_opts="-dmenu"
+}
+
+set_wofi() {
+ readonly tsn_backend="wofi" tsn_backend_opts="-d"
+}
+
+assign_backend() {
+ if is_installed "bemenu"; then
+ set_bemenu
+ elif is_installed "rofi"; then
+ set_rofi
+ elif is_installed "wofi"; then
+ set_wofi
+ else
+ _die "Please install either 'bemenu', 'rofi', or 'wofi' to use ${0##*/}"
+ fi
+}
+
+validate_backend() {
+ case "$1" in
+ bemenu) set_bemenu ;;
+ rofi) set_rofi ;;
+ wofi) set_wofi ;;
+ *) _die "Please specify a valid backend: bemenu | rofi | wofi" ;;
+ esac
+}
+
validate_cliptime() {
local clip_regex
@@ -251,61 +277,65 @@ validate_cliptime() {
if [[ "$tsn_cliptime" =~ $clip_regex ]]; then
return 0
else
- printf '%s\n' "invalid clipboard time provided" >&2
- exit 1
+ _die "Invalid clipboard time provided"
fi
}
-clean() {
- {
- sleep "$tsn_cliptime" || exit 1
- wl-copy --clear
- } > /dev/null 2>&1 &
- disown
- unset -v tsn_passfile tsn_username tsn_password tsn_passdata
+validate_action() {
+ case "$1" in
+ autotype) readonly tsn_action="autotype" ;;
+ copy) readonly tsn_action="copy" ;;
+ both) readonly tsn_action="both" ;;
+ "") readonly tsn_action="" ;;
+ *) _die "Please specify a valid action: autotype | copy | both" ;;
+ esac
}
-die() {
+_clear() {
wl-copy --clear
- unset -v tsn_passfile tsn_username tsn_password tsn_passdata
+ unset -v tsn_passfile tsn_username tsn_password tsn_passdata chosen_key
+}
+
+_die() {
+ if [[ -n "$1" ]]; then
+ printf "%s\n" "$1" >&2
+ fi
+ _clear
+ exit 1
}
main() {
local _opt
- # exit if the password store directory doesn't exist
if ! [[ -d "$tsn_prefix" ]]; then
- printf '%s\n' "password store not found" >&2
- exit 1
+ _die "password store directory not found"
fi
- # parse any options given by the user
while [[ "$#" -gt 0 ]]; do
_opt="$1"
case "$_opt" in
-b | --backend)
- [[ "$#" -lt 2 ]] && {
- printf '%s\n' "Please specify a backend: bemenu|rofi|wofi" >&2
- exit 1
- }
- tsn_backend="$2"
- validate_backend
+ if [[ "$#" -lt 2 ]] || ! is_installed "$2"; then
+ _die "Please specify a valid backend: bemenu | rofi | wofi"
+ fi
+ validate_backend "$2"
shift
;;
--backend=*)
- tsn_backend="${_opt##--backend=}"
- validate_backend
+ if ! is_installed "${_opt##--backend=}"; then
+ _die "Please specify a valid backend: bemenu | rofi | wofi"
+ fi
+ validate_backend "${_opt##--backend=}"
;;
-a | --action)
- [[ "$#" -lt 2 ]] && {
- printf '%s\n' "Please specify a valid option: autotype|copy|both" >&2
- exit 1
- }
- tsn_action="$2"
+ if [[ "$#" -lt 2 ]]; then
+ _die "Please specify a valid action: autotype | copy | both"
+ fi
+ validate_action "$2"
shift
;;
--action=*)
- tsn_action="${_opt##--action=}"
+ validate_action "${_opt##--action=}"
;;
-h | --help)
print_help
@@ -319,23 +349,19 @@ main() {
shift
break
;;
- *)
- printf '%s\n' "invalid argument detected" >&2
- exit 1
- ;;
+ *) _die "invalid argument detected" ;;
esac
shift
done
unset -v _opt
- if unset -v tsn_backend_opts 2> /dev/null; then
- validate_backend
+ if [[ -z "$tsn_backend" ]]; then
+ assign_backend
fi
validate_cliptime
-
readonly tsn_action
- trap 'die' EXIT TERM
+ trap '_clear' EXIT TERM
get_pass_file
get_pass_data
key_menu