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,97 @@
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 5322 Section 3.6.4: Identification Fields
10
+ # https://tools.ietf.org/html/rfc5322#section-3.6.4
11
+ machine message_ids;
12
+ alphtype int;
13
+
14
+ # Message Ids
15
+ action msg_id_s { msg_id_s = p }
16
+ action msg_id_e {
17
+ id = chars(data, msg_id_s, p-1)
18
+ id = $1 if id =~ /.*<(.*)>.*/
19
+ message_ids.message_ids << id
20
+ }
21
+
22
+ # No-op actions
23
+ action angle_addr_s {}
24
+ action address_s {}
25
+ action address_e {}
26
+ action comment_e {}
27
+ action comment_s {}
28
+ action domain_e {}
29
+ action domain_s {}
30
+ action local_dot_atom_e {}
31
+ action local_dot_atom_pre_comment_e {}
32
+ action local_dot_atom_pre_comment_s {}
33
+ action local_dot_atom_s {}
34
+ action phrase_s {}
35
+ action phrase_e {}
36
+ action qstr_e {}
37
+ action qstr_s {}
38
+ action ctime_date_s {}
39
+ action ctime_date_e {}
40
+ action date_s {}
41
+ action date_e {}
42
+ action time_s {}
43
+ action time_e {}
44
+ action local_quoted_string_s {}
45
+ action local_quoted_string_e {}
46
+ action obs_domain_list_s {}
47
+ action obs_domain_list_e {}
48
+ action group_name_s {}
49
+ action group_name_e {}
50
+ action received_tokens_s {}
51
+ action received_tokens_e {}
52
+
53
+ include rfc5322 "rfc5322.rl";
54
+ main := message_ids;
55
+ }%%
56
+
57
+ module Mail::Parsers
58
+ module MessageIdsParser
59
+ extend Mail::ParserTools
60
+
61
+ MessageIdsStruct = Struct.new(:message_ids, :error)
62
+
63
+ %%write data noprefix;
64
+
65
+ def self.parse(data)
66
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
67
+
68
+ raise Mail::Field::NilParseError.new(Mail::MessageIdsElement) if data.nil?
69
+
70
+ # Parser state
71
+ message_ids = MessageIdsStruct.new([])
72
+ msg_id_s = nil
73
+
74
+ # 5.1 Variables Used by Ragel
75
+ p = 0
76
+ eof = pe = data.length
77
+ stack = []
78
+
79
+ %%write init;
80
+ %%write exec;
81
+
82
+ if false
83
+ testEof
84
+ end
85
+
86
+ if p != eof || cs < %%{ write first_final; }%%
87
+ raise Mail::Field::IncompleteParseError.new(Mail::MessageIdsElement, data, p)
88
+ end
89
+
90
+ message_ids
91
+ end
92
+ end
93
+ end
94
+
95
+ ensure
96
+ $VERBOSE = original_verbose
97
+ end
@@ -1,42 +1,516 @@
1
1
  # frozen_string_literal: true
2
- module Mail::Parsers
3
- class MimeVersionParser
4
- include Mail::Utilities
2
+ require "mail/utilities"
3
+ require "mail/parser_tools"
5
4
 
6
- def parse(s)
7
- if Mail::Utilities.blank?(s)
8
- return MimeVersionStruct.new("", nil)
5
+ begin
6
+ original_verbose, $VERBOSE = $VERBOSE, nil
7
+
8
+ module Mail::Parsers
9
+ module MimeVersionParser
10
+ extend Mail::ParserTools
11
+
12
+ MimeVersionStruct = Struct.new(:major, :minor, :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, 57, 10, 10,
20
+ 9, 32, 9, 57, 40,
21
+ 57, 46, 46, 40, 57,
22
+ 48, 57, 10, 10, 9, 32,
23
+ 1, 244, 1, 244, 10,
24
+ 10, 9, 32, 0, 244,
25
+ 128, 191, 160, 191, 128, 191,
26
+ 128, 159, 144, 191, 128,
27
+ 191, 128, 143, 9, 57,
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=
35
+ end
36
+ self._key_spans = [
37
+ 0, 49, 1, 24, 49, 18, 1, 18,
38
+ 10, 1, 24, 244, 244, 1, 24, 245,
39
+ 64, 32, 64, 32, 48, 64, 16, 49,
40
+ 32, 32, 0,
41
+ ]
42
+
43
+ class << self
44
+ attr_accessor :_index_offsets
45
+ private :_index_offsets, :_index_offsets=
46
+ end
47
+ self._index_offsets = [
48
+ 0, 0, 50, 52, 77, 127, 146, 148,
49
+ 167, 178, 180, 205, 450, 695, 697, 722,
50
+ 968, 1033, 1066, 1131, 1164, 1213, 1278, 1295,
51
+ 1345, 1378, 1411,
52
+ ]
53
+
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
+ 1, 1, 1, 1, 1, 1, 1, 3,
63
+ 1, 1, 1, 1, 1, 1, 1, 4,
64
+ 4, 4, 4, 4, 4, 4, 4, 4,
65
+ 4, 1, 5, 1, 0, 1, 1, 1,
66
+ 1, 1, 1, 1, 1, 1, 1, 1,
67
+ 1, 1, 1, 1, 1, 1, 1, 1,
68
+ 1, 1, 1, 0, 1, 6, 1, 1,
69
+ 1, 7, 1, 1, 1, 1, 1, 1,
70
+ 1, 1, 1, 1, 1, 1, 1, 1,
71
+ 1, 1, 1, 1, 6, 1, 1, 1,
72
+ 1, 1, 1, 1, 8, 1, 1, 1,
73
+ 1, 1, 1, 1, 9, 9, 9, 9,
74
+ 9, 9, 9, 9, 9, 9, 1, 10,
75
+ 1, 1, 1, 1, 1, 11, 1, 12,
76
+ 12, 12, 12, 12, 12, 12, 12, 12,
77
+ 12, 1, 13, 1, 14, 1, 1, 1,
78
+ 1, 1, 1, 1, 15, 15, 15, 15,
79
+ 15, 15, 15, 15, 15, 15, 1, 16,
80
+ 16, 16, 16, 16, 16, 16, 16, 16,
81
+ 16, 1, 17, 1, 18, 1, 1, 1,
82
+ 1, 1, 1, 1, 1, 1, 1, 1,
83
+ 1, 1, 1, 1, 1, 1, 1, 1,
84
+ 1, 1, 1, 18, 1, 19, 19, 19,
85
+ 19, 19, 19, 19, 19, 19, 1, 19,
86
+ 19, 20, 19, 19, 19, 19, 19, 19,
87
+ 19, 19, 19, 19, 19, 19, 19, 19,
88
+ 19, 19, 19, 19, 19, 19, 19, 19,
89
+ 19, 19, 19, 19, 21, 22, 19, 19,
90
+ 19, 19, 19, 19, 19, 19, 19, 19,
91
+ 19, 19, 19, 19, 19, 19, 19, 19,
92
+ 19, 19, 19, 19, 19, 19, 19, 19,
93
+ 19, 19, 19, 19, 19, 19, 19, 19,
94
+ 19, 19, 19, 19, 19, 19, 19, 19,
95
+ 19, 19, 19, 19, 19, 19, 19, 19,
96
+ 23, 19, 19, 19, 19, 19, 19, 19,
97
+ 19, 19, 19, 19, 19, 19, 19, 19,
98
+ 19, 19, 19, 19, 19, 19, 19, 19,
99
+ 19, 19, 19, 19, 19, 19, 19, 19,
100
+ 19, 19, 19, 19, 1, 1, 1, 1,
101
+ 1, 1, 1, 1, 1, 1, 1, 1,
102
+ 1, 1, 1, 1, 1, 1, 1, 1,
103
+ 1, 1, 1, 1, 1, 1, 1, 1,
104
+ 1, 1, 1, 1, 1, 1, 1, 1,
105
+ 1, 1, 1, 1, 1, 1, 1, 1,
106
+ 1, 1, 1, 1, 1, 1, 1, 1,
107
+ 1, 1, 1, 1, 1, 1, 1, 1,
108
+ 1, 1, 1, 1, 1, 1, 24, 24,
109
+ 24, 24, 24, 24, 24, 24, 24, 24,
110
+ 24, 24, 24, 24, 24, 24, 24, 24,
111
+ 24, 24, 24, 24, 24, 24, 24, 24,
112
+ 24, 24, 24, 24, 25, 26, 26, 26,
113
+ 26, 26, 26, 26, 26, 26, 26, 26,
114
+ 26, 27, 26, 26, 28, 29, 29, 29,
115
+ 30, 1, 31, 31, 31, 31, 31, 31,
116
+ 31, 31, 31, 1, 31, 31, 32, 31,
117
+ 31, 31, 31, 31, 31, 31, 31, 31,
118
+ 31, 31, 31, 31, 31, 31, 31, 31,
119
+ 31, 31, 31, 31, 31, 31, 31, 31,
120
+ 31, 33, 34, 31, 31, 31, 31, 31,
121
+ 31, 31, 31, 31, 31, 31, 31, 31,
122
+ 31, 31, 31, 31, 31, 31, 31, 31,
123
+ 31, 31, 31, 31, 31, 31, 31, 31,
124
+ 31, 31, 31, 31, 31, 31, 31, 31,
125
+ 31, 31, 31, 31, 31, 31, 31, 31,
126
+ 31, 31, 31, 31, 31, 35, 31, 31,
127
+ 31, 31, 31, 31, 31, 31, 31, 31,
128
+ 31, 31, 31, 31, 31, 31, 31, 31,
129
+ 31, 31, 31, 31, 31, 31, 31, 31,
130
+ 31, 31, 31, 31, 31, 31, 31, 31,
131
+ 31, 1, 1, 1, 1, 1, 1, 1,
132
+ 1, 1, 1, 1, 1, 1, 1, 1,
133
+ 1, 1, 1, 1, 1, 1, 1, 1,
134
+ 1, 1, 1, 1, 1, 1, 1, 1,
135
+ 1, 1, 1, 1, 1, 1, 1, 1,
136
+ 1, 1, 1, 1, 1, 1, 1, 1,
137
+ 1, 1, 1, 1, 1, 1, 1, 1,
138
+ 1, 1, 1, 1, 1, 1, 1, 1,
139
+ 1, 1, 1, 36, 36, 36, 36, 36,
140
+ 36, 36, 36, 36, 36, 36, 36, 36,
141
+ 36, 36, 36, 36, 36, 36, 36, 36,
142
+ 36, 36, 36, 36, 36, 36, 36, 36,
143
+ 36, 37, 38, 38, 38, 38, 38, 38,
144
+ 38, 38, 38, 38, 38, 38, 39, 38,
145
+ 38, 40, 41, 41, 41, 42, 1, 43,
146
+ 1, 31, 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
+ 31, 1, 31, 31, 31, 31, 31, 31,
150
+ 31, 31, 31, 31, 31, 31, 31, 31,
151
+ 31, 31, 31, 31, 31, 31, 31, 31,
152
+ 31, 31, 31, 31, 31, 31, 31, 31,
153
+ 31, 31, 31, 31, 31, 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, 31, 31, 31, 31, 31,
158
+ 31, 31, 31, 31, 31, 31, 31, 31,
159
+ 31, 31, 31, 31, 31, 31, 31, 31,
160
+ 31, 31, 31, 31, 31, 31, 31, 31,
161
+ 31, 31, 31, 31, 31, 31, 31, 31,
162
+ 31, 31, 31, 31, 31, 31, 31, 31,
163
+ 31, 31, 31, 31, 31, 31, 31, 31,
164
+ 31, 31, 31, 31, 31, 31, 31, 31,
165
+ 31, 31, 1, 1, 1, 1, 1, 1,
166
+ 1, 1, 1, 1, 1, 1, 1, 1,
167
+ 1, 1, 1, 1, 1, 1, 1, 1,
168
+ 1, 1, 1, 1, 1, 1, 1, 1,
169
+ 1, 1, 1, 1, 1, 1, 1, 1,
170
+ 1, 1, 1, 1, 1, 1, 1, 1,
171
+ 1, 1, 1, 1, 1, 1, 1, 1,
172
+ 1, 1, 1, 1, 1, 1, 1, 1,
173
+ 1, 1, 1, 1, 36, 36, 36, 36,
174
+ 36, 36, 36, 36, 36, 36, 36, 36,
175
+ 36, 36, 36, 36, 36, 36, 36, 36,
176
+ 36, 36, 36, 36, 36, 36, 36, 36,
177
+ 36, 36, 37, 38, 38, 38, 38, 38,
178
+ 38, 38, 38, 38, 38, 38, 38, 39,
179
+ 38, 38, 40, 41, 41, 41, 42, 1,
180
+ 31, 31, 31, 31, 31, 31, 31, 31,
181
+ 31, 31, 31, 31, 31, 31, 31, 31,
182
+ 31, 31, 31, 31, 31, 31, 31, 31,
183
+ 31, 31, 31, 31, 31, 31, 31, 31,
184
+ 31, 31, 31, 31, 31, 31, 31, 31,
185
+ 31, 31, 31, 31, 31, 31, 31, 31,
186
+ 31, 31, 31, 31, 31, 31, 31, 31,
187
+ 31, 31, 31, 31, 31, 31, 31, 31,
188
+ 1, 36, 36, 36, 36, 36, 36, 36,
189
+ 36, 36, 36, 36, 36, 36, 36, 36,
190
+ 36, 36, 36, 36, 36, 36, 36, 36,
191
+ 36, 36, 36, 36, 36, 36, 36, 36,
192
+ 36, 1, 36, 36, 36, 36, 36, 36,
193
+ 36, 36, 36, 36, 36, 36, 36, 36,
194
+ 36, 36, 36, 36, 36, 36, 36, 36,
195
+ 36, 36, 36, 36, 36, 36, 36, 36,
196
+ 36, 36, 36, 36, 36, 36, 36, 36,
197
+ 36, 36, 36, 36, 36, 36, 36, 36,
198
+ 36, 36, 36, 36, 36, 36, 36, 36,
199
+ 36, 36, 36, 36, 36, 36, 36, 36,
200
+ 36, 36, 1, 36, 36, 36, 36, 36,
201
+ 36, 36, 36, 36, 36, 36, 36, 36,
202
+ 36, 36, 36, 36, 36, 36, 36, 36,
203
+ 36, 36, 36, 36, 36, 36, 36, 36,
204
+ 36, 36, 36, 1, 38, 38, 38, 38,
205
+ 38, 38, 38, 38, 38, 38, 38, 38,
206
+ 38, 38, 38, 38, 38, 38, 38, 38,
207
+ 38, 38, 38, 38, 38, 38, 38, 38,
208
+ 38, 38, 38, 38, 38, 38, 38, 38,
209
+ 38, 38, 38, 38, 38, 38, 38, 38,
210
+ 38, 38, 38, 38, 1, 38, 38, 38,
211
+ 38, 38, 38, 38, 38, 38, 38, 38,
212
+ 38, 38, 38, 38, 38, 38, 38, 38,
213
+ 38, 38, 38, 38, 38, 38, 38, 38,
214
+ 38, 38, 38, 38, 38, 38, 38, 38,
215
+ 38, 38, 38, 38, 38, 38, 38, 38,
216
+ 38, 38, 38, 38, 38, 38, 38, 38,
217
+ 38, 38, 38, 38, 38, 38, 38, 38,
218
+ 38, 38, 38, 38, 38, 1, 38, 38,
219
+ 38, 38, 38, 38, 38, 38, 38, 38,
220
+ 38, 38, 38, 38, 38, 38, 1, 44,
221
+ 1, 1, 1, 45, 1, 1, 1, 1,
222
+ 1, 1, 1, 1, 1, 1, 1, 1,
223
+ 1, 1, 1, 1, 1, 1, 44, 1,
224
+ 1, 1, 1, 1, 1, 1, 46, 1,
225
+ 1, 1, 1, 1, 1, 1, 47, 47,
226
+ 47, 47, 47, 47, 47, 47, 47, 47,
227
+ 1, 18, 1, 1, 1, 48, 1, 1,
228
+ 1, 1, 1, 1, 1, 1, 1, 1,
229
+ 1, 1, 1, 1, 1, 1, 1, 1,
230
+ 18, 1, 1, 1, 1, 1, 1, 1,
231
+ 49, 1, 50, 1, 1, 1, 51, 1,
232
+ 1, 1, 1, 1, 1, 1, 1, 1,
233
+ 1, 1, 1, 1, 1, 1, 1, 1,
234
+ 1, 50, 1, 1, 1, 1, 1, 1,
235
+ 1, 52, 1, 1, 0,
236
+ ]
237
+
238
+ class << self
239
+ attr_accessor :_trans_targs
240
+ private :_trans_targs, :_trans_targs=
241
+ end
242
+ self._trans_targs = [
243
+ 1, 0, 2, 4, 5, 3, 1, 2,
244
+ 4, 5, 6, 7, 5, 7, 8, 23,
245
+ 23, 10, 24, 12, 13, 12, 26, 15,
246
+ 16, 17, 18, 19, 20, 21, 22, 12,
247
+ 13, 12, 26, 15, 16, 17, 18, 19,
248
+ 20, 21, 22, 14, 24, 9, 25, 23,
249
+ 9, 25, 24, 9, 25,
250
+ ]
251
+
252
+ class << self
253
+ attr_accessor :_trans_actions
254
+ private :_trans_actions, :_trans_actions=
9
255
  end
256
+ self._trans_actions = [
257
+ 0, 0, 0, 1, 2, 0, 3, 3,
258
+ 4, 5, 6, 7, 0, 3, 1, 8,
259
+ 9, 0, 0, 10, 10, 11, 12, 10,
260
+ 10, 10, 10, 10, 10, 10, 10, 0,
261
+ 0, 1, 13, 0, 0, 0, 0, 0,
262
+ 0, 0, 0, 0, 14, 14, 15, 0,
263
+ 0, 1, 3, 3, 4,
264
+ ]
10
265
 
11
- mime_version = MimeVersionStruct.new
266
+ class << self
267
+ attr_accessor :_eof_actions
268
+ private :_eof_actions, :_eof_actions=
269
+ end
270
+ self._eof_actions = [
271
+ 0, 0, 0, 0, 0, 0, 0, 0,
272
+ 0, 0, 0, 0, 0, 0, 0, 0,
273
+ 0, 0, 0, 0, 0, 0, 0, 14,
274
+ 0, 3, 0,
275
+ ]
12
276
 
13
- actions, error = Ragel.parse(:mime_version, s)
14
- if error
15
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, error)
277
+ class << self
278
+ attr_accessor :start
279
+ end
280
+ self.start = 1
281
+ class << self
282
+ attr_accessor :first_final
16
283
  end
284
+ self.first_final = 23
285
+ class << self
286
+ attr_accessor :error
287
+ end
288
+ self.error = 0
17
289
 
18
- major_digits_s = minor_digits_s = nil
19
- actions.each_slice(2) do |action_id, p|
20
- action = Mail::Parsers::Ragel::ACTIONS[action_id]
21
- case action
290
+ class << self
291
+ attr_accessor :en_comment_tail
292
+ end
293
+ self.en_comment_tail = 11
294
+ class << self
295
+ attr_accessor :en_main
296
+ end
297
+ self.en_main = 1
298
+
299
+ def self.parse(data)
300
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
22
301
 
23
- # Major Digits
24
- when :major_digits_s then major_digits_s = p
25
- when :major_digits_e
26
- mime_version.major = s[major_digits_s..(p-1)]
302
+ return MimeVersionStruct.new("", nil) if Mail::Utilities.blank?(data)
27
303
 
28
- # Minor Digits
29
- when :minor_digits_s then minor_digits_s = p
30
- when :minor_digits_e
31
- mime_version.minor = s[minor_digits_s..(p-1)]
304
+ # Parser state
305
+ mime_version = MimeVersionStruct.new
306
+ major_digits_s = minor_digits_s = nil
32
307
 
33
- when :comment_e, :comment_s then nil
308
+ # 5.1 Variables Used by Ragel
309
+ p = 0
310
+ eof = pe = data.length
311
+ stack = []
34
312
 
35
- else
36
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, "Failed to process unknown action: #{action}")
313
+ begin
314
+ p ||= 0
315
+ pe ||= data.length
316
+ cs = start
317
+ top = 0
37
318
  end
319
+
320
+ begin
321
+ testEof = false
322
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
323
+ _goto_level = 0
324
+ _resume = 10
325
+ _eof_trans = 15
326
+ _again = 20
327
+ _test_eof = 30
328
+ _out = 40
329
+ while true
330
+ if _goto_level <= 0
331
+ if p == pe
332
+ _goto_level = _test_eof
333
+ next
334
+ end
335
+ if cs == 0
336
+ _goto_level = _out
337
+ next
338
+ end
339
+ end
340
+ if _goto_level <= _resume
341
+ _keys = cs << 1
342
+ _inds = _index_offsets[cs]
343
+ _slen = _key_spans[cs]
344
+ _wide = data[p].ord
345
+ _trans = if (_slen > 0 &&
346
+ _trans_keys[_keys] <= _wide &&
347
+ _wide <= _trans_keys[_keys + 1])
348
+ _indicies[_inds + _wide - _trans_keys[_keys]]
349
+ else
350
+ _indicies[_inds + _slen]
351
+ end
352
+ cs = _trans_targs[_trans]
353
+ if _trans_actions[_trans] != 0
354
+ case _trans_actions[_trans]
355
+ when 2
356
+ begin
357
+ major_digits_s = p
358
+ end
359
+ when 7
360
+ begin
361
+ mime_version.major = chars(data, major_digits_s, p - 1)
362
+ end
363
+ when 8
364
+ begin
365
+ minor_digits_s = p
366
+ end
367
+ when 14
368
+ begin
369
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
370
+ end
371
+ when 10
372
+ begin
373
+ end
374
+ when 3
375
+ begin
376
+ end
377
+ when 1
378
+ begin
379
+ begin
380
+ stack[top] = cs
381
+ top += 1
382
+ cs = 11
383
+ _goto_level = _again
384
+ next
385
+ end
386
+ end
387
+ when 13
388
+ begin
389
+ begin
390
+ top -= 1
391
+ cs = stack[top]
392
+ _goto_level = _again
393
+ next
394
+ end
395
+ end
396
+ when 6
397
+ begin
398
+ mime_version.major = chars(data, major_digits_s, p - 1)
399
+ end
400
+ begin
401
+ begin
402
+ stack[top] = cs
403
+ top += 1
404
+ cs = 11
405
+ _goto_level = _again
406
+ next
407
+ end
408
+ end
409
+ when 15
410
+ begin
411
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
412
+ end
413
+ begin
414
+ begin
415
+ stack[top] = cs
416
+ top += 1
417
+ cs = 11
418
+ _goto_level = _again
419
+ next
420
+ end
421
+ end
422
+ when 11
423
+ begin
424
+ end
425
+ begin
426
+ begin
427
+ stack[top] = cs
428
+ top += 1
429
+ cs = 11
430
+ _goto_level = _again
431
+ next
432
+ end
433
+ end
434
+ when 12
435
+ begin
436
+ end
437
+ begin
438
+ begin
439
+ top -= 1
440
+ cs = stack[top]
441
+ _goto_level = _again
442
+ next
443
+ end
444
+ end
445
+ when 5
446
+ begin
447
+ end
448
+ begin
449
+ major_digits_s = p
450
+ end
451
+ when 9
452
+ begin
453
+ end
454
+ begin
455
+ minor_digits_s = p
456
+ end
457
+ when 4
458
+ begin
459
+ end
460
+ begin
461
+ begin
462
+ stack[top] = cs
463
+ top += 1
464
+ cs = 11
465
+ _goto_level = _again
466
+ next
467
+ end
468
+ end
469
+ end
470
+ end
471
+ end
472
+ if _goto_level <= _again
473
+ if cs == 0
474
+ _goto_level = _out
475
+ next
476
+ end
477
+ p += 1
478
+ if p != pe
479
+ _goto_level = _resume
480
+ next
481
+ end
482
+ end
483
+ if _goto_level <= _test_eof
484
+ if p == eof
485
+ case _eof_actions[cs]
486
+ when 14
487
+ begin
488
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
489
+ end
490
+ when 3
491
+ begin
492
+ end
493
+ end
494
+ end
495
+ end
496
+ if _goto_level <= _out
497
+ break
498
+ end
499
+ end
500
+ end
501
+
502
+ if false
503
+ testEof
504
+ end
505
+
506
+ if p != eof || cs < 23
507
+ raise Mail::Field::IncompleteParseError.new(Mail::MimeVersionElement, data, p)
508
+ end
509
+
510
+ mime_version
38
511
  end
39
- mime_version
40
512
  end
41
513
  end
514
+ ensure
515
+ $VERBOSE = original_verbose
42
516
  end
@@ -0,0 +1,72 @@
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 mime_version;
10
+ alphtype int;
11
+
12
+ # Major Digits
13
+ action major_digits_s { major_digits_s = p }
14
+ action major_digits_e { mime_version.major = chars(data, major_digits_s, p-1) }
15
+
16
+ # Minor Digits
17
+ action minor_digits_s { minor_digits_s = p }
18
+ action minor_digits_e { mime_version.minor = chars(data, minor_digits_s, p-1) }
19
+
20
+ # No-op actions
21
+ action comment_s {}
22
+ action comment_e {}
23
+ action qstr_s {}
24
+ action qstr_e {}
25
+ action phrase_s {}
26
+ action phrase_e {}
27
+
28
+ include rfc2045_mime "rfc2045_mime.rl";
29
+ main := mime_version;
30
+ }%%
31
+
32
+ module Mail::Parsers
33
+ module MimeVersionParser
34
+ extend Mail::ParserTools
35
+
36
+ MimeVersionStruct = Struct.new(:major, :minor, :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
+ return MimeVersionStruct.new('', nil) if Mail::Utilities.blank?(data)
44
+
45
+ # Parser state
46
+ mime_version = MimeVersionStruct.new
47
+ major_digits_s = minor_digits_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 false
58
+ testEof
59
+ end
60
+
61
+ if p != eof || cs < %%{ write first_final; }%%
62
+ raise Mail::Field::IncompleteParseError.new(Mail::MimeVersionElement, data, p)
63
+ end
64
+
65
+ mime_version
66
+ end
67
+ end
68
+ end
69
+
70
+ ensure
71
+ $VERBOSE = original_verbose
72
+ end