You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

smtp_addr_parser.rl 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. %%{
  2. machine smtp_addr_parser;
  3. action IP6_start {}
  4. action IP6_end {}
  5. action IP4_start {}
  6. action IP4_end {}
  7. action User_start {
  8. addr->user = p;
  9. }
  10. action User_end {
  11. if (addr->user) {
  12. addr->user_len = p - addr->user;
  13. }
  14. }
  15. action Domain_start {
  16. addr->domain = p;
  17. }
  18. action Domain_end {
  19. if (addr->domain) {
  20. addr->domain_len = p - addr->domain;
  21. }
  22. }
  23. action Domain_addr_start {
  24. addr->domain = p;
  25. addr->flags |= RSPAMD_EMAIL_ADDR_IP;
  26. }
  27. action Domain_addr_end {
  28. if (addr->domain) {
  29. addr->domain_len = p - addr->domain;
  30. }
  31. }
  32. action User_has_backslash {
  33. addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH;
  34. }
  35. action Quoted_addr {
  36. addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED;
  37. }
  38. action Empty_addr {
  39. addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY|RSPAMD_EMAIL_ADDR_VALID;
  40. addr->addr = "";
  41. addr->user = addr->addr;
  42. addr->domain = addr->addr;
  43. }
  44. action Valid_addr {
  45. if (addr->addr_len > 0) {
  46. addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
  47. }
  48. }
  49. action Addr_has_angle {
  50. addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
  51. }
  52. action Addr_start {
  53. addr->addr = p;
  54. }
  55. action Addr_end {
  56. if (addr->addr) {
  57. addr->addr_len = p - addr->addr;
  58. }
  59. }
  60. include smtp_base "smtp_base.rl";
  61. include smtp_ip "smtp_ip.rl";
  62. include smtp_address "smtp_address.rl";
  63. main := SMTPAddr;
  64. }%%
  65. #include "smtp_parsers.h"
  66. %% write data;
  67. int
  68. rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_address *addr)
  69. {
  70. const char *p = data, *pe = data + len, *eof;
  71. int cs;
  72. g_assert (addr != NULL);
  73. memset (addr, 0, sizeof (*addr));
  74. addr->raw = data;
  75. addr->raw_len = len;
  76. eof = pe;
  77. %% write init;
  78. %% write exec;
  79. return cs;
  80. }