diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-12-11 16:52:38 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-12-11 16:52:38 +0100 |
commit | 5cc1cb182065a0c1f5a32e36a71c9b1ac3083db5 (patch) | |
tree | 7a4ee335d5bb3a1c0bcc9a1aa5181a7aaf00c8ee /sys/src/cmd/vnc/auth.c | |
parent | 5d353d62fe9566b203e08bc25d525c5a3a0ecadc (diff) |
vnc: don't prompt for password on auth_respond() failure
Diffstat (limited to 'sys/src/cmd/vnc/auth.c')
-rw-r--r-- | sys/src/cmd/vnc/auth.c | 103 |
1 files changed, 3 insertions, 100 deletions
diff --git a/sys/src/cmd/vnc/auth.c b/sys/src/cmd/vnc/auth.c index 070d7f589..bb2170c01 100644 --- a/sys/src/cmd/vnc/auth.c +++ b/sys/src/cmd/vnc/auth.c @@ -4,10 +4,6 @@ char *serveraddr; -/* - * Encrypt n bytes using the password - * as key, padded with zeros to 8 bytes. - */ enum { VerLen = 12 @@ -15,97 +11,6 @@ enum static char version[VerLen+1] = "RFB 003.003\n"; -static uchar tab[256]; - -/* VNC reverses the bits of each byte before using as a des key */ -static void -mktab(void) -{ - int i, j, k; - static int once; - - if(once) - return; - once = 1; - - for(i=0; i<256; i++){ - j=i; - tab[i] = 0; - for(k=0; k<8; k++){ - tab[i] = (tab[i]<<1) | (j&1); - j >>= 1; - } - } -} - -static void -vncencrypt(uchar *buf, int n, char *pw) -{ - uchar *p; - uchar key[9]; - DESstate s; - - mktab(); - memset(key, 0, sizeof key); - strncpy((char*)key, pw, 8); - for(p=key; *p; p++) - *p = tab[*p]; - - setupDESstate(&s, key, nil); - desECBencrypt(buf, n, &s); -} - -static int -readln(char *prompt, char *line, int len) -{ - char *p; - int fd, ctl, n, nr; - - fd = open("/dev/cons", ORDWR); - if(fd < 0) - sysfatal("couldn't open cons"); - ctl = open("/dev/consctl", OWRITE); - if(ctl < 0) - sysfatal("couldn't open consctl"); - write(ctl, "rawon", 5); - fprint(fd, "%s", prompt); - nr = 0; - p = line; - for(;;){ - n = read(fd, p, 1); - if(n < 0){ - close(fd); - close(ctl); - return -1; - } - if(n == 0 || *p == '\n' || *p == '\r'){ - *p = '\0'; - write(fd, "\n", 1); - close(fd); - close(ctl); - return nr; - } - if(*p == '\b'){ - if(nr > 0){ - nr--; - p--; - } - }else if(*p == 21){ /* cntrl-u */ - fprint(fd, "\n%s", prompt); - nr = 0; - p = line; - }else{ - nr++; - p++; - } - if(nr == len){ - fprint(fd, "line too long; try again\n%s", prompt); - nr = 0; - p = line; - } - } -} - int vncsrvhandshake(Vnc *v) { @@ -145,7 +50,7 @@ vnchandshake(Vnc *v) int vncauth(Vnc *v, char *keypattern) { - char pw[128], *reason; + char *reason; uchar chal[VncChalLen]; ulong auth; char *p, *server; @@ -180,10 +85,8 @@ vncauth(Vnc *v, char *keypattern) *p = 0; if(auth_respond(chal, VncChalLen, nil, 0, chal, VncChalLen, auth_getkey, "proto=vnc role=client server=%s %s", server, keypattern) != VncChalLen){ - /* BUG This is for drawterm users who don't start their own factotums */ - readln("password: ", pw, sizeof(pw)); - vncencrypt(chal, VncChalLen, pw); - memset(pw, 0, sizeof pw); + free(server); + return -1; } free(server); vncwrbytes(v, chal, VncChalLen); |