M boot/boot.c => boot/boot.c +2 -0
@@ 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;
M boot/doauthenticate.c => boot/doauthenticate.c +8 -15
@@ 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*
M port/auth.c => port/auth.c +82 -32
@@ 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;
+
}
/*
M port/devmnt.c => port/devmnt.c +27 -3
@@ 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)
{
M port/lib.h => port/lib.h +1 -2
@@ 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
{
M port/portdat.h => port/portdat.h +1 -1
@@ 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*);
};
M port/portfns.h => port/portfns.h +1 -0
@@ 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*);