X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsieve.c;fp=webcit%2Fsieve.c;h=2e3d615853b4f09c68964856ed41ba3b2c358b03;hb=5d2d3f4eea91c74af93c735bff7ad9955b466181;hp=528009ef3f1ebb3f9899175d6aa427631308e28d;hpb=9f8e0bd23ce7dde31156b634f3a66bf234b11927;p=citadel.git diff --git a/webcit/sieve.c b/webcit/sieve.c index 528009ef3..2e3d61585 100644 --- a/webcit/sieve.c +++ b/webcit/sieve.c @@ -1,4 +1,3 @@ - /* * Copyright (c) 1996-2020 by the citadel.org team * @@ -49,20 +48,19 @@ void parse_fields_from_rule_editor(void) { char rule[2048]; char encoded_rule[4096]; char my_addresses[4096]; - + /* Enumerate my email addresses in case they are needed for a vacation rule */ my_addresses[0] = 0; serv_puts("GVEA"); serv_getln(buf, sizeof buf); - if (buf[0] == '1') - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - if (!IsEmptyStr(my_addresses)) { - strcat(my_addresses, ",\n"); - } - strcat(my_addresses, "\""); - strcat(my_addresses, buf); - strcat(my_addresses, "\""); + if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + if (!IsEmptyStr(my_addresses)) { + strcat(my_addresses, ",\n"); } + strcat(my_addresses, "\""); + strcat(my_addresses, buf); + strcat(my_addresses, "\""); + } /* Now generate the script and write it to the Citadel server */ serv_printf("PIBR"); @@ -71,49 +69,51 @@ void parse_fields_from_rule_editor(void) { return; } - for (i = 0; i < MAX_RULES; ++i) { - + for (i=0; iIsActive; } -int ConditionalSieveScriptIsRulesScript(StrBuf * Target, WCTemplputParams * TP) { - SieveListing *SieveList = (SieveListing *) CTX(CTX_SIEVELIST); +int ConditionalSieveScriptIsRulesScript(StrBuf *Target, WCTemplputParams *TP) +{ + SieveListing *SieveList = (SieveListing *)CTX(CTX_SIEVELIST); return SieveList->IsActive; } -void tmplput_SieveScriptName(StrBuf * Target, WCTemplputParams * TP) { - SieveListing *SieveList = (SieveListing *) CTX(CTX_SIEVELIST); +void tmplput_SieveScriptName(StrBuf *Target, WCTemplputParams *TP) +{ + SieveListing *SieveList = (SieveListing *)CTX(CTX_SIEVELIST); StrBufAppendTemplate(Target, TP, SieveList->Name, 0); } -void tmplput_SieveScriptContent(StrBuf * Target, WCTemplputParams * TP) { - SieveListing *SieveList = (SieveListing *) CTX(CTX_SIEVELIST); +void tmplput_SieveScriptContent(StrBuf *Target, WCTemplputParams *TP) +{ + SieveListing *SieveList = (SieveListing *)CTX(CTX_SIEVELIST); StrBufAppendTemplate(Target, TP, SieveList->Content, 0); } -void FreeSieveListing(void *vSieveListing) { - SieveListing *List = (SieveListing *) vSieveListing; +void FreeSieveListing(void *vSieveListing) +{ + SieveListing *List = (SieveListing*) vSieveListing; FreeStrBuf(&List->Name); free(List); } -HashList *GetSieveScriptListing(StrBuf * Target, WCTemplputParams * TP) { - wcsession *WCC = WC; +HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; StrBuf *Line; int num_scripts = 0; int rules_script_active = 0; int have_rules_script = 0; const char *pch; - HashPos *it; + HashPos *it; int Done = 0; SieveListing *Ruleset; @@ -212,25 +218,31 @@ HashList *GetSieveScriptListing(StrBuf * Target, WCTemplputParams * TP) { serv_puts("MSIV listscripts"); Line = NewStrBuf(); StrBuf_ServGetln(Line); - if (GetServerStatus(Line, NULL) == 1) { + if (GetServerStatus(Line, NULL) == 1) + { WCC->KnownSieveScripts = NewHash(1, Flathash); - while (!Done && (StrBuf_ServGetln(Line) >= 0)) - if ((StrLength(Line) == 3) && !strcmp(ChrPtr(Line), "000")) { + while(!Done && (StrBuf_ServGetln(Line) >= 0) ) + if ( (StrLength(Line)==3) && + !strcmp(ChrPtr(Line), "000")) + { Done = 1; } - else { + else + { pch = NULL; Ruleset = (SieveListing *) malloc(sizeof(SieveListing)); Ruleset->Name = NewStrBufPlain(NULL, StrLength(Line)); StrBufExtract_NextToken(Ruleset->Name, Line, &pch, '|'); - Ruleset->IsActive = StrBufExtractNext_int(Line, &pch, '|'); + Ruleset->IsActive = StrBufExtractNext_int(Line, &pch, '|'); Ruleset->Content = NULL; - if (!strcasecmp(ChrPtr(Ruleset->Name), RULES_SCRIPT)) { + if (!strcasecmp(ChrPtr(Ruleset->Name), RULES_SCRIPT)) + { Ruleset->IsRulesScript = 1; have_rules_script = 1; - if (Ruleset->IsActive) { + if (Ruleset->IsActive) + { rules_script_active = 1; PutBstr(HKEY("__SIEVE:RULESSCRIPT"), NewStrBufPlain(HKEY("1"))); } @@ -245,7 +257,8 @@ HashList *GetSieveScriptListing(StrBuf * Target, WCTemplputParams * TP) { PutBstr(HKEY("__SIEVE:EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1"))); } - if (num_scripts > have_rules_script) { + if (num_scripts > have_rules_script) + { long rc = 0; long len; const char *Key; @@ -257,24 +270,29 @@ HashList *GetSieveScriptListing(StrBuf * Target, WCTemplputParams * TP) { PutBstr(HKEY("__SIEVE:HAVE_EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1"))); it = GetNewHashPos(WCC->KnownSieveScripts, 0); - while (GetNextHashPos(WCC->KnownSieveScripts, it, &len, &Key, &vRuleset) && (vRuleset != NULL)) { + while (GetNextHashPos(WCC->KnownSieveScripts, it, &len, &Key, &vRuleset) && + (vRuleset != NULL)) + { Ruleset = (SieveListing *) vRuleset; serv_printf("MSIV getscript|%s", ChrPtr(Ruleset->Name)); StrBuf_ServGetln(Line); - if (GetServerStatus(Line, NULL) == 1) { + if (GetServerStatus(Line, NULL) == 1) + { Ruleset->Content = NewStrBuf(); Done = 0; - while (!Done && (rc = StrBuf_ServGetln(Line), rc >= 0)) - if ((StrLength(Line) == 3) && !strcmp(ChrPtr(Line), "000")) { + while(!Done && (rc = StrBuf_ServGetln(Line), rc >= 0) ) + if ( (StrLength(Line)==3) && + !strcmp(ChrPtr(Line), "000")) + { Done = 1; } - else { - if (StrLength(Ruleset->Content) > 0) + else + { + if (StrLength(Ruleset->Content)>0) StrBufAppendBufPlain(Ruleset->Content, HKEY("\n"), 0); StrBufAppendBuf(Ruleset->Content, Line, 0); } - if (rc < 0) - break; + if (rc < 0) break; } } } @@ -283,21 +301,22 @@ HashList *GetSieveScriptListing(StrBuf * Target, WCTemplputParams * TP) { } -typedef enum __eSieveHfield { - from, - tocc, - subject, - replyto, - sender, - resentfrom, - resentto, - envfrom, - envto, - xmailer, - xspamflag, - xspamstatus, - listid, - size, +typedef enum __eSieveHfield +{ + from, + tocc, + subject, + replyto, + sender, + resentfrom, + resentto, + envfrom, + envto, + xmailer, + xspamflag, + xspamstatus, + listid, + size, all } eSieveHfield; @@ -343,89 +362,128 @@ typedef struct __SieveRule { StrBuf *redirect; StrBuf *automsg; eSieveFinal final; -} SieveRule; +}SieveRule; -int ConditionalSieveRule_hfield(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - - return GetTemplateTokenNumber(Target, TP, 3, from) - == Rule->hfield; +int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + + return GetTemplateTokenNumber(Target, + TP, + 3, + from) + == + Rule->hfield; } -int ConditionalSieveRule_compare(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return GetTemplateTokenNumber(Target, TP, 3, contains) - == Rule->compare; +int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return GetTemplateTokenNumber(Target, + TP, + 3, + contains) + == + Rule->compare; } -int ConditionalSieveRule_action(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return GetTemplateTokenNumber(Target, TP, 3, keep) - == Rule->Action; +int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return GetTemplateTokenNumber(Target, + TP, + 3, + keep) + == + Rule->Action; } -int ConditionalSieveRule_sizecomp(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return GetTemplateTokenNumber(Target, TP, 3, larger) - == Rule->sizecomp; +int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return GetTemplateTokenNumber(Target, + TP, + 3, + larger) + == + Rule->sizecomp; } -int ConditionalSieveRule_final(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return GetTemplateTokenNumber(Target, TP, 3, econtinue) - == Rule->final; +int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return GetTemplateTokenNumber(Target, + TP, + 3, + econtinue) + == + Rule->final; } -int ConditionalSieveRule_ThisRoom(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return GetTemplateTokenNumber(Target, TP, 3, econtinue) - == Rule->final; +int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return GetTemplateTokenNumber(Target, + TP, + 3, + econtinue) + == + Rule->final; } -int ConditionalSieveRule_Active(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - return Rule->active; +int ConditionalSieveRule_Active(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + return Rule->active; } -void tmplput_SieveRule_htext(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); +void tmplput_SieveRule_htext(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); StrBufAppendTemplate(Target, TP, Rule->htext, 0); } -void tmplput_SieveRule_fileinto(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); +void tmplput_SieveRule_fileinto(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); StrBufAppendTemplate(Target, TP, Rule->fileinto, 0); } -void tmplput_SieveRule_redirect(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); +void tmplput_SieveRule_redirect(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); StrBufAppendTemplate(Target, TP, Rule->redirect, 0); } -void tmplput_SieveRule_automsg(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); +void tmplput_SieveRule_automsg(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); StrBufAppendTemplate(Target, TP, Rule->automsg, 0); } -void tmplput_SieveRule_sizeval(StrBuf * Target, WCTemplputParams * TP) { - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); +void tmplput_SieveRule_sizeval(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); StrBufAppendPrintf(Target, "%d", Rule->sizeval); } -void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf * Target, WCTemplputParams * TP) { +void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf *Target, WCTemplputParams *TP) +{ void *vRoom; - SieveRule *Rule = (SieveRule *) CTX(CTX_SIEVESCRIPT); - wcsession *WCC = WC; + SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); + wcsession *WCC = WC; HashList *Rooms = GetRoomListHashLKRA(Target, TP); GetHash(Rooms, SKEY(Rule->fileinto), &vRoom); - WCC->ThisRoom = (folder *) vRoom; + WCC->ThisRoom = (folder*) vRoom; } -void FreeSieveRule(void *vRule) { - SieveRule *Rule = (SieveRule *) vRule; +void FreeSieveRule(void *vRule) +{ + SieveRule *Rule = (SieveRule*) vRule; FreeStrBuf(&Rule->htext); FreeStrBuf(&Rule->fileinto); FreeStrBuf(&Rule->redirect); FreeStrBuf(&Rule->automsg); - + free(Rule); } #define WC_RULE_HEADER "rule|" -HashList *GetSieveRules(StrBuf * Target, WCTemplputParams * TP) { +HashList *GetSieveRules(StrBuf *Target, WCTemplputParams *TP) +{ StrBuf *Line = NULL; StrBuf *EncodedRule = NULL; int n = 0; @@ -439,34 +497,38 @@ HashList *GetSieveRules(StrBuf * Target, WCTemplputParams * TP) { Line = NewStrBuf(); EncodedRule = NewStrBuf(); StrBuf_ServGetln(Line); - if (GetServerStatus(Line, NULL) == 1) { - while (!Done && (StrBuf_ServGetln(Line) >= 0)) - if ((StrLength(Line) == 3) && !strcmp(ChrPtr(Line), "000")) { + if (GetServerStatus(Line, NULL) == 1) + { + while(!Done && (StrBuf_ServGetln(Line) >= 0) ) + if ( (StrLength(Line)==3) && + !strcmp(ChrPtr(Line), "000")) + { Done = 1; } - else { + else + { pch = NULL; /* We just care for our encoded header and skip everything else */ - if ((StrLength(Line) > sizeof(WC_RULE_HEADER) - 1) - && (!strncasecmp(ChrPtr(Line), HKEY(WC_RULE_HEADER)))) { + if ((StrLength(Line) > sizeof(WC_RULE_HEADER) - 1) && (!strncasecmp(ChrPtr(Line), HKEY(WC_RULE_HEADER)))) + { StrBufSkip_NTokenS(Line, &pch, '|', 1); - n = StrBufExtractNext_int(Line, &pch, '|'); + n = StrBufExtractNext_int(Line, &pch, '|'); StrBufExtract_NextToken(EncodedRule, Line, &pch, '|'); StrBufDecodeBase64(EncodedRule); - Rule = (SieveRule *) malloc(sizeof(SieveRule)); + Rule = (SieveRule*) malloc(sizeof(SieveRule)); - Rule->htext = NewStrBufPlain(NULL, StrLength(EncodedRule)); + Rule->htext = NewStrBufPlain (NULL, StrLength(EncodedRule)); - Rule->fileinto = NewStrBufPlain(NULL, StrLength(EncodedRule)); - Rule->redirect = NewStrBufPlain(NULL, StrLength(EncodedRule)); - Rule->automsg = NewStrBufPlain(NULL, StrLength(EncodedRule)); + Rule->fileinto = NewStrBufPlain (NULL, StrLength(EncodedRule)); + Rule->redirect = NewStrBufPlain (NULL, StrLength(EncodedRule)); + Rule->automsg = NewStrBufPlain (NULL, StrLength(EncodedRule)); /* Grab our existing values to populate */ pch = NULL; Rule->active = StrBufExtractNext_int(EncodedRule, &pch, '|'); StrBufExtract_NextToken(Line, EncodedRule, &pch, '|'); - + Rule->hfield = (eSieveHfield) GetTokenDefine(SKEY(Line), tocc); StrBufExtract_NextToken(Line, EncodedRule, &pch, '|'); Rule->compare = (eSieveCompare) GetTokenDefine(SKEY(Line), contains); @@ -488,10 +550,10 @@ HashList *GetSieveRules(StrBuf * Target, WCTemplputParams * TP) { } while (n < MAX_RULES) { - Rule = (SieveRule *) malloc(sizeof(SieveRule)); + Rule = (SieveRule*) malloc(sizeof(SieveRule)); memset(Rule, 0, sizeof(SieveRule)); Put(SieveRules, IKEY(n), Rule, FreeSieveRule); - + n++; } @@ -501,27 +563,33 @@ HashList *GetSieveRules(StrBuf * Target, WCTemplputParams * TP) { return SieveRules; } -void SessionDetachModule_SIEVE(wcsession * sess) { +void +SessionDetachModule_SIEVE +(wcsession *sess) +{ DeleteHash(&sess->KnownSieveScripts); } -void InitModule_SIEVE(void) { +void +InitModule_SIEVE +(void) +{ RegisterCTX(CTX_SIEVELIST); RegisterCTX(CTX_SIEVESCRIPT); - REGISTERTokenParamDefine(from); - REGISTERTokenParamDefine(tocc); - REGISTERTokenParamDefine(subject); - REGISTERTokenParamDefine(replyto); - REGISTERTokenParamDefine(sender); - REGISTERTokenParamDefine(resentfrom); - REGISTERTokenParamDefine(resentto); - REGISTERTokenParamDefine(envfrom); - REGISTERTokenParamDefine(envto); - REGISTERTokenParamDefine(xmailer); - REGISTERTokenParamDefine(xspamflag); - REGISTERTokenParamDefine(xspamstatus); - REGISTERTokenParamDefine(listid); - REGISTERTokenParamDefine(size); + REGISTERTokenParamDefine(from); + REGISTERTokenParamDefine(tocc); + REGISTERTokenParamDefine(subject); + REGISTERTokenParamDefine(replyto); + REGISTERTokenParamDefine(sender); + REGISTERTokenParamDefine(resentfrom); + REGISTERTokenParamDefine(resentto); + REGISTERTokenParamDefine(envfrom); + REGISTERTokenParamDefine(envto); + REGISTERTokenParamDefine(xmailer); + REGISTERTokenParamDefine(xspamflag); + REGISTERTokenParamDefine(xspamstatus); + REGISTERTokenParamDefine(listid); + REGISTERTokenParamDefine(size); REGISTERTokenParamDefine(all); REGISTERTokenParamDefine(contains); @@ -552,7 +620,7 @@ void InitModule_SIEVE(void) { RegisterNamespace("SIEVE:SCRIPT:NAME", 0, 1, tmplput_SieveScriptName, NULL, CTX_SIEVELIST); RegisterNamespace("SIEVE:SCRIPT:CONTENT", 0, 1, tmplput_SieveScriptContent, NULL, CTX_SIEVELIST); - + RegisterIterator("SIEVE:RULES", 0, NULL, GetSieveRules, NULL, DeleteHash, CTX_SIEVESCRIPT, CTX_NONE, IT_NOFLAG); RegisterConditional("COND:SIEVE:ACTIVE", 1, ConditionalSieveRule_Active, CTX_SIEVESCRIPT);