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