X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsieve.c;fp=webcit%2Fsieve.c;h=0000000000000000000000000000000000000000;hb=76a0f8571de023fe6bd20390174a2302e0a0b982;hp=2e3d615853b4f09c68964856ed41ba3b2c358b03;hpb=50511759c152f4ca2e22fb39a9bf31fc9f9d916d;p=citadel.git diff --git a/webcit/sieve.c b/webcit/sieve.c deleted file mode 100644 index 2e3d61585..000000000 --- a/webcit/sieve.c +++ /dev/null @@ -1,644 +0,0 @@ -/* - * Copyright (c) 1996-2020 by the citadel.org team - * - * This program is open source software. You can redistribute it and/or - * modify it under the terms of the GNU General Public License version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * Implementation note: this was kind of hacked up when we switched from Sieve to custom rules. - * As a result there's probably some cruft in here... - * ajc 2020jul12 - * - */ - -#include "webcit.h" - -CtxType CTX_SIEVELIST = CTX_NONE; -CtxType CTX_SIEVESCRIPT = CTX_NONE; - -#define MAX_SCRIPTS 100 -#define MAX_RULES 50 -#define RULES_SCRIPT "__WebCit_Generated_Script__" - - -/* - * Translate the fields from the rule editor into something we can save... - */ -void parse_fields_from_rule_editor(void) { - - int active; - char hfield[256]; - char compare[32]; - char htext[256]; - char sizecomp[32]; - int sizeval; - char action[32]; - char fileinto[128]; - char redirect[256]; - char automsg[1024]; - char final[32]; - int i; - char buf[256]; - char fname[256]; - 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, "\""); - } - - /* Now generate the script and write it to the Citadel server */ - serv_printf("PIBR"); - serv_getln(buf, sizeof buf); - if (buf[0] != '4') { - return; - } - - for (i=0; iIsActive; -} -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); - StrBufAppendTemplate(Target, TP, SieveList->Name, 0); -} -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; - - FreeStrBuf(&List->Name); - free(List); -} - -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; - int Done = 0; - SieveListing *Ruleset; - - if (WCC->KnownSieveScripts != NULL) { - return WCC->KnownSieveScripts; - } - - serv_puts("MSIV listscripts"); - Line = NewStrBuf(); - StrBuf_ServGetln(Line); - if (GetServerStatus(Line, NULL) == 1) - { - WCC->KnownSieveScripts = NewHash(1, Flathash); - - while(!Done && (StrBuf_ServGetln(Line) >= 0) ) - if ( (StrLength(Line)==3) && - !strcmp(ChrPtr(Line), "000")) - { - Done = 1; - } - 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->Content = NULL; - - if (!strcasecmp(ChrPtr(Ruleset->Name), RULES_SCRIPT)) - { - Ruleset->IsRulesScript = 1; - have_rules_script = 1; - if (Ruleset->IsActive) - { - rules_script_active = 1; - PutBstr(HKEY("__SIEVE:RULESSCRIPT"), NewStrBufPlain(HKEY("1"))); - } - } - Put(WCC->KnownSieveScripts, IKEY(num_scripts), Ruleset, FreeSieveListing); - - ++num_scripts; - } - } - - if ((num_scripts > 0) && (rules_script_active == 0)) { - PutBstr(HKEY("__SIEVE:EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1"))); - } - - if (num_scripts > have_rules_script) - { - long rc = 0; - long len; - const char *Key; - void *vRuleset; - - /* - * ok; we have custom scripts, expose that via bstr, and load the payload. - */ - PutBstr(HKEY("__SIEVE:HAVE_EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1"))); - - it = GetNewHashPos(WCC->KnownSieveScripts, 0); - 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) - { - Ruleset->Content = NewStrBuf(); - Done = 0; - while(!Done && (rc = StrBuf_ServGetln(Line), rc >= 0) ) - if ( (StrLength(Line)==3) && - !strcmp(ChrPtr(Line), "000")) - { - Done = 1; - } - else - { - if (StrLength(Ruleset->Content)>0) - StrBufAppendBufPlain(Ruleset->Content, HKEY("\n"), 0); - StrBufAppendBuf(Ruleset->Content, Line, 0); - } - if (rc < 0) break; - } - } - } - FreeStrBuf(&Line); - return WCC->KnownSieveScripts; -} - - -typedef enum __eSieveHfield -{ - from, - tocc, - subject, - replyto, - sender, - resentfrom, - resentto, - envfrom, - envto, - xmailer, - xspamflag, - xspamstatus, - listid, - size, - all -} eSieveHfield; - -typedef enum __eSieveCompare { - contains, - notcontains, - is, - isnot, - matches, - notmatches -} eSieveCompare; - -typedef enum __eSieveAction { - keep, - discard, - reject, - fileinto, - redirect, - vacation -} eSieveAction; - - -typedef enum __eSieveSizeComp { - larger, - smaller -} eSieveSizeComp; - -typedef enum __eSieveFinal { - econtinue, - estop -} eSieveFinal; - - -typedef struct __SieveRule { - int active; - int sizeval; - eSieveHfield hfield; - eSieveCompare compare; - StrBuf *htext; - eSieveSizeComp sizecomp; - eSieveAction Action; - StrBuf *fileinto; - StrBuf *redirect; - StrBuf *automsg; - eSieveFinal final; -}SieveRule; - - - -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_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_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_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); - StrBufAppendTemplate(Target, TP, Rule->htext, 0); -} -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); - StrBufAppendTemplate(Target, TP, Rule->redirect, 0); -} -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); - StrBufAppendPrintf(Target, "%d", Rule->sizeval); -} - -void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf *Target, WCTemplputParams *TP) -{ - void *vRoom; - SieveRule *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT); - wcsession *WCC = WC; - HashList *Rooms = GetRoomListHashLKRA(Target, TP); - - GetHash(Rooms, SKEY(Rule->fileinto), &vRoom); - WCC->ThisRoom = (folder*) vRoom; -} - -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) -{ - StrBuf *Line = NULL; - StrBuf *EncodedRule = NULL; - int n = 0; - const char *pch = NULL; - HashList *SieveRules = NULL; - int Done = 0; - SieveRule *Rule = NULL; - - SieveRules = NewHash(1, Flathash); - serv_printf("GIBR"); - 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")) - { - Done = 1; - } - 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)))) - { - StrBufSkip_NTokenS(Line, &pch, '|', 1); - n = StrBufExtractNext_int(Line, &pch, '|'); - StrBufExtract_NextToken(EncodedRule, Line, &pch, '|'); - StrBufDecodeBase64(EncodedRule); - - Rule = (SieveRule*) malloc(sizeof(SieveRule)); - - Rule->htext = 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); - StrBufExtract_NextToken(Rule->htext, EncodedRule, &pch, '|'); - StrBufExtract_NextToken(Line, EncodedRule, &pch, '|'); - Rule->sizecomp = (eSieveSizeComp) GetTokenDefine(SKEY(Line), larger); - Rule->sizeval = StrBufExtractNext_int(EncodedRule, &pch, '|'); - StrBufExtract_NextToken(Line, EncodedRule, &pch, '|'); - Rule->Action = (eSieveAction) GetTokenDefine(SKEY(Line), keep); - StrBufExtract_NextToken(Rule->fileinto, EncodedRule, &pch, '|'); - StrBufExtract_NextToken(Rule->redirect, EncodedRule, &pch, '|'); - StrBufExtract_NextToken(Rule->automsg, EncodedRule, &pch, '|'); - StrBufExtract_NextToken(Line, EncodedRule, &pch, '|'); - Rule->final = (eSieveFinal) GetTokenDefine(SKEY(Line), econtinue); - Put(SieveRules, IKEY(n), Rule, FreeSieveRule); - n++; - } - } - } - - while (n < MAX_RULES) { - Rule = (SieveRule*) malloc(sizeof(SieveRule)); - memset(Rule, 0, sizeof(SieveRule)); - Put(SieveRules, IKEY(n), Rule, FreeSieveRule); - - n++; - } - - - FreeStrBuf(&EncodedRule); - FreeStrBuf(&Line); - return SieveRules; -} - -void -SessionDetachModule_SIEVE -(wcsession *sess) -{ - DeleteHash(&sess->KnownSieveScripts); -} - -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(all); - - REGISTERTokenParamDefine(contains); - REGISTERTokenParamDefine(notcontains); - REGISTERTokenParamDefine(is); - REGISTERTokenParamDefine(isnot); - REGISTERTokenParamDefine(matches); - REGISTERTokenParamDefine(notmatches); - - REGISTERTokenParamDefine(keep); - REGISTERTokenParamDefine(discard); - REGISTERTokenParamDefine(reject); - REGISTERTokenParamDefine(fileinto); - REGISTERTokenParamDefine(redirect); - REGISTERTokenParamDefine(vacation); - - REGISTERTokenParamDefine(larger); - REGISTERTokenParamDefine(smaller); - - /* these are c-keyworads, so do it by hand. */ - RegisterTokenParamDefine(HKEY("continue"), econtinue); - RegisterTokenParamDefine(HKEY("stop"), estop); - - RegisterIterator("SIEVE:SCRIPTS", 0, NULL, GetSieveScriptListing, NULL, NULL, CTX_SIEVELIST, CTX_NONE, IT_NOFLAG); - - RegisterConditional("COND:SIEVE:SCRIPT:ACTIVE", 0, ConditionalSieveScriptIsActive, CTX_SIEVELIST); - RegisterConditional("COND:SIEVE:SCRIPT:ISRULES", 0, ConditionalSieveScriptIsRulesScript, CTX_SIEVELIST); - 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); - RegisterConditional("COND:SIEVE:HFIELD", 1, ConditionalSieveRule_hfield, CTX_SIEVESCRIPT); - RegisterConditional("COND:SIEVE:COMPARE", 1, ConditionalSieveRule_compare, CTX_SIEVESCRIPT); - RegisterConditional("COND:SIEVE:ACTION", 1, ConditionalSieveRule_action, CTX_SIEVESCRIPT); - RegisterConditional("COND:SIEVE:SIZECOMP", 1, ConditionalSieveRule_sizecomp, CTX_SIEVESCRIPT); - RegisterConditional("COND:SIEVE:FINAL", 1, ConditionalSieveRule_final, CTX_SIEVESCRIPT); - RegisterConditional("COND:SIEVE:THISROOM", 1, ConditionalSieveRule_ThisRoom, CTX_SIEVESCRIPT); - - RegisterNamespace("SIEVE:SCRIPT:HTEXT", 0, 1, tmplput_SieveRule_htext, NULL, CTX_SIEVESCRIPT); - RegisterNamespace("SIEVE:SCRIPT:SIZE", 0, 1, tmplput_SieveRule_sizeval, NULL, CTX_SIEVESCRIPT); - RegisterNamespace("SIEVE:SCRIPT:FILEINTO", 0, 1, tmplput_SieveRule_fileinto, NULL, CTX_SIEVESCRIPT); - RegisterNamespace("SIEVE:SCRIPT:REDIRECT", 0, 1, tmplput_SieveRule_redirect, NULL, CTX_SIEVESCRIPT); - RegisterNamespace("SIEVE:SCRIPT:AUTOMSG", 0, 1, tmplput_SieveRule_automsg, NULL, CTX_SIEVESCRIPT); - - /* fetch our room into WCC->ThisRoom, to evaluate while iterating over rooms with COND:THIS:THAT:ROOM */ - RegisterNamespace("SIEVE:SCRIPT:LOOKUP_FILEINTO", 0, 1, tmplput_SieveRule_lookup_FileIntoRoom, NULL, CTX_SIEVESCRIPT); - WebcitAddUrlHandler(HKEY("save_sieve"), "", 0, save_sieve, 0); - WebcitAddUrlHandler(HKEY("display_sieve_add_or_delete"), "", 0, display_sieve_add_or_delete, 0); -}