X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fauth.c;h=0a64641a24114e4cbb1fc9064776bb6de0b9b9da;hb=0f72e15a12dcc90e3dbfc01ff35c0e910a8d419e;hp=c86e276b094ee576b59660fa11f6e480ff553e07;hpb=d6133bc68a4c9caf8380931d3d28016131e9ddb8;p=citadel.git diff --git a/webcit/auth.c b/webcit/auth.c index c86e276b0..0a64641a2 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -1,34 +1,49 @@ /* * $Id$ + */ +/** * - * Handles authentication of users to a Citadel server. - * + * \defgroup WebcitAuth WebcitAuth; Handles authentication of users to a Citadel server. + * \ingroup CitadelConfig */ +/*@{*/ #include "webcit.h" -char *axdefs[] = -{ - "Deleted", - "New User", - "Problem User", - "Local User", - "Network User", - "Preferred User", - "Aide" -}; -/* - * Display the login screen + +/** + * \brief user states + * the plain text states of a user. filled in at \ function TODO initialize_ax_defs() + * due to NLS + */ +char *axdefs[7]; + +void initialize_axdefs(void) { + axdefs[0] = _("Deleted"); /*!0: an erased user */ + axdefs[1] = _("New User"); /*!1: a new user */ + axdefs[2] = _("Problem User"); /*!2: a trouble maker */ + axdefs[3] = _("Local User"); /*!3: user with normal privileges */ + axdefs[4] = _("Network User"); /*!4: a user that may access network resources */ + axdefs[5] = _("Preferred User");/*!5: a moderator */ + axdefs[6] = _("Aide"); /*!6: chief */ +} + + + + +/** + * \brief Display the login screen + * \param mesg The error message if last attempt failed. */ void display_login(char *mesg) { char buf[SIZ]; - output_headers(1, 1, 2, 0, 0, 0, 0); - wprintf("
\n"); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); - if (mesg != NULL) if (strlen(mesg) > 0) { + if (mesg != NULL) if (!IsEmptyStr(mesg)) { stresc(buf, mesg, 0, 0); svprintf("mesg", WCS_STRING, "%s", buf); } @@ -50,12 +65,24 @@ void display_login(char *mesg) serv_info.serv_humannode ); + svprintf("USERNAME_BOX", WCS_STRING, "%s", _("User name:")); + svprintf("PASSWORD_BOX", WCS_STRING, "%s", _("Password:")); + svprintf("LANGUAGE_BOX", WCS_STRING, "%s", _("Language:")); svprintf("LOGIN_BUTTON", WCS_STRING, "%s", _("Login")); svprintf("NEWUSER_BUTTON", WCS_STRING, "%s", _("New User")); svprintf("EXIT_BUTTON", WCS_STRING, "%s", _("Exit")); svprintf("hello", WCS_SERVCMD, "MESG hello"); - svprintf("BOXTITLE", WCS_STRING, _("%s - powered by Citadel"), + svprintf("BOXTITLE", WCS_STRING, _("%s - powered by Citadel"), serv_info.serv_humannode); + svcallback("DO_LANGUAGE_BOX", offer_languages); + if (serv_info.serv_newuser_disabled) { + svprintf("NEWUSER_BUTTON_PRE", WCS_STRING, "
"); + svprintf("NEWUSER_BUTTON_POST", WCS_STRING, "
"); + } + else { + svprintf("NEWUSER_BUTTON_PRE", WCS_STRING, ""); + svprintf("NEWUSER_BUTTON_POST", WCS_STRING, ""); + } do_template("login"); @@ -65,19 +92,24 @@ void display_login(char *mesg) -/* +/** \brief Initialize the session * This function needs to get called whenever the session changes from * not-logged-in to logged-in, either by an explicit login by the user or * by a timed-out session automatically re-establishing with a little help * from the browser cookie. Either way, we need to load access controls and * preferences from the server. + * + * \param user the username + * \param pass his password + * \param serv_response The parameters returned from a Citadel USER or NEWU command */ void become_logged_in(char *user, char *pass, char *serv_response) { char buf[SIZ]; WC->logged_in = 1; - extract_token(WC->wc_username, &serv_response[4], 0, '|', sizeof WC->wc_username); + extract_token(WC->wc_fullname, &serv_response[4], 0, '|', sizeof WC->wc_fullname); + safestrncpy(WC->wc_username, user, sizeof WC->wc_username); safestrncpy(WC->wc_password, pass, sizeof WC->wc_password); WC->axlevel = extract_int(&serv_response[4], 1); if (WC->axlevel >= 6) { @@ -94,18 +126,32 @@ void become_logged_in(char *user, char *pass, char *serv_response) WC->need_vali = extract_int(&buf[4], 2); extract_token(WC->cs_inet_email, &buf[4], 3, '|', sizeof WC->cs_inet_email); } + + get_preference("current_iconbar", buf, sizeof buf); + WC->current_iconbar = atoi(buf); + + get_preference("floordiv_expanded", WC->floordiv_expanded, sizeof WC->floordiv_expanded); } +/** + * \brief Login Checks + * the logics to detect invalid passwords not to get on citservers nerves + */ void do_login(void) { char buf[SIZ]; - if (strlen(bstr("exit_action")) > 0) { + if (!IsEmptyStr(bstr("language"))) { + set_selected_language(bstr("language")); + go_selected_language(); + } + + if (!IsEmptyStr(bstr("exit_action"))) { do_logout(); return; } - if (strlen(bstr("login_action")) > 0) { + if (!IsEmptyStr(bstr("login_action"))) { serv_printf("USER %s", bstr("name")); serv_getln(buf, sizeof buf); if (buf[0] == '3') { @@ -123,8 +169,8 @@ void do_login(void) return; } } - if (strlen(bstr("newuser_action")) > 0) { - if (strlen(bstr("pass")) == 0) { + if (!IsEmptyStr(bstr("newuser_action"))) { + if (IsEmptyStr(bstr("pass"))) { display_login(_("Blank passwords are not allowed.")); return; } @@ -151,6 +197,11 @@ void do_login(void) } +/** + * \brief display the user a welcome screen. + * if this is the first time login, and the web based setup is enabled, + * lead the user through the setup routines + */ void do_welcome(void) { char buf[SIZ]; @@ -158,14 +209,16 @@ void do_welcome(void) FILE *fp; int i; - /* + /** * See if we have to run the first-time setup wizard */ if (WC->is_aide) { if (!setup_wizard) { + int len; sprintf(wizard_filename, "setupwiz.%s.%s", ctdlhost, ctdlport); - for (i=0; ilogged_in) { + sprintf(buf, "%d", WC->current_iconbar); + set_preference("current_iconbar", buf, 0); + set_preference("floordiv_expanded", WC->floordiv_expanded, 1); + } + serv_puts("QUIT"); WC->killthis = 1; /* close() of citadel socket will be done by do_housekeeping() */ } - +/** + * execute the logout + */ void do_logout(void) { char buf[SIZ]; @@ -219,9 +285,10 @@ void do_logout(void) safestrncpy(WC->wc_username, "", sizeof WC->wc_username); safestrncpy(WC->wc_password, "", sizeof WC->wc_password); safestrncpy(WC->wc_roomname, "", sizeof WC->wc_roomname); + safestrncpy(WC->wc_fullname, "", sizeof WC->wc_fullname); - /* Calling output_headers() this way causes the cookies to be un-set */ - output_headers(1, 1, 0, 1, 0, 0, 0); + /** Calling output_headers() this way causes the cookies to be un-set */ + output_headers(1, 1, 0, 1, 0, 0); wprintf("
"); serv_puts("MESG goodbye"); @@ -229,7 +296,7 @@ void do_logout(void) if (WC->serv_sock >= 0) { if (buf[0] == '1') { - fmout(NULL, "CENTER"); + fmout("CENTER"); } else { wprintf("Goodbye\n"); } @@ -241,7 +308,9 @@ void do_logout(void) ); } - wprintf("
Log in again   " + wprintf("
"); + wprintf(_("Log in again")); + wprintf("   " ""); wprintf(_("Close window")); wprintf("
\n"); @@ -250,7 +319,7 @@ void do_logout(void) } -/* +/* * * validate new users */ void validate(void) @@ -260,33 +329,45 @@ void validate(void) char buf[SIZ]; int a; - output_headers(1, 1, 2, 0, 0, 0, 0); - wprintf("
\n" - "
" - ""); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + wprintf("

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

\n
\n
\n"); + wprintf(""); + wprintf("
\n"); + + wprintf("
\n"); + /** If the user just submitted a validation, process it... */ safestrncpy(buf, bstr("user"), sizeof buf); - if (strlen(buf) > 0) - if (strlen(bstr("axlevel")) > 0) { + if (!IsEmptyStr(buf)) { + if (!IsEmptyStr(bstr("axlevel"))) { serv_printf("VALI %s|%s", buf, bstr("axlevel")); serv_getln(buf, sizeof buf); if (buf[0] != '2') { wprintf("%s
\n", &buf[4]); } } + } + + /** Now see if any more users require validation. */ serv_puts("GNUR"); serv_getln(buf, sizeof buf); - + if (buf[0] == '2') { + wprintf(""); + wprintf(_("No users require validation at this time.")); + wprintf("
\n"); + wDumpContent(1); + return; + } if (buf[0] != '3') { wprintf("%s
\n", &buf[4]); wDumpContent(1); return; } - wprintf("
" - "
\n"); + wprintf("
" + "
\n"); wprintf("
"); safestrncpy(user, &buf[4], sizeof user); @@ -298,7 +379,7 @@ void validate(void) serv_getln(buf, sizeof buf); ++a; if (a == 1) - wprintf("User #%s

%s

", + wprintf("#%s

%s

", buf, &cmd[4]); if (a == 2) wprintf("PW: %s
\n", buf); @@ -326,7 +407,7 @@ void validate(void) wprintf(_("Select access level for this user:")); wprintf("
\n"); for (a = 0; a <= 6; ++a) { - wprintf("nonce); urlescputs(user); wprintf("&axlevel=%d\">%s   \n", a, axdefs[a]); @@ -340,10 +421,11 @@ void validate(void) -/* - * Display form for registration. +/** + * \brief Display form for registration. * (Set during_login to 1 if this registration is being performed during * new user login and will require chaining to the proper screen.) + * \param during_login are we just in the login phase? */ void display_reg(int during_login) { @@ -355,7 +437,7 @@ void display_reg(int during_login) return; } - vcard_msgnum = locate_user_vcard(WC->wc_username, -1); + vcard_msgnum = locate_user_vcard(WC->wc_fullname, -1); if (vcard_msgnum < 0L) { if (during_login) do_welcome(); else display_main_menu(); @@ -363,10 +445,10 @@ void display_reg(int during_login) } if (during_login) { - do_edit_vcard(vcard_msgnum, "1", "/do_welcome"); + do_edit_vcard(vcard_msgnum, "1", "do_welcome"); } else { - do_edit_vcard(vcard_msgnum, "1", "/display_main_menu"); + do_edit_vcard(vcard_msgnum, "1", "display_main_menu"); } } @@ -374,24 +456,23 @@ void display_reg(int during_login) -/* +/** * display form for changing your password */ void display_changepw(void) { char buf[SIZ]; - output_headers(1, 1, 2, 0, 0, 0, 0); - wprintf("
\n" - "
" - ""); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + wprintf("

"); wprintf(_("Change your password")); - wprintf("" - "

\n" - "
\n
\n" - ); + wprintf(""); + wprintf("
"); - if (strlen(WC->ImportantMessage) > 0) { + wprintf("
\n"); + + if (!IsEmptyStr(WC->ImportantMessage)) { do_template("beginbox_nt"); wprintf("" "%s
\n", WC->ImportantMessage); @@ -399,17 +480,18 @@ void display_changepw(void) safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage); } - wprintf("
" - "
\n"); + wprintf("
" + "
\n"); wprintf("

"); serv_puts("MESG changepw"); serv_getln(buf, sizeof buf); if (buf[0] == '1') { - fmout(NULL, "CENTER"); + fmout("CENTER"); } wprintf("
\n"); + wprintf("\n", WC->nonce); wprintf("
" "" @@ -431,15 +513,16 @@ void display_changepw(void) wDumpContent(1); } -/* - * change password +/** + * \brief change password + * if passwords match, propagate it to citserver. */ void changepw(void) { char buf[SIZ]; char newpass1[32], newpass2[32]; - if (strlen(bstr("change_action")) == 0) { + if (IsEmptyStr(bstr("change_action"))) { safestrncpy(WC->ImportantMessage, _("Cancelled. Password was not changed."), sizeof WC->ImportantMessage); @@ -458,7 +541,7 @@ void changepw(void) return; } - if (strlen(newpass1) == 0) { + if (IsEmptyStr(newpass1)) { safestrncpy(WC->ImportantMessage, _("Blank passwords are not allowed."), sizeof WC->ImportantMessage); @@ -477,3 +560,7 @@ void changepw(void) display_changepw(); } } + + + +/** @} */