* *** HUGE CHANGES *** *** WARNING: NOT FULLY FUNCTIONAL ***
[citadel.git] / webcit / siteconfig.c
1 /*
2  * Administrative screen for site-wide configuration
3  *
4  */
5
6
7 #include <ctype.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <stdio.h>
11 #include <fcntl.h>
12 #include <signal.h>
13 #include <sys/types.h>
14 #include <sys/wait.h>
15 #include <sys/socket.h>
16 #include <sys/time.h>
17 #include <limits.h>
18 #include <netinet/in.h>
19 #include <netdb.h>
20 #include <string.h>
21 #include <pwd.h>
22 #include <errno.h>
23 #include <stdarg.h>
24 #include <pthread.h>
25 #include <signal.h>
26 #include "webcit.h"
27
28
29
30
31
32 void display_siteconfig(void)
33 {
34         char buf[SIZ];
35         char *whichmenu;
36         int i, j;
37
38         /* expire policy settings */
39         int sitepolicy = 0;
40         int sitevalue = 0;
41         int mboxpolicy = 0;
42         int mboxvalue = 0;
43
44         output_headers(1, 1, 0, 0, 0, 0, 0);
45
46         whichmenu = bstr("whichmenu");
47
48         svprintf("BOXTITLE", WCS_STRING, "Site configuration");
49         do_template("beginbox_nt");
50
51         if (!strcmp(whichmenu, "")) {
52                 wprintf("<TABLE border=0 cellspacing=0 cellpadding=3 width=100%%>\n");
53
54                 wprintf("<TR BGCOLOR=\"#CCCCCC\"><TD>"
55                         "<A HREF=\"/display_siteconfig?whichmenu=general\">"
56                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
57                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
58                         "</TD><TD>"
59                         "<A HREF=\"/display_siteconfig?whichmenu=general\">"
60                         "<B>General</B><br />"
61                         "General site configuration items"
62                         "</A></TD></TR>\n"
63                 );
64
65                 wprintf("<TR><TD>"
66                         "<A HREF=\"/display_siteconfig?whichmenu=access\">"
67                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
68                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
69                         "</TD><TD>"
70                         "<A HREF=\"/display_siteconfig?whichmenu=access\">"
71                         "<B>Access</B><br />"
72                         "Access controls and site policy settings"
73                         "</A></TD></TR>\n"
74                 );
75
76                 wprintf("<TR BGCOLOR=\"#CCCCCC\"><TD>"
77                         "<A HREF=\"/display_siteconfig?whichmenu=network\">"
78                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
79                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
80                         "</TD><TD>"
81                         "<A HREF=\"/display_siteconfig?whichmenu=network\">"
82                         "<B>Network</B><br />"
83                         "Network services"
84                         "</A></TD></TR>\n"
85                 );
86
87                 wprintf("<TR><TD>"
88                         "<A HREF=\"/display_siteconfig?whichmenu=tuning\">"
89                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
90                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
91                         "</TD><TD>"
92                         "<A HREF=\"/display_siteconfig?whichmenu=tuning\">"
93                         "<B>Tuning</B><br />"
94                         "Advanced server fine-tuning controls"
95                         "</A></TD></TR>\n"
96                 );
97
98                 wprintf("<TR BGCOLOR=\"#CCCCCC\"><TD>"
99                         "<A HREF=\"/display_siteconfig?whichmenu=ldap\">"
100                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
101                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
102                         "</TD><TD>"
103                         "<A HREF=\"/display_siteconfig?whichmenu=ldap\">"
104                         "<B>Directory</B><br />"
105                         "Configure the LDAP connector for Citadel"
106                         "</A></TD></TR>\n"
107                 );
108
109                 wprintf("<TR><TD>"
110                         "<A HREF=\"/display_siteconfig?whichmenu=purger\">"
111                         "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
112                         "SRC=\"/static/advanced-icon.gif\" ALT=\"&nbsp;\">"
113                         "</TD><TD>"
114                         "<A HREF=\"/display_siteconfig?whichmenu=purger\">"
115                         "<B>Auto-purger</B><br />"
116                         "Configure automatic expiry of old messages"
117                         "</A></TD></TR>\n"
118                 );
119
120                 wprintf("</TABLE>");
121
122                 do_template("endbox");
123                 wDumpContent(1);
124                 return;
125         }
126
127         if (!strcasecmp(whichmenu, "general")) {
128                 wprintf("<CENTER><H2>General site configuration items</H2></CENTER>\n");
129         }
130
131         if (!strcasecmp(whichmenu, "access")) {
132                 wprintf("<CENTER><H2>Access controls and site policy settings</H2></CENTER>\n");
133         }
134
135         if (!strcasecmp(whichmenu, "network")) {
136                 wprintf("<CENTER><H2>Network services</H2>"
137                         "Changes made on this screen will not take effect until you restart the Citadel server."
138                         "</CENTER>\n");
139         }
140
141         if (!strcasecmp(whichmenu, "tuning")) {
142                 wprintf("<CENTER><H2>Advanced server fine-tuning controls</H2></CENTER>\n");
143         }
144
145         if (!strcasecmp(whichmenu, "ldap")) {
146                 wprintf("<CENTER><H2>Citadel LDAP connector configuration</H2>"
147                         "Changes made on this screen will not take effect until you restart the Citadel server."
148                         "</CENTER>\n");
149         }
150
151         if (!strcasecmp(whichmenu, "purger")) {
152                 wprintf("<CENTER><H2>Message auto-purger settings</H2>"
153                         "These settings may be overridden on a per-floor or per-room basis."
154                         "</CENTER>\n");
155         }
156
157         serv_printf("CONF get");
158         serv_gets(buf);
159         if (buf[0] != '1') {
160                 wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
161                 wprintf("<SPAN CLASS=\"titlebar\">Error</SPAN>\n");
162                 wprintf("</TD></TR></TABLE><br />\n");
163                 wprintf("%s<br />\n", &buf[4]);
164                 do_template("endbox");
165                 wDumpContent(1);
166                 return;
167         }
168
169         wprintf("<FORM METHOD=\"POST\" ACTION=\"/siteconfig\">\n");
170         wprintf("<TABLE border=0>\n");
171
172         i = 0;
173         while (serv_gets(buf), strcmp(buf, "000")) {
174                 switch (++i) {
175                 case 1:
176                         if (!strcasecmp(whichmenu, "general")) {
177                                 wprintf("<TR><TD>Node name</TD><TD>");
178                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_nodename\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
179                                 wprintf("</TD></TR>\n");
180                         }
181                         else {
182                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_nodename\" VALUE=\"%s\">", buf);
183                         }
184                         break;
185                 case 2:
186                         if (!strcasecmp(whichmenu, "general")) {
187                                 wprintf("<TR><TD>Fully qualified domain name</TD><TD>");
188                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_fqdn\" MAXLENGTH=\"63\" VALUE=\"%s\">", buf);
189                                 wprintf("</TD></TR>\n");
190                         }
191                         else {
192                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_fqdn\" VALUE=\"%s\">", buf);
193                         }
194                         break;
195                 case 3:
196                         if (!strcasecmp(whichmenu, "general")) {
197                                 wprintf("<TR><TD>Human-readable node name</TD><TD>");
198                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_humannode\" MAXLENGTH=\"20\" VALUE=\"%s\">", buf);
199                                 wprintf("</TD></TR>\n");
200                         }
201                         else {
202                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_humannode\" VALUE=\"%s\">", buf);
203                         }
204                         break;
205                 case 4:
206                         if (!strcasecmp(whichmenu, "general")) {
207                                 wprintf("<TR><TD>Landline telephone number</TD><TD>");
208                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_phonenum\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
209                                 wprintf("</TD></TR>\n");
210                         }
211                         else {
212                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_phonenum\" VALUE=\"%s\">", buf);
213                         }
214                         break;
215                 case 5:
216                         if (!strcasecmp(whichmenu, "access")) {
217                                 wprintf("<TR><TD>Automatically grant room-aide status to users who create private rooms</TD><TD>");
218                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_creataide\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
219                                 wprintf("</TD></TR>\n");
220                         }
221                         else {
222                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_creataide\" VALUE=\"%s\">", buf);
223                         }
224                         break;
225                 case 6:
226                         if (!strcasecmp(whichmenu, "tuning")) {
227                                 wprintf("<TR><TD>Server connection idle timeout (in seconds)</TD><TD>");
228                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_sleeping\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
229                                 wprintf("</TD></TR>\n");
230                         }
231                         else {
232                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_sleeping\" VALUE=\"%s\">", buf);
233                         }
234                         break;
235                 case 7:
236                         if (!strcasecmp(whichmenu, "access")) {
237                                 wprintf("<TR><TD>Initial access level for new users</TD><TD>");
238                                 wprintf("<SELECT NAME=\"c_initax\" SIZE=\"1\">\n");
239                                 for (j=0; j<=6; ++j) {
240                                         wprintf("<OPTION %s VALUE=\"%d\">%d - %s</OPTION>\n",
241                                                 ((atoi(buf) == j) ? "SELECTED" : ""),
242                                                 j, j, axdefs[j]
243                                         );
244                                 }
245                                 wprintf("</SELECT>");
246                                 wprintf("</TD></TR>\n");
247                         }
248                         else {
249                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_initax\" VALUE=\"%s\">", buf);
250                         }
251                         break;
252                 case 8:
253                         if (!strcasecmp(whichmenu, "access")) {
254                                 wprintf("<TR><TD>Require registration for new users</TD><TD>");
255                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_regiscall\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
256                                 wprintf("</TD></TR>\n");
257                         }
258                         else {
259                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_regiscall\" VALUE=\"%s\">", buf);
260                         }
261                         break;
262                 case 9:
263                         if (!strcasecmp(whichmenu, "access")) {
264                                 wprintf("<TR><TD>Quarantine messages from problem users</TD><TD>");
265                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_twitdetect\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
266                                 wprintf("</TD></TR>\n");
267                         }
268                         else {
269                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_twitdetect\" VALUE=\"%s\">", buf);
270                         }
271                         break;
272                 case 10:
273                         if (!strcasecmp(whichmenu, "access")) {
274                                 wprintf("<TR><TD>Name of quarantine room</TD><TD>");
275                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_twitroom\" MAXLENGTH=\"63\" VALUE=\"%s\">", buf);
276                                 wprintf("</TD></TR>\n");
277                         }
278                         else {
279                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_twitroom\" VALUE=\"%s\">", buf);
280                         }
281                         break;
282                 case 11:
283                         if (!strcasecmp(whichmenu, "general")) {
284                                 wprintf("<TR><TD>Paginator prompt (for text mode clients)</TD><TD>");
285                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_moreprompt\" MAXLENGTH=\"79\" VALUE=\"%s\">", buf);
286                                 wprintf("</TD></TR>\n");
287                         }
288                         else {
289                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_moreprompt\" VALUE=\"%s\">", buf);
290                         }
291                         break;
292                 case 12:
293                         if (!strcasecmp(whichmenu, "access")) {
294                                 wprintf("<TR><TD>Restrict access to Internet mail</TD><TD>");
295                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_restrict\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
296                                 wprintf("</TD></TR>\n");
297                         }
298                         else {
299                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_restrict\" VALUE=\"%s\">", buf);
300                         }
301                         break;
302                 case 13:
303                         if (!strcasecmp(whichmenu, "general")) {
304                                 wprintf("<TR><TD>Geographic location of this system</TD><TD>");
305                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_bbs_city\" MAXLENGTH=\"31\" VALUE=\"%s\">", buf);
306                                 wprintf("</TD></TR>\n");
307                         }
308                         else {
309                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_bbs_city\" VALUE=\"%s\">", buf);
310                         }
311                         break;
312                 case 14:
313                         if (!strcasecmp(whichmenu, "general")) {
314                                 wprintf("<TR><TD>Name of system administrator</TD><TD>");
315                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_sysadm\" MAXLENGTH=\"25\" VALUE=\"%s\">", buf);
316                                 wprintf("</TD></TR>\n");
317                         }
318                         else {
319                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_sysadm\" VALUE=\"%s\">", buf);
320                         }
321                         break;
322                 case 15:
323                         if (!strcasecmp(whichmenu, "tuning")) {
324                                 wprintf("<TR><TD>Maximum concurrent sessions</TD><TD>");
325                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_maxsessions\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
326                                 wprintf("</TD></TR>\n");
327                         }
328                         else {
329                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_maxsessions\" VALUE=\"%s\">", buf);
330                         }
331                         break;
332                 case 17:
333                         if (!strcasecmp(whichmenu, "tuning")) {
334                                 wprintf("<TR><TD>Default user purge time (days)</TD><TD>");
335                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_userpurge\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
336                                 wprintf("</TD></TR>\n");
337                         }
338                         else {
339                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_userpurge\" VALUE=\"%s\">", buf);
340                         }
341                         break;
342                 case 18:
343                         if (!strcasecmp(whichmenu, "tuning")) {
344                                 wprintf("<TR><TD>Default room purge time (days)</TD><TD>");
345                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_roompurge\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
346                                 wprintf("</TD></TR>\n");
347                         }
348                         else {
349                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_roompurge\" VALUE=\"%s\">", buf);
350                         }
351                         break;
352                 case 19:
353                         if (!strcasecmp(whichmenu, "access")) {
354                                 wprintf("<TR><TD>Name of room to log pages</TD><TD>");
355                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_logpages\" MAXLENGTH=\"63\" VALUE=\"%s\">", buf);
356                                 wprintf("</TD></TR>\n");
357                         }
358                         else {
359                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_logpages\" VALUE=\"%s\">", buf);
360                         }
361                         break;
362                 case 20:
363                         if (!strcasecmp(whichmenu, "access")) {
364                                 wprintf("<TR><TD>Access level required to create rooms</TD><TD>");
365                                 wprintf("<SELECT NAME=\"c_createax\" SIZE=\"1\">\n");
366                                 for (j=0; j<=6; ++j) {
367                                         wprintf("<OPTION %s VALUE=\"%d\">%d - %s</OPTION>\n",
368                                                 ((atoi(buf) == j) ? "SELECTED" : ""),
369                                                 j, j, axdefs[j]
370                                         );
371                                 }
372                                 wprintf("</SELECT>");
373                                 wprintf("</TD></TR>\n");
374                         }
375                         else {
376                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_createax\" VALUE=\"%s\">", buf);
377                         }
378                         break;
379                 case 21:
380                         if (!strcasecmp(whichmenu, "tuning")) {
381                                 wprintf("<TR><TD>Maximum message length</TD><TD>");
382                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_maxmsglen\" MAXLENGTH=\"20\" VALUE=\"%s\">", buf);
383                                 wprintf("</TD></TR>\n");
384                         }
385                         else {
386                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_maxmsglen\" VALUE=\"%s\">", buf);
387                         }
388                         break;
389                 case 22:
390                         if (!strcasecmp(whichmenu, "tuning")) {
391                                 wprintf("<TR><TD>Minimum number of worker threads</TD><TD>");
392                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_min_workers\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
393                                 wprintf("</TD></TR>\n");
394                         }
395                         else {
396                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_min_workers\" VALUE=\"%s\">", buf);
397                         }
398                         break;
399                 case 23:
400                         if (!strcasecmp(whichmenu, "tuning")) {
401                                 wprintf("<TR><TD>Maximum number of worker threads</TD><TD>");
402                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_max_workers\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
403                                 wprintf("</TD></TR>\n");
404                         }
405                         else {
406                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_max_workers\" VALUE=\"%s\">", buf);
407                         }
408                         break;
409                 case 24:
410                         if (!strcasecmp(whichmenu, "network")) {
411                                 wprintf("<TR><TD>POP3 listener port (-1 to disable)</TD><TD>");
412                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_pop3_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
413                                 wprintf("</TD></TR>\n");
414                         }
415                         else {
416                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_pop3_port\" VALUE=\"%s\">", buf);
417                         }
418                         break;
419                 case 25:
420                         if (!strcasecmp(whichmenu, "network")) {
421                                 wprintf("<TR><TD>SMTP MTA port (-1 to disable)</TD><TD>");
422                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_smtp_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
423                                 wprintf("</TD></TR>\n");
424                         }
425                         else {
426                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_smtp_port\" VALUE=\"%s\">", buf);
427                         }
428                         break;
429                 case 27:
430                         if (!strcasecmp(whichmenu, "access")) {
431                                 wprintf("<TR><TD>Allow aides to zap (forget) rooms</TD><TD>");
432                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_aide_zap\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
433                                 wprintf("</TD></TR>\n");
434                         }
435                         else {
436                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_aide_zap\" VALUE=\"%s\">", buf);
437                         }
438                         break;
439                 case 28:
440                         if (!strcasecmp(whichmenu, "network")) {
441                                 wprintf("<TR><TD>IMAP listener port (-1 to disable)</TD><TD>");
442                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_imap_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
443                                 wprintf("</TD></TR>\n");
444                         }
445                         else {
446                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_imap_port\" VALUE=\"%s\">", buf);
447                         }
448                         break;
449                 case 29:
450                         if (!strcasecmp(whichmenu, "network")) {
451                                 wprintf("<TR><TD>Network run frequency (in seconds)</TD><TD>");
452                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_net_freq\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
453                                 wprintf("</TD></TR>\n");
454                         }
455                         else {
456                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_net_freq\" VALUE=\"%s\">", buf);
457                         }
458                         break;
459                 case 30:
460                         if (!strcasecmp(whichmenu, "access")) {
461                                 wprintf("<TR><TD>Disable self-service user account creation</TD><TD>");
462                                 wprintf("<INPUT TYPE=\"checkbox\" NAME=\"c_disable_newu\" VALUE=\"yes\" %s>", ((atoi(buf) != 0) ? "CHECKED" : ""));
463                                 wprintf("</TD></TR>\n");
464                         }
465                         else {
466                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_disable_newu\" VALUE=\"%s\">", buf);
467                         }
468                         break;
469                 case 31:
470                         /* placeholder -- there is no option 31 */
471                         break;
472                 case 32:
473                         if (!strcasecmp(whichmenu, "tuning")) {
474                                 wprintf("<TR><TD>Hour to run database auto-purge</TD><TD>");
475                                 wprintf("<SELECT NAME=\"c_purge_hour\" SIZE=\"1\">\n");
476                                 for (j=0; j<=23; ++j) {
477                                         wprintf("<OPTION %s VALUE=\"%d\">%d:00%s</OPTION>\n",
478                                                 ((atoi(buf) == j) ? "SELECTED" : ""),
479                                                 j,
480                                                 ((j == 0) ? 12 : ((j>12) ? j-12 : j)),
481                                                 ((j >= 12) ? "pm" : "am")
482                                         );
483                                 }
484                                 wprintf("</SELECT>");
485                                 wprintf("</TD></TR>\n");
486                         }
487                         else {
488                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_purge_hour\" VALUE=\"%s\">", buf);
489                         }
490                         break;
491                 case 33:
492                         if ( (serv_info.serv_supports_ldap) && (!strcasecmp(whichmenu, "ldap")) ) {
493                                 wprintf("<TR><TD>Host name of LDAP server (blank to disable)</TD><TD>");
494                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_ldap_host\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
495                                 wprintf("</TD></TR>\n");
496                         }
497                         else {
498                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ldap_host\" VALUE=\"%s\">", buf);
499                         }
500                         break;
501                 case 34:
502                         if ( (serv_info.serv_supports_ldap) && (!strcasecmp(whichmenu, "ldap")) ) {
503                                 wprintf("<TR><TD>Port number of LDAP server (blank to disable)</TD><TD>");
504                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_ldap_port\" MAXLENGTH=\"127\" VALUE=\"%d\">", atoi(buf));
505                                 wprintf("</TD></TR>\n");
506                         }
507                         else {
508                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ldap_port\" VALUE=\"%d\">", atoi(buf));
509                         }
510                         break;
511                 case 35:
512                         if ( (serv_info.serv_supports_ldap) && (!strcasecmp(whichmenu, "ldap")) ) {
513                                 wprintf("<TR><TD>Base DN</TD><TD>");
514                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_ldap_base_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
515                                 wprintf("</TD></TR>\n");
516                         }
517                         else {
518                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ldap_base_dn\" VALUE=\"%s\">", buf);
519                         }
520                         break;
521                 case 36:
522                         if ( (serv_info.serv_supports_ldap) && (!strcasecmp(whichmenu, "ldap")) ) {
523                                 wprintf("<TR><TD>Bind DN</TD><TD>");
524                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_ldap_bind_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
525                                 wprintf("</TD></TR>\n");
526                         }
527                         else {
528                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ldap_bind_dn\" VALUE=\"%s\">", buf);
529                         }
530                         break;
531                 case 37:
532                         if ( (serv_info.serv_supports_ldap) && (!strcasecmp(whichmenu, "ldap")) ) {
533                                 wprintf("<TR><TD>Password for bind DN</TD><TD>");
534                                 wprintf("<INPUT TYPE=\"password\" NAME=\"c_ldap_bind_pw\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
535                                 wprintf("</TD></TR>\n");
536                         }
537                         else {
538                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ldap_bind_pw\" VALUE=\"%s\">", buf);
539                         }
540                         break;
541                 case 38:
542                         if (!strcasecmp(whichmenu, "network")) {
543                                 wprintf("<TR><TD>Server IP address (0.0.0.0 for 'any')</TD><TD>");
544                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_ip_addr\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
545                                 wprintf("</TD></TR>\n");
546                         }
547                         else {
548                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_ip_addr\" VALUE=\"%s\">", buf);
549                         }
550                         break;
551                 case 39:
552                         if (!strcasecmp(whichmenu, "network")) {
553                                 wprintf("<TR><TD>SMTP MSA port (-1 to disable)</TD><TD>");
554                                 wprintf("<INPUT TYPE=\"text\" NAME=\"c_msa_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
555                                 wprintf("</TD></TR>\n");
556                         }
557                         else {
558                                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"c_msa_port\" VALUE=\"%s\">", buf);
559                         }
560                         break;
561                 }
562         }
563
564         serv_puts("GPEX site");
565         serv_gets(buf);
566         if (buf[0] == '2') {
567                 sitepolicy = extract_int(&buf[4], 0);
568                 sitevalue = extract_int(&buf[4], 1);
569         }
570
571         serv_puts("GPEX mailboxes");
572         serv_gets(buf);
573         if (buf[0] == '2') {
574                 mboxpolicy = extract_int(&buf[4], 0);
575                 mboxvalue = extract_int(&buf[4], 1);
576         }
577
578         if (!strcasecmp(whichmenu, "purger")) {
579
580                 wprintf("<TR><TD COLSPAN=2><hr /></TD></TR>\n");
581
582                 wprintf("<TR><TD>Default message expire policy for public rooms</TD><TD>");
583                 wprintf("<INPUT TYPE=\"radio\" NAME=\"sitepolicy\" VALUE=\"1\" %s>",
584                         ((sitepolicy == 1) ? "CHECKED" : "") );
585                 wprintf("Never automatically expire messages<br />\n");
586                 wprintf("<INPUT TYPE=\"radio\" NAME=\"sitepolicy\" VALUE=\"2\" %s>",
587                         ((sitepolicy == 2) ? "CHECKED" : "") );
588                 wprintf("Expire by message count<br />\n");
589                 wprintf("<INPUT TYPE=\"radio\" NAME=\"sitepolicy\" VALUE=\"3\" %s>",
590                         ((sitepolicy == 3) ? "CHECKED" : "") );
591                 wprintf("Expire by message age<br />");
592                 wprintf("Number of messages or days: ");
593                 wprintf("<INPUT TYPE=\"text\" NAME=\"sitevalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", sitevalue);
594                 wprintf("</TD></TR>\n");
595
596                 wprintf("<TR><TD COLSPAN=2><hr /></TD></TR>\n");
597
598                 wprintf("<TR><TD>Default message expire policy for private mailboxes</TD><TD>");
599                 wprintf("<INPUT TYPE=\"radio\" NAME=\"mboxpolicy\" VALUE=\"0\" %s>",
600                         ((mboxpolicy == 0) ? "CHECKED" : "") );
601                 wprintf("Same policy as public rooms<br />\n");
602                 wprintf("<INPUT TYPE=\"radio\" NAME=\"mboxpolicy\" VALUE=\"1\" %s>",
603                         ((mboxpolicy == 1) ? "CHECKED" : "") );
604                 wprintf("Never automatically expire messages<br />\n");
605                 wprintf("<INPUT TYPE=\"radio\" NAME=\"mboxpolicy\" VALUE=\"2\" %s>",
606                         ((mboxpolicy == 2) ? "CHECKED" : "") );
607                 wprintf("Expire by message count<br />\n");
608                 wprintf("<INPUT TYPE=\"radio\" NAME=\"mboxpolicy\" VALUE=\"3\" %s>",
609                         ((mboxpolicy == 3) ? "CHECKED" : "") );
610                 wprintf("Expire by message age<br />");
611                 wprintf("Number of messages or days: ");
612                 wprintf("<INPUT TYPE=\"text\" NAME=\"mboxvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", mboxvalue);
613                 wprintf("</TD></TR>\n");
614
615                 wprintf("<TR><TD COLSPAN=2><hr /></TD></TR>\n");
616
617         }
618         else {
619                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"sitepolicy\" VALUE=\"%d\">\n", sitepolicy);
620                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"sitevalue\" VALUE=\"%d\">\n", sitevalue);
621                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"mboxpolicy\" VALUE=\"%d\">\n", mboxpolicy);
622                 wprintf("<INPUT TYPE=\"hidden\" NAME=\"mboxvalue\" VALUE=\"%d\">\n", mboxvalue);
623         }
624
625         wprintf("</TABLE><CENTER>");
626         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
627         wprintf("&nbsp;");
628         wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">\n");
629         wprintf("</CENTER></FORM>\n");
630         do_template("endbox");
631         wDumpContent(1);
632 }
633
634
635 void siteconfig(void)
636 {
637         char buf[SIZ];
638
639         if (strcasecmp(bstr("sc"), "OK")) {
640                 display_siteconfig();
641                 return;
642         }
643         serv_printf("CONF set");
644         serv_gets(buf);
645         if (buf[0] != '4') {
646                 strcpy(WC->ImportantMessage, &buf[4]);
647                 display_siteconfig();
648                 return;
649         }
650         serv_printf("%s", bstr("c_nodename"));
651         serv_printf("%s", bstr("c_fqdn"));
652         serv_printf("%s", bstr("c_humannode"));
653         serv_printf("%s", bstr("c_phonenum"));
654         serv_printf("%s", ((!strcasecmp(bstr("c_creataide"), "yes") ? "1" : "0")));
655         serv_printf("%s", bstr("c_sleeping"));
656         serv_printf("%s", bstr("c_initax"));
657         serv_printf("%s", ((!strcasecmp(bstr("c_regiscall"), "yes") ? "1" : "0")));
658         serv_printf("%s", ((!strcasecmp(bstr("c_twitdetect"), "yes") ? "1" : "0")));
659         serv_printf("%s", bstr("c_twitroom"));
660         serv_printf("%s", bstr("c_moreprompt"));
661         serv_printf("%s", ((!strcasecmp(bstr("c_restrict"), "yes") ? "1" : "0")));
662         serv_printf("%s", bstr("c_bbs_city"));
663         serv_printf("%s", bstr("c_sysadm"));
664         serv_printf("%s", bstr("c_maxsessions"));
665         serv_printf("");  /* networking password -- deprecated */
666         serv_printf("%s", bstr("c_userpurge"));
667         serv_printf("%s", bstr("c_roompurge"));
668         serv_printf("%s", bstr("c_logpages"));
669         serv_printf("%s", bstr("c_createax"));
670         serv_printf("%s", bstr("c_maxmsglen"));
671         serv_printf("%s", bstr("c_min_workers"));
672         serv_printf("%s", bstr("c_max_workers"));
673         serv_printf("%s", bstr("c_pop3_port"));
674         serv_printf("%s", bstr("c_smtp_port"));
675         serv_printf("");  /* moderation filter level -- not yet implemented */
676         serv_printf("%s", ((!strcasecmp(bstr("c_aide_zap"), "yes") ? "1" : "0")));
677         serv_printf("%s", bstr("c_imap_port"));
678         serv_printf("%s", bstr("c_net_freq"));
679         serv_printf("%s", ((!strcasecmp(bstr("c_disable_newu"), "yes") ? "1" : "0")));
680         serv_printf("1");       /* placeholder -- deprecated */
681         serv_printf("%s", bstr("c_purge_hour"));
682         serv_printf("%s", bstr("c_ldap_host"));
683         serv_printf("%s", bstr("c_ldap_port"));
684         serv_printf("%s", bstr("c_ldap_base_dn"));
685         serv_printf("%s", bstr("c_ldap_bind_dn"));
686         serv_printf("%s", bstr("c_ldap_bind_pw"));
687         serv_printf("%s", bstr("c_ip_addr"));
688         serv_printf("%s", bstr("c_msa_port"));
689         serv_printf("000");
690
691         serv_printf("SPEX site|%d|%d", atoi(bstr("sitepolicy")), atoi(bstr("sitevalue")));
692         serv_gets(buf);
693         serv_printf("SPEX mailboxes|%d|%d", atoi(bstr("mboxpolicy")), atoi(bstr("mboxvalue")));
694         serv_gets(buf);
695
696         strcpy(WC->ImportantMessage, "System configuration has been updated.");
697         display_siteconfig();
698 }