~kris/9p

9hist

597ca1ec3c885ca03b89f1871c37482feeb9dfc2 — David du Colombier 25 years ago 5aea341
Plan 9 from Bell Labs 2001-08-07
7 files changed, 122 insertions(+), 53 deletions(-)

M boot/boot.c
M boot/doauthenticate.c
M port/auth.c
M port/devmnt.c
M port/lib.h
M port/portdat.h
M port/portfns.h
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*);