aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-01-29 00:26:14 +0800
committerMilan Crha <mcrha@redhat.com>2014-01-29 00:26:14 +0800
commit6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7 (patch)
treed2f452b3ceaf303f2dcfc6e532b9fa7e474d9878
parent64b2c69bd64d51f8afd112ad8cf4809ceac261a5 (diff)
downloadgsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.gz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.bz2
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.lz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.xz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.zst
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.zip
Bug #722951 - Check for empty rule values
-rw-r--r--e-util/e-filter-input.c49
-rw-r--r--e-util/e-filter-input.h1
-rw-r--r--e-util/e-filter-rule.c2
-rw-r--r--e-util/filter.error.xml5
-rw-r--r--mail/em-filter-i18n.h58
-rw-r--r--mail/filtertypes.xml18
-rw-r--r--mail/vfoldertypes.xml18
7 files changed, 101 insertions, 50 deletions
diff --git a/e-util/e-filter-input.c b/e-util/e-filter-input.c
index 3e38410a59..512cf2dce1 100644
--- a/e-util/e-filter-input.c
+++ b/e-util/e-filter-input.c
@@ -106,6 +106,28 @@ filter_input_validate (EFilterElement *element,
}
regfree (&regexpat);
+ } else if (!input->allow_empty && (!input->values || !input->values->next)) {
+ const gchar *value = input->values->data;
+ gboolean is_empty = value == NULL;
+
+ if (value) {
+ gint ii;
+
+ is_empty = TRUE;
+
+ for (ii = 0; value[ii]; ii++) {
+ if (!g_ascii_isspace (value[ii])) {
+ is_empty = FALSE;
+ break;
+ }
+ }
+ }
+
+ if (is_empty) {
+ valid = FALSE;
+ if (alert)
+ *alert = e_alert_new ("filter:not-allow-empty", NULL);
+ }
}
return valid;
@@ -142,7 +164,23 @@ filter_input_eq (EFilterElement *element_a,
if (link_a != NULL || link_b != NULL)
return FALSE;
- return TRUE;
+ return input_a->allow_empty == input_b->allow_empty;
+}
+
+static void
+filter_input_xml_create (EFilterElement *element,
+ xmlNodePtr node)
+{
+ EFilterInput *input = E_FILTER_INPUT (element);
+ gchar *allow_empty;
+
+ /* Chain up to parent's method. */
+ E_FILTER_ELEMENT_CLASS (e_filter_input_parent_class)->xml_create (element, node);
+
+ allow_empty = (gchar *) xmlGetProp (node, (xmlChar *) "allow-empty");
+
+ input->allow_empty = !allow_empty || g_strcmp0 (allow_empty, "true") == 0;
+ xmlFree (allow_empty);
}
static xmlNodePtr
@@ -158,6 +196,7 @@ filter_input_xml_encode (EFilterElement *element)
value = xmlNewNode (NULL, (xmlChar *) "value");
xmlSetProp (value, (xmlChar *) "name", (xmlChar *) element->name);
xmlSetProp (value, (xmlChar *) "type", (xmlChar *) type);
+ xmlSetProp (value, (xmlChar *) "allow-empty", (xmlChar *) (input->allow_empty ? "true" : "false"));
for (link = input->values; link != NULL; link = g_list_next (link)) {
xmlChar *str = link->data;
@@ -178,7 +217,7 @@ filter_input_xml_decode (EFilterElement *element,
xmlNodePtr node)
{
EFilterInput *input = (EFilterInput *) element;
- gchar *name, *str, *type;
+ gchar *name, *str, *type, *allow_empty;
xmlNodePtr child;
g_list_foreach (input->values, (GFunc) g_free, NULL);
@@ -187,6 +226,7 @@ filter_input_xml_decode (EFilterElement *element,
name = (gchar *) xmlGetProp (node, (xmlChar *) "name");
type = (gchar *) xmlGetProp (node, (xmlChar *) "type");
+ allow_empty = (gchar *) xmlGetProp (node, (xmlChar *) "allow-empty");
xmlFree (element->name);
element->name = name;
@@ -194,6 +234,9 @@ filter_input_xml_decode (EFilterElement *element,
xmlFree (input->type);
input->type = type;
+ input->allow_empty = !allow_empty || g_strcmp0 (allow_empty, "true") == 0;
+ xmlFree (allow_empty);
+
child = node->children;
while (child != NULL) {
if (!strcmp ((gchar *) child->name, type)) {
@@ -254,6 +297,7 @@ e_filter_input_class_init (EFilterInputClass *class)
filter_element_class = E_FILTER_ELEMENT_CLASS (class);
filter_element_class->validate = filter_input_validate;
filter_element_class->eq = filter_input_eq;
+ filter_element_class->xml_create = filter_input_xml_create;
filter_element_class->xml_encode = filter_input_xml_encode;
filter_element_class->xml_decode = filter_input_xml_decode;
filter_element_class->get_widget = filter_input_get_widget;
@@ -264,6 +308,7 @@ static void
e_filter_input_init (EFilterInput *input)
{
input->values = g_list_prepend (NULL, g_strdup (""));
+ input->allow_empty = TRUE;
}
/**
diff --git a/e-util/e-filter-input.h b/e-util/e-filter-input.h
index 28f7096507..456da413d6 100644
--- a/e-util/e-filter-input.h
+++ b/e-util/e-filter-input.h
@@ -60,6 +60,7 @@ struct _EFilterInput {
gchar *type; /* name of type */
GList *values; /* strings */
+ gboolean allow_empty; /* whether can have empty value */
};
struct _EFilterInputClass {
diff --git a/e-util/e-filter-rule.c b/e-util/e-filter-rule.c
index 5d0b1943a0..d339efde03 100644
--- a/e-util/e-filter-rule.c
+++ b/e-util/e-filter-rule.c
@@ -400,7 +400,7 @@ filter_rule_validate (EFilterRule *rule,
parts = parts->next;
}
- if (!valid && !parts && alert)
+ if (!valid && !rule->parts && alert)
*alert = e_alert_new ("filter:no-condition", NULL);
return valid;
diff --git a/e-util/filter.error.xml b/e-util/filter.error.xml
index 0b35f059be..dbce98dabe 100644
--- a/e-util/filter.error.xml
+++ b/e-util/filter.error.xml
@@ -36,4 +36,9 @@
<_secondary>Filter should have at least one condition.</_secondary>
</error>
+ <error id="not-allow-empty" type="error">
+ <_primary>Missing value.</_primary>
+ <_secondary>One or more values cannot be empty.</_secondary>
+ </error>
+
</error-list>
diff --git a/mail/em-filter-i18n.h b/mail/em-filter-i18n.h
index 855f2f2d3f..3ef519fba2 100644
--- a/mail/em-filter-i18n.h
+++ b/mail/em-filter-i18n.h
@@ -8,49 +8,28 @@ gchar *s = N_("BCC");
gchar *s = N_("Beep");
gchar *s = N_("CC");
gchar *s = N_("Completed On");
-gchar *s = N_("contains");
gchar *s = N_("Copy to Folder");
gchar *s = N_("Date received");
gchar *s = N_("Date sent");
gchar *s = N_("Delete");
gchar *s = N_("Deleted");
-gchar *s = N_("does not contain");
-gchar *s = N_("does not end with");
-gchar *s = N_("does not exist");
-gchar *s = N_("does not have words");
-gchar *s = N_("does not return");
-gchar *s = N_("does not sound like");
-gchar *s = N_("does not start with");
gchar *s = N_("Do Not Exist");
gchar *s = N_("Draft");
-gchar *s = N_("ends with");
gchar *s = N_("Exist");
-gchar *s = N_("exists");
gchar *s = N_("Expression");
gchar *s = N_("Follow Up");
gchar *s = N_("Forward to");
-gchar *s = N_("has words");
gchar *s = N_("Important");
-gchar *s = N_("is");
-gchar *s = N_("is after");
-gchar *s = N_("is before");
-gchar *s = N_("is Flagged");
-gchar *s = N_("is greater than");
-gchar *s = N_("is less than");
-gchar *s = N_("is not");
-gchar *s = N_("is not Flagged");
-gchar *s = N_("is not set");
-gchar *s = N_("is set");
-gchar *s = N_("Junk");
gchar *s = N_("Junk Test");
+gchar *s = N_("Junk");
gchar *s = N_("Label");
gchar *s = N_("Mailing list");
gchar *s = N_("Match All");
gchar *s = N_("Message Body");
gchar *s = N_("Message Header");
+gchar *s = N_("Message Location");
gchar *s = N_("Message is Junk");
gchar *s = N_("Message is not Junk");
-gchar *s = N_("Message Location");
gchar *s = N_("Move to Folder");
gchar *s = N_("Pipe to Program");
gchar *s = N_("Play Sound");
@@ -58,23 +37,44 @@ gchar *s = N_("Read");
gchar *s = N_("Recipients");
gchar *s = N_("Regex Match");
gchar *s = N_("Replied to");
-gchar *s = N_("returns");
-gchar *s = N_("returns greater than");
-gchar *s = N_("returns less than");
gchar *s = N_("Run Program");
gchar *s = N_("Score");
-gchar *s = N_("Sender");
gchar *s = N_("Sender or Recipients");
+gchar *s = N_("Sender");
gchar *s = N_("Set Label");
gchar *s = N_("Set Status");
gchar *s = N_("Size (kB)");
-gchar *s = N_("sounds like");
gchar *s = N_("Source Account");
gchar *s = N_("Specific header");
-gchar *s = N_("starts with");
gchar *s = N_("Status");
gchar *s = N_("Stop Processing");
gchar *s = N_("Subject");
gchar *s = N_("To");
gchar *s = N_("Unset Color");
gchar *s = N_("Unset Status");
+gchar *s = N_("contains");
+gchar *s = N_("does not contain");
+gchar *s = N_("does not end with");
+gchar *s = N_("does not exist");
+gchar *s = N_("does not have words");
+gchar *s = N_("does not return");
+gchar *s = N_("does not sound like");
+gchar *s = N_("does not start with");
+gchar *s = N_("ends with");
+gchar *s = N_("exists");
+gchar *s = N_("has words");
+gchar *s = N_("is Flagged");
+gchar *s = N_("is after");
+gchar *s = N_("is before");
+gchar *s = N_("is greater than");
+gchar *s = N_("is less than");
+gchar *s = N_("is not Flagged");
+gchar *s = N_("is not set");
+gchar *s = N_("is not");
+gchar *s = N_("is set");
+gchar *s = N_("is");
+gchar *s = N_("returns greater than");
+gchar *s = N_("returns less than");
+gchar *s = N_("returns");
+gchar *s = N_("sounds like");
+gchar *s = N_("starts with");
diff --git a/mail/filtertypes.xml b/mail/filtertypes.xml
index 02bea7fadd..f739b06b32 100644
--- a/mail/filtertypes.xml
+++ b/mail/filtertypes.xml
@@ -65,7 +65,7 @@
</code>
</option>
</input>
- <input type="string" name="sender"/>
+ <input type="string" name="sender" allow-empty="false"/>
</part>
<part name="to">
@@ -147,7 +147,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="cc">
@@ -214,7 +214,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="bcc">
@@ -281,7 +281,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="senderto">
@@ -383,7 +383,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="subject">
@@ -467,7 +467,7 @@
<part name="header">
<title>Specific header</title>
- <input type="string" name="header-field"/>
+ <input type="string" name="header-field" allow-empty="false"/>
<input type="optionlist" name="header-type">
<option value="contains">
<title>contains</title>
@@ -573,7 +573,7 @@
</code>
</option>
</input>
- <input type="string" name="word"/>
+ <input type="string" name="word" allow-empty="false"/>
</part>
<part name="sexp">
@@ -819,7 +819,7 @@
<code>(match-all (not (header-contains "x-camel-mlist" ${mlist})))</code>
</option>
</input>
- <input type="string" name="mlist"/>
+ <input type="string" name="mlist" allow-empty="false"/>
</part>
<part name="regex">
@@ -1040,7 +1040,7 @@
<part name="forward">
<title>Forward to</title>
<code>(forward-to ${address})</code>
- <input type="address" name="address"/>
+ <input type="address" name="address" allow-empty="false"/>
</part>
</actionset>
</filterdescription>
diff --git a/mail/vfoldertypes.xml b/mail/vfoldertypes.xml
index d8c6ea5931..ed92cece62 100644
--- a/mail/vfoldertypes.xml
+++ b/mail/vfoldertypes.xml
@@ -45,7 +45,7 @@
</code>
</option>
</input>
- <input type="string" name="sender"/>
+ <input type="string" name="sender" allow-empty="false"/>
</part>
<part name="to">
@@ -112,7 +112,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="toonly">
@@ -179,7 +179,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="cc">
@@ -246,7 +246,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="bcc">
@@ -313,7 +313,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="senderto">
@@ -388,7 +388,7 @@
</code>
</option>
</input>
- <input type="address" name="recipient"/>
+ <input type="address" name="recipient" allow-empty="false"/>
</part>
<part name="subject">
@@ -460,7 +460,7 @@
<part name="header">
<title>Specific header</title>
- <input type="string" name="header-field"/>
+ <input type="string" name="header-field" allow-empty="false"/>
<input type="optionlist" name="header-type">
<option value="contains">
<title>contains</title>
@@ -645,7 +645,7 @@
</code>
</option>
</input>
- <input type="string" name="word"/>
+ <input type="string" name="word" allow-empty="false"/>
</part>
<part name="sexp">
<title>Expression</title>
@@ -893,7 +893,7 @@
<code>(match-all (not (header-contains "x-camel-mlist" ${mlist})))</code>
</option>
</input>
- <input type="string" name="mlist"/>
+ <input type="string" name="mlist" allow-empty="false"/>
</part>
<part name="regex">