Compare commits

...

9 Commits

Author SHA1 Message Date
c5a5f300fb add archive note to README 2023-02-15 17:15:02 -05:00
6de507d9d7 cleanup copy/type custom command logic 2023-02-15 17:13:33 -05:00
869c5450bd improve copy/type defaulting logic 2022-10-28 13:06:53 -04:00
5fc2f0a242 set copy command so defaulting works properly 2022-10-28 11:40:21 -04:00
29decbf0c2 fix logic error when --autotype is set 2022-09-26 16:32:55 -04:00
15269b633a add support for user-supplied copy/type commands 2022-08-19 13:38:16 -04:00
42699fdbcb add option to use filename as username 2022-08-19 09:36:32 -04:00
8a517c5172
Merge pull request #1 from schmidtandreas/fix-missing-inits
Fix missing variable initializations
2022-08-19 08:44:01 -04:00
Andreas Schmidt
5c9fa17872
fix missing variable initializations
Signed-off-by: Andreas Schmidt <andreas.schmidt@claas.com>
2022-01-17 11:14:04 +01:00
2 changed files with 98 additions and 27 deletions

View File

@ -1,10 +1,15 @@
# ARCHIVED AS I NO LONGER REGULARLY USE THIS.
# wofi-pass
```
Usage: wofi-pass [options]
-a, --autotype autotype whatever entry is chosen
-c, --copy [cmd] copy to clipboard. Defaults to wl-copy if no cmd is given.
-f, --fileisuser use the name of the password file as username
-h, --help show this help message
-s, --squash don't show field choice if password file only contains password
-t, --type type the selection instead of copying to clipboard
-t, --type [cmd] type the selection instead of copying to clipboard.
Defaults to wtype if no cmd is given.
```
Since `wofi` isn't a drop-in replacement for `rofi`, I couldn't use
@ -37,7 +42,3 @@ the field choice dialogue when there is only a password in the file.
The `-t | --type` flag tells `wofi-pass` to type the choice instead of copying
to clipboard. This also enables the autotype choice which types
`username :tab password`.
## Disclaimer???
I know this script needs some work; it was mostly hacked together in an
afternoon to get the minimum functionality I needed.

View File

@ -2,9 +2,16 @@
set -eu
help=0
autotype=0
TYPE_CMD="wl-copy"
copyisset=0
fileisuser=0
help=0
onlypassword=0
squash=0
typeisset=0
COPY_CMD="wl-copy"
TYPE_CMD="wtype -"
_trim() {
var="$*"
@ -22,6 +29,12 @@ _parse_fields() {
fields="$(pass show "$password" | tail -n +2 | cut -d: -f1 -s)"
field_list="password
"
if [ "$fileisuser" -eq 1 ]; then
has_username=1
line="username"
field_list="$field_list$line
"
fi
for line in $fields; do
if [ "$line" = "username" ]; then
has_username=1
@ -37,7 +50,7 @@ _parse_fields() {
"
fi
done
if [ "$TYPE_CMD" = "wtype -" ] && [ "$has_username" -eq 1 ]; then
if [ "$typeisset" -eq 1 ] && [ "$has_username" -eq 1 ]; then
printf "autotype
"
fi
@ -53,6 +66,8 @@ _pass_get() {
pass show "$password" | { IFS= read -r pass; printf %s "$pass"; }
elif [ "$1" = "OTP" ]; then
pass otp "$password" | tail -n1 | { IFS= read -r pass; printf %s "$pass"; }
elif [ "$fileisuser" -eq 1 ] && [ "$1" = "username" ]; then
printf %s "$passname"
else
_pass_field "$@"
fi
@ -61,19 +76,42 @@ _pass_get() {
_usage() {
printf "Usage: wofi-pass [options]\n"
printf " -a, --autotype autotype whatever entry is chosen\n"
printf " -c, --copy=[cmd] copy to clipboard. Defaults to wl-copy if no cmd is given.\n"
printf " -f, --fileisuser use the name of the password file as username\n"
printf " -h, --help show this help message\n"
printf " -s, --squash don't show field choice if password file only contains password\n"
printf " -t, --type type the selection instead of copying to clipboard\n"
printf " -t, --type=[cmd] type the selection instead of copying to clipboard.\n"
printf " Defaults to wtype if no cmd is given.\n"
}
OPTS="$(getopt --options ahst --longoptions autotype,help,squash,type -n 'wofi-pass' -- "$@")"
OPTS="$(getopt --options ac::fhst:: --longoptions autotype,copy::,fileisuser,help,squash,type:: -n 'wofi-pass' -- "$@")"
eval set -- "$OPTS"
while true; do
case "$1" in
-a | --autotype ) autotype=1; shift ;;
-c ) copyisset=1; copy_cmd="$COPY_CMD"; shift ;;
--copy )
copyisset=1
if [ -n "$2" ]; then
copy_cmd="$2"
shift 2
else
copy_cmd="$COPY_CMD"
shift
fi ;;
-f | --fileisuser ) fileisuser=1; shift;;
-h | --help ) help=1; shift ;;
-s | --squash ) squash=1; shift ;;
-t | --type ) TYPE_CMD="wtype -"; shift;;
-t ) typeisset=1; type_cmd="$TYPE_CMD"; shift ;;
--type )
typeisset=1
if [ -n "$2" ]; then
type_cmd="$2"
shift 2
else
type_cmd="$TYPE_CMD"
shift
fi ;;
-- ) shift; break;;
* ) break;;
esac
@ -84,23 +122,55 @@ if [ "$help" -eq 1 ]; then
exit 0
fi
if [ "$typeisset" -eq 1 ] && [ "$copyisset" -eq 1 ]; then
printf "copy and type cannot be used at same time. Please pass only one.\n"
exit 1
elif [ "$typeisset" -eq 0 ] && [ "$copyisset" -eq 0 ]; then
printf "neither -c/--copy or -t/--type passed. Defaulting to copying with wl-copy."
copy_cmd="$COPY_CMD"
fi
cd "${PASSWORD_STORE_DIR:-$HOME/.password-store}"
password_files="$(find . -name "*.gpg" | sed "s/^\.\/\(.*\)\.gpg$/\1/")"
password=$(printf '%s\n' "$password_files" | wofi --dmenu)
[ -n "$password" ] || exit
if [ "$fileisuser" -eq 1 ]; then
passname=$(printf '%s' "$password" | sed "s,.*/\(\),\1,")
fi
field_list="$(_parse_fields)"
field_count="$(printf '%s' "$field_list" | wc -l)"
if [ "$squash" -eq 1 ] && [ "$field_count" -eq 0 ]; then
field="password"
onlypassword=1
elif [ "$autotype" -ne 1 ]; then
field=$(printf '%s\n' "$field_list" | wofi --dmenu)
fi
if [ "$field" = "autotype" ] || [ "$autotype" -eq 1 ]; then
username=$(_pass_get "username")
password=$(_pass_get "password")
printf '%s\t%s\n' "$username" "$password" | $TYPE_CMD
# get the command to output to
if [ "$typeisset" -eq 1 ]; then
output_cmd=$type_cmd
else
_pass_get "$field" | $TYPE_CMD
output_cmd=$copy_cmd
fi
if [ "$autotype" -eq 1 ] || [ "$field" = "autotype" ]; then
if [ "$fileisuser" -eq 1 ]; then
username="$passname"
else
username=$(_pass_get "username")
fi
password=$(_pass_get "password")
# check if we are autotyping a password-only file
if [ "$onlypassword" -eq 1 ]; then
printf '%s\n' "$password" | $output_cmd
else
printf '%s\t%s\n' "$username" "$password" | $output_cmd
fi
else
_pass_get "$field" | $output_cmd
fi