X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsubst.c;h=688299b23c977d583ae709f0178e739e4d23c5bf;hb=7c94d5bb68f1c448770d31205ec5ae12bd8a02ed;hp=b119ce18ca645bebdaebda59d7b4be67a5f98966;hpb=ec7c5eca2a8c4d3416c0c6b3f9db3ba95fb40094;p=citadel.git diff --git a/webcit/subst.c b/webcit/subst.c index b119ce18c..688299b23 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -43,6 +43,7 @@ const char EmptyStr[]=""; #define SV_PREEVALUATED 6 + /* * Dynamic content for variable substitution in templates */ @@ -243,7 +244,7 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu } if (TP->Tokens != NULL) { - syslog(1, "%s [%s] (in '%s' line %ld); %s; [%s]\n", + syslog(LOG_WARNING, "%s [%s] (in '%s' line %ld); %s; [%s]\n", Type, Err, ChrPtr(TP->Tokens->FileName), @@ -253,7 +254,7 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu } else { - syslog(1, "%s: %s;\n", + syslog(LOG_WARNING, "%s: %s;\n", Type, ChrPtr(Error)); } @@ -317,7 +318,7 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu FreeStrBuf(&Error); /* if (dbg_backtrace_template_errors) - wc_backtrace(); + wc_backtrace(LOG_DEBUG); */ } @@ -335,7 +336,7 @@ void LogError (StrBuf *Target, const char *Type, const char *Format, ...) StrBufVAppendPrintf(Error, Format, arg_ptr); va_end(arg_ptr); - syslog(1, "%s", ChrPtr(Error)); + syslog(LOG_WARNING, "%s", ChrPtr(Error)); WCC = WC; if (WCC->WFBuf == NULL) WCC->WFBuf = NewStrBuf(); @@ -349,7 +350,7 @@ void LogError (StrBuf *Target, const char *Type, const char *Format, ...) FreeStrBuf(&Error); /* if (dbg_backtrace_template_errors) - wc_backtrace(); + wc_backtrace(LOG_DEBUG); */ } @@ -485,7 +486,6 @@ void GetTemplateTokenString(StrBuf *Target, long *len) { StrBuf *Buf; -/// WCTemplputParams SubTP; if (N >= TP->Tokens->nParameters) { LogTemplateError(Target, @@ -590,7 +590,7 @@ long GetTemplateTokenNumber(StrBuf *Target, WCTemplputParams *TP, int N, long df LogTemplateError(Target, "TokenParameter", N, TP, "invalid token %d. this shouldn't have come till here.\n", N); - wc_backtrace(); + wc_backtrace(LOG_DEBUG); return 0; } @@ -679,6 +679,7 @@ void StrBufAppendTemplate(StrBuf *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; @@ -695,10 +696,10 @@ void StrBufAppendTemplate(StrBuf *Target, 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; @@ -758,7 +759,7 @@ void StrBufAppendTemplateStr(StrBuf *Target, break; */ default: - StrBufAppendBufPlain(Target, Source, 0, 0); + StrBufAppendBufPlain(Target, Source, -1, 0); } } @@ -886,7 +887,7 @@ int GetNextParameter(StrBuf *Buf, } pche = pch; if (*pch != quote) { - syslog(1, "Error (in '%s' line %ld); " + syslog(LOG_WARNING, "Error (in '%s' line %ld); " "evaluating template param [%s] in Token [%s]\n", ChrPtr(pTmpl->FileName), Tokens->Line, @@ -900,7 +901,7 @@ int GetNextParameter(StrBuf *Buf, else { StrBufPeek(Buf, pch, -1, '\0'); if (LoadTemplates > 1) { - syslog(1, + syslog(LOG_DEBUG, "DBG: got param [%s] "SIZE_T_FMT" "SIZE_T_FMT"\n", pchs, pche - pchs, strlen(pchs) ); @@ -932,7 +933,7 @@ int GetNextParameter(StrBuf *Buf, else { Parm->lvalue = 0; /* TODO whUT? - syslog(1, "Error (in '%s' line %ld); " + syslog(LOG_DEBUG, "Error (in '%s' line %ld); " "evaluating long template param [%s] in Token [%s]\n", ChrPtr(pTmpl->FileName), Tokens->Line, @@ -1203,10 +1204,10 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf, } break; case SV_GETTEXT: - if (NewToken->nParameters !=1) { + if ((NewToken->nParameters < 1) || (NewToken->nParameters > 2)) { LogTemplateError( NULL, "Gettext", ERR_NAME, &TP, - "requires exactly 1 parameter, you gave %d params", + "requires 1 or 2 parameter, you gave %d params", NewToken->nParameters); NewToken->Flags = 0; break; @@ -1400,13 +1401,13 @@ void *load_template(StrBuf *Target, WCTemplate *NewTemplate) fd = open(ChrPtr(NewTemplate->FileName), O_RDONLY); if (fd <= 0) { - syslog(1, "ERROR: could not open template '%s' - %s\n", + syslog(LOG_WARNING, "ERROR: could not open template '%s' - %s\n", ChrPtr(NewTemplate->FileName), strerror(errno)); return NULL; } if (fstat(fd, &statbuf) == -1) { - syslog(1, "ERROR: could not stat template '%s' - %s\n", + syslog(LOG_WARNING, "ERROR: could not stat template '%s' - %s\n", ChrPtr(NewTemplate->FileName), strerror(errno)); return NULL; } @@ -1414,7 +1415,7 @@ void *load_template(StrBuf *Target, WCTemplate *NewTemplate) NewTemplate->Data = NewStrBufPlain(NULL, statbuf.st_size + 1); if (StrBufReadBLOB(NewTemplate->Data, &fd, 1, statbuf.st_size, &Err) < 0) { close(fd); - syslog(1, "ERROR: reading template '%s' - %s
\n", + syslog(LOG_WARNING, "ERROR: reading template '%s' - %s
\n", ChrPtr(NewTemplate->FileName), strerror(errno)); return NULL; } @@ -1526,8 +1527,7 @@ int LoadTemplateDir(const StrBuf *DirName, HashList *big, const StrBuf *BaseKey) 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 @@ -1619,7 +1619,7 @@ int LoadTemplateDir(const StrBuf *DirName, HashList *big, const StrBuf *BaseKey) StrBufAppendBufPlain(Key, filedir_entry->d_name, MinorPtr - filedir_entry->d_name, 0); if (LoadTemplates >= 1) - syslog(1, "%s %s\n", ChrPtr(FileName), ChrPtr(Key)); + syslog(LOG_DEBUG, "%s %s\n", ChrPtr(FileName), ChrPtr(Key)); prepare_template(FileName, Key, big); default: break; @@ -1714,7 +1714,7 @@ int EvaluateToken(StrBuf *Target, int state, WCTemplputParams **TPP) WCTemplputParams *TP = *TPP; /* much output, since pName is not terminated... - syslog(1,"Doing token: %s\n",Token->pName); + syslog(LOG_DEBUG,"Doing token: %s\n",Token->pName); */ switch (TP->Tokens->Flags) { @@ -1819,7 +1819,7 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams if (LoadTemplates != 0) { if (LoadTemplates > 1) - syslog(1, "DBG: ----- loading: [%s] ------ \n", + syslog(LOG_DEBUG, "DBG: ----- loading: [%s] ------ \n", ChrPtr(Tmpl->FileName)); pTmpl = duplicate_template(Tmpl); if(load_template(Target, pTmpl) == NULL) { @@ -1845,7 +1845,7 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams done = 1; } else { - int TokenRc; + int TokenRc = 0; StrBufAppendBufPlain( Target, pData, @@ -1907,6 +1907,8 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams } + +StrBuf *textPlainType; /** * \brief Display a variable-substituted template * \param templatename template file to load @@ -1931,25 +1933,30 @@ const StrBuf *DoTemplate(const char *templatename, long len, StrBuf *Target, WCT if (len == 0) { - syslog(1, "Can't to load a template with empty name!\n"); + syslog(LOG_WARNING, "Can't to load a template with empty name!\n"); StrBufAppendPrintf(Target, "
\nCan't to load a template with empty name!\n
"); - return NULL; + return textPlainType; } if (!GetHash(StaticLocal, templatename, len, &vTmpl) && !GetHash(Static, templatename, len, &vTmpl)) { - syslog(1, "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, "
\ndidn't find Template [%s] %ld %ld\n
", - 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); } @@ -1984,6 +1991,7 @@ typedef struct _HashIterator { RetrieveHashlistFunc GetHash; HashDestructorFunc Destructor; SubTemplFunc DoSubTemplate; + FilterByParamFunc Filter; } HashIterator; void RegisterITERATOR(const char *Name, long len, @@ -1992,6 +2000,7 @@ void RegisterITERATOR(const char *Name, long len, RetrieveHashlistFunc GetHash, SubTemplFunc DoSubTempl, HashDestructorFunc Destructor, + FilterByParamFunc Filter, CtxType ContextType, CtxType XPectContextType, int Flags) @@ -2005,6 +2014,7 @@ void RegisterITERATOR(const char *Name, long len, It->GetHash = GetHash; It->DoSubTemplate = DoSubTempl; It->Destructor = Destructor; + It->Filter = Filter; It->ContextType = ContextType; It->XPectContextType = XPectContextType; It->Flags = Flags; @@ -2158,6 +2168,13 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP) } 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); } @@ -2266,7 +2283,7 @@ int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **T rc = TP->Tokens->Params[1]->lvalue; if (LoadTemplates > 5) - syslog(1, "<%s> : %d %d==%d\n", + syslog(LOG_DEBUG, "<%s> : %d %d==%d\n", ChrPtr(TP->Tokens->FlatToken), rc, res, Neg); @@ -2532,9 +2549,6 @@ void tmpl_do_tabbed(StrBuf *Target, WCTemplputParams *TP) } StackContext (TP, &SubTP, &TS, CTX_TAB, 0, NULL); { -//// TODO jetzt memcpy (&SubTP, TP, sizeof(WCTemplputParams)); -// SubTP.Filter.ControlContextType = ; - StrTabbedDialog(Target, nTabs, TabNames); for (i = 0; i < ntabs; i++) { memset(&TS, 0, sizeof(tab_struct)); @@ -2590,7 +2604,7 @@ void RegisterSortFunc(const char *name, long len, NewSort->GroupChange = GroupChange; NewSort->ContextType = ContextType; if (ContextType == CTX_NONE) { - syslog(1, "sorting requires a context. CTX_NONE won't make it.\n"); + syslog(LOG_WARNING, "sorting requires a context. CTX_NONE won't make it.\n"); exit(1); } @@ -2639,7 +2653,7 @@ CompareFunc RetrieveSort(WCTemplputParams *TP, LogTemplateError( NULL, "Sorting", ERR_PARM1, TP, "Illegal default sort: [%s]", Default); - wc_backtrace(); + wc_backtrace(LOG_WARNING); } } SortBy = (SortStruct*)vSortBy; @@ -2884,7 +2898,7 @@ void dbg_print_longvector(long *LongVector) StrBufAppendPrintf(Buf, "%d: %ld]\n", i, LongVector[i]); } - syslog(1, "%s", ChrPtr(Buf)); + syslog(LOG_DEBUG, "%s", ChrPtr(Buf)); FreeStrBuf(&Buf); } @@ -2981,9 +2995,9 @@ void 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); @@ -3009,9 +3023,11 @@ void ServerShutdownModule_SUBST (void) { + FreeStrBuf(&textPlainType); + DeleteHash(&TemplateCache); DeleteHash(&LocalTemplateCache); - + DeleteHash(&GlobalNS); DeleteHash(&Iterators); DeleteHash(&Conditionals);