On Sat, Apr 01, 2017 at 05:41:39PM +1300, David Phillips wrote:
> With slock's current behaviour, the user can become frustrated when they
> suspect that they have made a typo in their password and are unable to
> remember how many times to hit the backspace key to correct it. This patch
> adds a configuration option for such users (I'm sure we've all been there)
> so that their password is shown on the screen as they are entering it into
> slock. Thusly, they can see whether they have made a mistake or typo entering
> their password and can easily correct it.
> ---
>  config.def.h |  7 +++++++
>  slock.c      | 23 +++++++++++++++++++++--
>  2 files changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/config.def.h b/config.def.h
> index 9855e21..f250db7 100644
> --- a/config.def.h
> +++ b/config.def.h
> @@ -2,11 +2,18 @@
>  static const char *user  = "nobody";
>  static const char *group = "nogroup";
>  
> +/* font used to display password */
> +static const char *fontname = "9x15";
> +
>  static const char *colorname[NUMCOLS] = {
>       [INIT] =   "black",     /* after initialization */
>       [INPUT] =  "#005577",   /* during input */
>       [FAILED] = "#CC3333",   /* wrong password */
> +     [TEXT] = "black",       /* password on screen */
>  };
>  
>  /* treat a cleared input like a wrong password (color) */
>  static const int failonclear = 1;
> +
> +/* show the password on the screen as it is typed */
> +static const int showpassword = 1;
> diff --git a/slock.c b/slock.c
> index d55eb3d..49133fa 100644
> --- a/slock.c
> +++ b/slock.c
> @@ -23,17 +23,20 @@
>  #include "util.h"
>  
>  char *argv0;
> +XFontStruct *font;
>  
>  enum {
>       INIT,
>       INPUT,
>       FAILED,
> +     TEXT,
>       NUMCOLS
>  };
>  
>  struct lock {
>       int screen;
>       Window root, win;
> +     GC gc;
>       Pixmap pmap;
>       unsigned long colors[NUMCOLS];
>  };
> @@ -130,7 +133,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock 
> **locks, int nscreens,
>  {
>       XRRScreenChangeNotifyEvent *rre;
>       char buf[32], passwd[256], *inputhash;
> -     int num, screen, running, failure, oldc;
> +     int num, screen, running, failure, oldc, tw, dpyw, dpyh;
>       unsigned int len, color;
>       KeySym ksym;
>       XEvent ev;
> @@ -187,13 +190,24 @@ readpw(Display *dpy, struct xrandr *rr, struct lock 
> **locks, int nscreens,
>                               }
>                               break;
>                       }
> +                     tw = XTextWidth(font, passwd, len);
>                       color = len ? INPUT : ((failure || failonclear) ? 
> FAILED : INIT);
> -                     if (running && oldc != color) {
> +                     if (running && (showpassword || (!showpassword && oldc 
> != color))) {
>                               for (screen = 0; screen < nscreens; screen++) {
>                                       XSetWindowBackground(dpy,
>                                                            locks[screen]->win,
>                                                            
> locks[screen]->colors[color]);
>                                       XClearWindow(dpy, locks[screen]->win);
> +                                     if (showpassword) {
> +                                             XSetForeground(dpy, 
> locks[screen]->gc,
> +                                                                        
> locks[screen]->colors[TEXT]);
> +                                             dpyw = DisplayWidth(dpy, 
> locks[screen]->screen);
> +                                             dpyh = DisplayHeight(dpy, 
> locks[screen]->screen);
> +                                             XDrawString(dpy, 
> locks[screen]->win,
> +                                                                     
> locks[screen]->gc,
> +                                                                     
> (dpyw-tw)/2, dpyh/2,
> +                                                                     passwd, 
> len);
> +                                     }
>                               }
>                               oldc = color;
>                       }
> @@ -255,6 +269,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
>       invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
>                                       &color, &color, 0, 0);
>       XDefineCursor(dpy, lock->win, invisible);
> +     lock->gc = XCreateGC(dpy, lock->win, 0, NULL);
>  
>       /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the 
> lock */
>       for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
> @@ -358,6 +373,10 @@ main(int argc, char **argv) {
>       /* check for Xrandr support */
>       rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);
>  
> +     /* load font ready for drawing */
> +     if (NULL == (font = XLoadQueryFont(dpy, fontname)))
> +             die("Failed to load font\n");
> +
>       /* get number of screens in display "dpy" and blank them */
>       nscreens = ScreenCount(dpy);
>       if (!(locks = calloc(nscreens, sizeof(struct lock *))))
> -- 
> 2.12.0
> 
> 

Hi,

This sounds like a non-issue to me. Just press enter and retype the password.

Showing the password in plain-text is a really bad idea for obvious reasons.

-- 
Kind regards,
Hiltjo

Reply via email to