4 * Administrative screen for site-wide configuration
12 HashList *ZoneHash = NULL;
16 void LoadZoneFiles(void)
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);
38 SortByHashKey(ZoneHash, 0);
45 * \brief display all configuration items
47 void display_siteconfig(void)
51 struct wcsession *WCC = WC;
64 /** expire policy settings */
70 output_headers(1, 1, 2, 0, 0, 0);
71 wprintf("<div id=\"banner\">\n");
73 wprintf(_("Site configuration"));
77 wprintf("<div id=\"content\" class=\"service fix_scrollbar_bug\">\n");
79 serv_printf("CONF get");
80 serv_getln(buf, sizeof buf);
82 wprintf("<div class=\"errormsg\">");
85 wprintf("%s<br />\n", &buf[4]);
91 wprintf("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" ><tr><td>");
100 _("Indexing/Journaling"),
105 sprintf(general, "<center><h1>%s</h1><table border=\"0\">",
106 _("General site configuration items")
109 sprintf(access, "<center><h1>%s</h1><table border=\"0\">",
110 _("Access controls and site policy settings")
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.")
119 sprintf(tuning, "<center><h1>%s</h1><table border=\"0\">",
120 _("Advanced server fine-tuning controls")
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.")
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.")
138 sprintf(idxjnl, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
139 _("Indexing and Journaling"),
140 _("Warning: these facilities are resource intensive.")
142 sprintf(funambol, "<center><h1>%s</h1><table border=\"0\">",
146 sprintf(pop3, "<center><h1>%s</h1><table border=\"0\">",
150 wprintf("<form method=\"post\" action=\"siteconfig\">\n");
151 wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WCC->nonce);
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"));
157 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
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");
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");
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");
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");
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");
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");
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" : ""),
213 sprintf(&access[strlen(access)], "</select>");
214 sprintf(&access[strlen(access)], "</td></tr>\n");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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" : ""),
307 sprintf(&access[strlen(access)], "</select>");
308 sprintf(&access[strlen(access)], "</td></tr>\n");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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" : ""),
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")
396 sprintf(&purger[strlen(purger)], "</SELECT>");
397 sprintf(&purger[strlen(purger)], "</TD></TR>\n");
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");
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");
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");
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");
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\">",
433 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
526 if (strlen(buf) == 0) {
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");
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);
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" : ""),
567 sprintf(&general[strlen(general)], "</select>");
568 sprintf(&general[strlen(general)], "</TD></TR>\n");
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");
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");
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",
589 ((atoi(buf) != 0) ? "Yes" : "No"));
590 sprintf(&access[strlen(access)], "</TD></TR>\n");
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");
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");
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");
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");
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");
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");
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\">",
641 sprintf(&directory[strlen(directory)], "</TD></TR>\n");
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");
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");
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");
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");
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");
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");
691 serv_puts("GPEX site");
692 serv_getln(buf, sizeof buf);
694 sitepolicy = extract_int(&buf[4], 0);
695 sitevalue = extract_int(&buf[4], 1);
698 serv_puts("GPEX mailboxes");
699 serv_getln(buf, sizeof buf);
701 mboxpolicy = extract_int(&buf[4], 0);
702 mboxvalue = extract_int(&buf[4], 1);
706 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
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");
727 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
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");
752 sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
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>");
765 tabbed_dialog(9, tabnames);
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"));
779 wprintf("<input type=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n", _("Cancel"));
780 wprintf("</div></FORM>\n");
781 wprintf("</td></tr></table>\n");
786 * parse siteconfig changes
788 void siteconfig(void)
792 if (strlen(bstr("ok_button")) == 0) {
796 serv_printf("CONF set");
797 serv_getln(buf, sizeof buf);
799 safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
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"));
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);
876 strcpy(serv_info.serv_default_cal_zone, bstr("c_default_cal_zone"));
878 safestrncpy(WC->ImportantMessage, _("Your system configuration has been updated."),
879 sizeof WC->ImportantMessage);
884 InitModule_SITECONFIG
887 WebcitAddUrlHandler(HKEY("display_siteconfig"), display_siteconfig, 0);
888 WebcitAddUrlHandler(HKEY("siteconfig"), siteconfig, 0);