diff options
Diffstat (limited to '')
-rw-r--r-- | src/sledjchisl/sledjchisl.c | 372 |
1 files changed, 249 insertions, 123 deletions
diff --git a/src/sledjchisl/sledjchisl.c b/src/sledjchisl/sledjchisl.c index f6f8f9d..8fb505b 100644 --- a/src/sledjchisl/sledjchisl.c +++ b/src/sledjchisl/sledjchisl.c | |||
@@ -380,7 +380,7 @@ struct _reqData | |||
380 | { | 380 | { |
381 | lua_State *L; | 381 | lua_State *L; |
382 | qhashtbl_t *configs, *queries, *body, *cookies, *headers, *valid, *stuff, *database, *Rcookies, *Rheaders; | 382 | qhashtbl_t *configs, *queries, *body, *cookies, *headers, *valid, *stuff, *database, *Rcookies, *Rheaders; |
383 | char *Scheme, *Host, *Method, *Script, *RUri, *doit, *form, *output; | 383 | char *Scheme, *Host, *Method, *Script, *RUri, *doit, *form, *output, *outQuery; |
384 | sesh shs, *lnk; | 384 | sesh shs, *lnk; |
385 | MYSQL *db; | 385 | MYSQL *db; |
386 | gridStats *stats; | 386 | gridStats *stats; |
@@ -2539,6 +2539,8 @@ static void HTMLfooter(qgrow_t *reply) | |||
2539 | " So feel free to create as many test accounts as you need to test things.</p>\n" | 2539 | " So feel free to create as many test accounts as you need to test things.</p>\n" |
2540 | " <p>We follow the usual web site registration process, which sends a validation email, with a link to click. " | 2540 | " <p>We follow the usual web site registration process, which sends a validation email, with a link to click. " |
2541 | " However, during this test mode, no emails will be sent, instead a link will be displayed near the top of the page when a user is logged in.</p>\n" | 2541 | " However, during this test mode, no emails will be sent, instead a link will be displayed near the top of the page when a user is logged in.</p>\n" |
2542 | " <p>After creating an account, log on as your grid god account, click the 'validated members' button, click on the new member, set their level to 'approved', " | ||
2543 | " then click on the 'save' button. In theory that will create their in world account, in practice I still haven't written that bit.</p>" | ||
2542 | " <p>Missing bits that are still being written - sending the emails, creating real grid accounts, editing accounts, listing accounts, deleting accounts.</p>\n" | 2544 | " <p>Missing bits that are still being written - sending the emails, creating real grid accounts, editing accounts, listing accounts, deleting accounts.</p>\n" |
2543 | " </div>\n"); | 2545 | " </div>\n"); |
2544 | // reply->addstr(reply, " <div class='centre'>\n </div>\n"); | 2546 | // reply->addstr(reply, " <div class='centre'>\n </div>\n"); |
@@ -2774,7 +2776,7 @@ HTMLfile *checkHTMLcache(char *file) | |||
2774 | . tell them they have validated | 2776 | . tell them they have validated |
2775 | create their OpenSim account UserAccounts.UserTitle and auth tables, not GridUser table | 2777 | create their OpenSim account UserAccounts.UserTitle and auth tables, not GridUser table |
2776 | create their GridUser record. | 2778 | create their GridUser record. |
2777 | update their UserAccounts.Userlevel and UserAccounts.UserTitle | 2779 | . update their UserAccounts.Userlevel and UserAccounts.UserTitle |
2778 | . send them to the login page. | 2780 | . send them to the login page. |
2779 | . regenerate the usual token | 2781 | . regenerate the usual token |
2780 | ? let user stay logged on? | 2782 | ? let user stay logged on? |
@@ -3191,7 +3193,7 @@ static void setToken_n_munchie(reqData *Rd, boolean linky) | |||
3191 | shs->salt, | 3193 | shs->salt, |
3192 | shs->seshID | 3194 | shs->seshID |
3193 | ); | 3195 | ); |
3194 | char *tnm1 = xmprintf(" ['name']='%s',\n", shs->name); | 3196 | char *tnm1 = xmprintf(" ['name']='%s',\n ['level']='%d',\n", shs->name, (int) shs->level); |
3195 | char *tnm2 = xmprintf(" ['UUID']='%s',\n", shs->UUID); | 3197 | char *tnm2 = xmprintf(" ['UUID']='%s',\n", shs->UUID); |
3196 | char *tnm3 = xmprintf(" ['passHash']='%s',\n", getStrH(Rd->stuff, "passHash")); | 3198 | char *tnm3 = xmprintf(" ['passHash']='%s',\n", getStrH(Rd->stuff, "passHash")); |
3197 | char *tnm4 = xmprintf(" ['passSalt']='%s',\n", getStrH(Rd->stuff, "passSalt")); | 3199 | char *tnm4 = xmprintf(" ['passSalt']='%s',\n", getStrH(Rd->stuff, "passSalt")); |
@@ -3304,9 +3306,9 @@ static void generateAccountUUID(reqData *Rd) | |||
3304 | Rd->database->putstr(Rd->database, "UserAccounts.Userlevel", "-200"); | 3306 | Rd->database->putstr(Rd->database, "UserAccounts.Userlevel", "-200"); |
3305 | } | 3307 | } |
3306 | 3308 | ||
3307 | char *getLevel(reqData *Rd) | 3309 | char *getLevel(short level) |
3308 | { | 3310 | { |
3309 | char *ret = "", *lvl = xmprintf("%d", Rd->shs.level); | 3311 | char *ret = "", *lvl = xmprintf("%d", level); |
3310 | ret = accountLevels->getstr(accountLevels, lvl, false); | 3312 | ret = accountLevels->getstr(accountLevels, lvl, false); |
3311 | if (NULL == ret) | 3313 | if (NULL == ret) |
3312 | { | 3314 | { |
@@ -3316,7 +3318,7 @@ char *getLevel(reqData *Rd) | |||
3316 | accountLevels->lock(accountLevels); | 3318 | accountLevels->lock(accountLevels); |
3317 | while(accountLevels->getnext(accountLevels, &obj, NULL, false) == true) | 3319 | while(accountLevels->getnext(accountLevels, &obj, NULL, false) == true) |
3318 | { | 3320 | { |
3319 | if (atoi(obj.name) <= Rd->shs.level) | 3321 | if (atoi(obj.name) <= level) |
3320 | ret = (char *) obj.data; | 3322 | ret = (char *) obj.data; |
3321 | } | 3323 | } |
3322 | } | 3324 | } |
@@ -3326,7 +3328,9 @@ char *getLevel(reqData *Rd) | |||
3326 | 3328 | ||
3327 | static void accountWrite(reqData *Rd) | 3329 | static void accountWrite(reqData *Rd) |
3328 | { | 3330 | { |
3329 | char *file = xmprintf("%s/users/%s.lua", scData, Rd->shs.UUID); | 3331 | char *uuid = getStrH(Rd->database, "UserAccounts.PrincipalID"); |
3332 | char *file = xmprintf("%s/users/%s.lua", scData, uuid); | ||
3333 | char *level = getStrH(Rd->database, "UserAccounts.UserLevel"); | ||
3330 | char *link = (NULL == Rd->lnk) ? "" : Rd->lnk->hashish; | 3334 | char *link = (NULL == Rd->lnk) ? "" : Rd->lnk->hashish; |
3331 | char *about = encodeSlash(getStrH(Rd->stuff, "aboutMe")); | 3335 | char *about = encodeSlash(getStrH(Rd->stuff, "aboutMe")); |
3332 | char *voucher = encodeSlash(getStrH(Rd->stuff, "voucher")); | 3336 | char *voucher = encodeSlash(getStrH(Rd->stuff, "voucher")); |
@@ -3337,7 +3341,7 @@ static void accountWrite(reqData *Rd) | |||
3337 | " ['created']='%ld',\n" | 3341 | " ['created']='%ld',\n" |
3338 | " ['email']='%s',\n" | 3342 | " ['email']='%s',\n" |
3339 | " ['title']='%s',\n" | 3343 | " ['title']='%s',\n" |
3340 | " ['level']='%d',\n" | 3344 | " ['level']='%s',\n" |
3341 | " ['flags']='%d',\n" | 3345 | " ['flags']='%d',\n" |
3342 | " ['active']='%d',\n" | 3346 | " ['active']='%d',\n" |
3343 | " ['passwordHash']='%s',\n" | 3347 | " ['passwordHash']='%s',\n" |
@@ -3355,13 +3359,13 @@ static void accountWrite(reqData *Rd) | |||
3355 | getStrH(Rd->stuff, "name"), | 3359 | getStrH(Rd->stuff, "name"), |
3356 | (strcmp("", getStrH(Rd->stuff, "created")) != 0) ? atol(getStrH(Rd->stuff, "created")) : (long) Rd->shs.timeStamp[1].tv_sec, | 3360 | (strcmp("", getStrH(Rd->stuff, "created")) != 0) ? atol(getStrH(Rd->stuff, "created")) : (long) Rd->shs.timeStamp[1].tv_sec, |
3357 | getStrH(Rd->stuff, "email"), | 3361 | getStrH(Rd->stuff, "email"), |
3358 | getLevel(Rd), | 3362 | getLevel(atoi(level)), |
3359 | Rd->shs.level, | 3363 | level, |
3360 | 64, | 3364 | 64, |
3361 | 0, | 3365 | 0, |
3362 | getStrH(Rd->stuff, "passwordHash"), | 3366 | getStrH(Rd->stuff, "passwordHash"), |
3363 | getStrH(Rd->stuff, "passwordSalt"), | 3367 | getStrH(Rd->stuff, "passwordSalt"), |
3364 | Rd->shs.UUID, | 3368 | uuid, |
3365 | getStrH(Rd->stuff, "DoB"), | 3369 | getStrH(Rd->stuff, "DoB"), |
3366 | getStrH(Rd->stuff, "agree"), | 3370 | getStrH(Rd->stuff, "agree"), |
3367 | getStrH(Rd->stuff, "adult"), | 3371 | getStrH(Rd->stuff, "adult"), |
@@ -3714,6 +3718,10 @@ W("Validated session linky."); | |||
3714 | } | 3718 | } |
3715 | else | 3719 | else |
3716 | { | 3720 | { |
3721 | char *level = tnm->getstr(tnm, "level", false); | ||
3722 | |||
3723 | if (NULL == level) | ||
3724 | level = "-256"; | ||
3717 | qstrcpy(shs->sesh, sizeof(shs->sesh), seshion); | 3725 | qstrcpy(shs->sesh, sizeof(shs->sesh), seshion); |
3718 | qstrcpy(shs->toke_n_munchie, sizeof(shs->toke_n_munchie), toke_n_munchie); | 3726 | qstrcpy(shs->toke_n_munchie, sizeof(shs->toke_n_munchie), toke_n_munchie); |
3719 | qstrcpy(shs->hashish, sizeof(shs->hashish), hashish); | 3727 | qstrcpy(shs->hashish, sizeof(shs->hashish), hashish); |
@@ -3723,6 +3731,8 @@ W("Validated session linky."); | |||
3723 | // TODO - free this somewhere. | 3731 | // TODO - free this somewhere. |
3724 | // shs->name = tnm->getstr(tnm, "name", true); | 3732 | // shs->name = tnm->getstr(tnm, "name", true); |
3725 | // shs->UUID = tnm->getstr(tnm, "UUID", true); | 3733 | // shs->UUID = tnm->getstr(tnm, "UUID", true); |
3734 | shs->level = atoi(level); | ||
3735 | // TODO - get level from somewhere and stuff it in shs. | ||
3726 | shs->timeStamp[0].tv_nsec = UTIME_OMIT; | 3736 | shs->timeStamp[0].tv_nsec = UTIME_OMIT; |
3727 | shs->timeStamp[0].tv_sec = UTIME_OMIT; | 3737 | shs->timeStamp[0].tv_sec = UTIME_OMIT; |
3728 | memcpy(&shs->timeStamp[1], &st.st_mtim, sizeof(struct timespec)); | 3738 | memcpy(&shs->timeStamp[1], &st.st_mtim, sizeof(struct timespec)); |
@@ -3747,8 +3757,9 @@ t("SessionValidate() Lua read %s = %s", n, (char *) obj.data); | |||
3747 | } | 3757 | } |
3748 | } | 3758 | } |
3749 | tnm->unlock(tnm); | 3759 | tnm->unlock(tnm); |
3760 | |||
3750 | // TODO - check this. | 3761 | // TODO - check this. |
3751 | Rd->database->putstr(Rd->database, "UserAccounts.PrincipalID", tnm->getstr(tnm, "UUID", false)); | 3762 | // Rd->database->putstr(Rd->database, "UserAccounts.PrincipalID", tnm->getstr(tnm, "UUID", false)); |
3752 | } | 3763 | } |
3753 | } | 3764 | } |
3754 | free(munchie); | 3765 | free(munchie); |
@@ -3877,10 +3888,12 @@ static int nameValidate(reqData *Rd, inputForm *iF, inputValue *iV) | |||
3877 | 3888 | ||
3878 | if (0 == ret) | 3889 | if (0 == ret) |
3879 | { | 3890 | { |
3880 | Rd->stuff->putstr(Rd->stuff, "firstName", name); | 3891 | Rd->stuff->putstr(Rd->stuff, "firstName", name); |
3881 | Rd->stuff->putstr(Rd->stuff, "lastName", s); | 3892 | Rd->stuff->putstr(Rd->stuff, "lastName", s); |
3882 | Rd->stuff->putstrf(Rd->stuff, "name", "%s %s", name, s); | 3893 | Rd->stuff->putstrf(Rd->stuff, "name", "%s %s", name, s); |
3883 | Rd->shs.name = Rd->stuff->getstr(Rd->stuff, "name", true); | 3894 | // TODO - fix this, so we don't show "You are user" when we are not, but everything else still works. |
3895 | // if ('\0' != getStrH(Rd->queries, "user")[0]) | ||
3896 | Rd->shs.name = Rd->stuff->getstr(Rd->stuff, "name", true); | ||
3884 | } | 3897 | } |
3885 | } | 3898 | } |
3886 | } | 3899 | } |
@@ -4223,18 +4236,23 @@ static void aboutMeWeb(reqData *Rd, inputForm *oF, inputValue *oV) | |||
4223 | HTMLtextArea(Rd->reply, oV->field->name, oV->field->title, 7, oV->field->viewLength, 4, oV->field->maxLength, "Describe yourself here.", "off", "true", "soft", oV->value, FALSE, FALSE); | 4236 | HTMLtextArea(Rd->reply, oV->field->name, oV->field->title, 7, oV->field->viewLength, 4, oV->field->maxLength, "Describe yourself here.", "off", "true", "soft", oV->value, FALSE, FALSE); |
4224 | } | 4237 | } |
4225 | 4238 | ||
4226 | static void accountWebHeaders(reqData *Rd, inputForm *oF, char *name) | 4239 | static void accountWebHeaders(reqData *Rd, inputForm *oF) //, char *name) |
4227 | { | 4240 | { |
4228 | char *linky = checkLinky(Rd); | 4241 | char *linky = checkLinky(Rd); |
4229 | 4242 | ||
4230 | HTMLheader(Rd->reply, "<!--#echo var=\"grid\" --> account manager"); | 4243 | HTMLheader(Rd->reply, "<!--#echo var=\"grid\" --> account manager"); |
4231 | Rd->reply->addstrf(Rd->reply, "<h1><!--#echo var=\"grid\" --> account manager</h1>\n"); | 4244 | Rd->reply->addstrf(Rd->reply, "<h1><!--#echo var=\"grid\" --> account manager</h1>\n"); |
4232 | if (NULL != name) | 4245 | if (NULL != Rd->shs.name) |
4233 | { | 4246 | { |
4234 | Rd->reply->addstrf(Rd->reply, "<h2><!--#echo var=\"grid\" --> account for %s</h2>\n", name); | 4247 | char *nm = qstrreplace("tr", xstrdup(Rd->shs.name), " ", "+"); |
4248 | |||
4249 | Rd->reply->addstrf(Rd->reply, "<h3>You are <a href='https://%s%s?user=%s'>%s</a></h3>\n", Rd->Host, Rd->RUri, nm, Rd->shs.name); | ||
4235 | Rd->reply->addstr(Rd->reply, linky); | 4250 | Rd->reply->addstr(Rd->reply, linky); |
4251 | free(nm); | ||
4236 | } | 4252 | } |
4237 | free(linky); | 4253 | free(linky); |
4254 | // if (NULL != name) | ||
4255 | // Rd->reply->addstrf(Rd->reply, "<h2><!--#echo var=\"grid\" --> account for %s</h2>\n", name); | ||
4238 | if (0 != Rd->errors->size(Rd->messages)) | 4256 | if (0 != Rd->errors->size(Rd->messages)) |
4239 | HTMLlist(Rd->reply, "messages -", Rd->messages); | 4257 | HTMLlist(Rd->reply, "messages -", Rd->messages); |
4240 | if (NULL != oF->help) | 4258 | if (NULL != oF->help) |
@@ -4284,9 +4302,9 @@ static void accountWebFooter(reqData *Rd, inputForm *oF) | |||
4284 | 4302 | ||
4285 | static void accountAddWeb(reqData *Rd, inputForm *oF, inputValue *oV) | 4303 | static void accountAddWeb(reqData *Rd, inputForm *oF, inputValue *oV) |
4286 | { | 4304 | { |
4287 | char *name = getStrH(Rd->stuff, "name"); | 4305 | // char *name = getStrH(Rd->database, "Lua.name"); |
4288 | 4306 | ||
4289 | accountWebHeaders(Rd, oF, name); | 4307 | accountWebHeaders(Rd, oF); |
4290 | accountWebFields(Rd, oF, oV); | 4308 | accountWebFields(Rd, oF, oV); |
4291 | accountWebSubs(Rd, oF); | 4309 | accountWebSubs(Rd, oF); |
4292 | accountWebFooter(Rd, oF); | 4310 | accountWebFooter(Rd, oF); |
@@ -4294,10 +4312,9 @@ static void accountAddWeb(reqData *Rd, inputForm *oF, inputValue *oV) | |||
4294 | 4312 | ||
4295 | static void accountLoginWeb(reqData *Rd, inputForm *oF, inputValue *oV) | 4313 | static void accountLoginWeb(reqData *Rd, inputForm *oF, inputValue *oV) |
4296 | { | 4314 | { |
4297 | char *name = getStrH(Rd->stuff, "name"); | 4315 | Rd->shs.name = NULL; |
4298 | |||
4299 | Rd->shs.UUID = NULL; | 4316 | Rd->shs.UUID = NULL; |
4300 | accountWebHeaders(Rd, oF, NULL); | 4317 | accountWebHeaders(Rd, oF); |
4301 | accountWebFields(Rd, oF, oV); | 4318 | accountWebFields(Rd, oF, oV); |
4302 | accountWebSubs(Rd, oF); | 4319 | accountWebSubs(Rd, oF); |
4303 | accountWebFooter(Rd, oF); | 4320 | accountWebFooter(Rd, oF); |
@@ -4305,21 +4322,23 @@ static void accountLoginWeb(reqData *Rd, inputForm *oF, inputValue *oV) | |||
4305 | 4322 | ||
4306 | static void accountViewWeb(reqData *Rd, inputForm *oF, inputValue *oV) | 4323 | static void accountViewWeb(reqData *Rd, inputForm *oF, inputValue *oV) |
4307 | { | 4324 | { |
4308 | char *name = getStrH(Rd->stuff, "name"), | 4325 | char *name = getStrH(Rd->database, "Lua.name"), |
4309 | *email = displayPrep(getStrH(Rd->stuff, "email")), | 4326 | *level = getStrH(Rd->database, "UserAccounts.UserLevel"), |
4327 | *email = displayPrep(getStrH(Rd->database, "UserAccounts.Email")), | ||
4310 | *voucher = displayPrep(getStrH(Rd->database, "Lua.voucher")), | 4328 | *voucher = displayPrep(getStrH(Rd->database, "Lua.voucher")), |
4311 | *about = displayPrep(getStrH(Rd->database, "Lua.aboutMe")); | 4329 | *about = displayPrep(getStrH(Rd->database, "Lua.aboutMe")); |
4312 | time_t crtd = atol(getStrH(Rd->database, "UserAccounts.Created")); | 4330 | time_t crtd = atol(getStrH(Rd->database, "UserAccounts.Created")); |
4313 | 4331 | ||
4314 | accountWebHeaders(Rd, oF, name); | 4332 | accountWebHeaders(Rd, oF); |
4315 | accountWebFields(Rd, oF, oV); | 4333 | accountWebFields(Rd, oF, oV); |
4316 | // TODO - still need to encode < > as < u> for email, voucher, and about. | 4334 | // TODO - still need to encode < > as < u> for email, voucher, and about. |
4317 | // TODO - dammit, qurl_decode returns the string length, and decodes the string in place. | 4335 | // TODO - dammit, qurl_decode returns the string length, and decodes the string in place. |
4318 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Title / level :</b></span></font> %s / %d</p>", getLevel(Rd), Rd->shs.level); | 4336 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Name :</b></span></font> %s</p>", name); |
4337 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Title / level :</b></span></font> %s / %s</p>", getLevel(atoi(level)), level); | ||
4319 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Date of birth :</b></span></font> %s</p>", getStrH(Rd->database, "Lua.DoB")); | 4338 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Date of birth :</b></span></font> %s</p>", getStrH(Rd->database, "Lua.DoB")); |
4320 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Created :</b></span></font> %s</p>", ctime(&crtd)); | 4339 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Created :</b></span></font> %s</p>", ctime(&crtd)); |
4321 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Email :</b></span></font> %s</p>", email); | 4340 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Email :</b></span></font> %s</p>", email); |
4322 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>UUID :</b></span></font> %s</p>", Rd->shs.UUID); | 4341 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>UUID :</b></span></font> %s</p>", getStrH(Rd->database, "UserAccounts.PrincipalID")); |
4323 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Voucher :</b></span></font> %s</p>", voucher); | 4342 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Voucher :</b></span></font> %s</p>", voucher); |
4324 | // Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>About :</b></span></font> </p>" | 4343 | // Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>About :</b></span></font> </p>" |
4325 | // "<textarea readonly >%s</textarea>", qurl_decode(getStrH(Rd->database, "Lua.aboutMe"))); | 4344 | // "<textarea readonly >%s</textarea>", qurl_decode(getStrH(Rd->database, "Lua.aboutMe"))); |
@@ -4332,43 +4351,65 @@ static void accountViewWeb(reqData *Rd, inputForm *oF, inputValue *oV) | |||
4332 | 4351 | ||
4333 | static void accountEditWeb(reqData *Rd, inputForm *oF, inputValue *oV) | 4352 | static void accountEditWeb(reqData *Rd, inputForm *oF, inputValue *oV) |
4334 | { | 4353 | { |
4335 | char *name = getStrH(Rd->stuff, "name"); | 4354 | char *name = getStrH(Rd->database, "Lua.name"), |
4355 | *level = getStrH(Rd->database, "UserAccounts.UserLevel"), | ||
4356 | *email = displayPrep(getStrH(Rd->database, "UserAccounts.Email")), | ||
4357 | *voucher = displayPrep(getStrH(Rd->database, "Lua.voucher")), | ||
4358 | *about = displayPrep(getStrH(Rd->database, "Lua.aboutMe")), | ||
4359 | *lvl = getLevel(atoi(level)); | ||
4336 | 4360 | ||
4337 | accountWebHeaders(Rd, oF, name); | 4361 | accountWebHeaders(Rd, oF); |
4338 | accountWebFields(Rd, oF, oV); | 4362 | accountWebFields(Rd, oF, oV); |
4339 | HTMLtext(Rd->reply, "password", "Old password", "password", "", 16, 0, FALSE); | 4363 | // HTMLtext(Rd->reply, "password", "Old password", "password", "", 16, 0, FALSE); |
4340 | Rd->reply->addstr(Rd->reply, "<p>Warning, the limit on password length is set by your viewer, some can't handle longer than 16 characters.</p>\n"); | 4364 | // Rd->reply->addstr(Rd->reply, "<p>Warning, the limit on password length is set by your viewer, some can't handle longer than 16 characters.</p>\n"); |
4341 | //// HTMLtext(Rd->reply, "title", "text", "title", getStrH(Rh->stuff, "title"), 16, 64, TRUE); | 4365 | //// HTMLtext(Rd->reply, "title", "text", "title", getStrH(Rh->stuff, "title"), 16, 64, TRUE); |
4342 | 4366 | ||
4343 | qlisttbl_obj_t obj; | 4367 | HTMLhidden(Rd->reply, "user", name); |
4344 | char *lvl = getLevel(Rd); | 4368 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Name :</b></span></font> %s</p>", name); |
4369 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Email :</b></span></font> %s</p>", email); | ||
4370 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Voucher :</b></span></font> %s</p>", voucher); | ||
4345 | 4371 | ||
4346 | HTMLselect(Rd->reply, "level", "level"); | 4372 | if (200 <= Rd->shs.level) |
4347 | memset((void*)&obj, 0, sizeof(obj)); // must be cleared before call | ||
4348 | accountLevels->lock(accountLevels); | ||
4349 | while(accountLevels->getnext(accountLevels, &obj, NULL, false) == true) | ||
4350 | { | 4373 | { |
4351 | boolean is = false; | 4374 | qlisttbl_obj_t obj; |
4352 | 4375 | ||
4353 | if (strcmp(lvl, (char *) obj.data) == 0) | 4376 | HTMLselect(Rd->reply, "level", "level"); |
4354 | is = true; | 4377 | memset((void*)&obj, 0, sizeof(obj)); // must be cleared before call |
4355 | HTMLoption(Rd->reply, (char *) obj.data, is); | 4378 | accountLevels->lock(accountLevels); |
4379 | while(accountLevels->getnext(accountLevels, &obj, NULL, false) == true) | ||
4380 | { | ||
4381 | boolean is = false; | ||
4382 | |||
4383 | if (strcmp(lvl, (char *) obj.data) == 0) | ||
4384 | is = true; | ||
4385 | HTMLoption(Rd->reply, (char *) obj.data, is); | ||
4386 | } | ||
4387 | accountLevels->unlock(accountLevels); | ||
4388 | HTMLselectEnd(Rd->reply); | ||
4389 | |||
4390 | Rd->reply->addstrf(Rd->reply, "<p><dl>"); | ||
4391 | Rd->reply->addstrf(Rd->reply, "<dt>disabled</dt><dd>Account cannot log in anywhere.</dd>"); | ||
4392 | Rd->reply->addstrf(Rd->reply, "<dt>newbie</dt><dd>Newly created account, not yet validated.</dd>"); | ||
4393 | Rd->reply->addstrf(Rd->reply, "<dt>validated</dt><dd>Newly created account, they have clicked on the validation link in their validation email.</dd>"); | ||
4394 | Rd->reply->addstrf(Rd->reply, "<dt>vouched for</dt><dd>Someone has vouched for this person.</dd>"); | ||
4395 | Rd->reply->addstrf(Rd->reply, "<dt>approved</dt><dd>This person is approved, and can log into the world.</dd>"); | ||
4396 | Rd->reply->addstrf(Rd->reply, "<dt>god</dt><dd>This is a god admin person.</dd>"); | ||
4397 | Rd->reply->addstrf(Rd->reply, "</dl></p>"); | ||
4356 | } | 4398 | } |
4357 | accountLevels->unlock(accountLevels); | 4399 | else |
4358 | HTMLselectEnd(Rd->reply); | 4400 | Rd->reply->addstrf(Rd->reply, "<p><font size='5'><span style='font-size: x-large'><b>Title / level :</b></span></font> %s / %s</p>", lvl, level); |
4359 | 4401 | ||
4360 | accountWebSubs(Rd, oF); | 4402 | accountWebSubs(Rd, oF); |
4361 | accountWebFooter(Rd, oF); | 4403 | accountWebFooter(Rd, oF); |
4362 | } | 4404 | } |
4363 | 4405 | ||
4364 | 4406 | ||
4365 | static int accountRead(reqData *Rd, inputForm *iF, inputValue *iV) | 4407 | static int accountRead(reqData *Rd, char *uuid, char *firstName, char *lastName) |
4366 | { | 4408 | { |
4367 | int ret = 0, rt = -1; | 4409 | int ret = 0, rt = -1; |
4368 | struct stat st; | 4410 | struct stat st; |
4369 | struct timespec now; | 4411 | struct timespec now; |
4370 | qhashtbl_t *tnm = qhashtbl(0, 0); | 4412 | qhashtbl_t *tnm = qhashtbl(0, 0); |
4371 | char *uuid, *first, *last; | ||
4372 | uuid_t binuuid; | 4413 | uuid_t binuuid; |
4373 | rowData *rows = NULL; | 4414 | rowData *rows = NULL; |
4374 | 4415 | ||
@@ -4413,7 +4454,33 @@ static int accountRead(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4413 | dbRequests->addfirst(dbRequests, auth, sizeof(*auth)); | 4454 | dbRequests->addfirst(dbRequests, auth, sizeof(*auth)); |
4414 | } | 4455 | } |
4415 | 4456 | ||
4416 | uuid = Rd->shs.UUID; first = getStrH(Rd->stuff, "firstName"); last = getStrH(Rd->stuff, "lastName"); | 4457 | // uuid = Rd->shs.UUID; first = getStrH(Rd->stuff, "firstName"); last = getStrH(Rd->stuff, "lastName"); |
4458 | |||
4459 | // Special for showing another users details. | ||
4460 | if ('\0' != getStrH(Rd->queries, "user")[0]) | ||
4461 | uuid = ""; | ||
4462 | |||
4463 | char *first = xstrdup(""), *last = xstrdup(""); | ||
4464 | |||
4465 | if (NULL != firstName) | ||
4466 | { | ||
4467 | first = xstrdup(firstName); | ||
4468 | if (NULL == lastName) | ||
4469 | { | ||
4470 | char *t = strchr(first, ' '); | ||
4471 | |||
4472 | d("accountRead() single name |%s| |%s|", first, last); | ||
4473 | if (NULL == t) | ||
4474 | t = strchr(first, '+'); | ||
4475 | if (NULL != t) | ||
4476 | { | ||
4477 | *t++ = '\0'; | ||
4478 | last = xstrdup(t); | ||
4479 | } | ||
4480 | } | ||
4481 | else | ||
4482 | last = xstrdup(lastName); | ||
4483 | } | ||
4417 | d("accountRead() UUID %s, name %s %s", uuid, first, last); | 4484 | d("accountRead() UUID %s, name %s %s", uuid, first, last); |
4418 | uuid_clear(binuuid); | 4485 | uuid_clear(binuuid); |
4419 | if ((NULL != uuid) && ('\0' != uuid[0])) | 4486 | if ((NULL != uuid) && ('\0' != uuid[0])) |
@@ -4471,10 +4538,16 @@ d("accountRead() UUID %s, name %s %s", uuid, first, last); | |||
4471 | } | 4538 | } |
4472 | else if (rows) | 4539 | else if (rows) |
4473 | { | 4540 | { |
4541 | |||
4474 | ret += rows->rows->size(rows->rows); | 4542 | ret += rows->rows->size(rows->rows); |
4475 | if (1 == ret) | 4543 | if (1 == ret) |
4476 | { | 4544 | { |
4477 | dbPull(Rd, "UserAccounts", rows); | 4545 | dbPull(Rd, "UserAccounts", rows); |
4546 | |||
4547 | char *name = xmprintf("%s %s", getStrH(Rd->database, "UserAccounts.FirstName"), getStrH(Rd->database, "UserAccounts.LastName")); | ||
4548 | |||
4549 | Rd->database->putstr(Rd->database, "Lua.name", name); | ||
4550 | free(name); | ||
4478 | dbDoSomething(auth, FALSE, getStrH(Rd->database, "UserAccounts.PrincipalID")); | 4551 | dbDoSomething(auth, FALSE, getStrH(Rd->database, "UserAccounts.PrincipalID")); |
4479 | rows = auth->rows; | 4552 | rows = auth->rows; |
4480 | if (rows) | 4553 | if (rows) |
@@ -4492,19 +4565,28 @@ d("accountRead() UUID %s, name %s %s", uuid, first, last); | |||
4492 | if (1 == ret) | 4565 | if (1 == ret) |
4493 | { | 4566 | { |
4494 | // TODO - this has to change when we are editing other peoples accounts. | 4567 | // TODO - this has to change when we are editing other peoples accounts. |
4495 | Rd->shs.UUID = Rd->database->getstr(Rd->database, "UserAccounts.PrincipalID", true); | 4568 | if ('\0' == getStrH(Rd->queries, "user")[0]) |
4496 | Rd->stuff->putstr(Rd->stuff, "email", getStrH(Rd->database, "UserAccounts.Email")); | 4569 | { |
4497 | Rd->shs.level = atoi(getStrH(Rd->database, "UserAccounts.UserLevel")); | 4570 | // Rd->shs.level = atoi(getStrH(Rd->database, "UserAccounts.UserLevel")); |
4571 | // TODO - might have to combine first and last here. | ||
4572 | // Rd->shs.name = Rd->database->getstr(Rd->database, "Lua.name", true); | ||
4573 | // Rd->shs.UUID = Rd->database->getstr(Rd->database, "UserAccounts.PrincipalID", true); | ||
4574 | //d("accountRead() setting session uuid %s level %d name %s ", Rd->shs.UUID, (int) Rd->shs.level, Rd->shs.name); | ||
4575 | } | ||
4576 | // Rd->stuff->putstr(Rd->stuff, "email", getStrH(Rd->database, "UserAccounts.Email")); | ||
4498 | } | 4577 | } |
4499 | 4578 | ||
4579 | free(last); | ||
4580 | free(first); | ||
4500 | tnm->free(tnm); | 4581 | tnm->free(tnm); |
4501 | return ret; | 4582 | return ret; |
4502 | } | 4583 | } |
4503 | 4584 | ||
4504 | static int accountDel(reqData *Rd, inputForm *iF, inputValue *iV) | 4585 | static int accountDelSub(reqData *Rd, inputForm *iF, inputValue *iV) |
4505 | { | 4586 | { |
4506 | int ret = 0; | 4587 | int ret = 0; |
4507 | int c = accountRead(Rd, iF, iV); | 4588 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4589 | int c = accountRead(Rd, uuid, first, last); | ||
4508 | 4590 | ||
4509 | if (1 != c) | 4591 | if (1 != c) |
4510 | { | 4592 | { |
@@ -4519,10 +4601,12 @@ static int accountDel(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4519 | } | 4601 | } |
4520 | return ret; | 4602 | return ret; |
4521 | } | 4603 | } |
4522 | static int accountCreate(reqData *Rd, inputForm *iF, inputValue *iV) | 4604 | |
4605 | static int accountCreateSub(reqData *Rd, inputForm *iF, inputValue *iV) | ||
4523 | { | 4606 | { |
4524 | int ret = 0; | 4607 | int ret = 0; |
4525 | int c = accountRead(Rd, iF, iV); | 4608 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4609 | int c = accountRead(Rd, uuid, first, last); | ||
4526 | boolean wipe = FALSE; | 4610 | boolean wipe = FALSE; |
4527 | 4611 | ||
4528 | if (strcmp("POST", Rd->Method) == 0) | 4612 | if (strcmp("POST", Rd->Method) == 0) |
@@ -4558,10 +4642,12 @@ static int accountCreate(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4558 | newSesh(Rd, FALSE); | 4642 | newSesh(Rd, FALSE); |
4559 | return ret; | 4643 | return ret; |
4560 | } | 4644 | } |
4561 | static int accountAdd(reqData *Rd, inputForm *iF, inputValue *iV) | 4645 | |
4646 | static int accountAddSub(reqData *Rd, inputForm *iF, inputValue *iV) | ||
4562 | { | 4647 | { |
4563 | int ret = 0; | 4648 | int ret = 0; |
4564 | int c = accountRead(Rd, iF, iV); | 4649 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4650 | int c = accountRead(Rd, uuid, first, last); | ||
4565 | boolean wipe = FALSE; | 4651 | boolean wipe = FALSE; |
4566 | 4652 | ||
4567 | if (0 != c) | 4653 | if (0 != c) |
@@ -4587,11 +4673,12 @@ static int accountAdd(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4587 | Rd->stuff->putstr(Rd->stuff, "passwordHash", getStrH(Rd->stuff, "passHash")); | 4673 | Rd->stuff->putstr(Rd->stuff, "passwordHash", getStrH(Rd->stuff, "passHash")); |
4588 | Rd->stuff->putstr(Rd->stuff, "passwordSalt", getStrH(Rd->stuff, "passSalt")); | 4674 | Rd->stuff->putstr(Rd->stuff, "passwordSalt", getStrH(Rd->stuff, "passSalt")); |
4589 | Rd->shs.level = -200; | 4675 | Rd->shs.level = -200; |
4676 | Rd->database->putstr(Rd->database, "UserAccounts.UserLevel", "-200"); | ||
4590 | freeSesh(Rd, FALSE, wipe); | 4677 | freeSesh(Rd, FALSE, wipe); |
4591 | newSesh(Rd, TRUE); | 4678 | newSesh(Rd, TRUE); |
4592 | accountWrite(Rd); | 4679 | accountWrite(Rd); |
4593 | // log them in | 4680 | // log them in |
4594 | I("Logged on %s %s Level %d %s", Rd->shs.UUID, getStrH(Rd->stuff, "name"), Rd->shs.level, getLevel(Rd)); | 4681 | I("Logged on %s %s Level %d %s", Rd->shs.UUID, getStrH(Rd->stuff, "name"), Rd->shs.level, getLevel(Rd->shs.level)); |
4595 | Rd->output = "accountView"; | 4682 | Rd->output = "accountView"; |
4596 | Rd->form = "accountView"; | 4683 | Rd->form = "accountView"; |
4597 | Rd->doit = "login"; | 4684 | Rd->doit = "login"; |
@@ -4603,10 +4690,11 @@ static int accountAdd(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4603 | return ret; | 4690 | return ret; |
4604 | } | 4691 | } |
4605 | 4692 | ||
4606 | static int accountSave(reqData *Rd, inputForm *iF, inputValue *iV) | 4693 | static int accountSaveSub(reqData *Rd, inputForm *iF, inputValue *iV) |
4607 | { | 4694 | { |
4608 | int ret = 0; | 4695 | int ret = 0; |
4609 | int c = accountRead(Rd, iF, iV); | 4696 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->body, "user"), *last = NULL; |
4697 | int c = accountRead(Rd, NULL, first, last); | ||
4610 | boolean wipe = FALSE; | 4698 | boolean wipe = FALSE; |
4611 | 4699 | ||
4612 | if (1 != c) | 4700 | if (1 != c) |
@@ -4616,31 +4704,45 @@ static int accountSave(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4616 | } | 4704 | } |
4617 | else if ((0 == ret) && (strcmp("POST", Rd->Method) == 0)) | 4705 | else if ((0 == ret) && (strcmp("POST", Rd->Method) == 0)) |
4618 | { | 4706 | { |
4619 | char *h = checkSLOSpassword(Rd, getStrH(Rd->stuff, "passSalt"), getStrH(Rd->body, "password"), getStrH(Rd->stuff, "passHash"), "Passwords are not the same."); | 4707 | Rd->stuff->putstr(Rd->stuff, "email", getStrH(Rd->database, "UserAccounts.Email")); |
4620 | if (NULL == h) | 4708 | Rd->stuff->putstr(Rd->stuff, "created", getStrH(Rd->database, "UserAccounts.Created")); |
4621 | { | 4709 | Rd->stuff->putstr(Rd->stuff, "flags", getStrH(Rd->database, "UserAccounts.UserFlags")); |
4622 | ret++; | 4710 | Rd->stuff->putstr(Rd->stuff, "active", getStrH(Rd->database, "UserAccounts.active")); |
4623 | wipe = TRUE; | 4711 | Rd->stuff->putstr(Rd->stuff, "passwordSalt", getStrH(Rd->database, "auth.passwordSalt")); |
4624 | Rd->shs.UUID = NULL; | 4712 | Rd->stuff->putstr(Rd->stuff, "passwordHash", getStrH(Rd->database, "auth.passwordHash")); |
4625 | Rd->output = "accountLogin"; | 4713 | Rd->stuff->putstr(Rd->stuff, "name", getStrH(Rd->database, "Lua.name")); |
4626 | } | 4714 | Rd->stuff->putstr(Rd->stuff, "DoB", getStrH(Rd->database, "Lua.DoB")); |
4627 | else | 4715 | Rd->stuff->putstr(Rd->stuff, "agree", getStrH(Rd->database, "Lua.agree")); |
4716 | Rd->stuff->putstr(Rd->stuff, "adult", getStrH(Rd->database, "Lua.adult")); | ||
4717 | Rd->stuff->putstr(Rd->stuff, "aboutMe", getStrH(Rd->database, "Lua.aboutMe")); | ||
4718 | Rd->stuff->putstr(Rd->stuff, "vouched", getStrH(Rd->database, "Lua.vouched")); | ||
4719 | Rd->stuff->putstr(Rd->stuff, "voucher", getStrH(Rd->database, "Lua.voucher")); | ||
4720 | |||
4721 | char *lvl = getStrH(Rd->body, "level"); | ||
4722 | qlisttbl_obj_t obj; | ||
4723 | |||
4724 | memset((void*)&obj, 0, sizeof(obj)); // must be cleared before call | ||
4725 | accountLevels->lock(accountLevels); | ||
4726 | while(accountLevels->getnext(accountLevels, &obj, NULL, false) == true) | ||
4628 | { | 4727 | { |
4629 | free(h); | 4728 | if (strcmp(lvl, (char *) obj.data) == 0) |
4630 | Rd->stuff->putstr(Rd->stuff, "passwordHash", getStrH(Rd->stuff, "passHash")); | 4729 | Rd->database->putstr(Rd->database, "UserAccounts.UserLevel", obj.name); |
4631 | Rd->stuff->putstr(Rd->stuff, "passwordSalt", getStrH(Rd->stuff, "passSalt")); | ||
4632 | accountWrite(Rd); | ||
4633 | } | 4730 | } |
4731 | accountLevels->unlock(accountLevels); | ||
4732 | accountWrite(Rd); | ||
4733 | free(Rd->outQuery); | ||
4734 | Rd->outQuery = xmprintf("?user=%s+%s", getStrH(Rd->database, "UserAccounts.FirstName"), getStrH(Rd->database, "UserAccounts.LastName")); | ||
4634 | } | 4735 | } |
4635 | freeSesh(Rd, FALSE, wipe); | 4736 | // freeSesh(Rd, FALSE, wipe); |
4636 | newSesh(Rd, FALSE); | 4737 | // newSesh(Rd, FALSE); |
4637 | return ret; | 4738 | return ret; |
4638 | } | 4739 | } |
4639 | 4740 | ||
4640 | static int accountValidate(reqData *Rd, inputForm *iF, inputValue *iV) | 4741 | static int accountValidateSub(reqData *Rd, inputForm *iF, inputValue *iV) |
4641 | { | 4742 | { |
4642 | int ret = 0; | 4743 | int ret = 0; |
4643 | int c = accountRead(Rd, iF, iV); | 4744 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4745 | int c = accountRead(Rd, uuid, first, last); | ||
4644 | boolean wipe = FALSE; | 4746 | boolean wipe = FALSE; |
4645 | 4747 | ||
4646 | if (1 != c) | 4748 | if (1 != c) |
@@ -4664,6 +4766,7 @@ static int accountValidate(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4664 | Rd->stuff->putstr(Rd->stuff, "vouched", getStrH(Rd->database, "Lua.vouched")); | 4766 | Rd->stuff->putstr(Rd->stuff, "vouched", getStrH(Rd->database, "Lua.vouched")); |
4665 | Rd->stuff->putstr(Rd->stuff, "voucher", getStrH(Rd->database, "Lua.voucher")); | 4767 | Rd->stuff->putstr(Rd->stuff, "voucher", getStrH(Rd->database, "Lua.voucher")); |
4666 | Rd->shs.level = -100; | 4768 | Rd->shs.level = -100; |
4769 | Rd->database->putstr(Rd->database, "UserAccounts.UserLevel", "-100"); | ||
4667 | accountWrite(Rd); | 4770 | accountWrite(Rd); |
4668 | wipe = TRUE; | 4771 | wipe = TRUE; |
4669 | } | 4772 | } |
@@ -4672,15 +4775,15 @@ static int accountValidate(reqData *Rd, inputForm *iF, inputValue *iV) | |||
4672 | return ret; | 4775 | return ret; |
4673 | } | 4776 | } |
4674 | 4777 | ||
4675 | 4778 | static int accountViewSub(reqData *Rd, inputForm *iF, inputValue *iV) | |
4676 | static int accountView(reqData *Rd, inputForm *iF, inputValue *iV) | ||
4677 | { | 4779 | { |
4678 | // TODO - this has to change when we are editing other peoples accounts. | 4780 | // TODO - this has to change when we are editing other peoples accounts. |
4679 | int ret = 0; | 4781 | int ret = 0; |
4680 | int c = accountRead(Rd, iF, iV); | 4782 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4783 | int c = accountRead(Rd, uuid, first, last); | ||
4681 | boolean wipe = FALSE; | 4784 | boolean wipe = FALSE; |
4682 | 4785 | ||
4683 | d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID"), getStrH(Rd->database, "UserAccounts.FirstName"), getStrH(Rd->database, "UserAccounts.LastName")); | 4786 | d("Sub accountViewSub() %s %s %s", uuid, first, last); |
4684 | if (1 != c) | 4787 | if (1 != c) |
4685 | { | 4788 | { |
4686 | bitch(Rd, "Cannot view account.", "Account doesn't exist."); | 4789 | bitch(Rd, "Cannot view account.", "Account doesn't exist."); |
@@ -4693,7 +4796,7 @@ d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID") | |||
4693 | { | 4796 | { |
4694 | // Check password on POST if the session user is the same as the shown user, coz this is the page shown on login. | 4797 | // Check password on POST if the session user is the same as the shown user, coz this is the page shown on login. |
4695 | // Also only check on login. | 4798 | // Also only check on login. |
4696 | if ((strcmp("POST", Rd->Method) == 0) && (strcmp(Rd->shs.UUID, getStrH(Rd->database, "UserAccounts.PrincipalID")) == 0) | 4799 | if ((strcmp("POST", Rd->Method) == 0) //&& (strcmp(Rd->shs.UUID, getStrH(Rd->database, "UserAccounts.PrincipalID")) == 0) |
4697 | && (strcmp("login", Rd->doit) == 0) && (strcmp("accountLogin", Rd->form) == 0)) | 4800 | && (strcmp("login", Rd->doit) == 0) && (strcmp("accountLogin", Rd->form) == 0)) |
4698 | { | 4801 | { |
4699 | char *h = checkSLOSpassword(Rd, getStrH(Rd->database, "auth.passwordSalt"), getStrH(Rd->body, "password"), getStrH(Rd->database, "auth.passwordHash"), "Login failed."); | 4802 | char *h = checkSLOSpassword(Rd, getStrH(Rd->database, "auth.passwordSalt"), getStrH(Rd->body, "password"), getStrH(Rd->database, "auth.passwordHash"), "Login failed."); |
@@ -4706,8 +4809,11 @@ d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID") | |||
4706 | } | 4809 | } |
4707 | else | 4810 | else |
4708 | { | 4811 | { |
4812 | Rd->shs.level = atoi(getStrH(Rd->database, "UserAccounts.UserLevel")); | ||
4813 | Rd->shs.name = getStrH(Rd->database, "Lua.name"); | ||
4814 | Rd->shs.UUID = getStrH(Rd->database, "UserAccounts.PrincipalID"); | ||
4709 | free(h); | 4815 | free(h); |
4710 | I("Logged on %s %s Level %d %s", Rd->shs.UUID, getStrH(Rd->stuff, "name"), Rd->shs.level, getLevel(Rd)); | 4816 | I("Logged on %s %s Level %d %s", Rd->shs.UUID, Rd->shs.name, Rd->shs.level, getLevel(Rd->shs.level)); |
4711 | } | 4817 | } |
4712 | } | 4818 | } |
4713 | } | 4819 | } |
@@ -4716,12 +4822,13 @@ d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID") | |||
4716 | 4822 | ||
4717 | return ret; | 4823 | return ret; |
4718 | } | 4824 | } |
4719 | static int accountEdit(reqData *Rd, inputForm *iF, inputValue *iV) | 4825 | static int accountEditSub(reqData *Rd, inputForm *iF, inputValue *iV) |
4720 | { | 4826 | { |
4721 | int ret = 0; | 4827 | int ret = 0; |
4722 | int c = accountRead(Rd, iF, iV); | 4828 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4829 | int c = accountRead(Rd, uuid, first, last); | ||
4723 | 4830 | ||
4724 | d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID"), getStrH(Rd->database, "UserAccounts.FirstName"), getStrH(Rd->database, "UserAccounts.LastName")); | 4831 | d("Sub accountEditSub %s %s %s", uuid, first, last); |
4725 | if (1 != c) | 4832 | if (1 != c) |
4726 | { | 4833 | { |
4727 | bitch(Rd, "Cannot edit account.", "Account doesn't exist."); | 4834 | bitch(Rd, "Cannot edit account.", "Account doesn't exist."); |
@@ -4734,16 +4841,19 @@ d("Sub accountView %s %s %s", getStrH(Rd->database, "UserAccounts.PrincipalID") | |||
4734 | } | 4841 | } |
4735 | return ret; | 4842 | return ret; |
4736 | } | 4843 | } |
4737 | static int accountExplore(reqData *Rd, inputForm *iF, inputValue *iV) | 4844 | |
4845 | static int accountExploreSub(reqData *Rd, inputForm *iF, inputValue *iV) | ||
4738 | { | 4846 | { |
4739 | int ret = 0; | 4847 | int ret = 0; |
4740 | // get a list of user records | 4848 | // get a list of user records |
4741 | return ret; | 4849 | return ret; |
4742 | } | 4850 | } |
4743 | static int accountOut(reqData *Rd, inputForm *iF, inputValue *iV) | 4851 | |
4852 | static int accountOutSub(reqData *Rd, inputForm *iF, inputValue *iV) | ||
4744 | { | 4853 | { |
4745 | int ret = 0; | 4854 | int ret = 0; |
4746 | int c = accountRead(Rd, iF, iV); | 4855 | char *uuid = Rd->shs.UUID, *first = getStrH(Rd->stuff, "firstName"), *last = getStrH(Rd->stuff, "lastName"); |
4856 | int c = accountRead(Rd, uuid, first, last); | ||
4747 | 4857 | ||
4748 | if (1 != c) | 4858 | if (1 != c) |
4749 | { | 4859 | { |
@@ -4782,7 +4892,7 @@ static int accountFilterValidated(struct dirtree *node) | |||
4782 | char *where = xmprintf("%s/users/%s", scData, node->name); | 4892 | char *where = xmprintf("%s/users/%s", scData, node->name); |
4783 | int rt = LuaToHash(rdl->Rd, where, "user", tnm, 0, &st, &now, "user"); | 4893 | int rt = LuaToHash(rdl->Rd, where, "user", tnm, 0, &st, &now, "user"); |
4784 | 4894 | ||
4785 | //t("accountFilterValidatedVoucher %s (%s) -> %s -> %s", name, getStrH(tnm, "level"), getStrH(tnm, "name"), getStrH(tnm, "voucher")); | 4895 | t("accountFilterValidatedVoucher %s (%s) -> %s -> %s", name, getStrH(tnm, "level"), getStrH(tnm, "name"), getStrH(tnm, "voucher")); |
4786 | if ((0 == rt) && (strcmp("-100", getStrH(tnm, "level")) == 0)) | 4896 | if ((0 == rt) && (strcmp("-100", getStrH(tnm, "level")) == 0)) |
4787 | rdl->list->put(rdl->list, getStrH(tnm, "name"), tnm, sizeof(*tnm)); | 4897 | rdl->list->put(rdl->list, getStrH(tnm, "name"), tnm, sizeof(*tnm)); |
4788 | else | 4898 | else |
@@ -4808,10 +4918,10 @@ qlisttbl_t *getAccounts(reqData *Rd) | |||
4808 | static void accountExploreValidatedVouchersWeb(reqData *Rd, inputForm *oF, inputValue *oV) | 4918 | static void accountExploreValidatedVouchersWeb(reqData *Rd, inputForm *oF, inputValue *oV) |
4809 | { | 4919 | { |
4810 | qlisttbl_t *list =getAccounts(Rd); | 4920 | qlisttbl_t *list =getAccounts(Rd); |
4811 | char *name = getStrH(Rd->stuff, "name"); | 4921 | // char *name = getStrH(Rd->stuff, "name"); |
4812 | 4922 | ||
4813 | Rd->shs.UUID = NULL; | 4923 | Rd->shs.UUID = NULL; |
4814 | accountWebHeaders(Rd, oF, name); | 4924 | accountWebHeaders(Rd, oF); |
4815 | accountWebFields(Rd, oF, oV); | 4925 | accountWebFields(Rd, oF, oV); |
4816 | 4926 | ||
4817 | count = list->size(list); | 4927 | count = list->size(list); |
@@ -4829,9 +4939,9 @@ static void accountExploreValidatedVouchersWeb(reqData *Rd, inputForm *oF, input | |||
4829 | while(list->getnext(list, &obj, NULL, false) == true) | 4939 | while(list->getnext(list, &obj, NULL, false) == true) |
4830 | { | 4940 | { |
4831 | qhashtbl_t *tnm = (qhashtbl_t *) obj.data; | 4941 | qhashtbl_t *tnm = (qhashtbl_t *) obj.data; |
4832 | char *nm = qstrreplace("tr", xstrdup(obj.name), " ", "_"); | 4942 | char *nm = qstrreplace("tr", xstrdup(obj.name), " ", "+"); |
4833 | 4943 | ||
4834 | Rd->reply->addstrf(Rd->reply, "<tr><td><a href='https://%s%s/users/%s'>%s</a></td>", Rd->Host, Rd->RUri, nm, obj.name); | 4944 | Rd->reply->addstrf(Rd->reply, "<tr><td><a href='https://%s%s?user=%s'>%s</a></td>", Rd->Host, Rd->RUri, nm, obj.name); |
4835 | Rd->reply->addstrf(Rd->reply, "<td>%s</td><td>%s</td><td>%s</td></tr>", getStrH(tnm, "voucher"), getStrH(tnm, "level"), getStrH(tnm, "title")); | 4945 | Rd->reply->addstrf(Rd->reply, "<td>%s</td><td>%s</td><td>%s</td></tr>", getStrH(tnm, "voucher"), getStrH(tnm, "level"), getStrH(tnm, "title")); |
4836 | free(nm); | 4946 | free(nm); |
4837 | tnm->clear(tnm); | 4947 | tnm->clear(tnm); |
@@ -4846,7 +4956,7 @@ static void accountExploreValidatedVouchersWeb(reqData *Rd, inputForm *oF, input | |||
4846 | accountWebSubs(Rd, oF); | 4956 | accountWebSubs(Rd, oF); |
4847 | accountWebFooter(Rd, oF); | 4957 | accountWebFooter(Rd, oF); |
4848 | } | 4958 | } |
4849 | static int accountExploreValidatedVoucher(reqData *Rd, inputForm *iF, inputValue *iV) | 4959 | static int accountExploreValidatedVoucherSub(reqData *Rd, inputForm *iF, inputValue *iV) |
4850 | { | 4960 | { |
4851 | int ret = 0; | 4961 | int ret = 0; |
4852 | return ret; | 4962 | return ret; |
@@ -5180,8 +5290,8 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5180 | inputFieldExtra(fld, FLD_EDITABLE, 42, 63); | 5290 | inputFieldExtra(fld, FLD_EDITABLE, 42, 63); |
5181 | fld = addInputField(iF, LUA_TSTRING, "aboutMe", "About me", NULL, aboutMeValidate, aboutMeWeb); | 5291 | fld = addInputField(iF, LUA_TSTRING, "aboutMe", "About me", NULL, aboutMeValidate, aboutMeWeb); |
5182 | inputFieldExtra(fld, FLD_EDITABLE, 50, 16384); | 5292 | inputFieldExtra(fld, FLD_EDITABLE, 50, 16384); |
5183 | addSubmit(iF, "confirm", "confirm", NULL, accountAdd, "accountView"); | 5293 | addSubmit(iF, "confirm", "confirm", NULL, accountAddSub, "accountView"); |
5184 | addSubmit(iF, "cancel", "cancel", NULL, accountOut, "accountLogin"); | 5294 | addSubmit(iF, "cancel", "cancel", NULL, accountOutSub, "accountLogin"); |
5185 | 5295 | ||
5186 | 5296 | ||
5187 | iF = newInputForm("accountView", "account view", NULL, accountViewWeb, accountLoginWeb); | 5297 | iF = newInputForm("accountView", "account view", NULL, accountViewWeb, accountLoginWeb); |
@@ -5190,35 +5300,39 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5190 | // inputFieldExtra(fld, FLD_HIDDEN, 0, 0); | 5300 | // inputFieldExtra(fld, FLD_HIDDEN, 0, 0); |
5191 | fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); | 5301 | fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); |
5192 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); | 5302 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); |
5193 | addSubmit(iF, "login", "", NULL, accountView, "accountView"); // Coz we sometimes want to trigger this from code. | 5303 | fld = addInputField(iF, LUA_TSTRING, "user", "user", NULL, nameValidate, nameWeb); |
5194 | addSubmit(iF, "validate", "", NULL, accountValidate, "accountLogin"); // Coz we sometimes want to trigger this from code. | 5304 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); |
5195 | // addSubmit(iF, "edit", "edit", NULL, accountEdit, "accountEdit"); | 5305 | addSubmit(iF, "login", "", NULL, accountViewSub, "accountView"); // Coz we sometimes want to trigger this from code. |
5196 | addSubmit(iF, "validated_members", "validated members", NULL, accountExploreValidatedVoucher, "accountValidated"); | 5306 | addSubmit(iF, "validate", "", NULL, accountValidateSub, "accountLogin"); // Coz we sometimes want to trigger this from code. |
5197 | addSubmit(iF, "logout", "logout", NULL, accountOut, "accountLogin"); | 5307 | addSubmit(iF, "edit", "", NULL, accountEditSub, "accountEdit"); // Coz we sometimes want to trigger this from code. |
5308 | addSubmit(iF, "validated_members", "validated members", NULL, accountExploreValidatedVoucherSub, "accountValidated"); | ||
5309 | addSubmit(iF, "logout", "logout", NULL, accountOutSub, "accountLogin"); | ||
5198 | 5310 | ||
5199 | 5311 | ||
5200 | iF = newInputForm("accountValidated", "account validated list", NULL, accountExploreValidatedVouchersWeb, accountLoginWeb); | 5312 | iF = newInputForm("accountValidated", "account validated list", NULL, accountExploreValidatedVouchersWeb, accountLoginWeb); |
5201 | addSession(iF); | 5313 | addSession(iF); |
5202 | fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); | 5314 | fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); |
5203 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); | 5315 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); |
5204 | addSubmit(iF, "login", "", NULL, accountView, "accountView"); // Coz we sometimes want to trigger this from code. | 5316 | addSubmit(iF, "login", "", NULL, accountViewSub, "accountView"); // Coz we sometimes want to trigger this from code. |
5205 | addSubmit(iF, "back", "back", NULL, accountView, "accountView"); | 5317 | addSubmit(iF, "back", "back", NULL, accountViewSub, "accountView"); |
5206 | 5318 | ||
5207 | 5319 | ||
5208 | iF = newInputForm("accountEdit", "account edit", NULL, accountEditWeb, accountLoginWeb); | 5320 | iF = newInputForm("accountEdit", "account edit", NULL, accountEditWeb, accountLoginWeb); |
5209 | addSession(iF); | 5321 | addSession(iF); |
5210 | // fld = addInputField(iF, LUA_TSTRING, "UUID", "UUID", NULL, UUIDValidate, UUIDWeb); | 5322 | // fld = addInputField(iF, LUA_TSTRING, "UUID", "UUID", NULL, UUIDValidate, UUIDWeb); |
5211 | // inputFieldExtra(fld, FLD_HIDDEN, 0, 0); | 5323 | // inputFieldExtra(fld, FLD_HIDDEN, 0, 0); |
5212 | fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); | 5324 | // fld = addInputField(iF, LUA_TSTRING, "name", "name", NULL, nameValidate, nameWeb); |
5213 | inputFieldExtra(fld, FLD_HIDDEN, 42, 63); | 5325 | // inputFieldExtra(fld, FLD_HIDDEN, 42, 63); |
5214 | fld = addInputField(iF, LUA_TEMAIL, "email", "email", "", emailValidate, emailWeb); | 5326 | // fld = addInputField(iF, LUA_TSTRING, "user", "user", NULL, nameValidate, nameWeb); |
5215 | inputFieldExtra(fld, FLD_NONE, 42, 254); | 5327 | // inputFieldExtra(fld, FLD_HIDDEN, 42, 63); |
5216 | addSubmit(iF, "login", "", NULL, accountView, "accountView"); // Coz we sometimes want to trigger this from code. | 5328 | // fld = addInputField(iF, LUA_TEMAIL, "email", "email", "", emailValidate, emailWeb); |
5217 | addSubmit(iF, "save", "save", NULL, accountSave, "accountSave"); | 5329 | // inputFieldExtra(fld, FLD_NONE, 42, 254); |
5218 | addSubmit(iF, "cancel", "cancel", NULL, accountOut, "accountView"); | 5330 | addSubmit(iF, "login", "", NULL, accountViewSub, "accountView"); // Coz we sometimes want to trigger this from code. |
5219 | // addSubmit(iF, "members", "members", NULL, accountExplore, "accountExplore"); | 5331 | addSubmit(iF, "save", "save", NULL, accountSaveSub, "accountView"); |
5220 | addSubmit(iF, "logout", "logout", NULL, accountOut, "accountLogin"); | 5332 | addSubmit(iF, "back", "back", NULL, accountViewSub, "accountView"); |
5221 | // addSubmit(iF, "delete", "delete", NULL, accountDel, "accountDel"); | 5333 | // addSubmit(iF, "members", "members", NULL, accountExploreSub, "accountExplore"); |
5334 | addSubmit(iF, "logout", "logout", NULL, accountOutSub, "accountLogin"); | ||
5335 | // addSubmit(iF, "delete", "delete", NULL, accountDelSub, "accountDel"); | ||
5222 | 5336 | ||
5223 | 5337 | ||
5224 | iF = newInputForm("accountLogin", "account login", "Please login, or create your new account.", accountLoginWeb, accountLoginWeb); | 5338 | iF = newInputForm("accountLogin", "account login", "Please login, or create your new account.", accountLoginWeb, accountLoginWeb); |
@@ -5228,10 +5342,10 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5228 | fld = addInputField(iF, LUA_TPASSWORD, "password", "password", | 5342 | fld = addInputField(iF, LUA_TPASSWORD, "password", "password", |
5229 | "Warning, the limit on password length is set by your viewer, some can't handle longer than 16 characters.", passwordValidate, passwordWeb); | 5343 | "Warning, the limit on password length is set by your viewer, some can't handle longer than 16 characters.", passwordValidate, passwordWeb); |
5230 | inputFieldExtra(fld, FLD_EDITABLE | FLD_REQUIRED, 16, 0); | 5344 | inputFieldExtra(fld, FLD_EDITABLE | FLD_REQUIRED, 16, 0); |
5231 | addSubmit(iF, "logout", "", NULL, accountOut, "accountLogin"); // Coz we sometimes want to trigger this from code. | 5345 | addSubmit(iF, "logout", "", NULL, accountOutSub, "accountLogin"); // Coz we sometimes want to trigger this from code. |
5232 | addSubmit(iF, "validate", "", NULL, accountValidate, "accountLogin"); // Coz we sometimes want to trigger this from code. | 5346 | addSubmit(iF, "validate", "", NULL, accountValidateSub, "accountLogin"); // Coz we sometimes want to trigger this from code. |
5233 | addSubmit(iF, "login", "login", NULL, accountView, "accountView"); | 5347 | addSubmit(iF, "login", "login", NULL, accountViewSub, "accountView"); |
5234 | addSubmit(iF, "create", "create account", NULL, accountCreate, "accountAdd"); | 5348 | addSubmit(iF, "create", "create account", NULL, accountCreateSub, "accountAdd"); |
5235 | } | 5349 | } |
5236 | 5350 | ||
5237 | // Figure out what we are doing. | 5351 | // Figure out what we are doing. |
@@ -5267,6 +5381,15 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5267 | sub = iF->subs->get(iF->subs, doit, NULL, false); | 5381 | sub = iF->subs->get(iF->subs, doit, NULL, false); |
5268 | } | 5382 | } |
5269 | 5383 | ||
5384 | // Special for showing another users details. | ||
5385 | if ('\0' != getStrH(Rd->queries, "user")[0]) | ||
5386 | { | ||
5387 | doit = "edit"; | ||
5388 | form = "accountView"; | ||
5389 | iF = accountPages->get(accountPages, form, NULL, false); | ||
5390 | sub = iF->subs->get(iF->subs, doit, NULL, false); | ||
5391 | } | ||
5392 | |||
5270 | Rd->doit = doit; | 5393 | Rd->doit = doit; |
5271 | Rd->form = form; | 5394 | Rd->form = form; |
5272 | Rd->output = sub->outputForm; | 5395 | Rd->output = sub->outputForm; |
@@ -5378,13 +5501,13 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5378 | if ('\0' != Rd->doit[0]) | 5501 | if ('\0' != Rd->doit[0]) |
5379 | setCookie(Rd, "doit", Rd->doit); | 5502 | setCookie(Rd, "doit", Rd->doit); |
5380 | Rd->Rheaders->putstr (Rd->Rheaders, "Status", "303 See Other"); | 5503 | Rd->Rheaders->putstr (Rd->Rheaders, "Status", "303 See Other"); |
5381 | Rd->Rheaders->putstrf(Rd->Rheaders, "Location", "https://%s%s", Rd->Host, Rd->RUri); | 5504 | Rd->Rheaders->putstrf(Rd->Rheaders, "Location", "https://%s%s%s", Rd->Host, Rd->RUri, Rd->outQuery); |
5382 | Rd->reply->addstrf(Rd->reply, "<html><title>Post POST redirect</title><head>" | 5505 | Rd->reply->addstrf(Rd->reply, "<html><title>Post POST redirect</title><head>" |
5383 | "<meta http-equiv='refresh' content='0; URL=https://%s%s' />" | 5506 | "<meta http-equiv='refresh' content='0; URL=https://%s%s%s' />" |
5384 | "</head><body>You should get redirected to <a href='https://%s%s'>https://%s%s</a></body></html>", | 5507 | "</head><body>You should get redirected to <a href='https://%s%s%s'>https://%s%s%s</a></body></html>", |
5385 | Rd->Host, Rd->RUri, Rd->Host, Rd->RUri, Rd->Host, Rd->RUri | 5508 | Rd->Host, Rd->RUri, Rd->outQuery, Rd->Host, Rd->RUri, Rd->outQuery, Rd->Host, Rd->RUri, Rd->outQuery |
5386 | ); | 5509 | ); |
5387 | I("Redirecting dynamic page %s -> https://%s%s (%s)", file, Rd->Host, Rd->RUri, Rd->form); | 5510 | I("Redirecting dynamic page %s -> https://%s%s%s (%s)", file, Rd->Host, Rd->RUri, Rd->outQuery, Rd->form); |
5388 | } | 5511 | } |
5389 | } | 5512 | } |
5390 | } | 5513 | } |
@@ -5403,6 +5526,8 @@ void account_html(char *file, reqData *Rd, HTMLfile *thisFile) | |||
5403 | free(iV); | 5526 | free(iV); |
5404 | } | 5527 | } |
5405 | 5528 | ||
5529 | free(Rd->outQuery); | ||
5530 | |||
5406 | C("Ending dynamic page %s %s", Rd->RUri, form); | 5531 | C("Ending dynamic page %s %s", Rd->RUri, form); |
5407 | } | 5532 | } |
5408 | 5533 | ||
@@ -5878,6 +6003,7 @@ jit library is loaded or the JIT compiler will not be activated. | |||
5878 | Rd->errors = qlist(0); | 6003 | Rd->errors = qlist(0); |
5879 | Rd->messages = qlist(0); | 6004 | Rd->messages = qlist(0); |
5880 | Rd->reply = qgrow(QGROW_THREADSAFE); | 6005 | Rd->reply = qgrow(QGROW_THREADSAFE); |
6006 | Rd->outQuery = xstrdup(""); | ||
5881 | qhashtbl_obj_t hobj; | 6007 | qhashtbl_obj_t hobj; |
5882 | qlist_obj_t lobj; | 6008 | qlist_obj_t lobj; |
5883 | 6009 | ||