From 6dd9af9eaa67b391d744c7e78410543078aa9d56 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Sun, 14 Nov 2021 14:39:39 +0530 Subject: 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. --- tessen | 136 +++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 55 deletions(-) (limited to 'tessen') diff --git a/tessen b/tessen index ee6b74c..58500ec 100755 --- 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 -- cgit v1.2.3