diff --git a/content/tips/tessen.md b/content/tips/tessen.md new file mode 100644 index 0000000..3b636e1 --- /dev/null +++ b/content/tips/tessen.md @@ -0,0 +1,113 @@ +--- +Title: Rofi's keyboard shortcut for passwordstore on Wayland +Date: 2023-07-09 15:00 +Author: Fabrice +Category: Tips +Tags: pass, rofi, tessen +Slug: tessen-shortcut +Header_Cover: ../images/covers/keyboards.jpg +Summary: How to configure keyboard inputs for rofi menu on wayland for pass +Lang: en +--- + +I recently switched from [xorg](https://x.org/) to +[wayland](https://wayland.freedesktop.org/) with [sway](https://swaywm.org/). + +One of the several roadblocks to this change lies in that some tools that +heavily rely on graphical environment are not fully compatible with wayland, +such as [barrier](https://github.com/debauchee/barrier), a keyboard, mouse and +clipboard sharing system between multiple computers. + +However, the most annoying hindrance was that alternative tools that have been +built with wayland in mind actually alter my habits too much for my comfort. One +of such tools I used is [rofi-pass](https://github.com/carnager/rofi-pass), a +wrapper around [pass]({filename}../software/pass.md) using +[rofi](https://github.com/davatorium/rofi) as a user interface. + +While using it to type passwords outside software that can integrate +[`pass`](https://passwordstore.org), I developed some habits with the default +keyboard shortcuts of `rofi-pass` such as `Alt+c` to copy the password (for a +short time) or `Alt+Return` to evaluate the `autotype` field in a password file. + +At first, we can notice that `rofi-pass` is not much more than a bash script +which gather its data from _pass/gopass_, the X11 clipboard manager and +`xdotools` to automate some actions. +As such, one solution can be to directly modify the bash script, even if it's +not [very elegant](https://git.epheme.re/fmouhart/my-pkgs/src/branch/master/rofi-pass/rofi-pass.patch). + +Now, looking more closely into the wayland tooling ecosystem, I found [tessen] +[tessen](https://github.com/ayushnix/tessen), that supports multiple dmenu-like interfaces, including `rofi` but also +a wayland-native menu system called [fuzzel](https://codeberg.org/dnkl/fuzzel). +_Tessen_ thus gather the output of these programs to enact the corresponding +request using `wl-copy/wl-paste` for the clipboard and `wtype` for typing. + +I first tried to use _fuzzel_, however, their [fuzzy +search](https://en.wikipedia.org/wiki/Approximate_string_matching) algorithm was +too different from the one used by [fzf](https://github.com/junegunn/fzf), which +is integrated in many of the everyday tools I used (such as completing commands +in my shell), and some usual shortcuts such as `Ctrl+u` to clear my search don't +seem to work natively. + +I thus decided to use `rofi` which was doing a tremendous job so far, even if it +launched through xwayland and is not considered _pure enough_ by some people. +However the `rofi-pass`-specific shortcuts don't seem to work out of the box. +Fortunately (?), the `man tessen` whispers in my ears that it is possible: + +> If the dmenu program of your choice supports custom keybindings with exit +> codes greater than or equal to 10, tessen can execute custom operations on a +> selected file in the first menu. At the very least, fuzzel(1), bemenu(1), and +> rofi(1) support this feature. + +In particular, it integrates some way to directly type and copy +[OTP](https://en.wikipedia.org/wiki/Time-based_one-time_password) codes for two +factor authentication, which is a feature that I manually patched in my +`rofi-pass` file to have “`Alt+o`” typing an OTP code. + +We now have everything we need to put it in action. +First, we have to find a way to tell rofi to send [exit +code](https://en.wikipedia.org/wiki/Exit_status) 10 on some password +description, which is nice because some configuration options in _rofi_ just do +that: +[`kb-custom-`](https://github.com/davatorium/rofi/blob/next/doc/rofi-keys.5.markdown#kb-custom-1) +allows associating some keyboard inputs to the “_9+n_” exit code. +`kb-custom-1` then sends the signal 10 and `kb-custom-9` +sends 20. +It seems obvious now, but it was not written clearly in the documentation, and I +first used `kb-custom-10` hoping it will send signal 10… I don't have to tell +you that it didn't work as intended. +Luckily I found a [reddit +comment](https://www.reddit.com/r/linuxquestions/comments/tw8x5j/comment/i3edajm/) +that explained it to me. + +Putting everything togethere, it leads to the following configuration file +`$HOME/.config/rofi/tessen.rasi`: + +```rasi +configuration { + /* Tessen */ + kb-custom-1: "Alt+Return"; /* autotype */ + kb-custom-2: "Alt+u"; /* autotype user */ + kb-custom-3: "Alt+p"; /* autotype password */ + kb-custom-5: "Alt+t"; /* copy user */ + kb-custom-6: "Alt+c"; /* copy password */ + kb-custom-8: "Alt+o"; /* autotype otp */ +} +@import "config" /* import default config */ +``` + +I initially tried to add it to rofi general-purpose configuration file, +`$XDG_CONFIG_HOME/rofi/config.rasi`, but it conflicted with `rofimoji` shortcuts +which didn't hesitate to explain the situation. + +The final step is to integrate this to tessen, which can be done in the configuration file `$XDG_CONFIG_HOME/tessen/config`: + +```sh +dmenu_backend="rofi" +rofi_config_file="$HOME/.config/rofi/tessen.rasi" +``` + +For some unknown reason that I didn't look deep inside, `$XDG_CONFIG_HOME` does +not work unlike what is hinted in the [tessen example configuration +file](https://github.com/ayushnix/tessen/blob/master/config#L23) on my computer. +I'll look into it [someday](https://en.wikipedia.org/wiki/Procrastination) to +have a clean configuration files setup… maybe.