+/**
+ * \brief Helper function for output_sieve_rule() to output strings with quotes escaped
+ */
+void osr_sanitize(char *str) {
+ int i;
+
+ if (str == NULL) return;
+ for (i=0; i<strlen(str); ++i) {
+ if (str[i]=='\"') {
+ str[i] = '\'' ;
+ }
+ else if (isspace(str[i])) {
+ str[i] = ' ';
+ }
+ }
+}
+
+
+/**
+ * \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)
+{
+
+ osr_sanitize(htext);
+ osr_sanitize(fileinto);
+ osr_sanitize(redirect);
+ osr_sanitize(automsg);
+
+ /* FIXME ... do conditional */
+
+ /* Open braces if we're in a conditional loop */
+ if (strcasecmp(hfield, "all")) {
+ serv_printf("{");
+ }
+
+
+ /* Do action */
+
+ if (!strcasecmp(action, "keep")) {
+ serv_printf(" keep;");
+ }
+
+ else if (!strcasecmp(action, "discard")) {
+ serv_printf(" discard;");
+ }
+
+ else if (!strcasecmp(action, "reject")) {
+ serv_printf(" reject \"%s\";", automsg);
+ }
+
+ else if (!strcasecmp(action, "fileinto")) {
+ serv_printf(" fileinto \"%s\";", fileinto);
+ }
+
+ else if (!strcasecmp(action, "redirect")) {
+ serv_printf(" redirect \"%s\";", redirect);
+ }
+
+ else if (!strcasecmp(action, "vacation")) {
+ serv_printf(" vacation \"%s\";", 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. */
+}
+
+
+
/**
* \brief Translate the fields from the rule editor into something we can save...
*/
serv_puts("# to use these rules as the basis for another script,");
serv_puts("# copy them to another script and save that instead.");
serv_puts("");
+ serv_puts("require \"fileinto\";");
+ serv_puts("require \"reject\";");
+ serv_puts("require \"vacation\";");
+ serv_puts("require \"envelope\";");
+ serv_puts("");
for (i=0; i<MAX_RULES; ++i) {
sprintf(fname, "active%d", i);
active = !strcasecmp(bstr(fname), "on") ;
- sprintf(fname, "hfield%d", i);
- safestrncpy(hfield, bstr(fname), sizeof hfield);
-
- sprintf(fname, "compare%d", i);
- safestrncpy(compare, bstr(fname), sizeof compare);
+ if (active) {
- 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 = atoi(bstr(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
- );
-
- CtdlEncodeBase64(encoded_rule, rule, strlen(rule)+1, 0);
- serv_printf("# WEBCIT_RULE|%d|%s|", i, encoded_rule);
-
- /* FIXME: this is where we need to generate Sieve code based on the rule */
+ 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 = atoi(bstr(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
+ );
+
+ 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);
+ serv_printf("");
+ }
}
+ serv_puts("stop;");
serv_puts("000");
}
wprintf("<td width=20%%>");
+ char *compare_values[4][2] = {
+ { "contains", _("contains") },
+ { "notcontains", _("does not contain") },
+ { "is", _("is") },
+ { "isnot", _("is not") }
+ };
+
wprintf("<div id=\"div_compare%d\">", i);
wprintf("<select id=\"compare%d\" name=\"compare%d\" size=1 onChange=\"UpdateRules();\">",
i, i);
- wprintf("<option value=\"contains\">%s</option>", _("contains"));
- wprintf("<option value=\"notcontains\">%s</option>", _("does not contain"));
- wprintf("<option value=\"is\">%s</option>", _("is"));
- wprintf("<option value=\"isnot\">%s</option>", _("is not"));
+ for (j=0; j<4; ++j) {
+ wprintf("<option %s value=\"%s\">%s</option>",
+ ( (!strcasecmp(compare, compare_values[j][0])) ? "selected" : ""),
+ compare_values[j][0],
+ compare_values[j][1]
+ );
+ }
wprintf("</select>");
- wprintf("<input type=\"text\" id=\"htext%d\" name=\"htext%d\">", i, i);
- wprintf("</div>");
+ wprintf("<input type=\"text\" id=\"htext%d\" name=\"htext%d\" value=\"", i, i);
+ escputs(htext);
+ wprintf("\"></div>");
wprintf("<div id=\"div_nocompare%d\">", i);
wprintf("%s", _("(All messages)"));
wprintf("</div>");
+ char *sizecomp_values[2][2] = {
+ { "larger", _("is larger than") },
+ { "smaller", _("is smaller than") }
+ };
+
wprintf("<div id=\"div_size%d\">", i);
wprintf("<select id=\"sizecomp%d\" name=\"sizecomp%d\" size=1 onChange=\"UpdateRules();\">",
i, i);
- wprintf("<option value=\"larger\">%s</option>", _("is larger than"));
- wprintf("<option value=\"smaller\">%s</option>", _("is smaller than"));
+ for (j=0; j<2; ++j) {
+ wprintf("<option %s value=\"%s\">%s</option>",
+ ( (!strcasecmp(sizecomp, sizecomp_values[j][0])) ? "selected" : ""),
+ sizecomp_values[j][0],
+ sizecomp_values[j][1]
+ );
+ }
wprintf("</select>");
- wprintf("<input type=\"text\" id=\"sizeval%d\" name=\"sizeval%d\">", i, i);
+ wprintf("<input type=\"text\" id=\"sizeval%d\" name=\"sizeval%d\" value=\"%d\">",
+ i, i, sizeval);
wprintf("bytes");
wprintf("</div>");
wprintf("</td>");
+ char *action_values[6][2] = {
+ { "keep", _("Keep") },
+ { "discard", _("Discard silently") },
+ { "reject", _("Reject") },
+ { "fileinto", _("Move message to") },
+ { "redirect", _("Forward to") },
+ { "vacation", _("Vacation") }
+ };
+
wprintf("<td width=20%%>");
wprintf("<select id=\"action%d\" name=\"action%d\" size=1 onChange=\"UpdateRules();\">",
i, i);
- wprintf("<option value=\"keep\">%s</option>", _("Keep"));
- wprintf("<option value=\"discard\">%s</option>", _("Discard silently"));
- wprintf("<option value=\"reject\">%s</option>", _("Reject"));
- wprintf("<option value=\"fileinto\">%s</option>", _("Move message to"));
- wprintf("<option value=\"redirect\">%s</option>", _("Forward to"));
- wprintf("<option value=\"vacation\">%s</option>", _("Vacation"));
+ for (j=0; j<6; ++j) {
+ wprintf("<option %s value=\"%s\">%s</option>",
+ ( (!strcasecmp(action, action_values[j][0])) ? "selected" : ""),
+ action_values[j][0],
+ action_values[j][1]
+ );
+ }
wprintf("</select>");
wprintf("<div id=\"div_fileinto%d\">", i);
wprintf("<select name=\"fileinto%d\" id=\"fileinto%d\">", i, i);
for (j=0; j<num_roomnames; ++j) {
wprintf("<option ");
- if (!strcasecmp(rooms[j].name, "Mail")) {
+ if (!strcasecmp(rooms[j].name, fileinto)) {
wprintf("selected ");
}
wprintf("value=\"");
wprintf("</div>");
wprintf("<div id=\"div_redirect%d\">", i);
- wprintf("<input type=\"text\" id=\"redirect%d\" name=\"redirect%d\">", i, i);
- wprintf("</div>");
+ wprintf("<input type=\"text\" id=\"redirect%d\" name=\"redirect%d\" value=\"", i, i);
+ escputs(redirect);
+ wprintf("\"></div>");
wprintf("<div id=\"div_automsg%d\">", i);
wprintf(_("Message:"));
wprintf("<br />");
wprintf("<textarea name=\"automsg%d\" id=\"automsg%d\" wrap=soft rows=5>\n", i, i);
+ escputs(automsg);
wprintf("</textarea>");
wprintf("</div>");
wprintf("</td>");
-
+ char *final_values[2][2] = {
+ { "continue", _("continue processing") },
+ { "stop", _("stop") }
+ };
wprintf("<td width=10%% align=\"center\">%s</td>", _("and then") );
wprintf("<td width=20%%>");
wprintf("<select name=\"final%d\" id=\"final%d\" size=1 onChange=\"UpdateRules();\">",
i, i);
- wprintf("<option value=\"continue\">%s</option>", _("continue processing"));
- wprintf("<option value=\"stop\">%s</option>", _("stop"));
+ for (j=0; j<2; ++j) {
+ wprintf("<option %s value=\"%s\">%s</option>",
+ ( (!strcasecmp(final, final_values[j][0])) ? "selected" : ""),
+ final_values[j][0],
+ final_values[j][1]
+ );
+ }
wprintf("</select>");
wprintf("</td>");
-
/*@}*/