RFC 9208: IMAP QUOTA Extension
- A. Melnikov
Abstract
This document defines a QUOTA extension of the Internet Message Access Protocol (IMAP) (see RFCs 3501 and 9051) that permits administrative limits on resource usage (quotas) to be manipulated through the IMAP protocol.¶
This document obsoletes RFC 2087 but attempts to remain backwards compatible whenever possible.¶
Status of This Memo
This is an Internet Standards Track document.¶
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 7841.¶
Information about the current status of this document, any
errata, and how to provide feedback on it may be obtained at
https://
Copyright Notice
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://
This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.¶
1. Introduction and Overview
This document defines a couple of extensions to the Internet Message Access Protocol [RFC3501] [RFC9051] for querying and manipulating administrative limits on resource usage (quotas). This extension is compatible with both IMAP4rev1 [RFC3501] and IMAP4rev2 [RFC9051].¶
The "QUOTA" capability denotes a server compliant with [RFC2087]. Some responses and response codes defined in this document are not present in such servers (see Section 10 for more details), and clients MUST NOT rely on their presence in the absence of any capability beginning with "QUOTA=".¶
Any server compliant with this document MUST also return at least one capability starting with the "QUOTA=RES-" prefix, as described in Section 3.1.¶
Any server compliant with this document that implements the SETQUOTA command (see Section 4.1.3) MUST also return the "QUOTASET" capability.¶
This document also reserves all other capabilities starting with the "QUOTA=" prefix for future IETF Stream Standard Track, Informational, or Experimental extensions to this document.¶
Quotas can be used to restrict clients for administrative reasons, but the QUOTA extension can also be used to indicate system limits and current usage levels to clients.¶
Although the IMAP4 QUOTA extension specified in [RFC2087] has seen deployment in servers, it has seen little deployment in clients. Since the meaning of the resources was implementation dependent, it was impossible for a client implementation to determine which resources were supported, and it was impossible to determine which mailboxes were in a given quota root (see Section 3.2) without a priori knowledge of the implementation.¶
2. Document Conventions
In protocol examples, this document uses a prefix of "C: " to denote lines sent by the client to the server and "S: " for lines sent by the server to the client. Lines prefixed with "//" are comments explaining the previous protocol line. These prefixes and comments are not part of the protocol. Lines without any of these prefixes are continuations of the previous line, and no line break is present in the protocol before such lines unless specifically mentioned.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Other capitalized words are IMAP keywords [RFC3501] [RFC9051] or keywords from this document.¶
3. Terms
3.1. Resource
A resource has a name, a formal definition.¶
3.1.1. Name
The resource name is an atom, as defined in IMAP4rev1 [RFC3501]. These MUST be registered with IANA.¶
Supported resource names MUST be advertised as a capability by prepending the resource name with "QUOTA=RES-". A server compliant with this specification is not required to support all reported resource types on all quota roots.¶
3.1.2. Definition
The resource definition or document containing it, while not visible through the protocol, SHOULD be registered with IANA.¶
The usage of a resource MUST be represented as a 63-bit unsigned integer. 0 indicates that the resource is exhausted. Usage integers don't necessarily represent proportional use, so clients MUST NOT compare an available resource between two separate quota roots on the same or different servers.¶
Limits will be specified as, and MUST be represented as, an integer. 0 indicates that any usage is prohibited.¶
Limits may be hard or soft; that is, an implementation MAY choose, or be configured, to disallow any command if the limit on a resource is or would be exceeded.¶
All resources that the server handles MUST be
advertised in a CAPABILITY response
The resources STORAGE (Section 5.1), MESSAGE (Section 5.2), MAILBOX (Section 5.3), and ANNOTATION
3.2. Quota Root
This document introduces the concept of a "quota root", as resource limits can apply across multiple IMAP mailboxes.¶
Each mailbox has zero or more implementation
Quota root names need not be mailbox names, nor is there any relationship defined by this document between a quota root name and a mailbox name. A quota root name is an astring, as defined in IMAP4 [RFC3501] [RFC9051]. It SHOULD be treated as an opaque string by any clients.¶
Quota roots are used since not all implementations may be able to calculate usage, or apply quotas, on arbitrary mailboxes or mailbox hierarchies.¶
Not all resources may be limitable or calculable for all quota
roots. Furthermore, not all resources may support all limits; some limits
may be present in the underlying system. A server implementation of
this memo SHOULD advise the client of such inherent
limits, by generating QUOTA (Section 4.2.1) responses, and SHOULD
advise the client of which resources are limitable for a particular
quota root. A SETQUOTA (Section 4.1.3)
command MAY also round a quota limit in an
implementation
Implementation Notes: This means that, for example, under UNIX, a quota root may have a MESSAGE (Section 5.2) quota always set due to the number of inodes available on the filesystem; similarly, STORAGE (Section 5.1) may be rounded to the nearest block and limited by free filesystem space.¶
4. Definitions
4.1. Commands
The following commands exist for manipulation and querying quotas.¶
4.1.1. GETQUOTA
- Arguments:
- quota root¶
- Responses:
-
REQUIRED untagged responses: QUOTA¶
- Result:
-
OK - getquota completed¶
NO - getquota error: no such quota root, permission denied¶
BAD - command unknown or arguments invalid¶
The GETQUOTA command takes the name of a quota root and returns the quota root's resource usage and limits in an untagged QUOTA response. (Names of quota roots applicable to a particular mailbox can be discovered by issuing the GETQUOTAROOT command; see Section 4.1.2.) Note that the server is not required to support any specific resource type (as advertised in the CAPABILITY response, i.e., all capability items with the "QUOTA=RES-" prefix) for any particular quota root.¶
Example:¶
4.1.2. GETQUOTAROOT
- Arguments:
- mailbox name¶
- Responses:
- REQUIRED untagged responses: QUOTAROOT, QUOTA¶
- Result:
-
OK - getquotaroot completed¶
NO - getquotaroot error: permission denied¶
BAD - command unknown or arguments invalid¶
The GETQUOTAROOT command takes a mailbox name and returns the list of quota roots for the mailbox in an untagged QUOTAROOT response. For each listed quota root, it also returns the quota root's resource usage and limits in an untagged QUOTA response.¶
Note that the mailbox name parameter doesn't have to reference an existing mailbox. This can be handy in order to determine which quota root would apply to a mailbox when it gets created.¶
Example:¶
4.1.3. SETQUOTA
- Arguments:
- quota root list of resource limits¶
- Responses:
- untagged responses: QUOTA¶
- Result:
-
OK - setquota completed¶
NO - setquota error: can't set that data¶
BAD - command unknown or arguments invalid¶
Note that unlike other command
The SETQUOTA command takes the name of a mailbox quota root and a list of resource limits. The resource limits for the named quota root are changed to the specified limits. Any previous resource limits for the named quota root are discarded, even resource limits not explicitly listed in the SETQUOTA command. (For example, if the quota root had both STORAGE and MESSAGE limits assigned to the quota root before the SETQUOTA is called and the SETQUOTA only includes the STORAGE limit, then the MESSAGE limit is removed from the quota root.)¶
If the named quota root did not previously exist, an
implementation may optionally create it and change the quota roots
for any number of existing mailboxes in an implementation
If the implementation chooses to change the quota roots for some existing mailboxes, such changes SHOULD be announced with untagged QUOTA responses.¶
Example:¶
4.1.4. New STATUS attributes
The DELETED and DELETED-STORAGE status data items allow for estimation of the amount of resources that could be freed by an EXPUNGE on a mailbox.¶
The DELETED status data item requests the server to return the
number of messages with the \Deleted flag set. The DELETED status data
item is only required to be implemented when the server advertises
the "QUOTA
The DELETED-STORAGE status data item requests the server to
return the amount of storage space that can be reclaimed by
performing EXPUNGE on the mailbox. The server SHOULD
return the exact value; however, it is recognized that the server
may have to do a non-trivial amount of work to calculate it.
If the
calculation of the exact value would take a long time, the server
MAY instead return the sum of the RFC822.SIZE of
the messages with the \Deleted flag set. The DELETED-STORAGE status data
item is only required to be implemented when the server advertises
the "QUOTA
Example:¶
4.2. Responses
The following responses may be sent by the server.¶
4.2.1. QUOTA
This response occurs as a result of a GETQUOTA, GETQUOTAROOT, or SETQUOTA command. The first string is the name of the quota root for which this quota applies.¶
The name is followed by an S-expression format list of the resource usage and limits of the quota root. The list contains zero or more triplets. Each triplet contains a resource name, the current usage of the resource, and the resource limit.¶
Resources not named in the list are not limited in the quota root. Thus, an empty list means there are no administrative resource limits in the quota root.¶
Example:¶
4.3. Response Codes
4.3.1. OVERQUOTA
The OVERQUOTA response code SHOULD be returned in
the tagged NO response to an APPEND
Example 1:¶
The OVERQUOTA response code MAY also be returned in
an untagged NO response in the authenticated or the selected state
when a mailbox exceeds soft quota. For example, such OVERQUOTA
response codes might be sent as a result of an external event (e.g.,
Local Mail Transfer Protocol (LMTP) [RFC2033] delivery or COPY
Example 2:¶
Example 3:¶
5. Resource Type Definitions
The following resource types are defined in this memo. A server supporting a resource type MUST advertise this as a CAPABILITY with a name consisting of the resource name prefixed by "QUOTA=RES-". A server MAY support multiple resource types and MUST advertise all resource types it supports.¶
5.1. STORAGE
"STORAGE" is the physical space estimate, in units of 1024 octets, of the mailboxes governed by the quota root. This MAY not be the same as the sum of the RFC822.SIZE of the messages. Some implementations MAY include metadata sizes for the messages and mailboxes, and other implementations MAY store messages in such a way that the physical space used is smaller, for example, due to use of compression. Additional messages might not increase the usage. Clients MUST NOT use the usage figure for anything other than informational purposes; for example, they MUST NOT refuse to APPEND a message if the limit less the usage is smaller than the RFC822.SIZE divided by 1024 octets of the message, but it MAY warn about such condition.¶
The usage figure may change as a result of performing actions not associated with adding new messages to the mailbox, such as SEARCH, since this may increase the amount of metadata included in the calculations.¶
When the server supports this resource type, it MUST also support the DELETED-STORAGE status data item.¶
Support for this resource MUST be indicated by the
server by advertising the "QUOTA
A resource named the same was also given as an example in [RFC2087]. This document provides a more precise definition.¶
5.2. MESSAGE
"MESSAGE" is the number of messages stored within the mailboxes governed by the quota root. This MUST be an exact number; however, clients MUST NOT assume that a change in the usage indicates a change in the number of messages available, since the quota root may include mailboxes the client has no access to.¶
When the server supports this resource type, it MUST also support the DELETED status data item.¶
Support for this resource MUST be indicated by the
server by advertising the "QUOTA
A resource named the same was also given as an example in [RFC2087]. This document provides a more precise definition.¶
5.3. MAILBOX
"MAILBOX" is the number of mailboxes governed by the quota root. This MUST be an exact number; however, clients MUST NOT assume that a change in the usage indicates a change in the number of mailboxes, since the quota root may include mailboxes the client has no access to.¶
Support for this resource MUST be indicated by the server by advertising the "QUOTA
5.4. ANNOTATION-STORAGE
"ANNOTATION
Support for this resource MUST be indicated by the server by advertising the "QUOTA
6. Interaction with IMAP ACL Extension (RFC 4314)
This section lists [RFC4314] rights required to execute quota-related commands when both RFC 4314 and this document are implemented.¶
See Section 4 of [RFC4314] for conventions used in this table.¶
Legend:¶
- "+":
- The right is required¶
- "*":
- Only one of the rights marked with * is required¶
- "Any":
- At least one of the "l", "r", "i", "k", "x", or "a" rights is required¶
- "Non":
- No rights required to perform the command¶
Note that which permissions are needed in order to perform a GETQUOTAROOT command depends on the quota resource type being requested. For example, a quota on the number of messages (MESSAGE resource type) or total size of messages (STORAGE resource type) requires "r" right on the mailbox in question, since the quota involved would reveal information about the number (or total size) of messages in the mailbox. By comparison, the MAILBOX resource type doesn't require any right.¶
7. Formal Syntax
The following syntax specification uses the Augmented Backus-Naur Form (ABNF) notation as specified in [ABNF].¶
Non-terminals referenced but not defined below are as defined by IMAP4 [RFC3501] [RFC9051].¶
Except as noted otherwise, all alphabetic characters are
case insensitive. The use of uppercase or lowercase characters to define
token strings is for editorial clarity only. Implementations
MUST accept these strings in a case
8. Security Considerations
Implementors should be careful to make sure the implementation of these commands does not violate the site's security policy. The resource usage of other users is likely to be considered confidential information and should not be divulged to unauthorized persons. In particular, no quota information should be disclosed to anonymous users.¶
As for any resource shared across users (for example, a quota root attached to a set of shared mailboxes), a user that can consume or render unusable the resource can affect the resources available to the other users; this might occur, for example, by a user with permission to execute the SETQUOTA setting, which sets an artificially small value.¶
Note that computing resource usage might incur a heavy load on the server. Server implementers should consider implementation techniques that lower the load on servers such as caching of resource usage information or usage of less precise computations when under heavy load.¶
9. IANA Considerations
9.1. Changes/Additions to the IMAP Capabilities Registry
IMAP4 capabilities are registered by publishing a Standards Track or
an IESG-approved Informational or Experimental RFC. The "IMAP Capabilities" registry is
currently located at <https://
IANA has updated the reference for the QUOTA extension to point to this document. IANA has also added the "QUOTA=" prefix and the "QUOTASET" capability to the "IMAP Capabilities" registry with this document as the reference.¶
IANA has added the following notes to the "IMAP Capabilities" registry:¶
The prefix "QUOTA=RES-" is reserved per RFC 9208, Section 9.1. See Section 9.2 of that document for values that follow this prefix.¶
All other capabilities starting with the "QUOTA=" prefix are reserved for future IETF Stream extensions to RFC 9208.¶
9.2. IMAP Quota Resource Type Registry
IANA has created a new registry for IMAP quota resource types. The registration policy for the "IMAP Quota Resource Types" registry is "Specification Required" [RFC8126].¶
When registering a new quota resource type, the registrant needs to provide the following:¶
Designated experts should check that the provided references are
correct, the references describe the quota resource type being registered
in sufficient detail to be implementable, the syntax of any optional
commands
The initial contents of the "IMAP Quota Resource Types" registry are as follows:¶
10. Changes Since RFC 2087
This document is a revision of [RFC2087], and it aims to clarify the meaning of different terms that were used in that RFC. It also provides more examples, gives guidance on allowed server behavior, defines an IANA registry for quota resource types, and provides initial registrations for 4 of them.¶
When compared with [RFC2087], this document defines two more commonly
used resource types, adds an optional OVERQUOTA response code, and
defines two extra STATUS data items ("DELETED" and "DELETED
11. References
11.1. Normative References
- [ABNF]
-
Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, DOI 10
.17487 , , <https:///RFC5234 www >..rfc -editor .org /info /rfc5234 - [RFC2119]
-
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10
.17487 , , <https:///RFC2119 www >..rfc -editor .org /info /rfc2119 - [RFC3501]
-
Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1", RFC 3501, DOI 10
.17487 , , <https:///RFC3501 www >..rfc -editor .org /info /rfc3501 - [RFC4314]
-
Melnikov, A., "IMAP4 Access Control List (ACL) Extension", RFC 4314, DOI 10
.17487 , , <https:///RFC4314 www >..rfc -editor .org /info /rfc4314 - [RFC5257]
-
Daboo, C. and R. Gellens, "Internet Message Access Protocol - ANNOTATE Extension", RFC 5257, DOI 10
.17487 , , <https:///RFC5257 www >..rfc -editor .org /info /rfc5257 - [RFC8174]
-
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10
.17487 , , <https:///RFC8174 www >..rfc -editor .org /info /rfc8174 - [RFC9051]
-
Melnikov, A., Ed. and B. Leiba, Ed., "Internet Message Access Protocol (IMAP) - Version 4rev2", RFC 9051, DOI 10
.17487 , , <https:///RFC9051 www >..rfc -editor .org /info /rfc9051
11.2. Informative References
- [RFC2033]
-
Myers, J., "Local Mail Transfer Protocol", RFC 2033, DOI 10
.17487 , , <https:///RFC2033 www >..rfc -editor .org /info /rfc2033 - [RFC2087]
-
Myers, J., "IMAP4 QUOTA extension", RFC 2087, DOI 10
.17487 , , <https:///RFC2087 www >..rfc -editor .org /info /rfc2087 - [RFC8126]
-
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 8126, DOI 10
.17487 , , <https:///RFC8126 www >..rfc -editor .org /info /rfc8126
Acknowledgments
The editor of this document would like to thank the following people who provided useful comments or participated in discussions that lead to this update of [RFC2087]: John Myers, Cyrus Daboo, Lyndon Nerenberg, Benjamin Kaduk, Roman Danyliw, and Éric Vyncke.¶
This document is a revision of [RFC2087], and it borrows a lot of text from that RFC. Thus, the work of John Myers, the author of [RFC2087], is appreciated.¶
Contributors
Dave Cridland wrote a lot of text in an earlier draft version that became the basis for this document.¶