!7 sS passwordSalt() { ret loadTextFileOrCreateWithRandomID(javaxSecretDir("password-salt")); } concept User { S name; SecretValue passwordMD5; 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; set useWebSockets; passwordSalt(); // make early 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 user = trim(params.get("user")); S pw = trim(params.get("pw")); S pw2 = trim(params.get("pw2")); S redirect = params.get("redirect"); redirect = dropParamFromURL(redirect, "logout"); // don't log us out right again if (empty(redirect)) redirect = baseLink + "/"; new LS msgs; if (nempty(user) || nempty(pw)) { if (empty(user)) msgs.add("Please enter a user name"); else if (l(user) < 4) msgs.add("Minimum user name length: 4 characters"); else if (l(user) > 30) msgs.add("Maximum user name length: 30 characters"); if (regexpContainsIC("[^a-z0-9\\-\\.]", user)) msgs.add("Bad characters in user name (please use only a-z, 0-9, - and .)"); if (empty(pw)) msgs.add("Please enter a password"); else if (l(pw) < 6) msgs.add("Minimum password length: 6 characters"); if (neq(pw, pw2)) msgs.add("Passwords don't match"); if (hasConceptIC User(name := user)) msgs.add("A user with this name exists, please choose another one"); if (empty(msgs)) { cnew User(name := user, passwordMD5 := SecretValue(md5(pw + passwordSalt()))); ret hrefresh(5.0, redirect) + "User " + user + " created! Redirecting..."; } } ret hhtml(hhead(htitle("Register new user") + hsansserif() + hmobilefix()) + hbody(hfullcenter( h3_htmlEncode(adminName + " | Register new user") + hpostform( hhidden(+redirect) + tag table( (empty(msgs) ? "" : tr(td() + td(htmlEncode2_nlToBr(lines_rtrim(msgs))))) + tr(td("Choose a user name:") + td(hinputfield(+user)) + td("Minimum length 4. Characters allowed: a-z, 0-9, - and .")) + tr(td("Choose a password:") + td(hpassword(+pw) + td("Minimum length 6"))) + tr(td("Choose a password (repeat):") + td(hpassword(+pw2))) + tr(td() + td(hsubmit("Register")))), action := baseLink + "/register") ))); } O html(IWebRequest req) enter { S uri = req.uri(); if (eq(uri, "/register")) ret serveRegisterForm(req.params()); ret super.html(req); } }