commit 3fd481ce158fa1825a313b3fcc15b59bb30d9a63
parent ec381bddd1bd0504b8c392aaad7c534293a297fe
Author: Oscar Benedito <oscar@oscarbenedito.com>
Date: Sun, 9 Oct 2022 12:32:30 +0200
Apply password patch
By applying this patch, dmenu will not directly display the keyboard
input, but instead replace it with dots. All data from stdin will be
ignored.
The patch has been changed a bit to have '-' as the character showed.
Also fixed the patch as the diff was done the wrong way.
Diffstat:
3 files changed, 109 insertions(+), 5 deletions(-)
diff --git a/dmenu.1 b/dmenu.1
@@ -3,7 +3,7 @@
dmenu \- dynamic menu
.SH SYNOPSIS
.B dmenu
-.RB [ \-bfiv ]
+.RB [ \-bfivP ]
.RB [ \-l
.IR lines ]
.RB [ \-m
@@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
.B \-i
dmenu matches menu items case insensitively.
.TP
+.B \-P
+dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored.
+.TP
.BI \-l " lines"
dmenu lists items vertically, with the given number of lines.
.TP
diff --git a/dmenu.c b/dmenu.c
@@ -37,7 +37,7 @@ struct item {
static char text[BUFSIZ] = "";
static char *embed;
static int bh, mw, mh;
-static int inputw = 0, promptw;
+static int inputw = 0, promptw, passwd = 0;
static int lrpad; /* sum of left and right padding */
static size_t cursor;
static struct item *items = NULL;
@@ -149,6 +149,7 @@ drawmenu(void)
unsigned int curpos;
struct item *item;
int x = 0, y = 0, w;
+ char *censort;
drw_setscheme(drw, scheme[SchemeNorm]);
drw_rect(drw, 0, 0, mw, mh, 1, 1);
@@ -160,7 +161,12 @@ 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 (passwd) {
+ censort = ecalloc(1, sizeof(text));
+ memset(censort, '-', strlen(text));
+ drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0);
+ free(censort);
+ } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
curpos = TEXTW(text) - TEXTW(&text[cursor]);
if ((curpos += lrpad / 2 - 1) < w) {
@@ -553,6 +559,11 @@ readstdin(void)
size_t i, junk, size = 0;
ssize_t len;
+ if(passwd){
+ inputw = lines = 0;
+ return;
+ }
+
/* read each line from stdin and add it to the item list */
for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
if (i + 1 >= size / sizeof *items)
@@ -710,7 +721,7 @@ setup(void)
static void
usage(void)
{
- die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ die("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
}
@@ -732,7 +743,9 @@ main(int argc, char *argv[])
else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
fstrncmp = strncasecmp;
fstrstr = cistrstr;
- } else if (i + 1 == argc)
+ } else if (!strcmp(argv[i], "-P")) /* is the input a password */
+ passwd = 1;
+ else if (i + 1 == argc)
usage();
/* these options take one argument */
else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
diff --git a/patches/dmenu-password-4.9.diff b/patches/dmenu-password-4.9.diff
@@ -0,0 +1,88 @@
+diff -up dmenu-4.9-orig/dmenu.1 dmenu-4.9/dmenu.1
+--- dmenu-4.9-orig/dmenu.1 2019-09-25 12:48:38.848249931 -0600
++++ dmenu-4.9/dmenu.1 2019-09-25 12:55:42.666319316 -0600
+@@ -3,7 +3,7 @@
+ dmenu \- dynamic menu
+ .SH SYNOPSIS
+ .B dmenu
++.RB [ \-bfivP ]
+-.RB [ \-bfiv ]
+ .RB [ \-l
+ .IR lines ]
+ .RB [ \-m
+@@ -47,6 +47,9 @@ is faster, but will lock up X until stdi
+ .B \-i
+ dmenu matches menu items case insensitively.
+ .TP
++.B \-P
++dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored.
++.TP
+ .BI \-l " lines"
+ dmenu lists items vertically, with the given number of lines.
+ .TP
+diff -up dmenu-4.9-orig/dmenu.c dmenu-4.9/dmenu.c
+--- dmenu-4.9-orig/dmenu.c 2019-09-25 12:48:38.848249931 -0600
++++ dmenu-4.9/dmenu.c 2019-09-25 12:48:55.756173240 -0600
+@@ -37,7 +37,7 @@ struct item {
+ static char text[BUFSIZ] = "";
+ static char *embed;
+ static int bh, mw, mh;
++static int inputw = 0, promptw, passwd = 0;
+-static int inputw = 0, promptw;
+ static int lrpad; /* sum of left and right padding */
+ static size_t cursor;
+ static struct item *items = NULL;
+@@ -132,6 +132,7 @@ drawmenu(void)
+ unsigned int curpos;
+ struct item *item;
+ int x = 0, y = 0, w;
++ char *censort;
+
+ drw_setscheme(drw, scheme[SchemeNorm]);
+ drw_rect(drw, 0, 0, mw, mh, 1, 1);
+@@ -143,7 +144,12 @@ drawmenu(void)
+ /* draw input field */
+ w = (lines > 0 || !matches) ? mw - x : inputw;
+ drw_setscheme(drw, scheme[SchemeNorm]);
++ if (passwd) {
++ censort = ecalloc(1, sizeof(text));
++ memset(censort, '-', strlen(text));
++ drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0);
++ free(censort);
++ } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
+- drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
+
+ curpos = TEXTW(text) - TEXTW(&text[cursor]);
+ if ((curpos += lrpad / 2 - 1) < w) {
+@@ -525,6 +531,11 @@ readstdin(void)
+ size_t i, imax = 0, size = 0;
+ unsigned int tmpmax = 0;
+
++ if(passwd){
++ inputw = lines = 0;
++ return;
++ }
++
+ /* read each line from stdin and add it to the item list */
+ for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
+ if (i + 1 >= size / sizeof *items)
+@@ -682,7 +693,7 @@ setup(void)
+ static void
+ usage(void)
+ {
++ fputs("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+- fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
+ exit(1);
+ }
+@@ -705,7 +716,9 @@ main(int argc, char *argv[])
+ else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
+ fstrncmp = strncasecmp;
+ fstrstr = cistrstr;
++ } else if (!strcmp(argv[i], "-P")) /* is the input a password */
++ passwd = 1;
++ else if (i + 1 == argc)
+- } else if (i + 1 == argc)
+ usage();
+ /* these options take one argument */
+ else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */