]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Reorganize ragel
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 5 Feb 2019 16:00:37 +0000 (16:00 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 5 Feb 2019 16:00:37 +0000 (16:00 +0000)
src/ragel/smtp_base.rl [new file with mode: 0644]
src/ragel/smtp_ip_parser.rl [new file with mode: 0644]

diff --git a/src/ragel/smtp_base.rl b/src/ragel/smtp_base.rl
new file mode 100644 (file)
index 0000000..c9cc910
--- /dev/null
@@ -0,0 +1,39 @@
+%%{
+  machine smtp_base;
+
+  # Base SMTP definitions
+  # Dependencies: none
+  # Required actions: none
+
+  WSP             =   " ";
+  CRLF            =   "\r\n" | ("\r" [^\n]) | ([^\r] "\n");
+  DQUOTE = '"';
+
+  # Printable US-ASCII characters not including specials
+  atext = alpha | digit | "!" | "#" | "$" | "%" | "&" |
+          "'" | "*" | "+" | "_" | "/" | "=" | "?" | "^" |
+          "-" | "`" | "{" | "|" | "}" | "~";
+  # Printable US-ASCII characters not including "[", "]", or "\"
+  dtext = 33..90 | 94..126;
+  # Printable US-ASCII characters not including  "(", ")", or "\"
+  ctext = 33..39 | 42..91 | 93..126;
+
+  dcontent       = 33..90 | 94..126;
+  Let_dig        = alpha | digit;
+  Ldh_str        = ( alpha | digit | "_" | "-" )* Let_dig;
+
+  quoted_pairSMTP  = "\\" 32..126;
+  qtextSMTP      = 32..33 | 35..91 | 93..126;
+  Atom           = atext+;
+  Dot_string     = Atom ("."  Atom)*;
+  dot_atom_text  = atext+ ("." atext+)*;
+  #FWS            =   ((WSP* CRLF)? WSP+);
+  FWS            = WSP+; # We work with unfolded headers, so we can simplify machine
+
+  sub_domain     = Let_dig Ldh_str?;
+  Domain = sub_domain ("." sub_domain)*;
+  Atdomain = "@" Domain;
+  Adl = Atdomain ( "," Atdomain )*;
+
+  Standardized_tag = Ldh_str;
+}%%
\ No newline at end of file
diff --git a/src/ragel/smtp_ip_parser.rl b/src/ragel/smtp_ip_parser.rl
new file mode 100644 (file)
index 0000000..36d9746
--- /dev/null
@@ -0,0 +1,55 @@
+%%{
+
+  machine smtp_ip_parser;
+
+  action IP6_start {
+    in_v6 = 1;
+    ip_start = p;
+  }
+  action IP6_end {
+    in_v6 = 0;
+    ip_end = p;
+  }
+  action IP4_start {
+    if (!in_v6) {
+      ip_start = p;
+    }
+  }
+  action IP4_end {
+    if (!in_v6) {
+      ip_end = p;
+    }
+  }
+
+  action Domain_addr_start {}
+  action Domain_addr_end {}
+
+  include smtp_base "smtp_base.rl";
+  include smtp_ip "smtp_ip.rl";
+
+  main := address_literal | non_conformant_address_literal;
+}%%
+
+#include "smtp_parsers.h"
+#include "util.h"
+#include "addr.h"
+
+%% write data;
+
+rspamd_inet_addr_t *
+rspamd_parse_smtp_ip (const char *data, size_t len, rspamd_mempool_t *pool)
+{
+  const char *p = data, *pe = data + len, *eof = data + len;
+  const char *ip_start = NULL, *ip_end = NULL;
+  gboolean in_v6 = FALSE;
+  gint cs = 0;
+
+  %% write init;
+  %% write exec;
+
+  if (ip_start && ip_end && ip_end > ip_start) {
+    return rspamd_parse_inet_address_pool (ip_start, ip_end - ip_start, pool);
+  }
+
+  return NULL;
+}
\ No newline at end of file