#include #include #include #include #include #include "authcmdlib.h" void install(char*, char*, Authkey*, long, int); int exists(char*, char*); void usage(void) { fprint(2, "usage: batchuser -u username -p password [-e email] [-n realname]\n"); exits("usage"); } char *username; char *password; char *email = ""; char *realname = ""; void main(int argc, char **argv) { Authkey key; Acctbio a; Fs *f; char *err; long t = 0; ARGBEGIN{ case 'u': username = EARGF(usage()); break; case 'p': password = EARGF(usage()); break; case 'e': email = EARGF(usage()); break; case 'n': realname = EARGF(usage()); break; }ARGEND if (username == nil && password == nil) { usage(); } if (username == nil || password == nil) { fprint(2, "no username or password given."); exits("usage"); } memset(&key, 0, sizeof(key)); f = &fs[Plan9]; if (exists(f->keys, username)) { fprint(2, "user already exists.\n"); exits("user already exists"); } if (err = okpasswd(password)) { fprint(2, "%s.\n", err); exits("okpasswd failed."); } if (strlen(password) >= PASSWDLEN) { fprint(2, "password too long.\n"); exits("password too long"); } passtokey(&key, password); install(f->keys, username, &key, t, 1); setsecret(KEYDB, username, password); rdbio(f->who, username, &a); a.postid = nil; a.name = realname; a.dept = ""; a.email[0] = email; a.email[1] = nil; wrbio(f->who, &a); syslog(0, AUTHLOG, "user %s installed for plan 9 (batch mode)", username); } void install(char *db, char *u, Authkey *key, long t, int newkey) { char buf[KEYDBBUF+ANAMELEN+20]; int fd; if(!exists(db, u)){ snprint(buf, sizeof(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 && !setkey(db, u, key)) error("can't set key: %r"); if(t == -1) return; snprint(buf, sizeof(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]; snprint(buf, sizeof(buf), "%s/%s/expire", db, u); if(access(buf, 0) < 0) return 0; return 1; }