<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>


<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" consensus="true" category="std" ipr="pre5378Trust200902" obsoletes="2087" docName="draft-ietf-extra-quota-10" number="9208" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" version="3">


	<front>
    <title abbrev="IMAP QUOTA">
			IMAP QUOTA Extension
    </title>
    <seriesInfo name="RFC" value="9208"/>
    <author initials="A." surname="Melnikov" fullname="Alexey Melnikov">
      <organization abbrev="Isode">
				Isode Limited
      </organization>
      <address>
        <email>alexey.melnikov@isode.com</email>
        <uri>https://www.isode.com</uri>
      </address>
    </author>
    <date month="March" year="2022"/>

    <abstract>
      <t>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.</t>
      <t>This document obsoletes RFC 2087 but attempts to remain backwards
      compatible whenever possible.</t>
    </abstract>
  </front>
  <middle>

    <section numbered="true" toc="default">
      <name>Introduction and Overview</name>

      
      <t>This document defines a couple of extensions to the Internet Message
      Access Protocol <xref target="RFC3501" format="default"/> <xref target="RFC9051" format="default"/> for querying
      and manipulating administrative limits on resource usage (quotas).  This
      extension is compatible with both IMAP4rev1 <xref target="RFC3501"
      format="default"/> and IMAP4rev2 <xref target="RFC9051"
      format="default"/>.</t>
      <t>The "QUOTA" capability denotes a server compliant with <xref
      target="RFC2087" format="default"/>.  Some responses and response codes
      defined in this document are not present in such servers (see <xref
      target="changes-since" format="default"/> for more details), and clients
      <bcp14>MUST NOT</bcp14> rely on their presence in the absence of any
      capability beginning with "QUOTA=".</t>
      <t>Any server compliant with this document <bcp14>MUST</bcp14> also
      return at least one capability starting with the "QUOTA=RES-" prefix, as
      described in <xref target="Quota-Resource" format="default"/>.</t>
      <t>Any server compliant with this document that implements the SETQUOTA
      command (see <xref target="SETQUOTA" format="default"/>)
      <bcp14>MUST</bcp14> also return the "QUOTASET" capability.
      </t>
      <t>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.</t>
      <t>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.</t>
      
      <t>Although the IMAP4 QUOTA extension specified in <xref target="RFC2087" format="default"></xref> 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
      <xref target="quota-root" format="default"/>) without a priori knowledge
      of the implementation.</t>
    </section>
    <section numbered="true" toc="default">
      <name>Document Conventions</name>
      
      <t>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.</t>

        <t>
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
    NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are
    to be interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/>
    <xref target="RFC8174"/> when, and only when, they appear in all capitals,
    as shown here.
        </t>

     
      <t>Other capitalized words are IMAP keywords <xref target="RFC3501"
      format="default"/> <xref target="RFC9051" format="default"/> or keywords
      from this document.</t>
    </section>
    <section numbered="true" toc="default">
      <name>Terms</name>
      <section anchor="Quota-Resource" numbered="true" toc="default">
        <name>Resource</name>
        <t>A resource has a name, a formal definition.</t>
        <section numbered="true" toc="default">
          <name>Name</name>
          <t>The resource name is an atom, as defined in <xref
          target="RFC3501" format="default">IMAP4rev1</xref>. These
          <bcp14>MUST</bcp14> be registered with IANA.</t>
          <t>Supported resource names <bcp14>MUST</bcp14> 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.</t>
        </section>
        <section numbered="true" toc="default">
          <name>Definition</name>
          <t>The resource definition or document containing it, while not
          visible through the protocol, <bcp14>SHOULD</bcp14> be registered
          with IANA.</t>
          <t>The usage of a resource <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> compare an available resource
          between two separate quota roots on the same or different
          servers.</t>
          <t>Limits will be specified as, and <bcp14>MUST</bcp14> be
          represented as, an integer. 0 indicates that any usage is
          prohibited.</t>
          <t>Limits may be hard or soft; that is, an implementation
          <bcp14>MAY</bcp14> choose, or be configured, to disallow any command
          if the limit on a resource is or would be exceeded.</t>
          <t>All resources that the server handles <bcp14>MUST</bcp14> be
          advertised in a CAPABILITY response/response code consisting of the
          resource name prefixed by "QUOTA=RES-".
          </t>
          <t>The resources <xref target="STORAGE"
          format="default">STORAGE</xref>, <xref target="MESSAGE"
          format="default">MESSAGE</xref>, <xref target="MAILBOX"
          format="default">MAILBOX</xref>, and <xref
          target="ANNOTATION-STORAGE"
          format="default">ANNOTATION-STORAGE</xref> are defined in this
          document.</t>
        </section>
      </section>
      <section anchor="quota-root" numbered="true" toc="default">
        <name>Quota Root</name>
        <t>This document introduces the concept of a "quota root", as resource
        limits can apply across multiple IMAP mailboxes.</t>
        <t>Each mailbox has zero or more implementation-defined named "quota
        roots".  Each quota root has zero or more resource limits
        (quotas). All mailboxes that share the same named quota root share the
        resource limits of the quota root.</t>
        <t>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 <xref
        target="RFC3501" format="default">IMAP4</xref> <xref target="RFC9051"          
format="default"/>. It <bcp14>SHOULD</bcp14> be treated as an opaque string by any
        clients.</t>

	<t>Quota roots are used since not all implementations may be able to
	calculate usage, or apply quotas, on arbitrary mailboxes or mailbox
	hierarchies.</t>
        <t>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 <bcp14>SHOULD</bcp14> advise the client of such inherent
        limits, by generating <xref target="QUOTA"
        format="default">QUOTA</xref> responses, and <bcp14>SHOULD</bcp14>
        advise the client of which resources are limitable for a particular
        quota root. A <xref target="SETQUOTA" format="default">SETQUOTA</xref>
        command <bcp14>MAY</bcp14> also round a quota limit in an
        implementation-dependent way, if the granularity of the underlying
        system demands it. A client <bcp14>MUST</bcp14> be prepared for a
        <xref target="SETQUOTA" format="default">SETQUOTA</xref> command to
        fail if a limit cannot be set.</t>
        <t>Implementation Notes: This means that, for example, under UNIX, a
        quota root may have a <xref target="MESSAGE"
        format="default">MESSAGE</xref> quota always set due to the number of
        inodes available on the filesystem; similarly, <xref target="STORAGE"
        format="default">STORAGE</xref> may be rounded to the nearest block
        and limited by free filesystem space.
        </t>
      </section>


    </section>
    <section numbered="true" toc="default">
      <name>Definitions</name>
      <section numbered="true" toc="default">
        <name>Commands</name>
        <t>The following commands exist for manipulation and querying quotas.</t>
        <section anchor="GETQUOTA" numbered="true" toc="default">
          <name>GETQUOTA</name>
          <dl newline="false" spacing="normal" indent="12">
            <dt>Arguments:</dt>
            <dd>quota root</dd>
            <dt>Responses:</dt>
            <dd>
              <t><bcp14>REQUIRED</bcp14> untagged responses: QUOTA</t>
            </dd>
            <dt>Result:   </dt>
            <dd>
              <t>OK - getquota completed</t>
              <t>NO - getquota error: no such quota root, permission
              denied</t>
              <t>BAD - command unknown or arguments invalid</t>
            </dd>
          </dl>
          <t>
            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
            <xref target="GETQUOTAROOT" format="default"/>.)  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.</t>
	    
<t>Example:</t>	    

<sourcecode type=""><![CDATA[           
   S: * CAPABILITY [...] QUOTA QUOTA=RES-STORAGE [...]
             
   [...]
             
   C: G0001 GETQUOTA "!partition/sda4"
             
   S: * QUOTA "!partition/sda4" (STORAGE 104 10923847)
            
   S: G0001 OK Getquota complete
 ]]></sourcecode>
         

</section>
        <section anchor="GETQUOTAROOT" numbered="true" toc="default">
          <name>GETQUOTAROOT</name>

	  <dl indent="12">
	    <dt>Arguments:
	    </dt>
	    <dd>mailbox name
	    </dd>

	    	    <dt>Responses:
	    </dt>
	    <dd><bcp14>REQUIRED</bcp14> untagged responses: QUOTAROOT, QUOTA
	    </dd>

	    	    <dt>Result:
	    </dt>
	    <dd>
	      <t>OK - getquotaroot completed
	      </t>
	      <t>NO - getquotaroot error: permission denied
              </t>
              <t>BAD - command unknown or arguments invalid
	      </t>
	    </dd>
</dl>

<t>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.</t>
          <t>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.</t>

<t>Example:</t>
<sourcecode type=""><![CDATA[ 
   S: * CAPABILITY [...] QUOTA QUOTA=RES-STORAGE QUOTA=RES-MESSAGE 
   [...]
             
   [...]
             
   C: G0002 GETQUOTAROOT INBOX
             
   S: * QUOTAROOT INBOX "#user/alice" "!partition/sda4"
              
   S: * QUOTA "#user/alice" (MESSAGE 42 1000)
            
   S: * QUOTA "!partition/sda4" (STORAGE 104 10923847)
             
   S: G0002 OK Getquotaroot complete
         ]]></sourcecode>

</section>
        <section anchor="SETQUOTA" numbered="true" toc="default">
          <name>SETQUOTA</name>


<dl indent="12">
            <dt>Arguments:                                                                                     
            </dt>
            <dd>quota root list of resource limits
            </dd>

                    <dt>Responses:                                                                             
            </dt>
            <dd>untagged responses: QUOTA
            </dd>

                    <dt>Result:                                                                                
            </dt>
            <dd>
              <t>OK - setquota completed
              </t>
              <t>NO - setquota error: can't set that data
              </t>
              <t>BAD - command unknown or arguments invalid
              </t>
            </dd>
</dl>



<t>Note that unlike other command/responses/response codes defined in this document,
          support for the SETQUOTA command requires the server to advertise the "QUOTASET" capability.</t>
          <t>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.)</t>
          <t>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-defined
          manner.</t>
          <t>
          If the implementation chooses to change the quota roots for some
          existing mailboxes, such changes <bcp14>SHOULD</bcp14> be announced
          with untagged QUOTA responses.
          </t>

	  <t>Example:</t>

<sourcecode type=""><![CDATA[        
   S: * CAPABILITY [...] QUOTA QUOTASET QUOTA=RES-STORAGE QUOTA=RES-
   MESSAGE [...]
             
   [...]
             
   C: S0000 GETQUOTA "#user/alice"
             
   S: * QUOTA "#user/alice" (STORAGE 54 111 MESSAGE 42 1000)
              
   S: S0000 OK Getquota completed
              
   C: S0001 SETQUOTA "#user/alice" (STORAGE 510)
             
   S: * QUOTA "#user/alice" (STORAGE 58 512)
            
   // The server has rounded the STORAGE quota limit requested to
   the nearest 512 blocks of 1024 octets; otherwise, another client
   has performed a near-simultaneous SETQUOTA using a limit of 512.
           
   S: S0001 OK Rounded quota
            
   C: S0002 SETQUOTA "!partition/sda4" (STORAGE 99999999)
             
   S: * QUOTA "!partition/sda4" (STORAGE 104 10923847)
            
   // The server has not changed the quota, since this is a 
   filesystem limit, and it cannot be changed. The QUOTA 
   response here is entirely optional.

   S: S0002 NO Cannot change system limit
 ]]></sourcecode>


</section>


	<section anchor="STATUS_RECOVERABLE" numbered="true" toc="default">
          <name>New STATUS attributes</name>

<t>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.
</t>

	  <t>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=RES-MESSAGE" capability.</t>
          <t>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 <bcp14>SHOULD</bcp14>
          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
          <bcp14>MAY</bcp14> 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=RES-STORAGE" capability.</t>

	  <t> Example:</t>
	  
<sourcecode type=""><![CDATA[      
   S: * CAPABILITY [...] QUOTA QUOTA=RES-STORAGE QUOTA=RES-
   MESSAGE [...]
              
   [...]
             
   C: S0003 STATUS INBOX (MESSAGES DELETED DELETED-STORAGE)
             
   S: * STATUS INBOX (MESSAGES 12 DELETED 4 DELETED-STORAGE 8)
            
   // 12 messages, 4 of which would be deleted when an EXPUNGE 
   happens.

   S: S0003 OK Status complete.
       ]]></sourcecode>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Responses</name>
        <t>The following responses may be sent by the server.</t>
        <section anchor="QUOTA" numbered="true" toc="default">
          <name>QUOTA</name>
          <ul empty="true" spacing="normal">
            <li>
              <t>Data:	quota root name</t>
              <t>list of resource names, usages, and limits</t>
            </li>
          </ul>
          <t>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.</t>
          <t>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.</t>
          <t>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.</t>
<t>Example:</t>
<sourcecode type=""><![CDATA[
   S: * QUOTA "" (STORAGE 10 512)
      ]]></sourcecode>	  
        </section>
        <section anchor="QUOTAROOT" numbered="true" toc="default">
          <name>QUOTAROOT</name>
          <ul empty="true" spacing="normal">
            <li>
              <t>Data:	mailbox name</t>
              <t>zero or more quota root names</t>
            </li>
          </ul>
	  
<t>This response occurs as a result of a GETQUOTAROOT command.  The first string is the mailbox and the remaining strings are the names of the quota roots for the mailbox.</t>

<t>Examples:</t>
<sourcecode type=""><![CDATA[
   S: * QUOTAROOT INBOX ""

   // The INBOX mailbox is covered by a single quota root with 
   name "".

   S: * QUOTAROOT comp.mail.mime

   // The comp.mail.mime mailbox has no quota root associated 
   with it, but one can be created.
]]></sourcecode>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Response Codes</name>
        <section anchor="OVERQUOTA" numbered="true" toc="default">
          <name>OVERQUOTA</name>
          <t>The OVERQUOTA response code <bcp14>SHOULD</bcp14> be returned in
          the tagged NO response to an APPEND/COPY/MOVE when the addition of
          the message(s) puts the target mailbox over any one of its quota
          limits.</t>
	  
<t>Example 1:</t>
<sourcecode type=""><![CDATA[
   C: A003 APPEND saved-messages (\Seen) {326}
   S: + Ready for literal data
   C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
   C: From: Fred Foobar <foobar@Blurdybloop.example>
   C: Subject: afternoon meeting
   C: To: mooch@owatagu.siam.edu.example
   C: Message-Id: <B27397-0100000@Blurdybloop.example>
   C: MIME-Version: 1.0
   C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
   C:
   C: Hello Joe, do you think we can meet at 3:30 tomorrow?
   C:
   S: A003 NO [OVERQUOTA] APPEND Failed
]]></sourcecode>

          <t>
          The OVERQUOTA response code <bcp14>MAY</bcp14> 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) <xref target="RFC2033"/> delivery or COPY/MOVE/APPEND in
          another IMAP connection) that causes the currently selected mailbox
          to exceed soft quota.

          Note that such an OVERQUOTA response code might be ambiguous because it
          might relate to the target mailbox (as specified in COPY/MOVE/APPEND)
          or to the currently selected mailbox.

	  (The EXTRA WG chose not to address this deficiency
          due to syntactic limitations of IMAP response codes and because such events
          are likely to be rare.)

          This form of the OVERQUOTA response codes <bcp14>MUST NOT</bcp14> be returned if there is
          no mailbox selected and no command in progress that adds a message to
          a mailbox (e.g., APPEND).
          </t>
<t>Example 2:</t>
<sourcecode type=""><![CDATA[
   C: A003 APPEND saved-messages (\Seen) {326}
   S: + Ready for literal data
   C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
   C: From: Fred Foobar <foobar@Blurdybloop.example>
   C: Subject: afternoon meeting
   C: To: mooch@owatagu.siam.edu.example
   C: Message-Id: <B27397-0100000@Blurdybloop.example>
   C: MIME-Version: 1.0
   C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
   C:
   C: Hello Joe, do you think we can meet at 3:30 tomorrow?
   C:
   S: * NO [OVERQUOTA] Soft quota has been exceeded
   S: A003 OK [APPENDUID 38505 3955] APPEND completed
]]></sourcecode>

<t>Example 3:</t>
<sourcecode type=""><![CDATA[
   C: A004 COPY 2:4 MEETING
   S: * NO [OVERQUOTA] Soft quota has been exceeded
   S: A004 OK [COPYUID 38505 304,319:320 3956:3958] COPY 
       command completed
]]></sourcecode>
        </section>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>Resource Type Definitions</name>
      <t>The following resource types are defined in this memo. A server
      supporting a resource type <bcp14>MUST</bcp14> advertise this as a
      CAPABILITY with a name consisting of the resource name prefixed by
      "QUOTA=RES-". A server <bcp14>MAY</bcp14> support multiple resource
      types and <bcp14>MUST</bcp14> advertise all resource types it
      supports.</t>

      <section anchor="STORAGE" numbered="true" toc="default">
        <name>STORAGE</name>
        <t>"STORAGE" is the physical space estimate, in units of 1024 octets, of the
        mailboxes governed by the quota root.  This <bcp14>MAY</bcp14> not be
        the same as the sum of the RFC822.SIZE of the messages.  Some
        implementations <bcp14>MAY</bcp14> include metadata sizes for the
        messages and mailboxes, and other implementations <bcp14>MAY</bcp14> 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 <bcp14>MUST NOT</bcp14> use the usage
        figure for anything other than informational purposes; for example,
        they <bcp14>MUST NOT</bcp14> 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 <bcp14>MAY</bcp14> warn about such condition.</t>
        <t>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.</t>
	
        <t>When the server supports this resource type, it <bcp14>MUST</bcp14>
        also support the DELETED-STORAGE status data item.</t>
        <t>Support for this resource <bcp14>MUST</bcp14> be indicated by the
        server by advertising the "QUOTA=RES-STORAGE" capability.</t>
        <t>A resource named the same was also given as an example in <xref
        target="RFC2087" format="default"></xref>.  This document
        provides a more precise definition.</t>
      </section>
      <section anchor="MESSAGE" numbered="true" toc="default">
        <name>MESSAGE</name>
        <t>"MESSAGE" is the number of messages stored within the mailboxes governed by the
        quota root. This <bcp14>MUST</bcp14> be an exact number; however,
        clients <bcp14>MUST NOT</bcp14> 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.
	
        </t>
        <t>When the server supports this resource type, it <bcp14>MUST</bcp14>
        also support the DELETED status data item.</t>
        <t>Support for this resource <bcp14>MUST</bcp14> be indicated by the
        server by advertising the "QUOTA=RES-MESSAGE" capability.</t>
        <t>A resource named the same was also given as an example in <xref
        target="RFC2087" format="default"></xref>.  This document
        provides a more precise definition.</t>
      </section>
      <section anchor="MAILBOX" numbered="true" toc="default">
        <name>MAILBOX</name>
        <t>"MAILBOX" is the number of mailboxes governed by the quota root. This
        <bcp14>MUST</bcp14> be an exact number; however, clients <bcp14>MUST
        NOT</bcp14> 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.
	
        </t>
        <t>Support for this resource <bcp14>MUST</bcp14> be indicated by the server by advertising the "QUOTA=RES-MAILBOX" capability.</t>
      </section>
      <section anchor="ANNOTATION-STORAGE" numbered="true" toc="default">
        <name>ANNOTATION-STORAGE</name>
        <t>
        "ANNOTATION-STORAGE" is the maximum size of all annotations <xref target="RFC5257" format="default"/>, in units of 1024 octets, associated with all messages in the mailboxes governed by the quota root.
        </t>
        <t>Support for this resource <bcp14>MUST</bcp14> be indicated by the server by advertising the "QUOTA=RES-ANNOTATION-STORAGE" capability.</t>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>Interaction with IMAP ACL Extension (RFC 4314)</name>
      <t>This section lists <xref target="RFC4314" format="default"/> rights
      required to execute quota-related commands when both RFC 4314 and this
      document are implemented.</t>
      <table align="center">
        <thead>
          <tr>
            <th align="left">Operations\Rights</th>
            <th align="center">l</th>
            <th align="center">r</th>
            <th align="center">s</th>
            <th align="center">w</th>
            <th align="center">i</th>
            <th align="center">c</th>
            <th align="center">x</th>
            <th align="center">t</th>
            <th align="center">e</th>
            <th align="center">a</th>
            <th align="center">Any</th>
            <th align="center">Non</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">GETQUOTA</td>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center">+</td>
          </tr>
          <tr>
            <td align="left">GETQUOTAROOT</td>
            <td align="center"/>
            <td align="center">*</td>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center">*</td>
          </tr>
          <tr>
            <td align="left">SETQUOTA</td>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center"/>
            <td align="center">+</td>
            <td align="center"/>
            <td align="center"/>
          </tr>
        </tbody>
      </table>
      <t keepWithPrevious="true">See <xref target="RFC4314" sectionFormat="of"
      section="4"/> for conventions used in this table.</t>
      <t>Legend:
      </t>
      <dl newline="false" spacing="normal" indent="8">
        <dt>"+":</dt>
        <dd>The right is required</dd>
        <dt>"*":</dt>
        <dd>Only one of the rights marked with * is required</dd>
        <dt>"Any":</dt>
        <dd>At least one of the "l", "r", "i", "k", "x", or "a" rights is required</dd>
        <dt>"Non":</dt>
        <dd>No rights required to perform the command</dd>
      </dl>
      <t>
      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.
      </t>
    </section>
    <section numbered="true" toc="default">
      <name>Formal Syntax</name>
      <t>The following syntax specification uses the Augmented Backus-Naur
      Form (ABNF) notation as specified in <xref target="RFC5234"
      format="default"/>.</t>
      <t>Non-terminals referenced but not defined below are as defined by <xref target="RFC3501" format="default">IMAP4</xref> <xref target="RFC9051"          
format="default"/>.</t>
      <t>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
      <bcp14>MUST</bcp14> accept these strings in a case-insensitive
      fashion.</t>

      
      <sourcecode type="abnf"><![CDATA[                                             
getquota =         "GETQUOTA" SP quota-root-name

getquotaroot =     "GETQUOTAROOT" SP mailbox

quota-list =       "(" quota-resource *(SP quota-resource) ")"

quota-resource =   resource-name SP resource-usage SP resource-limit

quota-response =   "QUOTA" SP quota-root-name SP quota-list

quotaroot-response =  "QUOTAROOT" SP mailbox *(SP quota-root-name)

setquota =         "SETQUOTA" SP quota-root-name SP setquota-list

setquota-list =    "(" [setquota-resource *(SP setquota-resource)]
                   ")"

setquota-resource =  resource-name SP resource-limit

quota-root-name =  astring

resource-limit =   number64

resource-name =    "STORAGE" / "MESSAGE" / "MAILBOX" /
                   "ANNOTATION-STORAGE" / resource-name-ext

resource-name-ext =  atom
                   ;; Future resource registrations

resource-usage =  number64
                   ;; must be less than corresponding resource-limit

capability-quota = capa-quota-res / "QUOTASET"
                   ;; One or more capa-quota-res must be returned.
                   ;; Also "QUOTASET" can optionally be returned.

capa-quota-res =   "QUOTA=RES-" resource-name

status-att =/      "DELETED" / "DELETED-STORAGE"
                   ;; DELETED status data item MUST be supported
                   ;; when the "QUOTA=RES-MESSAGE" capability is
                   ;; advertised.
                   ;; DELETED-STORAGE status data item MUST be
                   ;; supported when the "QUOTA=RES-STORAGE"
                   ;; capability is advertised.

status-att-val =/  status-att-deleted /
                   status-att-deleted-storage

status-att-deleted =  "DELETED" SP number
                   ;; DELETED status data item MUST be supported
                   ;; when the "QUOTA=RES-MESSAGE" capability is
                   ;; advertised.

status-att-deleted-storage =  "DELETED-STORAGE" SP number64
                   ;; DELETED-STORAGE status data item MUST be
                   ;; supported when the "QUOTA=RES-STORAGE" 
                   ;; capability is advertised.

resp-text-code =/  "OVERQUOTA"

number64 =         <Defined in RFC 9051>   
    ]]></sourcecode>


    </section>
    <section numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
      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.
      
      </t>
      <t>
      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.
      </t>
      <t>
      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.
      </t>
    </section>
    <section numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section numbered="true" toc="default" anchor="changes-to-imap">
        <name>Changes/Additions to the IMAP Capabilities Registry</name>
	
        <t>
	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 <eref target="https://www.iana.org/assignments/imap4-capabilities" brackets="angle"/>.
        </t>

<t>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.


</t>
        <t>
 IANA has added the following notes to the "IMAP Capabilities"
   registry:
	</t>


	<t>
The prefix "QUOTA=RES-" is reserved per RFC 9208, <xref target="changes-to-imap"/>. See <xref target="iana-quota-res-types"/> of that document for values that follow this prefix. 

	</t>
	<t>

	  All other capabilities starting with the "QUOTA=" prefix are reserved
      for future IETF Stream extensions to RFC 9208.
	</t>

      </section>
      
      <section anchor="iana-quota-res-types" numbered="true" toc="default">
        <name>IMAP Quota Resource Type Registry</name>
        <t>IANA has created a new registry for IMAP quota resource
        types. The registration policy for the "IMAP Quota Resource Types" registry is "Specification Required"	<xref target="RFC8126" format="default"/>.</t>


<t>When registering a new quota resource type, the registrant needs to provide the following:
</t>
<ul>

  <li> the name of the quota resource type
  </li>

  <li>a short description
  </li>

  <li>extra required IMAP commands/responses (if any)
  </li>

  <li>extra optional IMAP commands/responses (if any)
  </li>

  <li>name and email address of author
  </li>

  <li>name and email address of change controller
  </li>

  <li>a reference to a specification that describes the quota resource type in more detail
  </li>
  
</ul>
	

	<t>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/responses is correct (e.g., ABNF validates), and the
        syntax/description complies with rules and limitations imposed by IMAP
        <xref target="RFC3501" format="default"/> <xref target="RFC9051"
        format="default"/>.  Designated experts should avoid registering
        multiple identical quota resource types under different names and
        should provide advice to requestors about other possible quota
        resource types to use.
        </t>

   <t>
     The initial contents of the "IMAP Quota Resource Types” registry are as follows:
   </t>

<table align="left">
<name>STORAGE</name>
  <thead>
    <tr>
      <th>field name
      </th>
      <th>field value
      </th>
    </tr>
  </thead>
  <tbody>

    <tr>
      <td>Name of the quota resource type:

      </td>
     <td>STORAGE
     </td>
    </tr>


    <tr>
      <td>Description:
      </td>
     <td>The physical space estimate, in units of 1024 octets, of the mailboxes governed by the quota root.
     </td>
    </tr>


    <tr>
      <td>Extra required IMAP commands/responses:
      </td>
     <td>DELETED-STORAGE STATUS request data item and response data item
     </td>
    </tr>


    <tr>
      <td>Extra optional IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Author:
      </td>
     <td>Alexey Melnikov &lt;alexey.melnikov@isode.com&gt;
     </td>
    </tr>


    <tr>
      <td>Change Controller:
      </td>
     <td>IESG &lt;iesg@ietf.org&gt;
     </td>
    </tr>


    <tr>
      <td>Reference:
      </td>
     <td>Section 5.1 of RFC 9208
     </td>
    </tr>

    
</tbody>

</table>



<table align="left">
<name>MESSAGE</name>
  <thead>
    <tr>
      <th>field name
      </th>
      <th>field value
      </th>
    </tr>
  </thead>
  <tbody>

    <tr>
      <td>Name of the quota resource type:
      </td>
     <td>MESSAGE
     </td>
    </tr>


    <tr>
      <td>Description:
      </td>
     <td>The number of messages stored within the mailboxes governed by the quota root.
     </td>
    </tr>


    <tr>
      <td>Extra required IMAP commands/responses:
      </td>
     <td>DELETED STATUS request data item and response data item
     </td>
    </tr>


    <tr>
      <td>Extra optional IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Author:
      </td>
     <td>Alexey Melnikov &lt;alexey.melnikov@isode.com&gt;
     </td>
    </tr>


    <tr>
      <td>Change Controller:
      </td>
     <td>IESG &lt;iesg@ietf.org&gt;
     </td>
    </tr>


    <tr>
      <td>Reference:
      </td>
     <td>Section 5.2 of RFC 9208
     </td>
    </tr>

    
</tbody>

</table>



<table align="left">
<name>MAILBOX
</name>
  <thead>
    <tr>
      <th>field name
      </th>
      <th>field value
      </th>
    </tr>
  </thead>
  <tbody>

    <tr>
      <td>Name of the quota resource type:
      </td>
     <td>MAILBOX
     </td>
    </tr>


    <tr>
      <td>Description:
      </td>
     <td>The number of mailboxes governed by the quota root.
     </td>
    </tr>


    <tr>
      <td>Extra required IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Extra optional IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Author:
      </td>
     <td>Alexey Melnikov &lt;alexey.melnikov@isode.com&gt;
     </td>
    </tr>


    <tr>
      <td>Change Controller:
      </td>
     <td>IESG &lt;iesg@ietf.org&gt;
     </td>
    </tr>


    <tr>
      <td>Reference:
      </td>
     <td>Section 5.3 of RFC 9208
     </td>
    </tr>

    
</tbody>

</table>



<table align="left"> 
<name>ANNOTATION-STORAGE</name>
  <thead>
    <tr>
      <th>field name
      </th>
      <th>field value
      </th>
    </tr>
  </thead>
  <tbody>

    <tr>
      <td>Name of the quota resource type:
      </td>
     <td>ANNOTATION-STORAGE
     </td>
    </tr>


    <tr>
      <td>Description:
      </td>
     <td>The maximum size of all annotations [RFC5257], in units of 1024 octets, associated with all messages in the mailboxes governed by the quota root.
     </td>
    </tr>


    <tr>
      <td>Extra required IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Extra optional IMAP commands/responses:
      </td>
     <td>N/A
     </td>
    </tr>


    <tr>
      <td>Author:
      </td>
     <td>Alexey Melnikov &lt;alexey.melnikov@isode.com&gt;
     </td>
    </tr>


    <tr>
      <td>Change Controller:
      </td>
     <td>IESG &lt;iesg@ietf.org&gt;
     </td>
    </tr>


    <tr>
      <td>Reference:
      </td>
     <td>Section 5.4 of RFC 9208
     </td>
    </tr>

    
</tbody>

</table>


</section>
    </section>

    <section anchor="changes-since" numbered="true" toc="default">
      <name>Changes Since RFC 2087</name>
      <t>
	This document is a revision of <xref target="RFC2087" format="default"/>, 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.</t>
      <t>
	When compared with <xref target="RFC2087" format="default"/>, 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-STORAGE").
	The DELETED STATUS data item must be implemented if the
	"QUOTA=RES-MESSAGE" capability is advertised. The DELETED-STORAGE STATUS
	data item must be implemented if the "QUOTA=RES-STORAGE" capability is
	advertised.  For extensibility, quota usage and quota limits are now
	63-bit unsigned integers.
      </t>
    </section>
  </middle>

  <back>
<displayreference target="RFC5234" to="ABNF"/>

    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3501.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4314.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5257.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9051.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2033.xml"/>
	<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2087.xml"/>
	
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
      </references>
    </references>

    <section numbered="false" toc="default">
      <name>Acknowledgments</name>
      <t>
	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 <xref target="RFC2087" format="default"/>: <contact fullname="John Myers"/>, <contact
	fullname="Cyrus Daboo"/>, <contact fullname="Lyndon Nerenberg"/>,
	<contact fullname="Benjamin Kaduk"/>, <contact fullname="Roman
	Danyliw"/>, and <contact fullname="Éric Vyncke"/>.
      </t>
      <t>This document is a revision of <xref target="RFC2087" format="default"/>, and it borrows a lot of text
      from that RFC. Thus, the work of <contact fullname="John
      Myers"/>, the author of <xref target="RFC2087" format="default"/>, is appreciated.
      </t>
    </section>

    <section numbered="false" toc="default" >
      <name>Contributors</name>
      <t>
        <contact fullname="Dave Cridland"/> wrote a lot of text in an earlier
        draft version that became the basis for this document.
      </t>
    </section>
    
  </back>
</rfc>
