diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-06-14 16:36:20 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-06-14 16:36:20 +0100 |
commit | 7e6126e0169e6397d1e9e989433f590398d20fd8 (patch) | |
tree | 691986e20bf64a560ce19be6ee77eca154c22189 /src/ragel/smtp_received.rl | |
parent | e1955662ec5a6d1b3b6b3d939d7d9be9346aa87d (diff) | |
download | rspamd-7e6126e0169e6397d1e9e989433f590398d20fd8.tar.gz rspamd-7e6126e0169e6397d1e9e989433f590398d20fd8.zip |
[Feature] Implement ragel parser for received headers
Diffstat (limited to 'src/ragel/smtp_received.rl')
-rw-r--r-- | src/ragel/smtp_received.rl | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/ragel/smtp_received.rl b/src/ragel/smtp_received.rl new file mode 100644 index 000000000..235c54906 --- /dev/null +++ b/src/ragel/smtp_received.rl @@ -0,0 +1,39 @@ +%%{ + machine smtp_received; + + include smtp_whitespace "smtp_whitespace.rl"; + include smtp_ip "smtp_ip.rl"; + include smtp_date "smtp_date.rl"; + include smtp_address"smtp_address.rl"; + + # http://tools.ietf.org/html/rfc5321#section-4.4 + + Addtl_Link = Atom; + Link = "TCP" | Addtl_Link; + Attdl_Protocol = Atom; + Protocol = "ESMTP" %ESMTP_proto | "SMTP" %SMTP_proto | "ESMTPS" %ESMTPS_proto | "LMTP" %LMTP_proto | "IMAP" %IMAP_proto | Attdl_Protocol; + + TCP_info = address_literal >Real_IP_Start %Real_IP_End | + ( Domain >Real_Domain_Start %Real_Domain_End FWS address_literal >Real_IP_Start %Real_IP_End ); + Extended_Domain = Domain >Real_Domain_Start %Real_Domain_End | # Used to be a real domain + ( Domain >Reported_Domain_Start %Reported_Domain_End FWS "(" TCP_info ")" ) | # Here domain is something specified by remote side + ( address_literal >Real_Domain_Start %Real_Domain_End FWS "(" TCP_info ")" ); + + From_domain = "FROM"i FWS Extended_Domain >From_Start %From_End; + By_domain = CFWS "BY"i FWS Extended_Domain >By_Start %By_End; + + Via = CFWS "VIA"i FWS Link; + With = CFWS "WITH"i FWS Protocol; + + id_left = dot_atom_text; + no_fold_literal = "[" dtext* "]"; + id_right = dot_atom_text | no_fold_literal; + msg_id = "<" id_left "@" id_right ">"; + ID = CFWS "ID"i FWS ( Atom | msg_id ); + + For = CFWS "FOR"i FWS ( Path | Mailbox ) %For_End; + Additional_Registered_Clauses = CFWS Atom FWS String; + Opt_info = Via? With? ID? For? Additional_Registered_Clauses?; + Received = From_domain By_domain Opt_info CFWS? ";" FWS date_time; + +}%% |