* HAIL MELD!
authorWilfried Göesgens <willi@citadel.org>
Mon, 8 Sep 2008 12:23:13 +0000 (12:23 +0000)
committerWilfried Göesgens <willi@citadel.org>
Mon, 8 Sep 2008 12:23:13 +0000 (12:23 +0000)
* 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.

15 files changed:
webcit/context_loop.c
webcit/siteconfig.c
webcit/static/t/display_sitewide_config.html
webcit/static/t/tab_siteconfig_access.html
webcit/static/t/tab_siteconfig_autopurger.html
webcit/static/t/tab_siteconfig_directory.html
webcit/static/t/tab_siteconfig_general.html
webcit/static/t/tab_siteconfig_indexing.html
webcit/static/t/tab_siteconfig_network.html
webcit/static/t/tab_siteconfig_pop3.html
webcit/static/t/tab_siteconfig_pushmail.html
webcit/static/t/tab_siteconfig_tuning.html
webcit/subst.c
webcit/webcit.c
webcit/webcit.h

index 45113cbc52fc48ff291c6f572d6764a3e0d456f8..e505b5465d00606e231372d2e7433c9ded6a035b 100644 (file)
@@ -390,6 +390,7 @@ void context_loop(int *sock)
        /** 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);
index 5e42ae5a268e884b4f6e82bbbc7bd89d379bd661..bfcdc81d45d47fd77bec9ca1371b3f2bab869fe5 100644 (file)
@@ -1008,15 +1008,17 @@ int ConditionalServCfg(WCTemplateToken *Tokens, void *Context)
                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;
 }
@@ -1029,6 +1031,6 @@ InitModule_SITECONFIG
        WebcitAddUrlHandler(HKEY("siteconfig"), siteconfig, 0);
 
        RegisterNamespace("SERV:CFG", 1, 1, tmplput_servcfg);
-       RegisterConditional(HKEY("COND:SERVCFG"), 1, ConditionalServCfg);
+       RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg);
 }
 /*@}*/
index e2bf7a013e384b61bcdb5bc3afe4da26365cfb40..97e23d76fe941e6eadc3bda5b1d0c998c1478cc0 100644 (file)
@@ -1,12 +1,11 @@
-<?=("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")>
index 56168f8b829a0983593012401dffae1f56bf561b..8ae89d65738dd9d941dd946ecff09383fbdc4e27 100644 (file)
@@ -2,9 +2,7 @@
 <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>
                
index ee30307335d4c9044ed62f04cd98e2eadd0edbde..f49152f6f5be58b0456ffd7fce5ce2f55db5dac6 100644 (file)
                                );
                        }
 -->
-</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 />
@@ -36,7 +35,7 @@
 <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", "")>>
@@ -55,5 +54,6 @@
 <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>
index 5cec44eab203b0a5af932f5967f5f4d7ea5919ea..05b40c62724b4f2539e2d8b20dea8029bc655482 100644 (file)
@@ -8,28 +8,20 @@
 <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>
index 51bc4dab47134d474c624dcef11aacdab749e406..b7bd2f1a4463ef56ffd8f192e601f5c8979a6a4f 100644 (file)
@@ -6,39 +6,31 @@
 <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>
index 0c1c0bb18984c0bc1c2794e2f4e817e1580bb2b3..6f75f28d1a7d192081f46dc87813c47899b8ce12 100644 (file)
@@ -1,41 +1,23 @@
 <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>
index 0fa04ad5fe0aa292e82bdd6efa6ee337198ec935..4380663b204ab99102dc6ddbfbfad0e967bf7576 100644 (file)
@@ -4,75 +4,54 @@
 </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>
index 0e18b256ccdc02f8bf20ef12caee8897281c6650..7d29add816af936b59bede7729b81033821c108d 100644 (file)
@@ -4,19 +4,15 @@
 <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>       
index 972cbd86291b3a1a34ebb78f2458317db370d4eb..d7ed93f889eae2e08fa611d2f6948a6487ff1f50 100644 (file)
@@ -4,25 +4,18 @@
 <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>
index 3ecfe664bc1d8ad9a6d5b907fde85d71bb25bb8c..10021333b9185aec992fb5fcc43dfe1dfca44487 100644 (file)
@@ -2,39 +2,27 @@
 <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>
index 4716c8fb98cbcb4725fb7932f2e3db712d4bffd7..9d483ba177dea2b89840559574079b0b6964fc6e 100644 (file)
@@ -493,7 +493,7 @@ void PutNewToken(WCTemplate *Template, WCTemplateToken *NewToken)
        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;
@@ -521,14 +521,22 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe)
                }
                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 */
@@ -551,7 +559,12 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe)
                }
                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;
                }
@@ -569,18 +582,22 @@ TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe)
 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');
@@ -595,7 +612,7 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf,
                        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) {
@@ -636,6 +653,7 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf,
 void FreeToken(WCTemplateToken **Token)
 {
        int i; 
+       FreeStrBuf(&(*Token)->FlatToken);
        if ((*Token)->HaveParameters) 
                for (i = 0; i < (*Token)->nParameters; i++)
                        free((*Token)->Params[i]);
@@ -662,7 +680,7 @@ void FreeWCTemplate(void *vFreeMe)
 }
 
 
-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;
@@ -675,21 +693,30 @@ int EvaluateConditional(WCTemplateToken *Token, void *Context, int Neg, int stat
                 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)
@@ -697,7 +724,7 @@ int EvaluateConditional(WCTemplateToken *Token, void *Context, int Neg, int stat
        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...
@@ -707,22 +734,22 @@ int EvaluateToken(StrBuf *Target, WCTemplateToken *Token, void *Context, int sta
                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;
@@ -765,7 +792,9 @@ void ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, void *Context)
        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);
        }
 
@@ -784,13 +813,14 @@ void ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, void *Context)
                        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))
@@ -835,6 +865,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
        int fd;
        struct stat statbuf;
        const char *pS, *pE, *pch, *Err;
+       long Line;
        int pos;
        WCTemplate *NewTemplate;
 
@@ -853,7 +884,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
 
        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;
@@ -866,6 +897,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
        }
        close(fd);
 
+       Line = 0;
        pS = pch = ChrPtr(NewTemplate->Data);
        pE = pS + StrLength(NewTemplate->Data);
        while (pch < pE) {
@@ -876,6 +908,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
                for (; pch < pE; pch ++) {
                        if ((*pch=='<')&&(*(pch + 1)=='?'))
                                break;
+                       if (*pch=='\n') Line ++;
                }
                if (pch >= pE)
                        continue;
@@ -895,7 +928,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
                        continue;
                pte = pch;
                PutNewToken(NewTemplate, 
-                           NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte));
+                           NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte, Line, NewTemplate));
                pch ++;
        }
        if (LoadTemplates == 0)
@@ -1189,28 +1222,34 @@ void tmpl_do_boxed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Con
 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);
        }
 }
 
index 34a66f3158209b21b0bad7ec32a854978265a55e..bf8fd1f326b9a7fa432c66781ea9b4b78874fecb 100644 (file)
@@ -857,7 +857,9 @@ void output_static(char *what)
 
 
                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")) {
index 2d0f29f8b5215bbdfdc2c4bb827d32beb4ba47c5..d91c24210892e0a0367674850fb54a644b76a43f 100644 (file)
@@ -283,6 +283,8 @@ typedef struct _TemplateParam {
 } TemplateParam;
 
 typedef struct _TemplateToken {
+       StrBuf *FlatToken;
+       long Line;
        const char *pTokenStart;
        size_t TokenStart;
        size_t TokenEnd;