* add NONCE replacer to contextloop; please re-bootstrap so that the initializer does its job
* added selectboxes to the config dialog templates
* added COND:SERVCFG:SUBST for the TZ dropdown
}
+
+void tmpl_nonce(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context)
+{
+ struct wcsession *WCC = WC;
+ StrBufAppendPrintf(Target, "%ld",
+ (WCC != NULL)? WCC->nonce:0);
+}
+
+void
+InitModule_CONTEXT
+(void)
+{
+ RegisterNamespace("NONCE", 0, 0, tmpl_nonce);
+}
}
-void CfgZoneTempl(StrBuf *TemplBuffer, void *Context)
+void CfgZoneTempl(StrBuf *TemplBuffer, void *vContext)
{
+ StrBuf *Zone = (StrBuf*) vContext;
+ SVPutBuf("ZONENAME", Zone, 1);
}
int ConditionalPreference(WCTemplateToken *Token, void *Context)
{
+ StrBuf *Pref;
- void *hash_value;
-
- if (!GetHash(PreferenceHooks,
- Token->Params[2]->Start,
- Token->Params[2]->len,
- &hash_value))
+ if (!get_PREFERENCE(Token->Params[2]->Start,
+ Token->Params[2]->len,
+ &Pref))
return 0;
-
- Prefs *Newpref = (Prefs*) hash_value;
- return (strcmp(Token->Params[3]->Start, Newpref->PrefStr) == 0);
+
+ if (Token->nParameters == 3) {
+ return 1;
+ }
+ else if (Token->Params[3]->Type == TYPE_STR)
+ return ((Token->Params[3]->len == StrLength(Pref)) &&
+ (strcmp(Token->Params[3]->Start, ChrPtr(Pref)) == 0));
+ else
+ return (StrTol(Pref) == Token->Params[3]->lvalue);
}
icalarray *zones;
int z;
long len;
- char this_zone[128];
- char *ZName;
+ const char *this_zone;
+ StrBuf *ZName;
ZoneHash = NewHash(1, NULL);
- len = sizeof("UTC") + 1;
- ZName = malloc(len + 1);
- memcpy(ZName, "UTC", len + 1);
- Put(ZoneHash, ZName, len, ZName, NULL);
+ ZName = NewStrBufPlain(HKEY("UTC"));
+ Put(ZoneHash, HKEY("UTC"), ZName, HFreeStrBuf);
zones = icaltimezone_get_builtin_timezones();
for (z = 0; z < zones->num_elements; ++z) {
- strcpy(this_zone, icaltimezone_get_location(icalarray_element_at(zones, z)));
+ this_zone = icaltimezone_get_location(icalarray_element_at(zones, z));
len = strlen(this_zone);
- ZName = (char*)malloc(len +1);
- memcpy(ZName, this_zone, len + 1);
- Put(ZoneHash, ZName, len, ZName, NULL);
+ ZName = NewStrBufPlain(this_zone, len);
+ Put(ZoneHash, this_zone, len, ZName, HFreeStrBuf);
}
SortByHashKey(ZoneHash, 0);
}
*/
void siteconfig(void)
{
+ struct wcsession *WCC = WC;
int i;
char buf[256];
serv_printf("CONF set");
serv_getln(buf, sizeof buf);
if (buf[0] != '4') {
- safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
+ safestrncpy(WCC->ImportantMessage, &buf[4], sizeof WCC->ImportantMessage);
display_aide_menu();
return;
}
- i = sizeof(ServerConfig);
- for (i=0; i < sizeof(ServerConfig); i ++)
+ for (i=0; i < (sizeof(ServerConfig) / sizeof(CfgMapping)); i ++)
{
switch (ServerConfig[i].type) {
default:
break;
}
}
+ serv_puts("000");
serv_printf("SPEX site|%d|%d", ibstr("sitepolicy"), ibstr("sitevalue"));
serv_getln(buf, sizeof buf);
strcpy(serv_info.serv_default_cal_zone, bstr("c_default_cal_zone"));
- safestrncpy(WC->ImportantMessage, _("Your system configuration has been updated."),
- sizeof WC->ImportantMessage);
+ safestrncpy(WCC->ImportantMessage, _("Your system configuration has been updated."),
+ sizeof WCC->ImportantMessage);
+ DeleteHash(&WCC->ServCfg);
display_aide_menu();
}
else return 0;
}
+int ConditionalServCfgSubst(WCTemplateToken *Tokens, void *Context)
+{
+ struct wcsession *WCC = WC;
+ void *vBuf;
+ StrBuf *Buf;
+
+ if (WCC->is_aide) {
+ if (WCC->ServCfg == NULL)
+ load_siteconfig();
+ GetHash(WCC->ServCfg,
+ Tokens->Params[2]->Start,
+ Tokens->Params[2]->len,
+ &vBuf);
+ if (vBuf == NULL) return 0;
+ Buf = (StrBuf*) vBuf;
+
+ return CompareSubstToStrBuf(Buf, Tokens->Params[3]);
+ }
+ else return 0;
+}
+
void
InitModule_SITECONFIG
(void)
RegisterNamespace("SERV:CFG", 1, 1, tmplput_servcfg);
RegisterConditional(HKEY("COND:SERVCFG"), 3, ConditionalServCfg);
+ RegisterConditional(HKEY("COND:SERVCFG:SUBST"), 4, ConditionalServCfgSubst);
}
/*@}*/
<ul class="adminitems">
-<li><a href="display_siteconfig"><?_("Edit site-wide configuration")></a></li>
+<li><a href="do_template?template=display_sitewide_config"><?_("Edit site-wide configuration")></a></li>
<li><a href="display_inetconf"><?_("Domain names and Internet mail configuration")></a></li>
<li><a href="display_netconf"><?_("Configure replication with other Citadel servers")></a></li>
<li><a href="display_smtpqueue"><?_("View the outbound SMTP queue")></a></li>
<tr><td><?_("Initial access level for new users")></td><td>
<select name="c_initax" size="1">
-<!--
- for (j=0; j<=6; ++j) {
- sprintf(&access[strlen(access)], "<option %s value="%d">%d - %s</option>",
- ((atoi(buf) == j) ? "selected" : ""),
- j, j, axdefs[j]
- );
- }
--->
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="0">0 - <?_("Deleted")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="1">1 - <?_("New User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="2">2 - <?_("Problem User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="3">3 - <?_("Local User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="4">4 - <?_("Network User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="5">5 - <?_("Preferred User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_initax", 1, 'selected="selected"', "")> value="6">6 - <?_("Aide")></option>
</select></td></tr>
<tr><td><?_("Require registration for new users")></td><td>
<tr><td><?_("Access level required to create rooms")></td><td>
<select name="c_createax" size="1">
-<!--
- for (j=0; j<=6; ++j) {
- sprintf(&access[strlen(access)], "<option %s value="%d">%d - %s</option>",
- ((atoi(buf) == j) ? "selected" : ""),
- j, j, axdefs[j]
- );
- }
--->
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="0">0 - <?_("Deleted")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="1">1 - <?_("New User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="2">2 - <?_("Problem User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="3">3 - <?_("Local User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="4">4 - <?_("Network User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="5">5 - <?_("Preferred User")></option>
+ <option <?%("COND:SERVCFG", 1, "c_createax", 1, 'selected="selected"', "")> value="6">6 - <?_("Aide")></option>
</select></td></tr>
<tr><td><?_("Allow aides to zap (forget) rooms")></td><td>
<input type="password" NAME="c_master_pass" MAXLENGTH="31" VALUE='<?SERV:CFG("c_master_pass")>'></td></tr>
</table>
-
<tr><td><?_("Hour to run database auto-purge")></td><td>
<select NAME="c_purge_hour" SIZE="1">
-<!--
- for (j=0; j<=23; ++j) {
- sprintf(&purger[strlen(purger)], "<OPTION %s VALUE="%d">%d:00%s</OPTION>\n",
- ((atoi(buf) == j) ? "SELECTED" : ""),
- j,
- (get_time_format_cached() == WC_TIMEFORMAT_24) ? j : ((j == 0) ? 12 : ((j>12) ? j-12 : j)),
- (get_time_format_cached() == WC_TIMEFORMAT_24) ? "" : ((j >= 12) ? "pm" : "am")
- );
- }
--->
+<?!("COND:PREF", 1, "calhourformat", 24)>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 0, 'selected="selected"', "")> VALUE='00'> 0:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 1, 'selected="selected"', "")> VALUE='01'> 1:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 2, 'selected="selected"', "")> VALUE='02'> 2:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 3, 'selected="selected"', "")> VALUE='03'> 3:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 4, 'selected="selected"', "")> VALUE='04'> 4:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 5, 'selected="selected"', "")> VALUE='05'> 5:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 6, 'selected="selected"', "")> VALUE='06'> 6:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 7, 'selected="selected"', "")> VALUE='07'> 7:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 8, 'selected="selected"', "")> VALUE='08'> 8:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 9, 'selected="selected"', "")> VALUE='09'> 9:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 10, 'selected="selected"', "")> VALUE='10'>10:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 11, 'selected="selected"', "")> VALUE='11'>11:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 12, 'selected="selected"', "")> VALUE='12'>12:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 13, 'selected="selected"', "")> VALUE='13'>13:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 14, 'selected="selected"', "")> VALUE='14'>14:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 15, 'selected="selected"', "")> VALUE='15'>15:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 16, 'selected="selected"', "")> VALUE='16'>16:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 17, 'selected="selected"', "")> VALUE='17'>17:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 18, 'selected="selected"', "")> VALUE='18'>18:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 19, 'selected="selected"', "")> VALUE='19'>19:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 20, 'selected="selected"', "")> VALUE='20'>20:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 21, 'selected="selected"', "")> VALUE='21'>21:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 22, 'selected="selected"', "")> VALUE='22'>22:00</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 23, 'selected="selected"', "")> VALUE='23'>23:00</OPTION>
+<?!("X", 1)>
+<??("COND:PREF", 2, "calhourformat", 24)>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 0, 'selected="selected"', "")> VALUE='00'>12:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 1, 'selected="selected"', "")> VALUE='01'> 1:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 2, 'selected="selected"', "")> VALUE='02'> 2:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 3, 'selected="selected"', "")> VALUE='03'> 3:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 4, 'selected="selected"', "")> VALUE='04'> 4:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 5, 'selected="selected"', "")> VALUE='05'> 5:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 6, 'selected="selected"', "")> VALUE='06'> 6:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 7, 'selected="selected"', "")> VALUE='07'> 7:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 8, 'selected="selected"', "")> VALUE='08'> 8:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 9, 'selected="selected"', "")> VALUE='08'> 9:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 10, 'selected="selected"', "")> VALUE='10'>10:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 11, 'selected="selected"', "")> VALUE='11'>11:00 am</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 12, 'selected="selected"', "")> VALUE='12'>12:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 13, 'selected="selected"', "")> VALUE='13'> 1:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 14, 'selected="selected"', "")> VALUE='14'> 2:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 15, 'selected="selected"', "")> VALUE='15'> 3:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 16, 'selected="selected"', "")> VALUE='16'> 4:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 17, 'selected="selected"', "")> VALUE='17'> 5:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 18, 'selected="selected"', "")> VALUE='18'> 6:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 19, 'selected="selected"', "")> VALUE='19'> 7:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 20, 'selected="selected"', "")> VALUE='20'> 8:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 21, 'selected="selected"', "")> VALUE='21'> 9:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 22, 'selected="selected"', "")> VALUE='22'>10:00 pm</OPTION>
+<OPTION <?%("COND:SERVCFG", 1, "calhourformat", 23, 'selected="selected"', "")> VALUE='23'>11:00 pm</OPTION>
+<??("X", 2)>
</select></td></tr>
<tr><td COLSPAN=2>
<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"
+<?ITERATE("PREF:ZONE", "siteconfig_tzsection")>
</select>
</td></tr>
<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><?_("Email destination of journalized messages")></td><td>
<input type="text" NAME="c_journal_dest" MAXLENGTH="127" VALUE='<?SERV:CFG("c_journal_dest")>'></td></tr>
-
-
</table>
<tr class="<?ITERATE:ODDEVEN>">
<td class="edit_col">
<??("COND:AIDE", 1)><??("COND:SUBST", 2, "WHO:ISME")>
- <a href="terminate_session?which_session=<?WHO:SESSION>&template=who" onClick="return ConfirmKill();"><?_("(kill)")</a>
+ <a href="terminate_session?which_session=<?WHO:SESSION>&template=who" onClick="return ConfirmKill();"><?_("(kill)")></a>
<??("X", 2)><??("X", 1)>
<?!("COND:SUBST", 3, "WHO:ISME")> <a href="edit_me">(<?_("edit")>)</a> <?!("X", 3)>
</td>
}
}
+
/**
* \brief destructor; kill one entry.
*/
void print_value_of(StrBuf *Target, const char *keyname, size_t keylen) {
struct wcsession *WCC = WC;
wcsubst *ptr;
- void *fcn();
void *vVar;
/*if (WCC->vars != NULL) PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
}
}
+int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup)
+{
+ struct wcsession *WCC = WC;
+ wcsubst *ptr;
+ void *vVar;
+
+ if ((WCC->vars!= NULL) && GetHash(WCC->vars, ParamToLookup->Start,
+ ParamToLookup->len, &vVar)) {
+ ptr = (wcsubst*) vVar;
+ switch(ptr->wcs_type) {
+ case WCS_STRING:
+ case WCS_STRBUF:
+ case WCS_STRBUF_REF:
+ if (ParamToCompare->Type == TYPE_STR)
+ return ((ParamToCompare->len == StrLength(ptr->wcs_value)) &&
+ (strcmp(ParamToCompare->Start, ChrPtr(ptr->wcs_value)) == 0));
+ else
+ return ParamToCompare->lvalue == StrTol(ptr->wcs_value);
+ break;
+ case WCS_SERVCMD:
+ return 1;
+ break;
+ case WCS_FUNCTION:
+ return 1;
+ case WCS_LONG:
+ if (ParamToCompare->Type == TYPE_STR)
+ return 0;
+ else
+ return ParamToCompare->lvalue == ptr->lvalue;
+ break;
+ default:
+ lprintf(1,"WARNING: invalid value in SV-Hash at %s!",
+ ParamToLookup->Start);
+ }
+ }
+ return 0;
+}
+
+int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup)
+{
+ struct wcsession *WCC = WC;
+ wcsubst *ptr;
+ void *vVar;
+
+ if ((WCC->vars!= NULL) && GetHash(WCC->vars, ParamToLookup->Start,
+ ParamToLookup->len, &vVar)) {
+ ptr = (wcsubst*) vVar;
+ switch(ptr->wcs_type) {
+ case WCS_STRING:
+ case WCS_STRBUF:
+ case WCS_STRBUF_REF:
+ return ((StrLength(Compare) == StrLength(ptr->wcs_value)) &&
+ (strcmp(ChrPtr(Compare), ChrPtr(ptr->wcs_value)) == 0));
+ case WCS_SERVCMD:
+ return 1;
+ break;
+ case WCS_FUNCTION:
+ return 1;
+ case WCS_LONG:
+ return StrTol(Compare) == ptr->lvalue;
+ default:
+ lprintf(1,"WARNING: invalid value in SV-Hash at %s!",
+ ParamToLookup->Start);
+ }
+ }
+ return 0;
+}
+
void PutNewToken(WCTemplate *Template, WCTemplateToken *NewToken)
{
Handler = (HashHandler*) vVar;
if ((Token->nParameters < Handler->nMinArgs) ||
(Token->nParameters > Handler->nMaxArgs)) {
- lprintf(1, "Handler [%s] doesn't work with %ld params",
+ lprintf(1, "Handler [%s] (in '%s' line %ld); "
+ "doesn't work with %ld params [%s]",
Token->pName,
- Token->nParameters);
+ ChrPtr(pTmpl->FileName),
+ Token->Line,
+ Token->nParameters,
+ ChrPtr(Token->FlatToken));
}
else {
Handler->HandlerFunc(Target,
}
FreeStrBuf(&SubBuf);
DeleteHashPos(&it);
- It->Destructor(List);
+ if (It->Destructor != NULL)
+ It->Destructor(List);
}
int ConditionalVar(WCTemplateToken *Tokens, void *Context)
#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b, NULL);
void url_do_template(void);
+int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup);
+int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup);
int lingering_close(int fd);
char *memreadline(char *start, char *buf, int maxlen);