Annotation of lucent/sys/src/9/boot/f002505, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.