xref: /plan9/sys/src/cmd/auth/factotum/dat.h (revision 6822557b53c0fb0bf9a8ec3fb47e57255de0479a)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier #include <authsrv.h>
59a747e4fSDavid du Colombier #include <mp.h>
69a747e4fSDavid du Colombier #include <libsec.h>
79a747e4fSDavid du Colombier #include <String.h>
89a747e4fSDavid du Colombier #include <thread.h>	/* only for 9p.h */
99a747e4fSDavid du Colombier #include <fcall.h>
109a747e4fSDavid du Colombier #include <9p.h>
119a747e4fSDavid du Colombier 
125d459b5aSDavid du Colombier #pragma varargck type "N" Attr*
135d459b5aSDavid du Colombier 
149a747e4fSDavid du Colombier enum
159a747e4fSDavid du Colombier {
169a747e4fSDavid du Colombier 	Maxname = 128,
179a747e4fSDavid du Colombier 	Maxrpc = 4096,
189a747e4fSDavid du Colombier 
199a747e4fSDavid du Colombier 	/* common protocol phases; proto-specific phases start at 0 */
209a747e4fSDavid du Colombier 	Notstarted = -3,
219a747e4fSDavid du Colombier 	Broken = -2,
229a747e4fSDavid du Colombier 	Established = -1,
239a747e4fSDavid du Colombier 
249a747e4fSDavid du Colombier 	/* rpc read/write return values */
259a747e4fSDavid du Colombier 	RpcFailure = 0,
269a747e4fSDavid du Colombier 	RpcNeedkey,
279a747e4fSDavid du Colombier 	RpcOk,
289a747e4fSDavid du Colombier 	RpcErrstr,
299a747e4fSDavid du Colombier 	RpcToosmall,
309a747e4fSDavid du Colombier 	RpcPhase,
319a747e4fSDavid du Colombier 	RpcConfirm,
329a747e4fSDavid du Colombier };
339a747e4fSDavid du Colombier 
349a747e4fSDavid du Colombier typedef struct Domain Domain;
359a747e4fSDavid du Colombier typedef struct Fsstate Fsstate;
369a747e4fSDavid du Colombier typedef struct Key Key;
37260f7b65SDavid du Colombier typedef struct Keyinfo Keyinfo;
389a747e4fSDavid du Colombier typedef struct Keyring Keyring;
399a747e4fSDavid du Colombier typedef struct Logbuf Logbuf;
409a747e4fSDavid du Colombier typedef struct Proto Proto;
419a747e4fSDavid du Colombier typedef struct State State;
429a747e4fSDavid du Colombier 
4312fd1c83SDavid du Colombier #pragma incomplete State
4412fd1c83SDavid du Colombier 
4512fd1c83SDavid du Colombier 
469a747e4fSDavid du Colombier struct Fsstate
479a747e4fSDavid du Colombier {
489a747e4fSDavid du Colombier 	char *sysuser;	/* user according to system */
499a747e4fSDavid du Colombier 
509a747e4fSDavid du Colombier 	/* keylist, protolist */
519a747e4fSDavid du Colombier 	int listoff;
529a747e4fSDavid du Colombier 
539a747e4fSDavid du Colombier 	/* per-rpc transient information */
549a747e4fSDavid du Colombier 	int pending;
559a747e4fSDavid du Colombier 	struct {
569a747e4fSDavid du Colombier 		char *arg, buf[Maxrpc], *verb;
579a747e4fSDavid du Colombier 		int iverb, narg, nbuf, nwant;
589a747e4fSDavid du Colombier 	} rpc;
599a747e4fSDavid du Colombier 
609a747e4fSDavid du Colombier 	/* persistent (cross-rpc) information */
619a747e4fSDavid du Colombier 	char err[ERRMAX];
629a747e4fSDavid du Colombier 	char keyinfo[3*Maxname];	/* key request */
639a747e4fSDavid du Colombier 	char **phasename;
649a747e4fSDavid du Colombier 	int haveai, maxphase, phase, seqnum, started;
659a747e4fSDavid du Colombier 	Attr *attr;
669a747e4fSDavid du Colombier 	AuthInfo ai;
679a747e4fSDavid du Colombier 	Proto *proto;
689a747e4fSDavid du Colombier 	State *ps;
699a747e4fSDavid du Colombier 	struct {		/* pending or finished key confirmations */
709a747e4fSDavid du Colombier 		Key *key;
719a747e4fSDavid du Colombier 		int canuse;
729a747e4fSDavid du Colombier 		ulong tag;
739a747e4fSDavid du Colombier 	} *conf;
749a747e4fSDavid du Colombier 	int nconf;
759a747e4fSDavid du Colombier };
769a747e4fSDavid du Colombier 
779a747e4fSDavid du Colombier struct Key
789a747e4fSDavid du Colombier {
799a747e4fSDavid du Colombier 	int ref;
809a747e4fSDavid du Colombier 	Attr *attr;
819a747e4fSDavid du Colombier 	Attr *privattr;	/* private attributes, like *data */
829a747e4fSDavid du Colombier 	Proto *proto;
839a747e4fSDavid du Colombier 
849a747e4fSDavid du Colombier 	void *priv;	/* protocol-specific; a parsed key, perhaps */
85*6822557bSDavid du Colombier 	ulong successes;
869a747e4fSDavid du Colombier };
879a747e4fSDavid du Colombier 
88260f7b65SDavid du Colombier struct Keyinfo	/* for findkey */
89260f7b65SDavid du Colombier {
90260f7b65SDavid du Colombier 	Fsstate *fss;
91260f7b65SDavid du Colombier 	char *user;
92260f7b65SDavid du Colombier 	int noconf;
93260f7b65SDavid du Colombier 	int skip;
94260f7b65SDavid du Colombier 	int usedisabled;
95260f7b65SDavid du Colombier 	Attr *attr;
96260f7b65SDavid du Colombier };
97260f7b65SDavid du Colombier 
989a747e4fSDavid du Colombier struct Keyring
999a747e4fSDavid du Colombier {
1009a747e4fSDavid du Colombier 	Key **key;
1019a747e4fSDavid du Colombier 	int nkey;
1029a747e4fSDavid du Colombier };
1039a747e4fSDavid du Colombier 
1049a747e4fSDavid du Colombier struct Logbuf
1059a747e4fSDavid du Colombier {
1069a747e4fSDavid du Colombier 	Req *wait;
1079a747e4fSDavid du Colombier 	Req **waitlast;
1089a747e4fSDavid du Colombier 	int rp;
1099a747e4fSDavid du Colombier 	int wp;
1109a747e4fSDavid du Colombier 	char *msg[128];
1119a747e4fSDavid du Colombier };
1129a747e4fSDavid du Colombier 
1139a747e4fSDavid du Colombier struct Proto
1149a747e4fSDavid du Colombier {
1159a747e4fSDavid du Colombier 	char *name;
1169a747e4fSDavid du Colombier 	int (*init)(Proto*, Fsstate*);
11770b8e010SDavid du Colombier 	int (*addkey)(Key*, int);
1189a747e4fSDavid du Colombier 	void (*closekey)(Key*);
1199a747e4fSDavid du Colombier 	int (*write)(Fsstate*, void*, uint);
1209a747e4fSDavid du Colombier 	int (*read)(Fsstate*, void*, uint*);
1219a747e4fSDavid du Colombier 	void (*close)(Fsstate*);
1229a747e4fSDavid du Colombier 	char *keyprompt;
1239a747e4fSDavid du Colombier };
1249a747e4fSDavid du Colombier 
125d9306527SDavid du Colombier extern char *invoker;
1269a747e4fSDavid du Colombier extern char *owner;
1279a747e4fSDavid du Colombier extern char *authdom;
1289a747e4fSDavid du Colombier 
1299a747e4fSDavid du Colombier extern char Easproto[];
1309a747e4fSDavid du Colombier extern char Ebadarg[];
1319a747e4fSDavid du Colombier extern char Ebadkey[];
1329a747e4fSDavid du Colombier extern char Enegotiation[];
1339a747e4fSDavid du Colombier extern char Etoolarge[];
1349a747e4fSDavid du Colombier 
1359a747e4fSDavid du Colombier /* confirm.c */
1369a747e4fSDavid du Colombier void confirmread(Req*);
1379a747e4fSDavid du Colombier void confirmflush(Req*);
1389a747e4fSDavid du Colombier int confirmwrite(char*);
1399a747e4fSDavid du Colombier void confirmqueue(Req*, Fsstate*);
1409a747e4fSDavid du Colombier void needkeyread(Req*);
1419a747e4fSDavid du Colombier void needkeyflush(Req*);
1429a747e4fSDavid du Colombier int needkeywrite(char*);
1439a747e4fSDavid du Colombier int needkeyqueue(Req*, Fsstate*);
1449a747e4fSDavid du Colombier 
1459a747e4fSDavid du Colombier /* fs.c */
1469a747e4fSDavid du Colombier extern	int		askforkeys;
1479a747e4fSDavid du Colombier extern	char		*authaddr;
1489a747e4fSDavid du Colombier extern	int		*confirminuse;
1499a747e4fSDavid du Colombier extern	int		debug;
1509a747e4fSDavid du Colombier extern	int		gflag;
1519a747e4fSDavid du Colombier extern	int		kflag;
1529a747e4fSDavid du Colombier extern	int		*needkeyinuse;
1539a747e4fSDavid du Colombier extern	int		sflag;
1549a747e4fSDavid du Colombier extern	int		uflag;
1559a747e4fSDavid du Colombier extern	char		*mtpt;
1569a747e4fSDavid du Colombier extern	char		*service;
1579a747e4fSDavid du Colombier extern	Proto 	*prototab[];
1589a747e4fSDavid du Colombier extern	Keyring	*ring;
1599a747e4fSDavid du Colombier 
1609a747e4fSDavid du Colombier /* log.c */
1619a747e4fSDavid du Colombier void flog(char*, ...);
1629a747e4fSDavid du Colombier #pragma varargck argpos flog 1
1639a747e4fSDavid du Colombier void logread(Req*);
1649a747e4fSDavid du Colombier void logflush(Req*);
1659a747e4fSDavid du Colombier void logbufflush(Logbuf*, Req*);
1669a747e4fSDavid du Colombier void logbufread(Logbuf*, Req*);
1679a747e4fSDavid du Colombier void logbufproc(Logbuf*);
1689a747e4fSDavid du Colombier void logbufappend(Logbuf*, char*);
1699a747e4fSDavid du Colombier void needkeyread(Req*);
1709a747e4fSDavid du Colombier void needkeyflush(Req*);
1719a747e4fSDavid du Colombier int needkeywrite(char*);
1729a747e4fSDavid du Colombier int needkeyqueue(Req*, Fsstate*);
1739a747e4fSDavid du Colombier 
1749a747e4fSDavid du Colombier /* rpc.c */
17570b8e010SDavid du Colombier int ctlwrite(char*, int);
1769a747e4fSDavid du Colombier void rpcrdwrlog(Fsstate*, char*, uint, int, int);
1779a747e4fSDavid du Colombier void rpcstartlog(Attr*, Fsstate*, int);
1789a747e4fSDavid du Colombier void rpcread(Req*);
1799a747e4fSDavid du Colombier void rpcwrite(Req*);
1809a747e4fSDavid du Colombier 
1819a747e4fSDavid du Colombier /* secstore.c */
1829a747e4fSDavid du Colombier int havesecstore(void);
1839a747e4fSDavid du Colombier int secstorefetch(char*);
1849a747e4fSDavid du Colombier 
1859a747e4fSDavid du Colombier /* util.c */
1869a747e4fSDavid du Colombier #define emalloc emalloc9p
1879a747e4fSDavid du Colombier #define estrdup estrdup9p
1889a747e4fSDavid du Colombier #define erealloc erealloc9p
1899a747e4fSDavid du Colombier #pragma varargck argpos failure 2
190260f7b65SDavid du Colombier #pragma varargck argpos findkey 3
1919a747e4fSDavid du Colombier #pragma varargck argpos setattr 2
1929a747e4fSDavid du Colombier 
1939a747e4fSDavid du Colombier int		_authdial(char*, char*);
1949a747e4fSDavid du Colombier void		askuser(char*);
1955d459b5aSDavid du Colombier int		attrnamefmt(Fmt *fmt);
1969a747e4fSDavid du Colombier int		canusekey(Fsstate*, Key*);
1979a747e4fSDavid du Colombier void		closekey(Key*);
1989a747e4fSDavid du Colombier uchar	*convAI2M(AuthInfo*, uchar*, int);
199260f7b65SDavid du Colombier void		disablekey(Key*);
2002ebbfa15SDavid du Colombier char		*estrappend(char*, char*, ...);
2012ebbfa15SDavid du Colombier #pragma varargck argpos estrappend 2
2029a747e4fSDavid du Colombier int		failure(Fsstate*, char*, ...);
203260f7b65SDavid du Colombier Keyinfo*	mkkeyinfo(Keyinfo*, Fsstate*, Attr*);
204260f7b65SDavid du Colombier int		findkey(Key**, Keyinfo*, char*, ...);
2059a747e4fSDavid du Colombier int		findp9authkey(Key**, Fsstate*);
2069a747e4fSDavid du Colombier Proto	*findproto(char*);
2079a747e4fSDavid du Colombier char		*getnvramkey(int, char**);
2083ff48bf5SDavid du Colombier void		initcap(void);
2099a747e4fSDavid du Colombier int		isclient(char*);
2109a747e4fSDavid du Colombier int		matchattr(Attr*, Attr*, Attr*);
2119a747e4fSDavid du Colombier void 		memrandom(void*, int);
2123ff48bf5SDavid du Colombier char 		*mkcap(char*, char*);
2139a747e4fSDavid du Colombier int 		phaseerror(Fsstate*, char*);
2149a747e4fSDavid du Colombier char		*phasename(Fsstate*, int, char*);
2159a747e4fSDavid du Colombier void 		promptforhostowner(void);
2162ebbfa15SDavid du Colombier char		*readcons(char*, char*, int);
21770b8e010SDavid du Colombier int		replacekey(Key*, int before);
2189a747e4fSDavid du Colombier char		*safecpy(char*, char*, int);
2199a747e4fSDavid du Colombier int		secdial(void);
2209a747e4fSDavid du Colombier Attr		*setattr(Attr*, char*, ...);
2219a747e4fSDavid du Colombier Attr		*setattrs(Attr*, Attr*);
2229a747e4fSDavid du Colombier void		sethostowner(void);
2239a747e4fSDavid du Colombier void		setmalloctaghere(void*);
2249a747e4fSDavid du Colombier int		smatch(char*, char*);
2259a747e4fSDavid du Colombier Attr		*sortattr(Attr*);
2269a747e4fSDavid du Colombier int		toosmall(Fsstate*, uint);
2279a747e4fSDavid du Colombier void		writehostowner(char*);
2289a747e4fSDavid du Colombier 
2299a747e4fSDavid du Colombier /* protocols */
2309a747e4fSDavid du Colombier extern Proto apop, cram;		/* apop.c */
2319a747e4fSDavid du Colombier extern Proto p9any, p9sk1, p9sk2;	/* p9sk.c */
2329a747e4fSDavid du Colombier extern Proto chap, mschap;		/* chap.c */
2339a747e4fSDavid du Colombier extern Proto p9cr, vnc;			/* p9cr.c */
2349a747e4fSDavid du Colombier extern Proto pass;			/* pass.c */
2352ebbfa15SDavid du Colombier extern Proto rsa;			/* rsa.c */
236fb7f0c93SDavid du Colombier extern Proto wep;			/* wep.c */
23749eeb88aSDavid du Colombier /* extern Proto srs;			/* srs.c */
2385ab4dd4cSDavid du Colombier extern Proto httpdigest;		/* httpdigest.c */
239