]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Implement braced regexp quantifiers
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 7 Jun 2016 18:54:45 +0000 (20:54 +0200)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 7 Jun 2016 18:54:45 +0000 (20:54 +0200)
src/libmime/mime_expressions.c

index 427b3654c41ae6a1efe67953e1789be8e5cfbfa6..0f026980a1ddb47c2bda6af9a62dc07e682ab2a2 100644 (file)
@@ -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;