* use strbuffer as wprintf backend
[citadel.git] / webcit / siteconfig.c
1 /*
2  * $Id$
3  *
4  * Administrative screen for site-wide configuration
5  */
6
7
8 #include "webcit.h"
9 #include "webserver.h"
10
11 /*
12  * \brief display all configuration items
13  */
14 void display_siteconfig(void)
15 {
16         char buf[SIZ];
17         int i, j;
18         struct wcsession *WCC = WC;
19
20         char general[65536];
21         char access[SIZ];
22         char network[SIZ];
23         char tuning[SIZ];
24         char directory[SIZ];
25         char purger[SIZ];
26         char idxjnl[SIZ];
27         char funambol[SIZ];
28         char pop3[SIZ];
29         
30         /** expire policy settings */
31         int sitepolicy = 0;
32         int sitevalue = 0;
33         int mboxpolicy = 0;
34         int mboxvalue = 0;
35
36         output_headers(1, 1, 2, 0, 0, 0);
37         wprintf("<div id=\"banner\">\n");
38         wprintf("<h1>");
39         wprintf(_("Site configuration"));
40         wprintf("</h1>");
41         wprintf("</div>\n");
42
43         wprintf("<div id=\"content\" class=\"service fix_scrollbar_bug\">\n");
44
45         serv_printf("CONF get");
46         serv_getln(buf, sizeof buf);
47         if (buf[0] != '1') {
48                 wprintf("<div class=\"errormsg\">");
49                 wprintf(_("Error"));
50                 wprintf("<br />\n");
51                 wprintf("%s<br />\n", &buf[4]);
52                 wDumpContent(1);
53                 wprintf("</div>\n");
54                 return;
55         }
56
57         wprintf("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" ><tr><td>");
58
59         char *tabnames[] = {
60                 _("General"),
61                 _("Access"),
62                 _("Network"),
63                 _("Tuning"),
64                 _("Directory"),
65                 _("Auto-purger"),
66                 _("Indexing/Journaling"),
67                 _("Push Email"),
68                 _("Pop3")
69         };
70
71         sprintf(general, "<center><h1>%s</h1><table border=\"0\">",
72                         _("General site configuration items")
73         );
74
75         sprintf(access, "<center><h1>%s</h1><table border=\"0\">",
76                         _("Access controls and site policy settings")
77         );
78
79         sprintf(network, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
80                         _("Network services"),
81                         _("Changes made on this screen will not take effect "
82                         "until you restart the Citadel server.")
83         );
84
85         sprintf(tuning, "<center><h1>%s</h1><table border=\"0\">",
86                         _("Advanced server fine-tuning controls")
87         );
88
89         sprintf(directory, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
90                         _("Configure the LDAP connector for Citadel"),
91                         (serv_info.serv_supports_ldap
92                         ?       _("Changes made on this screen will not take effect "
93                                 "until you restart the Citadel server.")
94                         :       _("NOTE: This Citadel server has been built without "
95                                 "LDAP support.  These options will have no effect.")
96                         )
97         );
98
99         sprintf(purger, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
100                         _("Configure automatic expiry of old messages"),
101                         _("These settings may be overridden on a per-floor or per-room basis.")
102         );
103
104         sprintf(idxjnl, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
105                         _("Indexing and Journaling"),
106                         _("Warning: these facilities are resource intensive.")
107         );
108         sprintf(funambol, "<center><h1>%s</h1><table border=\"0\">",
109                 _("Push Email")
110                 );
111
112         sprintf(pop3, "<center><h1>%s</h1><table border=\"0\">",
113                 _("POP3")
114                 );
115                 
116         wprintf("<form method=\"post\" action=\"siteconfig\">\n");
117         wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WCC->nonce);
118         
119         sprintf(&general[strlen(general)], "<tr><td><a href=\"display_edithello\"> %s </a></td>",           _("Change Login Logo"));
120         sprintf(&general[strlen(general)],     "<td><a href=\"display_editgoodbuye\"> %s </a></td></tr>\n", _("Change Logout Logo"));
121
122         i = 0;
123         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
124                 switch (i++) {
125                 case 0:
126                         sprintf(&general[strlen(general)], "<tr><td>");
127                         sprintf(&general[strlen(general)], _("Node name"));
128                         sprintf(&general[strlen(general)], "</td><td>");
129                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_nodename\" maxlength=\"15\" value=\"%s\">", buf);
130                         sprintf(&general[strlen(general)], "</td></tr>\n");
131                         break;
132                 case 1:
133                         sprintf(&general[strlen(general)], "<tr><td>");
134                         sprintf(&general[strlen(general)], _("Fully qualified domain name"));
135                         sprintf(&general[strlen(general)], "</td><td>");
136                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_fqdn\" maxlength=\"63\" value=\"%s\">", buf);
137                         sprintf(&general[strlen(general)], "</td></tr>\n");
138                         break;
139                 case 2:
140                         sprintf(&general[strlen(general)], "<tr><td>");
141                         sprintf(&general[strlen(general)], _("Human-readable node name"));
142                         sprintf(&general[strlen(general)], "</td><td>");
143                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_humannode\" maxlength=\"20\" value=\"%s\">", buf);
144                         sprintf(&general[strlen(general)], "</td></tr>\n");
145                         break;
146                 case 3:
147                         sprintf(&general[strlen(general)], "<tr><td>");
148                         sprintf(&general[strlen(general)], _("Telephone number"));
149                         sprintf(&general[strlen(general)], "</td><td>");
150                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_phonenum\" maxlength=\"15\" value=\"%s\">", buf);
151                         sprintf(&general[strlen(general)], "</td></tr>\n");
152                         break;
153                 case 4:
154                         sprintf(&access[strlen(access)], "<tr><td>");
155                         sprintf(&access[strlen(access)], _("Automatically grant room-aide status to users who create private rooms"));
156                         sprintf(&access[strlen(access)], "</td><td>");
157                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_creataide\" value=\"yes\" %s>",
158                                 ((atoi(buf) != 0) ? "checked" : ""));
159                         sprintf(&access[strlen(access)], "</td></tr>\n");
160                         break;
161                 case 5:
162                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
163                         sprintf(&tuning[strlen(tuning)], _("Server connection idle timeout (in seconds)"));
164                         sprintf(&tuning[strlen(tuning)], "</td><td>");
165                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_sleeping\" maxlength=\"15\" value=\"%s\">", buf);
166                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
167                         break;
168                 case 6:
169                         sprintf(&access[strlen(access)], "<tr><td>");
170                         sprintf(&access[strlen(access)], _("Initial access level for new users"));
171                         sprintf(&access[strlen(access)], "</td><td>");
172                         sprintf(&access[strlen(access)], "<select name=\"c_initax\" size=\"1\">\n");
173                         for (j=0; j<=6; ++j) {
174                                 sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
175                                         ((atoi(buf) == j) ? "selected" : ""),
176                                         j, j, axdefs[j]
177                                 );
178                         }
179                         sprintf(&access[strlen(access)], "</select>");
180                         sprintf(&access[strlen(access)], "</td></tr>\n");
181                         break;
182                 case 7:
183                         sprintf(&access[strlen(access)], "<tr><td>");
184                         sprintf(&access[strlen(access)], _("Require registration for new users"));
185                         sprintf(&access[strlen(access)], "</td><td>");
186                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_regiscall\" value=\"yes\" %s>",
187                                 ((atoi(buf) != 0) ? "checked" : ""));
188                         sprintf(&access[strlen(access)], "</td></tr>\n");
189                         break;
190                 case 8:
191                         sprintf(&access[strlen(access)], "<tr><td>");
192                         sprintf(&access[strlen(access)], _("Quarantine messages from problem users"));
193                         sprintf(&access[strlen(access)], "</td><td>");
194                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_twitdetect\" value=\"yes\" %s>",
195                                 ((atoi(buf) != 0) ? "checked" : ""));
196                         sprintf(&access[strlen(access)], "</td></tr>\n");
197                         break;
198                 case 9:
199                         sprintf(&access[strlen(access)], "<tr><td>");
200                         sprintf(&access[strlen(access)], _("Name of quarantine room"));
201                         sprintf(&access[strlen(access)], "</td><td>");
202                         sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_twitroom\" maxlength=\"63\" value=\"%s\">", buf);
203                         sprintf(&access[strlen(access)], "</td></tr>\n");
204                         break;
205                 case 10:
206                         sprintf(&general[strlen(general)], "<tr><td>");
207                         sprintf(&general[strlen(general)], _("Paginator prompt (for text mode clients)"));
208                         sprintf(&general[strlen(general)], "</td><td>");
209                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_moreprompt\" maxlength=\"79\" value=\"%s\">", buf);
210                         sprintf(&general[strlen(general)], "</td></tr>\n");
211                         break;
212                 case 11:
213                         sprintf(&access[strlen(access)], "<tr><td>");
214                         sprintf(&access[strlen(access)], _("Restrict access to Internet mail"));
215                         sprintf(&access[strlen(access)], "</td><td>");
216                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_restrict\" value=\"yes\" %s>",
217                                 ((atoi(buf) != 0) ? "checked" : ""));
218                         sprintf(&access[strlen(access)], "</td></tr>\n");
219                         break;
220                 case 12:
221                         sprintf(&general[strlen(general)], "<tr><td>");
222                         sprintf(&general[strlen(general)], _("Geographic location of this system"));
223                         sprintf(&general[strlen(general)], "</td><td>");
224                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_bbs_city\" maxlength=\"31\" value=\"%s\">", buf);
225                         sprintf(&general[strlen(general)], "</td></tr>\n");
226                         break;
227                 case 13:
228                         sprintf(&general[strlen(general)], "<tr><td>");
229                         sprintf(&general[strlen(general)], _("Name of system administrator"));
230                         sprintf(&general[strlen(general)], "</td><td>");
231                         sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_sysadm\" MAXLENGTH=\"25\" VALUE=\"%s\">", buf);
232                         sprintf(&general[strlen(general)], "</td></tr>\n");
233                         break;
234                 case 14:
235                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
236                         sprintf(&tuning[strlen(tuning)], _("Maximum concurrent sessions (0 = no limit)"));
237                         sprintf(&tuning[strlen(tuning)], "</td><td>");
238                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxsessions\" maxlength=\"5\" value=\"%s\">", buf);
239                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
240                         break;
241                 case 16:
242                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
243                         sprintf(&tuning[strlen(tuning)], _("Default user purge time (days)"));
244                         sprintf(&tuning[strlen(tuning)], "</td><td>");
245                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_userpurge\" maxlength=\"5\" value=\"%s\">", buf);
246                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
247                         break;
248                 case 17:
249                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
250                         sprintf(&tuning[strlen(tuning)], _("Default room purge time (days)"));
251                         sprintf(&tuning[strlen(tuning)], "</td><td>");
252                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_roompurge\" maxlength=\"5\" value=\"%s\">", buf);
253                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
254                         break;
255                 case 18:
256                         sprintf(&access[strlen(access)], "<tr><td>");
257                         sprintf(&access[strlen(access)], _("Name of room to log pages"));
258                         sprintf(&access[strlen(access)], "</td><td>");
259                         sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_logpages\" maxlength=\"63\" value=\"%s\">", buf);
260                         sprintf(&access[strlen(access)], "</td></tr>\n");
261                         break;
262                 case 19:
263                         sprintf(&access[strlen(access)], "<tr><td>");
264                         sprintf(&access[strlen(access)], _("Access level required to create rooms"));
265                         sprintf(&access[strlen(access)], "</td><td>");
266                         sprintf(&access[strlen(access)], "<select name=\"c_createax\" size=\"1\">\n");
267                         for (j=0; j<=6; ++j) {
268                                 sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
269                                         ((atoi(buf) == j) ? "selected" : ""),
270                                         j, j, axdefs[j]
271                                 );
272                         }
273                         sprintf(&access[strlen(access)], "</select>");
274                         sprintf(&access[strlen(access)], "</td></tr>\n");
275                         break;
276                 case 20:
277                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
278                         sprintf(&tuning[strlen(tuning)], _("Maximum message length"));
279                         sprintf(&tuning[strlen(tuning)], "</td><td>");
280                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxmsglen\" maxlength=\"20\" value=\"%s\">", buf);
281                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
282                         break;
283                 case 21:
284                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
285                         sprintf(&tuning[strlen(tuning)], _("Minimum number of worker threads"));
286                         sprintf(&tuning[strlen(tuning)], "</td><td>");
287                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_min_workers\" maxlength=\"5\" value=\"%s\">", buf);
288                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
289                         break;
290                 case 22:
291                         sprintf(&tuning[strlen(tuning)], "<tr><td>");
292                         sprintf(&tuning[strlen(tuning)], _("Maximum number of worker threads"));
293                         sprintf(&tuning[strlen(tuning)], "</td><td>");
294                         sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_max_workers\" maxlength=\"5\" value=\"%s\">", buf);
295                         sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
296                         break;
297                 case 23:
298                         sprintf(&pop3[strlen(pop3)], "<tr><td>");
299                         sprintf(&pop3[strlen(pop3)], _("POP3 listener port (-1 to disable)"));
300                         sprintf(&pop3[strlen(pop3)], "</td><td>");
301                         sprintf(&pop3[strlen(pop3)], "<input type=\"text\" name=\"c_pop3_port\" maxlength=\"5\" value=\"%s\">", buf);
302                         sprintf(&pop3[strlen(pop3)], "</TD></TR>\n");
303                         break;
304                 case 24:
305                         sprintf(&network[strlen(network)], "<TR><TD>");
306                         sprintf(&network[strlen(network)], _("SMTP MTA port (-1 to disable)"));
307                         sprintf(&network[strlen(network)], "</TD><TD>");
308                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtp_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
309                         sprintf(&network[strlen(network)], "</TD></TR>\n");
310                         break;
311                 case 25:        /* note: reverse bool */
312                         sprintf(&network[strlen(network)], "<TR><TD>");
313                         sprintf(&network[strlen(network)], _("Correct forged From: lines during authenticated SMTP"));
314                         sprintf(&network[strlen(network)], "</TD><TD>");
315                         sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_rfc822_strict_from\" VALUE=\"yes\" %s>",
316                                 ((atoi(buf) == 0) ? "CHECKED" : ""));
317                         sprintf(&network[strlen(network)], "</TD></TR>\n");
318                         break;
319                 case 26:
320                         sprintf(&access[strlen(access)], "<TR><TD>");
321                         sprintf(&access[strlen(access)], _("Allow aides to zap (forget) rooms"));
322                         sprintf(&access[strlen(access)], "</TD><TD>");
323                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_aide_zap\" VALUE=\"yes\" %s>",
324                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
325                         sprintf(&access[strlen(access)], "</TD></TR>\n");
326                         break;
327                 case 27:
328                         sprintf(&network[strlen(network)], "<TR><TD>");
329                         sprintf(&network[strlen(network)], _("IMAP listener port (-1 to disable)"));
330                         sprintf(&network[strlen(network)], "</TD><TD>");
331                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imap_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
332                         sprintf(&network[strlen(network)], "</TD></TR>\n");
333                         break;
334                 case 28:
335                         sprintf(&network[strlen(network)], "<TR><TD>");
336                         sprintf(&network[strlen(network)], _("Network run frequency (in seconds)"));
337                         sprintf(&network[strlen(network)], "</TD><TD>");
338                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_net_freq\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
339                         sprintf(&network[strlen(network)], "</TD></TR>\n");
340                         break;
341                 case 29:
342                         sprintf(&access[strlen(access)], "<TR><TD>");
343                         sprintf(&access[strlen(access)], _("Disable self-service user account creation"));
344                         sprintf(&access[strlen(access)], "</TD><TD>");
345                         sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_disable_newu\" VALUE=\"yes\" %s>",
346                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
347                         sprintf(&access[strlen(access)], "</TD></TR>\n");
348                         break;
349                 case 31:
350                         sprintf(&purger[strlen(purger)], "<TR><TD>");
351                         sprintf(&purger[strlen(purger)], _("Hour to run database auto-purge"));
352                         sprintf(&purger[strlen(purger)], "</TD><TD>");
353                         sprintf(&purger[strlen(purger)], "<SELECT NAME=\"c_purge_hour\" SIZE=\"1\">\n");
354                         for (j=0; j<=23; ++j) {
355                                 sprintf(&purger[strlen(purger)], "<OPTION %s VALUE=\"%d\">%d:00%s</OPTION>\n",
356                                         ((atoi(buf) == j) ? "SELECTED" : ""),
357                                         j,
358                                         (get_time_format_cached() == WC_TIMEFORMAT_24) ? j : ((j == 0) ? 12 : ((j>12) ? j-12 : j)),
359                                         (get_time_format_cached() == WC_TIMEFORMAT_24) ? "" : ((j >= 12) ? "pm" : "am")
360                                 );
361                         }
362                         sprintf(&purger[strlen(purger)], "</SELECT>");
363                         sprintf(&purger[strlen(purger)], "</TD></TR>\n");
364                         break;
365                 case 32:
366                         sprintf(&directory[strlen(directory)], "<TR><TD>");
367                         sprintf(&directory[strlen(directory)], _("Host name of LDAP server (blank to disable)"));
368                         sprintf(&directory[strlen(directory)], "</TD><TD>");
369                         sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_host\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
370                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
371                         break;
372                 case 33:
373                         sprintf(&directory[strlen(directory)], "<TR><TD>");
374                         sprintf(&directory[strlen(directory)], _("Port number of LDAP server (blank to disable)"));
375                         sprintf(&directory[strlen(directory)], "</TD><TD>");
376                         sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_port\" MAXLENGTH=\"127\" VALUE=\"%d\">", atoi(buf));
377                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
378                         break;
379                 case 34:
380                         sprintf(&directory[strlen(directory)], "<TR><TD>");
381                         sprintf(&directory[strlen(directory)], _("Base DN"));
382                         sprintf(&directory[strlen(directory)], "</TD><TD>");
383                         sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_base_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
384                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
385                         break;
386                 case 35:
387                         sprintf(&directory[strlen(directory)], "<TR><TD>");
388                         sprintf(&directory[strlen(directory)], _("Bind DN"));
389                         sprintf(&directory[strlen(directory)], "</TD><TD>");
390                         sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_bind_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
391                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
392                         break;
393                 case 36:
394                         sprintf(&directory[strlen(directory)], "<TR><TD>");
395                         sprintf(&directory[strlen(directory)], _("Password for bind DN"));
396                         sprintf(&directory[strlen(directory)], "</TD><TD>");
397                         sprintf(&directory[strlen(directory)], "<input type=\"password\" NAME=\"c_ldap_bind_pw\" MAXLENGTH=\"255\" VALUE=\"%s\">",
398                                 buf);
399                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
400                         break;
401                 case 37:
402                         sprintf(&network[strlen(network)], "<TR><TD>");
403                         sprintf(&network[strlen(network)], _("Server IP address (0.0.0.0 for 'any')"));
404                         sprintf(&network[strlen(network)], "</TD><TD>");
405                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_ip_addr\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
406                         sprintf(&network[strlen(network)], "</TD></TR>\n");
407                         break;
408                 case 38:
409                         sprintf(&network[strlen(network)], "<TR><TD>");
410                         sprintf(&network[strlen(network)], _("SMTP MSA port (-1 to disable)"));
411                         sprintf(&network[strlen(network)], "</TD><TD>");
412                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_msa_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
413                         sprintf(&network[strlen(network)], "</TD></TR>\n");
414                         break;
415                 case 39:
416                         sprintf(&network[strlen(network)], "<TR><TD>");
417                         sprintf(&network[strlen(network)], _("IMAP over SSL port (-1 to disable)"));
418                         sprintf(&network[strlen(network)], "</TD><TD>");
419                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imaps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
420                         sprintf(&network[strlen(network)], "</TD></TR>\n");
421                         break;
422                 case 40:
423                         sprintf(&pop3[strlen(pop3)], "<TR><TD>");
424                         sprintf(&pop3[strlen(pop3)], _("POP3 over SSL port (-1 to disable)"));
425                         sprintf(&pop3[strlen(pop3)], "</TD><TD>");
426                         sprintf(&pop3[strlen(pop3)], "<input type=\"text\" NAME=\"c_pop3s_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
427                         sprintf(&pop3[strlen(pop3)], "</TD></TR>\n");
428                         break;
429                 case 41:
430                         sprintf(&network[strlen(network)], "<TR><TD>");
431                         sprintf(&network[strlen(network)], _("SMTP over SSL port (-1 to disable)"));
432                         sprintf(&network[strlen(network)], "</TD><TD>");
433                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
434                         sprintf(&network[strlen(network)], "</TD></TR>\n");
435                         break;
436                 case 42:
437                                 sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
438                                 sprintf(&idxjnl[strlen(idxjnl)], _("Enable full text index"));
439                                 sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
440                                 sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_enable_fulltext\" VALUE=\"yes\" %s>",
441                                         ((atoi(buf) != 0) ? "CHECKED" : ""));
442                                 sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
443                         break;
444                 case 43:
445                         sprintf(&tuning[strlen(tuning)], "<TR><TD>");
446                         sprintf(&tuning[strlen(tuning)], _("Automatically delete committed database logs"));
447                         sprintf(&tuning[strlen(tuning)], "</TD><TD>");
448                         sprintf(&tuning[strlen(tuning)], "<input type=\"checkbox\" NAME=\"c_auto_cull\" VALUE=\"yes\" %s>",
449                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
450                         sprintf(&tuning[strlen(tuning)], "</TD></TR>\n");
451                         break;
452                 case 44:
453                         sprintf(&network[strlen(network)], "<TR><TD>");
454                         sprintf(&network[strlen(network)], _("Instantly expunge deleted messages in IMAP"));
455                         sprintf(&network[strlen(network)], "</TD><TD>");
456                         sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_instant_expunge\" VALUE=\"yes\" %s>",
457                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
458                         sprintf(&network[strlen(network)], "</TD></TR>\n");
459                         break;
460                 case 45:
461                         sprintf(&network[strlen(network)], "<TR><TD>");
462                         sprintf(&network[strlen(network)], _("Allow unauthenticated SMTP clients to spoof this site's domains"));
463                         sprintf(&network[strlen(network)], "</TD><TD>");
464                         sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_allow_spoofing\" VALUE=\"yes\" %s>",
465                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
466                         sprintf(&network[strlen(network)], "</TD></TR>\n");
467                         break;
468                 case 46:
469                         sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
470                         sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of email messages"));
471                         sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
472                         sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_email\" VALUE=\"yes\" %s>",
473                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
474                         sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
475                         break;
476                 case 47:
477                         sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
478                         sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of non-email messages"));
479                         sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
480                         sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_pubmsgs\" VALUE=\"yes\" %s>",
481                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
482                         sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
483                         break;
484                 case 48:
485                         sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
486                         sprintf(&idxjnl[strlen(idxjnl)], _("Email destination of journalized messages"));
487                         sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
488                         sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"text\" NAME=\"c_journal_dest\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
489                         sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
490                         break;
491                 case 49:
492                         if (strlen(buf) == 0) {
493                                 strcpy(buf, "UTC");
494                         }
495                         sprintf(&general[strlen(general)], "<TR><TD>");
496                         sprintf(&general[strlen(general)], _("Default timezone for unzoned calendar items"));
497                         sprintf(&general[strlen(general)], "</TD><TD>");
498                         sprintf(&general[strlen(general)], "<select name=\"c_default_cal_zone\" size=\"1\">\n");
499
500                         icalarray *zones;
501                         int z;
502                         long len;
503                         char this_zone[128];
504                         char *ZName;
505                         void *ZNamee;
506                         HashList *List;
507                         HashPos  *it;
508
509                         List = NewHash(1, NULL);
510                         len = sizeof("UTC") + 1;
511                         ZName = malloc(len + 1);
512                         memcpy(ZName, "UTC", len + 1);
513                         Put(List, ZName, len, ZName, NULL);
514                         zones = icaltimezone_get_builtin_timezones();
515                         for (z = 0; z < zones->num_elements; ++z) {
516                                 strcpy(this_zone, icaltimezone_get_location(icalarray_element_at(zones, z)));
517                                 len = strlen(this_zone);
518                                 ZName = (char*)malloc(len +1);
519                                 memcpy(ZName, this_zone, len + 1);
520                                 Put(List, ZName, len, ZName, NULL);
521                         }
522                         SortByHashKey(List, 0);
523                         it = GetNewHashPos();
524                         while (GetNextHashPos(List, it, &len, &ZName, &ZNamee)) {
525                                 sprintf(&general[strlen(general)], "<option %s value=\"%s\">%s</option>\n",
526                                         (!strcasecmp((char*)ZName, buf) ? "selected" : ""),
527                                         ZName, ZName
528                                 );
529                         }
530                         DeleteHashPos(&it);
531                         DeleteHash(&List);
532
533                         sprintf(&general[strlen(general)], "</select>");
534                         sprintf(&general[strlen(general)], "</TD></TR>\n");
535                         break;
536                 case 50:
537                         sprintf(&network[strlen(network)], "<TR><TD>");
538                         sprintf(&network[strlen(network)], _("<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP Dictionary Port </a> (-1 to disable)"));
539                         sprintf(&network[strlen(network)], "</TD><TD>");
540                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_pftcpdict_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
541                         sprintf(&network[strlen(network)], "</TD></TR>\n");
542                         break;
543                 case 51:
544                         sprintf(&network[strlen(network)], "<TR><TD>");
545                         sprintf(&network[strlen(network)], _("ManageSieve Port (-1 to disable)"));
546                         sprintf(&network[strlen(network)], "</TD><TD>");
547                         sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_mgesve_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
548                         sprintf(&network[strlen(network)], "</TD></TR>\n");
549                         break;
550                 case 52:
551                         sprintf(&access[strlen(access)], "<TR><TD>");
552                         sprintf(&access[strlen(access)], _("Enable host based authentication mode"));
553                         sprintf(&access[strlen(access)], "</TD><TD><input type=\"hidden\" NAME=\"c_auth_mode\" VALUE=\"%s\">%s",
554                                 buf,
555                                 ((atoi(buf) != 0) ? "Yes" : "No"));
556                         sprintf(&access[strlen(access)], "</TD></TR>\n");
557                         break;
558                 case 53:
559                         sprintf(&funambol[strlen(funambol)], "<TR><TD>");
560                         sprintf(&funambol[strlen(funambol)], _("Funambol server host (blank to disable)"));
561                         sprintf(&funambol[strlen(funambol)], "</TD><TD>");
562                         sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_host\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
563                         sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
564                         break;
565                 case 54:
566                         sprintf(&funambol[strlen(funambol)], "<TR><TD>");
567                         sprintf(&funambol[strlen(funambol)], _("Funambol server port "));
568                         sprintf(&funambol[strlen(funambol)], "</TD><TD>");
569                         sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
570                         sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
571                         break;
572                 case 55:
573                         sprintf(&funambol[strlen(funambol)], "<TR><TD>");
574                         sprintf(&funambol[strlen(funambol)], _("Funambol sync source"));
575                         sprintf(&funambol[strlen(funambol)], "</TD><TD>");
576                         sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_source\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
577                         sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
578                         break;
579                 case 56:
580                         sprintf(&funambol[strlen(funambol)], "<TR><TD>");
581                         sprintf(&funambol[strlen(funambol)], _("Funambol auth details (user:pass)"));
582                         sprintf(&funambol[strlen(funambol)], "</TD><TD>");
583                         sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_auth\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
584                         sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
585                         break;
586                 case 57:
587                         sprintf(&network[strlen(network)], "<TR><TD>");
588                         sprintf(&network[strlen(network)], _("Perform RBL checks upon connect instead of after RCPT"));
589                         sprintf(&network[strlen(network)], "</TD><TD>");
590                         sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_rbl_at_greeting\" VALUE=\"yes\" %s>",
591                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
592                         sprintf(&network[strlen(network)], "</TD></TR>\n");
593                         break;
594                 case 58:
595                         sprintf(&access[strlen(access)], "<TR><TD>");
596                         sprintf(&access[strlen(access)], _("Master user name (blank to disable)"));
597                         sprintf(&access[strlen(access)], "</TD><TD>");
598                         sprintf(&access[strlen(access)], "<input type=\"text\" NAME=\"c_master_user\" MAXLENGTH=\"31\" VALUE=\"%s\">", buf);
599                         sprintf(&access[strlen(access)], "</TD></TR>\n");
600                         break;
601                 case 59:
602                         sprintf(&access[strlen(access)], "<TR><TD>");
603                         sprintf(&access[strlen(access)], _("Master user password"));
604                         sprintf(&access[strlen(access)], "</TD><TD>");
605                         sprintf(&access[strlen(access)], "<input type=\"password\" NAME=\"c_master_pass\" MAXLENGTH=\"31\" VALUE=\"%s\">",
606                         buf);
607                         sprintf(&directory[strlen(directory)], "</TD></TR>\n");
608                         break;
609                 case 60:
610                         sprintf(&funambol[strlen(funambol)], "<TR><TD>");
611                         sprintf(&funambol[strlen(funambol)], _("External pager tool (blank to disable)"));
612                         sprintf(&funambol[strlen(funambol)], "</TD><TD>");
613                         sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_pager_program\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
614                         sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
615                         break;
616                 case 61:
617                         sprintf(&network[strlen(network)], "<TR><TD>");
618                         sprintf(&network[strlen(network)], _("Keep original from headers in IMAP"));
619                         sprintf(&network[strlen(network)], "</TD><TD>");
620                         sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_imap_keep_from\" VALUE=\"yes\" %s>",
621                                 ((atoi(buf) != 0) ? "CHECKED" : ""));
622                         sprintf(&network[strlen(network)], "</TD></TR>\n");
623                         break;
624                 case 62:
625                         sprintf(&network[strlen(network)], "<tr><td>");
626                         sprintf(&network[strlen(network)], _("XMPP (Jabber) client to server port (-1 to disable)"));
627                         sprintf(&network[strlen(network)], "</td><td>");
628                         sprintf(&network[strlen(network)], "<input type=\"text\" name=\"c_xmpp_c2s_port\" maxlength=\"5\" value=\"%s\">", buf);
629                         sprintf(&network[strlen(network)], "</TD></TR>\n");
630                         break;
631                 case 63:
632                         sprintf(&network[strlen(network)], "<tr><td>");
633                         sprintf(&network[strlen(network)], _("XMPP (Jabber) server to server port (-1 to disable)"));
634                         sprintf(&network[strlen(network)], "</td><td>");
635                         sprintf(&network[strlen(network)], "<input type=\"hidden\" name=\"c_xmpp_s2s_port\" value=\"%s\">\n", buf);
636                         sprintf(&network[strlen(network)], "</TD></TR>\n");
637                         break;
638                 case 64:
639                         sprintf(&pop3[strlen(pop3)], "<tr><td>");
640                         sprintf(&pop3[strlen(pop3)], _("POP3 fetch frequency in seconds"));
641                         sprintf(&pop3[strlen(pop3)], "</td><td>");
642                         sprintf(&pop3[strlen(pop3)], "<input type=\"text\" name=\"c_pop3_fetch\" MAXLENGTH=\"5\" value=\"%s\">\n", buf);
643                         sprintf(&pop3[strlen(pop3)], "</TD></TR>\n");
644                         break;
645                 case 65:
646                         sprintf(&pop3[strlen(pop3)], "<tr><td>");
647                         sprintf(&pop3[strlen(pop3)], _("POP3 fastest fetch frequency in seconds"));
648                         sprintf(&pop3[strlen(pop3)], "</td><td>");
649                         sprintf(&pop3[strlen(pop3)], "<input type=\"text\" name=\"c_pop3_fastest\" MAXLENGTH=\"5\" value=\"%s\">\n", buf);
650                         sprintf(&pop3[strlen(pop3)], "</TD></TR>\n");
651                         break;
652                         
653                 }
654         
655         }
656
657         serv_puts("GPEX site");
658         serv_getln(buf, sizeof buf);
659         if (buf[0] == '2') {
660                 sitepolicy = extract_int(&buf[4], 0);
661                 sitevalue = extract_int(&buf[4], 1);
662         }
663
664         serv_puts("GPEX mailboxes");
665         serv_getln(buf, sizeof buf);
666         if (buf[0] == '2') {
667                 mboxpolicy = extract_int(&buf[4], 0);
668                 mboxvalue = extract_int(&buf[4], 1);
669         }
670
671
672         sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
673
674         sprintf(&purger[strlen(purger)], "<TR><TD>");
675         sprintf(&purger[strlen(purger)], _("Default message expire policy for public rooms"));
676         sprintf(&purger[strlen(purger)], "</TD><TD>");
677         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"1\" %s>",
678                 ((sitepolicy == 1) ? "CHECKED" : "") );
679         sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
680         sprintf(&purger[strlen(purger)], "<br />\n");
681         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"2\" %s>",
682                 ((sitepolicy == 2) ? "CHECKED" : "") );
683         sprintf(&purger[strlen(purger)], _("Expire by message count"));
684         sprintf(&purger[strlen(purger)], "<br />\n");
685         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"3\" %s>",
686                 ((sitepolicy == 3) ? "CHECKED" : "") );
687         sprintf(&purger[strlen(purger)], _("Expire by message age"));
688         sprintf(&purger[strlen(purger)], "<br />");
689         sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
690         sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"sitevalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", sitevalue);
691         sprintf(&purger[strlen(purger)], "</TD></TR>\n");
692
693         sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
694
695         sprintf(&purger[strlen(purger)], "<TR><TD>");
696         sprintf(&purger[strlen(purger)], _("Default message expire policy for private mailboxes"));
697         sprintf(&purger[strlen(purger)], "</TD><TD>");
698         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"0\" %s>",
699                 ((mboxpolicy == 0) ? "CHECKED" : "") );
700         sprintf(&purger[strlen(purger)], _("Same policy as public rooms"));
701         sprintf(&purger[strlen(purger)], "<br />\n");
702         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"1\" %s>",
703                         ((mboxpolicy == 1) ? "CHECKED" : "") );
704         sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
705         sprintf(&purger[strlen(purger)], "<br />\n");
706         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"2\" %s>",
707                 ((mboxpolicy == 2) ? "CHECKED" : "") );
708         sprintf(&purger[strlen(purger)], _("Expire by message count"));
709         sprintf(&purger[strlen(purger)], "<br />\n");
710         sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"3\" %s>",
711                 ((mboxpolicy == 3) ? "CHECKED" : "") );
712         sprintf(&purger[strlen(purger)], _("Expire by message age"));
713         sprintf(&purger[strlen(purger)], "<br />");
714         sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
715         sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"mboxvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", mboxvalue);
716         sprintf(&purger[strlen(purger)], "</TD></TR>\n");
717
718         sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
719
720
721         sprintf(&general[strlen(general)], "</table>");
722         sprintf(&access[strlen(access)], "</table>");
723         sprintf(&network[strlen(network)], "</table>");
724         sprintf(&tuning[strlen(tuning)], "</table>");
725         sprintf(&directory[strlen(directory)], "</table>");
726         sprintf(&purger[strlen(purger)], "</table>");
727         sprintf(&idxjnl[strlen(idxjnl)], "</table>");
728         sprintf(&funambol[strlen(funambol)], "</table>");
729         sprintf(&pop3[strlen(pop3)], "</table>");
730
731         tabbed_dialog(9, tabnames);
732
733         begin_tab(0, 9);        StrBufAppendBufPlain(WCC->WBuf, general, strlen(general), 0);            end_tab(0, 9);
734         begin_tab(1, 9);        StrBufAppendBufPlain(WCC->WBuf, access, strlen(access), 0);              end_tab(1, 9);
735         begin_tab(2, 9);        StrBufAppendBufPlain(WCC->WBuf, network, strlen(network), 0);            end_tab(2, 9);
736         begin_tab(3, 9);        StrBufAppendBufPlain(WCC->WBuf, tuning, strlen(tuning), 0);              end_tab(3, 9);
737         begin_tab(4, 9);        StrBufAppendBufPlain(WCC->WBuf, directory, strlen(directory), 0);        end_tab(4, 9);
738         begin_tab(5, 9);        StrBufAppendBufPlain(WCC->WBuf, purger, strlen(purger), 0);              end_tab(5, 9);
739         begin_tab(6, 9);        StrBufAppendBufPlain(WCC->WBuf, idxjnl, strlen(idxjnl), 0);              end_tab(6, 9);
740         begin_tab(7, 9);        StrBufAppendBufPlain(WCC->WBuf, funambol, strlen(funambol), 0);  end_tab(7, 9);
741         begin_tab(8, 9);        StrBufAppendBufPlain(WCC->WBuf, pop3, strlen(pop3), 0);          end_tab(8, 9);
742         wprintf("<div class=\"tabcontent_submit\">");
743         wprintf("<input type=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Save changes"));
744         wprintf("&nbsp;");
745         wprintf("<input type=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n", _("Cancel"));
746         wprintf("</div></FORM>\n");
747         wprintf("</td></tr></table>\n");
748         wDumpContent(1);
749 }
750
751 /**
752  * parse siteconfig changes 
753  */
754 void siteconfig(void)
755 {
756         char buf[256];
757
758         if (strlen(bstr("ok_button")) == 0) {
759                 display_aide_menu();
760                 return;
761         }
762         serv_printf("CONF set");
763         serv_getln(buf, sizeof buf);
764         if (buf[0] != '4') {
765                 safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
766                 display_aide_menu();
767                 return;
768         }
769         serv_printf("%s", bstr("c_nodename"));
770         serv_printf("%s", bstr("c_fqdn"));
771         serv_printf("%s", bstr("c_humannode"));
772         serv_printf("%s", bstr("c_phonenum"));
773         serv_printf("%s", ((yesbstr("c_creataide") ? "1" : "0")));
774         serv_printf("%s", bstr("c_sleeping"));
775         serv_printf("%s", bstr("c_initax"));
776         serv_printf("%s", ((yesbstr("c_regiscall") ? "1" : "0")));
777         serv_printf("%s", ((yesbstr("c_twitdetect") ? "1" : "0")));
778         serv_printf("%s", bstr("c_twitroom"));
779         serv_printf("%s", bstr("c_moreprompt"));
780         serv_printf("%s", ((yesbstr("c_restrict") ? "1" : "0")));
781         serv_printf("%s", bstr("c_bbs_city"));
782         serv_printf("%s", bstr("c_sysadm"));
783         serv_printf("%s", bstr("c_maxsessions"));
784         serv_printf("");  /* placeholder - this field is not in use */
785         serv_printf("%s", bstr("c_userpurge"));
786         serv_printf("%s", bstr("c_roompurge"));
787         serv_printf("%s", bstr("c_logpages"));
788         serv_printf("%s", bstr("c_createax"));
789         serv_printf("%s", bstr("c_maxmsglen"));
790         serv_printf("%s", bstr("c_min_workers"));
791         serv_printf("%s", bstr("c_max_workers"));
792         serv_printf("%s", bstr("c_pop3_port"));
793         serv_printf("%s", bstr("c_smtp_port"));
794         serv_printf("%s", ((yesbstr("c_rfc822_strict_from") ? "0" : "1"))); /* note: reverse bool */
795         serv_printf("%s", ((yesbstr("c_aide_zap") ? "1" : "0")));
796         serv_printf("%s", bstr("c_imap_port"));
797         serv_printf("%s", bstr("c_net_freq"));
798         serv_printf("%s", ((yesbstr("c_disable_newu") ? "1" : "0")));
799         serv_printf("1"); /* placeholder - this field is not in use */
800         serv_printf("%s", bstr("c_purge_hour"));
801         serv_printf("%s", bstr("c_ldap_host"));
802         serv_printf("%s", bstr("c_ldap_port"));
803         serv_printf("%s", bstr("c_ldap_base_dn"));
804         serv_printf("%s", bstr("c_ldap_bind_dn"));
805         serv_printf("%s", bstr("c_ldap_bind_pw"));
806         serv_printf("%s", bstr("c_ip_addr"));
807         serv_printf("%s", bstr("c_msa_port"));
808         serv_printf("%s", bstr("c_imaps_port"));
809         serv_printf("%s", bstr("c_pop3s_port"));
810         serv_printf("%s", bstr("c_smtps_port"));
811         serv_printf("%s", ((yesbstr("c_enable_fulltext") ? "1" : "0")));
812         serv_printf("%s", ((yesbstr("c_auto_cull") ? "1" : "0")));
813         serv_printf("%s", ((yesbstr("c_instant_expunge") ? "1" : "0")));
814         serv_printf("%s", ((yesbstr("c_allow_spoofing") ? "1" : "0")));
815         serv_printf("%s", ((yesbstr("c_journal_email") ? "1" : "0")));
816         serv_printf("%s", ((yesbstr("c_journal_pubmsgs") ? "1" : "0")));
817         serv_printf("%s", bstr("c_journal_dest"));
818         serv_printf("%s", bstr("c_default_cal_zone"));
819         serv_printf("%s", bstr("c_pftcpdict_port"));
820         serv_printf("%s", bstr("c_mgesve_port"));
821         serv_printf("%s", bstr("c_auth_mode"));
822         serv_printf("%s", bstr("c_funambol_host"));
823         serv_printf("%s", bstr("c_funambol_port"));
824         serv_printf("%s", bstr("c_funambol_source"));
825         serv_printf("%s", bstr("c_funambol_auth"));
826         serv_printf("%s", ((yesbstr("c_rbl_at_greeting") ? "1" : "0")));
827         serv_printf("%s", bstr("c_master_user"));
828         serv_printf("%s", bstr("c_master_pass"));
829         serv_printf("%s", bstr("c_pager_program"));
830         serv_printf("%s", ((yesbstr("c_imap_keep_from") ? "1" : "0")));
831         serv_printf("%s", bstr("c_xmpp_c2s_port"));
832         serv_printf("%s", bstr("c_xmpp_s2s_port"));
833         serv_printf("%s", bstr("c_pop3_fetch"));
834         serv_printf("%s", bstr("c_pop3_fastest"));
835         serv_printf("000");
836
837         serv_printf("SPEX site|%d|%d", ibstr("sitepolicy"), ibstr("sitevalue"));
838         serv_getln(buf, sizeof buf);
839         serv_printf("SPEX mailboxes|%d|%d", ibstr("mboxpolicy"), ibstr("mboxvalue"));
840         serv_getln(buf, sizeof buf);
841
842         strcpy(serv_info.serv_default_cal_zone, bstr("c_default_cal_zone"));
843
844         safestrncpy(WC->ImportantMessage, _("Your system configuration has been updated."),
845                 sizeof WC->ImportantMessage);
846         display_aide_menu();
847 }
848
849 void 
850 InitModule_SITECONFIG
851 (void)
852 {
853         WebcitAddUrlHandler(HKEY("display_siteconfig"), display_siteconfig, 0);
854         WebcitAddUrlHandler(HKEY("siteconfig"), siteconfig, 0);
855 }
856 /*@}*/