* The previous <div style=\"margin-right:1px\"> has been replaced by a
[citadel.git] / webcit / auth.c
index 3871d938ce0633bbff556c00cf76f9d9b86e719d..42c3c0a263d2889365e26308be1c9fa0b24575ce 100644 (file)
@@ -1,9 +1,8 @@
 /*
- * auth.c
+ * $Id$
  *
- * This file contains code which relates to authentication of users to Citadel.
+ * Handles authentication of users to a Citadel server.
  *
- * $Id$
  */
 
 
@@ -46,22 +45,22 @@ void display_login(char *mesg)
 {
        char buf[SIZ];
 
-       output_headers(3);
+       output_headers(1, 1, 2, 0, 0, 0, 0);
+       //wprintf("<div id=\"content\">\n");
+       wprintf("<div>\n");
 
        if (mesg != NULL) if (strlen(mesg) > 0) {
-               stresc(buf, mesg, 0);
+               stresc(buf, mesg, 0, 0);
                svprintf("mesg", WCS_STRING, "%s", buf);
        }
 
-       stresc(buf, serv_info.serv_humannode, 1);
-       svprintf("humannode", WCS_STRING, "%s", buf);
-
        svprintf("hello", WCS_SERVCMD, "MESG hello");
+       svprintf("BOXTITLE", WCS_STRING, "%s - powered by Citadel",
+               serv_info.serv_humannode);
 
-       do_template("login.html");
+       do_template("login");
 
-       clear_local_substs();
-       wDumpContent(0);        /* No menu here; not logged in yet! */
+       wDumpContent(2);
 }
 
 
@@ -76,6 +75,8 @@ void display_login(char *mesg)
  */
 void become_logged_in(char *user, char *pass, char *serv_response)
 {
+       char buf[SIZ];
+
        WC->logged_in = 1;
        extract(WC->wc_username, &serv_response[4], 0);
        strcpy(WC->wc_password, pass);
@@ -83,15 +84,23 @@ void become_logged_in(char *user, char *pass, char *serv_response)
        if (WC->axlevel >= 6) {
                WC->is_aide = 1;
        }
+
        load_preferences();
+
+       serv_puts("CHEK");
+       serv_gets(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(WC->cs_inet_email, &buf[4], 3);
+       }
 }
 
 
 void do_login(void)
 {
        char buf[SIZ];
-       int need_regi = 0;
-
 
        if (!strcasecmp(bstr("action"), "Exit")) {
                do_logout();
@@ -116,6 +125,10 @@ void do_login(void)
                }
        }
        if (!strcasecmp(bstr("action"), "New User")) {
+               if (strlen(bstr("pass")) == 0) {
+                       display_login("Blank passwords are not allowed.");
+                       return;
+               }
                serv_printf("NEWU %s", bstr("name"));
                serv_gets(buf);
                if (buf[0] == '2') {
@@ -128,14 +141,7 @@ void do_login(void)
                }
        }
        if (WC->logged_in) {
-               serv_puts("CHEK");
-               serv_gets(buf);
-               if (buf[0] == '2') {
-                       WC->new_mail = extract_int(&buf[4], 0);
-                       need_regi = extract_int(&buf[4], 1);
-                       WC->need_vali = extract_int(&buf[4], 2);
-               }
-               if (need_regi) {
+               if (WC->need_regi) {
                        display_reg(1);
                } else {
                        do_welcome();
@@ -148,7 +154,15 @@ void do_login(void)
 
 void do_welcome(void)
 {
-       http_redirect("/static/mainframeset.html");
+       char startpage[SIZ];
+
+       get_preference("startpage", startpage);
+       if (strlen(startpage)==0) {
+               strcpy(startpage, "/dotskip&room=_BASEROOM_");
+               set_preference("startpage", startpage);
+       }
+
+       http_redirect(startpage);
 }
 
 
@@ -170,26 +184,35 @@ void do_logout(void)
        strcpy(WC->wc_password, "");
        strcpy(WC->wc_roomname, "");
 
-       output_headers(2);      /* note "2" causes cookies to be unset */
+       /* Calling output_headers() this way causes the cookies to be un-set */
+       output_headers(1, 1, 0, 1, 0, 0, 0);
 
-       wprintf("<CENTER>");
+       wprintf("<center>");
        serv_puts("MESG goodbye");
        serv_gets(buf);
 
-       if (buf[0] == '1')
-               fmout(NULL);
-       else
-               wprintf("Goodbye\n");
+       if (WC->serv_sock >= 0) {
+               if (buf[0] == '1') {
+                       fmout(NULL, "CENTER");
+               } else {
+                       wprintf("Goodbye\n");
+               }
+       }
+       else {
+               wprintf("This program was unable to connect or stay "
+                       "connected to the Citadel server.  Please report "
+                       "this problem to your system administrator."
+               );
+       }
 
-       wprintf("<HR><A HREF=\"/\">Log in again</A>&nbsp;&nbsp;&nbsp;"
-               "<A HREF=\"javascript:window.close();\">Close window</A>"
-               "</CENTER>\n");
+       wprintf("<hr /><a href=\"/\">Log in again</A>&nbsp;&nbsp;&nbsp;"
+               "<a href=\"javascript:window.close();\">Close window</A>"
+               "</center>\n");
        wDumpContent(2);
        end_webcit_session();
 }
 
 
-
 /* 
  * validate new users
  */
@@ -200,25 +223,36 @@ void validate(void)
        char buf[SIZ];
        int a;
 
-       output_headers(3);
-
+       output_headers(1, 1, 2, 0, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">Validate new users</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+                                                                                                                            
        strcpy(buf, bstr("user"));
        if (strlen(buf) > 0)
-               if (strlen(bstr("WC->axlevel")) > 0) {
-                       serv_printf("VALI %s|%s", buf, bstr("WC->axlevel"));
+               if (strlen(bstr("axlevel")) > 0) {
+                       serv_printf("VALI %s|%s", buf, bstr("axlevel"));
                        serv_gets(buf);
                        if (buf[0] != '2') {
-                               wprintf("<EM>%s</EM><BR>\n", &buf[4]);
+                               wprintf("<b>%s</b><br />\n", &buf[4]);
                        }
                }
        serv_puts("GNUR");
        serv_gets(buf);
 
        if (buf[0] != '3') {
-               wprintf("<EM>%s</EM><BR>\n", &buf[4]);
+               wprintf("<b>%s</b><br />\n", &buf[4]);
                wDumpContent(1);
                return;
        }
+
+       wprintf("<div id=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+       wprintf("<center>");
+
        strcpy(user, &buf[4]);
        serv_printf("GREG %s", user);
        serv_gets(cmd);
@@ -228,47 +262,46 @@ void validate(void)
                        serv_gets(buf);
                        ++a;
                        if (a == 1)
-                               wprintf("User #%s<BR><H1>%s</H1>",
+                               wprintf("User #%s<br /><H1>%s</H1>",
                                        buf, &cmd[4]);
                        if (a == 2)
-                               wprintf("PW: %s<BR>\n", buf);
+                               wprintf("PW: %s<br />\n", buf);
                        if (a == 3)
-                               wprintf("%s<BR>\n", buf);
+                               wprintf("%s<br />\n", buf);
                        if (a == 4)
-                               wprintf("%s<BR>\n", buf);
+                               wprintf("%s<br />\n", buf);
                        if (a == 5)
                                wprintf("%s, ", buf);
                        if (a == 6)
                                wprintf("%s ", buf);
                        if (a == 7)
-                               wprintf("%s<BR>\n", buf);
+                               wprintf("%s<br />\n", buf);
                        if (a == 8)
-                               wprintf("%s<BR>\n", buf);
+                               wprintf("%s<br />\n", buf);
                        if (a == 9)
                                wprintf("Current access level: %d (%s)\n",
                                        atoi(buf), axdefs[atoi(buf)]);
                } while (strcmp(buf, "000"));
        } else {
-               wprintf("<H1>%s</H1>%s<BR>\n", user, &cmd[4]);
+               wprintf("<H1>%s</H1>%s<br />\n", user, &cmd[4]);
        }
 
-       wprintf("<CENTER><TABLE border><CAPTION>Select access level:");
-       wprintf("</CAPTION><TR>");
+       wprintf("<hr />Select access level for this user:<br />\n");
        for (a = 0; a <= 6; ++a) {
-               wprintf("<TD><A HREF=\"/validate&user=");
+               wprintf("<A HREF=\"/validate&user=");
                urlescputs(user);
-               wprintf("&WC->axlevel=%d\">%s</A></TD>\n",
+               wprintf("&axlevel=%d\">%s</A>&nbsp;&nbsp;&nbsp;\n",
                        a, axdefs[a]);
        }
-       wprintf("</TR></TABLE><CENTER><BR>\n");
+       wprintf("<br />\n");
+
+       wprintf("</CENTER>\n");
+       wprintf("</td></tr></table></div>\n");
        wDumpContent(1);
 }
 
 
 
-
-
-
 /* 
  * Display form for registration.
  * (Set during_login to 1 if this registration is being performed during
@@ -276,105 +309,29 @@ void validate(void)
  */
 void display_reg(int during_login)
 {
-       char buf[SIZ];
-       int a;
-
-       output_headers(3);
-
-       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=007700><TR><TD>");
-       wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
-       wprintf("<B>Enter registration info</B>\n");
-       wprintf("</FONT></TD></TR></TABLE>\n");
+       long vcard_msgnum;
 
-       wprintf("<CENTER>");
-       serv_puts("MESG register");
-       serv_gets(buf);
-       if (buf[0] == '1')
-               fmout(NULL);
-
-       wprintf("<FORM ACTION=\"/register\" METHOD=\"POST\">\n");
-       wprintf("<INPUT TYPE=\"hidden\" NAME=\"during_login\" VALUE=\"%d\">\n", during_login);
-
-       serv_puts("GREG _SELF_");
-       serv_gets(buf);
-       if (buf[0] != '1') {
-               wprintf("<EM>%s</EM><BR>\n", &buf[4]);
-       } else {
-
-               wprintf("<H1>%s</H1><TABLE border>\n", &buf[4]);
-               a = 0;
-               while (serv_gets(buf), strcmp(buf, "000")) {
-                       ++a;
-                       wprintf("<TR><TD>");
-                       switch (a) {
-                       case 3:
-                               wprintf("Real Name:</TD><TD><INPUT TYPE=\"text\" NAME=\"realname\" VALUE=\"%s\" MAXLENGTH=\"29\"><BR>\n", buf);
-                               break;
-                       case 4:
-                               wprintf("Street Address:</TD><TD><INPUT TYPE=\"text\" NAME=\"address\" VALUE=\"%s\" MAXLENGTH=\"24\"><BR>\n", buf);
-                               break;
-                       case 5:
-                               wprintf("City/town:</TD><TD><INPUT TYPE=\"text\" NAME=\"city\" VALUE=\"%s\" MAXLENGTH=\"14\"><BR>\n", buf);
-                               break;
-                       case 6:
-                               wprintf("State/province:</TD><TD><INPUT TYPE=\"text\" NAME=\"state\" VALUE=\"%s\" MAXLENGTH=\"2\"><BR>\n", buf);
-                               break;
-                       case 7:
-                               wprintf("ZIP/postal code:</TD><TD><INPUT TYPE=\"text\" NAME=\"zip\" VALUE=\"%s\" MAXLENGTH=\"10\"><BR>\n", buf);
-                               break;
-                       case 8:
-                               wprintf("Telephone:</TD><TD><INPUT TYPE=\"text\" NAME=\"phone\" VALUE=\"%s\" MAXLENGTH=\"14\"><BR>\n", buf);
-                               break;
-                       case 10:
-                               wprintf("E-Mail:</TD><TD><INPUT TYPE=\"text\" NAME=\"email\" VALUE=\"%s\" MAXLENGTH=\"31\"><BR>\n", buf);
-                               break;
-                       case 11:
-                               wprintf("Country:</TD><TD><INPUT TYPE=\"text\" NAME=\"country\" VALUE=\"%s\" MAXLENGTH=\"31\"><BR>\n", buf);
-                               break;
-                       }
-                       wprintf("</TD></TR>\n");
-               }
-               wprintf("</TABLE><P>");
+       if (goto_config_room() != 0) {
+               if (during_login) do_welcome();
+               else display_main_menu();
+               return;
        }
-       wprintf("<INPUT type=\"submit\" NAME=\"action\" VALUE=\"Register\">\n");
-       wprintf("<INPUT type=\"submit\" NAME=\"action\" VALUE=\"Cancel\">\n");
-       wprintf("</CENTER>\n");
-       wDumpContent(1);
-}
 
-/*
- * register
- */
-void register_user(void)
-{
-       char buf[SIZ];
-
-       if (strcmp(bstr("action"), "Register")) {
-               display_error("Cancelled.  Registration was not saved.");
+       vcard_msgnum = locate_user_vcard(WC->wc_username, -1);
+       if (vcard_msgnum < 0L) {
+               if (during_login) do_welcome();
+               else display_main_menu();
                return;
        }
-       serv_puts("REGI");
-       serv_gets(buf);
-       if (buf[0] != '4') {
-               display_error(&buf[4]);
+
+       if (during_login) {
+               do_edit_vcard(vcard_msgnum, "1", "/do_welcome");
        }
-       serv_puts(bstr("realname"));
-       serv_puts(bstr("address"));
-       serv_puts(bstr("city"));
-       serv_puts(bstr("state"));
-       serv_puts(bstr("zip"));
-       serv_puts(bstr("phone"));
-       serv_puts(bstr("email"));
-       serv_puts(bstr("country"));
-       serv_puts("000");
-
-       if (atoi(bstr("during_login"))) {
-               do_welcome();
-       } else {
-               display_success("Registration information has been saved.");
+       else {
+               do_edit_vcard(vcard_msgnum, "1", "/display_main_menu");
        }
-}
 
+}
 
 
 
@@ -386,28 +343,47 @@ void display_changepw(void)
 {
        char buf[SIZ];
 
-       output_headers(3);
+       output_headers(1, 1, 2, 0, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">Change your password</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       if (strlen(WC->ImportantMessage) > 0) {
+               do_template("beginbox_nt");
+               wprintf("<SPAN CLASS=\"errormsg\">"
+                       "%s</SPAN><br />\n", WC->ImportantMessage);
+               do_template("endbox");
+               strcpy(WC->ImportantMessage, "");
+       }
 
-       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=770000><TR><TD>");
-       wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
-       wprintf("<B>Change your password</B>\n");
-       wprintf("</FONT></TD></TR></TABLE>\n");
+       wprintf("<div id=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
 
-       wprintf("<CENTER>");
+       wprintf("<CENTER><br />");
        serv_puts("MESG changepw");
        serv_gets(buf);
-       if (buf[0] == '1')
-               fmout(NULL);
+       if (buf[0] == '1') {
+               fmout(NULL, "CENTER");
+       }
 
-       wprintf("<FORM ACTION=\"changepw\" METHOD=\"POST\">\n");
-       wprintf("<CENTER><TABLE border><TR><TD>Enter new password:</TD>\n");
+       wprintf("<form name=\"changepwform\" action=\"changepw\" method=\"post\">\n");
+       wprintf("<CENTER>"
+               "<table border=\"0\" cellspacing=\"5\" cellpadding=\"5\" "
+               "BGCOLOR=\"#EEEEEE\">"
+               "<TR><TD>Enter new password:</TD>\n");
        wprintf("<TD><INPUT TYPE=\"password\" NAME=\"newpass1\" VALUE=\"\" MAXLENGTH=\"20\"></TD></TR>\n");
        wprintf("<TR><TD>Enter it again to confirm:</TD>\n");
        wprintf("<TD><INPUT TYPE=\"password\" NAME=\"newpass2\" VALUE=\"\" MAXLENGTH=\"20\"></TD></TR>\n");
-       wprintf("</TABLE>\n");
-       wprintf("<INPUT type=\"submit\" NAME=\"action\" VALUE=\"Change\">\n");
-       wprintf("<INPUT type=\"submit\" NAME=\"action\" VALUE=\"Cancel\">\n");
-       wprintf("</CENTER>\n");
+
+       wprintf("</TABLE><br />\n");
+       wprintf("<INPUT type=\"submit\" name=\"action\" value=\"Change\">"
+               "&nbsp;"
+               "<INPUT type=\"submit\" name=\"action\" value=\"Cancel\">\n");
+       wprintf("</form></center>\n");
+       wprintf("</td></tr></table></div>\n");
        wDumpContent(1);
 }
 
@@ -420,20 +396,36 @@ void changepw(void)
        char newpass1[32], newpass2[32];
 
        if (strcmp(bstr("action"), "Change")) {
-               display_error("Cancelled.  Password was not changed.");
+               strcpy(WC->ImportantMessage, 
+                       "Cancelled.  Password was not changed.");
+               display_main_menu();
                return;
        }
+
        strcpy(newpass1, bstr("newpass1"));
        strcpy(newpass2, bstr("newpass2"));
 
        if (strcasecmp(newpass1, newpass2)) {
-               display_error("They don't match.  Password was not changed.");
+               strcpy(WC->ImportantMessage, 
+                       "They don't match.  Password was not changed.");
+               display_changepw();
+               return;
+       }
+
+       if (strlen(newpass1) == 0) {
+               strcpy(WC->ImportantMessage, 
+                       "Blank passwords are not allowed.");
+               display_changepw();
                return;
        }
+
        serv_printf("SETP %s", newpass1);
        serv_gets(buf);
-       if (buf[0] == '2')
-               display_success(&buf[4]);
-       else
-               display_error(&buf[4]);
+       sprintf(WC->ImportantMessage, "%s", &buf[4]);
+       if (buf[0] == '2') {
+               display_main_menu();
+       }
+       else {
+               display_changepw();
+       }
 }