]> code.citadel.org Git - citadel.git/blobdiff - webcit/sieve.c
When webcit converts a set of inbox rules to a Sieve script,
[citadel.git] / webcit / sieve.c
index d7642a1324b12ed4a84d7c9a0d81ea01984c5a3d..9c81a861e3ed02ded1c5689f27968f879789ea5d 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id$
+ * $Id$
  */
 /**
  * \defgroup Sieve view/edit sieve config
@@ -73,7 +73,7 @@ void display_sieve(void)
        );
 
        wprintf("<div id=\"banner\">\n");
-       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<TABLE class=\"sieve_banner\"><TR><TD>");
        wprintf("<SPAN CLASS=\"titlebar\">"
                "<img src=\"static/advanpage2_48x.gif\">");
        wprintf(_("View/edit server-side mail filters"));
@@ -82,11 +82,12 @@ void display_sieve(void)
        wprintf("</div>\n<div id=\"content\">\n");
 
        wprintf("<div class=\"fix_scrollbar_bug\">"
-               "<table border=0 width=100%% bgcolor=\"#FFFFFF\">"
+               "<table class=\"sieve_background\">"
                "<tr><td valign=top>\n");
 
 
        wprintf("<form id=\"sieveform\" method=\"post\" action=\"save_sieve\">\n");
+       wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
 
        wprintf(_("When new mail arrives: "));
         wprintf("<select name=\"bigaction\" size=1 onChange=\"ToggleSievePanels();\">\n");
@@ -196,10 +197,11 @@ void display_sieve(void)
  * \brief      Helper function for output_sieve_rule() to output strings with quotes escaped
  */
 void osr_sanitize(char *str) {
-       int i;
+       int i, len;
 
        if (str == NULL) return;
-       for (i=0; i<strlen(str); ++i) {
+       len = strlen(str);
+       for (i=0; i<len; ++i) {
                if (str[i]=='\"') {
                        str[i] = '\'' ;
                }
@@ -214,7 +216,8 @@ void osr_sanitize(char *str) {
  * \brief      Output parseable Sieve script code based on rules input
  */
 void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp, int sizeval,
-                       char *action, char *fileinto, char *redirect, char *automsg, char *final)
+                       char *action, char *fileinto, char *redirect, char *automsg, char *final,
+                       char *my_addresses)
 {
        char *comp1 = "";
        char *comp2 = "";
@@ -379,7 +382,7 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
        }
 
        else if (!strcasecmp(action, "vacation")) {
-               serv_printf("vacation \"%s\";", automsg);
+               serv_printf("vacation :addresses [%s]\n\"%s\";", my_addresses, automsg);
        }
 
 
@@ -418,13 +421,27 @@ void parse_fields_from_rule_editor(void) {
        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("MSIV putscript|%s|", RULES_SCRIPT);
        serv_getln(buf, sizeof buf);
        if (buf[0] != '4') {
@@ -492,7 +509,7 @@ void parse_fields_from_rule_editor(void) {
                        CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, 0);
                        serv_printf("# WEBCIT_RULE|%d|%s|", i, encoded_rule);
                        output_sieve_rule(hfield, compare, htext, sizecomp, sizeval,
-                                       action, fileinto, redirect, automsg, final);
+                                       action, fileinto, redirect, automsg, final, my_addresses);
                        serv_printf("");
                }
 
@@ -518,7 +535,7 @@ void save_sieve(void) {
        char this_name[64];
        char buf[256];
 
-       if (strlen(bstr("save_button")) == 0) {
+       if (IsEmptyStr(bstr("save_button"))) {
                strcpy(WC->ImportantMessage,
                        _("Cancelled.  Changes were not saved."));
                display_main_menu();
@@ -592,7 +609,7 @@ void display_add_remove_scripts(char *message)
 
        output_headers(1, 1, 2, 0, 0, 0);
        wprintf("<div id=\"banner\">\n");
-       wprintf("<table width=100%% border=0 bgcolor=#444455><tr>"
+       wprintf("<table class=\"sieve_banner\"><tr>"
                "<td>"
                "<span class=\"titlebar\">"
                "<img src=\"static/advanpage2_48x.gif\">");
@@ -613,6 +630,7 @@ void display_add_remove_scripts(char *message)
        wprintf("<br /><br />");
 
         wprintf("<center><form method=\"POST\" action=\"create_script\">\n");
+       wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
         wprintf(_("Script name: "));
         wprintf("<input type=\"text\" name=\"script_name\"><br />\n"
                "<input type=\"submit\" name=\"create_button\" value=\"%s\">"
@@ -638,6 +656,7 @@ void display_add_remove_scripts(char *message)
        
         wprintf("<center>"
                "<form method=\"POST\" action=\"delete_script\">\n");
+       wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
         wprintf("<select name=\"script_name\" size=10 style=\"width:100%%\">\n");
 
         serv_puts("MSIV listscripts");
@@ -770,9 +789,25 @@ void display_rules_editor_inner_div(void) {
                "                                                                       \n"
                "var highest_active_rule = (-1);                                        \n"
                "                                                                       \n"
-               "function UpdateRules() {                                               \n"
-               "  for (i=0; i<%d; ++i) {                                               \n", MAX_RULES);
-       wprintf("    d = ($('movedown'+i));                                             \n"
+               "function UpdateRules() {                                               \n");
+/*
+ * Show only the active rows...
+ */
+       wprintf("  highest_active_rule = (-1);                                          \n");
+       wprintf("  for (i=0; i<%d; ++i) {                                               \n", MAX_RULES);
+       wprintf("   if ($('active'+i).checked) {                                        \n"
+               "     $('rule' + i).style.display = 'block';                            \n"
+               "     highest_active_rule = i;                                          \n"
+               "   }                                                                   \n"
+               "   else {                                                              \n"
+               "     $('rule' + i).style.display = 'none';                             \n"
+               "   }                                                                   \n"
+               "  }                                                                    \n");
+/*
+ * Show only the fields relevant to the rules...
+ */
+       wprintf("  for (i=0; i<=highest_active_rule; ++i) {                             \n"
+               "    d = ($('movedown'+i));                                             \n"
                "    if (i < highest_active_rule) {                                     \n"
                "      d.style.display = 'block';                                       \n"
                "    }                                                                  \n"
@@ -819,20 +854,6 @@ void display_rules_editor_inner_div(void) {
                "      $('div_addrule').style.display = 'none';                         \n"
                "    }                                                                  \n"
                "  }                                                                    \n"
-       );
-/*
- * Show only the active rows...
- */
-       wprintf("  highest_active_rule = (-1);                                          \n");
-       wprintf("  for (i=0; i<%d; ++i) {                                               \n", MAX_RULES);
-       wprintf("   if ($('active'+i).checked) {                                        \n"
-               "     $('rule' + i).style.display = 'block';                            \n"
-               "     highest_active_rule = i;                                          \n"
-               "   }                                                                   \n"
-               "   else {                                                              \n"
-               "     $('rule' + i).style.display = 'none';                             \n"
-               "   }                                                                   \n"
-               "  }                                                                    \n"
                "}                                                                      \n"
 /*
  * Add a rule (really, just un-hide it)
@@ -869,8 +890,8 @@ void display_rules_editor_inner_div(void) {
  * Delete a rule (percolate the deleted rule out to the end, then deactivate it)
  */
                "function DeleteRule(rd) {                                              \n"
-               "  for (i=rd; i<highest_active_rule; ++i) {                             \n"
-               "    SwapRules(i, (i+1));                                               \n"
+               "  for (j=rd; j<=highest_active_rule; ++j) {                            \n"
+               "    SwapRules(j, (j+1));                                               \n"
                "  }                                                                    \n"
                "  $('active'+highest_active_rule).checked = false;                     \n"
                "}                                                                      \n"
@@ -1050,7 +1071,7 @@ void display_rules_editor_inner_div(void) {
                                wprintf("selected ");
                        }
                        wprintf("value=\"");
-                       urlescputs(rooms[j].name);
+                       escputs(rooms[j].name);
                        wprintf("\">");
                        escputs(rooms[j].name);
                        wprintf("</option>\n");
@@ -1098,7 +1119,9 @@ void display_rules_editor_inner_div(void) {
        }
 
        wprintf("</table>");
-       wprintf("<div id=\"div_addrule\"><a href=\"javascript:AddRule();\">Add rule</a><br /></div>\n");
+       wprintf("<div id=\"div_addrule\"><a href=\"javascript:AddRule();\">%s</a><br /></div>\n",
+               _("Add rule")
+       );
 
        wprintf("<script type=\"text/javascript\">                                      \n");
        wprintf("UpdateRules();                                                         \n");