1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#include <u.h>
#include <libc.h>
#include <authsrv.h>
#include <ctype.h>
#include <bio.h>
#include "authcmdlib.h"
void install(char*, char*, char*, long, int);
int exists (char*, char*);
void
usage(void)
{
fprint(2, "usage: changeuser [-pn] user\n");
exits("usage");
}
void
main(int argc, char *argv[])
{
char *u, key[DESKEYLEN], answer[32], p9pass[32];
int which, i, newkey, newbio, dosecret;
long t;
Acctbio a;
Fs *f;
srand(getpid()*time(0));
fmtinstall('K', keyfmt);
which = 0;
ARGBEGIN{
case 'p':
which |= Plan9;
break;
case 'n':
which |= Securenet;
break;
default:
usage();
}ARGEND
argv0 = "changeuser";
if(argc != 1)
usage();
u = *argv;
if(memchr(u, '\0', ANAMELEN) == 0)
error("bad user name");
if(!which)
which = Plan9;
newbio = 0;
t = 0;
a.user = 0;
if(which & Plan9){
f = &fs[Plan9];
newkey = 1;
if(exists(f->keys, u)){
readln("assign new password? [y/n]: ", answer, sizeof answer, 0);
if(answer[0] != 'y' && answer[0] != 'Y')
newkey = 0;
}
if(newkey)
getpass(key, p9pass, 1, 1);
dosecret = getsecret(newkey, p9pass);
t = getexpiration(f->keys, u);
install(f->keys, u, key, t, newkey);
if(dosecret && setsecret(KEYDB, u, p9pass) == 0)
error("error writing Inferno/pop secret");
newbio = querybio(f->who, u, &a);
if(newbio)
wrbio(f->who, &a);
print("user %s installed for Plan 9\n", u);
syslog(0, AUTHLOG, "user %s installed for plan 9", u);
}
if(which & Securenet){
f = &fs[Securenet];
newkey = 1;
if(exists(f->keys, u)){
readln("assign new key? [y/n]: ", answer, sizeof answer, 0);
if(answer[0] != 'y' && answer[0] != 'Y')
newkey = 0;
}
if(newkey)
for(i=0; i<DESKEYLEN; i++)
key[i] = nrand(256);
if(a.user == 0){
t = getexpiration(f->keys, u);
newbio = querybio(f->who, u, &a);
}
install(f->keys, u, key, t, newkey);
if(newbio)
wrbio(f->who, &a);
findkey(f->keys, u, key);
print("user %s: SecureNet key: %K\n", u, key);
checksum(key, answer);
print("verify with checksum %s\n", answer);
print("user %s installed for SecureNet\n", u);
syslog(0, AUTHLOG, "user %s installed for securenet", u);
}
exits(0);
}
void
install(char *db, char *u, char *key, long t, int newkey)
{
char buf[KEYDBBUF+ANAMELEN+20];
int fd;
if(!exists(db, u)){
sprint(buf, "%s/%s", db, u);
fd = create(buf, OREAD, 0777|DMDIR);
if(fd < 0)
error("can't create user %s: %r", u);
close(fd);
}
if(newkey){
sprint(buf, "%s/%s/key", db, u);
fd = open(buf, OWRITE);
if(fd < 0 || write(fd, key, DESKEYLEN) != DESKEYLEN)
error("can't set key: %r");
close(fd);
}
if(t == -1)
return;
sprint(buf, "%s/%s/expire", db, u);
fd = open(buf, OWRITE);
if(fd < 0 || fprint(fd, "%ld", t) < 0)
error("can't write expiration time");
close(fd);
}
int
exists(char *db, char *u)
{
char buf[KEYDBBUF+ANAMELEN+6];
sprint(buf, "%s/%s/expire", db, u);
if(access(buf, 0) < 0)
return 0;
return 1;
}
|