net-imap 0.3.7 → 0.5.6

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/BSDL +22 -0
  3. data/COPYING +56 -0
  4. data/Gemfile +14 -0
  5. data/LICENSE.txt +3 -22
  6. data/README.md +25 -8
  7. data/Rakefile +0 -7
  8. data/docs/styles.css +72 -23
  9. data/lib/net/imap/authenticators.rb +26 -57
  10. data/lib/net/imap/command_data.rb +74 -54
  11. data/lib/net/imap/config/attr_accessors.rb +75 -0
  12. data/lib/net/imap/config/attr_inheritance.rb +90 -0
  13. data/lib/net/imap/config/attr_type_coercion.rb +61 -0
  14. data/lib/net/imap/config.rb +470 -0
  15. data/lib/net/imap/data_encoding.rb +18 -6
  16. data/lib/net/imap/data_lite.rb +226 -0
  17. data/lib/net/imap/deprecated_client_options.rb +142 -0
  18. data/lib/net/imap/errors.rb +27 -1
  19. data/lib/net/imap/esearch_result.rb +180 -0
  20. data/lib/net/imap/fetch_data.rb +597 -0
  21. data/lib/net/imap/flags.rb +1 -1
  22. data/lib/net/imap/response_data.rb +250 -440
  23. data/lib/net/imap/response_parser/parser_utils.rb +245 -0
  24. data/lib/net/imap/response_parser.rb +1867 -1184
  25. data/lib/net/imap/sasl/anonymous_authenticator.rb +69 -0
  26. data/lib/net/imap/sasl/authentication_exchange.rb +139 -0
  27. data/lib/net/imap/sasl/authenticators.rb +122 -0
  28. data/lib/net/imap/sasl/client_adapter.rb +123 -0
  29. data/lib/net/imap/{authenticators/cram_md5.rb → sasl/cram_md5_authenticator.rb} +24 -14
  30. data/lib/net/imap/sasl/digest_md5_authenticator.rb +342 -0
  31. data/lib/net/imap/sasl/external_authenticator.rb +83 -0
  32. data/lib/net/imap/sasl/gs2_header.rb +80 -0
  33. data/lib/net/imap/{authenticators/login.rb → sasl/login_authenticator.rb} +28 -18
  34. data/lib/net/imap/sasl/oauthbearer_authenticator.rb +199 -0
  35. data/lib/net/imap/sasl/plain_authenticator.rb +101 -0
  36. data/lib/net/imap/sasl/protocol_adapters.rb +101 -0
  37. data/lib/net/imap/sasl/scram_algorithm.rb +58 -0
  38. data/lib/net/imap/sasl/scram_authenticator.rb +287 -0
  39. data/lib/net/imap/sasl/stringprep.rb +6 -66
  40. data/lib/net/imap/sasl/xoauth2_authenticator.rb +106 -0
  41. data/lib/net/imap/sasl.rb +148 -44
  42. data/lib/net/imap/sasl_adapter.rb +20 -0
  43. data/lib/net/imap/search_result.rb +146 -0
  44. data/lib/net/imap/sequence_set.rb +1565 -0
  45. data/lib/net/imap/stringprep/nameprep.rb +70 -0
  46. data/lib/net/imap/stringprep/saslprep.rb +69 -0
  47. data/lib/net/imap/stringprep/saslprep_tables.rb +96 -0
  48. data/lib/net/imap/stringprep/tables.rb +146 -0
  49. data/lib/net/imap/stringprep/trace.rb +85 -0
  50. data/lib/net/imap/stringprep.rb +159 -0
  51. data/lib/net/imap/uidplus_data.rb +244 -0
  52. data/lib/net/imap/vanished_data.rb +56 -0
  53. data/lib/net/imap.rb +2090 -823
  54. data/net-imap.gemspec +7 -8
  55. data/rakelib/benchmarks.rake +91 -0
  56. data/rakelib/rfcs.rake +2 -0
  57. data/rakelib/saslprep.rake +4 -4
  58. data/rakelib/string_prep_tables_generator.rb +84 -60
  59. data/sample/net-imap.rb +167 -0
  60. metadata +45 -49
  61. data/.github/dependabot.yml +0 -6
  62. data/.github/workflows/test.yml +0 -38
  63. data/.gitignore +0 -10
  64. data/benchmarks/stringprep.yml +0 -65
  65. data/benchmarks/table-regexps.yml +0 -39
  66. data/lib/net/imap/authenticators/digest_md5.rb +0 -115
  67. data/lib/net/imap/authenticators/plain.rb +0 -41
  68. data/lib/net/imap/authenticators/xoauth2.rb +0 -20
  69. data/lib/net/imap/sasl/saslprep.rb +0 -55
  70. data/lib/net/imap/sasl/saslprep_tables.rb +0 -98
  71. data/lib/net/imap/sasl/stringprep_tables.rb +0 -153
@@ -2,6 +2,15 @@
2
2
 
3
3
  module Net
4
4
  class IMAP < Protocol
5
+ autoload :ESearchResult, "#{__dir__}/esearch_result"
6
+ autoload :FetchData, "#{__dir__}/fetch_data"
7
+ autoload :UIDFetchData, "#{__dir__}/fetch_data"
8
+ autoload :SearchResult, "#{__dir__}/search_result"
9
+ autoload :SequenceSet, "#{__dir__}/sequence_set"
10
+ autoload :UIDPlusData, "#{__dir__}/uidplus_data"
11
+ autoload :AppendUIDData, "#{__dir__}/uidplus_data"
12
+ autoload :CopyUIDData, "#{__dir__}/uidplus_data"
13
+ autoload :VanishedData, "#{__dir__}/vanished_data"
5
14
 
6
15
  # Net::IMAP::ContinuationRequest represents command continuation requests.
7
16
  #
@@ -55,17 +64,71 @@ module Net
55
64
 
56
65
  # Net::IMAP::IgnoredResponse represents intentionally ignored responses.
57
66
  #
58
- # This includes untagged response "NOOP" sent by eg. Zimbra to avoid some
59
- # clients to close the connection.
67
+ # This includes untagged response "NOOP" sent by e.g. Zimbra to avoid
68
+ # some clients to close the connection.
60
69
  #
61
70
  # It matches no IMAP standard.
71
+ class IgnoredResponse < UntaggedResponse
72
+ end
73
+
74
+ # **Note:** This represents an intentionally _unstable_ API. Where
75
+ # instances of this class are returned, future releases may return a
76
+ # different (incompatible) object <em>without deprecation or warning</em>.
77
+ #
78
+ # Net::IMAP::UnparsedData represents data for unknown response types or
79
+ # unknown extensions to response types without a well-defined extension
80
+ # grammar.
62
81
  #
63
- class IgnoredResponse < Struct.new(:raw_data)
82
+ # See also: UnparsedNumericResponseData, ExtensionData, IgnoredResponse
83
+ class UnparsedData < Struct.new(:unparsed_data)
64
84
  ##
65
- # method: raw_data
66
- # :call-seq: raw_data -> string
85
+ # method: unparsed_data
86
+ # :call-seq: unparsed_data -> string
67
87
  #
68
- # The raw response data.
88
+ # The unparsed data
89
+ end
90
+
91
+ # **Note:** This represents an intentionally _unstable_ API. Where
92
+ # instances of this class are returned, future releases may return a
93
+ # different (incompatible) object <em>without deprecation or warning</em>.
94
+ #
95
+ # Net::IMAP::UnparsedNumericResponseData represents data for unhandled
96
+ # response types with a numeric prefix. See the documentation for #number.
97
+ #
98
+ # See also: UnparsedData, ExtensionData, IgnoredResponse
99
+ class UnparsedNumericResponseData < Struct.new(:number, :unparsed_data)
100
+ ##
101
+ # method: number
102
+ # :call-seq: number -> integer
103
+ #
104
+ # Returns a numeric response data prefix, when available.
105
+ #
106
+ # Many response types are prefixed with a non-negative #number. For
107
+ # message data, #number may represent a sequence number or a UID. For
108
+ # mailbox data, #number may represent a message count.
109
+
110
+ ##
111
+ # method: unparsed_data
112
+ # :call-seq: unparsed_data -> string
113
+ #
114
+ # The unparsed data, not including #number or UntaggedResponse#name.
115
+ end
116
+
117
+ # **Note:** This represents an intentionally _unstable_ API. Where
118
+ # instances of this class are returned, future releases may return a
119
+ # different (incompatible) object <em>without deprecation or warning</em>.
120
+ #
121
+ # Net::IMAP::ExtensionData represents data that is parsable according to the
122
+ # forward-compatible extension syntax in RFC3501, RFC4466, or RFC9051, but
123
+ # isn't directly known or understood by Net::IMAP yet.
124
+ #
125
+ # See also: UnparsedData, UnparsedNumericResponseData, IgnoredResponse
126
+ class ExtensionData < Struct.new(:data)
127
+ ##
128
+ # method: data
129
+ # :call-seq: data -> string
130
+ #
131
+ # The parsed extension data.
69
132
  end
70
133
 
71
134
  # Net::IMAP::TaggedResponse represents tagged responses.
@@ -100,14 +163,24 @@ module Net
100
163
  # The raw response data.
101
164
  end
102
165
 
103
- # Net::IMAP::ResponseText represents texts of responses.
166
+ # ResponseText represents texts of responses.
104
167
  #
105
168
  # The text may be prefixed by a ResponseCode.
106
169
  #
107
- # ResponseText is returned from TaggedResponse#data, or from
108
- # UntaggedResponse#data when the response type is a "condition" ("OK", "NO",
109
- # "BAD", "PREAUTH", or "BYE").
170
+ # ResponseText is returned from TaggedResponse#data or
171
+ # UntaggedResponse#data for
172
+ # {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
173
+ # * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
174
+ # "+OK+", "+NO+", or "+BAD+".
175
+ # * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
176
+ # "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
177
+ #
178
+ # Note that these "status responses" are confusingly _not_ the same as the
179
+ # +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
110
180
  class ResponseText < Struct.new(:code, :text)
181
+ # Used to avoid an allocation when ResponseText is empty
182
+ EMPTY = new(nil, "").freeze
183
+
111
184
  ##
112
185
  # method: code
113
186
  # :call-seq: code -> ResponseCode or nil
@@ -121,31 +194,35 @@ module Net
121
194
  # Returns the response text, not including any response code
122
195
  end
123
196
 
124
- # Net::IMAP::ResponseCode represents response codes. Response codes can be
125
- # retrieved from ResponseText#code and can be included in any "condition"
126
- # response: any TaggedResponse and UntaggedResponse when the response type
127
- # is a "condition" ("OK", "NO", "BAD", "PREAUTH", or "BYE").
197
+ # ResponseCode represents an \IMAP response code, which can be retrieved
198
+ # from ResponseText#code for
199
+ # {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
200
+ # * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
201
+ # "+OK+", "+NO+", or "+BAD+".
202
+ # * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
203
+ # "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
204
+ #
205
+ # Note that these "status responses" are confusingly _not_ the same as the
206
+ # +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
128
207
  #
129
208
  # Some response codes come with additional data which will be parsed by
130
209
  # Net::IMAP. Others return +nil+ for #data, but are used as a
131
210
  # machine-readable annotation for the human-readable ResponseText#text in
132
- # the same response. When Net::IMAP does not know how to parse response
133
- # code text, #data returns the unparsed string.
211
+ # the same response.
134
212
  #
135
213
  # Untagged response code #data is pushed directly onto Net::IMAP#responses,
136
214
  # keyed by #name, unless it is removed by the command that generated it.
137
215
  # Use Net::IMAP#add_response_handler to view tagged response codes for
138
216
  # command methods that do not return their TaggedResponse.
139
217
  #
218
+ # == Standard response codes
219
+ #
140
220
  # \IMAP extensions may define new codes and the data that comes with them.
141
221
  # The IANA {IMAP Response
142
222
  # Codes}[https://www.iana.org/assignments/imap-response-codes/imap-response-codes.xhtml]
143
223
  # registry has links to specifications for all standard response codes.
144
- # Response codes are backwards compatible: Servers are allowed to send new
145
- # response codes even if the client has not enabled the extension that
146
- # defines them. When unknown response code data is encountered, #data
147
- # will return an unparsed string.
148
224
  #
225
+ # === +IMAP4rev1+ response codes
149
226
  # See [IMAP4rev1[https://www.rfc-editor.org/rfc/rfc3501]] {§7.1, "Server
150
227
  # Responses - Status
151
228
  # Responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1] for full
@@ -169,13 +246,32 @@ module Net
169
246
  # {§2.3.1.1, "Unique Identifier (UID) Message
170
247
  # Attribute}[https://www.rfc-editor.org/rfc/rfc3501#section-2.3.1.1].
171
248
  # * +UIDVALIDITY+, #data is an Integer, the UID validity value of the
172
- # mailbox See [{IMAP4rev1}[https://www.rfc-editor.org/rfc/rfc3501]],
249
+ # mailbox. See [{IMAP4rev1}[https://www.rfc-editor.org/rfc/rfc3501]],
173
250
  # {§2.3.1.1, "Unique Identifier (UID) Message
174
251
  # Attribute}[https://www.rfc-editor.org/rfc/rfc3501#section-2.3.1.1].
175
252
  # * +UNSEEN+, #data is an Integer, the number of messages which do not have
176
253
  # the <tt>\Seen</tt> flag set.
177
- #
178
- # See RFC5530[https://www.rfc-editor.org/rfc/rfc5530], "IMAP Response
254
+ # <em>DEPRECATED by IMAP4rev2.</em>
255
+ #
256
+ # === +BINARY+ extension
257
+ # See {[RFC3516]}[https://www.rfc-editor.org/rfc/rfc3516].
258
+ # * +UNKNOWN-CTE+, with a tagged +NO+ response, when the server does not
259
+ # known how to decode a CTE (content-transfer-encoding). #data is +nil+.
260
+ # See IMAP#fetch.
261
+ #
262
+ # === +UIDPLUS+ extension
263
+ # See {[RFC4315 §3]}[https://www.rfc-editor.org/rfc/rfc4315#section-3].
264
+ # * +APPENDUID+, #data is UIDPlusData. See IMAP#append.
265
+ # * +COPYUID+, #data is UIDPlusData. See IMAP#copy.
266
+ # * +UIDNOTSTICKY+, #data is +nil+. See IMAP#select.
267
+ #
268
+ # === +SEARCHRES+ extension
269
+ # See {[RFC5182]}[https://www.rfc-editor.org/rfc/rfc5182].
270
+ # * +NOTSAVED+, with a tagged +NO+ response, when the search result variable
271
+ # is not saved. #data is +nil+.
272
+ #
273
+ # === +RFC5530+ response codes
274
+ # See {[RFC5530]}[https://www.rfc-editor.org/rfc/rfc5530], "IMAP Response
179
275
  # Codes" for the definition of the following response codes, which are all
180
276
  # machine-readable annotations for the human-readable ResponseText#text, and
181
277
  # have +nil+ #data of their own:
@@ -197,6 +293,42 @@ module Net
197
293
  # * +ALREADYEXISTS+
198
294
  # * +NONEXISTENT+
199
295
  #
296
+ # === +QRESYNC+ extension
297
+ # See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
298
+ # * +CLOSED+, returned when the currently selected mailbox is closed
299
+ # implicitly by selecting or examining another mailbox. #data is +nil+.
300
+ #
301
+ # === +IMAP4rev2+ response codes
302
+ # See {[RFC9051]}[https://www.rfc-editor.org/rfc/rfc9051] {§7.1, "Server
303
+ # Responses - Status
304
+ # Responses"}[https://www.rfc-editor.org/rfc/rfc9051#section-7.1] for full
305
+ # descriptions of IMAP4rev2 response codes. IMAP4rev2 includes all of the
306
+ # response codes listed above (except "+UNSEEN+") and adds the following:
307
+ # * +HASCHILDREN+, with a tagged +NO+ response, when a mailbox delete failed
308
+ # because the server doesn't allow deletion of mailboxes with children.
309
+ # #data is +nil+.
310
+ #
311
+ # === +CONDSTORE+ extension
312
+ # See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
313
+ # * +NOMODSEQ+, when selecting a mailbox that does not support
314
+ # mod-sequences. #data is +nil+. See IMAP#select.
315
+ # * +HIGHESTMODSEQ+, #data is an Integer, the highest mod-sequence value of
316
+ # all messages in the mailbox. See IMAP#select.
317
+ # * +MODIFIED+, #data is a SequenceSet, the messages that have been modified
318
+ # since the +UNCHANGEDSINCE+ mod-sequence given to +STORE+ or <tt>UID
319
+ # STORE</tt>.
320
+ #
321
+ # === +OBJECTID+ extension
322
+ # See {[RFC8474]}[https://www.rfc-editor.org/rfc/rfc8474.html].
323
+ # * +MAILBOXID+, #data is a string
324
+ #
325
+ # == Extension compatibility
326
+ #
327
+ # Response codes are backwards compatible: Servers are allowed to send new
328
+ # response codes even if the client has not enabled the extension that
329
+ # defines them. When Net::IMAP does not know how to parse response
330
+ # code text, #data returns the unparsed string.
331
+ #
200
332
  class ResponseCode < Struct.new(:name, :data)
201
333
  ##
202
334
  # method: name
@@ -215,64 +347,8 @@ module Net
215
347
  # code data can take.
216
348
  end
217
349
 
218
- # Net::IMAP::UIDPlusData represents the ResponseCode#data that accompanies
219
- # the +APPENDUID+ and +COPYUID+ response codes.
220
- #
221
- # See [[UIDPLUS[https://www.rfc-editor.org/rfc/rfc4315.html]].
222
- #
223
- # ==== Capability requirement
224
- #
225
- # The +UIDPLUS+ capability[rdoc-ref:Net::IMAP#capability] must be supported.
226
- # A server that supports +UIDPLUS+ should send a UIDPlusData object inside
227
- # every TaggedResponse returned by the append[rdoc-ref:Net::IMAP#append],
228
- # copy[rdoc-ref:Net::IMAP#copy], move[rdoc-ref:Net::IMAP#move], {uid
229
- # copy}[rdoc-ref:Net::IMAP#uid_copy], and {uid
230
- # move}[rdoc-ref:Net::IMAP#uid_move] commands---unless the destination
231
- # mailbox reports +UIDNOTSTICKY+.
232
- #
233
- #--
234
- # TODO: support MULTIAPPEND
235
- #++
236
- #
237
- class UIDPlusData < Struct.new(:uidvalidity, :source_uids, :assigned_uids)
238
- ##
239
- # method: uidvalidity
240
- # :call-seq: uidvalidity -> nonzero uint32
241
- #
242
- # The UIDVALIDITY of the destination mailbox.
243
-
244
- ##
245
- # method: source_uids
246
- # :call-seq: source_uids -> nil or an array of nonzero uint32
247
- #
248
- # The UIDs of the copied or moved messages.
249
- #
250
- # Note:: Returns +nil+ for Net::IMAP#append.
251
-
252
- ##
253
- # method: assigned_uids
254
- # :call-seq: assigned_uids -> an array of nonzero uint32
255
- #
256
- # The newly assigned UIDs of the copied, moved, or appended messages.
257
- #
258
- # Note:: This always returns an array, even when it contains only one UID.
259
-
260
- ##
261
- # :call-seq: uid_mapping -> nil or a hash
262
- #
263
- # Returns a hash mapping each source UID to the newly assigned destination
264
- # UID.
265
- #
266
- # Note:: Returns +nil+ for Net::IMAP#append.
267
- def uid_mapping
268
- source_uids&.zip(assigned_uids)&.to_h
269
- end
270
- end
271
-
272
- # Net::IMAP::MailboxList represents contents of the LIST response,
273
- # representing a single mailbox path.
274
- #
275
- # Net::IMAP#list returns an array of MailboxList objects.
350
+ # MailboxList represents the data of an untagged +LIST+ response, for a
351
+ # _single_ mailbox path. IMAP#list returns an array of MailboxList objects.
276
352
  #
277
353
  class MailboxList < Struct.new(:attr, :delim, :name)
278
354
  ##
@@ -282,11 +358,11 @@ module Net
282
358
  # Returns the name attributes. Each name attribute is a symbol capitalized
283
359
  # by String#capitalize, such as :Noselect (not :NoSelect). For the
284
360
  # semantics of each attribute, see:
285
- # * rdoc-ref:Net::IMAP@Basic+Mailbox+Attributes
286
- # * rdoc-ref:Net::IMAP@Mailbox+role+Attributes
287
- # * Net::IMAP@SPECIAL-USE
361
+ # * Net::IMAP@Basic+Mailbox+Attributes
362
+ # * Net::IMAP@Mailbox+role+Attributes
288
363
  # * The IANA {IMAP Mailbox Name Attributes
289
364
  # registry}[https://www.iana.org/assignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml]
365
+ # has links to specifications for all standard mailbox attributes.
290
366
 
291
367
  ##
292
368
  # method: delim
@@ -301,16 +377,16 @@ module Net
301
377
  # Returns the mailbox name.
302
378
  end
303
379
 
304
- # Net::IMAP::MailboxQuota represents contents of GETQUOTA response.
305
- # This object can also be a response to GETQUOTAROOT. In the syntax
306
- # specification below, the delimiter used with the "#" construct is a
307
- # single space (SPACE).
380
+ # MailboxQuota represents the data of an untagged +QUOTA+ response.
308
381
  #
309
- # Net:IMAP#getquota returns an array of MailboxQuota objects.
382
+ # IMAP#getquota returns an array of MailboxQuota objects.
310
383
  #
311
384
  # Net::IMAP#getquotaroot returns an array containing both MailboxQuotaRoot
312
385
  # and MailboxQuota objects.
313
386
  #
387
+ # == Required capability
388
+ # Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
389
+ # capability.
314
390
  class MailboxQuota < Struct.new(:mailbox, :usage, :quota)
315
391
  ##
316
392
  # method: mailbox
@@ -332,12 +408,14 @@ module Net
332
408
  #
333
409
  end
334
410
 
335
- # Net::IMAP::MailboxQuotaRoot represents part of the GETQUOTAROOT
336
- # response. (GETQUOTAROOT can also return Net::IMAP::MailboxQuota.)
411
+ # MailboxQuotaRoot represents the data of an untagged +QUOTAROOT+ response.
337
412
  #
338
- # Net::IMAP#getquotaroot returns an array containing both MailboxQuotaRoot
339
- # and MailboxQuota objects.
413
+ # IMAP#getquotaroot returns an array containing both MailboxQuotaRoot and
414
+ # MailboxQuota objects.
340
415
  #
416
+ # == Required capability
417
+ # Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
418
+ # capability.
341
419
  class MailboxQuotaRoot < Struct.new(:mailbox, :quotaroots)
342
420
  ##
343
421
  # method: mailbox
@@ -352,12 +430,13 @@ module Net
352
430
  # Zero or more quotaroots that affect the quota on the specified mailbox.
353
431
  end
354
432
 
355
- # Net::IMAP::MailboxACLItem represents the response from GETACL.
433
+ # MailboxACLItem represents the data of an untagged +ACL+ response.
356
434
  #
357
- # Net::IMAP#getacl returns an array of MailboxACLItem objects.
435
+ # IMAP#getacl returns an array of MailboxACLItem objects.
358
436
  #
359
- # ==== Required capability
360
- # +ACL+ - described in [ACL[https://tools.ietf.org/html/rfc4314]]
437
+ # == Required capability
438
+ # Requires +ACL+ [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]]
439
+ # capability.
361
440
  class MailboxACLItem < Struct.new(:user, :rights, :mailbox)
362
441
  ##
363
442
  # method: mailbox
@@ -379,11 +458,12 @@ module Net
379
458
  # The access rights the indicated #user has to the #mailbox.
380
459
  end
381
460
 
382
- # Net::IMAP::Namespace represents a single namespace contained inside a
383
- # NAMESPACE response.
384
- #
385
- # Returned by Net::IMAP#namespace, contained inside a Namespaces object.
461
+ # Namespace represents a _single_ namespace, contained inside a Namespaces
462
+ # object.
386
463
  #
464
+ # == Required capability
465
+ # Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
466
+ # or +IMAP4rev2+ capability.
387
467
  class Namespace < Struct.new(:prefix, :delim, :extensions)
388
468
  ##
389
469
  # method: prefix
@@ -405,11 +485,14 @@ module Net
405
485
  # Extension parameter semantics would be defined by the extension.
406
486
  end
407
487
 
408
- # Net::IMAP::Namespaces represents a +NAMESPACE+ server response, which
409
- # contains lists of #personal, #shared, and #other namespaces.
488
+ # Namespaces represents the data of an untagged +NAMESPACE+ response,
489
+ # returned by IMAP#namespace.
410
490
  #
411
- # Net::IMAP#namespace returns a Namespaces object.
491
+ # Contains lists of #personal, #shared, and #other namespaces.
412
492
  #
493
+ # == Required capability
494
+ # Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
495
+ # or +IMAP4rev2+ capability.
413
496
  class Namespaces < Struct.new(:personal, :other, :shared)
414
497
  ##
415
498
  # method: personal
@@ -430,9 +513,9 @@ module Net
430
513
  # Returns an array of Shared Namespace objects.
431
514
  end
432
515
 
433
- # Net::IMAP::StatusData represents the contents of the STATUS response.
516
+ # StatusData represents the contents of an untagged +STATUS+ response.
434
517
  #
435
- # Net::IMAP#status returns the contents of #attr.
518
+ # IMAP#status returns the contents of #attr.
436
519
  class StatusData < Struct.new(:mailbox, :attr)
437
520
  ##
438
521
  # method: mailbox
@@ -448,223 +531,20 @@ module Net
448
531
  # "UIDVALIDITY", "UNSEEN". Each value is a number.
449
532
  end
450
533
 
451
- # Net::IMAP::FetchData represents the contents of a FETCH response.
452
- #
453
- # Net::IMAP#fetch and Net::IMAP#uid_fetch both return an array of
454
- # FetchData objects.
455
- #
456
- # === Fetch attributes
457
- #
458
- #--
459
- # TODO: merge branch with accessor methods for each type of attr. Then
460
- # move nearly all of the +attr+ documentation onto the appropriate
461
- # accessor methods.
462
- #++
463
- #
464
- # Each key of the #attr hash is the data item name for the fetched value.
465
- # Each data item represents a message attribute, part of one, or an
466
- # interpretation of one. #seqno is not a message attribute. Most message
467
- # attributes are static and must never change for a given <tt>[server,
468
- # account, mailbox, UIDVALIDITY, UID]</tt> tuple. A few message attributes
469
- # can be dynamically changed, e.g. using the {STORE
470
- # command}[rdoc-ref:Net::IMAP#store].
471
- #
472
- # See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501.html#section-7.4.2]
473
- # and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051.html#section-7.5.2]
474
- # for full description of the standard fetch response data items, and
475
- # Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
476
- #
477
- # ==== Static fetch data items
478
- #
479
- # The static data items
480
- # defined by [IMAP4rev1[https://www.rfc-editor.org/rfc/rfc3501.html]] are:
481
- #
482
- # [<tt>"UID"</tt>]
483
- # A number expressing the unique identifier of the message.
484
- #
485
- # [<tt>"BODY[]"</tt>, <tt>"BODY[]<#{offset}>"</tt>]
486
- # The [RFC5322[https://tools.ietf.org/html/rfc5322]] expression of the
487
- # entire message, as a string.
488
- #
489
- # If +offset+ is specified, this returned string is a substring of the
490
- # entire contents, starting at that origin octet. This means that
491
- # <tt>BODY[]<0></tt> MAY be truncated, but <tt>BODY[]</tt> is NEVER
492
- # truncated.
493
- #
494
- # <em>Messages can be parsed using the "mail" gem.</em>
495
- #
496
- # [Note]
497
- # When fetching <tt>BODY.PEEK[#{specifier}]</tt>, the data will be
498
- # returned in <tt>BODY[#{specifier}]</tt>, without the +PEEK+. This is
499
- # true for all of the <tt>BODY[...]</tt> attribute forms.
500
- #
501
- # [<tt>"BODY[HEADER]"</tt>, <tt>"BODY[HEADER]<#{offset}>"</tt>]
502
- # The [RFC5322[https://tools.ietf.org/html/rfc5322]] header of the
503
- # message.
504
- #
505
- # <em>Message headers can be parsed using the "mail" gem.</em>
506
- #
507
- # [<tt>"BODY[HEADER.FIELDS (#{fields.join(" ")})]"</tt>,]
508
- # [<tt>"BODY[HEADER.FIELDS (#{fields.join(" ")})]<#{offset}>"</tt>]
509
- # When field names are given, the subset contains only the header fields
510
- # that matches one of the names in the list. The field names are based
511
- # on what was requested, not on what was returned.
512
- #
513
- # [<tt>"BODY[HEADER.FIELDS.NOT (#{fields.join(" ")})]"</tt>,]
514
- # [<tt>"BODY[HEADER.FIELDS.NOT (#{fields.join(" ")})]<#{offset}>"</tt>]
515
- # When the <tt>HEADER.FIELDS.NOT</tt> is used, the subset is all of the
516
- # fields that <em>do not</em> match any names in the list.
517
- #
518
- # [<tt>"BODY[TEXT]"</tt>, <tt>"BODY[TEXT]<#{offset}>"</tt>]
519
- # The text body of the message, omitting
520
- # the [RFC5322[https://tools.ietf.org/html/rfc5322]] header.
521
- #
522
- # [<tt>"BODY[#{part}]"</tt>, <tt>"BODY[#{part}]<#{offset}>"</tt>]
523
- # The text of a particular body section, if it was fetched.
524
- #
525
- # Multiple part specifiers will be joined with <tt>"."</tt>. Numeric
526
- # part specifiers refer to the MIME part number, counting up from +1+.
527
- # Messages that don't use MIME, or MIME messages that are not multipart
528
- # and don't hold an encapsulated message, only have a part +1+.
529
- #
530
- # 8-bit textual data is permitted if
531
- # a [CHARSET[https://tools.ietf.org/html/rfc2978]] identifier is part of
532
- # the body parameter parenthesized list for this section. See
533
- # BodyTypeBasic.
534
- #
535
- # MESSAGE/RFC822 or MESSAGE/GLOBAL message, or a subset of the header, if
536
- # it was fetched.
537
- #
538
- # [<tt>"BODY[#{part}.HEADER]"</tt>,]
539
- # [<tt>"BODY[#{part}.HEADER]<#{offset}>"</tt>,]
540
- # [<tt>"BODY[#{part}.HEADER.FIELDS.NOT (#{fields.join(" ")})]"</tt>,]
541
- # [<tt>"BODY[#{part}.HEADER.FIELDS.NOT (#{fields.join(" ")})]<#{offset}>"</tt>,]
542
- # [<tt>"BODY[#{part}.TEXT]"</tt>,]
543
- # [<tt>"BODY[#{part}.TEXT]<#{offset}>"</tt>,]
544
- # [<tt>"BODY[#{part}.MIME]"</tt>,]
545
- # [<tt>"BODY[#{part}.MIME]<#{offset}>"</tt>]
546
- # +HEADER+, <tt>HEADER.FIELDS</tt>, <tt>HEADER.FIELDS.NOT</tt>, and
547
- # <tt>TEXT</tt> can be prefixed by numeric part specifiers, if it refers
548
- # to a part of type <tt>message/rfc822</tt> or <tt>message/global</tt>.
549
- #
550
- # +MIME+ refers to the [MIME-IMB[https://tools.ietf.org/html/rfc2045]]
551
- # header for this part.
552
- #
553
- # [<tt>"BODY"</tt>]
554
- # A form of +BODYSTRUCTURE+, without any extension data.
555
- #
556
- # [<tt>"BODYSTRUCTURE"</tt>]
557
- # Returns a BodyStructure object that describes
558
- # the [MIME-IMB[https://tools.ietf.org/html/rfc2045]] body structure of
559
- # a message, if it was fetched.
560
- #
561
- # [<tt>"ENVELOPE"</tt>]
562
- # An Envelope object that describes the envelope structure of a message.
563
- # See the documentation for Envelope for a description of the envelope
564
- # structure attributes.
565
- #
566
- # [<tt>"INTERNALDATE"</tt>]
567
- # The internal date and time of the message on the server. This is not
568
- # the date and time in
569
- # the [RFC5322[https://tools.ietf.org/html/rfc5322]] header, but rather
570
- # a date and time which reflects when the message was received.
571
- #
572
- # [<tt>"RFC822.SIZE"</tt>]
573
- # A number expressing the [RFC5322[https://tools.ietf.org/html/rfc5322]]
574
- # size of the message.
575
- #
576
- # [Note]
577
- # \IMAP was originally developed for the older RFC-822 standard, and
578
- # as a consequence several fetch items in \IMAP incorporate "RFC822"
579
- # in their name. With the exception of +RFC822.SIZE+, there are more
580
- # modern replacements; for example, the modern version of
581
- # +RFC822.HEADER+ is <tt>BODY.PEEK[HEADER]</tt>. In all cases,
582
- # "RFC822" should be interpreted as a reference to the
583
- # updated [RFC5322[https://tools.ietf.org/html/rfc5322]] standard.
584
- #
585
- # [<tt>"RFC822"</tt>]
586
- # Semantically equivalent to <tt>BODY[]</tt>.
587
- # [<tt>"RFC822.HEADER"</tt>]
588
- # Semantically equivalent to <tt>BODY[HEADER]</tt>.
589
- # [<tt>"RFC822.TEXT"</tt>]
590
- # Semantically equivalent to <tt>BODY[TEXT]</tt>.
591
- #
592
- # [Note:]
593
- # >>>
594
- # Additional static fields are defined in \IMAP extensions and
595
- # [IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051.html]], but
596
- # Net::IMAP can't parse them yet.
597
- #
598
- #--
599
- # <tt>"BINARY[#{section_binary}]<#{offset}>"</tt>:: TODO...
600
- # <tt>"BINARY.SIZE[#{sectionbinary}]"</tt>:: TODO...
601
- # <tt>"EMAILID"</tt>:: TODO...
602
- # <tt>"THREADID"</tt>:: TODO...
603
- # <tt>"SAVEDATE"</tt>:: TODO...
604
- #++
605
- #
606
- # ==== Dynamic message attributes
607
- # The only dynamic item defined
608
- # by [{IMAP4rev1}[https://www.rfc-editor.org/rfc/rfc3501.html]] is:
609
- # [<tt>"FLAGS"</tt>]
610
- # An array of flags that are set for this message. System flags are
611
- # symbols that have been capitalized by String#capitalize. Keyword
612
- # flags are strings and their case is not changed.
613
- #
614
- # \IMAP extensions define new dynamic fields, e.g.:
615
- #
616
- # [<tt>"MODSEQ"</tt>]
617
- # The modification sequence number associated with this IMAP message.
618
- #
619
- # Requires the [CONDSTORE[https://tools.ietf.org/html/rfc7162]]
620
- # server {capability}[rdoc-ref:Net::IMAP#capability].
621
- #
622
- # [Note:]
623
- # >>>
624
- # Additional dynamic fields are defined in \IMAP extensions, but
625
- # Net::IMAP can't parse them yet.
626
- #
627
- #--
628
- # <tt>"ANNOTATE"</tt>:: TODO...
629
- # <tt>"PREVIEW"</tt>:: TODO...
630
- #++
631
- #
632
- class FetchData < Struct.new(:seqno, :attr)
633
- ##
634
- # method: seqno
635
- # :call-seq: seqno -> Integer
636
- #
637
- # The message sequence number.
638
- #
639
- # [Note]
640
- # This is never the unique identifier (UID), not even for the
641
- # Net::IMAP#uid_fetch result. If it was returned, the UID is available
642
- # from <tt>attr["UID"]</tt>.
643
-
644
- ##
645
- # method: attr
646
- # :call-seq: attr -> hash
647
- #
648
- # A hash. Each key is specifies a message attribute, and the value is the
649
- # corresponding data item.
650
- #
651
- # See rdoc-ref:FetchData@Fetch+attributes for descriptions of possible
652
- # values.
653
- end
654
-
655
534
  # Net::IMAP::Envelope represents envelope structures of messages.
656
535
  #
657
536
  # [Note]
658
537
  # When the #sender and #reply_to fields are absent or empty, they will
659
538
  # return the same value as #from. Also, fields may return values that are
660
- # invalid for well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
539
+ # invalid for well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
661
540
  # messages when the message is malformed or a draft message.
662
541
  #
663
- # See [{IMAP4rev1 §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501.html#section-7.4.2]]
664
- # and [{IMAP4rev2 §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051.html#section-7.5.2]]
542
+ # See [{IMAP4rev1 §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]]
543
+ # and [{IMAP4rev2 §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2]]
665
544
  # for full description of the envelope fields, and
666
545
  # Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
667
546
  #
547
+ # Returned by FetchData#envelope
668
548
  class Envelope < Struct.new(:date, :subject, :from, :sender, :reply_to,
669
549
  :to, :cc, :bcc, :in_reply_to, :message_id)
670
550
  ##
@@ -674,7 +554,7 @@ module Net
674
554
  # Returns a string that represents the +Date+ header.
675
555
  #
676
556
  # [Note]
677
- # For a well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
557
+ # For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
678
558
  # message, the #date field must not be +nil+. However it can be +nil+
679
559
  # for a malformed or draft message.
680
560
 
@@ -700,7 +580,7 @@ module Net
700
580
  # returns +nil+ for this envelope field.
701
581
  #
702
582
  # [Note]
703
- # For a well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
583
+ # For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
704
584
  # message, the #from field must not be +nil+. However it can be +nil+
705
585
  # for a malformed or draft message.
706
586
 
@@ -713,7 +593,7 @@ module Net
713
593
  # [Note]
714
594
  # If the <tt>Sender</tt> header is absent, or is present but empty, the
715
595
  # server sets this field to be the same value as #from. Therefore, in a
716
- # well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]] message,
596
+ # well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] message,
717
597
  # the #sender envelope field must not be +nil+. However it can be
718
598
  # +nil+ for a malformed or draft message.
719
599
 
@@ -727,7 +607,7 @@ module Net
727
607
  # [Note]
728
608
  # If the <tt>Reply-To</tt> header is absent, or is present but empty,
729
609
  # the server sets this field to be the same value as #from. Therefore,
730
- # in a well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
610
+ # in a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
731
611
  # message, the #reply_to envelope field must not be +nil+. However it
732
612
  # can be +nil+ for a malformed or draft message.
733
613
 
@@ -756,7 +636,7 @@ module Net
756
636
  # Returns a string that represents the <tt>In-Reply-To</tt> header.
757
637
  #
758
638
  # [Note]
759
- # For a well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
639
+ # For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
760
640
  # message, the #in_reply_to field, if present, must not be empty. But
761
641
  # it can still return an empty string for malformed messages.
762
642
  #
@@ -772,7 +652,7 @@ module Net
772
652
  # Returns a string that represents the <tt>Message-ID</tt>.
773
653
  #
774
654
  # [Note]
775
- # For a well-formed [RFC5322[https://tools.ietf.org/html/rfc5322]]
655
+ # For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
776
656
  # message, the #message_id field, if present, must not be empty. But it
777
657
  # can still return an empty string for malformed messages.
778
658
  #
@@ -786,10 +666,10 @@ module Net
786
666
  # parsed into its component parts by the server. Address objects are
787
667
  # returned within Envelope fields.
788
668
  #
789
- # === Group syntax
669
+ # == Group syntax
790
670
  #
791
671
  # When the #host field is +nil+, this is a special form of address structure
792
- # that indicates the [RFC5322[https://tools.ietf.org/html/rfc5322]] group
672
+ # that indicates the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
793
673
  # syntax. If the #mailbox name field is also +nil+, this is an end-of-group
794
674
  # marker (semicolon in RFC-822 syntax). If the #mailbox name field is
795
675
  # non-+NIL+, this is the start of a group marker, and the mailbox #name
@@ -799,7 +679,7 @@ module Net
799
679
  # method: name
800
680
  # :call-seq: name -> string or nil
801
681
  #
802
- # Returns the [RFC5322[https://tools.ietf.org/html/rfc5322]] address
682
+ # Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
803
683
  # +display-name+ (or the mailbox +phrase+ in the RFC-822 grammar).
804
684
 
805
685
  ##
@@ -809,28 +689,28 @@ module Net
809
689
  # Returns the route from RFC-822 route-addr.
810
690
  #
811
691
  # Note:: Generating this obsolete route addressing syntax is not allowed
812
- # by [RFC5322[https://tools.ietf.org/html/rfc5322]]. However,
692
+ # by [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]. However,
813
693
  # addresses with this syntax must still be accepted and parsed.
814
694
 
815
695
  ##
816
696
  # method: mailbox
817
697
  # :call-seq: mailbox -> string or nil
818
698
  #
819
- # Returns the [RFC5322[https://tools.ietf.org/html/rfc5322]] address
699
+ # Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
820
700
  # +local-part+, if #host is not +nil+.
821
701
  #
822
702
  # When #host is +nil+, this returns
823
- # an [RFC5322[https://tools.ietf.org/html/rfc5322]] group name and a +nil+
703
+ # an [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group name and a +nil+
824
704
  # mailbox indicates the end of a group.
825
705
 
826
706
  ##
827
707
  # method: host
828
708
  # :call-seq: host -> string or nil
829
709
  #
830
- # Returns the [RFC5322[https://tools.ietf.org/html/rfc5322]] addr-spec
710
+ # Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] addr-spec
831
711
  # +domain+ name.
832
712
  #
833
- # +nil+ indicates [RFC5322[https://tools.ietf.org/html/rfc5322]] group
713
+ # +nil+ indicates [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
834
714
  # syntax.
835
715
  end
836
716
 
@@ -842,14 +722,14 @@ module Net
842
722
  # :call-seq: dsp_type -> string
843
723
  #
844
724
  # Returns the content disposition type, as defined by
845
- # [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
725
+ # [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
846
726
 
847
727
  ##
848
728
  # method: param
849
729
  # :call-seq: param -> hash
850
730
  #
851
731
  # Returns a hash representing parameters of the Content-Disposition
852
- # field, as defined by [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
732
+ # field, as defined by [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
853
733
  end
854
734
 
855
735
  # Net::IMAP::ThreadMember represents a thread-node returned
@@ -868,6 +748,19 @@ module Net
868
748
  #
869
749
  # An array of Net::IMAP::ThreadMember objects for mail items that are
870
750
  # children of this in the thread.
751
+
752
+ # Returns a SequenceSet containing #seqno and all #children's seqno,
753
+ # recursively.
754
+ def to_sequence_set
755
+ SequenceSet.new all_seqnos
756
+ end
757
+
758
+ protected
759
+
760
+ def all_seqnos(node = self)
761
+ [node.seqno].concat node.children.flat_map { _1.all_seqnos }
762
+ end
763
+
871
764
  end
872
765
 
873
766
  # Net::IMAP::BodyStructure is included by all of the structs that can be
@@ -875,12 +768,12 @@ module Net
875
768
  # FetchData#attr value. Although these classes don't share a base class,
876
769
  # this module can be used to pattern match all of them.
877
770
  #
878
- # See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501.html#section-7.4.2]
879
- # and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051.html#section-7.5.2-4.9]
771
+ # See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
772
+ # and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
880
773
  # for full description of all +BODYSTRUCTURE+ fields, and also
881
774
  # Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
882
775
  #
883
- # === Classes that include BodyStructure
776
+ # == Classes that include BodyStructure
884
777
  # BodyTypeBasic:: Represents any message parts that are not handled by
885
778
  # BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
886
779
  # BodyTypeText:: Used by <tt>text/*</tt> parts. Contains all of the
@@ -891,13 +784,6 @@ module Net
891
784
  # should use BodyTypeBasic.
892
785
  # BodyTypeMultipart:: for <tt>multipart/*</tt> parts
893
786
  #
894
- # ==== Deprecated BodyStructure classes
895
- # The following classes represent invalid server responses or parser bugs:
896
- # BodyTypeExtension:: parser bug: used for <tt>message/*</tt> where
897
- # BodyTypeBasic should have been used.
898
- # BodyTypeAttachment:: server bug: some servers sometimes return the
899
- # "Content-Disposition: attachment" data where the
900
- # entire body structure for a message part is expected.
901
787
  module BodyStructure
902
788
  end
903
789
 
@@ -905,8 +791,8 @@ module Net
905
791
  # message parts, unless they have a <tt>Content-Type</tt> that is handled by
906
792
  # BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
907
793
  #
908
- # See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501.html#section-7.4.2]
909
- # and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051.html#section-7.5.2-4.9]
794
+ # See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
795
+ # and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
910
796
  # for full description of all +BODYSTRUCTURE+ fields, and also
911
797
  # Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
912
798
  #
@@ -914,6 +800,7 @@ module Net
914
800
  :param, :content_id,
915
801
  :description, :encoding, :size,
916
802
  :md5, :disposition, :language,
803
+ :location,
917
804
  :extension)
918
805
  include BodyStructure
919
806
 
@@ -922,45 +809,45 @@ module Net
922
809
  # :call-seq: media_type -> string
923
810
  #
924
811
  # The top-level media type as defined in
925
- # [MIME-IMB[https://tools.ietf.org/html/rfc2045]].
812
+ # [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
926
813
 
927
814
  ##
928
815
  # method: subtype
929
816
  # :call-seq: subtype -> string
930
817
  #
931
818
  # The media subtype name as defined in
932
- # [MIME-IMB[https://tools.ietf.org/html/rfc2045]].
819
+ # [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
933
820
 
934
821
  ##
935
822
  # method: param
936
823
  # :call-seq: param -> string
937
824
  #
938
825
  # Returns a hash that represents parameters as defined in
939
- # [MIME-IMB[https://tools.ietf.org/html/rfc2045]].
826
+ # [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
940
827
 
941
828
  ##
942
829
  # method: content_id
943
830
  # :call-seq: content_id -> string
944
831
  #
945
832
  # Returns a string giving the content id as defined
946
- # in [MIME-IMB[https://tools.ietf.org/html/rfc2045]]
947
- # {§7}[https://tools.ietf.org/html/rfc2045#section-7].
833
+ # in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
834
+ # {§7}[https://www.rfc-editor.org/rfc/rfc2045#section-7].
948
835
 
949
836
  ##
950
837
  # method: description
951
838
  # :call-seq: description -> string
952
839
  #
953
840
  # Returns a string giving the content description as defined
954
- # in [MIME-IMB[https://tools.ietf.org/html/rfc2045]]
955
- # {§8}[https://tools.ietf.org/html/rfc2045#section-8].
841
+ # in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
842
+ # {§8}[https://www.rfc-editor.org/rfc/rfc2045#section-8].
956
843
 
957
844
  ##
958
845
  # method: encoding
959
846
  # :call-seq: encoding -> string
960
847
  #
961
848
  # Returns a string giving the content transfer encoding as defined
962
- # in [MIME-IMB[https://tools.ietf.org/html/rfc2045]]
963
- # {§6}[https://tools.ietf.org/html/rfc2045#section-6].
849
+ # in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
850
+ # {§6}[https://www.rfc-editor.org/rfc/rfc2045#section-6].
964
851
 
965
852
  ##
966
853
  # method: size
@@ -973,7 +860,7 @@ module Net
973
860
  # :call-seq: md5 -> string
974
861
  #
975
862
  # Returns a string giving the body MD5 value as defined in
976
- # [MD5[https://tools.ietf.org/html/rfc1864]].
863
+ # [MD5[https://www.rfc-editor.org/rfc/rfc1864]].
977
864
 
978
865
  ##
979
866
  # method: disposition
@@ -981,7 +868,7 @@ module Net
981
868
  #
982
869
  # Returns a ContentDisposition object giving the content
983
870
  # disposition, as defined by
984
- # [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
871
+ # [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
985
872
 
986
873
  ##
987
874
  # method: language
@@ -1026,7 +913,8 @@ module Net
1026
913
  # for something else?
1027
914
  #++
1028
915
  def media_subtype
1029
- warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
916
+ warn("media_subtype is obsolete, use subtype instead.\n",
917
+ uplevel: 1, category: :deprecated)
1030
918
  return subtype
1031
919
  end
1032
920
  end
@@ -1049,6 +937,7 @@ module Net
1049
937
  :description, :encoding, :size,
1050
938
  :lines,
1051
939
  :md5, :disposition, :language,
940
+ :location,
1052
941
  :extension)
1053
942
  include BodyStructure
1054
943
 
@@ -1070,7 +959,8 @@ module Net
1070
959
  # generate a warning message to +stderr+, then return
1071
960
  # the value of +subtype+.
1072
961
  def media_subtype
1073
- warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
962
+ warn("media_subtype is obsolete, use subtype instead.\n",
963
+ uplevel: 1, category: :deprecated)
1074
964
  return subtype
1075
965
  end
1076
966
  end
@@ -1088,12 +978,12 @@ module Net
1088
978
  # * description[rdoc-ref:BodyTypeBasic#description]
1089
979
  # * encoding[rdoc-ref:BodyTypeBasic#encoding]
1090
980
  # * size[rdoc-ref:BodyTypeBasic#size]
1091
- #
1092
981
  class BodyTypeMessage < Struct.new(:media_type, :subtype,
1093
982
  :param, :content_id,
1094
983
  :description, :encoding, :size,
1095
984
  :envelope, :body, :lines,
1096
985
  :md5, :disposition, :language,
986
+ :location,
1097
987
  :extension)
1098
988
  include BodyStructure
1099
989
 
@@ -1126,75 +1016,12 @@ module Net
1126
1016
  end
1127
1017
  end
1128
1018
 
1129
- # === WARNING
1130
- # BodyTypeAttachment represents a <tt>body-fld-dsp</tt> that is
1131
- # incorrectly in a position where the IMAP4rev1 grammar expects a nested
1132
- # +body+ structure.
1133
- #
1134
- # >>>
1135
- # \IMAP body structures are parenthesized lists and assign their fields
1136
- # positionally, so missing fields change the intepretation of all
1137
- # following fields. Buggy \IMAP servers sometimes leave fields missing
1138
- # rather than empty, which inevitably confuses parsers.
1139
- # BodyTypeAttachment was an attempt to parse a common type of buggy body
1140
- # structure without crashing.
1141
- #
1142
- # Currently, when Net::IMAP::ResponseParser sees "attachment" as the first
1143
- # entry in a <tt>body-type-1part</tt>, which is where the MIME type should
1144
- # be, it uses BodyTypeAttachment to capture the rest. "attachment" is not
1145
- # a valid MIME type, but _is_ a common <tt>Content-Disposition</tt>. What
1146
- # might have happened was that buggy server could not parse the message
1147
- # (which might have been incorrectly formatted) and output a
1148
- # <tt>body-type-dsp</tt> where a Net::IMAP::ResponseParser expected to see
1149
- # a +body+.
1150
- #
1151
- # A future release will replace this, probably with a ContentDisposition
1152
- # nested inside another body structure object, maybe BodyTypeBasic, or
1153
- # perhaps a new body structure class that represents any unparsable body
1154
- # structure.
1155
- #
1156
- class BodyTypeAttachment < Struct.new(:dsp_type, :_unused_, :param)
1157
- include BodyStructure
1158
-
1159
- # *invalid for BodyTypeAttachment*
1160
- def media_type
1161
- warn(<<~WARN, uplevel: 1)
1162
- BodyTypeAttachment#media_type is obsolete. Use dsp_type instead.
1163
- WARN
1164
- dsp_type
1165
- end
1166
-
1167
- # *invalid for BodyTypeAttachment*
1168
- def subtype
1169
- warn("BodyTypeAttachment#subtype is obsolete.\n", uplevel: 1)
1170
- nil
1171
- end
1172
-
1173
- ##
1174
- # method: dsp_type
1175
- # :call-seq: dsp_type -> string
1176
- #
1177
- # Returns the content disposition type, as defined by
1178
- # [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
1179
-
1180
- ##
1181
- # method: param
1182
- # :call-seq: param -> hash
1183
- #
1184
- # Returns a hash representing parameters of the Content-Disposition
1185
- # field, as defined by [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
1186
-
1187
- ##
1188
- def multipart?
1189
- return false
1190
- end
1191
- end
1192
-
1193
1019
  # Net::IMAP::BodyTypeMultipart represents body structures of messages and
1194
1020
  # message parts, when <tt>Content-Type</tt> is <tt>multipart/*</tt>.
1195
1021
  class BodyTypeMultipart < Struct.new(:media_type, :subtype,
1196
1022
  :parts,
1197
1023
  :param, :disposition, :language,
1024
+ :location,
1198
1025
  :extension)
1199
1026
  include BodyStructure
1200
1027
 
@@ -1209,7 +1036,7 @@ module Net
1209
1036
  # call-seq: subtype -> string
1210
1037
  #
1211
1038
  # Returns the content subtype name
1212
- # as defined in [MIME-IMB[https://tools.ietf.org/html/rfc2045]].
1039
+ # as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
1213
1040
 
1214
1041
  ##
1215
1042
  # method: parts
@@ -1223,7 +1050,7 @@ module Net
1223
1050
  # call-seq: param -> hash
1224
1051
  #
1225
1052
  # Returns a hash that represents parameters
1226
- # as defined in [MIME-IMB[https://tools.ietf.org/html/rfc2045]].
1053
+ # as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
1227
1054
 
1228
1055
  ##
1229
1056
  # method: disposition
@@ -1260,28 +1087,11 @@ module Net
1260
1087
  # generate a warning message to +stderr+, then return
1261
1088
  # the value of +subtype+.
1262
1089
  def media_subtype
1263
- warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
1090
+ warn("media_subtype is obsolete, use subtype instead.\n",
1091
+ uplevel: 1, category: :deprecated)
1264
1092
  return subtype
1265
1093
  end
1266
1094
  end
1267
1095
 
1268
- # === WARNING:
1269
- # >>>
1270
- # BodyTypeExtension is (incorrectly) used for <tt>message/*</tt> parts
1271
- # (besides <tt>message/rfc822</tt>, which correctly uses BodyTypeMessage).
1272
- #
1273
- # A future release will replace this class with:
1274
- # * BodyTypeMessage for <tt>message/rfc822</tt> and <tt>message/global</tt>
1275
- # * BodyTypeBasic for any other <tt>message/*</tt>
1276
- class BodyTypeExtension < Struct.new(:media_type, :subtype,
1277
- :params, :content_id,
1278
- :description, :encoding, :size)
1279
- include BodyStructure
1280
-
1281
- def multipart?
1282
- return false
1283
- end
1284
- end
1285
-
1286
1096
  end
1287
1097
  end