5eea557eb2fa7be5ca359ce1709d081938f5b192
[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_preferences\">"
140                 "<span class=\"mainmenu\">"
141                 "Change your preferences and settings"
142                 "</span><br />\n");
143
144         wprintf("<A HREF=\"/display_reg\">"
145                 "<span class=\"mainmenu\">"
146                 "Update your contact information"
147                 "</span><br />\n");
148
149         wprintf("<A HREF=\"/display_changepw\">"
150                 "<span class=\"mainmenu\">"
151                 "Change your password</span></A><br />\n");
152
153         wprintf("<A HREF=\"/display_editbio\">"
154                 "<span class=\"mainmenu\">"
155                 "Enter your 'bio'</span></a><br />\n");
156
157         wprintf("<A HREF=\"/display_editpic\">"
158                 "<span class=\"mainmenu\">"
159                 "Edit your online photo</span></a>\n");
160
161         do_template("endbox");
162
163         wprintf("</TD><TD>");
164
165         svprintf("BOXTITLE", WCS_STRING, "Advanced room commands");
166         do_template("beginbox");
167
168         if ((WC->axlevel >= 6) || (WC->is_room_aide)) {
169                 wprintf("<A HREF=\"/display_editroom\">"
170                         "<span class=\"mainmenu\">"
171                         "Edit or delete this room</span></A><br />\n");
172         }
173
174         wprintf("<A HREF=\"/display_private\">"
175                 "<span class=\"mainmenu\">"
176                 "Go to a &quot;hidden&quot; room</span></A><br />\n");
177
178         wprintf("<A HREF=\"/display_entroom\">"
179                 "<span class=\"mainmenu\">"
180                 "Create a new room</span></A><br />\n");
181
182         wprintf("<A HREF=\"/display_zap\">"
183                 "<span class=\"mainmenu\">"
184                 "Zap (forget) this room (%s)</span></A><br />\n",
185                 WC->wc_roomname);
186
187         wprintf("<A HREF=\"/zapped_list\">"
188                 "<span class=\"mainmenu\">"
189                 "List all forgotten rooms</span></A>\n");
190
191         do_template("endbox");
192
193         wprintf("</td></tr></table></div>");
194         wDumpContent(2);
195 }
196
197
198 /*
199  * System administration menu
200  */
201 void display_aide_menu(void)
202 {
203         output_headers(1, 1, 2, 0, 0, 0, 0);
204         wprintf("<div id=\"banner\">\n"
205                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
206                 "<SPAN CLASS=\"titlebar\">System Administration Menu</SPAN>"
207                 "</TD></TR></TABLE>\n"
208                 "</div>\n<div id=\"content\">\n"
209         );
210
211         wprintf("<div id=\"fix_scrollbar_bug\">"
212                 "<table border=0 width=100%%><tr valign=top><td>");
213
214         svprintf("BOXTITLE", WCS_STRING, "Global Configuration");
215         do_template("beginbox");
216
217         wprintf("<A HREF=\"/display_siteconfig\">"
218                 "<span class=\"mainmenu\">"
219                 "Edit site-wide configuration</span></A><br />\n");
220
221         wprintf("<A HREF=\"/display_inetconf\">"
222                 "<span class=\"mainmenu\">"
223                 "Domain names and Internet mail configuration</span></a><br />\n");
224
225         wprintf("<A HREF=\"/display_netconf\">"
226                 "<span class=\"mainmenu\">"
227                 "Configure replication with other Citadel servers"
228                 "</span></A>\n");
229
230         do_template("endbox");
231
232         wprintf("</td><td>");
233
234         svprintf("BOXTITLE", WCS_STRING, "User account management");
235         do_template("beginbox");
236
237         wprintf("<A HREF=\"/select_user_to_edit\">"
238                 "<span class=\"mainmenu\">"
239                 "Add, change, delete user accounts"
240                 "</span></A><br />\n");
241
242         wprintf("<A HREF=\"/validate\">"
243                 "<span class=\"mainmenu\">"
244                 "Validate new users</span></A><br />\n");
245
246         do_template("endbox");
247
248         svprintf("BOXTITLE", WCS_STRING, "Rooms and Floors");
249         do_template("beginbox");
250
251         wprintf("<A HREF=\"/display_floorconfig\">"
252                 "<span class=\"mainmenu\">"
253                 "Add, change, or delete floors"
254                 "</span></A>\n");
255
256         do_template("endbox");
257
258         wprintf("</td></tr></table></div>");
259         wDumpContent(2);
260 }
261
262
263
264
265
266 /*
267  * Display the screen to enter a generic server command
268  */
269 void display_generic(void)
270 {
271         output_headers(1, 1, 2, 0, 0, 0, 0);
272         wprintf("<div id=\"banner\">\n"
273                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
274                 "<SPAN CLASS=\"titlebar\">Enter a server command</SPAN>"
275                 "</TD></TR></TABLE>\n"
276                 "</div>\n<div id=\"content\">\n"
277         );
278
279         wprintf("<div id=\"fix_scrollbar_bug\">"
280                 "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
281
282         wprintf("<CENTER>");
283         wprintf("This screen allows you to enter Citadel server commands which are\n");
284         wprintf("not supported by WebCit.  If you do not know what that means,\n");
285         wprintf("then this screen will not be of much use to you.<br />\n");
286
287         wprintf("<FORM METHOD=\"POST\" ACTION=\"/do_generic\">\n");
288
289         wprintf("Enter command:<br />\n");
290         wprintf("<INPUT TYPE=\"text\" NAME=\"g_cmd\" SIZE=80 MAXLENGTH=\"250\"><br />\n");
291
292         wprintf("Command input (if requesting SEND_LISTING transfer mode):<br />\n");
293         wprintf("<TEXTAREA NAME=\"g_input\" ROWS=10 COLS=80 WIDTH=80></TEXTAREA><br />\n");
294
295         wprintf("<FONT SIZE=-2>Detected host header is http://%s</FONT>\n",
296                 WC->http_host);
297         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Send command\">");
298         wprintf("&nbsp;");
299         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\"><br />\n");
300
301         wprintf("</FORM></CENTER>\n");
302         wprintf("</td></tr></table></div>\n");
303         wDumpContent(1);
304 }
305
306 void do_generic(void)
307 {
308         char buf[SIZ];
309         char gcontent[SIZ];
310         char *junk;
311         size_t len;
312
313         if (strcasecmp(bstr("sc"), "Send command")) {
314                 display_main_menu();
315                 return;
316         }
317
318         output_headers(1, 1, 0, 0, 0, 0, 0);
319
320         serv_printf("%s", bstr("g_cmd"));
321         serv_getln(buf, sizeof buf);
322
323         svprintf("BOXTITLE", WCS_STRING, "Server command results");
324         do_template("beginbox");
325
326         wprintf("<TABLE border=0><TR><TD>Command:</TD><TD><TT>");
327         escputs(bstr("g_cmd"));
328         wprintf("</TT></TD></TR><TR><TD>Result:</TD><TD><TT>");
329         escputs(buf);
330         wprintf("</TT></TD></TR></TABLE><br />\n");
331
332         if (buf[0] == '8') {
333                 serv_printf("\n\n000");
334         }
335         if ((buf[0] == '1') || (buf[0] == '8')) {
336                 while (serv_getln(gcontent, sizeof gcontent), strcmp(gcontent, "000")) {
337                         escputs(gcontent);
338                         wprintf("<br />\n");
339                 }
340                 wprintf("000");
341         }
342         if (buf[0] == '4') {
343                 text_to_server(bstr("g_input"), 0);
344                 serv_puts("000");
345         }
346         if (buf[0] == '6') {
347                 len = atol(&buf[4]);
348                 junk = malloc(len);
349                 serv_read(junk, len);
350                 free(junk);
351         }
352         if (buf[0] == '7') {
353                 len = atol(&buf[4]);
354                 junk = malloc(len);
355                 memset(junk, 0, len);
356                 serv_write(junk, len);
357                 free(junk);
358         }
359         wprintf("<hr />");
360         wprintf("<A HREF=\"/display_generic\">Enter another command</A><br />\n");
361         wprintf("<A HREF=\"/display_advanced\">Return to menu</A>\n");
362         do_template("endbox");
363         wDumpContent(1);
364 }
365
366
367
368
369 /*
370  * Display the menubar.  Set as_single_page to
371  * display HTML headers and footers -- otherwise it's assumed
372  * that the menubar is being embedded in another page.
373  */
374 void display_menubar(int as_single_page) {
375
376         if (as_single_page) {
377                 output_headers(0, 0, 0, 0, 0, 0, 0);
378                 wprintf("<HTML>\n"
379                         "<HEAD>\n"
380                         "<TITLE>MenuBar</TITLE>\n"
381                         "<STYLE TYPE=\"text/css\">\n"
382                         "BODY   { text-decoration: none; }\n"
383                         "</STYLE>\n"
384                         "</HEAD>\n");
385                 do_template("background");
386         }
387
388         do_template("menubar");
389
390         if (as_single_page) {
391                 wDumpContent(2);
392         }
393
394
395 }
396
397