summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-06-07 20:54:45 +0200
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-06-07 20:54:45 +0200
commit8a8f6c981aba81a7f7f8d407640c9013efda0677 (patch)
tree9acd2b946ba0bf1d764dbb403001510a9a3c2a57 /src
parent242063230f2fbbfb7f3aa06727a79cbd6f72938c (diff)
downloadrspamd-8a8f6c981aba81a7f7f8d407640c9013efda0677.tar.gz
rspamd-8a8f6c981aba81a7f7f8d407640c9013efda0677.zip
[Feature] Implement braced regexp quantifiers
Diffstat (limited to 'src')
-rw-r--r--src/libmime/mime_expressions.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c
index 427b3654c..0f026980a 100644
--- a/src/libmime/mime_expressions.c
+++ b/src/libmime/mime_expressions.c
@@ -177,6 +177,48 @@ rspamd_mime_expr_quark (void)
return g_quark_from_static_string ("mime-expressions");
}
+static gboolean
+rspamd_parse_long_option (const gchar *start, gsize len,
+ struct rspamd_regexp_atom *a)
+{
+ gboolean ret = FALSE;
+
+ if (rspamd_lc_cmp (start, "body", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_BODY;
+ }
+ else if (rspamd_lc_cmp (start, "part", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_MIME;
+ }
+ else if (rspamd_lc_cmp (start, "raw_part", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_RAWMIME;
+ }
+ else if (rspamd_lc_cmp (start, "header", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_HEADER;
+ }
+ else if (rspamd_lc_cmp (start, "mime_header", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_MIMEHEADER;
+ }
+ else if (rspamd_lc_cmp (start, "raw_header", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_RAWHEADER;
+ }
+ else if (rspamd_lc_cmp (start, "sabody", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_SABODY;
+ }
+ else if (rspamd_lc_cmp (start, "sabody", len) == 0) {
+ ret = TRUE;
+ a->type = RSPAMD_RE_SARAWBODY;
+ }
+
+ return ret;
+}
+
/*
* Rspamd regexp utility functions
*/
@@ -184,7 +226,7 @@ static struct rspamd_regexp_atom *
rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line,
struct rspamd_config *cfg)
{
- const gchar *begin, *end, *p, *src, *start;
+ const gchar *begin, *end, *p, *src, *start, *brace;
gchar *dbegin, *dend;
struct rspamd_regexp_atom *result;
GError *err = NULL;
@@ -291,6 +333,14 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line,
result->type = RSPAMD_RE_MIMEHEADER;
p++;
break;
+ case 'C':
+ result->type = RSPAMD_RE_SABODY;
+ p++;
+ break;
+ case 'D':
+ result->type = RSPAMD_RE_SARAWBODY;
+ p++;
+ break;
case 'M':
result->type = RSPAMD_RE_BODY;
p++;
@@ -311,6 +361,20 @@ rspamd_mime_expr_parse_regexp_atom (rspamd_mempool_t * pool, const gchar *line,
result->type = RSPAMD_RE_RAWHEADER;
p++;
break;
+ case '{':
+ /* Long definition */
+ if ((brace = strchr (p + 1, '}')) != NULL) {
+ if (!rspamd_parse_long_option (p + 1, brace - (p + 1), result)) {
+ p = NULL;
+ }
+ else {
+ p = brace + 1;
+ }
+ }
+ else {
+ p = NULL;
+ }
+ break;
/* Other flags */
case 'T':
result->is_test = TRUE;