-/*
- * Helper function for output_sieve_rule() to output strings with quotes escaped
- */
-void osr_sanitize(char *str) {
- int i, len;
-
- if (str == NULL) return;
- len = strlen(str);
- for (i=0; i<len; ++i) {
- if (str[i]=='\"') {
- str[i] = '\'' ;
- }
- else if (isspace(str[i])) {
- str[i] = ' ';
- }
- }
-}
-
-
-/*
- * 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 *my_addresses)
-{
- char *comp1 = "";
- char *comp2 = "";
-
- osr_sanitize(htext);
- osr_sanitize(fileinto);
- osr_sanitize(redirect);
- osr_sanitize(automsg);
-
- /* Prepare negation and match operators that will be used iff we apply a conditional */
-
- if (!strcasecmp(compare, "contains")) {
- comp1 = "";
- comp2 = ":contains";
- }
- else if (!strcasecmp(compare, "notcontains")) {
- comp1 = "not";
- comp2 = ":contains";
- }
- else if (!strcasecmp(compare, "is")) {
- comp1 = "";
- comp2 = ":is";
- }
- else if (!strcasecmp(compare, "isnot")) {
- comp1 = "not";
- comp2 = ":is";
- }
- else if (!strcasecmp(compare, "matches")) {
- comp1 = "";
- comp2 = ":matches";
- }
- else if (!strcasecmp(compare, "notmatches")) {
- comp1 = "not";
- comp2 = ":matches";
- }
-
- /* Now do the conditional */
-
- if (!strcasecmp(hfield, "from")) {
- serv_printf("if%s header %s \"From\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "tocc")) {
- serv_printf("if%s header %s [\"To\", \"Cc\"] \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "subject")) {
- serv_printf("if%s header %s \"Subject\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "replyto")) {
- serv_printf("if%s header %s \"Reply-to\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "sender")) {
- serv_printf("if%s header %s \"Sender\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "resentfrom")) {
- serv_printf("if%s header %s \"Resent-from\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "resentto")) {
- serv_printf("if%s header %s \"Resent-to\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "xmailer")) {
- serv_printf("if%s header %s \"X-Mailer\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "xspamflag")) {
- serv_printf("if%s header %s \"X-Spam-Flag\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "xspamstatus")) {
- serv_printf("if%s header %s \"X-Spam-Status\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "listid")) {
- serv_printf("if%s header %s \"List-ID\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "envfrom")) {
- serv_printf("if%s envelope %s \"From\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "envto")) {
- serv_printf("if%s envelope %s \"To\" \"%s\"",
- comp1, comp2,
- htext
- );
- }
-
- else if (!strcasecmp(hfield, "size")) {
- if (!strcasecmp(sizecomp, "larger")) {
- serv_printf("if size :over %d", sizeval);
- }
- else if (!strcasecmp(sizecomp, "smaller")) {
- serv_printf("if size :under %d", sizeval);
- }
- else { /* failsafe - should never get here, but just in case... */
- serv_printf("if size :over 1");
- }
- }
-
- /* 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 :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. */
-}
-
-