ref: e1c447bc119ad76322e700e4b8ccc582c08f264d
parent: 554fb43df5e3da4051fb7befef51c7b529b55d84
author: cinap_lenrek <[email protected]>
date: Sun Dec 3 00:47:35 EST 2017
screenlock: some improvements check for "needkey " error string from auth_userpasswd() in case no key is pesent in factotum. this used to be a common trap with stand alone machines that do not have an authentication server setup. indicate authentication in progress by drawing a white border. delete unneccesary cruft and simplify the code.
--- a/sys/src/cmd/screenlock.c
+++ b/sys/src/cmd/screenlock.c
@@ -7,55 +7,17 @@
#include <auth.h>
char pic[] = "/lib/bunny.bit";
-
int debug;
-int doblank;
-int chatty = 0;
+long blank;
-char user[256];
-
void
-error(char *fmt, ...)
-{
- Fmt f;
- char buf[64];
- va_list arg;
-
- fmtfdinit(&f, 1, buf, sizeof buf);
- fmtprint(&f, "screenlock: ");
- va_start(arg, fmt);
- fmtvprint(&f, fmt, arg);
- va_end(arg);
- fmtprint(&f, "\n");
- fmtfdflush(&f);
- threadexitsall("fatal error");
-}
-
-void
usage(void)
{
- fprint(2, "usage: %s\n", argv0);
+ fprint(2, "usage: %s [-d]\n", argv0);
exits("usage");
}
-
void
-readfile(char *name, char *buf, int nbuf, int addnul)
-{
- int fd;
-
- fd = open(name, OREAD);
- if(fd == -1)
- error("%s - can't open: %r", name);
- nbuf = read(fd, buf, nbuf-addnul);
- close(fd);
- if(nbuf == -1)
- error("%s - can't can't read: %r", name);
- if(addnul)
- buf[nbuf] = '\0';
-}
-
-void
readline(char *buf, int nbuf)
{
char c;
@@ -80,55 +42,32 @@
void
checkpassword(void)
{
- int fd, consctl, must;
char buf[256];
AuthInfo *ai;
- static int opened;
- must = 1;
- if(!opened){
- fd = open("/dev/cons", OREAD);
- if(fd == -1)
- error("can't open cons: %r");
- dup(fd, 0);
- close(fd);
- fd = open("/dev/cons", OWRITE);
- if(fd == -1)
- error("can't open cons: %r");
- dup(fd, 1);
- dup(1, 2);
- close(fd);
- consctl = open("/dev/consctl", OWRITE);
- if(consctl == -1)
- error("can't open consctl: %r");
- if(write(consctl, "rawon", 5) != 5)
- error("can't turn off echo\n");
- opened = 1;
- }
-
for(;;){
- if(chatty || !must)
- fprint(2, "%s's screenlock password: ", user);
memset(buf, 0, sizeof buf);
readline(buf, sizeof buf);
- if(chatty || !must)
- fprint(2, "\n");
- if(buf[0] == '\0' || buf[0] == '\04'){
- if(must)
- continue;
- error("no password typed");
- }
+ border(screen, screen->r, 8, display->white, ZP);
+ flushimage(display, 1);
+
/* authenticate */
- ai = auth_userpasswd(user, buf);
+ ai = auth_userpasswd(getuser(), buf);
if(ai != nil && ai->cap != nil)
break;
+
+ rerrstr(buf, sizeof buf);
+ if(strncmp(buf, "needkey ", 8) == 0)
+ break;
+
auth_freeAI(ai);
+ blank = time(0);
- if(chatty || !must)
- fprint(2, "password mismatch\n");
- doblank = 1;
+ border(screen, screen->r, 8, display->black, ZP);
+ flushimage(display, 1);
}
+ auth_freeAI(ai);
memset(buf, 0, sizeof buf);
}
@@ -135,19 +74,16 @@
void
blanker(void *)
{
- int fd, tics;
+ int fd;
- fd = open("/dev/mousectl", OWRITE);
- if(fd < 0)
+ if((fd = open("/dev/mousectl", OWRITE)) < 0)
return;
- tics = 0;
+
for(;;){
- if(doblank > 0){
- doblank = 0;
- tics = 10;
- }
- if(tics > 0 && --tics == 0)
+ if(((ulong)time(0) - (ulong)blank) >= 5){
+ blank = 0;
write(fd, "blank", 5);
+ }
sleep(1000);
}
}
@@ -155,39 +91,23 @@
void
grabmouse(void*)
{
- int fd, x, y;
char ibuf[256], obuf[256];
+ int fd;
- if(debug)
- return;
- fd = open("/dev/mouse", ORDWR);
- if(fd < 0)
- error("can't open /dev/mouse: %r");
+ if((fd = open("/dev/mouse", ORDWR)) < 0)
+ sysfatal("can't open /dev/mouse: %r");
snprint(obuf, sizeof obuf, "m %d %d",
screen->r.min.x + Dx(screen->r)/2,
screen->r.min.y + Dy(screen->r)/2);
+
while(read(fd, ibuf, sizeof ibuf) > 0){
- ibuf[12] = 0;
- ibuf[24] = 0;
- x = atoi(ibuf+1);
- y = atoi(ibuf+13);
- if(x != screen->r.min.x + Dx(screen->r)/2 ||
- y != screen->r.min.y + Dy(screen->r)/2){
+ if(!debug)
fprint(fd, "%s", obuf);
- doblank = 1;
- }
+ blank = time(0);
}
}
-/* lay down text at `p' */
-static void
-screenstring(Point p, char *s)
-{
- string(screen, p, screen->display->white, ZP, font, s);
- flushimage(display, 1);
-}
-
void
lockscreen(void)
{
@@ -200,30 +120,35 @@
Rectangle r;
Tm *tm;
- fd = open("/dev/screen", OREAD);
- if(fd < 0)
- error("can't open /dev/screen: %r");
+ if((fd = open("/dev/screen", OREAD)) < 0)
+ sysfatal("can't open /dev/screen: %r");
if(read(fd, buf, Nfld*Fldlen) != Nfld*Fldlen)
- error("can't read /dev/screen: %r");
+ sysfatal("can't read /dev/screen: %r");
close(fd);
buf[sizeof buf-1] = 0;
if(tokenize(buf, flds, Nfld) != Nfld)
- error("can't tokenize /dev/screen header");
+ sysfatal("can't tokenize /dev/screen header");
snprint(newcmd, sizeof newcmd, "-r %s %s %d %d",
- flds[1], flds[2], atoi(flds[3]) - 1, atoi(flds[4]) - 1);
+ flds[1], flds[2], atoi(flds[3]), atoi(flds[4]));
+
newwindow(newcmd);
- if (initdraw(nil, nil, "screenlock") < 0)
+ if((fd = open("/dev/consctl", OWRITE)) >= 0)
+ write(fd, "rawon", 5);
+
+ if((fd = open("/dev/cons", OREAD)) < 0)
+ sysfatal("can't open cons: %r");
+ dup(fd, 0);
+
+ if((fd = open("/dev/cons", OWRITE)) < 0)
+ sysfatal("can't open cons: %r");
+ dup(fd, 1);
+ dup(fd, 2);
+
+ if(initdraw(nil, nil, "screenlock") < 0)
sysfatal("initdraw failed");
- if(display == nil)
- error("no display");
- /* screen is now open and covered. grab mouse and hold on tight */
- procrfork(grabmouse, nil, 4096, RFFDG);
- procrfork(blanker, nil, 4096, RFFDG);
- fd = open(pic, OREAD);
- if(fd > 0){
- i = readimage(display, fd, 0);
- if(i){
+ if((fd = open(pic, OREAD)) >= 0){
+ if((i = readimage(display, fd, 0)) != nil){
r = screen->r;
p = Pt(r.max.x / 2, r.max.y * 2 / 3);
dx = (Dx(screen->r) - Dx(i->r)) / 2;
@@ -234,20 +159,23 @@
r.max.y -= dy;
draw(screen, screen->r, display->black, nil, ZP);
draw(screen, r, i, nil, i->r.min);
- flushimage(display, 1);
}
close(fd);
/* identify the user on screen, centered */
- tm = localtime(time(0));
+ tm = localtime(time(&blank));
s = smprint("user %s at %d:%02.2d", getuser(), tm->hour, tm->min);
p = subpt(p, Pt(stringwidth(font, "m") * strlen(s) / 2, 0));
- screenstring(p, s);
+ string(screen, p, screen->display->white, ZP, font, s);
}
+ flushimage(display, 1);
+ /* screen is now open and covered. grab mouse and hold on tight */
+ procrfork(grabmouse, nil, 8*1024, RFFDG);
+ procrfork(blanker, nil, 8*1024, RFFDG);
+
/* clear the cursor */
- fd = open("/dev/cursor", OWRITE);
- if(fd > 0){
+ if((fd = open("/dev/cursor", OWRITE)) >= 0){
memset(cbuf, 0, sizeof cbuf);
write(fd, cbuf, sizeof cbuf);
/* leave it open */
@@ -257,7 +185,6 @@
void
threadmain(int argc, char *argv[])
{
- readfile("#c/user", user, sizeof user, 1);
ARGBEGIN{
case 'd':
debug++;
@@ -269,7 +196,6 @@
if(argc != 0)
usage();
- doblank = 1;
lockscreen();
checkpassword();
threadexitsall(nil);