From 597ca1ec3c885ca03b89f1871c37482feeb9dfc2 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 7 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-07 --- boot/boot.c | 2 + boot/doauthenticate.c | 23 +++------ port/auth.c | 114 ++++++++++++++++++++++++++++++------------ port/devmnt.c | 30 +++++++++-- port/lib.h | 3 +- port/portdat.h | 2 +- port/portfns.h | 1 + 7 files changed, 122 insertions(+), 53 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index ab73afd92ba6f209889c283776f1d8142950a21d..0904995c11512d0c2e07a76115d6960284476e03 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -120,8 +120,10 @@ boot(int argc, char *argv[]) rp = getenv("rootspec"); if(rp == nil) rp = ""; +print("boot about to mount\n"); if(mount(fd, "/root", MREPL|MCREATE, rp) < 0) fatal("mount /"); +print("mount is done\n"); rp = getenv("rootdir"); if(rp == nil) rp = rootdir; diff --git a/boot/doauthenticate.c b/boot/doauthenticate.c index f632ab08e29d36d69e07a63e25db4072f3acee12..d89983947a78abbd576ffb0c5c1ce05829731457 100644 --- a/boot/doauthenticate.c +++ b/boot/doauthenticate.c @@ -73,28 +73,21 @@ void doauthenticate(int fd, Method *mp) { char *msg; - char trbuf[TICKREQLEN]; - char tbuf[2*TICKETLEN]; + char authlist[1024]; print("session..."); - if(fsession(fd, trbuf, sizeof trbuf) < 0) + if(fsession(fd, authlist, sizeof authlist) < 0) +{print("boot failed in session: %r\n"); fatal("session command failed"); +} + +print("boot says session done\n"); /* no authentication required? */ - memset(tbuf, 0, 2*TICKETLEN); - if(trbuf[0] == 0) + if(authlist[0] == 0) return; - /* try getting to an auth server */ - print("getting ticket..."); - msg = fromauth(mp, trbuf, tbuf); - print("authenticating..."); - if(msg == 0) - if(fauth(fd, tbuf) >= 0) - return; - - /* didn't work, go for the security hole */ - fprint(2, "no authentication server (%s), using your key as server key\n", msg); + print("not authenticated!!!\n"); } char* diff --git a/port/auth.c b/port/auth.c index 1bdfe04e630a0e73977b66bc975b73b6d75ae541..addaec29f151d16bd4cac1d8b82108435f5d7ecc 100644 --- a/port/auth.c +++ b/port/auth.c @@ -11,6 +11,31 @@ char *eve; char evekey[DESKEYLEN]; char hostdomain[DOMLEN]; +struct Session +{ + char *authlist; +}; + +Session* +allocsession(char *authlist) +{ + Session *s; + + s = smalloc(sizeof(*s)); + s->authlist = nil; + kstrdup(&s->authlist, authlist); + return s; +} + +void +freesession(Session *s) +{ + if(s == nil) + return; + free(s->authlist); + free(s); +} + /* * return true if current user is eve */ @@ -111,36 +136,16 @@ Return: return m; } -long -sysfsession(ulong *arg) +void +sendsession(Chan *c) { Fcall f; uchar *msg; - uint authlen, n, m; - Chan *c; + uint n, m; uvlong oo; -//BUG print("warning: stub fsession being used\n"); - authlen = arg[2]; - validaddr(arg[1], authlen, 1); - c = fdtochan(arg[0], ORDWR, 0, 1); - if(waserror()){ - cclose(c); - nexterror(); - } - - if(c->flag & CMSG){ -//BUG what to do? - ((uchar*)arg[1])[0] = 0; - poperror(); - cclose(c); - return 0; - } - f.type = Tsession; f.tag = NOTAG; - f.nchal = 0; - f.chal = (uchar*)""; msg = smalloc(8192+IOHDRSZ); if(waserror()){ free(msg); @@ -156,6 +161,7 @@ sysfsession(ulong *arg) unlock(c); m = devtab[c->type]->write(c, msg, n, oo); +print("session sent\n"); if(m < n){ lock(c); @@ -168,34 +174,78 @@ sysfsession(ulong *arg) m = devtab[c->type]->read(c, msg, 8192+IOHDRSZ, c->offset); if(m <= 0) error("EOF receiving fsession reply"); +print("rsession rcvd\n"); lock(c); c->offset += m; unlock(c); n = convM2S(msg, m, &f); +print("rsession conv returns %d\n", n); if(n != m) error("bad fsession conversion on reply"); if(f.type != Rsession) error("unexpected reply type in fsession"); - m = f.nchal; - if(m > authlen) - error(Eshort); -//BUG print("auth stuff ignored; noauth by default\n"); - ((uchar*)arg[1])[0] = 0; + c->session = allocsession(f.authlist); free(msg); poperror(); +} + +long +sysfsession(ulong *arg) +{ + Chan *c; + uint authlen, n; + + authlen = arg[2]; + validaddr(arg[1], authlen, 1); + c = fdtochan(arg[0], ORDWR, 0, 1); + if(waserror()){ + cclose(c); + nexterror(); + } + + if(c->session == nil){ + if(c->flag&CMSG) + error("session on mounted channel"); + sendsession(c); + } + + n = strlen(c->session->authlist)+1; + if(n > authlen) + error(Eshort); + memmove((uchar*)arg[1], c->session->authlist, n); + poperror(); cclose(c); - return m; + return n; + } long -sysfauth(ulong *) +sysfauth(ulong *arg) { - error("sysfauth unimplemented"); - return -1; + Chan *c; + uint authlen, rauthlen; + int n; + + authlen = arg[2]; + validaddr(arg[1], authlen, 1); + rauthlen = arg[4]; + validaddr(arg[3], rauthlen, 1); + c = fdtochan(arg[0], ORDWR, 0, 1); + if(waserror()){ + cclose(c); + nexterror(); + } + + n = mntauth(c, (uchar*)arg[1], authlen, (uchar*)arg[3], rauthlen); + + poperror(); + cclose(c); + return n; + } /* diff --git a/port/devmnt.c b/port/devmnt.c index bfb041fe342bd23989f6bea5b2f8724943d51b68..02bbd51412efda8b7115fb31cbc1bf55ed4c3851 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -37,7 +37,6 @@ struct Mntalloc }mntalloc; void mattach(Mnt*, Chan*, char*); -void mntauth(Mnt*, Mntrpc*, char*, ushort); Mnt* mntchk(Chan*); void mntdirfix(uchar*, Chan*); Mntrpc* mntflushalloc(Mntrpc*, ulong); @@ -193,8 +192,6 @@ mattach(Mnt *m, Chan *c, char *spec) r->request.fid = c->fid; r->request.uname = up->user; r->request.aname = spec; - r->request.nauth = 0; - r->request.auth = (uchar*)""; mountrpc(m, r); c->qid = r->reply.qid; @@ -463,6 +460,33 @@ mntwstat(Chan *c, uchar *dp, int n) return n; } +int +mntauth(Chan *c, uchar *auth, int nauth, uchar *rauth, int nrauth) +{ + int n; + Mnt *m; + Mntrpc *r; + + m = mntchk(c); + r = mntralloc(c, m->c->iounit); + if(waserror()) { + mntfree(r); + nexterror(); + } + r->request.type = Tauth; + r->request.fid = c->fid; + r->request.nauth = nauth; + r->request.auth = auth; + mountrpc(m, r); + n = r->reply.nrauth; + if(nrauth < n) + error(Eshort); + memmove(rauth, r->reply.rauth, n); + poperror(); + mntfree(r); + return n; +} + static long mntread(Chan *c, void *buf, long n, vlong off) { diff --git a/port/lib.h b/port/lib.h index c44877d3d65da91cbea7095fa5cd0c338d79babd..8f9ef61a3716b569622f23a5f7695d179ea51922 100644 --- a/port/lib.h +++ b/port/lib.h @@ -140,7 +140,6 @@ struct Qid uchar type; }; -typedef struct Dir { /* system-modified data */ ushort type; /* server type */ @@ -155,7 +154,7 @@ struct Dir { char *uid; /* owner name */ char *gid; /* group name */ char *muid; /* last modifier name */ -} Dir; +}; struct Waitmsg { diff --git a/port/portdat.h b/port/portdat.h index e79838b13d81afa7fdf5bb7b577ad8d341f58013..9e0bb41bb03aa83ca1b90cd81ecab07f44f3bc19 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -197,7 +197,7 @@ struct Dev long (*bwrite)(Chan*, Block*, ulong); void (*remove)(Chan*); int (*wstat)(Chan*, uchar*, int); - void (*power)(int); /* power mgt: power(1) → on, power (0) → off */ + void (*power)(int); /* power mgt: power(1) => on, power (0) => off */ int (*config)(int, char*, DevConf*); }; diff --git a/port/portfns.h b/port/portfns.h index d4e2eed19132e59a92ff9a9822e740956d4b9af5..306b4696d3298ecff42b03c98625c229fd7fb92c 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -162,6 +162,7 @@ void microdelay(int); void mkqid(Qid*, vlong, ulong, int); void mmurelease(Proc*); void mmuswitch(Proc*); +int mntauth(Chan*, uchar*, int, uchar*, int); void mntdump(void); void mountfree(Mount*); ulong msize(void*);