-#include "sysdep.h"
-
+// This is a template substitution engine, which began with good intentions, but ended up becoming
+// more complex and unmaintainable than what it replaced. We are barely hanging on with this until
+// webcit-ng replaces webcit classic.
+#include "sysdep.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
-
#include <unistd.h>
#include <stdio.h>
#include <stdarg.h>
void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplputParams *TP, const char *Format, ...)
{
- wcsession *WCC;
StrBuf *Error;
StrBuf *Info;
va_list arg_ptr;
Type,
ChrPtr(Error));
}
- WCC = WC;
- if (WCC == NULL) {
+ if (WC == NULL) {
FreeStrBuf(&Info);
FreeStrBuf(&Error);
return;
}
- if (WCC->WFBuf == NULL) WCC->WFBuf = NewStrBuf();
+ if (WC->WFBuf == NULL) WC->WFBuf = NewStrBuf();
if (TP->Tokens != NULL)
{
/* deprecated:
ChrPtr(TP->Tokens->FlatToken));
- SerializeJson(WCC->WFBuf, WildFireException(SKEY(TP->Tokens->FileName),
+ SerializeJson(WC->WFBuf, WildFireException(SKEY(TP->Tokens->FileName),
TP->Tokens->Line,
Info,
1), 1);
-/*
- SerializeJson(Header, WildFireMessage(SKEY(TP->Tokens->FileName),
- TP->Tokens->Line,
- Error,
- eERROR), 1);
-*/
-
}
- else
- {
- /* deprecated.
- StrBufAppendPrintf(
- Target,
- "<pre>\n%s: %s\n</pre>\n",
- Type,
- ChrPtr(Error));
- */
+ else {
StrBufPrintf(Info, "%s [%s] %s; [%s]",
Type,
Err,
ChrPtr(Error),
ChrPtr(TP->Tokens->FlatToken));
- SerializeJson(WCC->WFBuf, WildFireException(HKEY(__FILE__), __LINE__, Info, 1), 1);
+ SerializeJson(WC->WFBuf, WildFireException(HKEY(__FILE__), __LINE__, Info, 1), 1);
}
FreeStrBuf(&Info);
FreeStrBuf(&Error);
-/*
- if (dbg_backtrace_template_errors)
- wc_backtrace(LOG_DEBUG);
-*/
}
-void LogError (StrBuf *Target, const char *Type, const char *Format, ...)
-{
- wcsession *WCC;
+
+void LogError (StrBuf *Target, const char *Type, const char *Format, ...) {
StrBuf *Error;
StrBuf *Info;
va_list arg_ptr;
syslog(LOG_WARNING, "%s", ChrPtr(Error));
- WCC = WC;
- if (WCC->WFBuf == NULL) WCC->WFBuf = NewStrBuf();
+ if (WC->WFBuf == NULL) WC->WFBuf = NewStrBuf();
- SerializeJson(WCC->WFBuf, WildFireException(Type, strlen(Type),
+ SerializeJson(WC->WFBuf, WildFireException(Type, strlen(Type),
0,
Info,
1), 1);
FreeStrBuf(&Info);
FreeStrBuf(&Error);
-/*
- if (dbg_backtrace_template_errors)
- wc_backtrace(LOG_DEBUG);
-*/
}
ContextName(TP->Filter.ContextType));
return 0;
}
-/*
- if (TP->Tokens->nParameters < Need->nMinArgs) {
- LogTemplateError(Target, ErrType, ERR_NAME, TP,
- "needs at least %ld params, have %ld",
- Need->nMinArgs,
- TP->Tokens->nParameters);
- return 0;
-
- }
- else if (TP->Tokens->nParameters > Need->nMaxArgs) {
- LogTemplateError(Target, ErrType, ERR_NAME, TP,
- "just needs %ld params, you gave %ld",
- Need->nMaxArgs,
- TP->Tokens->nParameters);
- return 0;
-
- }
-*/
return 1;
}
-void FreeToken(WCTemplateToken **Token)
-{
+void FreeToken(WCTemplateToken **Token) {
int i;
FreeStrBuf(&(*Token)->FlatToken);
if ((*Token)->HaveParameters)
}
-
-void FreeWCTemplate(void *vFreeMe)
-{
+void FreeWCTemplate(void *vFreeMe) {
int i;
WCTemplate *FreeMe = (WCTemplate*)vFreeMe;
}
}
-void GetTemplateTokenString(StrBuf *Target,
- WCTemplputParams *TP,
- int N,
- const char **Value,
- long *len)
-{
+void GetTemplateTokenString(StrBuf *Target, WCTemplputParams *TP, int N, const char **Value, long *len) {
StrBuf *Buf;
if (N >= TP->Tokens->nParameters) {
}
}
-long GetTemplateTokenNumber(StrBuf *Target, WCTemplputParams *TP, int N, long dflt)
-{
+long GetTemplateTokenNumber(StrBuf *Target, WCTemplputParams *TP, int N, long dflt) {
long Ret;
if (N >= TP->Tokens->nParameters) {
LogTemplateError(Target,
StrEscAppend(Target, Source, NULL, 0, 2);
break;
case 'X':
- StrEscAppend(Target, Source, NULL, 0, 0);
+ if (!IsEmptyStr(ChrPtr(Source))) {
+ StrEscAppend(Target, Source, NULL, 0, 0);
+ if (pFmt[1]) {
+ StrBufAppendBufPlain(Target, pFmt, -1, 1);
+ }
+ }
break;
case 'J':
StrECMAEscAppend(Target, Source, NULL);
-/**
- * \brief Display a variable-substituted template
- * \param templatename template file to load
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
*/
-void *prepare_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
-{
+void *prepare_template(StrBuf *filename, StrBuf *Key, HashList *PutThere) {
WCTemplate *NewTemplate;
NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
return NewTemplate;
}
-/**
- * \brief Display a variable-substituted template
- * \param templatename template file to load
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
*/
-void *duplicate_template(WCTemplate *OldTemplate)
-{
+void *duplicate_template(WCTemplate *OldTemplate) {
WCTemplate *NewTemplate;
NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
}
-void SanityCheckTemplate(StrBuf *Target, WCTemplate *CheckMe)
-{
+void SanityCheckTemplate(StrBuf *Target, WCTemplate *CheckMe) {
int i = 0;
int j;
int FoundConditionalEnd;
- for (i = 0; i < CheckMe->nTokensUsed; i++)
- {
- switch(CheckMe->Tokens[i]->Flags)
- {
+ for (i = 0; i < CheckMe->nTokensUsed; i++) {
+ switch(CheckMe->Tokens[i]->Flags) {
case SV_CONDITIONAL:
case SV_NEG_CONDITIONAL:
FoundConditionalEnd = 0;
}
}
-/**
- * \brief Display a variable-substituted template
- * \param templatename template file to load
+/*
+ * Display a variable-substituted template
+ * templatename template file to load
*/
void *load_template(StrBuf *Target, WCTemplate *NewTemplate)
{
/* Primary Template set... */
StrBufPrintf(Dir, "%s/t", static_dirs[0]);
- LoadTemplateDir(Dir,
- TemplateCache,
- Key);
+ LoadTemplateDir(Dir, TemplateCache, Key);
/* User local Template set */
StrBufPrintf(Dir, "%s/t", static_dirs[1]);
- LoadTemplateDir(Dir,
- LocalTemplateCache,
- Key);
+ LoadTemplateDir(Dir, LocalTemplateCache, Key);
/* Debug Templates, just to be loaded while debugging. */
StrBufPrintf(Dir, "%s/dbg", static_dirs[0]);
- LoadTemplateDir(Dir,
- TemplateCache,
- Key);
+ LoadTemplateDir(Dir, TemplateCache, Key);
Templates[0] = TemplateCache;
Templates[1] = LocalTemplateCache;
void *vTemplate;
At = GetNewHashPos(Templates[i], 0);
- while (GetNextHashPos(Templates[i],
- At,
- &KLen,
- &Key,
- &vTemplate) &&
- (vTemplate != NULL))
- {
+ while (GetNextHashPos(Templates[i], At, &KLen, &Key, &vTemplate) && (vTemplate != NULL)) {
load_template(NULL, (WCTemplate *)vTemplate);
}
DeleteHashPos(&At);
if (TP->Tokens->nParameters >= 6) {
if (EvaluateConditional(Target, 0, state, TPP)) {
GetTemplateTokenString(Target, TP, 5, &AppendMe, &AppendMeLen);
- StrBufAppendBufPlain(Target,
- AppendMe,
- AppendMeLen,
- 0);
+ StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
}
else{
GetTemplateTokenString(Target, TP, 4, &AppendMe, &AppendMeLen);
- StrBufAppendBufPlain(Target,
- AppendMe,
- AppendMeLen,
- 0);
+ StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
}
if (*TPP != TP)
{
}
}
else {
- LogTemplateError(
- Target, "Conditional", ERR_NAME, TP,
- "needs at least 6 Params!");
+ LogTemplateError( Target, "Conditional", ERR_NAME, TP, "needs at least 6 Params!");
}
break;
case SV_SUBTEMPL:
ChrPtr(Tmpl->FileName));
pTmpl = duplicate_template(Tmpl);
if(load_template(Target, pTmpl) == NULL) {
- StrBufAppendPrintf(
- Target,
+ StrBufAppendPrintf( Target,
"<pre>\nError loading Template [%s]\n See Logfile for details\n</pre>\n",
ChrPtr(Tmpl->FileName));
FreeWCTemplate(pTmpl);
state = eNext;
while (!done) {
if (i >= pTmpl->nTokensUsed) {
- StrBufAppendBufPlain(Target,
- pData,
- len - (pData - pS), 0);
+ StrBufAppendBufPlain(Target, pData, len - (pData - pS), 0);
done = 1;
}
else {
int TokenRc = 0;
- StrBufAppendBufPlain(
- Target, pData,
- pTmpl->Tokens[i]->pTokenStart - pData, 0);
+ StrBufAppendBufPlain( Target, pData, pTmpl->Tokens[i]->pTokenStart - pData, 0);
TPtr->Tokens = pTmpl->Tokens[i];
TPtr->nArgs = pTmpl->Tokens[i]->nParameters;
TokenRc = EvaluateToken(Target, TokenRc, &TPtr);
- if (TokenRc > 0)
- {
+ if (TokenRc > 0) {
state = eSkipTilEnd;
}
- else if (TokenRc < 0)
- {
- if ((TPtr != &TP) &&
- (TPtr->ExitCTXID == -TokenRc))
- {
+ else if (TokenRc < 0) {
+ if ((TPtr != &TP) && (TPtr->ExitCTXID == -TokenRc)) {
UnStackDynamicContext(Target, &TPtr);
}
TokenRc = 0;
pTmpl->Tokens[i]->Flags,
TokenRc,
&TPtr);
- if (-rc == TokenRc)
- {
+ if (-rc == TokenRc) {
TokenRc = 0;
state = eNext;
- if ((TPtr != &TP) &&
- (TPtr->ExitCTXID == - rc))
- {
+ if ((TPtr != &TP) && (TPtr->ExitCTXID == - rc)) {
UnStackDynamicContext(Target, &TPtr);
}
}
Static = TemplateCache;
StaticLocal = LocalTemplateCache;
- if (len == 0)
- {
+ if (len == 0) {
syslog(LOG_WARNING, "Can't to load a template with empty name!\n");
StrBufAppendPrintf(Target, "<pre>\nCan't to load a template with empty name!\n</pre>");
return textPlainType;
/** Ok, its us, lets see in which direction we should sort... */
(havebstr("SortOrder"))) {
int SortOrder;
- SortOrder = LBSTR("SortOrder");
+ SortOrder = lbstr("SortOrder");
if (SortOrder != 0)
DetectGroupChange = 1;
}
StrBufAppendBufPlain(Target, Ctx->Key, Ctx->KeyLen, 0);
}
+void tmplput_ITERATE_N_DIV(StrBuf *Target, WCTemplputParams *TP)
+{
+ IterateStruct *Ctx = CTX(CTX_ITERATE);
+ long div;
+ long divisor = GetTemplateTokenNumber(Target, TP, 0, 1);
+///TODO divisor == 0 -> log error exit
+ div = Ctx->n / divisor;
+ StrBufAppendPrintf(Target, "%ld", div);
+}
-void tmplput_ITERATE_LASTN(StrBuf *Target, WCTemplputParams *TP)
+void tmplput_ITERATE_N(StrBuf *Target, WCTemplputParams *TP)
{
IterateStruct *Ctx = CTX(CTX_ITERATE);
StrBufAppendPrintf(Target, "%d", Ctx->n);
return Ctx->LastN;
}
+int conditional_ITERATE_ISMOD(StrBuf *Target, WCTemplputParams *TP)
+{
+ IterateStruct *Ctx = CTX(CTX_ITERATE);
+
+ long divisor = GetTemplateTokenNumber(Target, TP, 2, 1);
+ long expectRemainder = GetTemplateTokenNumber(Target, TP, 3, 0);
+
+ return Ctx->n % divisor == expectRemainder;
+}
+
/*-----------------------------------------------------------------------------
/** Ok, its us, lets see in which direction we should sort... */
if (havebstr("SortOrder")) {
- SortOrder = LBSTR("SortOrder");
+ SortOrder = lbstr("SortOrder");
}
else { /** Try to fallback to our remembered values... */
StrBuf *Buf = NULL;
/** Ok, its us, lets see in which direction we should sort... */
if (havebstr("SortOrder")) {
- *SortOrder = LBSTR("SortOrder");
+ *SortOrder = lbstr("SortOrder");
}
else { /** Try to fallback to our remembered values... */
if ((*Param)->PrefPrepend == NULL) {
RegisterConditional("COND:ITERATE:FIRSTN", 2,
conditional_ITERATE_FIRSTN,
CTX_ITERATE);
+ RegisterConditional("COND:ITERATE:ISMOD", 3,
+ conditional_ITERATE_ISMOD,
+ CTX_ITERATE);
RegisterNamespace("ITERATE:ODDEVEN", 0, 0, tmplput_ITERATE_ODDEVEN, NULL, CTX_ITERATE);
RegisterNamespace("ITERATE:KEY", 0, 0, tmplput_ITERATE_KEY, NULL, CTX_ITERATE);
- RegisterNamespace("ITERATE:N", 0, 0, tmplput_ITERATE_LASTN, NULL, CTX_ITERATE);
+ RegisterNamespace("ITERATE:N", 0, 0, tmplput_ITERATE_N, NULL, CTX_ITERATE);
+ RegisterNamespace("ITERATE:N:DIV", 1, 1, tmplput_ITERATE_N_DIV, NULL, CTX_ITERATE);
RegisterNamespace("CURRENTFILE", 0, 1, tmplput_CURRENT_FILE, NULL, CTX_NONE);
RegisterNamespace("DEF:STR", 1, 1, tmplput_DefStr, NULL, CTX_NONE);
RegisterNamespace("DEF:VAL", 1, 1, tmplput_DefVal, NULL, CTX_NONE);