* reduce log noise while running from the console with debug binaries; output_static will be as quiet as sslg too.
* add Filename and a copy of the whole token so we can output it in case of errors
* adjusted all error lprintfs in subst.c to deliver file, line, and a matching snippet of the token analyzed so the logfile helps finding bugs in templates.
* templated siteconfig allmost finished.
/** Begin parsing the request. */
#ifdef TECH_PREVIEW
if ((strncmp(req->line+4, "/sslg", 5) != 0) &&
+ (strncmp(req->line+4, "/static/", 8) != 0) &&
(strncmp(req->line+4, "/wholist_section", 16) != 0)) {
#endif
lprintf(5, "HTTP: %s\n", buf);
if (WCC->ServCfg == NULL)
load_siteconfig();
GetHash(WCC->ServCfg,
- Tokens->Params[0]->Start,
- Tokens->Params[0]->len,
+ Tokens->Params[2]->Start,
+ Tokens->Params[2]->len,
&vBuf);
if (vBuf == NULL) return 0;
Buf = (StrBuf*) vBuf;
- if (Tokens->nParameters == 1)
+ if (Tokens->nParameters == 3) {
return 1;
- else
- return (strcmp(Tokens->Params[0]->Start, ChrPtr(Buf)) == 0);
+ }
+ else if (Tokens->Params[3]->Type == TYPE_STR)
+ return (strcmp(Tokens->Params[3]->Start, ChrPtr(Buf)) == 0);
+ else return (StrTol(Buf) == Tokens->Params[3]->lvalue);
}
else return 0;
}
WebcitAddUrlHandler(HKEY("siteconfig"), siteconfig, 0);
RegisterNamespace("SERV:CFG", 1, 1, tmplput_servcfg);
- RegisterConditional(HKEY("COND:SERVCFG"), 1, ConditionalServCfg);
+ RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg);
}
/*@}*/
-<?=("head")>
-<?=("important_msg")>
-<?ICONBAR>
+<?=("head")><?=("important_msg")><?ICONBAR>
<div id="banner">
<h1><?_("Site configuration")></h1>
</div>
<div id="content" class="service fix_scrollbar_bug">
<?!("COND:AIDE", 1)><?_("You need to be aide to view this.")><?!("X", 1)>
<??("COND:AIDE", 2)>
+<table border="0" cellspacing="0" cellpadding="0" ><tr><td>
<form method="post" action="siteconfig">
<input type="hidden" name="nonce" value= '<?NONCE>'>
<?DOTABBED("subject_general", "tab_siteconfig_general",
"subject_autopurger", "tab_siteconfig_autopurger",
"subject_indexing", "tab_siteconfig_indexing",
"subject_pushmail", "tab_siteconfig_pushmail",
- "subject_pop3", "tab_siteconfig_pop3")>
+ "subject_pop3", "tab_siteconfig_pop3",
+ "", "submit_siteconfig")>
+</form>
+</td></tr></table>
<??("X", 2)>
</div>
<?=("trailing")>
<table border="0">
<tr><td><?_("Automatically grant room-aide status to users who create private rooms")></td><td>
-<input type="checkbox" name="c_creataide" value="yes" '<?SERV:CFG("c_creataide")>'>
-
-</td></tr>
+<input type="checkbox" name="c_creataide" value="yes" '<?SERV:CFG("c_creataide")>'></td></tr>
<tr><td><?_("Initial access level for new users")></td><td>
<select name="c_initax" size="1">
);
}
-->
-</select>
-</td></tr>
+</select></td></tr>
<tr><td><?_("Require registration for new users")></td><td>
-<input type="checkbox" name="c_regiscall" value="yes" <?%("COND:SERVCFG", 1, "c_regiscall", 1, "CHECKED", "")>>
-</td></tr>
-
+<input type="checkbox" name="c_regiscall" value="yes" <?%("COND:SERVCFG", 1, "c_regiscall", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("Quarantine messages from problem users")></td><td>
-<input type="checkbox" name="c_twitdetect" value="yes" <?%("COND:SERVCFG", 1, "c_twitdetect", 1, "CHECKED", "")>>
-</td></tr>
-
+<input type="checkbox" name="c_twitdetect" value="yes" <?%("COND:SERVCFG", 1, "c_twitdetect", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("Name of quarantine room")></td><td>
-<input type="text" name="c_twitroom" maxlength="63" value='<?SERV:CFG("c_twitroom")>'>
-</td></tr>
+<input type="text" name="c_twitroom" maxlength="63" value='<?SERV:CFG("c_twitroom")>'></td></tr>
<tr><td><?_("Restrict access to Internet mail")></td><td>
-<input type="checkbox" name="c_restrict" value="yes" <?%("COND:SERVCFG", 1, "c_restrict", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" name="c_restrict" value="yes" <?%("COND:SERVCFG", 1, "c_restrict", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("Name of room to log pages")></td><td>
-<input type="text" name="c_logpages" maxlength="63" value='<?SERV:CFG("c_logpages")>'>
-</td></tr>
-
+<input type="text" name="c_logpages" maxlength="63" value='<?SERV:CFG("c_logpages")>'></td></tr>
<tr><td><?_("Access level required to create rooms")></td><td>
<select name="c_createax" size="1">
);
}
-->
-</select>
-</td></tr>
+</select></td></tr>
<tr><td><?_("Allow aides to zap (forget) rooms")></td><td>
-<input type="checkbox" NAME="c_aide_zap" VALUE="yes" <?%("COND:SERVCFG", 1, "c_aide_zap", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" NAME="c_aide_zap" VALUE="yes" <?%("COND:SERVCFG", 1, "c_aide_zap", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("Disable self-service user account creation")></td><td>
-<input type="checkbox" NAME="c_disable_newu" VALUE="yes" <?%("COND:SERVCFG", 1, "c_disable_newu", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" NAME="c_disable_newu" VALUE="yes" <?%("COND:SERVCFG", 1, "c_disable_newu", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("Enable host based authentication mode")></td><td>
<input type="hidden" NAME="c_auth_mode" VALUE='<?%("COND:SERVCFG", 1, "c_auth_mode", 0, "'Yes'", "'No'")>'>
+<?!("COND:SERVCFG", 1, "c_auth_mode", 0)>
+<?_("Yes")>
+<?!("X", 1)>
+<??("COND:SERVCFG", 2, "c_auth_mode", 0)>
+<?_("No")>
+<??("X", 2)>
</td></tr>
<tr><td><?_("Master user name (blank to disable)")></td><td>
-<input type="text" NAME="c_master_user" MAXLENGTH="31" VALUE='<?SERV:CFG("c_master_user")>'>
-</td></tr>
-
+<input type="text" NAME="c_master_user" MAXLENGTH="31" VALUE='<?SERV:CFG("c_master_user")>'></td></tr>
<tr><td><?_("Master user password")></td><td>
-<input type="password" NAME="c_master_pass" MAXLENGTH="31" VALUE='<?SERV:CFG("c_master_pass")>'>
-</td></tr>
+<input type="password" NAME="c_master_pass" MAXLENGTH="31" VALUE='<?SERV:CFG("c_master_pass")>'></td></tr>
+
</table>
);
}
-->
-</select>
-</td></tr>
-<tr><TD COLSPAN=2>
+</select></td></tr>
+
+<tr><td COLSPAN=2>
<hr />
</td></tr>
-<tr><td>
-<?_("Default message expire policy for public rooms")>
-</td><td>
+
+<tr><td><?_("Default message expire policy for public rooms")></td><td>
<input type="radio" NAME="sitepolicy" VALUE="1" <?%("COND:SERVCFG", 1, "sitepolicy", 1, "CHECKED", "")>>
<?_("Never automatically expire messages")>
<br />
<input type="text" NAME="sitevalue" MAXLENGTH="5" VALUE='<?SERV:CFG("sitevalue")>'>
</td></tr>
-<tr><TD COLSPAN=2><hr /></td></tr>
+<tr><td COLSPAN=2><hr /></td></tr>
<tr><td><?_("Default message expire policy for private mailboxes")></td><td>
<input type="radio" NAME="mboxpolicy" VALUE="0" <?%("COND:SERVCFG", 1, "mboxpolicy", 0, "CHECKED", "")>>
<input type="text" NAME="mboxvalue" MAXLENGTH="5" VALUE='<?SERV:CFG("mboxvalue")>'>
</td></tr>
-<tr><TD COLSPAN=2><hr /></td></tr>
+<tr><td COLSPAN=2><hr /></td></tr>
+</table>
<table border="0">
<tr><td><?_("Host name of LDAP server (blank to disable)")></td><td>
-<input type="text" NAME="c_ldap_host" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_host")>'>
-</td></tr>
+<input type="text" NAME="c_ldap_host" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_host")>'></td></tr>
<tr><td><?_("Port number of LDAP server (blank to disable)")></td><td>
-<input type="text" NAME="c_ldap_port" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_port")>'>
-</td></tr>
-
+<input type="text" NAME="c_ldap_port" MAXLENGTH="127" VALUE='<?SERV:CFG("c_ldap_port")>'></td></tr>
<tr><td><?_("Base DN")></td><td>
-<input type="text" NAME="c_ldap_base_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_base_dn")>'>
-</td></tr>
-
+<input type="text" NAME="c_ldap_base_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_base_dn")>'></td></tr>
<tr><td><?_("Bind DN")></td><td>
-<input type="text" NAME="c_ldap_bind_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_dn")>'>
-</td></tr>
-
+<input type="text" NAME="c_ldap_bind_dn" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_dn")>'></td></tr>
<tr><td><?_("Password for bind DN")></td><td>
-<input type="password" NAME="c_ldap_bind_pw" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_pw")>'>
-</td></tr>
+<input type="password" NAME="c_ldap_bind_pw" MAXLENGTH="255" VALUE='<?SERV:CFG("c_ldap_bind_pw")>'></td></tr>
</table>
<tr><td><a href="display_edithello"> <?_("Change Login Logo")> </a></td>
<td><a href="display_editgoodbuye"> <?_("Change Logout Logo")> </a></td></tr>
-<tr><td>
-<?_("Node name")>
-</td><td>
-<input type="text" name="c_nodename" maxlength="15" value='<?SERV:CFG("c_nodename")>'>
-</td></tr>
+<tr><td><?_("Node name")></td><td>
+<input type="text" name="c_nodename" maxlength="15" value='<?SERV:CFG("c_nodename")>'></td></tr>
<tr><td><?_("Fully qualified domain name")></td><td>
-<input type="text" name="c_fqdn" maxlength="63" value='<?SERV:CFG("c_fqdn")>'>
-</td></tr>
+<input type="text" name="c_fqdn" maxlength="63" value='<?SERV:CFG("c_fqdn")>'></td></tr>
<tr><td><?_("Human-readable node name")></td><td>
-<input type="text" name="c_humannode" maxlength="20" value='<?SERV:CFG("c_humannode")>'>
-</td></tr>
+<input type="text" name="c_humannode" maxlength="20" value='<?SERV:CFG("c_humannode")>'></td></tr>
<tr><td><?_("Telephone number")></td><td>
-<input type="text" name="c_phonenum" maxlength="15" value='<?SERV:CFG("c_phonenum")>'>
-</td></tr>
+<input type="text" name="c_phonenum" maxlength="15" value='<?SERV:CFG("c_phonenum")>'></td></tr>
<tr><td><?_("Paginator prompt (for text mode clients)")></td><td>
-<input type="text" name="c_moreprompt" maxlength="79" value='<?SERV:CFG("c_moreprompt")>'>
-</td></tr>
+<input type="text" name="c_moreprompt" maxlength="79" value='<?SERV:CFG("c_moreprompt")>'></td></tr>
<tr><td><?_("Geographic location of this system")></td><td>
-<input type="text" name="c_bbs_city" maxlength="31" value='<?SERV:CFG("c_bbs_city")>'>
-</td></tr>
+<input type="text" name="c_bbs_city" maxlength="31" value='<?SERV:CFG("c_bbs_city")>'></td></tr>
<tr><td><?_("Name of system administrator")></td><td>
-<input type="text" name="c_sysadm" MAXLENGTH="25" VALUE='<?SERV:CFG("c_sysadm")>'>
-</td></tr>
+<input type="text" name="c_sysadm" MAXLENGTH="25" VALUE='<?SERV:CFG("c_sysadm")>'></td></tr>
<tr><td><?_("Default timezone for unzoned calendar items")></td><td>
<select name="c_default_cal_zone" size="1">
<option %s value="%s">%s</option> "selected"
</select>
</td></tr>
+
</table>
<center>
-<h1><?_("Advanced server fine-tuning controls")></h1>
+<h1><?_("Indexing and Journaling")></h1>
+<h2><?_("Warning: these facilities are resource intensive.")></h2>
</center>
<table border="0">
+
+
+<tr><td><?_("Enable full text index")></td><td>
+<input type="checkbox" NAME="c_enable_fulltext" VALUE="yes" <?%("COND:SERVCFG", 1, "c_enable_fulltext", 1, "CHECKED", "")>></td></tr>
-<tr><td><?_("Server connection idle timeout (in seconds)")></td><td>
-<input type="text" name="c_sleeping" maxlength="15" value='<?SERV:CFG("c_sleeping")>'>
-</td></tr>
+<tr><td><?_("Perform journaling of email messages")></td><td>
+<input type="checkbox" NAME="c_journal_email" VALUE="yes" <?%("COND:SERVCFG", 1, "c_journal_email", 1, "CHECKED", "")>></td></tr>
+
+
+<tr><td><?_("Perform journaling of non-email messages")></td><td>
+<input type="checkbox" NAME="c_journal_pubmsgs" VALUE="yes" <?%("COND:SERVCFG", 1, "c_journal_pubmsgs", 1, "CHECKED", "")>></td></tr>
+
+<tr><td><?_("Email destination of journalized messages")></td><td>
+<input type="text" NAME="c_journal_dest" MAXLENGTH="127" VALUE='<?SERV:CFG("c_journal_dest")>'></td></tr>
-<tr><td><?_("Maximum concurrent sessions (0 = no limit)")></td><td>
-<input type="text" name="c_maxsessions" maxlength="5" value='<?SERV:CFG("c_maxsessions")>'>
-</td></tr>
-<tr><td><?_("Default user purge time (days)")></td><td>
-<input type="text" name="c_userpurge" maxlength="5" value='<?SERV:CFG("c_userpurge")>'>
-</td></tr>
-
-
-<tr><td><?_("Default room purge time (days)")></td><td>
-<input type="text" name="c_roompurge" maxlength="5" value='<?SERV:CFG("c_roompurge")>'>
-</td></tr>
-
-<tr><td><?_("Maximum message length")></td><td>
-<input type="text" name="c_maxmsglen" maxlength="20" value='<?SERV:CFG("c_maxmsglen")>'>
-</td></tr>
-
-
-<tr><td><?_("Minimum number of worker threads")></td><td>
-<input type="text" name="c_min_workers" maxlength="5" value='<?SERV:CFG("c_min_workers")>'>
-</td></tr>
-
-
-<tr><td><?_("Maximum number of worker threads")></td><td>
-<input type="text" name="c_max_workers" maxlength="5" value='<?SERV:CFG("c_max_workers")>'>
-</td></tr>
-
-<tr><td><?_("Automatically delete committed database logs")></td><td>
-<input type="checkbox" NAME="c_auto_cull" VALUE="yes" <?%("COND:SERVCFG", 1, "c_auto_cull", 1, "CHECKED", "")>>
-</td></tr>
</table>
</center>
<table border="0">
-
-<tr><td><?_("SMTP MTA port (-1 to disable)"></td><td>
-<input type="text" NAME="c_smtp_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtp_port")>'>
-</td></tr>
-
+<tr><td><?_("SMTP MTA port (-1 to disable)")></td><td>
+<input type="text" NAME="c_smtp_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtp_port")>'></td></tr>
<tr><td><?_("Correct forged From: lines during authenticated SMTP")></td><td>
-<input type="checkbox" NAME="c_rfc822_strict_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" NAME="c_rfc822_strict_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", 1, "", "CHECKED")>></td></tr>
<tr><td><?_("IMAP listener port (-1 to disable)")></td><td>
-<input type="text" NAME="c_imap_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imap_port")>'>
-</td></tr>
+<input type="text" NAME="c_imap_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imap_port")>'></td></tr>
<tr><td><?_("Network run frequency (in seconds)")></td><td>
-<input type="text" NAME="c_net_freq" MAXLENGTH="5" VALUE='<?SERV:CFG("c_net_freq")>'>
-</td></tr>
+<input type="text" NAME="c_net_freq" MAXLENGTH="5" VALUE='<?SERV:CFG("c_net_freq")>'></td></tr>
<tr><td><?_("Server IP address (0.0.0.0 for 'any')")></td><td>
-<input type="text" NAME="c_ip_addr" MAXLENGTH="15" VALUE='<?SERV:CFG("c_ip_addr")>'>
-</td></tr>
-
+<input type="text" NAME="c_ip_addr" MAXLENGTH="15" VALUE='<?SERV:CFG("c_ip_addr")>'></td></tr>
<tr><td><?_("SMTP MSA port (-1 to disable)")></td><td>
-<input type="text" NAME="c_msa_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_msa_port")>'>
-</td></tr>
-
+<input type="text" NAME="c_msa_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_msa_port")>'></td></tr>
<tr><td><?_("IMAP over SSL port (-1 to disable)")></td><td>
-<input type="text" NAME="c_imaps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imaps_port")>'>
-</td></tr>
+<input type="text" NAME="c_imaps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imaps_port")>'></td></tr>
<tr><td><?_("SMTP over SSL port (-1 to disable)")></td><td>
-<input type="text" NAME="c_smtps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtps_port")>'>
-</td></tr>
+<input type="text" NAME="c_smtps_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_smtps_port")>'></td></tr>
<tr><td><?_("Instantly expunge deleted messages in IMAP")></td><td>
-<input type="checkbox" NAME="c_instant_expunge" VALUE="yes" <?%("COND:SERVCFG", 1, "c_instant_expunge", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" NAME="c_instant_expunge" VALUE="yes" <?%("COND:SERVCFG", 1, "c_instant_expunge", 1, "CHECKED", "")>></td></tr>
<!-- TODO: allow random quotes in strings -->
<tr><td><?_("Allow unauthenticated SMTP clients to spoof this sites domains")></td><td>
-<input type="checkbox" NAME="c_allow_spoofing" VALUE="yes" %s>
-</td></tr>
+<input type="checkbox" NAME="c_allow_spoofing" VALUE="yes" <?%("COND:SERVCFG", 1, "c_allow_spoofing", 1, "CHECKED", "")>></td></tr>
<tr><td><a href="http://www.postfix.org/tcp_table.5.html"><?_("Postfix TCP Dictionary Port")></a>(<?_("-1 to disable")>)</td><td>
-<input type="text" NAME="c_pftcpdict_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pftcpdict_port")>'>
-</td></tr>
-
+<input type="text" NAME="c_pftcpdict_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pftcpdict_port")>'></td></tr>
<tr><td><?_("ManageSieve Port (-1 to disable)")></td><td>
-<input type="text" NAME="c_mgesve_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_mgesve_port")>'>
-</td></tr>
+<input type="text" NAME="c_mgesve_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_mgesve_port")>'></td></tr>
<tr><td><?_("Perform RBL checks upon connect instead of after RCPT")></td><td>
-<input type="checkbox" NAME="c_rbl_at_greeting" VALUE="yes" '<?SERV:CFG("c_rbl_at_greeting")>'>
-</td></tr>
+<input type="checkbox" NAME="c_rbl_at_greeting" VALUE="yes" '<?SERV:CFG("c_rbl_at_greeting")>'></td></tr>
<tr><td><?_("Keep original from headers in IMAP")></td><td>
-<input type="checkbox" NAME="c_imap_keep_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_imap_keep_from", 1, "CHECKED", "")>>
-</td></tr>
-
+<input type="checkbox" NAME="c_imap_keep_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_imap_keep_from", 1, "CHECKED", "")>></td></tr>
<tr><td><?_("XMPP (Jabber) client to server port (-1 to disable)")></td><td>
-<input type="text" name="c_xmpp_c2s_port" maxlength="5" value='<?SERV:CFG("c_xmpp_c2s_port")>'>
-</td></tr>
-
+<input type="text" name="c_xmpp_c2s_port" maxlength="5" value='<?SERV:CFG("c_xmpp_c2s_port")>'></td></tr>
<tr><td><?_("XMPP (Jabber) server to server port (-1 to disable)")></td><td>
-<input type="hidden" name="c_xmpp_s2s_port" value='<?SERV:CFG("c_xmpp_s2s_port")>'>
-</td></tr>
+<input type="hidden" name="c_xmpp_s2s_port" value='<?SERV:CFG("c_xmpp_s2s_port")>'></td></tr>
+
+</table>
<table border="0">
<tr><td><?_("POP3 listener port (-1 to disable)")></td><td>
-<input type="text" name="c_pop3_port" maxlength="5" value='<?SERV:CFG("c_pop3_port")>'>
-</td></tr>
+<input type="text" name="c_pop3_port" maxlength="5" value='<?SERV:CFG("c_pop3_port")>'></td></tr>
<tr><td><?_("POP3 over SSL port (-1 to disable)")></td><td>
-<input type="text" NAME="c_pop3s_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pop3s_port")>'>
-</td></tr>
+<input type="text" NAME="c_pop3s_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_pop3s_port")>'></td></tr>
<tr><td><?_("POP3 fetch frequency in seconds")></td><td>
-<input type="text" name="c_pop3_fetch" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fetch")>'>
-</td></tr>
-
+<input type="text" name="c_pop3_fetch" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fetch")>'></td></tr>
<tr><td><?_("POP3 fastest fetch frequency in seconds")></td><td>
-<input type="text" name="c_pop3_fastest" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fastest")>'>
-</td></tr>
+<input type="text" name="c_pop3_fastest" MAXLENGTH="5" value='<?SERV:CFG("c_pop3_fastest")>'></td></tr>
+
</table>
<table border="0">
<tr><td><?_("Funambol server host (blank to disable)")></td><td>
-<input type="text" NAME="c_funambol_host" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_host")>'>
-</td></tr>
-
+<input type="text" NAME="c_funambol_host" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_host")>'></td></tr>
<tr><td><?_("Funambol server port ")></td><td>
-<input type="text" NAME="c_funambol_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_funambol_port")>'>
-</td></tr>
-
+<input type="text" NAME="c_funambol_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_funambol_port")>'></td></tr>
<tr><td><?_("Funambol sync source")></td><td>
-<input type="text" NAME="c_funambol_source" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_source")>'>
-</td></tr>
-
+<input type="text" NAME="c_funambol_source" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_source")>'></td></tr>
<tr><td><?_("Funambol auth details (user:pass)")></td><td>
-<input type="text" NAME="c_funambol_auth" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_auth")>'>
-</td></tr>
+<input type="text" NAME="c_funambol_auth" MAXLENGTH="255" VALUE='<?SERV:CFG("c_funambol_auth")>'></td></tr>
<tr><td><?_("External pager tool (blank to disable)")></td><td>
-<input type="text" NAME="c_pager_program" MAXLENGTH="255" VALUE='<?SERV:CFG("c_pager_program")>'>
-</td></tr>
+<input type="text" NAME="c_pager_program" MAXLENGTH="255" VALUE='<?SERV:CFG("c_pager_program")>'></td></tr>
+
</table>
<table border="0">
<tr><td><?_("Server connection idle timeout (in seconds)")></td><td>
-<input type="text" name="c_sleeping" maxlength="15" value='<?SERV:CFG("c_sleeping")>'>
-</td></tr>
+<input type="text" name="c_sleeping" maxlength="15" value='<?SERV:CFG("c_sleeping")>'></td></tr>
<tr><td><?_("Maximum concurrent sessions (0 = no limit)")></td><td>
-<input type="text" name="c_maxsessions" maxlength="5" value='<?SERV:CFG("c_maxsessions")>'>
-</td></tr>
-
+<input type="text" name="c_maxsessions" maxlength="5" value='<?SERV:CFG("c_maxsessions")>'></td></tr>
<tr><td><?_("Default user purge time (days)")></td><td>
-<input type="text" name="c_userpurge" maxlength="5" value='<?SERV:CFG("c_userpurge")>'>
-</td></tr>
-
+<input type="text" name="c_userpurge" maxlength="5" value='<?SERV:CFG("c_userpurge")>'></td></tr>
<tr><td><?_("Default room purge time (days)")></td><td>
-<input type="text" name="c_roompurge" maxlength="5" value='<?SERV:CFG("c_roompurge")>'>
-</td></tr>
+<input type="text" name="c_roompurge" maxlength="5" value='<?SERV:CFG("c_roompurge")>'></td></tr>
<tr><td><?_("Maximum message length")></td><td>
-<input type="text" name="c_maxmsglen" maxlength="20" value='<?SERV:CFG("c_maxmsglen")>'>
-</td></tr>
-
+<input type="text" name="c_maxmsglen" maxlength="20" value='<?SERV:CFG("c_maxmsglen")>'></td></tr>
<tr><td><?_("Minimum number of worker threads")></td><td>
-<input type="text" name="c_min_workers" maxlength="5" value='<?SERV:CFG("c_min_workers")>'>
-</td></tr>
-
+<input type="text" name="c_min_workers" maxlength="5" value='<?SERV:CFG("c_min_workers")>'></td></tr>
<tr><td><?_("Maximum number of worker threads")></td><td>
-<input type="text" name="c_max_workers" maxlength="5" value='<?SERV:CFG("c_max_workers")>'>
-</td></tr>
+<input type="text" name="c_max_workers" maxlength="5" value='<?SERV:CFG("c_max_workers")>'></td></tr>
<tr><td><?_("Automatically delete committed database logs")></td><td>
-<input type="checkbox" NAME="c_auto_cull" VALUE="yes" <?%("COND:SERVCFG", 1, "c_auto_cull", 1, "CHECKED", "")>>
-</td></tr>
+<input type="checkbox" NAME="c_auto_cull" VALUE="yes" <?%("COND:SERVCFG", 1, "c_auto_cull", 1, "CHECKED", "")>></td></tr>
</table>
Template->Tokens[(Template->nTokensUsed)++] = NewToken;
}
-TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe)
+TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe, WCTemplateToken *Token, WCTemplate *pTmpl)
{
const char *pch = *pCh;
const char *pchs, *pche;
}
pche = pch;
if (*pch != quote) {
- lprintf(1, "Error evaluating template param [%s]\n", *pCh);
+ lprintf(1, "Error (in '%s' line %ld); "
+ "evaluating template param [%s] in Token [%s]\n",
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken),
+ *pCh);
pch ++;
free(Parm);
return NULL;
}
else {
StrBufPeek(Buf, pch, -1, '\0');
- lprintf(1, "DBG: got param [%s] %ld %ld\n", pchs, pche - pchs, strlen(pchs));
+ if (LoadTemplates > 1) {
+ lprintf(1, "DBG: got param [%s] %ld %ld\n",
+ pchs, pche - pchs, strlen(pchs));
+ }
Parm->Start = pchs;
Parm->len = pche - pchs;
pch ++; /* move after trailing quote */
}
else {
Parm->lvalue = 0;
- lprintf(1, "Error evaluating template long param [%s]\n", *pCh);
+ lprintf(1, "Error (in '%s' line %ld); "
+ "evaluating long template param [%s] in Token [%s]\n",
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken),
+ *pCh);
free(Parm);
return NULL;
}
WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf,
const char *pStart,
const char *pTmplStart,
- const char *pTmplEnd)
+ const char *pTmplEnd,
+ long Line,
+ WCTemplate *pTmpl)
{
const char *pch;
TemplateParam *Param;
WCTemplateToken *NewToken = (WCTemplateToken*)malloc(sizeof(WCTemplateToken));
NewToken->Flags = 0;
+ NewToken->Line = Line + 1;
NewToken->pTokenStart = pTmplStart;
NewToken->TokenStart = pTmplStart - pStart;
NewToken->TokenEnd = (pTmplEnd - pStart) - NewToken->TokenStart;
NewToken->pTokenEnd = pTmplEnd;
NewToken->NameEnd = NewToken->TokenEnd - 2;
+ NewToken->FlatToken = NewStrBufPlain(pTmplStart, pTmplEnd - pTmplStart);
StrBufPeek(Buf, pTmplStart, + 1, '\0');
StrBufPeek(Buf, pTmplEnd, -1, '\0');
NewToken->NameEnd = pch - NewToken->pName;
pch ++;
while (pch < pTmplEnd - 1) {
- Param = GetNextParameter(Buf, &pch, pTmplEnd - 1);
+ Param = GetNextParameter(Buf, &pch, pTmplEnd - 1, NewToken, pTmpl);
if (Param != NULL) {
NewToken->HaveParameters = 1;
if (NewToken->nParameters > MAXPARAM) {
void FreeToken(WCTemplateToken **Token)
{
int i;
+ FreeStrBuf(&(*Token)->FlatToken);
if ((*Token)->HaveParameters)
for (i = 0; i < (*Token)->nParameters; i++)
free((*Token)->Params[i]);
}
-int EvaluateConditional(WCTemplateToken *Token, void *Context, int Neg, int state)
+int EvaluateConditional(WCTemplateToken *Token, WCTemplate *pTmpl, void *Context, int Neg, int state)
{
void *vConditional;
ConditionalStruct *Cond;
Token->Params[0]->Start,
Token->Params[0]->len,
&vConditional)) {
- lprintf(1, "Conditional %s Not found!\n",
- Token->Params[0]->Start);
+ lprintf(1, "Conditional [%s] (in '%s' line %ld); Not found![%s]\n",
+ Token->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken));
}
Cond = (ConditionalStruct *) vConditional;
if (Cond == NULL) {
- lprintf(1, "Conditional %s Not found!\n",
- Token->Params[0]->Start);
+ lprintf(1, "Conditional [%s] (in '%s' line %ld); Not found![%s]\n",
+ Token->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ ChrPtr(Token->FlatToken));
return 0;
}
if (Token->nParameters < Cond->nParams) {
- lprintf(1, "Conditional [%s] needs %ld Params!\n",
+ lprintf(1, "Conditional [%s] (in '%s' line %ld); needs %ld Params![%s]\n",
Token->Params[0]->Start,
- Cond->nParams);
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ Cond->nParams,
+ ChrPtr(Token->FlatToken));
return 0;
}
if (Cond->CondF(Token, Context) == Neg)
return 0;
}
-int EvaluateToken(StrBuf *Target, WCTemplateToken *Token, void *Context, int state)
+int EvaluateToken(StrBuf *Target, WCTemplateToken *Token, WCTemplate *pTmpl, void *Context, int state)
{
void *vVar;
// much output, since pName is not terminated...
TmplGettext(Target, Token->nParameters, Token);
break;
case SV_CONDITIONAL: /** Forward conditional evaluation */
- return EvaluateConditional(Token, Context, 1, state);
+ return EvaluateConditional(Token, pTmpl, Context, 1, state);
break;
case SV_NEG_CONDITIONAL: /** Reverse conditional evaluation */
- return EvaluateConditional(Token, Context, 0, state);
+ return EvaluateConditional(Token, pTmpl, Context, 0, state);
break;
case SV_CUST_STR_CONDITIONAL: /** Conditional put custom strings from params */
- if (Token->nParameters >= 7) {
- if (EvaluateConditional(Token, Context, 0, state))
+ if (Token->nParameters >= 6) {
+ if (EvaluateConditional(Token, pTmpl, Context, 0, state))
StrBufAppendBufPlain(Target,
Token->Params[5]->Start,
Token->Params[5]->len,
0);
else
StrBufAppendBufPlain(Target,
- Token->Params[6]->Start,
- Token->Params[6]->len,
+ Token->Params[4]->Start,
+ Token->Params[4]->len,
0);
}
break;
long len;
if (LoadTemplates != 0) {
- lprintf(1, "DBG: ----- loading: [%s] ------ \n", ChrPtr(Tmpl->FileName));
+ if (LoadTemplates > 1)
+ lprintf(1, "DBG: ----- loading: [%s] ------ \n",
+ ChrPtr(Tmpl->FileName));
pTmpl = load_template(Tmpl->FileName, NULL, NULL);
}
StrBufAppendBufPlain(
Target, pData,
pTmpl->Tokens[i]->pTokenStart - pData, 0);
- state = EvaluateToken(Target, pTmpl->Tokens[i], Context, state);
+ state = EvaluateToken(Target, pTmpl->Tokens[i], pTmpl, Context, state);
while ((state != 0) && (i+1 < pTmpl->nTokensUsed)) {
/* condition told us to skip till its end condition */
i++;
if ((pTmpl->Tokens[i]->Flags == SV_CONDITIONAL) ||
(pTmpl->Tokens[i]->Flags == SV_NEG_CONDITIONAL)) {
if (state == EvaluateConditional(pTmpl->Tokens[i],
+ pTmpl,
Context,
pTmpl->Tokens[i]->Flags,
state))
int fd;
struct stat statbuf;
const char *pS, *pE, *pch, *Err;
+ long Line;
int pos;
WCTemplate *NewTemplate;
NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
NewTemplate->Data = NewStrBufPlain(NULL, statbuf.st_size);
- NewTemplate->FileName = NULL;
+ NewTemplate->FileName = NewStrBufDup(filename);
NewTemplate->nTokensUsed = 0;
NewTemplate->TokenSpace = 0;
NewTemplate->Tokens = NULL;
}
close(fd);
+ Line = 0;
pS = pch = ChrPtr(NewTemplate->Data);
pE = pS + StrLength(NewTemplate->Data);
while (pch < pE) {
for (; pch < pE; pch ++) {
if ((*pch=='<')&&(*(pch + 1)=='?'))
break;
+ if (*pch=='\n') Line ++;
}
if (pch >= pE)
continue;
continue;
pte = pch;
PutNewToken(NewTemplate,
- NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte));
+ NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte, Line, NewTemplate));
pch ++;
}
if (LoadTemplates == 0)
void tmpl_do_tabbed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context)
{
StrBuf **TabNames;
- int i, ntabs;
+ int i, ntabs, nTabs;
- ntabs = Tokens->nParameters / 2;
+ nTabs = ntabs = Tokens->nParameters / 2;
TabNames = (StrBuf **) malloc(ntabs * sizeof(StrBuf*));
for (i = 0; i < ntabs; i++) {
TabNames[i] = NewStrBuf();
- DoTemplate(Tokens->Params[i * 2]->Start,
- Tokens->Params[i * 2]->len,
- Context,
- TabNames[i]);
+ if (Tokens->Params[i * 2]->len > 0) {
+ DoTemplate(Tokens->Params[i * 2]->Start,
+ Tokens->Params[i * 2]->len,
+ Context,
+ TabNames[i]);
+ }
+ else {
+ /** A Tab without subject? we can't count that, add it as silent */
+ nTabs --;
+ }
}
- StrTabbedDialog(Target, ntabs, TabNames);
+ StrTabbedDialog(Target, nTabs, TabNames);
for (i = 0; i < ntabs; i++) {
- StrBeginTab(Target, ntabs, i);
+ StrBeginTab(Target, i, nTabs);
DoTemplate(Tokens->Params[i * 2 + 1]->Start,
Tokens->Params[i * 2 + 1]->len,
Context,
Target);
- StrEndTab(Target, ntabs, i);
+ StrEndTab(Target, i, nTabs);
}
}
close(fd);
+#ifndef TECH_PREVIEW
lprintf(9, "output_static('%s') %s\n", what, content_type);
+#endif
http_transmit_thing(content_type, 1);
}
if (yesbstr("force_close_session")) {
} TemplateParam;
typedef struct _TemplateToken {
+ StrBuf *FlatToken;
+ long Line;
const char *pTokenStart;
size_t TokenStart;
size_t TokenEnd;