diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/auth/changeuser.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/auth/changeuser.c')
-rwxr-xr-x | sys/src/cmd/auth/changeuser.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/sys/src/cmd/auth/changeuser.c b/sys/src/cmd/auth/changeuser.c new file mode 100755 index 000000000..71a59fc03 --- /dev/null +++ b/sys/src/cmd/auth/changeuser.c @@ -0,0 +1,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; +} |