X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsieve.c;h=8cf76e459a2b6fc85f7f2cd5a080aa9214e31c2e;hb=68d6ac2aeb2c46dfca9ce85351780c6136e0cc84;hp=d2adb28d4adbe5cf656cda93cea00fcd48450155;hpb=b2c413ed12a1c049271b273b3b9f618450e47709;p=citadel.git
diff --git a/webcit/sieve.c b/webcit/sieve.c
index d2adb28d4..8cf76e459 100644
--- a/webcit/sieve.c
+++ b/webcit/sieve.c
@@ -1,200 +1,29 @@
-/*
- * $Id$
- */
-/**
- * \defgroup Sieve view/edit sieve config
- * \ingroup WebcitDisplayItems
+/*
+ * Copyright (c) 1996-2011 by the citadel.org team
+ *
+ * This program is open source software. You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/*@{*/
+
#include "webcit.h"
#define MAX_SCRIPTS 100
-#define MAX_RULES 25
+#define MAX_RULES 50
#define RULES_SCRIPT "__WebCit_Generated_Script__"
-
-/**
- * \brief view/edit sieve config
- */
-void display_sieve(void)
-{
- char script_names[MAX_SCRIPTS][64];
- int num_scripts = 0;
- int active_script = (-1);
- char buf[256];
- int i;
- int rules_script_is_active = 0;
-
-
- 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);
-
- wprintf(" \n"
- );
-
- wprintf("
\n");
- wprintf("");
- wprintf("
");
- wprintf(_("View/edit server-side mail filters"));
- wprintf("
\n");
- wprintf("
\n");
-
- wprintf("
\n");
-
- wprintf("
"
- "
"
- "
\n");
-
-
- wprintf("\n");
-
- wprintf("
\n");
-
- wprintf(" \n"
- );
-
- wDumpContent(1);
-
-}
-
-
-
-/**
- * \brief Helper function for output_sieve_rule() to output strings with quotes escaped
+/*#define FOO 1*/
+/*
+ * Helper function for output_sieve_rule() to output strings with quotes escaped
*/
void osr_sanitize(char *str) {
int i, len;
@@ -211,9 +40,16 @@ void osr_sanitize(char *str) {
}
}
+void display_add_remove_scripts(char *message);
+void display_rules_editor_inner_div(void);
+
+
+
+
+
-/**
- * \brief Output parseable Sieve script code based on rules input
+/*
+ * 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,
@@ -326,6 +162,13 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
);
}
+ 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,
@@ -405,8 +248,8 @@ void output_sieve_rule(char *hfield, char *compare, char *htext, char *sizecomp,
-/**
- * \brief Translate the fields from the rule editor into something we can save...
+/*
+ * Translate the fields from the rule editor into something we can save...
*/
void parse_fields_from_rule_editor(void) {
@@ -425,12 +268,9 @@ void parse_fields_from_rule_editor(void) {
char buf[256];
char fname[256];
char rule[2048];
- char encoded_rule;
+ char encoded_rule[4096];
char my_addresses[4096];
- long encoded_len;
- encoded_len = 4096;
- encoded_rule = (char*) malloc (encoded_len);
/* Enumerate my email addresses in case they are needed for a vacation rule */
my_addresses[0] = 0;
serv_puts("GVEA");
@@ -470,50 +310,50 @@ void parse_fields_from_rule_editor(void) {
strcpy(rule, "");
sprintf(fname, "active%d", i);
- active = !strcasecmp(bstr(fname), "on") ;
+ active = !strcasecmp(BSTR(fname), "on") ;
if (active) {
sprintf(fname, "hfield%d", i);
- safestrncpy(hfield, bstr(fname), sizeof hfield);
+ safestrncpy(hfield, BSTR(fname), sizeof hfield);
sprintf(fname, "compare%d", i);
- safestrncpy(compare, bstr(fname), sizeof compare);
+ safestrncpy(compare, BSTR(fname), sizeof compare);
sprintf(fname, "htext%d", i);
- safestrncpy(htext, bstr(fname), sizeof htext);
+ safestrncpy(htext, BSTR(fname), sizeof htext);
sprintf(fname, "sizecomp%d", i);
- safestrncpy(sizecomp, bstr(fname), sizeof sizecomp);
+ safestrncpy(sizecomp, BSTR(fname), sizeof sizecomp);
sprintf(fname, "sizeval%d", i);
- sizeval = atoi(bstr(fname));
+ sizeval = IBSTR(fname);
sprintf(fname, "action%d", i);
- safestrncpy(action, bstr(fname), sizeof action);
+ safestrncpy(action, BSTR(fname), sizeof action);
sprintf(fname, "fileinto%d", i);
- safestrncpy(fileinto, bstr(fname), sizeof fileinto);
+ safestrncpy(fileinto, BSTR(fname), sizeof fileinto);
sprintf(fname, "redirect%d", i);
- safestrncpy(redirect, bstr(fname), sizeof redirect);
+ safestrncpy(redirect, BSTR(fname), sizeof redirect);
sprintf(fname, "automsg%d", i);
- safestrncpy(automsg, bstr(fname), sizeof automsg);
+ safestrncpy(automsg, BSTR(fname), sizeof automsg);
sprintf(fname, "final%d", i);
- safestrncpy(final, bstr(fname), sizeof final);
+ 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, &encoded_len, 0);
+ 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, my_addresses);
- serv_printf("");
+ serv_puts("");
}
@@ -521,13 +361,12 @@ void parse_fields_from_rule_editor(void) {
serv_puts("stop;");
serv_puts("000");
- free(encoded_rule);
}
-/**
- * \brief save sieve config
+/*
+ * save sieve config
*/
void save_sieve(void) {
int bigaction;
@@ -538,9 +377,8 @@ void save_sieve(void) {
char this_name[64];
char buf[256];
- if (IsEmptyStr(bstr("save_button"))) {
- strcpy(WC->ImportantMessage,
- _("Cancelled. Changes were not saved."));
+ if (!havebstr("save_button")) {
+ AppendImportantMessage(_("Cancelled. Changes were not saved."), -1);
display_main_menu();
return;
}
@@ -559,7 +397,7 @@ void save_sieve(void) {
}
}
- bigaction = atoi(bstr("bigaction"));
+ bigaction = ibstr("bigaction");
if (bigaction == 0) {
serv_puts("MSIV setactive||");
@@ -588,22 +426,282 @@ void save_sieve(void) {
serv_getln(buf, sizeof buf);
if (buf[0] == '4') {
snprintf(this_name, sizeof this_name, "text_%s", script_names[i]);
- striplt(bstr(this_name));
- serv_printf("%s", bstr(this_name));
- serv_puts("000");
+ striplt((char *)BSTR(this_name)); /* TODO: get rid of typecast*/
+ serv_write(BSTR(this_name), strlen(BSTR(this_name)));
+ serv_puts("\n000");
}
}
}
}
- strcpy(WC->ImportantMessage, _("Your changes have been saved."));
+ AppendImportantMessage(_("Your changes have been saved."), -1);
display_main_menu();
return;
}
+/*
+ * create a new script
+ * take the web environment script name and create it on the citadel server
+ */
+void create_script(void) {
+ char buf[256];
+
+ serv_printf("MSIV getscript|%s", bstr("script_name"));
+ serv_getln(buf, sizeof buf);
+ if (buf[0] == '1') {
+ while (serv_getln(buf, sizeof(buf)), strcmp(buf, "000")) {
+ /* flush */
+ }
+#if FOO
+ display_add_remove_scripts(_("A script by that name already exists."));
+#endif
+ return;
+ }
+
+ serv_printf("MSIV putscript|%s", bstr("script_name"));
+ serv_getln(buf, sizeof buf);
+ if (buf[0] == '4') {
+ serv_puts("keep;");
+ 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;
+ }
-/**
- * \brief show a list of available scripts to add/remove them
+#if FOO
+ display_add_remove_scripts(&buf[4]);
+#else
+ output_headers(1, 1, 2, 0, 0, 0);
+ do_template("sieve_add");
+ wDumpContent(1);
+#endif
+}
+
+
+
+
+/*
+ * delete a script
+ */
+void delete_script(void) {
+ char buf[256];
+
+ serv_printf("MSIV deletescript|%s", bstr("script_name"));
+ 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
+}
+
+
+
+/*
+ * 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);
+ do_template("sieve_none");
+ wDumpContent(1);
+}
+
+#if FOO
+/*
+ * 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"
+ "
\n
\n");
+
+
+ wc_printf("\n");
+
+ wc_printf("
\n");
+
+ wc_printf(" \n"
+ );
+
+ wDumpContent(1);
+
+}
+
+
+
+
+/*
+ * show a list of available scripts to add/remove them
*/
void display_add_remove_scripts(char *message)
{
@@ -611,54 +709,59 @@ void display_add_remove_scripts(char *message)
char script_name[256];
output_headers(1, 1, 2, 0, 0, 0);
- wprintf("
\n");
- if (message != NULL) wprintf(message);
+ if (message != NULL) {
+ wc_printf("%s", message);
+ }
- wprintf("
\n");
+ wc_printf("
\n");
- svprintf("BOXTITLE", WCS_STRING, _("Add a new script"));
- do_template("beginbox");
+ do_template("box_begin_1");
+ StrBufAppendBufPlain(WC->WBuf, _("Add a new script"), -1, 0);
+ do_template("box_begin_2");
- wprintf(_("To create a new script, enter the desired "
+ wc_printf(_("To create a new script, enter the desired "
"script name in the box below and click 'Create'."));
- wprintf("
");
+ wc_printf("
");
- wprintf("
");
+ wc_printf("
");
- svprintf("BOXTITLE", WCS_STRING, _("Delete scripts"));
- do_template("beginbox");
+ do_template("box_begin_1");
+ StrBufAppendBufPlain(WC->WBuf, _("Delete scripts"), -1, 0);
+ do_template("box_begin_2");
- wprintf(_("To delete an existing script, select the script "
+ wc_printf(_("To delete an existing script, select the script "
"name from the list and click 'Delete'."));
- wprintf("