final touches on dkim test harness
[citadel.git] / webcit / mainmenu.c
index da400fc90014a12bc1a79dca7e6d68bc6d943a3b..2c326e001650e4756e7184f4b939966c8798cc6e 100644 (file)
@@ -1,14 +1,23 @@
 /*
- * $Id$
+ * The main menu and other things
+ *
+ * Copyright (c) 1996-2021 by the citadel.org team
+ *
+ * This program is open source software.  We call it open source, not
+ * free software, because Richard Stallman is a communist and an asshole.
+ *
+ * The program is licensed under the General Public License, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  */
 
 #include "webcit.h"
 
-/*
- * The Main Menu
- */
-void display_main_menu(void)
-{
+// The Main Menu
+void display_main_menu(void) {
        begin_burst();
        output_headers(1, 0, 0, 0, 1, 0);
        DoTemplate(HKEY("display_main_menu"), NULL, &NoCtx);
@@ -16,190 +25,120 @@ void display_main_menu(void)
 }
 
 
-/*
- * System administration menu
- */
-void display_aide_menu(void)
-{
+// System administration menu
+void display_aide_menu(void) {
        begin_burst();
        output_headers(1, 0, 0, 0, 1, 0);
-       DoTemplate(HKEY("display_aide_menu"), NULL, &NoCtx);
+       DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
        end_burst();
 }
 
 
-
-/*
- * Display the screen to enter a generic server command
- */
-void display_generic(void)
-{
-       output_headers(1, 1, 2, 0, 0, 0);
-       wc_printf("<div id=\"banner\">\n");
-       wc_printf("<h1>");
-       wc_printf(_("Enter a server command"));
-       wc_printf("</h1>");
-       wc_printf("</div>\n");
-
-       wc_printf("<div id=\"content\" class=\"service\">\n");
-
-       wc_printf("<div class=\"fix_scrollbar_bug\">"
-               "<table class=\"mainmenu_background\"><tr><td>\n");
-
-       wc_printf("<center>");
-       wc_printf(_("This screen allows you to enter Citadel server commands which are "
-               "not supported by WebCit.  If you do not know what that means, "
-               "then this screen will not be of much use to you."));
-       wc_printf("<br />\n");
-
-       wc_printf("<form method=\"post\" action=\"do_generic\">\n");
-       wc_printf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
-
-       wc_printf(_("Enter command:"));
-       wc_printf("<br /><input type=\"text\" name=\"g_cmd\" size=80 maxlength=\"250\"><br />\n");
-
-       wc_printf(_("Command input (if requesting SEND_LISTING transfer mode):"));
-       wc_printf("<br /><textarea name=\"g_input\" rows=10 cols=80 width=80></textarea><br />\n");
-
-       wc_printf("<font size=-2>");
-       wc_printf(_("Detected host header is %s://%s"), (is_https ? "https" : "http"), ChrPtr(WC->Hdr->HR.http_host));
-       wc_printf("</font>\n");
-       wc_printf("<input type=\"submit\" name=\"sc_button\" value=\"%s\">", _("Send command"));
-       wc_printf("&nbsp;");
-       wc_printf("<input type=\"submit\" name=\"cancel_button\" value=\"%s\"><br />\n", _("Cancel"));
-
-       wc_printf("</form></center>\n");
-       wc_printf("</td></tr></table></div>\n");
-       wDumpContent(1);
-}
-
-/*
- * Interactive window to perform generic Citadel server commands.
- */
-void do_generic(void)
-{
-
-       wcsession *WCC = WC;
+// Handle generic server commands, possibly entered from a screen, possibly set up as a way to avoid custom code
+void do_generic(void) {
+        WCTemplputParams SubTP;
        int Done = 0;
        StrBuf *Buf;
+       StrBuf *LineBuf;
        char *junk;
        size_t len;
 
-       if (!havebstr("sc_button")) {
+       if ( (!havebstr("sc_button")) && (!havebstr("ok_button")) && (!havebstr("cancel_button")) ) {
                display_main_menu();
                return;
        }
 
-       output_headers(1, 1, 0, 0, 0, 0);
-       Buf = NewStrBuf();
-       serv_puts(bstr("g_cmd"));
-       StrBuf_ServGetln(Buf);
-       svput("BOXTITLE", WCS_STRING, _("Server command results"));
-       do_template("beginboxx", NULL);
+       if (havebstr("cancel_button")) {
+               AppendImportantMessage(_("Cancelled.  Changes were not saved."), -1);
+       }
 
-       wc_printf("<table border=0><tr><td>Command:</td><td><tt>");
-       StrEscAppend(WCC->WBuf, sbstr("g_cmd"), NULL, 0, 0);
-       wc_printf("</tt></td></tr><tr><td>Result:</td><td><tt>");
-       StrEscAppend(WCC->WBuf, Buf, NULL, 0, 0);
-       StrBufAppendBufPlain(WCC->WBuf, HKEY("<br>\n"), 0);
-       wc_printf("</tt></td></tr></table><br />\n");
-       
-       switch (GetServerStatus(Buf, NULL)) {
-       case 8:
-               serv_puts("\n\n000");
-               if ( (StrLength(Buf)==3) && 
-                    !strcmp(ChrPtr(Buf), "000")) {
-                       StrBufAppendBufPlain(WCC->WBuf, HKEY("\000"), 0);
-                       break;
-               }
-       case 1:
-               while (!Done) {
-                       StrBuf_ServGetln(Buf);
+       if (havebstr("ok_button")) {
+               Buf = NewStrBuf();
+               serv_puts(bstr("g_cmd"));
+               StrBuf_ServGetln(Buf);
+               
+               switch (GetServerStatus(Buf, NULL)) {
+               case 8:
+                       serv_puts("\n\n000");
                        if ( (StrLength(Buf)==3) && 
-                            !strcmp(ChrPtr(Buf), "000")) {
-                               Done = 1;
+                       !strcmp(ChrPtr(Buf), "000")) {
+                               StrBufAppendBufPlain(Buf, HKEY("\000"), 0);
+                               break;
                        }
-                       StrEscAppend(WCC->WBuf, Buf, NULL, 0, 0);
-                       StrBufAppendBufPlain(WCC->WBuf, HKEY("<br>\n"), 0);
+               case 1:
+                       LineBuf = NewStrBuf();
+                       StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
+                       while (!Done) {
+                               if (StrBuf_ServGetln(LineBuf) < 0)
+                                       break;
+                               if ( (StrLength(LineBuf)==3) && 
+                               !strcmp(ChrPtr(LineBuf), "000")) {
+                                       Done = 1;
+                               }
+                               StrBufAppendBuf(Buf, LineBuf, 0);
+                               StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
+                       }
+                       FreeStrBuf(&LineBuf);
+                       break;
+               case 2:
+                       break;
+               case 4:
+                       text_to_server(bstr("g_input"));
+                       serv_puts("000");
+                       break;
+               case 6:
+                       len = atol(&ChrPtr(Buf)[4]);
+                       StrBuf_ServGetBLOBBuffered(Buf, len);
+                       break;
+               case 7:
+                       len = atol(&ChrPtr(Buf)[4]);
+                       junk = malloc(len);
+                       memset(junk, 0, len);
+                       serv_write(junk, len);
+                       free(junk);
+                       break;
                }
-               break;
-       case 4:
-               text_to_server(bstr("g_input"));
-               serv_puts("000");
-               break;
-       case 6:
-               len = atol(&ChrPtr(Buf)[4]);
-               StrBuf_ServGetBLOBBuffered(Buf, len);
-               break;
-       case 7:
-               len = atol(&ChrPtr(Buf)[4]);
-               junk = malloc(len);
-               memset(junk, 0, len);
-               serv_write(junk, len);
-               free(junk);
+               FreeStrBuf(&Buf);
        }
        
-       wc_printf("<hr />");
-       wc_printf("<a href=\"display_generic\">Enter another command</a><br />\n");
-       wc_printf("<a href=\"display_advanced\">Return to menu</a>\n");
-       do_template("endbox", NULL);
-       FreeStrBuf(&Buf);
-       wDumpContent(1);
-}
-
-
-/*
- * Display the menubar.  
- *
- * Set 'as_single_page' to display HTML headers and footers -- otherwise it's assumed
- * that the menubar is being embedded in another page.
- */
-void display_menubar(int as_single_page) {
-
-       if (as_single_page) {
-               output_headers(0, 0, 0, 0, 0, 0);
-               wc_printf("<html>\n"
-                       "<head>\n"
-                       "<title>MenuBar</title>\n"
-                       "<style type=\"text/css\">\n"
-                       "body   { text-decoration: none; }\n"
-                       "</style>\n"
-                       "</head>\n");
-               do_template("background", NULL);
+       // We may have been supplied with instructions regarding the location
+       // to which we must return after posting.  If found, go there.
+       if (havebstr("return_to")) {
+               syslog(LOG_DEBUG, "return_to = %s", bstr("return_to"));
+               http_redirect(bstr("return_to"));
        }
 
-       do_template("menubar", NULL);
-
-       if (as_single_page) {
-               wDumpContent(2);
+       // Otherwise, do the generic result screen.
+       else {
+               begin_burst();
+               output_headers(1, 0, 0, 0, 1, 0);
+       
+               StackContext(NULL, &SubTP, Buf, CTX_STRBUF, 0, NULL);
+               {
+                       DoTemplate(HKEY("aide_display_generic_result"), NULL, &SubTP);
+               }
+               UnStackContext(&SubTP);
+               wDumpContent(1);
        }
 
-
 }
 
 
-/*
- * Display the wait / input dialog while restarting the server.
- */
-void display_shutdown(void)
-{
-       char buf[SIZ];
+// Display the wait / input dialog while restarting the server.
+void display_shutdown(void) {
+       StrBuf *Line;
        char *when;
        
+       Line = NewStrBuf();
        when=bstr("when");
        if (strcmp(when, "now") == 0){
                serv_printf("DOWN 1");
-               serv_getln(buf, sizeof buf);
-               if (atol(buf) == 500)
-               { /* upsie. maybe the server is not running as daemon? */
-                       
-                       safestrncpy(WC->ImportantMessage,
-                                   &buf[4],
-                                   sizeof WC->ImportantMessage);
-               }
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 5);
+
                begin_burst();
                output_headers(1, 0, 0, 0, 1, 0);
-               DoTemplate(HKEY("display_serverrestart"), NULL, &NoCtx);
+               DoTemplate(HKEY("aide_display_serverrestart"), NULL, &NoCtx);
                end_burst();
                lingering_close(WC->Hdr->http_sock);
                sleeeeeeeeeep(10);
@@ -214,37 +153,34 @@ void display_shutdown(void)
                {
                        begin_burst();
                        output_headers(1, 0, 0, 0, 1, 0);
-                       DoTemplate(HKEY("display_serverrestartpage"), NULL, &NoCtx);
+                       DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
                        end_burst();
                }
                else
                {
                        serv_printf("SEXP broadcast|%s", message);
-                       serv_getln(buf, sizeof buf); /* TODO: should we care? */
+                       StrBuf_ServGetln(Line);
+                       GetServerStatusMsg(Line, NULL, 1, 0);
+
                        begin_burst();
                        output_headers(1, 0, 0, 0, 1, 0);
-                       DoTemplate(HKEY("display_serverrestartpagedo"), NULL, &NoCtx);
+                       DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
                        end_burst();                    
                }
        }
        else if (!strcmp(when, "idle")) {
                serv_printf("SCDN 3");
-               serv_getln(buf, sizeof buf);
+               StrBuf_ServGetln(Line);
+               GetServerStatusMsg(Line, NULL, 1, 2);
 
-               if (atol(buf) == 500)
-               { /* upsie. maybe the server is not running as daemon? */
-                       safestrncpy(WC->ImportantMessage,
-                                   &buf[4],
-                                   sizeof WC->ImportantMessage);
-               }
                begin_burst();
                output_headers(1, 0, 0, 0, 1, 0);
-               DoTemplate(HKEY("display_aide_menu"), NULL, &NoCtx);
+               DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
                end_burst();                    
        }
+       FreeStrBuf(&Line);
 }
 
-void _display_menubar(void) { display_menubar(0); }
 
 void 
 InitModule_MAINMENU
@@ -253,7 +189,5 @@ InitModule_MAINMENU
        WebcitAddUrlHandler(HKEY("display_aide_menu"), "", 0, display_aide_menu, 0);
        WebcitAddUrlHandler(HKEY("server_shutdown"), "", 0, display_shutdown, 0);
        WebcitAddUrlHandler(HKEY("display_main_menu"), "", 0, display_main_menu, 0);
-       WebcitAddUrlHandler(HKEY("display_generic"), "", 0, display_generic, 0);
        WebcitAddUrlHandler(HKEY("do_generic"), "", 0, do_generic, 0);
-       WebcitAddUrlHandler(HKEY("display_menubar"), "", 0, _display_menubar, 0);
 }