5 * \defgroup AdminConfig Administrative screen for site-wide configuration
6 * \ingroup CitadelConfig
11 #include "webserver.h"
14 * \brief display all configuration items
16 void display_siteconfig(void)
29 /** expire policy settings */
35 output_headers(1, 1, 2, 0, 0, 0);
36 wprintf("<div id=\"banner\">\n"
37 "<table class=\"siteconfig_banner\"><tr><td>"
38 "<span class=\"titlebar\">");
39 wprintf(_("Site configuration"));
41 "</td></tr></table>\n"
42 "</div>\n<div id=\"content\">\n"
45 serv_printf("CONF get");
46 serv_getln(buf, sizeof buf);
48 wprintf("<table class=\"siteconfig_banner\"><tr><td>");
49 wprintf("<span class=\"titlebar\">");
52 wprintf("</td></tr></table><br />\n");
53 wprintf("%s<br />\n", &buf[4]);
58 wprintf("<div class=\"fix_scrollbar_bug\">"
59 "<table class=\"siteconfig_background\"><tr><td>");
68 _("Indexing/Journaling"),
72 sprintf(general, "<center><h1>%s</h1><table border=\"0\">",
73 _("General site configuration items")
76 sprintf(access, "<center><h1>%s</h1><table border=\"0\">",
77 _("Access controls and site policy settings")
80 sprintf(network, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
81 _("Network services"),
82 _("Changes made on this screen will not take effect "
83 "until you restart the Citadel server.")
86 sprintf(tuning, "<center><h1>%s</h1><table border=\"0\">",
87 _("Advanced server fine-tuning controls")
90 sprintf(directory, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
91 _("Configure the LDAP connector for Citadel"),
92 (serv_info.serv_supports_ldap
93 ? _("Changes made on this screen will not take effect "
94 "until you restart the Citadel server.")
95 : _("NOTE: This Citadel server has been built without "
96 "LDAP support. These options will have no effect.")
100 sprintf(purger, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
101 _("Configure automatic expiry of old messages"),
102 _("These settings may be overridden on a per-floor or per-room basis.")
105 sprintf(idxjnl, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
106 _("Indexing and Journaling"),
107 _("Warning: these facilities are resource intensive.")
109 sprintf(funambol, "<center><h1>%s</h1><table border=\"0\">",
113 wprintf("<form method=\"post\" action=\"siteconfig\">\n");
114 wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
117 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
120 sprintf(&general[strlen(general)], "<tr><td>");
121 sprintf(&general[strlen(general)], _("Node name"));
122 sprintf(&general[strlen(general)], "</td><td>");
123 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_nodename\" maxlength=\"15\" value=\"%s\">", buf);
124 sprintf(&general[strlen(general)], "</td></tr>\n");
127 sprintf(&general[strlen(general)], "<tr><td>");
128 sprintf(&general[strlen(general)], _("Fully qualified domain name"));
129 sprintf(&general[strlen(general)], "</td><td>");
130 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_fqdn\" maxlength=\"63\" value=\"%s\">", buf);
131 sprintf(&general[strlen(general)], "</td></tr>\n");
134 sprintf(&general[strlen(general)], "<tr><td>");
135 sprintf(&general[strlen(general)], _("Human-readable node name"));
136 sprintf(&general[strlen(general)], "</td><td>");
137 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_humannode\" maxlength=\"20\" value=\"%s\">", buf);
138 sprintf(&general[strlen(general)], "</td></tr>\n");
141 sprintf(&general[strlen(general)], "<tr><td>");
142 sprintf(&general[strlen(general)], _("Telephone number"));
143 sprintf(&general[strlen(general)], "</td><td>");
144 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_phonenum\" maxlength=\"15\" value=\"%s\">", buf);
145 sprintf(&general[strlen(general)], "</td></tr>\n");
148 sprintf(&access[strlen(access)], "<tr><td>");
149 sprintf(&access[strlen(access)], _("Automatically grant room-aide status to users who create private rooms"));
150 sprintf(&access[strlen(access)], "</td><td>");
151 sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_creataide\" value=\"yes\" %s>",
152 ((atoi(buf) != 0) ? "checked" : ""));
153 sprintf(&access[strlen(access)], "</td></tr>\n");
156 sprintf(&tuning[strlen(tuning)], "<tr><td>");
157 sprintf(&tuning[strlen(tuning)], _("Server connection idle timeout (in seconds)"));
158 sprintf(&tuning[strlen(tuning)], "</td><td>");
159 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_sleeping\" maxlength=\"15\" value=\"%s\">", buf);
160 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
163 sprintf(&access[strlen(access)], "<tr><td>");
164 sprintf(&access[strlen(access)], _("Initial access level for new users"));
165 sprintf(&access[strlen(access)], "</td><td>");
166 sprintf(&access[strlen(access)], "<select name=\"c_initax\" size=\"1\">\n");
167 for (j=0; j<=6; ++j) {
168 sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
169 ((atoi(buf) == j) ? "selected" : ""),
173 sprintf(&access[strlen(access)], "</select>");
174 sprintf(&access[strlen(access)], "</td></tr>\n");
177 sprintf(&access[strlen(access)], "<tr><td>");
178 sprintf(&access[strlen(access)], _("Require registration for new users"));
179 sprintf(&access[strlen(access)], "</td><td>");
180 sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_regiscall\" value=\"yes\" %s>",
181 ((atoi(buf) != 0) ? "checked" : ""));
182 sprintf(&access[strlen(access)], "</td></tr>\n");
185 sprintf(&access[strlen(access)], "<tr><td>");
186 sprintf(&access[strlen(access)], _("Quarantine messages from problem users"));
187 sprintf(&access[strlen(access)], "</td><td>");
188 sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_twitdetect\" value=\"yes\" %s>",
189 ((atoi(buf) != 0) ? "checked" : ""));
190 sprintf(&access[strlen(access)], "</td></tr>\n");
193 sprintf(&access[strlen(access)], "<tr><td>");
194 sprintf(&access[strlen(access)], _("Name of quarantine room"));
195 sprintf(&access[strlen(access)], "</td><td>");
196 sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_twitroom\" maxlength=\"63\" value=\"%s\">", buf);
197 sprintf(&access[strlen(access)], "</td></tr>\n");
200 sprintf(&general[strlen(general)], "<tr><td>");
201 sprintf(&general[strlen(general)], _("Paginator prompt (for text mode clients)"));
202 sprintf(&general[strlen(general)], "</td><td>");
203 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_moreprompt\" maxlength=\"79\" value=\"%s\">", buf);
204 sprintf(&general[strlen(general)], "</td></tr>\n");
207 sprintf(&access[strlen(access)], "<tr><td>");
208 sprintf(&access[strlen(access)], _("Restrict access to Internet mail"));
209 sprintf(&access[strlen(access)], "</td><td>");
210 sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_restrict\" value=\"yes\" %s>",
211 ((atoi(buf) != 0) ? "checked" : ""));
212 sprintf(&access[strlen(access)], "</td></tr>\n");
215 sprintf(&general[strlen(general)], "<tr><td>");
216 sprintf(&general[strlen(general)], _("Geographic location of this system"));
217 sprintf(&general[strlen(general)], "</td><td>");
218 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_bbs_city\" maxlength=\"31\" value=\"%s\">", buf);
219 sprintf(&general[strlen(general)], "</td></tr>\n");
222 sprintf(&general[strlen(general)], "<tr><td>");
223 sprintf(&general[strlen(general)], _("Name of system administrator"));
224 sprintf(&general[strlen(general)], "</td><td>");
225 sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_sysadm\" MAXLENGTH=\"25\" VALUE=\"%s\">", buf);
226 sprintf(&general[strlen(general)], "</td></tr>\n");
229 sprintf(&tuning[strlen(tuning)], "<tr><td>");
230 sprintf(&tuning[strlen(tuning)], _("Maximum concurrent sessions (0 = no limit)"));
231 sprintf(&tuning[strlen(tuning)], "</td><td>");
232 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxsessions\" maxlength=\"5\" value=\"%s\">", buf);
233 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
236 sprintf(&tuning[strlen(tuning)], "<tr><td>");
237 sprintf(&tuning[strlen(tuning)], _("Default user purge time (days)"));
238 sprintf(&tuning[strlen(tuning)], "</td><td>");
239 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_userpurge\" maxlength=\"5\" value=\"%s\">", buf);
240 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
243 sprintf(&tuning[strlen(tuning)], "<tr><td>");
244 sprintf(&tuning[strlen(tuning)], _("Default room purge time (days)"));
245 sprintf(&tuning[strlen(tuning)], "</td><td>");
246 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_roompurge\" maxlength=\"5\" value=\"%s\">", buf);
247 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
250 sprintf(&access[strlen(access)], "<tr><td>");
251 sprintf(&access[strlen(access)], _("Name of room to log pages"));
252 sprintf(&access[strlen(access)], "</td><td>");
253 sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_logpages\" maxlength=\"63\" value=\"%s\">", buf);
254 sprintf(&access[strlen(access)], "</td></tr>\n");
257 sprintf(&access[strlen(access)], "<tr><td>");
258 sprintf(&access[strlen(access)], _("Access level required to create rooms"));
259 sprintf(&access[strlen(access)], "</td><td>");
260 sprintf(&access[strlen(access)], "<select name=\"c_createax\" size=\"1\">\n");
261 for (j=0; j<=6; ++j) {
262 sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
263 ((atoi(buf) == j) ? "selected" : ""),
267 sprintf(&access[strlen(access)], "</select>");
268 sprintf(&access[strlen(access)], "</td></tr>\n");
271 sprintf(&tuning[strlen(tuning)], "<tr><td>");
272 sprintf(&tuning[strlen(tuning)], _("Maximum message length"));
273 sprintf(&tuning[strlen(tuning)], "</td><td>");
274 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxmsglen\" maxlength=\"20\" value=\"%s\">", buf);
275 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
278 sprintf(&tuning[strlen(tuning)], "<tr><td>");
279 sprintf(&tuning[strlen(tuning)], _("Minimum number of worker threads"));
280 sprintf(&tuning[strlen(tuning)], "</td><td>");
281 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_min_workers\" maxlength=\"5\" value=\"%s\">", buf);
282 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
285 sprintf(&tuning[strlen(tuning)], "<tr><td>");
286 sprintf(&tuning[strlen(tuning)], _("Maximum number of worker threads"));
287 sprintf(&tuning[strlen(tuning)], "</td><td>");
288 sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_max_workers\" maxlength=\"5\" value=\"%s\">", buf);
289 sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
292 sprintf(&network[strlen(network)], "<tr><td>");
293 sprintf(&network[strlen(network)], _("POP3 listener port (-1 to disable)"));
294 sprintf(&network[strlen(network)], "</td><td>");
295 sprintf(&network[strlen(network)], "<input type=\"text\" name=\"c_pop3_port\" maxlength=\"5\" value=\"%s\">", buf);
296 sprintf(&network[strlen(network)], "</TD></TR>\n");
299 sprintf(&network[strlen(network)], "<TR><TD>");
300 sprintf(&network[strlen(network)], _("SMTP MTA port (-1 to disable)"));
301 sprintf(&network[strlen(network)], "</TD><TD>");
302 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtp_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
303 sprintf(&network[strlen(network)], "</TD></TR>\n");
305 case 25: /* note: reverse bool */
306 sprintf(&network[strlen(network)], "<TR><TD>");
307 sprintf(&network[strlen(network)], _("Correct forged From: lines during authenticated SMTP"));
308 sprintf(&network[strlen(network)], "</TD><TD>");
309 sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_rfc822_strict_from\" VALUE=\"yes\" %s>",
310 ((atoi(buf) == 0) ? "CHECKED" : ""));
311 sprintf(&network[strlen(network)], "</TD></TR>\n");
314 sprintf(&access[strlen(access)], "<TR><TD>");
315 sprintf(&access[strlen(access)], _("Allow aides to zap (forget) rooms"));
316 sprintf(&access[strlen(access)], "</TD><TD>");
317 sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_aide_zap\" VALUE=\"yes\" %s>",
318 ((atoi(buf) != 0) ? "CHECKED" : ""));
319 sprintf(&access[strlen(access)], "</TD></TR>\n");
322 sprintf(&network[strlen(network)], "<TR><TD>");
323 sprintf(&network[strlen(network)], _("IMAP listener port (-1 to disable)"));
324 sprintf(&network[strlen(network)], "</TD><TD>");
325 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imap_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
326 sprintf(&network[strlen(network)], "</TD></TR>\n");
329 sprintf(&network[strlen(network)], "<TR><TD>");
330 sprintf(&network[strlen(network)], _("Network run frequency (in seconds)"));
331 sprintf(&network[strlen(network)], "</TD><TD>");
332 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_net_freq\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
333 sprintf(&network[strlen(network)], "</TD></TR>\n");
336 sprintf(&access[strlen(access)], "<TR><TD>");
337 sprintf(&access[strlen(access)], _("Disable self-service user account creation"));
338 sprintf(&access[strlen(access)], "</TD><TD>");
339 sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_disable_newu\" VALUE=\"yes\" %s>",
340 ((atoi(buf) != 0) ? "CHECKED" : ""));
341 sprintf(&access[strlen(access)], "</TD></TR>\n");
344 sprintf(&purger[strlen(purger)], "<TR><TD>");
345 sprintf(&purger[strlen(purger)], _("Hour to run database auto-purge"));
346 sprintf(&purger[strlen(purger)], "</TD><TD>");
347 sprintf(&purger[strlen(purger)], "<SELECT NAME=\"c_purge_hour\" SIZE=\"1\">\n");
348 for (j=0; j<=23; ++j) {
349 sprintf(&purger[strlen(purger)], "<OPTION %s VALUE=\"%d\">%d:00%s</OPTION>\n",
350 ((atoi(buf) == j) ? "SELECTED" : ""),
352 ((j == 0) ? 12 : ((j>12) ? j-12 : j)),
353 ((j >= 12) ? "pm" : "am")
356 sprintf(&purger[strlen(purger)], "</SELECT>");
357 sprintf(&purger[strlen(purger)], "</TD></TR>\n");
360 sprintf(&directory[strlen(directory)], "<TR><TD>");
361 sprintf(&directory[strlen(directory)], _("Host name of LDAP server (blank to disable)"));
362 sprintf(&directory[strlen(directory)], "</TD><TD>");
363 sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_host\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
364 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
367 sprintf(&directory[strlen(directory)], "<TR><TD>");
368 sprintf(&directory[strlen(directory)], _("Port number of LDAP server (blank to disable)"));
369 sprintf(&directory[strlen(directory)], "</TD><TD>");
370 sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_port\" MAXLENGTH=\"127\" VALUE=\"%d\">", atoi(buf));
371 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
374 sprintf(&directory[strlen(directory)], "<TR><TD>");
375 sprintf(&directory[strlen(directory)], _("Base DN"));
376 sprintf(&directory[strlen(directory)], "</TD><TD>");
377 sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_base_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
378 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
381 sprintf(&directory[strlen(directory)], "<TR><TD>");
382 sprintf(&directory[strlen(directory)], _("Bind DN"));
383 sprintf(&directory[strlen(directory)], "</TD><TD>");
384 sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_bind_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
385 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
388 sprintf(&directory[strlen(directory)], "<TR><TD>");
389 sprintf(&directory[strlen(directory)], _("Password for bind DN"));
390 sprintf(&directory[strlen(directory)], "</TD><TD>");
391 sprintf(&directory[strlen(directory)], "<input type=\"password\" NAME=\"c_ldap_bind_pw\" MAXLENGTH=\"255\" VALUE=\"%s\">",
393 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
396 sprintf(&network[strlen(network)], "<TR><TD>");
397 sprintf(&network[strlen(network)], _("Server IP address (0.0.0.0 for 'any')"));
398 sprintf(&network[strlen(network)], "</TD><TD>");
399 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_ip_addr\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
400 sprintf(&network[strlen(network)], "</TD></TR>\n");
403 sprintf(&network[strlen(network)], "<TR><TD>");
404 sprintf(&network[strlen(network)], _("SMTP MSA port (-1 to disable)"));
405 sprintf(&network[strlen(network)], "</TD><TD>");
406 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_msa_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
407 sprintf(&network[strlen(network)], "</TD></TR>\n");
410 sprintf(&network[strlen(network)], "<TR><TD>");
411 sprintf(&network[strlen(network)], _("IMAP over SSL port (-1 to disable)"));
412 sprintf(&network[strlen(network)], "</TD><TD>");
413 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imaps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
414 sprintf(&network[strlen(network)], "</TD></TR>\n");
417 sprintf(&network[strlen(network)], "<TR><TD>");
418 sprintf(&network[strlen(network)], _("POP3 over SSL port (-1 to disable)"));
419 sprintf(&network[strlen(network)], "</TD><TD>");
420 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_pop3s_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
421 sprintf(&network[strlen(network)], "</TD></TR>\n");
424 sprintf(&network[strlen(network)], "<TR><TD>");
425 sprintf(&network[strlen(network)], _("SMTP over SSL port (-1 to disable)"));
426 sprintf(&network[strlen(network)], "</TD><TD>");
427 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
428 sprintf(&network[strlen(network)], "</TD></TR>\n");
431 sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
432 sprintf(&idxjnl[strlen(idxjnl)], _("Enable full text index"));
433 sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
434 sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_enable_fulltext\" VALUE=\"yes\" %s>",
435 ((atoi(buf) != 0) ? "CHECKED" : ""));
436 sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
439 sprintf(&tuning[strlen(tuning)], "<TR><TD>");
440 sprintf(&tuning[strlen(tuning)], _("Automatically delete committed database logs"));
441 sprintf(&tuning[strlen(tuning)], "</TD><TD>");
442 sprintf(&tuning[strlen(tuning)], "<input type=\"checkbox\" NAME=\"c_auto_cull\" VALUE=\"yes\" %s>",
443 ((atoi(buf) != 0) ? "CHECKED" : ""));
444 sprintf(&tuning[strlen(tuning)], "</TD></TR>\n");
447 sprintf(&network[strlen(network)], "<TR><TD>");
448 sprintf(&network[strlen(network)], _("Instantly expunge deleted messages in IMAP"));
449 sprintf(&network[strlen(network)], "</TD><TD>");
450 sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_instant_expunge\" VALUE=\"yes\" %s>",
451 ((atoi(buf) != 0) ? "CHECKED" : ""));
452 sprintf(&network[strlen(network)], "</TD></TR>\n");
455 sprintf(&network[strlen(network)], "<TR><TD>");
456 sprintf(&network[strlen(network)], _("Allow unauthenticated SMTP clients to spoof this site's domains"));
457 sprintf(&network[strlen(network)], "</TD><TD>");
458 sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_allow_spoofing\" VALUE=\"yes\" %s>",
459 ((atoi(buf) != 0) ? "CHECKED" : ""));
460 sprintf(&network[strlen(network)], "</TD></TR>\n");
463 sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
464 sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of email messages"));
465 sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
466 sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_email\" VALUE=\"yes\" %s>",
467 ((atoi(buf) != 0) ? "CHECKED" : ""));
468 sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
471 sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
472 sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of non-email messages"));
473 sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
474 sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_pubmsgs\" VALUE=\"yes\" %s>",
475 ((atoi(buf) != 0) ? "CHECKED" : ""));
476 sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
479 sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
480 sprintf(&idxjnl[strlen(idxjnl)], _("Email destination of journalized messages"));
481 sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
482 sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"text\" NAME=\"c_journal_dest\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
483 sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
486 if (strlen(buf) == 0) {
489 #ifdef WEBCIT_WITH_CALENDAR_SERVICE
490 sprintf(&general[strlen(general)], "<TR><TD>");
491 sprintf(&general[strlen(general)], _("Default timezone for unzoned calendar items"));
492 sprintf(&general[strlen(general)], "</TD><TD>");
493 sprintf(&general[strlen(general)], "<select name=\"c_default_cal_zone\" size=\"1\">\n");
495 sprintf(&general[strlen(general)], "<option %s value=\"UTC\">UTC</option>\n",
496 (!strcasecmp(buf, "UTC") ? "selected" : "")
502 zones = icaltimezone_get_builtin_timezones();
503 for (z = 0; z < zones->num_elements; ++z) {
504 strcpy(this_zone, icaltimezone_get_location(icalarray_element_at(zones, z)));
505 sprintf(&general[strlen(general)], "<option %s value=\"%s\">%s</option>\n",
506 (!strcasecmp(this_zone, buf) ? "selected" : ""),
511 sprintf(&general[strlen(general)], "</select>");
512 sprintf(&general[strlen(general)], "</TD></TR>\n");
513 #else /* WEBCIT_WITH_CALENDAR_SERVICE */
514 wprintf("<input type=\"hidden\" name=\"c_default_cal_zone\" value=\"%s\">\n", buf);
515 #endif /* WEBCIT_WITH_CALENDAR_SERVICE */
518 sprintf(&network[strlen(network)], "<TR><TD>");
519 sprintf(&network[strlen(network)], _("<a href=\"http://www.postfix.org/tcp_table.5.html\">Postfix TCP Dictionary Port </a> (-1 to disable)"));
520 sprintf(&network[strlen(network)], "</TD><TD>");
521 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_pftcpdict_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
522 sprintf(&network[strlen(network)], "</TD></TR>\n");
525 sprintf(&network[strlen(network)], "<TR><TD>");
526 sprintf(&network[strlen(network)], _("ManageSieve Port (-1 to disable)"));
527 sprintf(&network[strlen(network)], "</TD><TD>");
528 sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_mgesve_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
529 sprintf(&network[strlen(network)], "</TD></TR>\n");
532 sprintf(&access[strlen(access)], "<TR><TD>");
533 sprintf(&access[strlen(access)], _("Enable host based authentication mode"));
534 sprintf(&access[strlen(access)], "</TD><TD><input type=\"checkbox\" NAME=\"c_auth_mode\" VALUE=\"yes\" DISABLED %s>",
535 ((atoi(buf) != 0) ? "CHECKED" : ""));
536 sprintf(&access[strlen(access)], "</TD></TR>\n");
539 sprintf(&funambol[strlen(funambol)], "<TR><TD>");
540 sprintf(&funambol[strlen(funambol)], _("Funambol server host (blank to disable)"));
541 sprintf(&funambol[strlen(funambol)], "</TD><TD>");
542 sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_host\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
543 sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
546 sprintf(&funambol[strlen(funambol)], "<TR><TD>");
547 sprintf(&funambol[strlen(funambol)], _("Funambol server port "));
548 sprintf(&funambol[strlen(funambol)], "</TD><TD>");
549 sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
550 sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
553 sprintf(&funambol[strlen(funambol)], "<TR><TD>");
554 sprintf(&funambol[strlen(funambol)], _("Funambol sync source"));
555 sprintf(&funambol[strlen(funambol)], "</TD><TD>");
556 sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_source\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
557 sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
560 sprintf(&funambol[strlen(funambol)], "<TR><TD>");
561 sprintf(&funambol[strlen(funambol)], _("Funambol auth details (user:pass in Base64)"));
562 sprintf(&funambol[strlen(funambol)], "</TD><TD>");
563 sprintf(&funambol[strlen(funambol)], "<input type=\"text\" NAME=\"c_funambol_auth\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
564 sprintf(&funambol[strlen(funambol)], "</TD></TR>\n");
570 serv_puts("GPEX site");
571 serv_getln(buf, sizeof buf);
573 sitepolicy = extract_int(&buf[4], 0);
574 sitevalue = extract_int(&buf[4], 1);
577 serv_puts("GPEX mailboxes");
578 serv_getln(buf, sizeof buf);
580 mboxpolicy = extract_int(&buf[4], 0);
581 mboxvalue = extract_int(&buf[4], 1);
585 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
587 sprintf(&purger[strlen(purger)], "<TR><TD>");
588 sprintf(&purger[strlen(purger)], _("Default message expire policy for public rooms"));
589 sprintf(&purger[strlen(purger)], "</TD><TD>");
590 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"1\" %s>",
591 ((sitepolicy == 1) ? "CHECKED" : "") );
592 sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
593 sprintf(&purger[strlen(purger)], "<br />\n");
594 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"2\" %s>",
595 ((sitepolicy == 2) ? "CHECKED" : "") );
596 sprintf(&purger[strlen(purger)], _("Expire by message count"));
597 sprintf(&purger[strlen(purger)], "<br />\n");
598 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"3\" %s>",
599 ((sitepolicy == 3) ? "CHECKED" : "") );
600 sprintf(&purger[strlen(purger)], _("Expire by message age"));
601 sprintf(&purger[strlen(purger)], "<br />");
602 sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
603 sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"sitevalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", sitevalue);
604 sprintf(&purger[strlen(purger)], "</TD></TR>\n");
606 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
608 sprintf(&purger[strlen(purger)], "<TR><TD>");
609 sprintf(&purger[strlen(purger)], _("Default message expire policy for private mailboxes"));
610 sprintf(&purger[strlen(purger)], "</TD><TD>");
611 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"0\" %s>",
612 ((mboxpolicy == 0) ? "CHECKED" : "") );
613 sprintf(&purger[strlen(purger)], _("Same policy as public rooms"));
614 sprintf(&purger[strlen(purger)], "<br />\n");
615 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"1\" %s>",
616 ((mboxpolicy == 1) ? "CHECKED" : "") );
617 sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
618 sprintf(&purger[strlen(purger)], "<br />\n");
619 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"2\" %s>",
620 ((mboxpolicy == 2) ? "CHECKED" : "") );
621 sprintf(&purger[strlen(purger)], _("Expire by message count"));
622 sprintf(&purger[strlen(purger)], "<br />\n");
623 sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"3\" %s>",
624 ((mboxpolicy == 3) ? "CHECKED" : "") );
625 sprintf(&purger[strlen(purger)], _("Expire by message age"));
626 sprintf(&purger[strlen(purger)], "<br />");
627 sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
628 sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"mboxvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", mboxvalue);
629 sprintf(&purger[strlen(purger)], "</TD></TR>\n");
631 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
634 sprintf(&general[strlen(general)], "</table>");
635 sprintf(&access[strlen(access)], "</table>");
636 sprintf(&network[strlen(network)], "</table>");
637 sprintf(&tuning[strlen(tuning)], "</table>");
638 sprintf(&directory[strlen(directory)], "</table>");
639 sprintf(&purger[strlen(purger)], "</table>");
640 sprintf(&idxjnl[strlen(idxjnl)], "</table>");
641 sprintf(&funambol[strlen(funambol)], "</table>");
643 tabbed_dialog(8, tabnames);
645 begin_tab(0, 8); client_write(general, strlen(general)); end_tab(0, 8);
646 begin_tab(1, 8); client_write(access, strlen(access)); end_tab(1, 8);
647 begin_tab(2, 8); client_write(network, strlen(network)); end_tab(2, 8);
648 begin_tab(3, 8); client_write(tuning, strlen(tuning)); end_tab(3, 8);
649 begin_tab(4, 8); client_write(directory, strlen(directory)); end_tab(4, 8);
650 begin_tab(5, 8); client_write(purger, strlen(purger)); end_tab(5, 8);
651 begin_tab(6, 8); client_write(idxjnl, strlen(idxjnl)); end_tab(6, 8);
652 begin_tab(7, 8); client_write(funambol, strlen(funambol)); end_tab(7, 8);
653 wprintf("<div align=\"center\"><br>");
654 wprintf("<input type=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Save changes"));
656 wprintf("<input type=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n", _("Cancel"));
657 wprintf("</div></FORM>\n");
658 wprintf("</td></tr></table></div>\n");
663 * parse siteconfig changes
665 void siteconfig(void)
669 if (strlen(bstr("ok_button")) == 0) {
673 serv_printf("CONF set");
674 serv_getln(buf, sizeof buf);
676 safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
680 serv_printf("%s", bstr("c_nodename"));
681 serv_printf("%s", bstr("c_fqdn"));
682 serv_printf("%s", bstr("c_humannode"));
683 serv_printf("%s", bstr("c_phonenum"));
684 serv_printf("%s", ((!strcasecmp(bstr("c_creataide"), "yes") ? "1" : "0")));
685 serv_printf("%s", bstr("c_sleeping"));
686 serv_printf("%s", bstr("c_initax"));
687 serv_printf("%s", ((!strcasecmp(bstr("c_regiscall"), "yes") ? "1" : "0")));
688 serv_printf("%s", ((!strcasecmp(bstr("c_twitdetect"), "yes") ? "1" : "0")));
689 serv_printf("%s", bstr("c_twitroom"));
690 serv_printf("%s", bstr("c_moreprompt"));
691 serv_printf("%s", ((!strcasecmp(bstr("c_restrict"), "yes") ? "1" : "0")));
692 serv_printf("%s", bstr("c_bbs_city"));
693 serv_printf("%s", bstr("c_sysadm"));
694 serv_printf("%s", bstr("c_maxsessions"));
695 serv_printf(""); /* placeholder - this field is not in use */
696 serv_printf("%s", bstr("c_userpurge"));
697 serv_printf("%s", bstr("c_roompurge"));
698 serv_printf("%s", bstr("c_logpages"));
699 serv_printf("%s", bstr("c_createax"));
700 serv_printf("%s", bstr("c_maxmsglen"));
701 serv_printf("%s", bstr("c_min_workers"));
702 serv_printf("%s", bstr("c_max_workers"));
703 serv_printf("%s", bstr("c_pop3_port"));
704 serv_printf("%s", bstr("c_smtp_port"));
705 serv_printf("%s", ((!strcasecmp(bstr("c_rfc822_strict_from"), "yes") ? "0" : "1"))); /* note: reverse bool */
706 serv_printf("%s", ((!strcasecmp(bstr("c_aide_zap"), "yes") ? "1" : "0")));
707 serv_printf("%s", bstr("c_imap_port"));
708 serv_printf("%s", bstr("c_net_freq"));
709 serv_printf("%s", ((!strcasecmp(bstr("c_disable_newu"), "yes") ? "1" : "0")));
710 serv_printf("1"); /* placeholder - this field is not in use */
711 serv_printf("%s", bstr("c_purge_hour"));
712 serv_printf("%s", bstr("c_ldap_host"));
713 serv_printf("%s", bstr("c_ldap_port"));
714 serv_printf("%s", bstr("c_ldap_base_dn"));
715 serv_printf("%s", bstr("c_ldap_bind_dn"));
716 serv_printf("%s", bstr("c_ldap_bind_pw"));
717 serv_printf("%s", bstr("c_ip_addr"));
718 serv_printf("%s", bstr("c_msa_port"));
719 serv_printf("%s", bstr("c_imaps_port"));
720 serv_printf("%s", bstr("c_pop3s_port"));
721 serv_printf("%s", bstr("c_smtps_port"));
722 serv_printf("%s", ((!strcasecmp(bstr("c_enable_fulltext"), "yes") ? "1" : "0")));
723 serv_printf("%s", ((!strcasecmp(bstr("c_auto_cull"), "yes") ? "1" : "0")));
724 serv_printf("%s", ((!strcasecmp(bstr("c_instant_expunge"), "yes") ? "1" : "0")));
725 serv_printf("%s", ((!strcasecmp(bstr("c_allow_spoofing"), "yes") ? "1" : "0")));
726 serv_printf("%s", ((!strcasecmp(bstr("c_journal_email"), "yes") ? "1" : "0")));
727 serv_printf("%s", ((!strcasecmp(bstr("c_journal_pubmsgs"), "yes") ? "1" : "0")));
728 serv_printf("%s", bstr("c_journal_dest"));
729 serv_printf("%s", bstr("c_default_cal_zone"));
730 serv_printf("%s", bstr("c_pftcpdict_port"));
731 serv_printf("%s", bstr("c_mgesve_port"));
732 serv_printf("%s", ((!strcasecmp(bstr("c_auth_mode"), "yes") ? "1" : "0")));
733 serv_printf("%s", bstr("c_funambol_host"));
734 serv_printf("%s", bstr("c_funambol_port"));
735 serv_printf("%s", bstr("c_funambol_source"));
736 serv_printf("%s", bstr("c_funambol_auth"));
739 serv_printf("SPEX site|%d|%d", atoi(bstr("sitepolicy")), atoi(bstr("sitevalue")));
740 serv_getln(buf, sizeof buf);
741 serv_printf("SPEX mailboxes|%d|%d", atoi(bstr("mboxpolicy")), atoi(bstr("mboxvalue")));
742 serv_getln(buf, sizeof buf);
744 strcpy(serv_info.serv_default_cal_zone, bstr("c_default_cal_zone"));
746 safestrncpy(WC->ImportantMessage, _("Your system configuration has been updated."),
747 sizeof WC->ImportantMessage);