|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <auth.h> ! 4: #include <../boot/boot.h> ! 5: ! 6: static char *pbmsg = "AS protocol botch"; ! 7: static char *ccmsg = "can't connect to AS"; ! 8: ! 9: int ! 10: readn(int fd, char *buf, int len) ! 11: { ! 12: int m, n; ! 13: ! 14: for(n = 0; n < len; n += m){ ! 15: m = read(fd, buf+n, len-n); ! 16: if(m <= 0) ! 17: return -1; ! 18: } ! 19: return n; ! 20: } ! 21: ! 22: static char* ! 23: fromauth(Method *mp, char *trbuf, char *tbuf) ! 24: { ! 25: char t; ! 26: char *msg; ! 27: static char error[ERRLEN]; ! 28: ! 29: if(afd < 0){ ! 30: if(mp->auth == 0) ! 31: fatal("no method for accessing auth server"); ! 32: afd = (*mp->auth)(); ! 33: if(afd < 0) ! 34: return ccmsg; ! 35: } ! 36: if(write(afd, trbuf, TICKREQLEN) < 0 || read(afd, &t, 1) != 1){ ! 37: close(afd); ! 38: afd = -1; ! 39: return pbmsg; ! 40: } ! 41: switch(t){ ! 42: case AuthOK: ! 43: msg = 0; ! 44: if(readn(afd, tbuf, 2*TICKETLEN) < 0) ! 45: msg = pbmsg; ! 46: break; ! 47: case AuthErr: ! 48: if(readn(afd, error, ERRLEN) < 0) ! 49: msg = pbmsg; ! 50: else { ! 51: error[ERRLEN-1] = 0; ! 52: msg = error; ! 53: } ! 54: break; ! 55: default: ! 56: msg = pbmsg; ! 57: break; ! 58: } ! 59: return msg; ! 60: } ! 61: ! 62: void ! 63: doauthenticate(int fd, Method *mp) ! 64: { ! 65: char *msg; ! 66: char trbuf[TICKREQLEN]; ! 67: char tbuf[2*TICKETLEN]; ! 68: ! 69: print("session..."); ! 70: if(fsession(fd, trbuf) < 0) ! 71: fatal("session command failed"); ! 72: ! 73: /* no authentication required? */ ! 74: memset(tbuf, 0, 2*TICKETLEN); ! 75: if(trbuf[0] == 0) ! 76: return; ! 77: ! 78: /* try getting to an auth server */ ! 79: msg = fromauth(mp, trbuf, tbuf); ! 80: if(msg == 0) ! 81: if(fauth(fd, tbuf) >= 0) ! 82: return; ! 83: ! 84: /* didn't work, go for the security hole */ ! 85: fprint(2, "no authentication server (%s), using your key as server key\n", msg); ! 86: } ! 87: ! 88: char* ! 89: checkkey(Method *mp, char *name, char *key) ! 90: { ! 91: char *msg; ! 92: Ticketreq tr; ! 93: Ticket t; ! 94: char trbuf[TICKREQLEN]; ! 95: char tbuf[TICKETLEN]; ! 96: ! 97: memset(&tr, 0, sizeof tr); ! 98: tr.type = AuthTreq; ! 99: strcpy(tr.authid, name); ! 100: strcpy(tr.hostid, name); ! 101: strcpy(tr.uid, name); ! 102: convTR2M(&tr, trbuf); ! 103: msg = fromauth(mp, trbuf, tbuf); ! 104: if(msg == ccmsg){ ! 105: fprint(2, "boot: can't contact auth server, passwd unchecked\n"); ! 106: return 0; ! 107: } ! 108: if(msg) ! 109: return msg; ! 110: convM2T(tbuf, &t, key); ! 111: if(t.num == AuthTc && strcmp(name, t.cuid)==0) ! 112: return 0; ! 113: return "no match"; ! 114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.