code: 9ferno

ref: 6bfe4cf8107de7a01ff8a0667db7f28f08e4d238
dir: /appl/cmd/auth/getpk.b/

View raw version
implement Getpk;
include "sys.m";
	sys: Sys;
include "draw.m";
include "arg.m";
include "keyring.m";
	keyring: Keyring;

Getpk: module {
	init: fn(nil: ref Draw->Context, argv: list of string);
};

badmodule(p: string)
{
	sys->fprint(sys->fildes(2), "getpk: cannot load %s: %r\n", p);
	raise "fail:bad module";
}

init(nil: ref Draw->Context, argv: list of string)
{
	sys = load Sys Sys->PATH;
	keyring = load Keyring Keyring->PATH;
	if(keyring == nil)
		badmodule(Keyring->PATH);
	arg := load Arg Arg->PATH;
	if(arg == nil)
		badmodule(Arg->PATH);
	arg->init(argv);
	arg->setusage("usage: getpk [-asu] file...");
	aflag := 0;
	sflag := 0;
	uflag := 0;
	while((opt := arg->opt()) != 0){
		case opt {
		's' =>
			sflag++;
		'a' =>
			aflag++;
		'u' =>
			uflag++;
		* =>
			arg->usage();
		}
	}
	argv = arg->argv();
	if(argv == nil)
		arg->usage();
	multi := len argv > 1;
	for(; argv != nil; argv = tl argv){
		info := keyring->readauthinfo(hd argv);
		if(info == nil){
			sys->fprint(sys->fildes(2), "getpk: cannot read %s: %r\n", hd argv);
			continue;
		}
		pk := info.mypk;
		if(sflag)
			pk = info.spk;
		s := keyring->pktostr(pk);
		if(!aflag)
			s = hex(hash(s));
		if(multi)
			s = hd argv + ": " + s;
		if(uflag)
			s += " " + pk.owner;
		sys->print("%s\n", s);
	}
}

hash(s: string): array of byte
{
	d := array of byte s;
	digest := array[Keyring->SHA1dlen] of byte;
	keyring->sha1(d, len d, digest, nil);
	return digest;
}

hex(a: array of byte): string
{
	s := "";
	for(i := 0; i < len a; i++)
		s += sys->sprint("%2.2ux", int a[i]);
	return s;
}