-
/*
* Copyright (c) 1996-2020 by the citadel.org team
*
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");
return;
}
- for (i = 0; i < MAX_RULES; ++i) {
-
+ for (i=0; i<MAX_RULES; ++i) {
+
strcpy(rule, "");
sprintf(fname, "active%d", i);
- active = !strcasecmp(BSTR(fname), "on");
+ active = !strcasecmp(BSTR(fname), "on") ;
if (active) {
sprintf(fname, "hfield%d", i);
safestrncpy(hfield, BSTR(fname), sizeof hfield);
-
+
sprintf(fname, "compare%d", i);
safestrncpy(compare, BSTR(fname), sizeof compare);
-
+
sprintf(fname, "htext%d", i);
safestrncpy(htext, BSTR(fname), sizeof htext);
-
+
sprintf(fname, "sizecomp%d", i);
safestrncpy(sizecomp, BSTR(fname), sizeof sizecomp);
-
+
sprintf(fname, "sizeval%d", i);
sizeval = IBSTR(fname);
-
+
sprintf(fname, "action%d", i);
safestrncpy(action, BSTR(fname), sizeof action);
-
+
sprintf(fname, "fileinto%d", i);
safestrncpy(fileinto, BSTR(fname), sizeof fileinto);
-
+
sprintf(fname, "redirect%d", i);
safestrncpy(redirect, BSTR(fname), sizeof redirect);
-
+
sprintf(fname, "automsg%d", i);
safestrncpy(automsg, BSTR(fname), sizeof automsg);
-
+
sprintf(fname, "final%d", i);
safestrncpy(final, BSTR(fname), sizeof final);
-
+
snprintf(rule, sizeof rule, "%d|%s|%s|%s|%s|%d|%s|%s|%s|%s|%s",
- active, hfield, compare, htext, sizecomp, sizeval, action, fileinto, redirect, automsg, final);
-
- size_t len = CtdlEncodeBase64(encoded_rule, rule, strlen(rule) + 1, BASE64_NO_LINEBREAKS);
+ active, hfield, compare, htext, sizecomp, sizeval, action, fileinto,
+ redirect, automsg, final
+ );
+
+ size_t len = CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, BASE64_NO_LINEBREAKS);
if (encoded_rule[len - 1] == '\n') {
encoded_rule[len - 1] = '\0';
}
StrBuf *Content;
} SieveListing;
-int ConditionalSieveScriptIsActive(StrBuf * Target, WCTemplputParams * TP) {
- SieveListing *SieveList = (SieveListing *) CTX(CTX_SIEVELIST);
+int ConditionalSieveScriptIsActive(StrBuf *Target, WCTemplputParams *TP)
+{
+ SieveListing *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
return SieveList->IsActive;
}
-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;
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")));
}
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;
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;
}
}
}
}
-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;
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;
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);
}
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++;
}
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);
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);