git: 9front

Download patch

ref: f19a0e48cb42304dda1041fe5ea6d8bc0a127aab
parent: f5091d77fed3d689707e06bc3758476024b8f51b
author: cinap_lenrek <cinap_lenrek@localhost>
date: Sat Apr 16 22:14:26 EDT 2011

cwfs: remove p9sk1 code, use factotum

--- a/sys/src/cmd/cwfs/9p2.c
+++ b/sys/src/cmd/cwfs/9p2.c
@@ -214,7 +214,7 @@
 	return error;
 }
 
-int
+static int
 authorize(Chan* chan, Fcall* f)
 {
 	File* af;
@@ -244,6 +244,10 @@
 			print("authorize: af == nil\n");
 		return -1;
 	}
+
+	/* fake read to get auth info */
+	authread(af, nil, 0);
+
 	if(af->auth == nil){
 		if(db)
 			print("authorize: af->auth == nil\n");
--- a/sys/src/cmd/cwfs/auth.c
+++ b/sys/src/cmd/cwfs/auth.c
@@ -1,6 +1,7 @@
 #include "all.h"
 #include "io.h"
 #include <authsrv.h>
+#include <auth.h>
 
 Nvrsafe	nvr;
 
@@ -83,35 +84,6 @@
 	return 1;
 }
 
-/*
- *  authentication specific to 9P2000
- */
-
-/* authentication states */
-enum
-{
-	HaveProtos=1,
-	NeedProto,
-	HaveOK,
-	NeedCchal,
-	HaveSinfo,
-	NeedTicket,
-	HaveSauthenticator,
-	SSuccess,
-};
-
-char *phasename[] =
-{
-[HaveProtos]	"HaveProtos",
-[NeedProto]	"NeedProto",
-[HaveOK]	"HaveOK",
-[NeedCchal]	"NeedCchal",
-[HaveSinfo]	"HaveSinfo",
-[NeedTicket]	"NeedTicket",
-[HaveSauthenticator]	"HaveSauthenticator",
-[SSuccess]	"SSuccess",
-};
-
 /* authentication structure */
 struct	Auth
 {
@@ -119,11 +91,7 @@
 	char	uname[NAMELEN];	/* requestor's remote user name */
 	char	aname[NAMELEN];	/* requested aname */
 	Userid	uid;		/* uid decided on */
-	int	phase;
-	char	cchal[CHALLEN];
-	char	tbuf[TICKETLEN+AUTHENTLEN];	/* server ticket */
-	Ticket	t;
-	Ticketreq tr;
+	AuthRpc *rpc;
 };
 
 Auth*	auths;
@@ -138,17 +106,14 @@
 static int
 failure(Auth *s, char *why)
 {
-	int i;
+	AuthRpc *rpc;
 
-if(*why)print("authentication failed: %s: %s\n", phasename[s->phase], why);
-	srand((uintptr)s + time(nil));
-	for(i = 0; i < CHALLEN; i++)
-		s->tr.chal[i] = nrand(256);
+	if(why && *why)print("authentication failed: %s: %r\n", why);
 	s->uid = -1;
-	strncpy(s->tr.authid, nvr.authid, NAMELEN);
-	strncpy(s->tr.authdom, nvr.authdom, DOMLEN);
-	memmove(s->cchal, s->tr.chal, sizeof(s->cchal));
-	s->phase = HaveProtos;
+	if(rpc = s->rpc){
+		s->rpc = 0;
+		auth_freerpc(rpc);
+	}
 	return -1;
 }
 
@@ -156,7 +121,7 @@
 authnew(char *uname, char *aname)
 {
 	static int si = 0;
-	int i, nwrap;
+	int afd, i, nwrap;
 	Auth *s;
 
 	i = si;
@@ -182,6 +147,17 @@
 		}
 		unlock(&authlock);
 	}
+	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0){
+		failure(s, "open /mnt/factotum/rpc");
+		return s;
+	}
+	if((s->rpc = auth_allocrpc(afd)) == 0){
+		failure(s, "auth_allocrpc");
+		close(afd);
+		return s;
+	}
+	if(auth_rpc(s->rpc, "start", "proto=p9any role=server", 23) != ARok)
+		failure(s, "auth_rpc: start");
 	return s;
 }
 
@@ -188,50 +164,48 @@
 void
 authfree(Auth *s)
 {
-	if(s != nil)
+	if(s){
+		failure(s, "");
 		s->inuse = 0;
+	}
 }
 
 int
 authread(File* file, uchar* data, int n)
 {
+	AuthInfo *ai;
 	Auth *s;
-	int m;
 
 	s = file->auth;
 	if(s == nil)
 		return -1;
-
-	switch(s->phase){
+	if(s->rpc == nil)
+		return -1;
+	switch(auth_rpc(s->rpc, "read", nil, 0)){
 	default:
-		return failure(s, "unexpected phase");
-	case HaveProtos:
-		m = snprint((char*)data, n, "v.2 p9sk1@%s", nvr.authdom) + 1;
-		s->phase = NeedProto;
+		failure(s, "auth_rpc: read");
 		break;
-	case HaveOK:
-		m = 3;
-		if(n < m)
-			return failure(s, "read too short");
-		strcpy((char*)data, "OK");
-		s->phase = NeedCchal;
-		break;
-	case HaveSinfo:
-		m = TICKREQLEN;
-		if(n < m)
-			return failure(s, "read too short");
-		convTR2M(&s->tr, (char*)data);
-		s->phase = NeedTicket;
-		break;
-	case HaveSauthenticator:
-		m = AUTHENTLEN;
-		if(n < m)
-			return failure(s, "read too short");
-		memmove(data, s->tbuf+TICKETLEN, m);
-		s->phase = SSuccess;
-		break;
+	case ARdone:
+		if((ai = auth_getinfo(s->rpc)) == nil){
+			failure(s, "auth_getinfo failed");
+			break;
+		}
+		if(ai->cuid == nil || *ai->cuid == '\0'){
+			failure(s, "auth with no cuid");
+			auth_freeAI(ai);
+			break;
+		}
+		failure(s, "");
+		s->uid = strtouid(ai->cuid);
+		auth_freeAI(ai);
+		return 0;
+	case ARok:
+		if(n < s->rpc->narg)
+			break;
+		memmove(data, s->rpc->arg, s->rpc->narg);
+		return s->rpc->narg;
 	}
-	return m;
+	return -1;
 }
 
 int
@@ -238,73 +212,17 @@
 authwrite(File* file, uchar *data, int n)
 {
 	Auth *s;
-	int m;
-	char *p, *d;
-	Authenticator a;
 
 	s = file->auth;
 	if(s == nil)
 		return -1;
-
-	switch(s->phase){
-	default:
-		return failure(s, "unknown phase");
-	case NeedProto:
-		p = (char*)data;
-		if(p[n-1] != 0)
-			return failure(s, "proto missing terminator");
-		d = strchr(p, ' ');
-		if(d == nil)
-			return failure(s, "proto missing separator");
-		*d++ = 0;
-		if(strcmp(p, "p9sk1") != 0)
-			return failure(s, "unknown proto");
-		if(strcmp(d, nvr.authdom) != 0)
-			return failure(s, "unknown domain");
-		s->phase = HaveOK;
-		m = n;
-		break;
-	case NeedCchal:
-		m = CHALLEN;
-		if(n < m)
-			return failure(s, "client challenge too short");
-		memmove(s->cchal, data, sizeof(s->cchal));
-		s->phase = HaveSinfo;
-		break;
-	case NeedTicket:
-		m = TICKETLEN+AUTHENTLEN;
-		if(n < m)
-			return failure(s, "ticket+auth too short");
-
-		convM2T((char*)data, &s->t, nvr.machkey);
-		if(s->t.num != AuthTs
-		|| memcmp(s->t.chal, s->tr.chal, sizeof(s->t.chal)) != 0)
-			return failure(s, "bad ticket");
-
-		convM2A((char*)data+TICKETLEN, &a, s->t.key);
-		if(a.num != AuthAc
-		|| memcmp(a.chal, s->tr.chal, sizeof(a.chal)) != 0
-		|| a.id != 0)
-			return failure(s, "bad authenticator");
-
-		/* at this point, we're convinced */
-		s->uid = strtouid(s->t.suid);
-		if(s->uid < 0)
-			return failure(s, "unknown user");
-		if(cons.flags & authdebugflag)
-			print("user %s = %d authenticated\n",
-				s->t.suid, s->uid);
-
-		/* create an authenticator to send back */
-		a.num = AuthAs;
-		memmove(a.chal, s->cchal, sizeof(a.chal));
-		a.id = 0;
-		convA2M(&a, s->tbuf+TICKETLEN, s->t.key);
-
-		s->phase = HaveSauthenticator;
-		break;
+	if(s->rpc == nil)
+		return -1;
+	if(auth_rpc(s->rpc, "write", data, n) != ARok){
+		failure(s, "auth_rpc: write");
+		return -1;
 	}
-	return m;
+	return n;
 }
 
 int
--- a/sys/src/cmd/cwfs/net.c
+++ b/sys/src/cmd/cwfs/net.c
@@ -101,10 +101,8 @@
 		net->dialstr = annstrs[net - netif];
 		if (net->dialstr == nil)
 			continue;
-		net->annfd = announce(net->dialstr, net->anndir);
-		/* /bin/service/tcp564 may already have grabbed the port */
-		if (net->annfd < 0)
-			sysfatal("can't announce %s: %r", net->dialstr);
+		if((net->annfd = announce(net->dialstr, net->anndir)) < 0)
+			print("can't announce %s: %r", net->dialstr);
 		print("netinit: announced on %s\n", net->dialstr);
 	}
 }
--