Blame


1 2277c5d7 2004-03-21 devnull #include "std.h"
2 2277c5d7 2004-03-21 devnull #include "dat.h"
3 2277c5d7 2004-03-21 devnull #include <bio.h>
4 2277c5d7 2004-03-21 devnull
5 2277c5d7 2004-03-21 devnull int
6 2277c5d7 2004-03-21 devnull memrandom(void *p, int n)
7 2277c5d7 2004-03-21 devnull {
8 2277c5d7 2004-03-21 devnull uchar *cp;
9 2277c5d7 2004-03-21 devnull
10 2277c5d7 2004-03-21 devnull for(cp = (uchar*)p; n > 0; n--)
11 2277c5d7 2004-03-21 devnull *cp++ = fastrand();
12 2277c5d7 2004-03-21 devnull return 0;
13 2277c5d7 2004-03-21 devnull }
14 2277c5d7 2004-03-21 devnull
15 2277c5d7 2004-03-21 devnull /*
16 2277c5d7 2004-03-21 devnull * create a change uid capability
17 2277c5d7 2004-03-21 devnull */
18 2277c5d7 2004-03-21 devnull static int caphashfd;
19 2277c5d7 2004-03-21 devnull
20 2277c5d7 2004-03-21 devnull static char*
21 2277c5d7 2004-03-21 devnull mkcap(char *from, char *to)
22 2277c5d7 2004-03-21 devnull {
23 2277c5d7 2004-03-21 devnull uchar rand[20];
24 2277c5d7 2004-03-21 devnull char *cap;
25 2277c5d7 2004-03-21 devnull char *key;
26 2277c5d7 2004-03-21 devnull int nfrom, nto;
27 2277c5d7 2004-03-21 devnull uchar hash[SHA1dlen];
28 2277c5d7 2004-03-21 devnull
29 2277c5d7 2004-03-21 devnull if(caphashfd < 0)
30 2277c5d7 2004-03-21 devnull return nil;
31 2277c5d7 2004-03-21 devnull
32 2277c5d7 2004-03-21 devnull /* create the capability */
33 2277c5d7 2004-03-21 devnull nto = strlen(to);
34 2277c5d7 2004-03-21 devnull nfrom = strlen(from);
35 2277c5d7 2004-03-21 devnull cap = emalloc(nfrom+1+nto+1+sizeof(rand)*3+1);
36 2277c5d7 2004-03-21 devnull sprint(cap, "%s@%s", from, to);
37 2277c5d7 2004-03-21 devnull memrandom(rand, sizeof(rand));
38 2277c5d7 2004-03-21 devnull key = cap+nfrom+1+nto+1;
39 2277c5d7 2004-03-21 devnull enc64(key, sizeof(rand)*3, rand, sizeof(rand));
40 2277c5d7 2004-03-21 devnull
41 2277c5d7 2004-03-21 devnull /* hash the capability */
42 2277c5d7 2004-03-21 devnull hmac_sha1((uchar*)cap, strlen(cap), (uchar*)key, strlen(key), hash, nil);
43 2277c5d7 2004-03-21 devnull
44 2277c5d7 2004-03-21 devnull /* give the kernel the hash */
45 2277c5d7 2004-03-21 devnull key[-1] = '@';
46 2277c5d7 2004-03-21 devnull if(write(caphashfd, hash, SHA1dlen) < 0){
47 2277c5d7 2004-03-21 devnull free(cap);
48 2277c5d7 2004-03-21 devnull return nil;
49 2277c5d7 2004-03-21 devnull }
50 2277c5d7 2004-03-21 devnull
51 2277c5d7 2004-03-21 devnull return cap;
52 2277c5d7 2004-03-21 devnull }
53 2277c5d7 2004-03-21 devnull
54 2277c5d7 2004-03-21 devnull Attr*
55 2277c5d7 2004-03-21 devnull addcap(Attr *a, char *from, Ticket *t)
56 2277c5d7 2004-03-21 devnull {
57 2277c5d7 2004-03-21 devnull char *cap;
58 2277c5d7 2004-03-21 devnull
59 2277c5d7 2004-03-21 devnull cap = mkcap(from, t->suid);
60 2277c5d7 2004-03-21 devnull return addattr(a, "cuid=%q suid=%q cap=%q", t->cuid, t->suid, cap);
61 2277c5d7 2004-03-21 devnull }
62 2277c5d7 2004-03-21 devnull
63 2277c5d7 2004-03-21 devnull /* bind in the default network and cs */
64 2277c5d7 2004-03-21 devnull static int
65 2277c5d7 2004-03-21 devnull bindnetcs(void)
66 2277c5d7 2004-03-21 devnull {
67 2277c5d7 2004-03-21 devnull int srvfd;
68 2277c5d7 2004-03-21 devnull
69 2277c5d7 2004-03-21 devnull if(access("/net/tcp", AEXIST) < 0)
70 2277c5d7 2004-03-21 devnull bind("#I", "/net", MBEFORE);
71 2277c5d7 2004-03-21 devnull
72 2277c5d7 2004-03-21 devnull if(access("/net/cs", AEXIST) < 0){
73 2277c5d7 2004-03-21 devnull if((srvfd = open("#s/cs", ORDWR)) >= 0){
74 2277c5d7 2004-03-21 devnull /* mount closes srvfd on success */
75 2277c5d7 2004-03-21 devnull if(mount(srvfd, -1, "/net", MBEFORE, "") >= 0)
76 2277c5d7 2004-03-21 devnull return 0;
77 2277c5d7 2004-03-21 devnull close(srvfd);
78 2277c5d7 2004-03-21 devnull }
79 2277c5d7 2004-03-21 devnull return -1;
80 2277c5d7 2004-03-21 devnull }
81 2277c5d7 2004-03-21 devnull return 0;
82 2277c5d7 2004-03-21 devnull }
83 2277c5d7 2004-03-21 devnull
84 2277c5d7 2004-03-21 devnull int
85 2277c5d7 2004-03-21 devnull _authdial(char *net, char *authdom)
86 2277c5d7 2004-03-21 devnull {
87 2277c5d7 2004-03-21 devnull int vanilla;
88 2277c5d7 2004-03-21 devnull
89 2277c5d7 2004-03-21 devnull vanilla = net==nil || strcmp(net, "/net")==0;
90 2277c5d7 2004-03-21 devnull
91 2277c5d7 2004-03-21 devnull if(!vanilla || bindnetcs()>=0)
92 2277c5d7 2004-03-21 devnull return authdial(net, authdom);
93 2277c5d7 2004-03-21 devnull
94 2277c5d7 2004-03-21 devnull /* use the auth sever passed to us as an arg */
95 2277c5d7 2004-03-21 devnull if(authaddr == nil)
96 2277c5d7 2004-03-21 devnull return -1;
97 2277c5d7 2004-03-21 devnull return dial(netmkaddr(authaddr, "tcp", "567"), 0, 0, 0);
98 2277c5d7 2004-03-21 devnull }
99 2277c5d7 2004-03-21 devnull
100 2277c5d7 2004-03-21 devnull Key*
101 2277c5d7 2004-03-21 devnull plan9authkey(Attr *a)
102 2277c5d7 2004-03-21 devnull {
103 2277c5d7 2004-03-21 devnull char *dom;
104 2277c5d7 2004-03-21 devnull Key *k;
105 2277c5d7 2004-03-21 devnull
106 2277c5d7 2004-03-21 devnull /*
107 2277c5d7 2004-03-21 devnull * The only important part of a is dom.
108 2277c5d7 2004-03-21 devnull * We don't care, for example, about user name.
109 2277c5d7 2004-03-21 devnull */
110 2277c5d7 2004-03-21 devnull dom = strfindattr(a, "dom");
111 2277c5d7 2004-03-21 devnull if(dom)
112 2277c5d7 2004-03-21 devnull k = keylookup("proto=p9sk1 role=server user? dom=%q", dom);
113 2277c5d7 2004-03-21 devnull else
114 2277c5d7 2004-03-21 devnull k = keylookup("proto=p9sk1 role=server user? dom?");
115 2277c5d7 2004-03-21 devnull if(k == nil)
116 2277c5d7 2004-03-21 devnull werrstr("could not find plan 9 auth key dom %q", dom);
117 2277c5d7 2004-03-21 devnull return k;
118 2277c5d7 2004-03-21 devnull }
119 2277c5d7 2004-03-21 devnull
120 2277c5d7 2004-03-21 devnull /*
121 2277c5d7 2004-03-21 devnull * prompt for a string with a possible default response
122 2277c5d7 2004-03-21 devnull */
123 2277c5d7 2004-03-21 devnull char*
124 2277c5d7 2004-03-21 devnull readcons(char *prompt, char *def, int raw)
125 2277c5d7 2004-03-21 devnull {
126 2277c5d7 2004-03-21 devnull int fdin, fdout, ctl, n;
127 2277c5d7 2004-03-21 devnull char line[10];
128 2277c5d7 2004-03-21 devnull char *s;
129 2277c5d7 2004-03-21 devnull
130 2277c5d7 2004-03-21 devnull fdin = open("/dev/cons", OREAD);
131 2277c5d7 2004-03-21 devnull if(fdin < 0)
132 2277c5d7 2004-03-21 devnull fdin = 0;
133 2277c5d7 2004-03-21 devnull fdout = open("/dev/cons", OWRITE);
134 2277c5d7 2004-03-21 devnull if(fdout < 0)
135 2277c5d7 2004-03-21 devnull fdout = 1;
136 2277c5d7 2004-03-21 devnull if(def != nil)
137 2277c5d7 2004-03-21 devnull fprint(fdout, "%s[%s]: ", prompt, def);
138 2277c5d7 2004-03-21 devnull else
139 2277c5d7 2004-03-21 devnull fprint(fdout, "%s: ", prompt);
140 2277c5d7 2004-03-21 devnull if(raw){
141 2277c5d7 2004-03-21 devnull ctl = open("/dev/consctl", OWRITE);
142 2277c5d7 2004-03-21 devnull if(ctl >= 0)
143 2277c5d7 2004-03-21 devnull write(ctl, "rawon", 5);
144 2277c5d7 2004-03-21 devnull } else
145 2277c5d7 2004-03-21 devnull ctl = -1;
146 2277c5d7 2004-03-21 devnull s = estrdup("");
147 2277c5d7 2004-03-21 devnull for(;;){
148 2277c5d7 2004-03-21 devnull n = read(fdin, line, 1);
149 2277c5d7 2004-03-21 devnull if(n == 0){
150 2277c5d7 2004-03-21 devnull Error:
151 2277c5d7 2004-03-21 devnull close(fdin);
152 2277c5d7 2004-03-21 devnull close(fdout);
153 2277c5d7 2004-03-21 devnull if(ctl >= 0)
154 2277c5d7 2004-03-21 devnull close(ctl);
155 2277c5d7 2004-03-21 devnull free(s);
156 2277c5d7 2004-03-21 devnull return nil;
157 2277c5d7 2004-03-21 devnull }
158 2277c5d7 2004-03-21 devnull if(n < 0)
159 2277c5d7 2004-03-21 devnull goto Error;
160 2277c5d7 2004-03-21 devnull if(line[0] == 0x7f)
161 2277c5d7 2004-03-21 devnull goto Error;
162 2277c5d7 2004-03-21 devnull if(n == 0 || line[0] == '\n' || line[0] == '\r'){
163 2277c5d7 2004-03-21 devnull if(raw){
164 2277c5d7 2004-03-21 devnull write(ctl, "rawoff", 6);
165 2277c5d7 2004-03-21 devnull write(fdout, "\n", 1);
166 2277c5d7 2004-03-21 devnull }
167 2277c5d7 2004-03-21 devnull close(ctl);
168 2277c5d7 2004-03-21 devnull close(fdin);
169 2277c5d7 2004-03-21 devnull close(fdout);
170 2277c5d7 2004-03-21 devnull if(*s == 0 && def != nil)
171 2277c5d7 2004-03-21 devnull s = estrappend(s, "%s", def);
172 2277c5d7 2004-03-21 devnull return s;
173 2277c5d7 2004-03-21 devnull }
174 2277c5d7 2004-03-21 devnull if(line[0] == '\b'){
175 2277c5d7 2004-03-21 devnull if(strlen(s) > 0)
176 2277c5d7 2004-03-21 devnull s[strlen(s)-1] = 0;
177 2277c5d7 2004-03-21 devnull } else if(line[0] == 0x15) { /* ^U: line kill */
178 2277c5d7 2004-03-21 devnull if(def != nil)
179 2277c5d7 2004-03-21 devnull fprint(fdout, "\n%s[%s]: ", prompt, def);
180 2277c5d7 2004-03-21 devnull else
181 2277c5d7 2004-03-21 devnull fprint(fdout, "\n%s: ", prompt);
182 2277c5d7 2004-03-21 devnull
183 2277c5d7 2004-03-21 devnull s[0] = 0;
184 2277c5d7 2004-03-21 devnull } else {
185 2277c5d7 2004-03-21 devnull s = estrappend(s, "%c", line[0]);
186 2277c5d7 2004-03-21 devnull }
187 2277c5d7 2004-03-21 devnull }
188 2277c5d7 2004-03-21 devnull return nil; /* not reached */
189 2277c5d7 2004-03-21 devnull }