aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Riedstra <mitch@riedstra.dev>2021-10-20 20:45:53 -0400
committerMitchell Riedstra <mitch@riedstra.dev>2021-10-20 21:34:43 -0400
commit34ffa30edc8ae60e83c538c5d8809d1981e5a9e5 (patch)
tree44a28d419989b405a9eee0cf77b580308ce84b2f
parentd78ff08d99780a73447d5a95bf1e358e8c23aa3c (diff)
downloaddmenu-34ffa30edc8ae60e83c538c5d8809d1981e5a9e5.tar.gz
dmenu-34ffa30edc8ae60e83c538c5d8809d1981e5a9e5.tar.xz
SSH askpass suppportdmenu_askpass
dmenu_askpass has been added and can be used to read in SSH key passwords, useful for if your agent is forwarded. Full support for prompting from security keys, often requiring you to tap the authenticator. This unlike some other askpass variants does not stick around after you tap the button.
-rw-r--r--Makefile3
-rw-r--r--dmenu.c13
-rwxr-xr-xdmenu_askpass3
3 files changed, 16 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index a03a95c..2a4cd96 100644
--- a/Makefile
+++ b/Makefile
@@ -42,10 +42,11 @@ dist: clean
install: all
mkdir -p $(DESTDIR)$(PREFIX)/bin
- cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin
+ cp -f dmenu dmenu_path dmenu_run dmenu_askpass stest $(DESTDIR)$(PREFIX)/bin
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_askpass
chmod 755 $(DESTDIR)$(PREFIX)/bin/stest
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1
diff --git a/dmenu.c b/dmenu.c
index 98507d9..8c12e4b 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -35,6 +35,7 @@ struct item {
};
static char text[BUFSIZ] = "";
+static int echo = 1;
static char *embed;
static int bh, mw, mh;
static int inputw = 0, promptw;
@@ -143,7 +144,11 @@ drawmenu(void)
/* draw input field */
w = (lines > 0 || !matches) ? mw - x : inputw;
drw_setscheme(drw, scheme[SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
+
+ if (echo)
+ drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
+ else
+ drw_text(drw, x, 0, w, bh, lrpad / 2, "(no echo)", 0);
curpos = TEXTW(text) - TEXTW(&text[cursor]);
if ((curpos += lrpad / 2 - 1) < w) {
@@ -262,6 +267,7 @@ match(void)
}
curr = sel = matches;
calcoffsets();
+ memset(buf, '\0', sizeof(text));
}
static void
@@ -474,6 +480,7 @@ insert:
case XK_Return:
case XK_KP_Enter:
puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
+ memset(text, '\0', sizeof text);
if (!(ev->state & ControlMask)) {
cleanup();
exit(0);
@@ -700,7 +707,7 @@ setup(void)
static void
usage(void)
{
- fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ fputs("usage: dmenu [-bfivE] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
exit(1);
}
@@ -720,6 +727,8 @@ main(int argc, char *argv[])
topbar = 0;
else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */
fast = 1;
+ else if (!strcmp(argv[i], "-E")) /* no Echo, for use with passphrases */
+ echo = 0;
else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
fstrncmp = strncasecmp;
fstrstr = cistrstr;
diff --git a/dmenu_askpass b/dmenu_askpass
new file mode 100755
index 0000000..9f61844
--- /dev/null
+++ b/dmenu_askpass
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec <&-
+exec dmenu -E -p "${1:-OpenSSH Passphrase: }"