6 #include "authcmdlib.h"
8 void install(char*, char*, Authkey*, long, int);
9 int exists(char*, char*);
14 fprint(2, "usage: changeuser [-pn] user\n");
19 main(int argc, char *argv[])
22 int which, newkey, newbio, dosecret;
28 fmtinstall('K', deskeyfmt);
46 if(memchr(u, '\0', ANAMELEN) == 0)
47 error("bad user name");
56 memset(&key, 0, sizeof(key));
59 newkey = !exists(f->keys, u) || answer("assign new Plan 9 password?");
61 getpass(&key, pass, 1, 1);
62 dosecret = answer("assign new Inferno/POP secret?");
64 if(!newkey || !answer("make it the same as Plan 9 password?"))
65 getpass(nil, pass, 0, 1);
66 t = getexpiration(f->keys, u);
67 install(f->keys, u, &key, t, newkey);
68 if(dosecret && setsecret(KEYDB, u, pass) == 0)
69 error("error writing Inferno/POP secret");
70 if(querybio(f->who, u, &a))
72 print("user %s installed for Plan 9\n", u);
73 syslog(0, AUTHLOG, "user %s installed for plan 9", u);
75 if(which & Securenet){
77 newkey = !exists(f->keys, u) || answer("assign new Securenet key?");
79 genrandom((uchar*)key.des, DESKEYLEN);
81 t = getexpiration(f->keys, u);
82 newbio = querybio(f->who, u, &a);
84 install(f->keys, u, &key, t, newkey);
87 if(!finddeskey(f->keys, u, key.des))
88 error("error reading Securenet key");
89 print("user %s: SecureNet key: %K\n", u, key.des);
90 checksum(key.des, pass);
91 print("verify with checksum %s\n", pass);
92 print("user %s installed for SecureNet\n", u);
93 syslog(0, AUTHLOG, "user %s installed for securenet", u);
99 install(char *db, char *u, Authkey *key, long t, int newkey)
101 char buf[KEYDBBUF+ANAMELEN+20];
105 snprint(buf, sizeof(buf), "%s/%s", db, u);
106 fd = create(buf, OREAD, 0777|DMDIR);
108 error("can't create user %s: %r", u);
112 if(newkey && !setkey(db, u, key))
113 error("can't set key: %r");
117 snprint(buf, sizeof(buf), "%s/%s/expire", db, u);
118 fd = open(buf, OWRITE);
119 if(fd < 0 || fprint(fd, "%ld", t) < 0)
120 error("can't write expiration time");
125 exists(char *db, char *u)
127 char buf[KEYDBBUF+ANAMELEN+6];
129 snprint(buf, sizeof(buf), "%s/%s/expire", db, u);
130 if(access(buf, 0) < 0)