wm: infra

ref: e3d3899438ba1b2c899d46d6476e53c823b6b575
dir: /newuser.c/

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <libsec.h>
#include <authsrv.h>
#include "authcmdlib.h"

void	install(char*, char*, Authkey*, long, int);
int	exists(char*, char*);

void
usage(void)
{
	fprint(2, "usage: newuser [-p] user\n");
	exits("usage");
}

void
main(int argc, char *argv[])
{
	char *u, pass[32];
	int newbio, dosecret;
	long t;
	Authkey key;
	Acctbio a;
	Fs *f;

	fmtinstall('K', deskeyfmt);

	ARGBEGIN{
	case 'p':
		pass = EARGF(usage());
		break;
	default:
		usage();
	}ARGEND
	argv0 = "newuser";

	if(argc != 1)
		usage();
	u = *argv;
	if(memchr(u, '\0', ANAMELEN) == 0)
		error("bad user name");

	private();
	newbio = 0;
	t = 0;
	a.user = 0;
	memset(&key, 0, sizeof(key));
	f = &fs[Plan9];
	getpass(&key, pass, 1, 1);

	install(f->keys, u, &key, t, newkey);

	if(setsecret(KEYDB, u, pass) == 0)
		error("error writing Inferno/POP secret");

	if(querybio(f->who, u, &a))
		wrbio(f->who, &a);

	print("user %s installed for Plan 9\n", u);
	syslog(0, AUTHLOG, "user %s installed for plan 9", u);

	exits(0);
}

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;
}