mail 2.6.4 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -98
  3. data/lib/mail/attachments_list.rb +9 -5
  4. data/lib/mail/body.rb +42 -36
  5. data/lib/mail/check_delivery_params.rb +49 -10
  6. data/lib/mail/configuration.rb +2 -0
  7. data/lib/mail/core_extensions/smtp.rb +19 -16
  8. data/lib/mail/core_extensions/string.rb +0 -4
  9. data/lib/mail/elements/address.rb +37 -26
  10. data/lib/mail/elements/address_list.rb +10 -18
  11. data/lib/mail/elements/content_disposition_element.rb +8 -15
  12. data/lib/mail/elements/content_location_element.rb +5 -10
  13. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  14. data/lib/mail/elements/content_type_element.rb +8 -19
  15. data/lib/mail/elements/date_time_element.rb +6 -14
  16. data/lib/mail/elements/envelope_from_element.rb +14 -21
  17. data/lib/mail/elements/message_ids_element.rb +8 -12
  18. data/lib/mail/elements/mime_version_element.rb +6 -14
  19. data/lib/mail/elements/phrase_list.rb +6 -9
  20. data/lib/mail/elements/received_element.rb +9 -15
  21. data/lib/mail/encodings/7bit.rb +5 -15
  22. data/lib/mail/encodings/8bit.rb +2 -21
  23. data/lib/mail/encodings/base64.rb +11 -12
  24. data/lib/mail/encodings/binary.rb +3 -22
  25. data/lib/mail/encodings/identity.rb +24 -0
  26. data/lib/mail/encodings/quoted_printable.rb +6 -6
  27. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  28. data/lib/mail/encodings/unix_to_unix.rb +2 -1
  29. data/lib/mail/encodings.rb +99 -43
  30. data/lib/mail/envelope.rb +1 -1
  31. data/lib/mail/field.rb +94 -59
  32. data/lib/mail/fields/bcc_field.rb +2 -2
  33. data/lib/mail/fields/cc_field.rb +1 -1
  34. data/lib/mail/fields/comments_field.rb +1 -1
  35. data/lib/mail/fields/common/address_container.rb +2 -2
  36. data/lib/mail/fields/common/common_address.rb +32 -7
  37. data/lib/mail/fields/common/common_field.rb +1 -10
  38. data/lib/mail/fields/common/parameter_hash.rb +1 -1
  39. data/lib/mail/fields/content_description_field.rb +1 -1
  40. data/lib/mail/fields/content_disposition_field.rb +3 -3
  41. data/lib/mail/fields/content_id_field.rb +2 -2
  42. data/lib/mail/fields/content_location_field.rb +1 -1
  43. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  44. data/lib/mail/fields/content_type_field.rb +3 -8
  45. data/lib/mail/fields/date_field.rb +2 -3
  46. data/lib/mail/fields/from_field.rb +1 -1
  47. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  48. data/lib/mail/fields/keywords_field.rb +1 -1
  49. data/lib/mail/fields/message_id_field.rb +1 -1
  50. data/lib/mail/fields/mime_version_field.rb +1 -1
  51. data/lib/mail/fields/optional_field.rb +4 -1
  52. data/lib/mail/fields/received_field.rb +1 -1
  53. data/lib/mail/fields/references_field.rb +1 -1
  54. data/lib/mail/fields/reply_to_field.rb +1 -1
  55. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  56. data/lib/mail/fields/resent_cc_field.rb +1 -1
  57. data/lib/mail/fields/resent_date_field.rb +0 -1
  58. data/lib/mail/fields/resent_from_field.rb +1 -1
  59. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  60. data/lib/mail/fields/resent_sender_field.rb +1 -1
  61. data/lib/mail/fields/resent_to_field.rb +1 -1
  62. data/lib/mail/fields/return_path_field.rb +1 -1
  63. data/lib/mail/fields/sender_field.rb +1 -1
  64. data/lib/mail/fields/subject_field.rb +1 -1
  65. data/lib/mail/fields/to_field.rb +1 -1
  66. data/lib/mail/fields/unstructured_field.rb +21 -4
  67. data/lib/mail/header.rb +10 -8
  68. data/lib/mail/mail.rb +2 -10
  69. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  70. data/lib/mail/message.rb +77 -66
  71. data/lib/mail/multibyte/chars.rb +31 -30
  72. data/lib/mail/multibyte.rb +64 -15
  73. data/lib/mail/network/delivery_methods/exim.rb +6 -10
  74. data/lib/mail/network/delivery_methods/file_delivery.rb +4 -8
  75. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  76. data/lib/mail/network/delivery_methods/sendmail.rb +16 -11
  77. data/lib/mail/network/delivery_methods/smtp.rb +59 -53
  78. data/lib/mail/network/delivery_methods/smtp_connection.rb +10 -6
  79. data/lib/mail/network/delivery_methods/test_mailer.rb +5 -8
  80. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  81. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  82. data/lib/mail/network/retriever_methods/test_retriever.rb +1 -1
  83. data/lib/mail/network.rb +1 -0
  84. data/lib/mail/parser_tools.rb +15 -0
  85. data/lib/mail/parsers/address_lists_parser.rb +33186 -112
  86. data/lib/mail/parsers/address_lists_parser.rl +172 -0
  87. data/lib/mail/parsers/content_disposition_parser.rb +888 -55
  88. data/lib/mail/parsers/content_disposition_parser.rl +82 -0
  89. data/lib/mail/parsers/content_location_parser.rb +800 -23
  90. data/lib/mail/parsers/content_location_parser.rl +71 -0
  91. data/lib/mail/parsers/content_transfer_encoding_parser.rb +510 -22
  92. data/lib/mail/parsers/content_transfer_encoding_parser.rl +64 -0
  93. data/lib/mail/parsers/content_type_parser.rb +1032 -54
  94. data/lib/mail/parsers/content_type_parser.rl +83 -0
  95. data/lib/mail/parsers/date_time_parser.rb +873 -26
  96. data/lib/mail/parsers/date_time_parser.rl +62 -0
  97. data/lib/mail/parsers/envelope_from_parser.rb +3564 -36
  98. data/lib/mail/parsers/envelope_from_parser.rl +82 -0
  99. data/lib/mail/parsers/message_ids_parser.rb +2843 -25
  100. data/lib/mail/parsers/message_ids_parser.rl +82 -0
  101. data/lib/mail/parsers/mime_version_parser.rb +493 -26
  102. data/lib/mail/parsers/mime_version_parser.rl +61 -0
  103. data/lib/mail/parsers/phrase_lists_parser.rb +874 -19
  104. data/lib/mail/parsers/phrase_lists_parser.rl +83 -0
  105. data/lib/mail/parsers/received_parser.rb +8743 -38
  106. data/lib/mail/parsers/received_parser.rl +84 -0
  107. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  108. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  109. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  110. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  111. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  112. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  113. data/lib/mail/parsers/rfc5322.rl +59 -0
  114. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  115. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  116. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  117. data/lib/mail/parsers.rb +16 -24
  118. data/lib/mail/part.rb +1 -1
  119. data/lib/mail/parts_list.rb +5 -6
  120. data/lib/mail/utilities.rb +63 -18
  121. data/lib/mail/version.rb +2 -2
  122. data/lib/mail/version_specific/ruby_1_8.rb +40 -3
  123. data/lib/mail/version_specific/ruby_1_9.rb +64 -9
  124. data/lib/mail.rb +3 -16
  125. metadata +30 -53
  126. data/CHANGELOG.rdoc +0 -787
  127. data/CONTRIBUTING.md +0 -60
  128. data/Dependencies.txt +0 -2
  129. data/Gemfile +0 -11
  130. data/Rakefile +0 -29
  131. data/TODO.rdoc +0 -9
  132. data/lib/mail/core_extensions/string/access.rb +0 -146
  133. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  134. data/lib/mail/multibyte/exceptions.rb +0 -9
  135. data/lib/mail/parsers/ragel/common.rl +0 -185
  136. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  137. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  138. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  139. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  140. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  141. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  142. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  143. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  144. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  145. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  146. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  147. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  148. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  149. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  150. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  151. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  152. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  153. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  154. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  155. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  156. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  157. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  158. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  159. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  160. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  161. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  162. data/lib/mail/parsers/ragel.rb +0 -18
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+ require 'mail/parser_tools'
4
+
5
+ %%{
6
+ # RFC 2557 Content-Location
7
+ # https://tools.ietf.org/html/rfc2557#section-4.1
8
+ machine content_location;
9
+ alphtype int;
10
+
11
+ # Quoted String
12
+ action qstr_s { qstr_s = p }
13
+ action qstr_e { content_location.location = chars(data, qstr_s, p-1) }
14
+
15
+ # Token String
16
+ action token_string_s { token_string_s = p }
17
+ action token_string_e { content_location.location = chars(data, token_string_s, p-1) }
18
+
19
+ # No-op actions
20
+ action comment_e { }
21
+ action comment_s { }
22
+ action phrase_e { }
23
+ action phrase_s { }
24
+ action main_type_e { }
25
+ action main_type_s { }
26
+ action sub_type_e { }
27
+ action sub_type_s { }
28
+ action param_attr_e { }
29
+ action param_attr_s { }
30
+ action param_val_e { }
31
+ action param_val_s { }
32
+
33
+ include rfc2045_content_type "rfc2045_content_type.rl";
34
+
35
+ location = quoted_string | ((token | 0x3d)+ >token_string_s %token_string_e);
36
+ main := CFWS? location CFWS?;
37
+ }%%
38
+
39
+ module Mail::Parsers
40
+ module ContentLocationParser
41
+ extend Mail::ParserTools
42
+
43
+ ContentLocationStruct = Struct.new(:location, :error)
44
+
45
+ %%write data noprefix;
46
+
47
+ def self.parse(data)
48
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
49
+
50
+ content_location = ContentLocationStruct.new(nil)
51
+ return content_location if Mail::Utilities.blank?(data)
52
+
53
+ # Parser state
54
+ disp_type_s = param_attr_s = param_attr = qstr_s = qstr = param_val_s = nil
55
+
56
+ # 5.1 Variables Used by Ragel
57
+ p = 0
58
+ eof = pe = data.length
59
+ stack = []
60
+
61
+ %%write init;
62
+ %%write exec;
63
+
64
+ if p != eof || cs < %%{ write first_final; }%%
65
+ raise Mail::Field::IncompleteParseError.new(Mail::ContentLocationElement, data, p)
66
+ end
67
+
68
+ content_location
69
+ end
70
+ end
71
+ end
@@ -1,31 +1,519 @@
1
+
1
2
  # frozen_string_literal: true
3
+ require 'mail/utilities'
4
+ require 'mail/parser_tools'
5
+
6
+
7
+
8
+
2
9
  module Mail::Parsers
3
- class ContentTransferEncodingParser
10
+ module ContentTransferEncodingParser
11
+ extend Mail::ParserTools
4
12
 
5
- def parse(s)
6
- content_transfer_encoding = ContentTransferEncodingStruct.new("")
7
- if Mail::Utilities.blank?(s)
8
- return content_transfer_encoding
9
- end
13
+ ContentTransferEncodingStruct = Struct.new(:encoding, :error)
10
14
 
11
- actions, error = Ragel.parse(:content_transfer_encoding, s)
12
- if error
13
- raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, error)
14
- end
15
+
16
+ class << self
17
+ attr_accessor :_trans_keys
18
+ private :_trans_keys, :_trans_keys=
19
+ end
20
+ self._trans_keys = [
21
+ 0, 0, 9, 126, 10, 10,
22
+ 9, 32, 10, 10, 9,
23
+ 32, 10, 10, 9, 32,
24
+ 9, 126, 1, 244, 1, 244,
25
+ 10, 10, 9, 32, 0,
26
+ 244, 128, 191, 160, 191,
27
+ 128, 191, 128, 159, 144, 191,
28
+ 128, 191, 128, 143, 9,
29
+ 126, 9, 59, 9, 59,
30
+ 9, 40, 9, 40, 0, 0,
31
+ 0
32
+ ]
33
+
34
+ class << self
35
+ attr_accessor :_key_spans
36
+ private :_key_spans, :_key_spans=
37
+ end
38
+ self._key_spans = [
39
+ 0, 118, 1, 24, 1, 24, 1, 24,
40
+ 118, 244, 244, 1, 24, 245, 64, 32,
41
+ 64, 32, 48, 64, 16, 118, 51, 51,
42
+ 32, 32, 0
43
+ ]
44
+
45
+ class << self
46
+ attr_accessor :_index_offsets
47
+ private :_index_offsets, :_index_offsets=
48
+ end
49
+ self._index_offsets = [
50
+ 0, 0, 119, 121, 146, 148, 173, 175,
51
+ 200, 319, 564, 809, 811, 836, 1082, 1147,
52
+ 1180, 1245, 1278, 1327, 1392, 1409, 1528, 1580,
53
+ 1632, 1665, 1698
54
+ ]
55
+
56
+ class << self
57
+ attr_accessor :_indicies
58
+ private :_indicies, :_indicies=
59
+ end
60
+ self._indicies = [
61
+ 0, 1, 1, 1, 2, 1, 1, 1,
62
+ 1, 1, 1, 1, 1, 1, 1, 1,
63
+ 1, 1, 1, 1, 1, 1, 1, 0,
64
+ 3, 3, 3, 3, 3, 3, 3, 4,
65
+ 1, 3, 3, 3, 3, 3, 1, 3,
66
+ 3, 3, 3, 3, 3, 3, 3, 3,
67
+ 3, 1, 1, 1, 1, 1, 1, 1,
68
+ 3, 3, 3, 3, 3, 3, 3, 3,
69
+ 3, 3, 3, 3, 3, 3, 3, 3,
70
+ 3, 3, 3, 3, 3, 3, 3, 3,
71
+ 3, 3, 1, 1, 1, 3, 3, 3,
72
+ 3, 3, 3, 3, 3, 3, 3, 3,
73
+ 3, 3, 3, 3, 3, 3, 3, 3,
74
+ 3, 3, 3, 3, 3, 3, 3, 3,
75
+ 3, 3, 3, 3, 3, 3, 1, 5,
76
+ 1, 0, 1, 1, 1, 1, 1, 1,
77
+ 1, 1, 1, 1, 1, 1, 1, 1,
78
+ 1, 1, 1, 1, 1, 1, 1, 1,
79
+ 0, 1, 6, 1, 7, 1, 1, 1,
80
+ 1, 1, 1, 1, 1, 1, 1, 1,
81
+ 1, 1, 1, 1, 1, 1, 1, 1,
82
+ 1, 1, 1, 7, 1, 8, 1, 9,
83
+ 1, 1, 1, 1, 1, 1, 1, 1,
84
+ 1, 1, 1, 1, 1, 1, 1, 1,
85
+ 1, 1, 1, 1, 1, 1, 9, 1,
86
+ 10, 1, 1, 1, 11, 1, 1, 1,
87
+ 1, 1, 1, 1, 1, 1, 1, 1,
88
+ 1, 1, 1, 1, 1, 1, 1, 10,
89
+ 12, 12, 12, 12, 12, 12, 12, 13,
90
+ 1, 12, 12, 12, 12, 12, 1, 12,
91
+ 12, 12, 12, 12, 12, 12, 12, 12,
92
+ 12, 1, 1, 1, 1, 1, 1, 1,
93
+ 12, 12, 12, 12, 12, 12, 12, 12,
94
+ 12, 12, 12, 12, 12, 12, 12, 12,
95
+ 12, 12, 12, 12, 12, 12, 12, 12,
96
+ 12, 12, 1, 1, 1, 12, 12, 12,
97
+ 12, 12, 12, 12, 12, 12, 12, 12,
98
+ 12, 12, 12, 12, 12, 12, 12, 12,
99
+ 12, 12, 12, 12, 12, 12, 12, 12,
100
+ 12, 12, 12, 12, 12, 12, 1, 14,
101
+ 14, 14, 14, 14, 14, 14, 14, 14,
102
+ 1, 14, 14, 15, 14, 14, 14, 14,
103
+ 14, 14, 14, 14, 14, 14, 14, 14,
104
+ 14, 14, 14, 14, 14, 14, 14, 14,
105
+ 14, 14, 14, 14, 14, 14, 16, 17,
106
+ 14, 14, 14, 14, 14, 14, 14, 14,
107
+ 14, 14, 14, 14, 14, 14, 14, 14,
108
+ 14, 14, 14, 14, 14, 14, 14, 14,
109
+ 14, 14, 14, 14, 14, 14, 14, 14,
110
+ 14, 14, 14, 14, 14, 14, 14, 14,
111
+ 14, 14, 14, 14, 14, 14, 14, 14,
112
+ 14, 14, 18, 14, 14, 14, 14, 14,
113
+ 14, 14, 14, 14, 14, 14, 14, 14,
114
+ 14, 14, 14, 14, 14, 14, 14, 14,
115
+ 14, 14, 14, 14, 14, 14, 14, 14,
116
+ 14, 14, 14, 14, 14, 14, 1, 1,
117
+ 1, 1, 1, 1, 1, 1, 1, 1,
118
+ 1, 1, 1, 1, 1, 1, 1, 1,
119
+ 1, 1, 1, 1, 1, 1, 1, 1,
120
+ 1, 1, 1, 1, 1, 1, 1, 1,
121
+ 1, 1, 1, 1, 1, 1, 1, 1,
122
+ 1, 1, 1, 1, 1, 1, 1, 1,
123
+ 1, 1, 1, 1, 1, 1, 1, 1,
124
+ 1, 1, 1, 1, 1, 1, 1, 1,
125
+ 19, 19, 19, 19, 19, 19, 19, 19,
126
+ 19, 19, 19, 19, 19, 19, 19, 19,
127
+ 19, 19, 19, 19, 19, 19, 19, 19,
128
+ 19, 19, 19, 19, 19, 19, 20, 21,
129
+ 21, 21, 21, 21, 21, 21, 21, 21,
130
+ 21, 21, 21, 22, 21, 21, 23, 24,
131
+ 24, 24, 25, 1, 26, 26, 26, 26,
132
+ 26, 26, 26, 26, 26, 1, 26, 26,
133
+ 27, 26, 26, 26, 26, 26, 26, 26,
134
+ 26, 26, 26, 26, 26, 26, 26, 26,
135
+ 26, 26, 26, 26, 26, 26, 26, 26,
136
+ 26, 26, 26, 28, 29, 26, 26, 26,
137
+ 26, 26, 26, 26, 26, 26, 26, 26,
138
+ 26, 26, 26, 26, 26, 26, 26, 26,
139
+ 26, 26, 26, 26, 26, 26, 26, 26,
140
+ 26, 26, 26, 26, 26, 26, 26, 26,
141
+ 26, 26, 26, 26, 26, 26, 26, 26,
142
+ 26, 26, 26, 26, 26, 26, 26, 30,
143
+ 26, 26, 26, 26, 26, 26, 26, 26,
144
+ 26, 26, 26, 26, 26, 26, 26, 26,
145
+ 26, 26, 26, 26, 26, 26, 26, 26,
146
+ 26, 26, 26, 26, 26, 26, 26, 26,
147
+ 26, 26, 26, 1, 1, 1, 1, 1,
148
+ 1, 1, 1, 1, 1, 1, 1, 1,
149
+ 1, 1, 1, 1, 1, 1, 1, 1,
150
+ 1, 1, 1, 1, 1, 1, 1, 1,
151
+ 1, 1, 1, 1, 1, 1, 1, 1,
152
+ 1, 1, 1, 1, 1, 1, 1, 1,
153
+ 1, 1, 1, 1, 1, 1, 1, 1,
154
+ 1, 1, 1, 1, 1, 1, 1, 1,
155
+ 1, 1, 1, 1, 1, 31, 31, 31,
156
+ 31, 31, 31, 31, 31, 31, 31, 31,
157
+ 31, 31, 31, 31, 31, 31, 31, 31,
158
+ 31, 31, 31, 31, 31, 31, 31, 31,
159
+ 31, 31, 31, 32, 33, 33, 33, 33,
160
+ 33, 33, 33, 33, 33, 33, 33, 33,
161
+ 34, 33, 33, 35, 36, 36, 36, 37,
162
+ 1, 38, 1, 26, 1, 1, 1, 1,
163
+ 1, 1, 1, 1, 1, 1, 1, 1,
164
+ 1, 1, 1, 1, 1, 1, 1, 1,
165
+ 1, 1, 26, 1, 26, 26, 26, 26,
166
+ 26, 26, 26, 26, 26, 26, 26, 26,
167
+ 26, 26, 26, 26, 26, 26, 26, 26,
168
+ 26, 26, 26, 26, 26, 26, 26, 26,
169
+ 26, 26, 26, 26, 26, 26, 26, 26,
170
+ 26, 26, 26, 26, 26, 26, 26, 26,
171
+ 26, 26, 26, 26, 26, 26, 26, 26,
172
+ 26, 26, 26, 26, 26, 26, 26, 26,
173
+ 26, 26, 26, 26, 26, 26, 26, 26,
174
+ 26, 26, 26, 26, 26, 26, 26, 26,
175
+ 26, 26, 26, 26, 26, 26, 26, 26,
176
+ 26, 26, 26, 26, 26, 26, 26, 26,
177
+ 26, 26, 26, 26, 26, 26, 26, 26,
178
+ 26, 26, 26, 26, 26, 26, 26, 26,
179
+ 26, 26, 26, 26, 26, 26, 26, 26,
180
+ 26, 26, 26, 26, 26, 26, 26, 26,
181
+ 26, 26, 26, 26, 1, 1, 1, 1,
182
+ 1, 1, 1, 1, 1, 1, 1, 1,
183
+ 1, 1, 1, 1, 1, 1, 1, 1,
184
+ 1, 1, 1, 1, 1, 1, 1, 1,
185
+ 1, 1, 1, 1, 1, 1, 1, 1,
186
+ 1, 1, 1, 1, 1, 1, 1, 1,
187
+ 1, 1, 1, 1, 1, 1, 1, 1,
188
+ 1, 1, 1, 1, 1, 1, 1, 1,
189
+ 1, 1, 1, 1, 1, 1, 31, 31,
190
+ 31, 31, 31, 31, 31, 31, 31, 31,
191
+ 31, 31, 31, 31, 31, 31, 31, 31,
192
+ 31, 31, 31, 31, 31, 31, 31, 31,
193
+ 31, 31, 31, 31, 32, 33, 33, 33,
194
+ 33, 33, 33, 33, 33, 33, 33, 33,
195
+ 33, 34, 33, 33, 35, 36, 36, 36,
196
+ 37, 1, 26, 26, 26, 26, 26, 26,
197
+ 26, 26, 26, 26, 26, 26, 26, 26,
198
+ 26, 26, 26, 26, 26, 26, 26, 26,
199
+ 26, 26, 26, 26, 26, 26, 26, 26,
200
+ 26, 26, 26, 26, 26, 26, 26, 26,
201
+ 26, 26, 26, 26, 26, 26, 26, 26,
202
+ 26, 26, 26, 26, 26, 26, 26, 26,
203
+ 26, 26, 26, 26, 26, 26, 26, 26,
204
+ 26, 26, 1, 31, 31, 31, 31, 31,
205
+ 31, 31, 31, 31, 31, 31, 31, 31,
206
+ 31, 31, 31, 31, 31, 31, 31, 31,
207
+ 31, 31, 31, 31, 31, 31, 31, 31,
208
+ 31, 31, 31, 1, 31, 31, 31, 31,
209
+ 31, 31, 31, 31, 31, 31, 31, 31,
210
+ 31, 31, 31, 31, 31, 31, 31, 31,
211
+ 31, 31, 31, 31, 31, 31, 31, 31,
212
+ 31, 31, 31, 31, 31, 31, 31, 31,
213
+ 31, 31, 31, 31, 31, 31, 31, 31,
214
+ 31, 31, 31, 31, 31, 31, 31, 31,
215
+ 31, 31, 31, 31, 31, 31, 31, 31,
216
+ 31, 31, 31, 31, 1, 31, 31, 31,
217
+ 31, 31, 31, 31, 31, 31, 31, 31,
218
+ 31, 31, 31, 31, 31, 31, 31, 31,
219
+ 31, 31, 31, 31, 31, 31, 31, 31,
220
+ 31, 31, 31, 31, 31, 1, 33, 33,
221
+ 33, 33, 33, 33, 33, 33, 33, 33,
222
+ 33, 33, 33, 33, 33, 33, 33, 33,
223
+ 33, 33, 33, 33, 33, 33, 33, 33,
224
+ 33, 33, 33, 33, 33, 33, 33, 33,
225
+ 33, 33, 33, 33, 33, 33, 33, 33,
226
+ 33, 33, 33, 33, 33, 33, 1, 33,
227
+ 33, 33, 33, 33, 33, 33, 33, 33,
228
+ 33, 33, 33, 33, 33, 33, 33, 33,
229
+ 33, 33, 33, 33, 33, 33, 33, 33,
230
+ 33, 33, 33, 33, 33, 33, 33, 33,
231
+ 33, 33, 33, 33, 33, 33, 33, 33,
232
+ 33, 33, 33, 33, 33, 33, 33, 33,
233
+ 33, 33, 33, 33, 33, 33, 33, 33,
234
+ 33, 33, 33, 33, 33, 33, 33, 1,
235
+ 33, 33, 33, 33, 33, 33, 33, 33,
236
+ 33, 33, 33, 33, 33, 33, 33, 33,
237
+ 1, 39, 1, 1, 1, 40, 1, 1,
238
+ 1, 1, 1, 1, 1, 1, 1, 1,
239
+ 1, 1, 1, 1, 1, 1, 1, 1,
240
+ 39, 41, 41, 41, 41, 41, 41, 41,
241
+ 42, 1, 41, 41, 41, 41, 41, 1,
242
+ 41, 41, 41, 41, 41, 41, 41, 41,
243
+ 41, 41, 1, 43, 1, 1, 1, 1,
244
+ 1, 41, 41, 41, 41, 41, 41, 41,
245
+ 41, 41, 41, 41, 41, 41, 41, 41,
246
+ 41, 41, 41, 41, 41, 41, 41, 41,
247
+ 41, 41, 41, 1, 1, 1, 41, 41,
248
+ 41, 41, 41, 41, 41, 41, 41, 41,
249
+ 41, 41, 41, 41, 41, 41, 41, 41,
250
+ 41, 41, 41, 41, 41, 41, 41, 41,
251
+ 41, 41, 41, 41, 41, 41, 41, 1,
252
+ 7, 1, 1, 1, 44, 1, 1, 1,
253
+ 1, 1, 1, 1, 1, 1, 1, 1,
254
+ 1, 1, 1, 1, 1, 1, 1, 7,
255
+ 1, 1, 1, 1, 1, 1, 1, 45,
256
+ 1, 1, 1, 1, 1, 1, 1, 1,
257
+ 1, 1, 1, 1, 1, 1, 1, 1,
258
+ 1, 1, 9, 1, 46, 1, 1, 1,
259
+ 47, 1, 1, 1, 1, 1, 1, 1,
260
+ 1, 1, 1, 1, 1, 1, 1, 1,
261
+ 1, 1, 1, 46, 1, 1, 1, 1,
262
+ 1, 1, 1, 48, 1, 1, 1, 1,
263
+ 1, 1, 1, 1, 1, 1, 1, 1,
264
+ 1, 1, 1, 1, 1, 1, 49, 1,
265
+ 9, 1, 1, 1, 50, 1, 1, 1,
266
+ 1, 1, 1, 1, 1, 1, 1, 1,
267
+ 1, 1, 1, 1, 1, 1, 1, 9,
268
+ 1, 1, 1, 1, 1, 1, 1, 51,
269
+ 1, 49, 1, 1, 1, 52, 1, 1,
270
+ 1, 1, 1, 1, 1, 1, 1, 1,
271
+ 1, 1, 1, 1, 1, 1, 1, 1,
272
+ 49, 1, 1, 1, 1, 1, 1, 1,
273
+ 53, 1, 1, 0
274
+ ]
275
+
276
+ class << self
277
+ attr_accessor :_trans_targs
278
+ private :_trans_targs, :_trans_targs=
279
+ end
280
+ self._trans_targs = [
281
+ 1, 0, 2, 21, 8, 3, 5, 22,
282
+ 7, 24, 1, 2, 21, 8, 10, 11,
283
+ 10, 26, 13, 14, 15, 16, 17, 18,
284
+ 19, 20, 10, 11, 10, 26, 13, 14,
285
+ 15, 16, 17, 18, 19, 20, 12, 22,
286
+ 4, 21, 23, 24, 4, 23, 22, 4,
287
+ 23, 24, 6, 25, 6, 25
288
+ ]
289
+
290
+ class << self
291
+ attr_accessor :_trans_actions
292
+ private :_trans_actions, :_trans_actions=
293
+ end
294
+ self._trans_actions = [
295
+ 0, 0, 0, 1, 2, 0, 0, 0,
296
+ 0, 0, 3, 3, 4, 5, 6, 6,
297
+ 7, 8, 6, 6, 6, 6, 6, 6,
298
+ 6, 6, 0, 0, 2, 9, 0, 0,
299
+ 0, 0, 0, 0, 0, 0, 0, 10,
300
+ 10, 0, 11, 10, 0, 2, 3, 3,
301
+ 5, 3, 0, 2, 3, 5
302
+ ]
303
+
304
+ class << self
305
+ attr_accessor :_eof_actions
306
+ private :_eof_actions, :_eof_actions=
307
+ end
308
+ self._eof_actions = [
309
+ 0, 0, 0, 0, 0, 0, 0, 0,
310
+ 0, 0, 0, 0, 0, 0, 0, 0,
311
+ 0, 0, 0, 0, 0, 10, 0, 3,
312
+ 0, 3, 0
313
+ ]
15
314
 
315
+ class << self
316
+ attr_accessor :start
317
+ end
318
+ self.start = 1;
319
+ class << self
320
+ attr_accessor :first_final
321
+ end
322
+ self.first_final = 21;
323
+ class << self
324
+ attr_accessor :error
325
+ end
326
+ self.error = 0;
327
+
328
+ class << self
329
+ attr_accessor :en_comment_tail
330
+ end
331
+ self.en_comment_tail = 9;
332
+ class << self
333
+ attr_accessor :en_main
334
+ end
335
+ self.en_main = 1;
336
+
337
+
338
+
339
+ def self.parse(data)
340
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
341
+
342
+ content_transfer_encoding = ContentTransferEncodingStruct.new('')
343
+ return content_transfer_encoding if Mail::Utilities.blank?(data)
344
+
345
+ # Parser state
16
346
  encoding_s = nil
17
- actions.each_slice(2) do |action_id, p|
18
- action = Mail::Parsers::Ragel::ACTIONS[action_id]
19
- case action
20
-
21
- # Encoding
22
- when :encoding_s then encoding_s = p
23
- when :encoding_e
24
- content_transfer_encoding.encoding = s[encoding_s..(p-1)].downcase
25
-
26
- else
27
- raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, "Failed to process unknown action: #{action}")
28
- end
347
+
348
+ # 5.1 Variables Used by Ragel
349
+ p = 0
350
+ eof = pe = data.length
351
+ stack = []
352
+
353
+
354
+ begin
355
+ p ||= 0
356
+ pe ||= data.length
357
+ cs = start
358
+ top = 0
359
+ end
360
+
361
+
362
+ begin
363
+ testEof = false
364
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
365
+ _goto_level = 0
366
+ _resume = 10
367
+ _eof_trans = 15
368
+ _again = 20
369
+ _test_eof = 30
370
+ _out = 40
371
+ while true
372
+ if _goto_level <= 0
373
+ if p == pe
374
+ _goto_level = _test_eof
375
+ next
376
+ end
377
+ if cs == 0
378
+ _goto_level = _out
379
+ next
380
+ end
381
+ end
382
+ if _goto_level <= _resume
383
+ _keys = cs << 1
384
+ _inds = _index_offsets[cs]
385
+ _slen = _key_spans[cs]
386
+ _wide = data[p].ord
387
+ _trans = if ( _slen > 0 &&
388
+ _trans_keys[_keys] <= _wide &&
389
+ _wide <= _trans_keys[_keys + 1]
390
+ ) then
391
+ _indicies[ _inds + _wide - _trans_keys[_keys] ]
392
+ else
393
+ _indicies[ _inds + _slen ]
394
+ end
395
+ cs = _trans_targs[_trans]
396
+ if _trans_actions[_trans] != 0
397
+ case _trans_actions[_trans]
398
+ when 1 then
399
+ begin
400
+ encoding_s = p end
401
+ when 10 then
402
+ begin
403
+ content_transfer_encoding.encoding = chars(data, encoding_s, p-1).downcase end
404
+ when 3 then
405
+ begin
406
+ end
407
+ when 6 then
408
+ begin
409
+ end
410
+ when 2 then
411
+ begin
412
+ begin
413
+ stack[top] = cs
414
+ top+= 1
415
+ cs = 9
416
+ _goto_level = _again
417
+ next
418
+ end
419
+ end
420
+ when 9 then
421
+ begin
422
+ begin
423
+ top -= 1
424
+ cs = stack[top]
425
+ _goto_level = _again
426
+ next
427
+ end
428
+ end
429
+ when 11 then
430
+ begin
431
+ content_transfer_encoding.encoding = chars(data, encoding_s, p-1).downcase end
432
+ begin
433
+ begin
434
+ stack[top] = cs
435
+ top+= 1
436
+ cs = 9
437
+ _goto_level = _again
438
+ next
439
+ end
440
+ end
441
+ when 4 then
442
+ begin
443
+ end
444
+ begin
445
+ encoding_s = p end
446
+ when 5 then
447
+ begin
448
+ end
449
+ begin
450
+ begin
451
+ stack[top] = cs
452
+ top+= 1
453
+ cs = 9
454
+ _goto_level = _again
455
+ next
456
+ end
457
+ end
458
+ when 7 then
459
+ begin
460
+ end
461
+ begin
462
+ begin
463
+ stack[top] = cs
464
+ top+= 1
465
+ cs = 9
466
+ _goto_level = _again
467
+ next
468
+ end
469
+ end
470
+ when 8 then
471
+ begin
472
+ end
473
+ begin
474
+ begin
475
+ top -= 1
476
+ cs = stack[top]
477
+ _goto_level = _again
478
+ next
479
+ end
480
+ end
481
+ end
482
+ end
483
+ end
484
+ if _goto_level <= _again
485
+ if cs == 0
486
+ _goto_level = _out
487
+ next
488
+ end
489
+ p += 1
490
+ if p != pe
491
+ _goto_level = _resume
492
+ next
493
+ end
494
+ end
495
+ if _goto_level <= _test_eof
496
+ if p == eof
497
+ case _eof_actions[cs]
498
+ when 10 then
499
+ begin
500
+ content_transfer_encoding.encoding = chars(data, encoding_s, p-1).downcase end
501
+ when 3 then
502
+ begin
503
+ end
504
+ end
505
+ end
506
+
507
+ end
508
+ if _goto_level <= _out
509
+ break
510
+ end
511
+ end
512
+ end
513
+
514
+
515
+ if p != eof || cs < 21
516
+ raise Mail::Field::IncompleteParseError.new(Mail::ContentTransferEncodingElement, data, p)
29
517
  end
30
518
 
31
519
  content_transfer_encoding
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+ require 'mail/parser_tools'
4
+
5
+ %%{
6
+ machine content_transfer_encoding;
7
+ alphtype int;
8
+
9
+ action encoding_s { encoding_s = p }
10
+ action encoding_e { content_transfer_encoding.encoding = chars(data, encoding_s, p-1).downcase }
11
+
12
+ # No-op actions
13
+ action comment_e { }
14
+ action comment_s { }
15
+ action phrase_e { }
16
+ action phrase_s { }
17
+ action qstr_e { }
18
+ action qstr_s { }
19
+ action param_attr_e { }
20
+ action param_attr_s { }
21
+ action param_val_e { }
22
+ action param_val_s { }
23
+ action main_type_e { }
24
+ action main_type_s { }
25
+ action sub_type_e { }
26
+ action sub_type_s { }
27
+
28
+ include rfc2045_content_transfer_encoding "rfc2045_content_transfer_encoding.rl";
29
+ main := content_transfer_encoding;
30
+ }%%
31
+
32
+ module Mail::Parsers
33
+ module ContentTransferEncodingParser
34
+ extend Mail::ParserTools
35
+
36
+ ContentTransferEncodingStruct = Struct.new(:encoding, :error)
37
+
38
+ %%write data noprefix;
39
+
40
+ def self.parse(data)
41
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
42
+
43
+ content_transfer_encoding = ContentTransferEncodingStruct.new('')
44
+ return content_transfer_encoding if Mail::Utilities.blank?(data)
45
+
46
+ # Parser state
47
+ encoding_s = nil
48
+
49
+ # 5.1 Variables Used by Ragel
50
+ p = 0
51
+ eof = pe = data.length
52
+ stack = []
53
+
54
+ %%write init;
55
+ %%write exec;
56
+
57
+ if p != eof || cs < %%{ write first_final; }%%
58
+ raise Mail::Field::IncompleteParseError.new(Mail::ContentTransferEncodingElement, data, p)
59
+ end
60
+
61
+ content_transfer_encoding
62
+ end
63
+ end
64
+ end