Re: [hackers] [dmenu][PATCH] Don't display text directly when typing a password

From: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
Date: Sat, 10 Jun 2017 20:02:20 +0200

On Sat, Jun 10, 2017 at 06:29:49PM +0200, Philip Kaludercic wrote:
> From: Philip K <philippija_AT_gmail.com>
>

If this is meant for upstream a description would be nice, but this feature
is beyond the scope of dmenu and won't be accepted.

Some feedback below:

> ---
> dmenu.c | 19 +++++++++++++++----
> 1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/dmenu.c b/dmenu.c
> index d605ab4..4672f89 100644
> --- a/dmenu.c
> +++ b/dmenu.c
> _AT_@ -36,7 +36,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;
> _AT_@ -142,7 +142,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 (passwd) {
> + char *ntext = calloc(1, sizeof(text));

You should check for out-of-memory conditions here. Variables should be
declared at the top of the function in "suckless-style".

> + for (int i = 0; i < strlen(text); i++) ntext[i] = '.';

You can use memset here.

> + drw_text(drw, x, 0, w, bh, lrpad / 2, ntext, 0);
> + } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
>
> drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
> if ((curpos += lrpad / 2 - 1) < w) {
> _AT_@ -481,6 +485,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)
> _AT_@ -636,7 +645,7 @@ setup(void)
> static void
> usage(void)
> {
> - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
> + fputs("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
> " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
> exit(1);
> }
> _AT_@ -659,7 +668,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 */
> --
> 2.11.0
>
>

-- 
Kind regards,
Hiltjo
Received on Sat Jun 10 2017 - 20:02:20 CEST

This archive was generated by hypermail 2.3.0 : Sat Jun 10 2017 - 20:12:19 CEST