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