ref: 5cc1cb182065a0c1f5a32e36a71c9b1ac3083db5
parent: 5d353d62fe9566b203e08bc25d525c5a3a0ecadc
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Dec 11 11:52:38 EST 2016
vnc: don't prompt for password on auth_respond() failure
--- 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 @@
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 @@
int
vncauth(Vnc *v, char *keypattern)
{
- char pw[128], *reason;
+ char *reason;
uchar chal[VncChalLen];
ulong auth;
char *p, *server;
@@ -180,10 +85,8 @@
*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);