X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fauth.c;h=76fb13dc1dfcf0b4eb80e6d7e2bd1a59cdb6465b;hp=be62db44777c56cb0f22d7e84c293e7ccdc50b36;hb=8f0a07617656512ca31a029814d04fc254ca9d33;hpb=6a59fb210fde5428b23b55027ab223ead5024112 diff --git a/webcit/auth.c b/webcit/auth.c index be62db447..76fb13dc1 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -24,8 +24,6 @@ extern uint32_t hashlittle( const void *key, size_t length, uint32_t initval); -void display_reg(int during_login); - /* * Access level definitions. This is initialized from a function rather than a * static array so that the strings may be localized. @@ -66,7 +64,7 @@ void display_login(void) { begin_burst(); output_headers(1, 0, 0, 0, 1, 0); - do_template("login", NULL); + do_template("login"); end_burst(); } @@ -114,7 +112,7 @@ void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_respo } WCC->axlevel = StrBufExtract_int(serv_response, 1, '|'); - if (WCC->axlevel >= 6) { /* TODO: make this a define, else it might trick us later */ + if (WCC->axlevel >= 6) { WCC->is_aide = 1; } @@ -137,6 +135,7 @@ void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_respo get_preference("floordiv_expanded", &FloorDiv); WCC->floordiv_expanded = FloorDiv; FreeStrBuf(&Buf); + FlushRoomlist(); } @@ -167,21 +166,21 @@ void ajax_login_username_password(void) { * modal/ajax version of 'new user' (username and password) */ void ajax_login_newuser(void) { - StrBuf *Buf = NewStrBuf(); + StrBuf *NBuf = NewStrBuf(); + StrBuf *SBuf = NewStrBuf(); serv_printf("NEWU %s", bstr("name")); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 2) { + StrBuf_ServGetln(NBuf); + if (GetServerStatus(NBuf, NULL) == 2) { + become_logged_in(sbstr("name"), sbstr("pass"), NBuf); serv_printf("SETP %s", bstr("pass")); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 2) { - become_logged_in(sbstr("name"), sbstr("pass"), Buf); - } + StrBuf_ServGetln(SBuf); } /* The client is expecting to read back a citadel protocol response */ - wc_printf("%s", ChrPtr(Buf)); - FreeStrBuf(&Buf); + wc_printf("%s", ChrPtr(NBuf)); + FreeStrBuf(&NBuf); + FreeStrBuf(&SBuf); } @@ -193,45 +192,53 @@ void openid_manual_create(void) { StrBuf *Buf; + /* Did the user change his mind? Pack up and go home. */ if (havebstr("exit_action")) { - do_logout(); + begin_burst(); + output_headers(1, 0, 0, 0, 1, 0); + do_template("authpopup_finished"); + end_burst(); return; } - if (havebstr("newuser_action")) { - Buf = NewStrBuf(); - serv_printf("OIDC %s", bstr("name")); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 2) { - StrBuf *gpass; - - gpass = NewStrBuf(); - serv_puts("SETP GENERATE_RANDOM_PASSWORD"); - StrBuf_ServGetln(gpass); - StrBufCutLeft(gpass, 4); - become_logged_in(sbstr("name"), gpass, Buf); - FreeStrBuf(&gpass); - } - FreeStrBuf(&Buf); + + /* Ok, let's give this a try. Can we create the new user? */ + + Buf = NewStrBuf(); + serv_printf("OIDC %s", bstr("name")); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 2) { + StrBuf *gpass; + + gpass = NewStrBuf(); + serv_puts("SETP GENERATE_RANDOM_PASSWORD"); + StrBuf_ServGetln(gpass); + StrBufCutLeft(gpass, 4); + become_logged_in(sbstr("name"), gpass, Buf); + FreeStrBuf(&gpass); } + FreeStrBuf(&Buf); + /* Did we manage to log in? If so, continue with the normal flow... */ if (WC->logged_in) { - if (WC->need_regi) { - display_reg(1); - } else if (WC->need_vali) { - validate(); - } else { - do_welcome(); + if (WC->logged_in) { + begin_burst(); + output_headers(1, 0, 0, 0, 1, 0); + do_template("authpopup_finished"); + end_burst(); } } else { + /* Still no good! Go back to teh dialog to select a username */ const StrBuf *Buf; - putbstr("__claimed_id", NewStrBufDup(sbstr("openid_url"))); Buf = sbstr("name"); if (StrLength(Buf) > 0) putbstr("__username", NewStrBufDup(Buf)); begin_burst(); - do_template("openid_manual_create", NULL); + output_headers(1, 0, 0, 0, 1, 0); + wc_printf(""); + do_template("openid_manual_create"); + wc_printf(""); end_burst(); } @@ -278,7 +285,6 @@ void finalize_openid_login(void) { StrBuf *Buf; wcsession *WCC = WC; - int already_logged_in = (WCC->logged_in) ; int linecount = 0; StrBuf *result = NULL; StrBuf *username = NULL; @@ -297,6 +303,7 @@ void finalize_openid_login(void) long HKLen; const char *HKey; HashPos *Cursor; + int len; Cursor = GetNewHashPos (WCC->Hdr->urlstrings, 0); while (GetNextHashPos(WCC->Hdr->urlstrings, Cursor, &HKLen, &HKey, &U)) { @@ -309,7 +316,9 @@ void finalize_openid_login(void) serv_puts("000"); linecount = 0; - while (StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) + while (len = StrBuf_ServGetln(Buf), + ((len >= 0) && + ((len != 3) || strcmp(ChrPtr(Buf), "000") ))) { if (linecount == 0) result = NewStrBufDup(Buf); if (!strcasecmp(ChrPtr(result), "authenticate")) { @@ -338,33 +347,38 @@ void finalize_openid_login(void) } } - /* If we were already logged in, this was an attempt to associate an OpenID account - FIXME put this back in - if (already_logged_in) { + /* + * Is this an attempt to associate a new OpenID with an account that is already logged in? + */ + if ( (WCC->logged_in) && (havebstr("attach_existing")) ) { display_openids(); - FreeStrBuf(&result); - FreeStrBuf(&username); - FreeStrBuf(&password); - FreeStrBuf(&claimed_id); - FreeStrBuf(&logged_in_response); - return; } - */ /* If this operation logged us in, either by connecting with an existing account or by * auto-creating one using Simple Registration Extension, we're already on our way. */ - if (!strcasecmp(ChrPtr(result), "authenticate")) { + else if (!strcasecmp(ChrPtr(result), "authenticate")) { become_logged_in(username, password, logged_in_response); + + /* Did we manage to log in? If so, continue with the normal flow... */ + if (WC->logged_in) { + begin_burst(); + output_headers(1, 0, 0, 0, 1, 0); + do_template("authpopup_finished"); + end_burst(); + } else { + begin_burst(); + output_headers(1, 0, 0, 0, 1, 0); + wc_printf(""); + wc_printf(_("An error has occurred.")); + wc_printf(""); + end_burst(); + } } - /* The specified OpenID was verified but the desired user name was either not specified via SRI + /* The specified OpenID was verified but the desired user name was either not specified via SRE * or conflicts with an existing user. Either way the user will need to specify a new name. */ - -/* - * FIXME make this work again!!!! - * else if (!strcasecmp(ChrPtr(result), "verify_only")) { putbstr("__claimed_id", claimed_id); claimed_id = NULL; @@ -373,24 +387,20 @@ void finalize_openid_login(void) username = NULL; } begin_burst(); - do_template("openid_manual_create", NULL); + output_headers(1, 0, 0, 0, 1, 0); + wc_printf(""); + do_template("openid_manual_create"); + wc_printf(""); end_burst(); } -*/ - - - /* Did we manage to log in? If so, continue with the normal flow... */ - if (WC->logged_in) { - begin_burst(); - output_headers(1, 0, 0, 0, 1, 0); - do_template("authpopup_finished", NULL); - end_burst(); - } else { + /* Something went VERY wrong if we get to this point */ + else { + syslog(1, "finalize_openid_login() failed to do anything. This is a code problem.\n"); begin_burst(); output_headers(1, 0, 0, 0, 1, 0); wc_printf(""); - wc_printf(_("An error has occurred.")); /* FIXME do something prettier here */ + wc_printf(_("An error has occurred.")); wc_printf(""); end_burst(); } @@ -423,23 +433,17 @@ void do_welcome(void) if (!setup_wizard) { int len; sprintf(wizard_filename, "setupwiz.%s.%s", - ctdlhost, ctdlport); - len = strlen(wizard_filename); - for (i=0; iwc_username); FlushStrBuf(WCC->wc_password); FlushStrBuf(WCC->wc_fullname); + FlushRoomlist(); serv_puts("LOUT"); serv_getln(buf, sizeof buf); WCC->logged_in = 0; - if (WC->serv_info->serv_supports_guest) { - display_default_landing_page(); - return; - } - FlushStrBuf(WCC->CurRoom.name); /* Calling output_headers() this way causes the cookies to be un-set */ output_headers(1, 1, 0, 1, 0, 0); + /* For sites in guest mode, redirect to the landing page after we're logged out */ + if (WC->serv_info->serv_supports_guest) { + wc_printf(" " + ); + } + wc_printf("
"); wc_printf("
"); wc_printf("
"); @@ -535,11 +544,38 @@ void do_logout(void) wc_printf(_("Log in again")); wc_printf(""); wc_printf("
\n"); + if (WC->serv_info->serv_supports_guest) { + display_default_landing_page(); + return; + } + wDumpContent(2); end_webcit_session(); } +/* + * Special page for monitoring scripts etc + */ +void monitor(void) +{ + output_headers(0, 0, 0, 0, 0, 0); + + hprintf("Content-type: text/plain\r\n" + "Server: " PACKAGE_STRING "\r\n" + "Connection: close\r\n" + ); + begin_burst(); + + wc_printf("Connection to Citadel server at %s:%s : %s\r\n", + ctdlhost, ctdlport, + (WC->connected ? "SUCCESS" : "FAIL") + ); + + wDumpContent(0); +} + + /* * validate new users */ @@ -550,14 +586,11 @@ void validate(void) char buf[SIZ]; int a; - output_headers(1, 1, 2, 0, 0, 0); - wc_printf("
\n"); - wc_printf("

"); - wc_printf(_("Validate new users")); - wc_printf("

"); - wc_printf("
\n"); + output_headers(1, 1, 1, 0, 0, 0); - wc_printf("
\n"); + do_template("box_begin_1"); + StrBufAppendBufPlain(WC->WBuf, _("Validate new users"), -1, 0); + do_template("box_begin_2"); /* If the user just submitted a validation, process it... */ safestrncpy(buf, bstr("user"), sizeof buf); @@ -606,7 +639,7 @@ void validate(void) int haveChar = 0; int haveNum = 0; int haveOther = 0; - int count = 0; + int haveLong = 0; pch = buf; while (!IsEmptyStr(pch)) { @@ -618,10 +651,13 @@ void validate(void) haveOther = 1; pch ++; } - count = pch - buf; - if (count > 7) - count = 0; - switch (count){ + if (pch - buf > 7) + haveLong = 1; + switch (haveLong + + haveChar + + haveNum + + haveOther) + { case 0: pch = _("very weak"); break; @@ -671,11 +707,11 @@ void validate(void) wc_printf("
\n"); wc_printf("\n"); + do_template("box_end"); wDumpContent(1); } - /* * Display form for registration. * @@ -730,17 +766,15 @@ void display_reg(int during_login) FreeStrBuf(&ReturnTo); } - /* FIXME - don't we have to free VCMsg and VCAtt ?? */ } - - /* * display form for changing your password */ void display_changepw(void) { + wcsession *WCC = WC; WCTemplputParams SubTP; char buf[SIZ]; StrBuf *Buf; @@ -750,14 +784,14 @@ void display_changepw(void) memset(&SubTP, 0, sizeof(WCTemplputParams)); SubTP.Filter.ContextType = CTX_STRBUF; SubTP.Context = Buf; - DoTemplate(HKEY("beginbox"), NULL, &SubTP); + DoTemplate(HKEY("box_begin"), NULL, &SubTP); FreeStrBuf(&Buf); - if (!IsEmptyStr(WC->ImportantMessage)) { + if (StrLength(WCC->ImportantMsg) > 0) { wc_printf("" - "%s
\n", WC->ImportantMessage); - safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage); + "%s
\n", ChrPtr(WCC->ImportantMsg)); + FlushStrBuf(WCC->ImportantMsg); } serv_puts("MESG changepw"); @@ -786,7 +820,7 @@ void display_changepw(void) wc_printf("\n"); wc_printf("\n"); - do_template("endbox", NULL); + do_template("box_end"); wDumpContent(1); } @@ -796,13 +830,11 @@ void display_changepw(void) */ void changepw(void) { - char buf[SIZ]; + StrBuf *Line; char newpass1[32], newpass2[32]; if (!havebstr("change_action")) { - safestrncpy(WC->ImportantMessage, - _("Cancelled. Password was not changed."), - sizeof WC->ImportantMessage); + AppendImportantMessage(_("Cancelled. Password was not changed."), -1); display_main_menu(); return; } @@ -811,38 +843,40 @@ void changepw(void) safestrncpy(newpass2, bstr("newpass2"), sizeof newpass2); if (strcasecmp(newpass1, newpass2)) { - safestrncpy(WC->ImportantMessage, - _("They don't match. Password was not changed."), - sizeof WC->ImportantMessage); + AppendImportantMessage(_("They don't match. Password was not changed."), -1); display_changepw(); return; } if (IsEmptyStr(newpass1)) { - safestrncpy(WC->ImportantMessage, - _("Blank passwords are not allowed."), - sizeof WC->ImportantMessage); + AppendImportantMessage(_("Blank passwords are not allowed."), -1); display_changepw(); return; } + Line = NewStrBuf(); serv_printf("SETP %s", newpass1); - serv_getln(buf, sizeof buf); - sprintf(WC->ImportantMessage, "%s", &buf[4]); - if (buf[0] == '2') { + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 1, 0) == 2) { if (WC->wc_password == NULL) - WC->wc_password = NewStrBufPlain(buf, -1); + WC->wc_password = NewStrBufPlain( + ChrPtr(Line) + 4, + StrLength(Line) - 4); else { FlushStrBuf(WC->wc_password); - StrBufAppendBufPlain(WC->wc_password, buf, -1, 0); + StrBufAppendBufPlain(WC->wc_password, + ChrPtr(Line) + 4, + StrLength(Line) - 4, 0); } display_main_menu(); } else { display_changepw(); } + FreeStrBuf(&Line); } + int ConditionalHaveAccessCreateRoom(StrBuf *Target, WCTemplputParams *TP) { StrBuf *Buf; @@ -861,12 +895,14 @@ int ConditionalHaveAccessCreateRoom(StrBuf *Target, WCTemplputParams *TP) return 1; } + int ConditionalAide(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; return (WCC != NULL) ? ((WCC->logged_in == 0)||(WC->is_aide == 0)) : 0; } + int ConditionalIsLoggedIn(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; @@ -875,6 +911,14 @@ int ConditionalIsLoggedIn(StrBuf *Target, WCTemplputParams *TP) } +/* + * toggle the session over to a different language + */ +void switch_language(void) { + set_selected_language(bstr("lang")); + pop_destination(); +} + void _display_reg(void) { display_reg(0); @@ -896,6 +940,7 @@ void Header_HandleAuth(StrBuf *Line, ParsedHttpHdrs *hdr) } } + void CheckAuthBasic(ParsedHttpHdrs *hdr) { /* @@ -912,6 +957,7 @@ void CheckAuthBasic(ParsedHttpHdrs *hdr) */ } + void GetAuthBasic(ParsedHttpHdrs *hdr) { const char *Pos = NULL; @@ -923,6 +969,7 @@ void GetAuthBasic(ParsedHttpHdrs *hdr) StrBufExtract_NextToken(hdr->c_password, hdr->HR.plainauth, &Pos, ':'); } + void Header_HandleCookie(StrBuf *Line, ParsedHttpHdrs *hdr) { const char *pch; @@ -949,6 +996,7 @@ void Header_HandleCookie(StrBuf *Line, ParsedHttpHdrs *hdr) hdr->HR.got_auth = AUTH_COOKIE; } + void HttpNewModule_AUTH (ParsedHttpHdrs *httpreq) @@ -958,6 +1006,8 @@ HttpNewModule_AUTH httpreq->c_roomname = NewStrBuf(); httpreq->c_language = NewStrBuf(); } + + void HttpDetachModule_AUTH (ParsedHttpHdrs *httpreq) @@ -968,6 +1018,7 @@ HttpDetachModule_AUTH FLUSHStrBuf(httpreq->c_language); } + void HttpDestroyModule_AUTH (ParsedHttpHdrs *httpreq) @@ -978,6 +1029,7 @@ HttpDestroyModule_AUTH FreeStrBuf(&httpreq->c_language); } + void InitModule_AUTH (void) @@ -989,7 +1041,6 @@ InitModule_AUTH /* no url pattern at all? Show login. */ WebcitAddUrlHandler(HKEY(""), "", 0, do_welcome, ANONYMOUS|COOKIEUNNEEDED); - /* some of these will be removed soon */ WebcitAddUrlHandler(HKEY("do_welcome"), "", 0, do_welcome, ANONYMOUS|COOKIEUNNEEDED); WebcitAddUrlHandler(HKEY("openid_login"), "", 0, do_openid_login, ANONYMOUS); WebcitAddUrlHandler(HKEY("finalize_openid_login"), "", 0, finalize_openid_login, ANONYMOUS); @@ -1001,8 +1052,10 @@ InitModule_AUTH WebcitAddUrlHandler(HKEY("changepw"), "", 0, changepw, 0); WebcitAddUrlHandler(HKEY("termquit"), "", 0, do_logout, 0); WebcitAddUrlHandler(HKEY("do_logout"), "", 0, do_logout, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE); + WebcitAddUrlHandler(HKEY("monitor"), "", 0, monitor, ANONYMOUS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE); WebcitAddUrlHandler(HKEY("ajax_login_username_password"), "", 0, ajax_login_username_password, AJAX|ANONYMOUS); WebcitAddUrlHandler(HKEY("ajax_login_newuser"), "", 0, ajax_login_newuser, AJAX|ANONYMOUS); + WebcitAddUrlHandler(HKEY("switch_language"), "", 0, switch_language, ANONYMOUS); RegisterConditional(HKEY("COND:AIDE"), 2, ConditionalAide, CTX_NONE); RegisterConditional(HKEY("COND:LOGGEDIN"), 2, ConditionalIsLoggedIn, CTX_NONE); RegisterConditional(HKEY("COND:MAY_CREATE_ROOM"), 2, ConditionalHaveAccessCreateRoom, CTX_NONE);