!7 concept User { S name; SecretValue password = new(aGlobalID()); S contact; // e.g. mail address } extend AuthedDialogID { new Ref user; // who is logged in } concept UserCreatedObject { new Ref creator; S repoName; // unique by user, for URL } concept UserPost > UserCreatedObject { S text; } concept PostReference { new Ref post; new Ref referenced; S as; } cmodule GazelleExamples > DynNewBot2 { void start { botName = heading = "Gazelle Examples"; adminName = heading + " Admin"; set enableUsers; super.start(); indexConceptFieldCI(User, "name"); } L crudClasses(bool masterAuthed) { L l = super.crudClasses(masterAuthed); if (masterAuthed) ret listPlus(l, User.class, UserPost.class); ret l; } S serveRegisterForm(SS params) { S redirect = params.get("redirect"); redirect = dropParamFromURL(redirect, "logout"); // don't log us out right again if (empty(redirect)) redirect = baseLink + "/"; ret hhtml(hhead(htitle("Register new user") + hsansserif() + hmobilefix()) + hbody(hfullcenter( h3_htmlEncode(adminName + " | Register new user") + hpostform( hhidden(+redirect) + tag table( tr(td("Choose a user name:") + td(hinputfield("user", params.get("user"))) + td()) + tr(td("Choose a password:") + td(hpassword("pw", params.get("pw")))) + tr(td() + td(hsubmit("Register")))), action := baseLink + "/register") ))); } O html(IWebRequest req) enter { S uri = req.uri(); if (eq(uri, "/register")) ret serverRegisterForm(req.params()); } }