mail 2.6.6 → 2.7.1

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 (160) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +74 -90
  4. data/lib/mail/attachments_list.rb +8 -4
  5. data/lib/mail/body.rb +50 -38
  6. data/lib/mail/check_delivery_params.rb +8 -6
  7. data/lib/mail/configuration.rb +2 -0
  8. data/lib/mail/constants.rb +1 -1
  9. data/lib/mail/core_extensions/smtp.rb +19 -16
  10. data/lib/mail/core_extensions/string.rb +0 -4
  11. data/lib/mail/elements/address.rb +28 -22
  12. data/lib/mail/elements/address_list.rb +10 -18
  13. data/lib/mail/elements/content_disposition_element.rb +8 -15
  14. data/lib/mail/elements/content_location_element.rb +5 -10
  15. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  16. data/lib/mail/elements/content_type_element.rb +8 -19
  17. data/lib/mail/elements/date_time_element.rb +6 -14
  18. data/lib/mail/elements/envelope_from_element.rb +14 -21
  19. data/lib/mail/elements/message_ids_element.rb +8 -12
  20. data/lib/mail/elements/mime_version_element.rb +6 -14
  21. data/lib/mail/elements/phrase_list.rb +6 -9
  22. data/lib/mail/elements/received_element.rb +9 -15
  23. data/lib/mail/encodings/7bit.rb +5 -15
  24. data/lib/mail/encodings/8bit.rb +2 -21
  25. data/lib/mail/encodings/base64.rb +11 -12
  26. data/lib/mail/encodings/binary.rb +3 -22
  27. data/lib/mail/encodings/identity.rb +24 -0
  28. data/lib/mail/encodings/quoted_printable.rb +6 -6
  29. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  30. data/lib/mail/encodings/unix_to_unix.rb +3 -1
  31. data/lib/mail/encodings.rb +99 -43
  32. data/lib/mail/envelope.rb +1 -1
  33. data/lib/mail/field.rb +96 -59
  34. data/lib/mail/fields/bcc_field.rb +2 -2
  35. data/lib/mail/fields/cc_field.rb +1 -1
  36. data/lib/mail/fields/comments_field.rb +1 -1
  37. data/lib/mail/fields/common/common_address.rb +32 -7
  38. data/lib/mail/fields/common/common_field.rb +1 -10
  39. data/lib/mail/fields/common/parameter_hash.rb +1 -1
  40. data/lib/mail/fields/content_description_field.rb +1 -1
  41. data/lib/mail/fields/content_disposition_field.rb +3 -3
  42. data/lib/mail/fields/content_id_field.rb +2 -2
  43. data/lib/mail/fields/content_location_field.rb +1 -1
  44. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  45. data/lib/mail/fields/content_type_field.rb +4 -9
  46. data/lib/mail/fields/date_field.rb +2 -3
  47. data/lib/mail/fields/from_field.rb +1 -1
  48. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  49. data/lib/mail/fields/keywords_field.rb +1 -1
  50. data/lib/mail/fields/message_id_field.rb +1 -1
  51. data/lib/mail/fields/mime_version_field.rb +1 -1
  52. data/lib/mail/fields/optional_field.rb +4 -1
  53. data/lib/mail/fields/received_field.rb +1 -1
  54. data/lib/mail/fields/references_field.rb +1 -1
  55. data/lib/mail/fields/reply_to_field.rb +1 -1
  56. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  57. data/lib/mail/fields/resent_cc_field.rb +1 -1
  58. data/lib/mail/fields/resent_date_field.rb +0 -1
  59. data/lib/mail/fields/resent_from_field.rb +1 -1
  60. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  61. data/lib/mail/fields/resent_sender_field.rb +1 -1
  62. data/lib/mail/fields/resent_to_field.rb +1 -1
  63. data/lib/mail/fields/return_path_field.rb +1 -1
  64. data/lib/mail/fields/sender_field.rb +1 -1
  65. data/lib/mail/fields/subject_field.rb +1 -1
  66. data/lib/mail/fields/to_field.rb +1 -1
  67. data/lib/mail/fields/unstructured_field.rb +21 -4
  68. data/lib/mail/header.rb +10 -8
  69. data/lib/mail/mail.rb +2 -10
  70. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  71. data/lib/mail/message.rb +78 -68
  72. data/lib/mail/multibyte/chars.rb +29 -28
  73. data/lib/mail/multibyte/unicode.rb +10 -10
  74. data/lib/mail/multibyte.rb +64 -15
  75. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  76. data/lib/mail/network/delivery_methods/sendmail.rb +8 -5
  77. data/lib/mail/network/delivery_methods/smtp.rb +58 -49
  78. data/lib/mail/network/delivery_methods/smtp_connection.rb +9 -1
  79. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  80. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  81. data/lib/mail/network.rb +1 -0
  82. data/lib/mail/parser_tools.rb +15 -0
  83. data/lib/mail/parsers/address_lists_parser.rb +33207 -104
  84. data/lib/mail/parsers/address_lists_parser.rl +172 -0
  85. data/lib/mail/parsers/content_disposition_parser.rb +876 -49
  86. data/lib/mail/parsers/content_disposition_parser.rl +82 -0
  87. data/lib/mail/parsers/content_location_parser.rb +803 -23
  88. data/lib/mail/parsers/content_location_parser.rl +71 -0
  89. data/lib/mail/parsers/content_transfer_encoding_parser.rb +501 -19
  90. data/lib/mail/parsers/content_transfer_encoding_parser.rl +64 -0
  91. data/lib/mail/parsers/content_type_parser.rb +1023 -48
  92. data/lib/mail/parsers/content_type_parser.rl +83 -0
  93. data/lib/mail/parsers/date_time_parser.rb +870 -24
  94. data/lib/mail/parsers/date_time_parser.rl +62 -0
  95. data/lib/mail/parsers/envelope_from_parser.rb +3569 -34
  96. data/lib/mail/parsers/envelope_from_parser.rl +82 -0
  97. data/lib/mail/parsers/message_ids_parser.rb +2839 -25
  98. data/lib/mail/parsers/message_ids_parser.rl +82 -0
  99. data/lib/mail/parsers/mime_version_parser.rb +491 -26
  100. data/lib/mail/parsers/mime_version_parser.rl +61 -0
  101. data/lib/mail/parsers/phrase_lists_parser.rb +860 -18
  102. data/lib/mail/parsers/phrase_lists_parser.rl +83 -0
  103. data/lib/mail/parsers/received_parser.rb +8764 -37
  104. data/lib/mail/parsers/received_parser.rl +84 -0
  105. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
  106. data/lib/mail/parsers/rfc2045_content_type.rl +25 -0
  107. data/lib/mail/parsers/rfc2045_mime.rl +16 -0
  108. data/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
  109. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  110. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
  111. data/lib/mail/parsers/rfc5322.rl +59 -0
  112. data/lib/mail/parsers/rfc5322_address.rl +72 -0
  113. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +8 -1
  114. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
  115. data/lib/mail/parsers.rb +16 -24
  116. data/lib/mail/part.rb +3 -3
  117. data/lib/mail/parts_list.rb +5 -6
  118. data/lib/mail/utilities.rb +59 -28
  119. data/lib/mail/version.rb +2 -2
  120. data/lib/mail/version_specific/ruby_1_8.rb +40 -3
  121. data/lib/mail/version_specific/ruby_1_9.rb +61 -9
  122. data/lib/mail.rb +3 -16
  123. metadata +44 -53
  124. data/CHANGELOG.rdoc +0 -803
  125. data/CONTRIBUTING.md +0 -60
  126. data/Dependencies.txt +0 -2
  127. data/Gemfile +0 -14
  128. data/Rakefile +0 -29
  129. data/TODO.rdoc +0 -9
  130. data/lib/mail/core_extensions/string/access.rb +0 -146
  131. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  132. data/lib/mail/multibyte/exceptions.rb +0 -9
  133. data/lib/mail/parsers/ragel/common.rl +0 -185
  134. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  135. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  136. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  137. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  138. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  139. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  140. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  141. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  142. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  143. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  144. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  145. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  146. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  147. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  148. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  149. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  150. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  151. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  152. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  153. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  154. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  155. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  156. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  157. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  158. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
  159. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  160. 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,506 @@
1
+
1
2
  # frozen_string_literal: true
3
+ require "mail/utilities"
4
+ require "mail/parser_tools"
5
+
2
6
  module Mail::Parsers
3
- class MimeVersionParser
4
- include Mail::Utilities
7
+ module MimeVersionParser
8
+ extend Mail::ParserTools
5
9
 
6
- def parse(s)
7
- if Mail::Utilities.blank?(s)
8
- return MimeVersionStruct.new("", nil)
9
- end
10
+ MimeVersionStruct = Struct.new(:major, :minor, :error)
10
11
 
11
- mime_version = MimeVersionStruct.new
12
+ class << self
13
+ attr_accessor :_trans_keys
14
+ private :_trans_keys, :_trans_keys=
15
+ end
16
+ self._trans_keys = [
17
+ 0, 0, 9, 57, 10, 10,
18
+ 9, 32, 9, 57, 40,
19
+ 57, 46, 46, 40, 57,
20
+ 48, 57, 10, 10, 9, 32,
21
+ 1, 244, 1, 244, 10,
22
+ 10, 9, 32, 0, 244,
23
+ 128, 191, 160, 191, 128, 191,
24
+ 128, 159, 144, 191, 128,
25
+ 191, 128, 143, 9, 57,
26
+ 9, 40, 9, 40, 0, 0,
27
+ 0,
28
+ ]
12
29
 
13
- actions, error = Ragel.parse(:mime_version, s)
14
- if error
15
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, error)
16
- end
30
+ class << self
31
+ attr_accessor :_key_spans
32
+ private :_key_spans, :_key_spans=
33
+ end
34
+ self._key_spans = [
35
+ 0, 49, 1, 24, 49, 18, 1, 18,
36
+ 10, 1, 24, 244, 244, 1, 24, 245,
37
+ 64, 32, 64, 32, 48, 64, 16, 49,
38
+ 32, 32, 0,
39
+ ]
17
40
 
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
41
+ class << self
42
+ attr_accessor :_index_offsets
43
+ private :_index_offsets, :_index_offsets=
44
+ end
45
+ self._index_offsets = [
46
+ 0, 0, 50, 52, 77, 127, 146, 148,
47
+ 167, 178, 180, 205, 450, 695, 697, 722,
48
+ 968, 1033, 1066, 1131, 1164, 1213, 1278, 1295,
49
+ 1345, 1378, 1411,
50
+ ]
51
+
52
+ class << self
53
+ attr_accessor :_indicies
54
+ private :_indicies, :_indicies=
55
+ end
56
+ self._indicies = [
57
+ 0, 1, 1, 1, 2, 1, 1, 1,
58
+ 1, 1, 1, 1, 1, 1, 1, 1,
59
+ 1, 1, 1, 1, 1, 1, 1, 0,
60
+ 1, 1, 1, 1, 1, 1, 1, 3,
61
+ 1, 1, 1, 1, 1, 1, 1, 4,
62
+ 4, 4, 4, 4, 4, 4, 4, 4,
63
+ 4, 1, 5, 1, 0, 1, 1, 1,
64
+ 1, 1, 1, 1, 1, 1, 1, 1,
65
+ 1, 1, 1, 1, 1, 1, 1, 1,
66
+ 1, 1, 1, 0, 1, 6, 1, 1,
67
+ 1, 7, 1, 1, 1, 1, 1, 1,
68
+ 1, 1, 1, 1, 1, 1, 1, 1,
69
+ 1, 1, 1, 1, 6, 1, 1, 1,
70
+ 1, 1, 1, 1, 8, 1, 1, 1,
71
+ 1, 1, 1, 1, 9, 9, 9, 9,
72
+ 9, 9, 9, 9, 9, 9, 1, 10,
73
+ 1, 1, 1, 1, 1, 11, 1, 12,
74
+ 12, 12, 12, 12, 12, 12, 12, 12,
75
+ 12, 1, 13, 1, 14, 1, 1, 1,
76
+ 1, 1, 1, 1, 15, 15, 15, 15,
77
+ 15, 15, 15, 15, 15, 15, 1, 16,
78
+ 16, 16, 16, 16, 16, 16, 16, 16,
79
+ 16, 1, 17, 1, 18, 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, 18, 1, 19, 19, 19,
83
+ 19, 19, 19, 19, 19, 19, 1, 19,
84
+ 19, 20, 19, 19, 19, 19, 19, 19,
85
+ 19, 19, 19, 19, 19, 19, 19, 19,
86
+ 19, 19, 19, 19, 19, 19, 19, 19,
87
+ 19, 19, 19, 19, 21, 22, 19, 19,
88
+ 19, 19, 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, 19, 19, 19, 19,
92
+ 19, 19, 19, 19, 19, 19, 19, 19,
93
+ 19, 19, 19, 19, 19, 19, 19, 19,
94
+ 23, 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
+ 19, 19, 19, 19, 1, 1, 1, 1,
99
+ 1, 1, 1, 1, 1, 1, 1, 1,
100
+ 1, 1, 1, 1, 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, 24, 24,
107
+ 24, 24, 24, 24, 24, 24, 24, 24,
108
+ 24, 24, 24, 24, 24, 24, 24, 24,
109
+ 24, 24, 24, 24, 24, 24, 24, 24,
110
+ 24, 24, 24, 24, 25, 26, 26, 26,
111
+ 26, 26, 26, 26, 26, 26, 26, 26,
112
+ 26, 27, 26, 26, 28, 29, 29, 29,
113
+ 30, 1, 31, 31, 31, 31, 31, 31,
114
+ 31, 31, 31, 1, 31, 31, 32, 31,
115
+ 31, 31, 31, 31, 31, 31, 31, 31,
116
+ 31, 31, 31, 31, 31, 31, 31, 31,
117
+ 31, 31, 31, 31, 31, 31, 31, 31,
118
+ 31, 33, 34, 31, 31, 31, 31, 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, 31, 31, 31, 31, 31, 31, 31,
123
+ 31, 31, 31, 31, 31, 31, 31, 31,
124
+ 31, 31, 31, 31, 31, 35, 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, 31, 31, 31,
129
+ 31, 1, 1, 1, 1, 1, 1, 1,
130
+ 1, 1, 1, 1, 1, 1, 1, 1,
131
+ 1, 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, 36, 36, 36, 36, 36,
138
+ 36, 36, 36, 36, 36, 36, 36, 36,
139
+ 36, 36, 36, 36, 36, 36, 36, 36,
140
+ 36, 36, 36, 36, 36, 36, 36, 36,
141
+ 36, 37, 38, 38, 38, 38, 38, 38,
142
+ 38, 38, 38, 38, 38, 38, 39, 38,
143
+ 38, 40, 41, 41, 41, 42, 1, 43,
144
+ 1, 31, 1, 1, 1, 1, 1, 1,
145
+ 1, 1, 1, 1, 1, 1, 1, 1,
146
+ 1, 1, 1, 1, 1, 1, 1, 1,
147
+ 31, 1, 31, 31, 31, 31, 31, 31,
148
+ 31, 31, 31, 31, 31, 31, 31, 31,
149
+ 31, 31, 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, 1, 1, 1, 1, 1, 1,
164
+ 1, 1, 1, 1, 1, 1, 1, 1,
165
+ 1, 1, 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, 36, 36, 36, 36,
172
+ 36, 36, 36, 36, 36, 36, 36, 36,
173
+ 36, 36, 36, 36, 36, 36, 36, 36,
174
+ 36, 36, 36, 36, 36, 36, 36, 36,
175
+ 36, 36, 37, 38, 38, 38, 38, 38,
176
+ 38, 38, 38, 38, 38, 38, 38, 39,
177
+ 38, 38, 40, 41, 41, 41, 42, 1,
178
+ 31, 31, 31, 31, 31, 31, 31, 31,
179
+ 31, 31, 31, 31, 31, 31, 31, 31,
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
+ 1, 36, 36, 36, 36, 36, 36, 36,
187
+ 36, 36, 36, 36, 36, 36, 36, 36,
188
+ 36, 36, 36, 36, 36, 36, 36, 36,
189
+ 36, 36, 36, 36, 36, 36, 36, 36,
190
+ 36, 1, 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, 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, 1, 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, 36, 1, 38, 38, 38, 38,
203
+ 38, 38, 38, 38, 38, 38, 38, 38,
204
+ 38, 38, 38, 38, 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, 1, 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, 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, 1, 38, 38,
217
+ 38, 38, 38, 38, 38, 38, 38, 38,
218
+ 38, 38, 38, 38, 38, 38, 1, 44,
219
+ 1, 1, 1, 45, 1, 1, 1, 1,
220
+ 1, 1, 1, 1, 1, 1, 1, 1,
221
+ 1, 1, 1, 1, 1, 1, 44, 1,
222
+ 1, 1, 1, 1, 1, 1, 46, 1,
223
+ 1, 1, 1, 1, 1, 1, 47, 47,
224
+ 47, 47, 47, 47, 47, 47, 47, 47,
225
+ 1, 18, 1, 1, 1, 48, 1, 1,
226
+ 1, 1, 1, 1, 1, 1, 1, 1,
227
+ 1, 1, 1, 1, 1, 1, 1, 1,
228
+ 18, 1, 1, 1, 1, 1, 1, 1,
229
+ 49, 1, 50, 1, 1, 1, 51, 1,
230
+ 1, 1, 1, 1, 1, 1, 1, 1,
231
+ 1, 1, 1, 1, 1, 1, 1, 1,
232
+ 1, 50, 1, 1, 1, 1, 1, 1,
233
+ 1, 52, 1, 1, 0,
234
+ ]
235
+
236
+ class << self
237
+ attr_accessor :_trans_targs
238
+ private :_trans_targs, :_trans_targs=
239
+ end
240
+ self._trans_targs = [
241
+ 1, 0, 2, 4, 5, 3, 1, 2,
242
+ 4, 5, 6, 7, 5, 7, 8, 23,
243
+ 23, 10, 24, 12, 13, 12, 26, 15,
244
+ 16, 17, 18, 19, 20, 21, 22, 12,
245
+ 13, 12, 26, 15, 16, 17, 18, 19,
246
+ 20, 21, 22, 14, 24, 9, 25, 23,
247
+ 9, 25, 24, 9, 25,
248
+ ]
249
+
250
+ class << self
251
+ attr_accessor :_trans_actions
252
+ private :_trans_actions, :_trans_actions=
253
+ end
254
+ self._trans_actions = [
255
+ 0, 0, 0, 1, 2, 0, 3, 3,
256
+ 4, 5, 6, 7, 0, 3, 1, 8,
257
+ 9, 0, 0, 10, 10, 11, 12, 10,
258
+ 10, 10, 10, 10, 10, 10, 10, 0,
259
+ 0, 1, 13, 0, 0, 0, 0, 0,
260
+ 0, 0, 0, 0, 14, 14, 15, 0,
261
+ 0, 1, 3, 3, 4,
262
+ ]
263
+
264
+ class << self
265
+ attr_accessor :_eof_actions
266
+ private :_eof_actions, :_eof_actions=
267
+ end
268
+ self._eof_actions = [
269
+ 0, 0, 0, 0, 0, 0, 0, 0,
270
+ 0, 0, 0, 0, 0, 0, 0, 0,
271
+ 0, 0, 0, 0, 0, 0, 0, 14,
272
+ 0, 3, 0,
273
+ ]
274
+
275
+ class << self
276
+ attr_accessor :start
277
+ end
278
+ self.start = 1
279
+ class << self
280
+ attr_accessor :first_final
281
+ end
282
+ self.first_final = 23
283
+ class << self
284
+ attr_accessor :error
285
+ end
286
+ self.error = 0
287
+
288
+ class << self
289
+ attr_accessor :en_comment_tail
290
+ end
291
+ self.en_comment_tail = 11
292
+ class << self
293
+ attr_accessor :en_main
294
+ end
295
+ self.en_main = 1
22
296
 
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)]
297
+ def self.parse(data)
298
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
27
299
 
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)]
300
+ return MimeVersionStruct.new("", nil) if Mail::Utilities.blank?(data)
32
301
 
33
- when :comment_e, :comment_s then nil
302
+ # Parser state
303
+ mime_version = MimeVersionStruct.new
304
+ major_digits_s = minor_digits_s = nil
305
+
306
+ # 5.1 Variables Used by Ragel
307
+ p = 0
308
+ eof = pe = data.length
309
+ stack = []
310
+
311
+ begin
312
+ p ||= 0
313
+ pe ||= data.length
314
+ cs = start
315
+ top = 0
316
+ end
34
317
 
35
- else
36
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, "Failed to process unknown action: #{action}")
318
+ begin
319
+ testEof = false
320
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
321
+ _goto_level = 0
322
+ _resume = 10
323
+ _eof_trans = 15
324
+ _again = 20
325
+ _test_eof = 30
326
+ _out = 40
327
+ while true
328
+ if _goto_level <= 0
329
+ if p == pe
330
+ _goto_level = _test_eof
331
+ next
332
+ end
333
+ if cs == 0
334
+ _goto_level = _out
335
+ next
336
+ end
337
+ end
338
+ if _goto_level <= _resume
339
+ _keys = cs << 1
340
+ _inds = _index_offsets[cs]
341
+ _slen = _key_spans[cs]
342
+ _wide = data[p].ord
343
+ _trans = if (_slen > 0 &&
344
+ _trans_keys[_keys] <= _wide &&
345
+ _wide <= _trans_keys[_keys + 1])
346
+ _indicies[_inds + _wide - _trans_keys[_keys]]
347
+ else
348
+ _indicies[_inds + _slen]
349
+ end
350
+ cs = _trans_targs[_trans]
351
+ if _trans_actions[_trans] != 0
352
+ case _trans_actions[_trans]
353
+ when 2
354
+ begin
355
+ major_digits_s = p
356
+ end
357
+ when 7
358
+ begin
359
+ mime_version.major = chars(data, major_digits_s, p - 1)
360
+ end
361
+ when 8
362
+ begin
363
+ minor_digits_s = p
364
+ end
365
+ when 14
366
+ begin
367
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
368
+ end
369
+ when 10
370
+ begin
371
+ end
372
+ when 3
373
+ begin
374
+ end
375
+ when 1
376
+ begin
377
+ begin
378
+ stack[top] = cs
379
+ top += 1
380
+ cs = 11
381
+ _goto_level = _again
382
+ next
383
+ end
384
+ end
385
+ when 13
386
+ begin
387
+ begin
388
+ top -= 1
389
+ cs = stack[top]
390
+ _goto_level = _again
391
+ next
392
+ end
393
+ end
394
+ when 6
395
+ begin
396
+ mime_version.major = chars(data, major_digits_s, p - 1)
397
+ end
398
+ begin
399
+ begin
400
+ stack[top] = cs
401
+ top += 1
402
+ cs = 11
403
+ _goto_level = _again
404
+ next
405
+ end
406
+ end
407
+ when 15
408
+ begin
409
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
410
+ end
411
+ begin
412
+ begin
413
+ stack[top] = cs
414
+ top += 1
415
+ cs = 11
416
+ _goto_level = _again
417
+ next
418
+ end
419
+ end
420
+ when 11
421
+ begin
422
+ end
423
+ begin
424
+ begin
425
+ stack[top] = cs
426
+ top += 1
427
+ cs = 11
428
+ _goto_level = _again
429
+ next
430
+ end
431
+ end
432
+ when 12
433
+ begin
434
+ end
435
+ begin
436
+ begin
437
+ top -= 1
438
+ cs = stack[top]
439
+ _goto_level = _again
440
+ next
441
+ end
442
+ end
443
+ when 5
444
+ begin
445
+ end
446
+ begin
447
+ major_digits_s = p
448
+ end
449
+ when 9
450
+ begin
451
+ end
452
+ begin
453
+ minor_digits_s = p
454
+ end
455
+ when 4
456
+ begin
457
+ end
458
+ begin
459
+ begin
460
+ stack[top] = cs
461
+ top += 1
462
+ cs = 11
463
+ _goto_level = _again
464
+ next
465
+ end
466
+ end
467
+ end
468
+ end
469
+ end
470
+ if _goto_level <= _again
471
+ if cs == 0
472
+ _goto_level = _out
473
+ next
474
+ end
475
+ p += 1
476
+ if p != pe
477
+ _goto_level = _resume
478
+ next
479
+ end
480
+ end
481
+ if _goto_level <= _test_eof
482
+ if p == eof
483
+ case _eof_actions[cs]
484
+ when 14
485
+ begin
486
+ mime_version.minor = chars(data, minor_digits_s, p - 1)
487
+ end
488
+ when 3
489
+ begin
490
+ end
491
+ end
492
+ end
493
+ end
494
+ if _goto_level <= _out
495
+ break
496
+ end
37
497
  end
38
498
  end
499
+
500
+ if p != eof || cs < 23
501
+ raise Mail::Field::IncompleteParseError.new(Mail::MimeVersionElement, data, p)
502
+ end
503
+
39
504
  mime_version
40
505
  end
41
506
  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