-#include "sysdep.h"
-
+// Spaghetti, technical debt, and an unmaintainable big mess.
+// No one knows how this works. This is why we started over with WebCit-NG.
+#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,
char EscapeAs = ' ';
if ((FormatTypeIndex < TP->Tokens->nParameters) &&
+ (TP->Tokens->Params[FormatTypeIndex] != NULL) &&
(TP->Tokens->Params[FormatTypeIndex]->Type == TYPE_STR) &&
(TP->Tokens->Params[FormatTypeIndex]->len >= 1)) {
pFmt = TP->Tokens->Params[FormatTypeIndex]->Start;
break;
case 'J':
StrECMAEscAppend(Target, Source, NULL);
- break;
+ break;
case 'K':
StrHtmlEcmaEscAppend(Target, Source, NULL, 0, 0);
- break;
+ break;
case 'U':
StrBufUrlescAppend(Target, Source, NULL);
break;
break;
*/
default:
- StrBufAppendBufPlain(Target, Source, 0, 0);
+ StrBufAppendBufPlain(Target, Source, -1, 0);
}
}
-/**
- * \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)
{
char *MinorPtr;
#ifdef _DIRENT_HAVE_D_NAMLEN
- d_namelen = filedir_entry->d_namelen;
-
+ d_namelen = filedir_entry->d_namlen;
#else
d_namelen = strlen(filedir_entry->d_name);
#endif
}
+
+StrBuf *textPlainType;
/**
* \brief Display a variable-substituted template
* \param templatename template file to load
{
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 NULL;
+ return textPlainType;
}
if (!GetHash(StaticLocal, templatename, len, &vTmpl) &&
!GetHash(Static, templatename, len, &vTmpl)) {
- syslog(LOG_WARNING, "didn't find Template [%s] %ld %ld\n", templatename, len , (long)strlen(templatename));
+ StrBuf *escapedString = NewStrBufPlain(NULL, len);
+
+ StrHtmlEcmaEscAppend(escapedString, NULL, templatename, 1, 1);
+ syslog(LOG_WARNING, "didn't find Template [%s] %ld %ld\n", ChrPtr(escapedString), len , (long)strlen(templatename));
StrBufAppendPrintf(Target, "<pre>\ndidn't find Template [%s] %ld %ld\n</pre>",
- templatename, len,
+ ChrPtr(escapedString), len,
(long)strlen(templatename));
+ WC->isFailure = 1;
#if 0
dbg_PrintHash(Static, PrintTemplate, NULL);
PrintHash(Static, VarPrintTransition, PrintTemplate);
#endif
- return NULL;
+ FreeStrBuf(&escapedString);
+ return textPlainType;
}
if (vTmpl == NULL)
- return NULL;
+ return textPlainType;
return ProcessTemplate(vTmpl, Target, TP);
}
RetrieveHashlistFunc GetHash;
HashDestructorFunc Destructor;
SubTemplFunc DoSubTemplate;
+ FilterByParamFunc Filter;
} HashIterator;
void RegisterITERATOR(const char *Name, long len,
RetrieveHashlistFunc GetHash,
SubTemplFunc DoSubTempl,
HashDestructorFunc Destructor,
+ FilterByParamFunc Filter,
CtxType ContextType,
CtxType XPectContextType,
int Flags)
It->GetHash = GetHash;
It->DoSubTemplate = DoSubTempl;
It->Destructor = Destructor;
+ It->Filter = Filter;
It->ContextType = ContextType;
It->XPectContextType = XPectContextType;
It->Flags = Flags;
/** 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;
}
}
while (GetNextHashPos(List, it, &Status.KeyLen, &Status.Key, &vContext)) {
if ((Status.n >= StartAt) && (Status.n <= StopAt)) {
+
+ if ((It->Filter != NULL) &&
+ !It->Filter(Status.Key, Status.KeyLen, vContext, Target, TP))
+ {
+ continue;
+ }
+
if (DetectGroupChange && Status.n > 0) {
Status.GroupChange = SortBy->GroupChange(vContext, vLastContext);
}
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);
ServerStartModule_SUBST
(void)
{
+ textPlainType = NewStrBufPlain(HKEY("text/plain"));
LocalTemplateCache = NewHash(1, NULL);
TemplateCache = NewHash(1, NULL);
-
GlobalNS = NewHash(1, NULL);
Iterators = NewHash(1, NULL);
Conditionals = NewHash(1, NULL);
ServerShutdownModule_SUBST
(void)
{
+ FreeStrBuf(&textPlainType);
+
DeleteHash(&TemplateCache);
DeleteHash(&LocalTemplateCache);
-
+
DeleteHash(&GlobalNS);
DeleteHash(&Iterators);
DeleteHash(&Conditionals);