* Replaced serv_gets() with serv_getln() - which now requires the caller
[citadel.git] / webcit / mainmenu.c
1 /*
2  * $Id$
3  *
4  * Displays the "advanced" (main) menu.
5  *
6  */
7
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <stdio.h>
12 #include <fcntl.h>
13 #include <signal.h>
14 #include <sys/types.h>
15 #include <sys/wait.h>
16 #include <sys/socket.h>
17 #include <sys/time.h>
18 #include <limits.h>
19 #include <netinet/in.h>
20 #include <netdb.h>
21 #include <string.h>
22 #include <pwd.h>
23 #include <errno.h>
24 #include <stdarg.h>
25 #include <pthread.h>
26 #include <signal.h>
27 #include "webcit.h"
28
29
30
31 /*
32  * The Main Menu
33  */
34 void display_main_menu(void)
35 {
36         output_headers(1, 1, 1, 0, 0, 0, 0);
37
38         wprintf("<div id=\"fix_scrollbar_bug\">"
39                 "<TABLE WIDTH=100%%>"
40                 "<TR><TD COLSPAN=2>\n");
41
42         svprintf("BOXTITLE", WCS_STRING, "Basic commands");
43         do_template("beginbox");
44
45         wprintf("\n"
46                 "<TABLE border=0 cellspacing=1 cellpadding=1 width=100%%>"
47                 "<TR>"
48                 "<TD>");        /* start of first column */
49
50         wprintf("<A HREF=\"/knrooms\">"
51                 "<span class=\"mainmenu\">"
52                 "List known rooms</span></A><br />"
53                 "<span class=\"menudesc\">"
54                 "Where can I go from here?</span><br />\n"
55         );
56
57         wprintf("<A HREF=\"/gotonext\">"
58                 "<span class=\"mainmenu\">"
59                 "Goto next room</span></A><br />"
60                 "<span class=\"menudesc\">"
61                 "...with <EM>unread</EM> messages"
62                 "</span><br />\n"
63         );
64
65         wprintf("<A HREF=\"/skip\">"
66                 "<span class=\"mainmenu\">"
67                 "Skip to next room</span></a><br />"
68                 "<span class=\"menudesc\">"
69                 "(come back here later)"
70                 "</span>\n"
71         );
72
73         if ((strlen(WC->ugname) > 0) && (strcasecmp(WC->ugname, WC->wc_roomname))) {
74                 wprintf("<br />"
75                         "<A HREF=\"/ungoto\">"
76                         "<span class=\"mainmenu\">"
77                         "Ungoto</span></A><br />"
78                         "<span class=\"menudesc\">"
79                         "(oops! Back to %s)"
80                         "</span>\n", WC->ugname
81                 );
82         }
83
84         wprintf("</TD><TD>\n"); /* start of second column */
85
86         wprintf("<A HREF=\"/readnew\">"
87                 "<span class=\"mainmenu\">"
88                 "Read new messages</span></A><br />"
89                 "<span class=\"menudesc\">"
90                 "...in this room</span><br />\n"
91         );
92
93         wprintf("<A HREF=\"/readfwd\">"
94                 "<span class=\"mainmenu\">"
95                 "Read all messages</span></A><br />"
96                 "<span class=\"menudesc\">"
97                 "...old <EM>and</EM> new</span><br />\n"
98         );
99
100         wprintf("<A HREF=\"/display_enter\">"
101                 "<span class=\"mainmenu\">"
102                 "Enter a message</span></A><br />"
103                 "<span class=\"menudesc\">"
104                 "(post in this room)</span>\n"
105         );
106
107         wprintf("</TD><TD>");   /* start of third column */
108
109         wprintf("<A HREF=\"/summary\">"
110                 "<span class=\"mainmenu\">"
111                 "Summary page</span></A><br />"
112                 "<span class=\"menudesc\">"
113                 "Summary of my account</span><br />\n"
114         );
115
116         wprintf("<A HREF=\"/userlist\">\n"
117                 "<span class=\"mainmenu\">"
118                 "User list</span></A><br />"
119                 "<span class=\"menudesc\">"
120                 "(all registered users)</span><br />\n"
121         );
122
123         wprintf("<A HREF=\"/termquit\" TARGET=\"_top\">"
124                 "<span class=\"mainmenu\">"
125                 "Log off</span></A><br />"
126                 "<span class=\"menudesc\">"
127                 "Bye!</span>\n"
128         );
129
130         wprintf("</TD></TR></TABLE>\n");
131         do_template("endbox");
132
133         wprintf("</TD></TR>"
134                 "<TR VALIGN=TOP><TD>");
135
136         svprintf("BOXTITLE", WCS_STRING, "Your info");
137         do_template("beginbox");
138
139         wprintf("<A HREF=\"/display_reg\">"
140                 "<span class=\"mainmenu\">"
141                 "Update your contact information "
142                 "</span><br />\n");
143
144         wprintf("<A HREF=\"/display_changepw\">"
145                 "<span class=\"mainmenu\">"
146                 "Change your password</span></A><br />\n");
147
148         wprintf("<A HREF=\"/display_editbio\">"
149                 "<span class=\"mainmenu\">"
150                 "Enter your 'bio'</span></a><br />\n");
151
152         wprintf("<A HREF=\"/display_editpic\">"
153                 "<span class=\"mainmenu\">"
154                 "Edit your online photo</span></a>\n");
155
156         do_template("endbox");
157
158         wprintf("</TD><TD>");
159
160         svprintf("BOXTITLE", WCS_STRING, "Advanced room commands");
161         do_template("beginbox");
162
163         if ((WC->axlevel >= 6) || (WC->is_room_aide)) {
164                 wprintf("<A HREF=\"/display_editroom\">"
165                         "<span class=\"mainmenu\">"
166                         "Edit or delete this room</span></A><br />\n");
167         }
168
169         wprintf("<A HREF=\"/display_private\">"
170                 "<span class=\"mainmenu\">"
171                 "Go to a &quot;hidden&quot; room</span></A><br />\n");
172
173         wprintf("<A HREF=\"/display_entroom\">"
174                 "<span class=\"mainmenu\">"
175                 "Create a new room</span></A><br />\n");
176
177         wprintf("<A HREF=\"/display_zap\">"
178                 "<span class=\"mainmenu\">"
179                 "Zap (forget) this room (%s)</span></A><br />\n",
180                 WC->wc_roomname);
181
182         wprintf("<A HREF=\"/zapped_list\">"
183                 "<span class=\"mainmenu\">"
184                 "List all forgotten rooms</span></A>\n");
185
186         do_template("endbox");
187
188         wprintf("</td></tr></table></div>");
189         wDumpContent(2);
190 }
191
192
193 /*
194  * System administration menu
195  */
196 void display_aide_menu(void)
197 {
198         output_headers(1, 1, 2, 0, 0, 0, 0);
199         wprintf("<div id=\"banner\">\n"
200                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
201                 "<SPAN CLASS=\"titlebar\">System Administration Menu</SPAN>"
202                 "</TD></TR></TABLE>\n"
203                 "</div>\n<div id=\"content\">\n"
204         );
205
206         wprintf("<div id=\"fix_scrollbar_bug\">"
207                 "<table border=0 width=100%%><tr valign=top><td>");
208
209         svprintf("BOXTITLE", WCS_STRING, "Global Configuration");
210         do_template("beginbox");
211
212         wprintf("<A HREF=\"/display_siteconfig\">"
213                 "<span class=\"mainmenu\">"
214                 "Edit site-wide configuration</span></A><br />\n");
215
216         wprintf("<A HREF=\"/display_inetconf\">"
217                 "<span class=\"mainmenu\">"
218                 "Domain names and Internet mail configuration</span></a><br />\n");
219
220         wprintf("<A HREF=\"/display_netconf\">"
221                 "<span class=\"mainmenu\">"
222                 "Configure replication with other Citadel servers"
223                 "</span></A>\n");
224
225         do_template("endbox");
226
227         wprintf("</td><td>");
228
229         svprintf("BOXTITLE", WCS_STRING, "User account management");
230         do_template("beginbox");
231
232         wprintf("<A HREF=\"/select_user_to_edit\">"
233                 "<span class=\"mainmenu\">"
234                 "Add, change, delete user accounts"
235                 "</span></A><br />\n");
236
237         wprintf("<A HREF=\"/validate\">"
238                 "<span class=\"mainmenu\">"
239                 "Validate new users</span></A><br />\n");
240
241         do_template("endbox");
242
243         svprintf("BOXTITLE", WCS_STRING, "Rooms and Floors");
244         do_template("beginbox");
245
246         wprintf("<A HREF=\"/display_floorconfig\">"
247                 "<span class=\"mainmenu\">"
248                 "Add, change, or delete floors"
249                 "</span></A>\n");
250
251         do_template("endbox");
252
253         wprintf("</td></tr></table></div>");
254         wDumpContent(2);
255 }
256
257
258
259
260
261 /*
262  * Display the screen to enter a generic server command
263  */
264 void display_generic(void)
265 {
266         output_headers(1, 1, 2, 0, 0, 0, 0);
267         wprintf("<div id=\"banner\">\n"
268                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
269                 "<SPAN CLASS=\"titlebar\">Enter a server command</SPAN>"
270                 "</TD></TR></TABLE>\n"
271                 "</div>\n<div id=\"content\">\n"
272         );
273
274         wprintf("<div id=\"fix_scrollbar_bug\">"
275                 "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
276
277         wprintf("<CENTER>");
278         wprintf("This screen allows you to enter Citadel server commands which are\n");
279         wprintf("not supported by WebCit.  If you do not know what that means,\n");
280         wprintf("then this screen will not be of much use to you.<br />\n");
281
282         wprintf("<FORM METHOD=\"POST\" ACTION=\"/do_generic\">\n");
283
284         wprintf("Enter command:<br />\n");
285         wprintf("<INPUT TYPE=\"text\" NAME=\"g_cmd\" SIZE=80 MAXLENGTH=\"250\"><br />\n");
286
287         wprintf("Command input (if requesting SEND_LISTING transfer mode):<br />\n");
288         wprintf("<TEXTAREA NAME=\"g_input\" ROWS=10 COLS=80 WIDTH=80></TEXTAREA><br />\n");
289
290         wprintf("<FONT SIZE=-2>Detected host header is http://%s</FONT>\n",
291                 WC->http_host);
292         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Send command\">");
293         wprintf("&nbsp;");
294         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\"><br />\n");
295
296         wprintf("</FORM></CENTER>\n");
297         wprintf("</td></tr></table></div>\n");
298         wDumpContent(1);
299 }
300
301 void do_generic(void)
302 {
303         char buf[SIZ];
304         char gcontent[SIZ];
305         char *junk;
306         size_t len;
307
308         if (strcasecmp(bstr("sc"), "Send command")) {
309                 display_main_menu();
310                 return;
311         }
312
313         output_headers(1, 1, 0, 0, 0, 0, 0);
314
315         serv_printf("%s", bstr("g_cmd"));
316         serv_getln(buf, sizeof buf);
317
318         svprintf("BOXTITLE", WCS_STRING, "Server command results");
319         do_template("beginbox");
320
321         wprintf("<TABLE border=0><TR><TD>Command:</TD><TD><TT>");
322         escputs(bstr("g_cmd"));
323         wprintf("</TT></TD></TR><TR><TD>Result:</TD><TD><TT>");
324         escputs(buf);
325         wprintf("</TT></TD></TR></TABLE><br />\n");
326
327         if (buf[0] == '8') {
328                 serv_printf("\n\n000");
329         }
330         if ((buf[0] == '1') || (buf[0] == '8')) {
331                 while (serv_getln(gcontent, sizeof gcontent), strcmp(gcontent, "000")) {
332                         escputs(gcontent);
333                         wprintf("<br />\n");
334                 }
335                 wprintf("000");
336         }
337         if (buf[0] == '4') {
338                 text_to_server(bstr("g_input"), 0);
339                 serv_puts("000");
340         }
341         if (buf[0] == '6') {
342                 len = atol(&buf[4]);
343                 junk = malloc(len);
344                 serv_read(junk, len);
345                 free(junk);
346         }
347         if (buf[0] == '7') {
348                 len = atol(&buf[4]);
349                 junk = malloc(len);
350                 memset(junk, 0, len);
351                 serv_write(junk, len);
352                 free(junk);
353         }
354         wprintf("<hr />");
355         wprintf("<A HREF=\"/display_generic\">Enter another command</A><br />\n");
356         wprintf("<A HREF=\"/display_advanced\">Return to menu</A>\n");
357         do_template("endbox");
358         wDumpContent(1);
359 }
360
361
362
363
364 /*
365  * Display the menubar.  Set as_single_page to
366  * display HTML headers and footers -- otherwise it's assumed
367  * that the menubar is being embedded in another page.
368  */
369 void display_menubar(int as_single_page) {
370
371         if (as_single_page) {
372                 output_headers(0, 0, 0, 0, 0, 0, 0);
373                 wprintf("<HTML>\n"
374                         "<HEAD>\n"
375                         "<TITLE>MenuBar</TITLE>\n"
376                         "<STYLE TYPE=\"text/css\">\n"
377                         "BODY   { text-decoration: none; }\n"
378                         "</STYLE>\n"
379                         "</HEAD>\n");
380                 do_template("background");
381         }
382
383         do_template("menubar");
384
385         if (as_single_page) {
386                 wDumpContent(2);
387         }
388
389
390 }
391
392