Bash script for copying and autotyping data from password-store, gopass or prs.

feat: add prs support

+44 -34
+9 -8
README.md
··· 2 2 3 3 [![tangled](https://img.shields.io/badge/repository-tangled-blue)](https://tangled.org/@jcg.re/tessen) 4 4 5 - `tessen` is a bash script that can autotype and copy data from [password-store][1] and [gopass][2] 6 - files. A wayland native dmenu is required to use tessen and the following dmenu backends are 7 - recognized 5 + `tessen` is a bash script that can autotype and copy data from [password-store][1], [gopass][2] 6 + and [prs][36]. A wayland native dmenu is required to use tessen and the following dmenu backends 7 + are recognized 8 8 9 9 - [fuzzel][4] 10 10 - [tofi][15] ··· 24 24 25 25 ### Why use `tessen`? 26 26 27 - - `tessen` can autotype or copy (or do both at the same time!) your password store and gopass data 28 - including all of your key-value pair data 27 + - `tessen` can autotype or copy (or do both at the same time!) your password store, gopass and prs 28 + data including all of your key-value pair data 29 29 30 30 From what the original author observed, most scripts out there do not autotype and copy all of 31 31 your key-value pair data. They also do not offer choices about autotyping or copying data with the ··· 51 51 52 52 - [bash][16] 53 53 54 - - at least one pass backend is needed - either [password-store][1] or [gopass][2] 54 + - at least one pass backend is needed - either [password-store][1], [gopass][2] or [prs][36] 55 55 56 56 - at least one Wayland native dmenu backend, preferably [fuzzel][4], or [tofi][15], [bemenu][5], 57 57 [yofi][32], [wofi][6], [rofi][3] ··· 130 130 131 131 ## Features 132 132 133 - - autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass 134 - and gopass 133 + - autotype or copy (or both at the same time!) data, including all valid key-value pairs, in pass, 134 + gopass and prs 135 135 - generate TOTP/HOTP 136 136 - open URLs 137 137 - use custom values for `user`, `password`, `url`, `autotype` keys ··· 228 228 [33]: https://social.treehouse.systems/@psykose/109967460650885493 229 229 [34]: https://pkgs.alpinelinux.org/packages?name=tessen 230 230 [35]: https://search.nixos.org/packages?query=tessen 231 + [36]: https://timvisee.com/projects/prs/
+1 -1
config
··· 4 4 # configuration file for tessen 5 5 # place this file in $XDG_CONFIG_HOME/tessen/config 6 6 7 - # the default pass program to use - pass or gopass 7 + # the default pass program to use - pass, gopass or prs 8 8 # pass_backend="pass" 9 9 10 10 # the default dmenu backend program to use - rofi, fuzzel, bemenu, rofi, or dmenu
+15 -15
man/tessen.1.scd
··· 2 2 3 3 # NAME 4 4 5 - tessen - autotype and copy *pass*(1) and *gopass*(1) data on wayland 5 + tessen - autotype and copy *pass*(1), *gopass*(1) and *prs*(1) data on wayland 6 6 7 7 # SYNOPSIS 8 8 ··· 11 11 # DESCRIPTION 12 12 13 13 tessen is a *bash*(1) script that helps to autotype and copy data encrypted 14 - using *pass*(1) and *gopass*(1). It can also open URLs, generate HOTP and TOTP, 15 - and execute custom autotype operations. 14 + using *pass*(1), *gopass*(1) and *prs*(1). It can also open URLs, generate HOTP 15 + and TOTP, and execute custom autotype operations. 16 16 17 17 tessen has been written for wlroots based wayland compositors like *sway*(1) 18 18 that support the virtual-keyboard-unstable-v1 protocol. It will NOT work on ··· 21 21 The options understood by tessen are: 22 22 23 23 *-p*, *--pass*, *--pass=*[pass backend] 24 - specify either *pass* or *gopass* 24 + specify either *pass*, *gopass* or *prs* 25 25 26 26 *-d*, *--dmenu*, *--dmenu=*[dmenu backend] 27 27 specify a dmenu backend - the list of recognized backends are *fuzzel*, ··· 41 41 42 42 ## DEFAULT BEHAVIOR 43 43 44 - If a pass backend is not specified, tessen tries to find either one of *pass*(1) 45 - or *gopass*(1) in the order mentioned here. 44 + If a pass backend is not specified, tessen tries to find either one of 45 + *pass*(1), *gopass*(1) or *prs*(1) in the order mentioned here. 46 46 47 47 tessen assumes that the data organization format is the same as mentioned on 48 - the home page of password store, when using *pass*(1) and *gopass*(1) 48 + the home page of password store, when using *pass*(1), *gopass*(1) and *prs*(1) 49 49 50 50 https://www.passwordstore.org/#organization 51 51 ··· 67 67 If an action is not specified, tessen shows an additional menu with the option 68 68 to either autotype or copy data. 69 69 70 - If data is copied, it will be removed from the clipboard after 71 - *PASSWORD_STORE_CLIP_TIME* when using *pass*(1) and after *cliptimeout* when 72 - using *gopass*(1). If *PASSWORD_STORE_CLIP_TIME* is not set, a default value of 73 - 15 seconds is assumed. 70 + If data is copied, it will be removed from the clipboard after a timeout. The 71 + timeout is read from *PASSWORD_STORE_CLIP_TIME* when using *pass*(1) and from 72 + *cliptimeout* when using *gopass*(1). If no timeout is found, it falls back to a 73 + default of 15 seconds. 74 74 75 75 A delay of 100 milliseconds will be used between successive autotype operations. 76 76 This can be changed using the 'delay' option in the *tessen*(5) configuration ··· 95 95 - *bash*(1) 96 96 - at least one wayland native dmenu backend - *fuzzel*(1), *tofi*(1), 97 97 *bemenu*(1), *wofi*(1), *rofi*(1), *dmenu* 98 - - at least one pass backend - either *pass*(1) or *gopass*(1) 98 + - at least one pass backend - either *pass*(1), *gopass*(1) or *prs*(1) 99 99 - *wtype*(1) (if you want to autotype data) 100 100 - *wl-clipboard*(1) (if you want to copy and paste data) 101 101 - *scdoc*(1) (optional, to build this man page) ··· 117 117 *tessen*(5) config file. 118 118 119 119 The *otpauth://* format is supported and used if *pass-otp*(1) is installed when 120 - using *pass*(1). *gopass*(1) supports this feature natively. 120 + using *pass*(1). *gopass*(1) and *prs*(1) support this feature natively. 121 121 122 122 A value for the 'autotype' key can be specified in password files for custom 123 123 autotype behavior which overrides the default behavior of autotyping the ··· 191 191 192 192 # SEE ALSO 193 193 194 - *tessen*(5), *pass*(1), *gopass*(1) *pass-otp*(1), *fuzzel*(1), *tofi*(1), 195 - *bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1), 194 + *tessen*(5), *pass*(1), *gopass*(1), *prs*(1), *pass-otp*(1), *fuzzel*(1), 195 + **tofi*(1), bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1), 196 196 *notify-send*(1) 197 197 198 198 # AUTHORS
+4 -4
man/tessen.5.scd
··· 35 35 36 36 *pass_backend* 37 37 38 - The default pass backend to use - either *pass*(1) or *gopass*(1) 38 + The default pass backend to use - either *pass*(1), *gopass*(1) or *prs*(1) 39 39 40 40 *dmenu_backend* 41 41 ··· 134 134 135 135 # SEE ALSO 136 136 137 - *tessen*(5), *pass*(1), *gopass*(1) *pass-otp*(1), *fuzzel*(1), *tofi*(1), 138 - *bemenu*(1), *wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1), 139 - *notify-send*(1) 137 + *tessen*(5), *pass*(1), *gopass*(1), *prs*(1), *pass-otp*(1), *fuzzel*(1), 138 + ***tofi*(1), bemenu*(1), wofi*(1), *rofi*(1), *wl-clipboard*(1), *wtype*(1), 139 + **notify-send*(1) 140 140 141 141 # AUTHORS 142 142
+15 -6
tessen
··· 100 100 if [[ ${#passdata[@]} -eq 0 ]]; then 101 101 _die "the selected file is empty" 102 102 fi 103 + elif [[ $_PASS_BACKEND == "prs" ]]; then 104 + mapfile -t passdata < <(prs show --quiet "$_TSN_PASSFILE") 105 + if [[ ${#passdata[@]} -eq 0 ]]; then 106 + _die "the selected file is empty" 107 + fi 103 108 elif [[ $_PASS_BACKEND == "gopass" ]]; then 104 109 # the output from gopass show -n -f that prints the first line and the 105 110 # newline before EOF doesn't use file descriptors but is printed only when ··· 314 319 315 320 if [[ $_PASS_BACKEND == "pass" ]]; then 316 321 tmp_otp="$(pass otp "$_TSN_PASSFILE")" 322 + elif [[ $_PASS_BACKEND == "prs" ]]; then 323 + tmp_otp="$(prs otp show --quiet "$_TSN_PASSFILE")" 317 324 elif [[ $_PASS_BACKEND == "gopass" ]]; then 318 325 tmp_otp="$(gopass otp -o "$_TSN_PASSFILE")" 319 326 fi ··· 394 401 printf "%s\n" "invalid clipboard timeout value in PASSWORD_STORE_CLIP_TIME" >&2 395 402 return 1 396 403 fi 404 + elif [[ $_PASS_BACKEND == "prs" ]]; then 405 + tsn_cliptime="15" 397 406 elif [[ $_PASS_BACKEND == "gopass" ]]; then 398 407 tsn_cliptime="$(gopass config core.cliptimeout)" 399 408 tsn_cliptime="${tsn_cliptime##*: }" ··· 430 439 431 440 validate_pass_backend() { 432 441 if ! is_installed "$1"; then 433 - _die "please install a valid password store backend: pass | gopass" 442 + _die "please install a valid password store backend: pass | gopass | prs" 434 443 fi 435 - if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]]; then 444 + if [[ $1 == "pass" ]] || [[ $1 == "gopass" ]] || [[ $1 == "prs" ]]; then 436 445 _PASS_BACKEND="$1" 437 446 else 438 - _die "please specify a valid password store backend: pass | gopass" 447 + _die "please specify a valid password store backend: pass | gopass | prs" 439 448 fi 440 449 } 441 450 ··· 526 535 } 527 536 528 537 find_pass_backend() { 529 - local -a tmp_pass_arr=('pass' 'gopass') 538 + local -a tmp_pass_arr=('pass' 'gopass' 'prs') 530 539 local idx 531 540 532 541 for idx in "${tmp_pass_arr[@]}"; do ··· 536 545 fi 537 546 done 538 547 if [[ -z $_PASS_BACKEND ]]; then 539 - _die "please install a valid password store backend: pass | gopass" 548 + _die "please install a valid password store backend: pass | gopass | prs" 540 549 fi 541 550 542 551 unset -v idx tmp_pass_arr ··· 811 820 fi 812 821 813 822 trap '_clear' EXIT TERM INT 814 - if [[ $_PASS_BACKEND == "pass" ]]; then 823 + if [[ $_PASS_BACKEND == "pass" ]] || [[ $_PASS_BACKEND == "prs" ]]; then 815 824 get_pass_files 816 825 elif [[ $_PASS_BACKEND == "gopass" ]]; then 817 826 get_gopass_files