X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fauth.c;h=94182798b024c7b9dcdcecdaef6417646a7eeb1a;hb=523c1b0f7a3002c6aaa3eb833b55eb0cf07674ff;hp=64245c8509c4618994ea0a7b226ce46b4d4db0df;hpb=a3a2f31bfb24873aeb9863081a49ecd62debeded;p=citadel.git diff --git a/webcit/auth.c b/webcit/auth.c index 64245c850..94182798b 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -1,89 +1,479 @@ /* - * auth.c + * $Id$ * - * This file contains code which relates to authentication of users to Citadel. + * Handles authentication of users to a Citadel server. * */ -#include -#include -#include -#include -#include -#include #include "webcit.h" -void display_login_page() { - - printf("HTTP/1.0 200 OK\n"); - output_headers(); +char *axdefs[] = +{ + "Deleted", + "New User", + "Problem User", + "Local User", + "Network User", + "Preferred User", + "Aide" +}; + +/* + * Display the login screen + */ +void display_login(char *mesg) +{ + char buf[SIZ]; - wprintf("Please log in\n"); - wprintf("
\n"); - wprintf("\n"); - wprintf(""); - wprintf("

"Velma"

(next generation WebCit)

"); - wprintf("Please log in...
\n"); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + if (mesg != NULL) if (strlen(mesg) > 0) { + stresc(buf, mesg, 0, 0); + svprintf("mesg", WCS_STRING, "%s", buf); + } - wprintf("
\n"); - wprintf("
"); - wprintf("User Name:\n"); - wprintf("
"); - wprintf("Password:"); - wprintf("
\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("
\n"); + svprintf("LOGIN_INSTRUCTIONS", WCS_STRING, + _("
    " + "
  • If you already have an account on %s, " + "enter your user name and password and click "Login." " + "
  • If you are a new user, enter the name and password " + "you wish to use, " + "and click "New User." " + "
  • Please log off properly when finished. " + "
  • You must use a browser that supports frames and " + "cookies. " + "
  • Also keep in mind that if your browser is " + "configured to block pop-up windows, you will not be able " + "to receive any instant messages.
    " + "
"), + serv_info.serv_humannode + ); - wprintf("
\n"); - wprintf("\n"); + 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"), + serv_info.serv_humannode); - wDumpContent(); - } + do_template("login"); + + wDumpContent(2); +} /* - * This function needs to get called whenever a PASS or NEWU succeeds + * 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. */ -void become_logged_in(char *user, char *pass, char *serv_response) { +void become_logged_in(char *user, char *pass, char *serv_response) +{ + char buf[SIZ]; - logged_in = 1; - strcpy(wc_username, user); - strcpy(wc_password, pass); - + WC->logged_in = 1; + extract_token(WC->wc_username, &serv_response[4], 0, '|', 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) { + WC->is_aide = 1; + } + + load_preferences(); + + serv_puts("CHEK"); + serv_getln(buf, sizeof buf); + if (buf[0] == '2') { + WC->new_mail = extract_int(&buf[4], 0); + WC->need_regi = extract_int(&buf[4], 1); + WC->need_vali = extract_int(&buf[4], 2); + extract_token(WC->cs_inet_email, &buf[4], 3, '|', sizeof WC->cs_inet_email); } +} -void do_login() { - char buf[256]; +void do_login(void) +{ + char buf[SIZ]; - if (!strcasecmp(bstr("action"), "Login")) { + if (strlen(bstr("exit_action")) > 0) { + do_logout(); + return; + } + if (strlen(bstr("login_action")) > 0) { serv_printf("USER %s", bstr("name")); - serv_gets(buf); - if (buf[0]=='3') { + serv_getln(buf, sizeof buf); + if (buf[0] == '3') { serv_printf("PASS %s", bstr("pass")); - serv_gets(buf); - if (buf[0]=='2') { - become_logged_in(bstr("name"), bstr("pass"), buf); + serv_getln(buf, sizeof buf); + if (buf[0] == '2') { + become_logged_in(bstr("name"), + bstr("pass"), buf); + } else { + display_login(&buf[4]); + return; + } + } else { + display_login(&buf[4]); + return; + } + } + if (strlen(bstr("newuser_action")) > 0) { + if (strlen(bstr("pass")) == 0) { + display_login(_("Blank passwords are not allowed.")); + return; + } + serv_printf("NEWU %s", bstr("name")); + serv_getln(buf, sizeof buf); + if (buf[0] == '2') { + become_logged_in(bstr("name"), bstr("pass"), buf); + serv_printf("SETP %s", bstr("pass")); + serv_getln(buf, sizeof buf); + } else { + display_login(&buf[4]); + return; + } + } + if (WC->logged_in) { + if (WC->need_regi) { + display_reg(1); + } else { + do_welcome(); + } + } else { + display_login(_("Your password was not accepted.")); + } + +} + +void do_welcome(void) +{ + char buf[SIZ]; +#ifdef XXX_NOT_FINISHED_YET_XXX + FILE *fp; + int i; + + /* + * See if we have to run the first-time setup wizard + */ + if (WC->is_aide) { + if (!setup_wizard) { + sprintf(wizard_filename, "setupwiz.%s.%s", + ctdlhost, ctdlport); + for (i=0; ikillthis = 1; + /* close() of citadel socket will be done by do_housekeeping() */ +} + + +void do_logout(void) +{ + char buf[SIZ]; + + safestrncpy(WC->wc_username, "", sizeof WC->wc_username); + safestrncpy(WC->wc_password, "", sizeof WC->wc_password); + safestrncpy(WC->wc_roomname, "", sizeof WC->wc_roomname); + + /* 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"); + serv_getln(buf, sizeof buf); + + if (WC->serv_sock >= 0) { + if (buf[0] == '1') { + fmout("CENTER"); + } else { + wprintf("Goodbye\n"); } + } else { - printf("HTTP/1.0 200 OK\n"); - output_headers(); - wprintf("Nope\n"); - wprintf("Your password was not accepted.\n"); - wprintf("
Try again\n"); - wprintf("\n"); - wDumpContent(); + wprintf(_("This program was unable to connect or stay " + "connected to the Citadel server. Please report " + "this problem to your system administrator.") + ); + } + + wprintf("
Log in again   " + ""); + wprintf(_("Close window")); + wprintf("
\n"); + wDumpContent(2); + end_webcit_session(); +} + + +/* + * validate new users + */ +void validate(void) +{ + char cmd[SIZ]; + char user[SIZ]; + char buf[SIZ]; + int a; + + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n" + "
" + ""); + wprintf(_("Validate new users")); + wprintf("
\n
\n
\n"); + + safestrncpy(buf, bstr("user"), sizeof buf); + if (strlen(buf) > 0) + if (strlen(bstr("axlevel")) > 0) { + serv_printf("VALI %s|%s", buf, bstr("axlevel")); + serv_getln(buf, sizeof buf); + if (buf[0] != '2') { + wprintf("%s
\n", &buf[4]); + } } + serv_puts("GNUR"); + serv_getln(buf, sizeof buf); + + if (buf[0] != '3') { + wprintf("%s
\n", &buf[4]); + wDumpContent(1); + return; + } + + wprintf("
" + "
\n"); + wprintf("
"); + + safestrncpy(user, &buf[4], sizeof user); + serv_printf("GREG %s", user); + serv_getln(cmd, sizeof cmd); + if (cmd[0] == '1') { + a = 0; + do { + serv_getln(buf, sizeof buf); + ++a; + if (a == 1) + wprintf("User #%s

%s

", + buf, &cmd[4]); + if (a == 2) + wprintf("PW: %s
\n", buf); + if (a == 3) + wprintf("%s
\n", buf); + if (a == 4) + wprintf("%s
\n", buf); + if (a == 5) + wprintf("%s, ", buf); + if (a == 6) + wprintf("%s ", buf); + if (a == 7) + wprintf("%s
\n", buf); + if (a == 8) + wprintf("%s
\n", buf); + if (a == 9) + wprintf(_("Current access level: %d (%s)\n"), + atoi(buf), axdefs[atoi(buf)]); + } while (strcmp(buf, "000")); + } else { + wprintf("

%s

%s
\n", user, &cmd[4]); + } + + wprintf("
"); + wprintf(_("Select access level for this user:")); + wprintf("
\n"); + for (a = 0; a <= 6; ++a) { + wprintf("%s   \n", + a, axdefs[a]); + } + wprintf("
\n"); + + wprintf("
\n"); + wprintf("
\n"); + wDumpContent(1); +} + + + +/* + * 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.) + */ +void display_reg(int during_login) +{ + long vcard_msgnum; + + if (goto_config_room() != 0) { + if (during_login) do_welcome(); + else display_main_menu(); + return; + } + + vcard_msgnum = locate_user_vcard(WC->wc_username, -1); + if (vcard_msgnum < 0L) { + if (during_login) do_welcome(); + else display_main_menu(); + return; + } + + if (during_login) { + do_edit_vcard(vcard_msgnum, "1", "/do_welcome"); + } + else { + do_edit_vcard(vcard_msgnum, "1", "/display_main_menu"); + } + +} + + + +/* + * display form for changing your password + */ +void display_changepw(void) +{ + char buf[SIZ]; + + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n" + "
" + ""); + wprintf(_("Change your password")); + wprintf("" + "
\n" + "
\n
\n" + ); + + if (strlen(WC->ImportantMessage) > 0) { + do_template("beginbox_nt"); + wprintf("" + "%s
\n", WC->ImportantMessage); + do_template("endbox"); + safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage); + } + + wprintf("
" + "
\n"); + + wprintf("

"); + serv_puts("MESG changepw"); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') { + fmout("CENTER"); + } + + wprintf("
\n"); + wprintf("
" + "" + "\n"); + wprintf("\n"); + wprintf("\n"); + wprintf("\n"); + + wprintf("
"); + wprintf(_("Enter new password:")); + wprintf("
"); + wprintf(_("Enter it again to confirm:")); + wprintf("

\n"); + wprintf("", _("Change password")); + wprintf(" "); + wprintf("\n", _("Cancel")); + wprintf("
\n"); + wprintf("
\n"); + wDumpContent(1); +} + +/* + * change password + */ +void changepw(void) +{ + char buf[SIZ]; + char newpass1[32], newpass2[32]; + + if (strlen(bstr("change_action")) == 0) { + safestrncpy(WC->ImportantMessage, + _("Cancelled. Password was not changed."), + sizeof WC->ImportantMessage); + display_main_menu(); + return; + } + + safestrncpy(newpass1, bstr("newpass1"), sizeof newpass1); + safestrncpy(newpass2, bstr("newpass2"), sizeof newpass2); + + if (strcasecmp(newpass1, newpass2)) { + safestrncpy(WC->ImportantMessage, + _("They don't match. Password was not changed."), + sizeof WC->ImportantMessage); + display_changepw(); + return; + } + + if (strlen(newpass1) == 0) { + safestrncpy(WC->ImportantMessage, + _("Blank passwords are not allowed."), + sizeof WC->ImportantMessage); + display_changepw(); + return; + } + + serv_printf("SETP %s", newpass1); + serv_getln(buf, sizeof buf); + sprintf(WC->ImportantMessage, "%s", &buf[4]); + if (buf[0] == '2') { + safestrncpy(WC->wc_password, buf, sizeof WC->wc_password); + display_main_menu(); + } + else { + display_changepw(); } +}