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