Blame


1 57fcfc2a 2005-02-13 devnull #include <u.h>
2 57fcfc2a 2005-02-13 devnull #include <libc.h>
3 57fcfc2a 2005-02-13 devnull #include <libsec.h>
4 57fcfc2a 2005-02-13 devnull #include <authsrv.h>
5 57fcfc2a 2005-02-13 devnull
6 57fcfc2a 2005-02-13 devnull static char *pbmsg = "AS protocol botch";
7 57fcfc2a 2005-02-13 devnull
8 57fcfc2a 2005-02-13 devnull int
9 57fcfc2a 2005-02-13 devnull asrdresp(int fd, char *buf, int len)
10 57fcfc2a 2005-02-13 devnull {
11 57fcfc2a 2005-02-13 devnull char error[AERRLEN];
12 57fcfc2a 2005-02-13 devnull
13 57fcfc2a 2005-02-13 devnull if(read(fd, buf, 1) != 1){
14 57fcfc2a 2005-02-13 devnull werrstr(pbmsg);
15 57fcfc2a 2005-02-13 devnull return -1;
16 57fcfc2a 2005-02-13 devnull }
17 57fcfc2a 2005-02-13 devnull
18 57fcfc2a 2005-02-13 devnull switch(buf[0]){
19 57fcfc2a 2005-02-13 devnull case AuthOK:
20 57fcfc2a 2005-02-13 devnull if(readn(fd, buf, len) < 0){
21 57fcfc2a 2005-02-13 devnull werrstr(pbmsg);
22 57fcfc2a 2005-02-13 devnull return -1;
23 57fcfc2a 2005-02-13 devnull }
24 57fcfc2a 2005-02-13 devnull break;
25 57fcfc2a 2005-02-13 devnull case AuthErr:
26 57fcfc2a 2005-02-13 devnull if(readn(fd, error, AERRLEN) < 0){
27 57fcfc2a 2005-02-13 devnull werrstr(pbmsg);
28 57fcfc2a 2005-02-13 devnull return -1;
29 57fcfc2a 2005-02-13 devnull }
30 57fcfc2a 2005-02-13 devnull error[AERRLEN-1] = 0;
31 57fcfc2a 2005-02-13 devnull werrstr(error);
32 57fcfc2a 2005-02-13 devnull return -1;
33 57fcfc2a 2005-02-13 devnull default:
34 57fcfc2a 2005-02-13 devnull werrstr(pbmsg);
35 57fcfc2a 2005-02-13 devnull return -1;
36 57fcfc2a 2005-02-13 devnull }
37 57fcfc2a 2005-02-13 devnull return 0;
38 57fcfc2a 2005-02-13 devnull }
39 57fcfc2a 2005-02-13 devnull
40 57fcfc2a 2005-02-13 devnull void
41 57fcfc2a 2005-02-13 devnull readln(char *prompt, char *buf, int nbuf, int secret)
42 57fcfc2a 2005-02-13 devnull {
43 57fcfc2a 2005-02-13 devnull char *p;
44 fa325e9b 2020-01-10 cross
45 57fcfc2a 2005-02-13 devnull p = readcons(prompt, nil, secret);
46 57fcfc2a 2005-02-13 devnull if(p == nil)
47 57fcfc2a 2005-02-13 devnull sysfatal("user terminated input");
48 57fcfc2a 2005-02-13 devnull if(strlen(p) >= nbuf)
49 57fcfc2a 2005-02-13 devnull sysfatal("too long");
50 57fcfc2a 2005-02-13 devnull strcpy(buf, p);
51 57fcfc2a 2005-02-13 devnull memset(p, 0, strlen(p));
52 57fcfc2a 2005-02-13 devnull free(p);
53 57fcfc2a 2005-02-13 devnull }
54 57fcfc2a 2005-02-13 devnull
55 57fcfc2a 2005-02-13 devnull void
56 57fcfc2a 2005-02-13 devnull main(int argc, char **argv)
57 57fcfc2a 2005-02-13 devnull {
58 57fcfc2a 2005-02-13 devnull int fd;
59 57fcfc2a 2005-02-13 devnull Ticketreq tr;
60 57fcfc2a 2005-02-13 devnull Ticket t;
61 57fcfc2a 2005-02-13 devnull Passwordreq pr;
62 57fcfc2a 2005-02-13 devnull char tbuf[TICKETLEN];
63 57fcfc2a 2005-02-13 devnull char key[DESKEYLEN];
64 57fcfc2a 2005-02-13 devnull char buf[512];
65 57fcfc2a 2005-02-13 devnull char *s, *user;
66 57fcfc2a 2005-02-13 devnull
67 57fcfc2a 2005-02-13 devnull user = getuser();
68 57fcfc2a 2005-02-13 devnull
69 57fcfc2a 2005-02-13 devnull ARGBEGIN{
70 57fcfc2a 2005-02-13 devnull }ARGEND
71 57fcfc2a 2005-02-13 devnull
72 57fcfc2a 2005-02-13 devnull s = nil;
73 57fcfc2a 2005-02-13 devnull if(argc > 0){
74 57fcfc2a 2005-02-13 devnull user = argv[0];
75 57fcfc2a 2005-02-13 devnull s = strchr(user, '@');
76 57fcfc2a 2005-02-13 devnull if(s != nil)
77 57fcfc2a 2005-02-13 devnull *s++ = 0;
78 57fcfc2a 2005-02-13 devnull if(*user == 0)
79 57fcfc2a 2005-02-13 devnull user = getuser();
80 57fcfc2a 2005-02-13 devnull }
81 57fcfc2a 2005-02-13 devnull
82 57fcfc2a 2005-02-13 devnull fd = authdial(nil, s);
83 57fcfc2a 2005-02-13 devnull if(fd < 0)
84 57fcfc2a 2005-02-13 devnull sysfatal("protocol botch: %r");
85 57fcfc2a 2005-02-13 devnull
86 57fcfc2a 2005-02-13 devnull /* send ticket request to AS */
87 57fcfc2a 2005-02-13 devnull memset(&tr, 0, sizeof(tr));
88 57fcfc2a 2005-02-13 devnull strcpy(tr.uid, user);
89 57fcfc2a 2005-02-13 devnull tr.type = AuthPass;
90 57fcfc2a 2005-02-13 devnull convTR2M(&tr, buf);
91 57fcfc2a 2005-02-13 devnull if(write(fd, buf, TICKREQLEN) != TICKREQLEN)
92 57fcfc2a 2005-02-13 devnull sysfatal("protocol botch: %r");
93 57fcfc2a 2005-02-13 devnull if(asrdresp(fd, buf, TICKETLEN) < 0)
94 57fcfc2a 2005-02-13 devnull sysfatal("%r");
95 57fcfc2a 2005-02-13 devnull memmove(tbuf, buf, TICKETLEN);
96 57fcfc2a 2005-02-13 devnull
97 57fcfc2a 2005-02-13 devnull /*
98 57fcfc2a 2005-02-13 devnull * get a password from the user and try to decrypt the
99 57fcfc2a 2005-02-13 devnull * ticket. If it doesn't work we've got a bad password,
100 57fcfc2a 2005-02-13 devnull * give up.
101 57fcfc2a 2005-02-13 devnull */
102 57fcfc2a 2005-02-13 devnull readln("Plan 9 Password", pr.old, sizeof pr.old, 1);
103 57fcfc2a 2005-02-13 devnull passtokey(key, pr.old);
104 57fcfc2a 2005-02-13 devnull convM2T(tbuf, &t, key);
105 57fcfc2a 2005-02-13 devnull if(t.num != AuthTp || strcmp(t.cuid, tr.uid))
106 57fcfc2a 2005-02-13 devnull sysfatal("bad password");
107 57fcfc2a 2005-02-13 devnull
108 57fcfc2a 2005-02-13 devnull /* loop trying new passwords */
109 57fcfc2a 2005-02-13 devnull for(;;){
110 57fcfc2a 2005-02-13 devnull pr.changesecret = 0;
111 57fcfc2a 2005-02-13 devnull *pr.new = 0;
112 57fcfc2a 2005-02-13 devnull readln("change Plan 9 Password? (y/n)", buf, sizeof buf, 0);
113 57fcfc2a 2005-02-13 devnull if(*buf == 'y' || *buf == 'Y'){
114 57fcfc2a 2005-02-13 devnull readln("Password(8 to 31 characters)", pr.new,
115 57fcfc2a 2005-02-13 devnull sizeof pr.new, 1);
116 57fcfc2a 2005-02-13 devnull readln("Confirm", buf, sizeof buf, 1);
117 57fcfc2a 2005-02-13 devnull if(strcmp(pr.new, buf)){
118 57fcfc2a 2005-02-13 devnull print("!mismatch\n");
119 57fcfc2a 2005-02-13 devnull continue;
120 57fcfc2a 2005-02-13 devnull }
121 57fcfc2a 2005-02-13 devnull }
122 57fcfc2a 2005-02-13 devnull readln("change Inferno/POP password? (y/n)", buf, sizeof buf, 0);
123 57fcfc2a 2005-02-13 devnull if(*buf == 'y' || *buf == 'Y'){
124 57fcfc2a 2005-02-13 devnull pr.changesecret = 1;
125 57fcfc2a 2005-02-13 devnull readln("make it the same as your plan 9 password? (y/n)",
126 57fcfc2a 2005-02-13 devnull buf, sizeof buf, 0);
127 57fcfc2a 2005-02-13 devnull if(*buf == 'y' || *buf == 'Y'){
128 57fcfc2a 2005-02-13 devnull if(*pr.new == 0)
129 57fcfc2a 2005-02-13 devnull strcpy(pr.secret, pr.old);
130 57fcfc2a 2005-02-13 devnull else
131 57fcfc2a 2005-02-13 devnull strcpy(pr.secret, pr.new);
132 57fcfc2a 2005-02-13 devnull } else {
133 57fcfc2a 2005-02-13 devnull readln("Secret(0 to 256 characters)", pr.secret,
134 57fcfc2a 2005-02-13 devnull sizeof pr.secret, 1);
135 57fcfc2a 2005-02-13 devnull readln("Confirm", buf, sizeof buf, 1);
136 57fcfc2a 2005-02-13 devnull if(strcmp(pr.secret, buf)){
137 57fcfc2a 2005-02-13 devnull print("!mismatch\n");
138 57fcfc2a 2005-02-13 devnull continue;
139 57fcfc2a 2005-02-13 devnull }
140 57fcfc2a 2005-02-13 devnull }
141 57fcfc2a 2005-02-13 devnull }
142 57fcfc2a 2005-02-13 devnull pr.num = AuthPass;
143 57fcfc2a 2005-02-13 devnull convPR2M(&pr, buf, t.key);
144 57fcfc2a 2005-02-13 devnull if(write(fd, buf, PASSREQLEN) != PASSREQLEN)
145 57fcfc2a 2005-02-13 devnull sysfatal("AS protocol botch: %r");
146 57fcfc2a 2005-02-13 devnull if(asrdresp(fd, buf, 0) == 0)
147 57fcfc2a 2005-02-13 devnull break;
148 57fcfc2a 2005-02-13 devnull fprint(2, "refused: %r\n");
149 57fcfc2a 2005-02-13 devnull }
150 57fcfc2a 2005-02-13 devnull close(fd);
151 57fcfc2a 2005-02-13 devnull
152 57fcfc2a 2005-02-13 devnull exits(0);
153 57fcfc2a 2005-02-13 devnull }