Blame


1 2277c5d7 2004-03-21 devnull /*
2 2277c5d7 2004-03-21 devnull * This is just a repository for a password.
3 2277c5d7 2004-03-21 devnull * We don't want to encourage this, there's
4 2277c5d7 2004-03-21 devnull * no server side.
5 2277c5d7 2004-03-21 devnull */
6 2277c5d7 2004-03-21 devnull
7 2277c5d7 2004-03-21 devnull #include "dat.h"
8 2277c5d7 2004-03-21 devnull
9 2277c5d7 2004-03-21 devnull typedef struct State State;
10 2277c5d7 2004-03-21 devnull struct State
11 2277c5d7 2004-03-21 devnull {
12 2277c5d7 2004-03-21 devnull Key *key;
13 2277c5d7 2004-03-21 devnull };
14 2277c5d7 2004-03-21 devnull
15 2277c5d7 2004-03-21 devnull enum
16 2277c5d7 2004-03-21 devnull {
17 2277c5d7 2004-03-21 devnull HavePass,
18 2277c5d7 2004-03-21 devnull Maxphase,
19 2277c5d7 2004-03-21 devnull };
20 2277c5d7 2004-03-21 devnull
21 2277c5d7 2004-03-21 devnull static char *phasenames[Maxphase] =
22 2277c5d7 2004-03-21 devnull {
23 2277c5d7 2004-03-21 devnull [HavePass] "HavePass",
24 2277c5d7 2004-03-21 devnull };
25 2277c5d7 2004-03-21 devnull
26 2277c5d7 2004-03-21 devnull static int
27 2277c5d7 2004-03-21 devnull passinit(Proto *p, Fsstate *fss)
28 2277c5d7 2004-03-21 devnull {
29 2277c5d7 2004-03-21 devnull int ask;
30 2277c5d7 2004-03-21 devnull Key *k;
31 2277c5d7 2004-03-21 devnull State *s;
32 2277c5d7 2004-03-21 devnull
33 2277c5d7 2004-03-21 devnull k = findkey(fss, Kuser, &ask, 0, fss->attr, "%s", p->keyprompt);
34 2277c5d7 2004-03-21 devnull if(k == nil){
35 2277c5d7 2004-03-21 devnull if(ask)
36 2277c5d7 2004-03-21 devnull return RpcNeedkey;
37 2277c5d7 2004-03-21 devnull return failure(fss, nil);
38 2277c5d7 2004-03-21 devnull }
39 2277c5d7 2004-03-21 devnull setattrs(fss->attr, k->attr);
40 2277c5d7 2004-03-21 devnull s = emalloc(sizeof(*s));
41 2277c5d7 2004-03-21 devnull s->key = k;
42 2277c5d7 2004-03-21 devnull fss->ps = s;
43 2277c5d7 2004-03-21 devnull return RpcOk;
44 2277c5d7 2004-03-21 devnull }
45 2277c5d7 2004-03-21 devnull
46 2277c5d7 2004-03-21 devnull static void
47 2277c5d7 2004-03-21 devnull passclose(Fsstate *fss)
48 2277c5d7 2004-03-21 devnull {
49 2277c5d7 2004-03-21 devnull State *s;
50 2277c5d7 2004-03-21 devnull
51 2277c5d7 2004-03-21 devnull s = fss->ps;
52 2277c5d7 2004-03-21 devnull if(s->key)
53 2277c5d7 2004-03-21 devnull closekey(s->key);
54 2277c5d7 2004-03-21 devnull free(s);
55 2277c5d7 2004-03-21 devnull }
56 2277c5d7 2004-03-21 devnull
57 2277c5d7 2004-03-21 devnull static int
58 2277c5d7 2004-03-21 devnull passread(Fsstate *fss, void *va, uint *n)
59 2277c5d7 2004-03-21 devnull {
60 2277c5d7 2004-03-21 devnull int m;
61 2277c5d7 2004-03-21 devnull char buf[500];
62 2277c5d7 2004-03-21 devnull char *pass, *user;
63 2277c5d7 2004-03-21 devnull State *s;
64 2277c5d7 2004-03-21 devnull
65 2277c5d7 2004-03-21 devnull s = fss->ps;
66 2277c5d7 2004-03-21 devnull switch(fss->phase){
67 2277c5d7 2004-03-21 devnull default:
68 2277c5d7 2004-03-21 devnull return phaseerror(fss, "read");
69 2277c5d7 2004-03-21 devnull
70 2277c5d7 2004-03-21 devnull case HavePass:
71 2277c5d7 2004-03-21 devnull user = strfindattr(s->key->attr, "user");
72 2277c5d7 2004-03-21 devnull pass = strfindattr(s->key->privattr, "!password");
73 2277c5d7 2004-03-21 devnull if(user==nil || pass==nil)
74 2277c5d7 2004-03-21 devnull return failure(fss, "passread cannot happen");
75 2277c5d7 2004-03-21 devnull snprint(buf, sizeof buf, "%q %q", user, pass);
76 2277c5d7 2004-03-21 devnull m = strlen(buf);
77 2277c5d7 2004-03-21 devnull if(m > *n)
78 2277c5d7 2004-03-21 devnull return toosmall(fss, m);
79 2277c5d7 2004-03-21 devnull *n = m;
80 2277c5d7 2004-03-21 devnull memmove(va, buf, m);
81 2277c5d7 2004-03-21 devnull return RpcOk;
82 2277c5d7 2004-03-21 devnull }
83 2277c5d7 2004-03-21 devnull }
84 2277c5d7 2004-03-21 devnull
85 2277c5d7 2004-03-21 devnull static int
86 2277c5d7 2004-03-21 devnull passwrite(Fsstate *fss, void*, uint)
87 2277c5d7 2004-03-21 devnull {
88 2277c5d7 2004-03-21 devnull return phaseerror(fss, "write");
89 2277c5d7 2004-03-21 devnull }
90 2277c5d7 2004-03-21 devnull
91 2277c5d7 2004-03-21 devnull Proto pass =
92 2277c5d7 2004-03-21 devnull {
93 2277c5d7 2004-03-21 devnull .name= "pass",
94 2277c5d7 2004-03-21 devnull .init= passinit,
95 2277c5d7 2004-03-21 devnull .write= passwrite,
96 2277c5d7 2004-03-21 devnull .read= passread,
97 2277c5d7 2004-03-21 devnull .close= passclose,
98 2277c5d7 2004-03-21 devnull .addkey= replacekey,
99 2277c5d7 2004-03-21 devnull .keyprompt= "user? !password?",
100 2277c5d7 2004-03-21 devnull };