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 cbeb0b26 2006-04-01 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 d10a7ed9 2010-12-07 rsc rfork(RFNOTEG);
74 d10a7ed9 2010-12-07 rsc
75 6e527fbc 2005-02-13 devnull if(trysecstore && havesecstore()){
76 6e527fbc 2005-02-13 devnull while(secstorefetch() < 0){
77 6e527fbc 2005-02-13 devnull rerrstr(err, sizeof err);
78 6e527fbc 2005-02-13 devnull if(strcmp(err, "cancel") == 0)
79 6e527fbc 2005-02-13 devnull break;
80 6e527fbc 2005-02-13 devnull fprint(2, "secstorefetch: %r\n");
81 6e527fbc 2005-02-13 devnull fprint(2, "Enter an empty password to quit.\n");
82 6e527fbc 2005-02-13 devnull }
83 6e527fbc 2005-02-13 devnull }
84 6e527fbc 2005-02-13 devnull
85 b3e7c026 2005-03-15 devnull fsinit0();
86 6e527fbc 2005-02-13 devnull threadpostmountsrv(&fs, service, mtpt, MBEFORE);
87 6e527fbc 2005-02-13 devnull threadexits(nil);
88 6e527fbc 2005-02-13 devnull }
89 6e527fbc 2005-02-13 devnull
90 6e527fbc 2005-02-13 devnull /*
91 6e527fbc 2005-02-13 devnull * prompt user for a key. don't care about memory leaks, runs standalone
92 6e527fbc 2005-02-13 devnull */
93 6e527fbc 2005-02-13 devnull static Attr*
94 6e527fbc 2005-02-13 devnull promptforkey(int fd, char *params)
95 6e527fbc 2005-02-13 devnull {
96 6e527fbc 2005-02-13 devnull char *v;
97 6e527fbc 2005-02-13 devnull Attr *a, *attr;
98 6e527fbc 2005-02-13 devnull char *def;
99 6e527fbc 2005-02-13 devnull
100 6e527fbc 2005-02-13 devnull attr = _parseattr(params);
101 6e527fbc 2005-02-13 devnull fprint(fd, "!adding key:");
102 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next)
103 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery && a->name[0] != '!')
104 6e527fbc 2005-02-13 devnull fprint(fd, " %q=%q", a->name, a->val);
105 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
106 6e527fbc 2005-02-13 devnull
107 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next){
108 6e527fbc 2005-02-13 devnull v = a->name;
109 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery || v[0]=='!')
110 6e527fbc 2005-02-13 devnull continue;
111 6e527fbc 2005-02-13 devnull def = nil;
112 6e527fbc 2005-02-13 devnull if(strcmp(v, "user") == 0)
113 6e527fbc 2005-02-13 devnull def = getuser();
114 6e527fbc 2005-02-13 devnull a->val = readcons(v, def, 0);
115 6e527fbc 2005-02-13 devnull if(a->val == nil)
116 6e527fbc 2005-02-13 devnull sysfatal("user terminated key input");
117 6e527fbc 2005-02-13 devnull a->type = AttrNameval;
118 6e527fbc 2005-02-13 devnull }
119 6e527fbc 2005-02-13 devnull for(a=attr; a; a=a->next){
120 6e527fbc 2005-02-13 devnull v = a->name;
121 6e527fbc 2005-02-13 devnull if(a->type != AttrQuery || v[0]!='!')
122 6e527fbc 2005-02-13 devnull continue;
123 6e527fbc 2005-02-13 devnull def = nil;
124 6e527fbc 2005-02-13 devnull if(strcmp(v+1, "user") == 0)
125 6e527fbc 2005-02-13 devnull def = getuser();
126 6e527fbc 2005-02-13 devnull a->val = readcons(v+1, def, 1);
127 6e527fbc 2005-02-13 devnull if(a->val == nil)
128 6e527fbc 2005-02-13 devnull sysfatal("user terminated key input");
129 6e527fbc 2005-02-13 devnull a->type = AttrNameval;
130 6e527fbc 2005-02-13 devnull }
131 6e527fbc 2005-02-13 devnull fprint(fd, "!\n");
132 6e527fbc 2005-02-13 devnull close(fd);
133 6e527fbc 2005-02-13 devnull return attr;
134 6e527fbc 2005-02-13 devnull }
135 6e527fbc 2005-02-13 devnull
136 6e527fbc 2005-02-13 devnull /*
137 6e527fbc 2005-02-13 devnull * send a key to the mounted factotum
138 6e527fbc 2005-02-13 devnull */
139 6e527fbc 2005-02-13 devnull static int
140 6e527fbc 2005-02-13 devnull sendkey(Attr *attr)
141 6e527fbc 2005-02-13 devnull {
142 6e527fbc 2005-02-13 devnull int rv;
143 6e527fbc 2005-02-13 devnull char buf[8192];
144 6e527fbc 2005-02-13 devnull CFid *fid;
145 6e527fbc 2005-02-13 devnull
146 6e527fbc 2005-02-13 devnull fid = nsopen("factotum", nil, "ctl", OWRITE);
147 6e527fbc 2005-02-13 devnull if(fid == nil)
148 6e527fbc 2005-02-13 devnull sysfatal("opening factotum/ctl: %r");
149 6e527fbc 2005-02-13 devnull snprint(buf, sizeof buf, "key %A\n", attr);
150 6e527fbc 2005-02-13 devnull rv = fswrite(fid, buf, strlen(buf));
151 6e527fbc 2005-02-13 devnull fsclose(fid);
152 6e527fbc 2005-02-13 devnull return rv;
153 6e527fbc 2005-02-13 devnull }
154 6e527fbc 2005-02-13 devnull
155 6e527fbc 2005-02-13 devnull static void
156 6e527fbc 2005-02-13 devnull askuser(int fd, char *params)
157 6e527fbc 2005-02-13 devnull {
158 6e527fbc 2005-02-13 devnull Attr *attr;
159 6e527fbc 2005-02-13 devnull
160 6e527fbc 2005-02-13 devnull attr = promptforkey(fd, params);
161 6e527fbc 2005-02-13 devnull if(attr == nil)
162 6e527fbc 2005-02-13 devnull sysfatal("no key supplied");
163 6e527fbc 2005-02-13 devnull if(sendkey(attr) < 0)
164 6e527fbc 2005-02-13 devnull sysfatal("sending key to factotum: %r");
165 6e527fbc 2005-02-13 devnull }
166 6e527fbc 2005-02-13 devnull
167 6e527fbc 2005-02-13 devnull void
168 6e527fbc 2005-02-13 devnull gflag(char *s)
169 6e527fbc 2005-02-13 devnull {
170 6e527fbc 2005-02-13 devnull char *f[4];
171 6e527fbc 2005-02-13 devnull int nf;
172 6e527fbc 2005-02-13 devnull int fd;
173 6e527fbc 2005-02-13 devnull
174 6e527fbc 2005-02-13 devnull if((fd = open("/dev/tty", ORDWR)) < 0)
175 6e527fbc 2005-02-13 devnull sysfatal("open /dev/tty: %r");
176 6e527fbc 2005-02-13 devnull
177 6e527fbc 2005-02-13 devnull nf = getfields(s, f, nelem(f), 0, "\n");
178 6e527fbc 2005-02-13 devnull if(nf == 1){ /* needkey or old badkey */
179 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
180 6e527fbc 2005-02-13 devnull askuser(fd, s);
181 6e527fbc 2005-02-13 devnull threadexitsall(nil);
182 6e527fbc 2005-02-13 devnull }
183 6e527fbc 2005-02-13 devnull if(nf == 3){ /* new badkey */
184 6e527fbc 2005-02-13 devnull fprint(fd, "\n");
185 6e527fbc 2005-02-13 devnull fprint(fd, "!replace: %s\n", f[0]);
186 6e527fbc 2005-02-13 devnull fprint(fd, "!because: %s\n", f[1]);
187 6e527fbc 2005-02-13 devnull askuser(fd, f[2]);
188 6e527fbc 2005-02-13 devnull threadexitsall(nil);
189 6e527fbc 2005-02-13 devnull }
190 6e527fbc 2005-02-13 devnull usage();
191 6e527fbc 2005-02-13 devnull }