refactor to use POSIX sh (linted with shellcheck)

this is the initial work needed to convert common bash-isms to POSIX
compliant solutions. This is mostly untested so probably some work will
need to be done to standardize now that the script is following best
practices for quotes, whitespace separation, and the like.
This commit is contained in:
Joel Beckmeyer 2021-11-30 10:41:47 -05:00
parent 68bc2ff66b
commit 6b340362d5

View File

@ -1,13 +1,13 @@
#!/usr/bin/env bash
#!/bin/sh
set -euo pipefail
set -eu
TYPE_CMD="wtype -"
help=0
autotype=0
_trim() {
local var="$*"
var="$*"
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
@ -17,25 +17,26 @@ _trim() {
_parse_fields() {
has_username=0
IFS=$'\n'
fields="$(pass show $password | tail -n +2 | cut -d: -f1 -s)"
field_list+="password\n"
# Note: \n can not be last, or it will be stripped by $()
IFS=$(printf '\n\t')
fields="$(pass show "$password" | tail -n +2 | cut -d: -f1 -s)"
field_list="${field_list}password\n"
for line in $fields; do
if [[ $line == "username" ]]; then
if [ "$line" = "username" ]; then
has_username=1
field_list+="$line\n"
elif [[ $line == "otpauth" ]]; then
field_list+="OTP\n"
elif [[ $line == autotype_always ]]; then
field_list="${field_list}$line\n"
elif [ "$line" = "otpauth" ]; then
field_list="${field_list}OTP\n"
elif [ "$line" = autotype_always ]; then
autotype=1
else
field_list+="$line\n"
field_list="${field_list}$line\n"
fi
done
if [[ $typeit -eq 1 ]] && [[ $has_username -eq 1 ]]; then
if [ "$typeit" -eq 1 ] && [ "$has_username" -eq 1 ]; then
printf "autotype\n"
fi
printf "$field_list"
printf '%s' "$field_list"
unset IFS
}
@ -44,12 +45,12 @@ _pass_field() {
}
_pass_get() {
if [[ $1 == "password" ]]; then
if [ "$1" = "password" ]; then
pass show "$password" | { IFS= read -r pass; printf %s "$pass"; }
elif [[ $1 == "OTP" ]]; then
elif [ "$1" = "OTP" ]; then
pass otp "$password" | tail -n1 | { IFS= read -r pass; printf %s "$pass"; }
else
printf "$(_pass_field $*)"
printf '%s' "$(_pass_field "$@")"
fi
}
@ -61,8 +62,6 @@ _usage() {
printf " -t, --type type the selection instead of copying to clipboard\n"
}
shopt -s nullglob globstar
OPTS="$(getopt --options ahst --longoptions autotype,help,squash,type -n 'wofi-pass' -- "$@")"
eval set -- "$OPTS"
while true; do
@ -76,34 +75,32 @@ while true; do
esac
done
if [[ $help -eq 1 ]]; then
echo "$(_usage)" >&2
if [ "$help" -eq 1 ]; then
_usage >&2
exit 0
fi
prefix=${PASSWORD_STORE_DIR-~/.password-store}
password_files=( "$prefix"/**/*.gpg )
password_files=( "${password_files[@]#"$prefix"/}" )
password_files=( "${password_files[@]%.gpg}" )
password_files="$(find "$prefix" -name "*.gpg" -execdir basename {} .gpg ';')"
password=$(printf '%s\n' "${password_files[@]}" | wofi --dmenu "$@")
[[ -n $password ]] || exit
password=$(printf '%s' "$password_files" | wofi --dmenu "$@")
[ -n "$password" ] || exit
field_list="$(_parse_fields)"
field_count="$(echo "$field_list" | wc -l)"
if [[ $squash -eq 1 ]] && [[ $field_count -eq 1 ]]; then
if [ "$squash" -eq 1 ] && [ "$field_count" -eq 1 ]; then
field="password"
elif [[ $autotype -ne 1 ]]; then
field=$(printf "$field_list" | wofi --dmenu)
elif [ "$autotype" -ne 1 ]; then
field=$(printf '%s' "$field_list" | wofi --dmenu)
fi
if [[ $typeit -eq 0 ]]; then
wl-copy "$(_pass_get $field)"
if [ $typeit -eq 0 ]; then
wl-copy "$(_pass_get "$field")"
else
if [[ $field == "autotype" ]] || [[ $autotype -eq 1 ]]; then
if [ "$field" = "autotype" ] || [ "$autotype" -eq 1 ]; then
username=$(_pass_get "username")
password=$(_pass_get "password")
printf "%b\t%b\n" "${username}" "${password}" | $TYPE_CMD
else
_pass_get $field | $TYPE_CMD
_pass_get "$field" | "$TYPE_CMD"
fi
fi