draft-ietf-extra-imap-fetch-preview-09.txt | draft-ietf-extra-imap-fetch-preview-10.txt | |||
---|---|---|---|---|
EXTRA M. Slusarz | EXTRA M. Slusarz | |||
Internet-Draft Open-Xchange Inc. | Internet-Draft Open-Xchange Inc. | |||
Intended status: Standards Track July 29, 2020 | Intended status: Standards Track September 30, 2020 | |||
Expires: January 30, 2021 | Expires: April 3, 2021 | |||
IMAP4 Extension: Message Preview Generation | IMAP4 Extension: Message Preview Generation | |||
draft-ietf-extra-imap-fetch-preview-09 | draft-ietf-extra-imap-fetch-preview-10 | |||
Abstract | Abstract | |||
This document specifies an Internet Message Access Protocol (IMAP) | This document specifies an Internet Message Access Protocol (IMAP) | |||
protocol extension allowing a client to request a server-generated | protocol extension allowing a client to request a server-generated | |||
abbreviated text representation of message data useful as a | abbreviated text representation of message data useful as a | |||
contextual preview of the entire message. | contextual preview of the entire message. | |||
Status of This Memo | Status of This Memo | |||
skipping to change at page 1, line 33 ¶ | skipping to change at page 1, line 33 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on January 30, 2021. | This Internet-Draft will expire on April 3, 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 3, line 20 ¶ | skipping to change at page 3, line 20 ¶ | |||
will likely strip the markup tags to obtain textual content. | will likely strip the markup tags to obtain textual content. | |||
However, without fetching the entire content of the part, there is no | However, without fetching the entire content of the part, there is no | |||
way to guarantee that sufficient non-tag content will exist unless | way to guarantee that sufficient non-tag content will exist unless | |||
either 1) the entire part is retrieved or 2) an additional partial | either 1) the entire part is retrieved or 2) an additional partial | |||
FETCH is executed when the client determines that it does not possess | FETCH is executed when the client determines that it does not possess | |||
sufficient data from a previous partial FETCH to display an adequate | sufficient data from a previous partial FETCH to display an adequate | |||
representation of the preview. | representation of the preview. | |||
Finally, server generation allows caching in a centralized location. | Finally, server generation allows caching in a centralized location. | |||
Using server-generated previews allows global generation once per | Using server-generated previews allows global generation once per | |||
message, and then cached for the retention period of the source | message, and that preview can be cached for the retention period of | |||
message. Retrieval of message data may be expensive within a server, | the source message. Retrieval of message data may be expensive | |||
for example, so a server can be configured to reduce its storage | within a server, for example, so a server can be configured to reduce | |||
retrieval load by pre-generating preview data. | its storage retrieval load by pre-generating preview data. | |||
A server indicates support for this extension via the "PREVIEW" | A server indicates support for this extension via the "PREVIEW" | |||
capability name. | capability name. | |||
2. Conventions Used In This Document | 2. Conventions Used In This Document | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
skipping to change at page 4, line 15 ¶ | skipping to change at page 4, line 15 ¶ | |||
3. FETCH Data Item | 3. FETCH Data Item | |||
3.1. Command | 3.1. Command | |||
To retrieve a preview for a message, the "PREVIEW" FETCH attribute is | To retrieve a preview for a message, the "PREVIEW" FETCH attribute is | |||
used when issuing a FETCH command. | used when issuing a FETCH command. | |||
3.2. Response | 3.2. Response | |||
The server returns a variable-length string that is the generated | The server returns a variable-length string that is the generated | |||
preview for that message. | preview for that message. This string is intended to be viewed by | |||
the user as a contextual preview of the entire message, and is not | ||||
intended to be interpreted in any way by the client software. | ||||
Example: Retrieving preview information in a SELECTed mailbox | Example: Retrieving preview information in a SELECTed mailbox | |||
C: A1 FETCH 1 (PREVIEW) | C: A1 FETCH 1 (PREVIEW) | |||
S: * 1 FETCH (PREVIEW "Preview text!") | S: * 1 FETCH (PREVIEW "Preview text!") | |||
S: A1 OK FETCH complete. | S: A1 OK FETCH complete. | |||
A server SHOULD strive to generate the same string for a given | A server SHOULD strive to generate the same string for a given | |||
message for each request. However, since previews are understood to | message for each request. However, since previews are understood to | |||
be an approximation of the message data and not a canonical view of | be an approximation of the message data and not a canonical view of | |||
skipping to change at page 4, line 37 ¶ | skipping to change at page 4, line 39 ¶ | |||
immutable for a given message. This relaxed requirement permits a | immutable for a given message. This relaxed requirement permits a | |||
server to offer previews as an option without requiring potentially | server to offer previews as an option without requiring potentially | |||
burdensome storage and/or processing requirements to guarantee | burdensome storage and/or processing requirements to guarantee | |||
immutability for a use case that does not require this strictness. | immutability for a use case that does not require this strictness. | |||
For example, the underlying IMAP server may change due to a system | For example, the underlying IMAP server may change due to a system | |||
software upgrade; an account's state information may be retained in | software upgrade; an account's state information may be retained in | |||
the migration but the new server may generate different PREVIEW text | the migration but the new server may generate different PREVIEW text | |||
than the old server. | than the old server. | |||
It is possible that the server has determined that no meaningful | It is possible that the server has determined that no meaningful | |||
preview text can be generated for a particular message, and that | preview text can be generated for a particular message. Examples of | |||
decision won't change later. Examples of this involve encrypted | this involve encrypted messages, content types the server does not | |||
messages, content types the server does not support previews of, and | support previews of, and other situations where the server is not | |||
other situations where the server is not able to extract information | able to extract information for a preview. In such cases, the server | |||
for a preview. In such cases, the server MUST return a zero-length | MUST return a zero-length string. Clients SHOULD NOT send another | |||
string. Clients SHOULD NOT send another FETCH for a preview for such | FETCH for a preview for such messages. (As discussed previously, | |||
messages. (As discussed previously, preview data is not immutable so | preview data is not immutable so there is chance that at some point | |||
there is chance that at some point in the future the server would be | in the future the server would be able to generate meaningful text. | |||
able to generate meaningful text. However, this scenario is expected | However, this scenario is expected to be rare so a client should not | |||
to be rare so a client should not continually send out requests to | continually send out requests to try to capture this infrequent | |||
try to capture this infrequent occurrence.) | occurrence.) | |||
If the LAZY modifier is used, the server MAY return NIL for the | If the LAZY modifier is used, the server MAY return NIL for the | |||
preview response, indicating that preview generation could not be | preview response, indicating that preview generation could not be | |||
completed without causing undue delay. A server MUST NOT return NIL | completed without causing undue delay. A server MUST NOT return NIL | |||
to a FETCH PREVIEW request made without the LAZY modifier. | to a FETCH PREVIEW request made without the LAZY modifier. | |||
3.3. Preview Text Format | 3.3. Preview Text Format | |||
The generated preview text MUST be treated as text/plain [RFC2046] | The generated preview text MUST be treated as text/plain [RFC2046] | |||
media type data by the client. | media type data by the client. | |||
skipping to change at page 5, line 39 ¶ | skipping to change at page 5, line 41 ¶ | |||
If the preview is not generated based on the body content of the | If the preview is not generated based on the body content of the | |||
message, and the LANGUAGE [RFC5255] extension is supported by the | message, and the LANGUAGE [RFC5255] extension is supported by the | |||
server, the preview text SHOULD be generated according to the | server, the preview text SHOULD be generated according to the | |||
language rules that apply to human-readable text. For example, a | language rules that apply to human-readable text. For example, a | |||
message that consists of a single image MIME part has no human- | message that consists of a single image MIME part has no human- | |||
readable text from which to generate preview information. Instead, | readable text from which to generate preview information. Instead, | |||
the server may wish to output a description that the message contains | the server may wish to output a description that the message contains | |||
an image and describe some attributes of the image, such as image | an image and describe some attributes of the image, such as image | |||
format, size, and filename. This descriptive text is not a product | format, size, and filename. This descriptive text is not a product | |||
of the message body itself but is rather auto-generated data by the | of the message body itself but is rather auto-generated data by the | |||
server, and should thus use the rules defined for human-generated | server, and should thus use the rules defined for human-readable text | |||
text described in the LANGUAGE extension (if supported on the | described in the LANGUAGE extension (if supported on the server). | |||
server). | ||||
4. LAZY Priority Modifier | 4. LAZY Priority Modifier | |||
4.1. LAZY | 4.1. LAZY | |||
The LAZY modifier directs the server to return the preview | The LAZY modifier directs the server to return the preview | |||
representation only if that data can be returned without undue delay | representation only if that data can be returned without undue delay | |||
to the client. | to the client. | |||
If this modifier is used, and the server is unable to return preview | If this modifier is used, and the server is unable to return preview | |||
skipping to change at page 6, line 17 ¶ | skipping to change at page 6, line 17 ¶ | |||
response. | response. | |||
The LAZY modifier MUST be implemented by any server that supports the | The LAZY modifier MUST be implemented by any server that supports the | |||
PREVIEW extension. | PREVIEW extension. | |||
4.2. Client Implementation Advice | 4.2. Client Implementation Advice | |||
Upon opening a mailbox, a client generally performs a FETCH of | Upon opening a mailbox, a client generally performs a FETCH of | |||
message details in order to create a listing to present to the user | message details in order to create a listing to present to the user | |||
(e.g. ENVELOPE data). Using this extension, a client may want to | (e.g. ENVELOPE data). Using this extension, a client may want to | |||
additional display preview information as part of this listing. | additionally display preview information as part of this listing. | |||
Quickly providing the base mailbox listing, with basic message | Quickly providing the base mailbox listing, with basic message | |||
details, is the primary goal of this command as this is required to | details, is the primary goal of this command as this is required to | |||
allow the user to begin interacting with the mailbox. Preview data | allow the user to begin interacting with the mailbox. Preview data | |||
is likely to be of secondary importance; it provides useful context, | is likely to be of secondary importance; it provides useful context, | |||
but it is not necessary to perform message actions. A client can | but it is not necessary to perform message actions. A client can | |||
load unavailable previews in the background and display them | load unavailable previews in the background and display them | |||
asynchronously to the user as the preview data is provided by the | asynchronously to the user as the preview data is provided by the | |||
server. | server. | |||
In this scenario, the client would add the PREVIEW data item, with | In this scenario, the client would add the PREVIEW data item, with | |||
the LAZY modifier, to the list of FETCH items needed to generate the | the LAZY modifier, to the list of FETCH items needed to generate the | |||
mailbox listing. This allows the server to advantageously return | mailbox listing. This allows the server to advantageously return | |||
preview data without blocking the primary goal of quickly returning | preview data without blocking the primary goal of quickly returning | |||
the basic message details used to generate the mailbox listing. | the basic message details used to generate the mailbox listing. | |||
Once this initial FETCH is complete, the client can then issue FETCH | Once this initial FETCH is complete, the client can then issue FETCH | |||
requests, without the LAZY modifier, to load the preview data for the | requests, without the LAZY modifier, to load the PREVIEW data item | |||
messages in which preview data was not returned. It is RECOMMENDED | for the messages in which preview data was not returned. It is | |||
that these FETCH requests be issued in small batches, e.g. 50 | RECOMMENDED that these FETCH requests be issued in small batches, | |||
messages per FETCH command, since preview generation may be expensive | e.g., 50 messages per FETCH command, since preview generation may be | |||
and a single large request may exceed server resource limits. | expensive and a single large request may exceed server resource | |||
limits. | ||||
See Example 2 for an implementation of this strategy. | See Example 2 for an implementation of this strategy. | |||
A client SHOULD NOT continually issue LAZY PREVIEW FETCH commands in | A client SHOULD NOT continually issue LAZY PREVIEW FETCH commands in | |||
a selected mailbox as the server is under no requirement to return | a selected mailbox as the server is under no requirement to return | |||
preview information for this command, which could lead to an | preview information for this command, which could lead to an | |||
unnecessary waste of system and network resources. | unnecessary waste of system and network resources. | |||
5. Examples | 5. Examples | |||
Example 1: Requesting PREVIEW without LAZY modifier. | Example 1: Requesting PREVIEW without LAZY modifier. | |||
skipping to change at page 7, line 24 ¶ | skipping to change at page 7, line 24 ¶ | |||
S: Maecenas hendrerit, lorem non imperdiet pellentesque, nulla | S: Maecenas hendrerit, lorem non imperdiet pellentesque, nulla | |||
S: ligula nullam | S: ligula nullam | |||
S: ) | S: ) | |||
S: A2 OK FETCH complete. | S: A2 OK FETCH complete. | |||
Example 2: Requesting PREVIEW with LAZY modifier, to obtain previews | Example 2: Requesting PREVIEW with LAZY modifier, to obtain previews | |||
during initial mailbox listing if readily available; otherwise, load | during initial mailbox listing if readily available; otherwise, load | |||
previews in background. | previews in background. | |||
C: D1 FETCH 1:4 (ENVELOPE PREVIEW (LAZY)) | C: D1 FETCH 1:4 (ENVELOPE PREVIEW (LAZY)) | |||
S: * 1 FETCH (ENVELOPE ("Wed, 25 Oct 2017 15:03:11 +0000" [...]) | S: * 1 FETCH (ENVELOPE ("Wed, 23 Sep 2020 15:03:11 +0000" [...]) | |||
PREVIEW "Preview text for message 1.") | PREVIEW "Preview text for message 1.") | |||
S: * 2 FETCH (PREVIEW "" ENVELOPE | S: * 2 FETCH (PREVIEW "" ENVELOPE | |||
("Thu, 26 Oct 2017 12:17:23 +0000" [...])) | ("Thu, 24 Sep 2020 12:17:23 +0000" [...])) | |||
S: * 3 FETCH (ENVELOPE ("Fri, 27 Oct 2017 22:19:21 +0000" [...]) | S: * 3 FETCH (ENVELOPE ("Fri, 25 Sep 2020 09:13:45 +0000" [...]) | |||
PREVIEW NIL) | PREVIEW NIL) | |||
S: * 4 FETCH (ENVELOPE ("Sat, 28 Oct 2017 07:11:18 +0000" [...]) | S: * 4 FETCH (ENVELOPE ("Sat, 26 Sep 2020 07:11:18 +0000" [...]) | |||
PREVIEW NIL) | PREVIEW NIL) | |||
S: D1 OK FETCH completed. | S: D1 OK FETCH completed. | |||
[...Client has preview for message 1 and knows that message 2 has | [...Client has preview for message 1 and knows that message 2 has | |||
a preview that is empty; only need to request preview of | a preview that is empty; only need to request preview of | |||
messages 3 & 4 (e.g. in background)...] | messages 3 & 4 (e.g. in background)...] | |||
C: D2 FETCH 3:4 (PREVIEW) | C: D2 FETCH 3:4 (PREVIEW) | |||
S: * 3 FETCH (PREVIEW {30} | S: * 3 FETCH (PREVIEW {30} | |||
S: Message data from message 3. | S: Message data from message 3. | |||
S: ) | S: ) | |||
S: * 4 FETCH (PREVIEW "Message 4 preview") | S: * 4 FETCH (PREVIEW "Message 4 preview") | |||
skipping to change at page 9, line 10 ¶ | skipping to change at page 9, line 10 ¶ | |||
http://www.iana.org/assignments/imap-capabilities | http://www.iana.org/assignments/imap-capabilities | |||
This document requests that IANA adds the "PREVIEW" capability to the | This document requests that IANA adds the "PREVIEW" capability to the | |||
IMAP4 [RFC3501] capabilities registry. | IMAP4 [RFC3501] capabilities registry. | |||
8. Security Considerations | 8. Security Considerations | |||
Implementation of this extension might enable denial-of-service | Implementation of this extension might enable denial-of-service | |||
attacks against server resources, due to excessive memory or CPU | attacks against server resources, due to excessive memory or CPU | |||
usage during preview generation or increased storage usage if preview | usage during preview generation or increased storage usage if preview | |||
results are stored on the server after generation. Servers MAY limit | results are stored on the server after generation. In order to | |||
the resources that preview generation uses. In order to mitigate | mitigate such attacks, servers SHOULD log the client authentication | |||
such attacks, servers SHOULD log the client authentication identity | identity on FETCH PREVIEW operations in order to facilitate tracking | |||
on FETCH PREVIEW operations in order to facilitate tracking of | of abusive clients. | |||
abusive clients. | ||||
Servers MAY limit the resources that preview generation uses. Such | ||||
resource limitations might, in an extreme example, cause a server to | ||||
return a preview that is the empty string for a message that | ||||
otherwise would have had a non-empty preview. However, it is | ||||
recommended that at least some preview text be provided in this | ||||
situation, even if the quality of the preview is degraded. | ||||
Just as the messages they summarize, preview data may contain | Just as the messages they summarize, preview data may contain | |||
sensitive information. If generated preview data is stored on the | sensitive information. If generated preview data is stored on the | |||
server, e.g. for caching purposes, these previews MUST be protected | server, e.g. for caching purposes, these previews MUST be protected | |||
with equivalent authorization and confidentiality controls as the | with equivalent authorization and confidentiality controls as the | |||
source message. | source message. | |||
9. References | 9. References | |||
9.1. Normative References | 9.1. Normative References | |||
skipping to change at page 13, line 19 ¶ | skipping to change at page 13, line 26 ¶ | |||
o Remove algorithm selection; PREVIEW always returns text in format | o Remove algorithm selection; PREVIEW always returns text in format | |||
defined in Section 3.3 | defined in Section 3.3 | |||
Changes from draft-ietf-extra-imap-fetch-preview-08: | Changes from draft-ietf-extra-imap-fetch-preview-08: | |||
o FETCH PREVIEW without LAZY modifier MUST NOT return NIL | o FETCH PREVIEW without LAZY modifier MUST NOT return NIL | |||
o Improve client implementation advice for LAZY modifier | o Improve client implementation advice for LAZY modifier | |||
Changes from draft-ietf-extra-imap-fetch-preview-09: | ||||
o Clarified that string response is to be interpreted by user, not | ||||
the client | ||||
o Give example behavior of resource limitation | ||||
o Various editorial fixes | ||||
Acknowledgments | Acknowledgments | |||
The author would like to thank the following people for their | The author would like to thank the following people for their | |||
comments and contributions to this document: Stephan Bosch, Bron | comments and contributions to this document: Stephan Bosch, Bron | |||
Gondwana, Teemu Huovila, Neil Jenkins, Steffen Lehmann, Barry Leiba, | Gondwana, Teemu Huovila, Neil Jenkins, Steffen Lehmann, Barry Leiba, | |||
Alexey Melnikov, Chris Newman, Pete Resnick, Jeff Sipek, Timo | Alexey Melnikov, Chris Newman, Pete Resnick, Jeff Sipek, Timo | |||
Sirainen, Steffen Templin, and Aki Tuomi. | Sirainen, Steffen Templin, and Aki Tuomi. | |||
Author's Address | Author's Address | |||
End of changes. 14 change blocks. | ||||
38 lines changed or deleted | 55 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |