From 3fca291a52cae513b8f76851186f96ba5fe863d2 Mon Sep 17 00:00:00 2001
From: Piers Lauder <piers@cs.su.oz.au>
Date: Mon, 17 Jun 2002 07:07:20 +0000
Subject: Add IMAP4 QUOTA extension methods

---
 Doc/lib/libimaplib.tex | 22 +++++++++++++++++++++-
 Lib/imaplib.py         | 39 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/Doc/lib/libimaplib.tex b/Doc/lib/libimaplib.tex
index 38323cf..b710ce7 100644
--- a/Doc/lib/libimaplib.tex
+++ b/Doc/lib/libimaplib.tex
@@ -174,6 +174,16 @@ An \class{IMAP4} instance has the following methods:
   The method is non-standard, but is supported by the \samp{Cyrus} server.
 \end{methoddesc}
 
+\begin{methoddesc}{getquota}{root}
+  Get the \samp{quota} \var{root}'s resource usage and limits.
+  This method is part of the IMAP4 QUOTA extension defined in rfc2087.
+\end{methoddesc}
+
+\begin{methoddesc}{getquotaroot}{mailbox}
+  Get the list of \samp{quota} \samp{roots} for the named \var{mailbox}.
+  This method is part of the IMAP4 QUOTA extension defined in rfc2087.
+\end{methoddesc}
+
 \begin{methoddesc}{list}{\optional{directory\optional{, pattern}}}
   List mailbox names in \var{directory} matching
   \var{pattern}.  \var{directory} defaults to the top-level mail
@@ -204,7 +214,7 @@ An \class{IMAP4} instance has the following methods:
 \begin{methoddesc}{open}{host, port}
   Opens socket to \var{port} at \var{host}.
   The connection objects established by this method
-  will be used in the \code{read}, \code{readline}, and \code{shutdown} methods.
+  will be used in the \code{read}, \code{readline}, \code{send}, and \code{shutdown} methods.
   You may override this method.
 \end{methoddesc}
 
@@ -263,11 +273,21 @@ msgnums = M.search(None, '(FROM "LDJ")')
   to the mailbox are not allowed.
 \end{methoddesc}
 
+\begin{methoddesc}{send}{data}
+  Sends \code{data} to the remote server.
+  You may override this method.
+\end{methoddesc}
+
 \begin{methoddesc}{setacl}{mailbox, who, what}
   Set an \samp{ACL} for \var{mailbox}.
   The method is non-standard, but is supported by the \samp{Cyrus} server.
 \end{methoddesc}
 
+\begin{methoddesc}{setquota}{root, limits}
+  Set the \samp{quota} \var{root}'s resource \var{limits}.
+  This method is part of the IMAP4 QUOTA extension defined in rfc2087.
+\end{methoddesc}
+
 \begin{methoddesc}{shutdown}{}
   Close connection established in \code{open}.
   You may override this method.
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index 455ba9c..9b4557c 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -16,8 +16,9 @@ Public functions:       Internaldate2tuple
 # String method conversion by ESR, February 2001.
 # GET/SETACL contributed by Anthony Baxter <anthony@interlink.com.au> April 2001.
 # IMAP4_SSL contributed by Tino Lange <Tino.Lange@isg.de> March 2002.
+# GET/SETQUOTA contributed by Andreas Zeidler <az@kreativkombinat.de> June 2002.
 
-__version__ = "2.51"
+__version__ = "2.52"
 
 import binascii, re, socket, time, random, sys
 
@@ -48,6 +49,8 @@ Commands = {
         'EXPUNGE':      ('SELECTED',),
         'FETCH':        ('SELECTED',),
         'GETACL':       ('AUTH', 'SELECTED'),
+        'GETQUOTA':     ('AUTH', 'SELECTED'),
+        'GETQUOTAROOT': ('AUTH', 'SELECTED'),
         'LIST':         ('AUTH', 'SELECTED'),
         'LOGIN':        ('NONAUTH',),
         'LOGOUT':       ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'),
@@ -59,6 +62,7 @@ Commands = {
         'SEARCH':       ('SELECTED',),
         'SELECT':       ('AUTH', 'SELECTED'),
         'SETACL':       ('AUTH', 'SELECTED'),
+        'SETQUOTA':     ('AUTH', 'SELECTED'),
         'SORT':         ('SELECTED',),
         'STATUS':       ('AUTH', 'SELECTED'),
         'STORE':        ('SELECTED',),
@@ -416,6 +420,28 @@ class IMAP4:
         return self._untagged_response(typ, dat, 'ACL')
 
 
+    def getquota(self, root):
+        """Get the quota root's resource usage and limits.
+
+	Part of the IMAP4 QUOTA extension defined in rfc2087.
+
+        (typ, [data]) = <instance>.getquota(root)
+	"""
+        typ, dat = self._simple_command('GETQUOTA', root)
+        return self._untagged_response(typ, dat, 'QUOTA')
+
+
+    def getquotaroot(self, mailbox):
+        """Get the list of quota roots for the named mailbox.
+
+        (typ, [[QUOTAROOT responses...], [QUOTA responses]]) = <instance>.getquotaroot(mailbox)
+	"""
+        typ, dat = self._simple_command('GETQUOTA', root)
+        typ, quota = self._untagged_response(typ, dat, 'QUOTA')
+        typ, quotaroot = self._untagged_response(typ, dat, 'QUOTAROOT')
+	return typ, [quotaroot, quota]
+
+
     def list(self, directory='""', pattern='*'):
         """List mailbox names in directory matching pattern.
 
@@ -566,6 +592,15 @@ class IMAP4:
         return self._simple_command('SETACL', mailbox, who, what)
 
 
+    def setquota(self, root, limits):
+        """Set the quota root's resource limits.
+
+        (typ, [data]) = <instance>.setquota(root, limits)
+	"""
+        typ, dat = self._simple_command('SETQUOTA', root, limits)
+        return self._untagged_response(typ, dat, 'QUOTA')
+
+
     def sort(self, sort_criteria, charset, *search_criteria):
         """IMAP4rev1 extension SORT command.
 
@@ -1186,7 +1221,7 @@ def Time2Internaldate(date_time):
         tt = time.localtime(date_time)
     elif isinstance(date_time, (tuple, time.struct_time)):
         tt = date_time
-    elif isinstance(date_time, str):
+    elif isinstance(date_time, str) and (date_time[0],date_time[-1]) == ('"','"'):
         return date_time        # Assume in correct format
     else:
         raise ValueError("date_time not of a known type")
-- 
cgit v0.12

