]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/auth/changeuser.c
disk/format: implement long name support
[plan9front.git] / sys / src / cmd / auth / changeuser.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <libsec.h>
5 #include <authsrv.h>
6 #include "authcmdlib.h"
7
8 void    install(char*, char*, Authkey*, long, int);
9 int     exists(char*, char*);
10
11 void
12 usage(void)
13 {
14         fprint(2, "usage: changeuser [-pn] user\n");
15         exits("usage");
16 }
17
18 void
19 main(int argc, char *argv[])
20 {
21         char *u, pass[32];
22         int which, newkey, newbio, dosecret;
23         long t;
24         Authkey key;
25         Acctbio a;
26         Fs *f;
27
28         fmtinstall('K', deskeyfmt);
29
30         which = 0;
31         ARGBEGIN{
32         case 'p':
33                 which |= Plan9;
34                 break;
35         case 'n':
36                 which |= Securenet;
37                 break;
38         default:
39                 usage();
40         }ARGEND
41         argv0 = "changeuser";
42
43         if(argc != 1)
44                 usage();
45         u = *argv;
46         if(memchr(u, '\0', ANAMELEN) == 0)
47                 error("bad user name");
48
49         if(!which)
50                 which = Plan9;
51
52         private();
53         newbio = 0;
54         t = 0;
55         a.user = 0;
56         memset(&key, 0, sizeof(key));
57         if(which & Plan9){
58                 f = &fs[Plan9];
59                 newkey = !exists(f->keys, u) || answer("assign new Plan 9 password?");
60                 if(newkey)
61                         getpass(&key, pass, 1, 1);
62                 dosecret = answer("assign new Inferno/POP secret?");
63                 if(dosecret)
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))
71                         wrbio(f->who, &a);
72                 print("user %s installed for Plan 9\n", u);
73                 syslog(0, AUTHLOG, "user %s installed for plan 9", u);
74         }
75         if(which & Securenet){
76                 f = &fs[Securenet];
77                 newkey = !exists(f->keys, u) || answer("assign new Securenet key?");
78                 if(newkey)
79                         genrandom((uchar*)key.des, DESKEYLEN);
80                 if(a.user == 0){
81                         t = getexpiration(f->keys, u);
82                         newbio = querybio(f->who, u, &a);
83                 }
84                 install(f->keys, u, &key, t, newkey);
85                 if(newbio)
86                         wrbio(f->who, &a);
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);
94         }
95         exits(0);
96 }
97
98 void
99 install(char *db, char *u, Authkey *key, long t, int newkey)
100 {
101         char buf[KEYDBBUF+ANAMELEN+20];
102         int fd;
103
104         if(!exists(db, u)){
105                 snprint(buf, sizeof(buf), "%s/%s", db, u);
106                 fd = create(buf, OREAD, 0777|DMDIR);
107                 if(fd < 0)
108                         error("can't create user %s: %r", u);
109                 close(fd);
110         }
111
112         if(newkey && !setkey(db, u, key))
113                 error("can't set key: %r");
114
115         if(t == -1)
116                 return;
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");
121         close(fd);
122 }
123
124 int
125 exists(char *db, char *u)
126 {
127         char buf[KEYDBBUF+ANAMELEN+6];
128
129         snprint(buf, sizeof(buf), "%s/%s/expire", db, u);
130         if(access(buf, 0) < 0)
131                 return 0;
132         return 1;
133 }