more places to fix the new linebreak behaviour of the base64 encoder.
[citadel.git] / webcit / sieve.c
index 0c4613bcac0d53d7e30a5aa3f0dfbe2354fe8c6a..cce70574ae927c451f165af0488e47215e27ac8c 100644 (file)
@@ -8,14 +8,20 @@
  * 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.
+ *
+ * FIXME: add logic to exclude the webcit-generated script from the manual script selection
  */
 
 #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__"
 
+
 /*
  * Helper function for output_sieve_rule() to output strings with quotes escaped
  */
@@ -188,7 +194,6 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
                serv_printf("{");
        }
 
-
        /* Do action */
 
        if (!strcasecmp(action, "keep")) {
@@ -215,26 +220,22 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
                serv_printf("vacation :addresses [%s]\n\"%s\";", my_addresses, automsg);
        }
 
-
        /* Do 'final' action */
 
        if (!strcasecmp(final, "stop")) {
                serv_printf("stop;");
        }
 
-
        /* Close the braces if we're in a conditional loop */
 
        if (strcasecmp(hfield, "all")) {
                serv_printf("}");
        }
 
-
        /* End of rule. */
 }
 
 
-
 /*
  * Translate the fields from the rule editor into something we can save...
  */
@@ -336,7 +337,10 @@ void parse_fields_from_rule_editor(void) {
                                redirect, automsg, final
                        );
        
-                       CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, 0);
+                       size_t len = CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, 0);
+                       if (encoded_rule[len - 1] == '\n') {
+                               encoded_rule[len - 1] = '\0';
+                       }
                        serv_printf("# WEBCIT_RULE|%d|%s|", i, encoded_rule);
                        output_sieve_rule(hfield, compare, htext, sizecomp, sizeval,
                                        action, fileinto, redirect, automsg, final, my_addresses);
@@ -351,7 +355,6 @@ void parse_fields_from_rule_editor(void) {
 }
 
 
-
 /*
  * save sieve config
  */
@@ -359,7 +362,6 @@ void save_sieve(void) {
        int bigaction;
        char script_names[MAX_SCRIPTS][64];
        int num_scripts = 0;
-       int active_script = (-1);       /* this throws a 'set but not used' warning , check this ! */
        int i;
        char this_name[64];
        char buf[256];
@@ -377,9 +379,6 @@ void save_sieve(void) {
        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;
                }
        }
@@ -426,6 +425,15 @@ void save_sieve(void) {
        return;
 }
 
+
+void display_sieve_add_or_delete(void) {
+       output_headers(1, 1, 2, 0, 0, 0);
+       do_template("sieve_add");
+       wDumpContent(1);
+}
+
+
+
 /*
  * create a new script
  * take the web environment script name and create it on the citadel server
@@ -435,32 +443,25 @@ void create_script(void) {
 
        serv_printf("MSIV getscript|%s", bstr("script_name"));
        serv_getln(buf, sizeof buf);
-       if (buf[0] == '1') {
+       if (buf[0] == '1') {            // does script exist already?
                while (serv_getln(buf, sizeof(buf)), strcmp(buf, "000")) {
-                       /* flush */
+                                       // yes -- flush the output
                }
-               return;
        }
-       
-       serv_printf("MSIV putscript|%s", bstr("script_name"));
-       serv_getln(buf, sizeof buf);
-       if (buf[0] == '4') {
-               serv_puts("keep;");
-               serv_puts("000");
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
-               return;
+       else {
+                                       // no -- safe to create a new one by this name
+               serv_printf("MSIV putscript|%s", bstr("script_name"));
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       serv_puts("keep;");
+                       serv_puts("000");
+               }
        }
 
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
+       display_sieve_add_or_delete();
 }
 
 
-
-
 /*
  * delete a script
  */
@@ -469,11 +470,8 @@ void delete_script(void) {
 
        serv_printf("MSIV deletescript|%s", bstr("script_name"));
        serv_getln(buf, sizeof buf);
-       output_headers(1, 1, 2, 0, 0, 0);
-       do_template("sieve_add");
-       wDumpContent(1);
+       display_sieve_add_or_delete();
 }
-               
 
 
 /*
@@ -481,7 +479,7 @@ void delete_script(void) {
  */
 void display_no_sieve(void) {
 
-       output_headers(1, 1, 2, 0, 0, 0);
+       output_headers(1, 1, 1, 0, 0, 0);
        do_template("sieve_none");
        wDumpContent(1);
 }
@@ -496,22 +494,22 @@ typedef struct __SieveListing {
 
 int ConditionalSieveScriptIsActive(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        return SieveList->IsActive;
 }
 int ConditionalSieveScriptIsRulesScript(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        return SieveList->IsActive;
 }
 void tmplput_SieveScriptName(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        StrBufAppendTemplate(Target, TP, SieveList->Name, 0);
 }
 void tmplput_SieveScriptContent(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveListing     *SieveList = (SieveListing *)CTX;
+       SieveListing     *SieveList = (SieveListing *)CTX(CTX_SIEVELIST);
        StrBufAppendTemplate(Target, TP, SieveList->Content, 0);
 }
 void FreeSieveListing(void *vSieveListing)
@@ -534,8 +532,9 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
        int Done = 0;
        SieveListing *Ruleset;
 
-       if (WCC->KnownSieveScripts != NULL)
+       if (WCC->KnownSieveScripts != NULL) {
                return WCC->KnownSieveScripts;
+       }
 
        serv_puts("MSIV listscripts");
        Line = NewStrBuf();
@@ -574,8 +573,10 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
                                ++num_scripts;
                        }
        }
-       if ((num_scripts > 0) && (rules_script_active == 0))
+
+       if ((num_scripts > 0) && (rules_script_active == 0)) {
                PutBstr(HKEY("__SIEVE:EXTERNAL_SCRIPT"), NewStrBufPlain(HKEY("1")));
+       }
 
        if (num_scripts > have_rules_script)
        {
@@ -594,19 +595,12 @@ HashList *GetSieveScriptListing(StrBuf *Target, WCTemplputParams *TP)
                       (vRuleset != NULL))
                {
                        Ruleset = (SieveListing *) vRuleset;
-
-                       /*
-                        * its the webcit rule? we don't need to load that here.
-                        */
-                       if (Ruleset->IsRulesScript)
-                               continue;
-
-                       if (!serv_printf("MSIV getscript|%s", ChrPtr(Ruleset->Name)))
-                               break;
+                       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")) 
@@ -695,7 +689,7 @@ typedef struct __SieveRule {
 
 int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        
         return GetTemplateTokenNumber(Target, 
                                       TP, 
@@ -706,7 +700,7 @@ int ConditionalSieveRule_hfield(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -716,7 +710,7 @@ int ConditionalSieveRule_compare(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -726,7 +720,7 @@ int ConditionalSieveRule_action(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -736,7 +730,7 @@ int ConditionalSieveRule_sizecomp(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -746,7 +740,7 @@ int ConditionalSieveRule_final(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return GetTemplateTokenNumber(Target, 
                                       TP, 
                                       3, 
@@ -756,39 +750,39 @@ int ConditionalSieveRule_ThisRoom(StrBuf *Target, WCTemplputParams *TP)
 }
 int ConditionalSieveRule_Active(StrBuf *Target, WCTemplputParams *TP)
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         return Rule->active;
 }
 void tmplput_SieveRule_htext(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->htext, 0);
 }
 void tmplput_SieveRule_fileinto(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->fileinto, 0);
 }
 void tmplput_SieveRule_redirect(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->redirect, 0);
 }
 void tmplput_SieveRule_automsg(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
        StrBufAppendTemplate(Target, TP, Rule->automsg, 0);
 }
 void tmplput_SieveRule_sizeval(StrBuf *Target, WCTemplputParams *TP) 
 {
-       SieveRule     *Rule = (SieveRule *)CTX;
+       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;
+       SieveRule     *Rule = (SieveRule *)CTX(CTX_SIEVESCRIPT);
         wcsession *WCC = WC;
        HashList *Rooms = GetRoomListHashLKRA(Target, TP);
 
@@ -902,6 +896,8 @@ void
 InitModule_SIEVE
 (void)
 {
+       RegisterCTX(CTX_SIEVELIST);
+       RegisterCTX(CTX_SIEVESCRIPT);
        REGISTERTokenParamDefine(from);         
        REGISTERTokenParamDefine(tocc);         
        REGISTERTokenParamDefine(subject);      
@@ -941,21 +937,21 @@ InitModule_SIEVE
 
        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);
+       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(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);
-       RegisterConditional(HKEY("COND:SIEVE:ACTION"), 1, ConditionalSieveRule_action, CTX_SIEVESCRIPT);
-       RegisterConditional(HKEY("COND:SIEVE:SIZECOMP"), 1, ConditionalSieveRule_sizecomp, CTX_SIEVESCRIPT);
-       RegisterConditional(HKEY("COND:SIEVE:FINAL"), 1, ConditionalSieveRule_final, CTX_SIEVESCRIPT);
-       RegisterConditional(HKEY("COND:SIEVE:THISROOM"), 1, ConditionalSieveRule_ThisRoom, CTX_SIEVESCRIPT);
+       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);
@@ -968,4 +964,5 @@ InitModule_SIEVE
        WebcitAddUrlHandler(HKEY("save_sieve"), "", 0, save_sieve, 0);
        WebcitAddUrlHandler(HKEY("create_script"), "", 0, create_script, 0);
        WebcitAddUrlHandler(HKEY("delete_script"), "", 0, delete_script, 0);
+       WebcitAddUrlHandler(HKEY("display_sieve_add_or_delete"), "", 0, display_sieve_add_or_delete, 0);
 }