Blame


1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
3 6e527fbc 2005-02-13 devnull #include <9pclient.h>
4 6e527fbc 2005-02-13 devnull
5 6e527fbc 2005-02-13 devnull int extrafactotumdir;
6 6e527fbc 2005-02-13 devnull int debug;
7 6e527fbc 2005-02-13 devnull int trysecstore = 1;
8 6e527fbc 2005-02-13 devnull char *factname = "factotum";
9 6e527fbc 2005-02-13 devnull char *service = "factotum";
10 6e527fbc 2005-02-13 devnull char *owner;
11 6e527fbc 2005-02-13 devnull char *authaddr;
12 6e527fbc 2005-02-13 devnull void gflag(char*);
13 6e527fbc 2005-02-13 devnull
14 6e527fbc 2005-02-13 devnull void
15 6e527fbc 2005-02-13 devnull usage(void)
16 6e527fbc 2005-02-13 devnull {
17 6e527fbc 2005-02-13 devnull fprint(2, "usage: factotum [-Dd] [-a authaddr] [-m mtpt] [-s service]\n");
18 6e527fbc 2005-02-13 devnull fprint(2, " or factotum -g keypattern\n");
19 6e527fbc 2005-02-13 devnull fprint(2, " or factotum -g 'badkeyattr\\nmsg\\nkeypattern'\n");
20 6e527fbc 2005-02-13 devnull threadexitsall("usage");
21 6e527fbc 2005-02-13 devnull }
22 6e527fbc 2005-02-13 devnull
23 6e527fbc 2005-02-13 devnull void
24 6e527fbc 2005-02-13 devnull threadmain(int argc, char *argv[])
25 6e527fbc 2005-02-13 devnull {
26 6e527fbc 2005-02-13 devnull char *mtpt;
27 6e527fbc 2005-02-13 devnull char err[ERRMAX];
28 6e527fbc 2005-02-13 devnull
29 6e527fbc 2005-02-13 devnull // mtpt = "/mnt";
30 6e527fbc 2005-02-13 devnull mtpt = nil;
31 6e527fbc 2005-02-13 devnull owner = getuser();
32 6e527fbc 2005-02-13 devnull quotefmtinstall();
33 6e527fbc 2005-02-13 devnull fmtinstall('A', attrfmt);
34 6e527fbc 2005-02-13 devnull fmtinstall('H', encodefmt);
35 6e527fbc 2005-02-13 devnull fmtinstall('N', attrnamefmt);
36 6e527fbc 2005-02-13 devnull
37 6e527fbc 2005-02-13 devnull if(argc == 3 && strcmp(argv[1], "-g") == 0){
38 6e527fbc 2005-02-13 devnull gflag(argv[2]);
39 6e527fbc 2005-02-13 devnull threadexitsall(nil);
40 6e527fbc 2005-02-13 devnull }
41 6e527fbc 2005-02-13 devnull
42 6e527fbc 2005-02-13 devnull ARGBEGIN{
43 6e527fbc 2005-02-13 devnull default:
44 6e527fbc 2005-02-13 devnull usage();
45 6e527fbc 2005-02-13 devnull case 'D':
46 6e527fbc 2005-02-13 devnull chatty9p++;
47 6e527fbc 2005-02-13 devnull break;
48 6e527fbc 2005-02-13 devnull case 'a':
49 6e527fbc 2005-02-13 devnull authaddr = EARGF(usage());
50 6e527fbc 2005-02-13 devnull break;
51 1757e76a 2005-02-13 devnull case 'd':
52 1757e76a 2005-02-13 devnull debug = 1;
53 1757e76a 2005-02-13 devnull break;
54 6e527fbc 2005-02-13 devnull case 'g':
55 6e527fbc 2005-02-13 devnull usage();
56 6e527fbc 2005-02-13 devnull case 'm':
57 6e527fbc 2005-02-13 devnull mtpt = EARGF(usage());
58 6e527fbc 2005-02-13 devnull break;
59 6e527fbc 2005-02-13 devnull case 's':
60 6e527fbc 2005-02-13 devnull service = EARGF(usage());
61 6e527fbc 2005-02-13 devnull break;
62 6e527fbc 2005-02-13 devnull case 'n':
63 6e527fbc 2005-02-13 devnull trysecstore = 0;
64 6e527fbc 2005-02-13 devnull break;
65 6e527fbc 2005-02-13 devnull case 'x':
66 6e527fbc 2005-02-13 devnull extrafactotumdir = 1;
67 6e527fbc 2005-02-13 devnull break;
68 6e527fbc 2005-02-13 devnull }ARGEND
69 6e527fbc 2005-02-13 devnull
70 6e527fbc 2005-02-13 devnull if(argc != 0)
71 6e527fbc 2005-02-13 devnull usage();
72 6e527fbc 2005-02-13 devnull
73 6e527fbc 2005-02-13 devnull if(trysecstore && havesecstore()){
74 6e527fbc 2005-02-13 devnull while(secstorefetch() < 0){
75 6e527fbc 2005-02-13 devnull rerrstr(err, sizeof err);
76 6e527fbc 2005-02-13 devnull if(strcmp(err, "cancel") == 0)
77 6e527fbc 2005-02-13 devnull break;
78 6e527fbc 2005-02-13 devnull fprint(2, "secstorefetch: %r\n");
79 6e527fbc 2005-02-13 devnull fprint(2, "Enter an empty password to quit.\n");
80 6e527fbc 2005-02-13 devnull }
81 6e527fbc 2005-02-13 devnull }
82 6e527fbc 2005-02-13 devnull
83 b3e7c026 2005-03-15 devnull fsinit0();
84 6e527fbc 2005-02-13 devnull threadpostmountsrv(&fs, service, mtpt, MBEFORE);
85 6e527fbc 2005-02-13 devnull threadexits(nil);
86 6e527fbc 2005-02-13 devnull }
87 6e527fbc 2005-02-13 devnull
88 6e527fbc 2005-02-13 devnull /*
89 6e527fbc 2005-02-13 devnull * prompt user for a key. don't care about memory leaks, runs standalone
90 6e527fbc 2005-02-13 devnull */
91 6e527fbc 2005-02-13 devnull static Attr*
92 6e527fbc 2005-02-13 devnull promptforkey(int fd, char *params)
93 6e527fbc 2005-02-13 devnull {
94 6e527fbc 2005-02-13 devnull char *v;
95 6e527fbc 2005-02-13 devnull Attr *a, *attr;
96 6e527fbc 2005-02-13 devnull char *def;
97 6e527fbc 2005-02-13 devnull
98 6e527fbc 2005-02-13 devnull attr = _parseattr(params);
99 6e527fbc 2005-02-13 devnull fprint(fd, "!adding key:");
100 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next)
101 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery && a->name[0] != '!')
102 6e527fbc 2005-02-13 devnull fprint(fd, " %q=%q", a->name, a->val);
103 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
104 6e527fbc 2005-02-13 devnull
105 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next){
106 6e527fbc 2005-02-13 devnull v = a->name;
107 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery || v[0]=='!')
108 6e527fbc 2005-02-13 devnull continue;
109 6e527fbc 2005-02-13 devnull def = nil;
110 6e527fbc 2005-02-13 devnull if(strcmp(v, "user") == 0)
111 6e527fbc 2005-02-13 devnull def = getuser();
112 6e527fbc 2005-02-13 devnull a->val = readcons(v, def, 0);
113 6e527fbc 2005-02-13 devnull if(a->val == nil)
114 6e527fbc 2005-02-13 devnull sysfatal("user terminated key input");
115 6e527fbc 2005-02-13 devnull a->type = AttrNameval;
116 6e527fbc 2005-02-13 devnull }
117 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next){
118 6e527fbc 2005-02-13 devnull v = a->name;
119 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery || v[0]!='!')
120 6e527fbc 2005-02-13 devnull continue;
121 6e527fbc 2005-02-13 devnull def = nil;
122 6e527fbc 2005-02-13 devnull if(strcmp(v+1, "user") == 0)
123 6e527fbc 2005-02-13 devnull def = getuser();
124 6e527fbc 2005-02-13 devnull a->val = readcons(v+1, def, 1);
125 6e527fbc 2005-02-13 devnull if(a->val == nil)
126 6e527fbc 2005-02-13 devnull sysfatal("user terminated key input");
127 6e527fbc 2005-02-13 devnull a->type = AttrNameval;
128 6e527fbc 2005-02-13 devnull }
129 6e527fbc 2005-02-13 devnull fprint(fd, "!\n");
130 6e527fbc 2005-02-13 devnull close(fd);
131 6e527fbc 2005-02-13 devnull return attr;
132 6e527fbc 2005-02-13 devnull }
133 6e527fbc 2005-02-13 devnull
134 6e527fbc 2005-02-13 devnull /*
135 6e527fbc 2005-02-13 devnull * send a key to the mounted factotum
136 6e527fbc 2005-02-13 devnull */
137 6e527fbc 2005-02-13 devnull static int
138 6e527fbc 2005-02-13 devnull sendkey(Attr *attr)
139 6e527fbc 2005-02-13 devnull {
140 6e527fbc 2005-02-13 devnull int rv;
141 6e527fbc 2005-02-13 devnull char buf[8192];
142 6e527fbc 2005-02-13 devnull CFid *fid;
143 6e527fbc 2005-02-13 devnull
144 6e527fbc 2005-02-13 devnull fid = nsopen("factotum", nil, "ctl", OWRITE);
145 6e527fbc 2005-02-13 devnull if(fid == nil)
146 6e527fbc 2005-02-13 devnull sysfatal("opening factotum/ctl: %r");
147 6e527fbc 2005-02-13 devnull snprint(buf, sizeof buf, "key %A\n", attr);
148 6e527fbc 2005-02-13 devnull rv = fswrite(fid, buf, strlen(buf));
149 6e527fbc 2005-02-13 devnull fsclose(fid);
150 6e527fbc 2005-02-13 devnull return rv;
151 6e527fbc 2005-02-13 devnull }
152 6e527fbc 2005-02-13 devnull
153 6e527fbc 2005-02-13 devnull static void
154 6e527fbc 2005-02-13 devnull askuser(int fd, char *params)
155 6e527fbc 2005-02-13 devnull {
156 6e527fbc 2005-02-13 devnull Attr *attr;
157 6e527fbc 2005-02-13 devnull
158 6e527fbc 2005-02-13 devnull attr = promptforkey(fd, params);
159 6e527fbc 2005-02-13 devnull if(attr == nil)
160 6e527fbc 2005-02-13 devnull sysfatal("no key supplied");
161 6e527fbc 2005-02-13 devnull if(sendkey(attr) < 0)
162 6e527fbc 2005-02-13 devnull sysfatal("sending key to factotum: %r");
163 6e527fbc 2005-02-13 devnull }
164 6e527fbc 2005-02-13 devnull
165 6e527fbc 2005-02-13 devnull void
166 6e527fbc 2005-02-13 devnull gflag(char *s)
167 6e527fbc 2005-02-13 devnull {
168 6e527fbc 2005-02-13 devnull char *f[4];
169 6e527fbc 2005-02-13 devnull int nf;
170 6e527fbc 2005-02-13 devnull int fd;
171 6e527fbc 2005-02-13 devnull
172 6e527fbc 2005-02-13 devnull if((fd = open("/dev/tty", ORDWR)) < 0)
173 6e527fbc 2005-02-13 devnull sysfatal("open /dev/tty: %r");
174 6e527fbc 2005-02-13 devnull
175 6e527fbc 2005-02-13 devnull nf = getfields(s, f, nelem(f), 0, "\n");
176 6e527fbc 2005-02-13 devnull if(nf == 1){ /* needkey or old badkey */
177 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
178 6e527fbc 2005-02-13 devnull askuser(fd, s);
179 6e527fbc 2005-02-13 devnull threadexitsall(nil);
180 6e527fbc 2005-02-13 devnull }
181 6e527fbc 2005-02-13 devnull if(nf == 3){ /* new badkey */
182 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
183 6e527fbc 2005-02-13 devnull fprint(fd, "!replace: %s\n", f[0]);
184 6e527fbc 2005-02-13 devnull fprint(fd, "!because: %s\n", f[1]);
185 6e527fbc 2005-02-13 devnull askuser(fd, f[2]);
186 6e527fbc 2005-02-13 devnull threadexitsall(nil);
187 6e527fbc 2005-02-13 devnull }
188 6e527fbc 2005-02-13 devnull usage();
189 6e527fbc 2005-02-13 devnull }