bw-dmenu-fill - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       bw-dmenu-fill (2440B)
       ---
            1 #!/bin/sh
            2 # bitwarden dmenu script - based off of the autofill userscript from qutebrowser
            3 # requires the fifo patch
            4 # $1: winid
            5 #
            6 # add something like this to your config.h:
            7 # #define BITWARDEN_DMENU { .v = (char *[]){ "/bin/sh", "-c", "bw-dmenu-fill" } }
            8 #
            9 # and this to your keybindings:
           10 # { MODKEY, GDK_KEY_z, spawn, BITWARDEN_DMENU },
           11 
           12 fifo=~/.surf/fifo/"$1"
           13 url=$(xprop -id "$1" _SURF_URI | awk '{ print $3 }' | sed 's/"//g')
           14 
           15 username=""
           16 password=""
           17 
           18 output=$(bitwarden-dmenu \
           19         --bw-list-args="--url=$url" \
           20     --dmenu-args="-l 5 -w $1" \
           21     --dmenu-pswd-args="-w $1" \
           22     --stdout)
           23 
           24 if [ ! -z "$output" ]; then
           25     username=$(echo "$output" | awk 'FNR == 1 {print}')
           26     password=$(echo "$output" | awk 'FNR == 2 {print}')
           27 else
           28     exit
           29 fi
           30 
           31 javascript_escape() {
           32     sed "s,[\\\\'\"],\\\\&,g" <<< "$1"
           33 }
           34 
           35 js() {
           36 cat <<EOF
           37     function isVisible(elem) {
           38         var style = elem.ownerDocument.defaultView.getComputedStyle(elem, null);
           39         if (style.getPropertyValue("visibility") !== "visible" ||
           40             style.getPropertyValue("display") === "none" ||
           41             style.getPropertyValue("opacity") === "0") {
           42             return false;
           43         }
           44         return elem.offsetWidth > 0 && elem.offsetHeight > 0;
           45     };
           46     function hasPasswordField(form) {
           47         var inputs = form.getElementsByTagName("input");
           48         for (var j = 0; j < inputs.length; j++) {
           49             var input = inputs[j];
           50             if (input.type == "password") {
           51                 return true;
           52             }
           53         }
           54         return false;
           55     };
           56     function loadData2Form (form) {
           57         var inputs = form.getElementsByTagName("input");
           58         for (var j = 0; j < inputs.length; j++) {
           59             var input = inputs[j];
           60             if (isVisible(input) && (input.type == "text" || input.type == "email")) {
           61                 input.focus();
           62                 input.value = "$(javascript_escape "${username}")";
           63                 input.blur();
           64             }
           65             if (input.type == "password") {
           66                 input.focus();
           67                 input.value = "$(javascript_escape "${password}")";
           68                 input.blur();
           69             }
           70         }
           71     };
           72     var forms = document.getElementsByTagName("form");
           73     for (i = 0; i < forms.length; i++) {
           74         if (hasPasswordField(forms[i])) {
           75             loadData2Form(forms[i]);
           76         }
           77     }
           78 EOF
           79 }
           80 
           81 printjs() {
           82     js | sed 's,//.*$,,' | tr '\n' ' '
           83 }
           84 
           85 echo "inject $(printjs)" >> "$fifo"