X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsieve.c;h=cce70574ae927c451f165af0488e47215e27ac8c;hb=HEAD;hp=6c39881e9ccee2e96a02536c78beb1ced7e14aea;hpb=f0de34e3bbd81ba6b80479409a36a02da31e4d7d;p=citadel.git diff --git a/webcit/sieve.c b/webcit/sieve.c index 6c39881e9..2e3d61585 100644 --- a/webcit/sieve.c +++ b/webcit/sieve.c @@ -1,643 +1,644 @@ -/* - * $Id: $ - */ -/** - * \defgroup Sieve view/edit sieve config - * \ingroup WebcitDisplayItems +/* + * 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 10 +#define MAX_RULES 50 +#define RULES_SCRIPT "__WebCit_Generated_Script__" + -/** - * \brief view/edit sieve config +/* + * Translate the fields from the rule editor into something we can save... */ -void display_sieve(void) -{ - char script_names[MAX_SCRIPTS][64]; - int num_scripts = 0; - int active_script = (-1); - char buf[256]; +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]; - - memset(script_names, 0, sizeof script_names); - - serv_puts("MSIV listscripts"); - serv_getln(buf, sizeof(buf)); - if (buf[0] == '1') while (serv_getln(buf, sizeof(buf)), strcmp(buf, "000")) { - if (num_scripts < MAX_SCRIPTS) { - extract_token(script_names[num_scripts], buf, 0, '|', 64); - if (extract_int(buf, 1) > 0) { - active_script = num_scripts; - } - ++num_scripts; + /* 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, "\""); } - output_headers(1, 1, 2, 0, 0, 0); - - wprintf(" \n" - ); - - wprintf("
\n\n");
-
- svprintf("BOXTITLE", WCS_STRING, _("Add a new script"));
- do_template("beginbox");
-
- wprintf(_("To create a new script, enter the desired "
- "script name in the box below and click 'Create'."));
- wprintf(" "); - - wprintf(" | ");
-
- svprintf("BOXTITLE", WCS_STRING, _("Delete scripts"));
- do_template("beginbox");
-
- wprintf(_("To delete an existing script, select the script "
- "name from the list and click 'Delete'."));
- wprintf(" "); - - wprintf(" |
"); - - wprintf("" - "", i-1, i); - - wprintf("" - "", - i, i+1, i); - - wprintf("" - "", - i, i); - - wprintf(" %d. %s | ", i+1, _("If") ); - - wprintf(" "); - - if (i>0) wprintf(""); - - wprintf(""); - wprintf(" | "); - - wprintf("");
-
- wprintf(" ", i);
- wprintf("");
-
- wprintf("", i, i);
- wprintf(" ");
-
- wprintf("", i);
- wprintf("");
-
- wprintf("", i, i);
- wprintf("bytes");
- wprintf(" ");
-
- wprintf(" | ");
-
- wprintf("");
- wprintf("");
-
- wprintf(" ", i);
- //wprintf(" ");
+ }
+ FreeStrBuf(&Line);
+ return WCC->KnownSieveScripts;
+}
- wprintf("", i);
- wprintf("", i, i);
- wprintf(" ");
- wprintf(" | ");
+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);
- wprintf("%s | ", _("and then") ); + GetHash(Rooms, SKEY(Rule->fileinto), &vRoom); + WCC->ThisRoom = (folder*) vRoom; +} - wprintf("");
- wprintf(" | ");
+void FreeSieveRule(void *vRule)
+{
+ SieveRule *Rule = (SieveRule*) vRule;
- wprintf("\n");
+ 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++;
+ }
+ }
}
- wprintf("