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