diff options
Diffstat (limited to 'appl/grid/usercreatesrv.b')
| -rw-r--r-- | appl/grid/usercreatesrv.b | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/appl/grid/usercreatesrv.b b/appl/grid/usercreatesrv.b new file mode 100644 index 00000000..2c559495 --- /dev/null +++ b/appl/grid/usercreatesrv.b @@ -0,0 +1,93 @@ +implement Usercreatesrv; + +# +# Copyright © 2003 Vita Nuova Holdings Limited. All rights reserved. +# + +include "sys.m"; + sys: Sys; +include "draw.m"; +include "string.m"; + str: String; +include "keyring.m"; + keyring: Keyring; + +# create insecure users. + +Usercreatesrv: module { + init: fn(nil: ref Draw->Context, argv: list of string); +}; + +init(nil: ref Draw->Context, nil: list of string) +{ + sys = load Sys Sys->PATH; + str = load String String->PATH; + keyring = load Keyring Keyring->PATH; + + sys->pctl(Sys->FORKNS, nil); + + fio := export(); + for(;;) alt { + (nil, nil, nil, rc) := <-fio.read => + if(rc != nil) + rc <-= (nil, "permission denied"); + (nil, data, fid, wc) := <-fio.write => + # request: + # username email + if(wc == nil) + break; + toks := str->unquoted(string data); + if(len toks != 2){ + wc <-= (0, "invalid request"); + break; + } + uname := hd toks; toks = tl toks; + password := array of byte hd toks; toks = tl toks; + secret := array[Keyring->SHA1dlen] of byte; + keyring->sha1(password, len password, secret, nil); +# email := hd toks; toks = tl toks; +# e := checkemail(email); +# if(e != nil){ +# wc <-= (0, e); +# break; +# } + dir := "/mnt/keys/" + uname; + if(sys->create(dir, Sys->OREAD, Sys->DMDIR|8r777) == nil){ + wc <-= (0, sys->sprint("cannot create account: %r")); + break; + } + sys->write(sys->create(dir + "/secret", Sys->OWRITE, 8r600), secret, len secret); + wc <-= (len data, nil); +# sys->print("create %q %q\n", uname, email); + } +} + +checkemail(addr: string): string +{ + for(i := 0; i < len addr; i++) + if(addr[i] == '@') + break; + if(i == len addr) + return "email address does not contain an '@' character"; + return nil; +} + +export(): ref Sys->FileIO +{ + sys->bind("#s", "/chan", Sys->MREPL|Sys->MCREATE); + fio := sys->file2chan("/chan", "createuser"); + w := sys->nulldir; + w.mode = 8r222; + sys->wstat("/chan/createuser", w); + sync := chan of int; + spawn exportproc(sync); + <-sync; + return fio; +} + +exportproc(sync: chan of int) +{ + sys->pctl(Sys->FORKNS|Sys->NEWFD, 0 :: nil); + sync <-= 0; + sys->export(sys->fildes(0), "/chan", Sys->EXPWAIT); +} |
