X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsieve.c;h=8cf76e459a2b6fc85f7f2cd5a080aa9214e31c2e;hb=68d6ac2aeb2c46dfca9ce85351780c6136e0cc84;hp=be9484b783170bd425e2996fee7c0dc26425341a;hpb=608f0be330912658d8294a084cb773496d849ce8;p=citadel.git diff --git a/webcit/sieve.c b/webcit/sieve.c index be9484b78..8cf76e459 100644 --- a/webcit/sieve.c +++ b/webcit/sieve.c @@ -21,223 +21,7 @@ #define MAX_SCRIPTS 100 #define MAX_RULES 50 #define RULES_SCRIPT "__WebCit_Generated_Script__" -<<<<<<< HEAD - - -/* - * dummy panel indicating to the user that the server doesn't support Sieve - */ -void display_no_sieve(void) { - - output_headers(1, 1, 2, 0, 0, 0); - - wc_printf("
\n"); - wc_printf(""); - wc_printf("

"); - wc_printf(_("View/edit server-side mail filters")); - wc_printf("

\n"); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf("" - "
\n"); - - wc_printf(_("This installation of Citadel was built without support for server-side mail filtering." - "
Please contact your system administrator if you require this feature.
")); - - wc_printf("
\n"); - wDumpContent(1); -} - - -/* - * view/edit sieve config - */ -void display_sieve(void) -{ - char script_names[MAX_SCRIPTS][64]; - int num_scripts = 0; - int active_script = (-1); - char buf[SIZ]; /* Don't make this buffer smaller or it will restrict line length */ - int i; - int rules_script_is_active = 0; - - if (!WC->serv_info->serv_supports_sieve) { - display_no_sieve(); - return; - } - - 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; - if (!strcasecmp(script_names[num_scripts], RULES_SCRIPT)) { - rules_script_is_active = 1; - } - } - ++num_scripts; - } - } - - output_headers(1, 1, 2, 0, 0, 0); - - wc_printf(" \n" - ); - - wc_printf("
\n"); - wc_printf(""); - wc_printf("

"); - wc_printf(_("View/edit server-side mail filters")); - wc_printf("

\n"); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf("" - "
\n"); - - - wc_printf("
\n"); - wc_printf("\n", WC->nonce); - - wc_printf(_("When new mail arrives: ")); - wc_printf(""); - - - - /* The "no filtering" div */ - - wc_printf("
\n"); - wc_printf("


"); - wc_printf(_("Your incoming mail will not be filtered through any scripts.")); - wc_printf("

\n"); - wc_printf("
\n"); - - /* The "webcit managed scripts" div */ - - wc_printf("
\n"); - display_rules_editor_inner_div(); - wc_printf("
\n"); - - /* The "I'm smart and can write my own Sieve scripts" div */ - - wc_printf("
\n"); - - if (num_scripts > 0) { - wc_printf(_("The currently active script is: ")); - wc_printf("\n"); - } - - wc_printf("   "); - wc_printf("%s\n", _("Add or delete scripts")); - - wc_printf("
\n"); - - if (num_scripts > 0) { - for (i=0; i\n", script_names[i]); - wc_printf("\n"); - wc_printf("
\n"); - } - } - } - - wc_printf(" \n" - ); - - wc_printf("\n"); - - - /* The rest of this is common for all panels... */ - - wc_printf("

"); - wc_printf("", _("Save changes")); - wc_printf(" "); - wc_printf("\n", _("Cancel")); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf(" \n" - ); - - wDumpContent(1); - -} - - - -======= -#define FOO 1 ->>>>>>> 1423eb9402b934a3f524a9b7bfd593e9b004cc0a +/*#define FOO 1*/ /* * Helper function for output_sieve_rule() to output strings with quotes escaped */ @@ -257,6 +41,7 @@ void osr_sanitize(char *str) { } void display_add_remove_scripts(char *message); +void display_rules_editor_inner_div(void); @@ -593,8 +378,7 @@ void save_sieve(void) { char buf[256]; if (!havebstr("save_button")) { - strcpy(WC->ImportantMessage, - _("Cancelled. Changes were not saved.")); + AppendImportantMessage(_("Cancelled. Changes were not saved."), -1); display_main_menu(); return; } @@ -650,7 +434,7 @@ void save_sieve(void) { } } - strcpy(WC->ImportantMessage, _("Your changes have been saved.")); + AppendImportantMessage(_("Your changes have been saved."), -1); display_main_menu(); return; } @@ -681,12 +465,20 @@ void create_script(void) { serv_puts("000"); #if FOO display_add_remove_scripts(_("A new script has been created. Return to the script editing screen to edit and activate it.")); +#else + output_headers(1, 1, 2, 0, 0, 0); + do_template("sieve_add"); + wDumpContent(1); #endif return; } #if FOO display_add_remove_scripts(&buf[4]); +#else + output_headers(1, 1, 2, 0, 0, 0); + do_template("sieve_add"); + wDumpContent(1); #endif } @@ -703,6 +495,10 @@ void delete_script(void) { serv_getln(buf, sizeof buf); #if FOO display_add_remove_scripts(&buf[4]); +#else + output_headers(1, 1, 2, 0, 0, 0); + do_template("sieve_add"); + wDumpContent(1); #endif } @@ -755,36 +551,36 @@ void display_sieve(void) output_headers(1, 1, 2, 0, 0, 0); - wc_printf(" \n" - ); + wc_printf("\n" +); wc_printf("
\n"); - wc_printf(""); + wc_printf(""); wc_printf("

"); wc_printf(_("View/edit server-side mail filters")); wc_printf("

\n"); @@ -792,8 +588,8 @@ void display_sieve(void) wc_printf("
\n"); - wc_printf("" - "
\n"); + wc_printf("\n" + "\n", + wc_printf("", i, - ((i%2) ? "DDDDDD" : "FFFFFF") + ((i%2) ? "odd" : "even") ); - wc_printf(""); + wc_printf("\n\n\n"); - wc_printf(""); + wc_printf("\n"); wc_printf(""); wc_printf(""); + wc_printf("\n"); char *final_values[2][2] = { { "continue", _("continue processing") }, { "stop", _("stop") } }; - wc_printf("", _("and then") ); + wc_printf("\n", _("and then") ); - wc_printf(""); + wc_printf("\n\n"); + wc_printf("\n"); wc_printf("\n"); } - wc_printf("
\n"); wc_printf("
\n"); @@ -815,7 +611,7 @@ void display_sieve(void) wc_printf(_("Filter it through a manually edited script (advanced users only)")); wc_printf("\n"); - wc_printf(""); + wc_printf("\n\n"); @@ -849,7 +645,7 @@ void display_sieve(void) ); } } - wc_printf("\n"); + wc_printf("\n\n"); } wc_printf("   "); @@ -927,9 +723,9 @@ void display_add_remove_scripts(char *message) wc_printf("
\n"); - do_template("beginbox_1"); + do_template("box_begin_1"); StrBufAppendBufPlain(WC->WBuf, _("Add a new script"), -1, 0); - do_template("beginbox_2"); + do_template("box_begin_2"); wc_printf(_("To create a new script, enter the desired " "script name in the box below and click 'Create'.")); @@ -942,21 +738,21 @@ void display_add_remove_scripts(char *message) "" "\n", _("Create")); - do_template("endbox"); + do_template("box_end"); - do_template("beginbox_1"); + do_template("box_begin_1"); StrBufAppendBufPlain(WC->WBuf, _("Edit scripts"), -1, 0); - do_template("beginbox_2"); + do_template("box_begin_2"); wc_printf("
%s

\n", _("Return to the script editing screen") ); - do_template("endbox"); + do_template("box_end"); wc_printf("
"); - do_template("beginbox_1"); + do_template("box_begin_1"); StrBufAppendBufPlain(WC->WBuf, _("Delete scripts"), -1, 0); - do_template("beginbox_2"); + do_template("box_begin_2"); wc_printf(_("To delete an existing script, select the script " "name from the list and click 'Delete'.")); @@ -979,12 +775,12 @@ void display_add_remove_scripts(char *message) } } } - wc_printf("
\n"); + wc_printf("\n\n
\n"); wc_printf("", _("Delete script"), _("Delete this script?")); wc_printf("\n"); - do_template("endbox"); + do_template("box_end"); wc_printf("
\n"); @@ -1051,118 +847,118 @@ void display_rules_editor_inner_div(void) { * This script should get called by every onChange event... * */ - wc_printf(" \n" - ); + "function DeleteRule(rd) {\n" + " for (j=rd; j<=highest_active_rule; ++j) {\n" + " SwapRules(j, (j+1));\n" + " }\n" + " $('active'+highest_active_rule).checked = false;\n" + "}\n" + "\n" + ); wc_printf("
"); @@ -1186,40 +982,40 @@ void display_rules_editor_inner_div(void) { /* now generate the table row */ - wc_printf("
"); + wc_printf("\n"); - wc_printf("
"); - wc_printf("", + wc_printf("
\n"); + wc_printf("\n", i, i, (active ? "checked" : "") ); - wc_printf("
"); + wc_printf("
\n"); if (i>0) wc_printf("" "", + "title=\"%s\"/>\n", i-1, i, _("Move rule up") ); wc_printf("" "", + "title=\"%s\"/>\n", i, i+1, i, _("Move rule down") ); wc_printf("" "", + "title=\"%s\"/>\n", i, i, _("Delete rule") ); - wc_printf("
"); - wc_printf("%d", i+1); - wc_printf("\n"); + wc_printf("%d\n", i+1); + wc_printf("%s ", _("If") ); @@ -1244,14 +1040,14 @@ void display_rules_editor_inner_div(void) { wc_printf(""); + wc_printf("\n\n"); wc_printf(""); @@ -1265,42 +1061,42 @@ void display_rules_editor_inner_div(void) { { "notmatches", _("does not match") } }; - wc_printf("
", i); - wc_printf("\n", i, i); for (j=0; j<6; ++j) { - wc_printf("", + wc_printf("\n", ( (!strcasecmp(compare, compare_values[j][0])) ? "selected" : ""), compare_values[j][0], compare_values[j][1] ); } - wc_printf(""); + wc_printf("\n\n"); wc_printf("
"); + wc_printf("\">\n\n"); wc_printf("
", i); wc_printf("%s", _("(All messages)")); - wc_printf("
"); + wc_printf("\n"); char *sizecomp_values[2][2] = { { "larger", _("is larger than") }, { "smaller", _("is smaller than") } }; - wc_printf("
", i); - wc_printf("\n", i, i); for (j=0; j<2; ++j) { - wc_printf("", + wc_printf("\n", ( (!strcasecmp(sizecomp, sizecomp_values[j][0])) ? "selected" : ""), sizecomp_values[j][0], sizecomp_values[j][1] ); } - wc_printf(""); + wc_printf("\n\n"); wc_printf("", i, i, sizeval); @@ -1318,20 +1114,20 @@ void display_rules_editor_inner_div(void) { { "vacation", _("Vacation") } }; - wc_printf("
"); - wc_printf("\n"); + wc_printf(""); + wc_printf("\n\n"); - wc_printf("
", i); - wc_printf("\n", i, i); for (j=0; j\n"); } - wc_printf("\n"); + wc_printf("\n\n"); wc_printf("
"); - wc_printf("
", i); + wc_printf("
\n", i); wc_printf("
"); + wc_printf("\">\n
\n"); - wc_printf("
", i); + wc_printf("
\n", i); wc_printf(_("Message:")); - wc_printf("
"); + wc_printf("
\n"); wc_printf(""); - wc_printf("
"); + wc_printf("
\n"); - wc_printf("
%s%s"); - wc_printf("\n"); + wc_printf(""); - wc_printf("
"); + wc_printf("
\n"); wc_printf("\n", _("Add rule") ); - wc_printf(" \n"); + wc_printf("\n"); free(rooms); } @@ -1470,6 +1266,7 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP) 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)) { @@ -1491,7 +1288,7 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP) if (num_scripts > have_rules_script) { - long rc; + long rc = 0; long len; const char *Key; void *vRuleset; @@ -1671,36 +1468,11 @@ int ConditionalSieveRule_Active(StrBuf *Target, WCTemplputParams *TP) SieveRule *Rule = (SieveRule *)CTX; return Rule->active; } - - -/* -void tmplput_SieveRule_hfield(StrBuf *Target, WCTemplputParams *TP) -{ - SieveRule *Rule = (SieveRule *)CTX; - StrBufAppendTemplate(Target, TP, Rule->hfield, 0); -} -void tmplput_SieveRule_compare(StrBuf *Target, WCTemplputParams *TP) -{ - SieveRule *Rule = (SieveRule *)CTX; - StrBufAppendTemplate(Target, TP, Rule->compare, 0); -} -*/ void tmplput_SieveRule_htext(StrBuf *Target, WCTemplputParams *TP) { SieveRule *Rule = (SieveRule *)CTX; StrBufAppendTemplate(Target, TP, Rule->htext, 0); } -/* -void tmplput_SieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP) -{ - SieveRule *Rule = (SieveRule *)CTX; - StrBufAppendTemplate(Target, TP, Rule->sizecomp, 0); -} -void tmplput_SieveRule_action(StrBuf *Target, WCTemplputParams *TP) -{ - SieveRule *Rule = (SieveRule *)CTX; - StrBufAppendTemplate(Target, TP, Rule->action, 0); - }*/ void tmplput_SieveRule_fileinto(StrBuf *Target, WCTemplputParams *TP) { SieveRule *Rule = (SieveRule *)CTX; @@ -1716,16 +1488,26 @@ void tmplput_SieveRule_automsg(StrBuf *Target, WCTemplputParams *TP) SieveRule *Rule = (SieveRule *)CTX; StrBufAppendTemplate(Target, TP, Rule->automsg, 0); } -/* -void tmplput_SieveRule_final(StrBuf *Target, WCTemplputParams *TP) +void tmplput_SieveRule_sizeval(StrBuf *Target, WCTemplputParams *TP) +{ + SieveRule *Rule = (SieveRule *)CTX; + StrBufAppendPrintf(Target, "%d", Rule->sizeval); +} + +void tmplput_SieveRule_lookup_FileIntoRoom(StrBuf *Target, WCTemplputParams *TP) { + void *vRoom; SieveRule *Rule = (SieveRule *)CTX; - StrBufAppendTemplate(Target, TP, Rule->final, 0); + 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*) Rule; + SieveRule *Rule = (SieveRule*) vRule; FreeStrBuf(&Rule->htext); FreeStrBuf(&Rule->fileinto); @@ -1746,14 +1528,13 @@ HashList *GetSieveRules(StrBuf *Target, WCTemplputParams *TP) int Done = 0; SieveRule *Rule; + SieveRules = NewHash(1, Flathash); serv_printf("MSIV getscript|"RULES_SCRIPT); Line = NewStrBuf(); EncodedRule = NewStrBuf(); StrBuf_ServGetln(Line); if (GetServerStatus(Line, NULL) == 1) { - SieveRules = NewHash(1, Flathash); - while(!Done && (StrBuf_ServGetln(Line) >= 0) ) if ( (StrLength(Line)==3) && !strcmp(ChrPtr(Line), "000")) @@ -1800,10 +1581,20 @@ HashList *GetSieveRules(StrBuf *Target, WCTemplputParams *TP) 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; @@ -1857,16 +1648,16 @@ InitModule_SIEVE RegisterTokenParamDefine(HKEY("continue"), econtinue); RegisterTokenParamDefine(HKEY("stop"), estop); - RegisterIterator("SIEVE:SCRIPTS", 0, NULL, GetSieveRules, NULL, NULL, CTX_SIEVELIST, CTX_NONE, IT_NOFLAG); - - RegisterIterator("SIEVE:RULES", 0, NULL, GetSieveRules, NULL, DeleteHash, CTX_SIEVESCRIPT, CTX_NONE, IT_NOFLAG); + RegisterIterator("SIEVE:SCRIPTS", 0, NULL, GetSieveScriptListing, NULL, NULL, CTX_SIEVELIST, CTX_NONE, IT_NOFLAG); RegisterConditional(HKEY("COND:SIEVE:SCRIPT:ACTIVE"), 0, ConditionalSieveScriptIsActive, CTX_SIEVELIST); RegisterConditional(HKEY("COND:SIEVE:SCRIPT:ISRULES"), 0, ConditionalSieveScriptIsRulesScript, CTX_SIEVELIST); - RegisterNamespace("SIEVE:SCRIPT:NAME", 0, 1, tmplput_SieveScriptName, NULL, CTX_ROOMS); + 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(HKEY("COND:SIEVE:ACTIVE"), 1, ConditionalSieveRule_Active, CTX_SIEVESCRIPT); RegisterConditional(HKEY("COND:SIEVE:HFIELD"), 1, ConditionalSieveRule_hfield, CTX_SIEVESCRIPT); RegisterConditional(HKEY("COND:SIEVE:COMPARE"), 1, ConditionalSieveRule_compare, CTX_SIEVESCRIPT); @@ -1875,15 +1666,14 @@ InitModule_SIEVE RegisterConditional(HKEY("COND:SIEVE:FINAL"), 1, ConditionalSieveRule_final, CTX_SIEVESCRIPT); RegisterConditional(HKEY("COND:SIEVE:THISROOM"), 1, ConditionalSieveRule_ThisRoom, CTX_SIEVESCRIPT); - //RegisterNamespace("SIEVE:SCRIPT:HFIELD", 0, 1, tmplput_SieveRule_hfield, NULL, CTX_SIEVESCRIPT); - //RegisterNamespace("SIEVE:SCRIPT:COMPARE", 0, 1, tmplput_SieveRule_compare, NULL, CTX_SIEVESCRIPT); RegisterNamespace("SIEVE:SCRIPT:HTEXT", 0, 1, tmplput_SieveRule_htext, NULL, CTX_SIEVESCRIPT); - //RegisterNamespace("SIEVE:SCRIPT:SIZECOMP", 0, 1, tmplput_SieveRule_sizecomp, NULL, CTX_SIEVESCRIPT); - ///RegisterNamespace("SIEVE:SCRIPT:ACTION", 0, 1, tmplput_SieveRule_action, 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); - ///RegisterNamespace("SIEVE:SCRIPT:FINAL", 0, 1, tmplput_SieveRule_final, 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); #if FOO WebcitAddUrlHandler(HKEY("display_sieve"), "", 0, display_sieve, 0);