[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tmda-cvs
Subject:    CVS: tmda/TMDA Auth.py, 1.19, 1.20 ChangeLog, 1.293, 1.294 Errors.py,
From:       Timothy Legant <tlegant () users ! sourceforge ! net>
Date:       2003-11-16 21:46:48
[Download RAW message or body]

Update of /cvsroot/tmda/tmda/TMDA
In directory sc8-pr-cvs1:/tmp/cvs-serv11682/TMDA

Modified Files:
	Auth.py ChangeLog Errors.py 
Log Message:
Cleaned up exception handling in Auth.init_auth_method (Auth.py) so
that error messages could actually be read.

Fixed IMAP4_SSL class definition in Auth.init_remote method (Auth.py).
Previously, it was defined as a local variable that just disappeared
after init_remote() finished.  Also, fixed various code issues to
bring it in line with the IMAP4_SSL distributed with Python 2.3.

Cleaned up Errors.py.  Removed __repr__ method in AddressError and
QueueError.  It is of no value in exception classes.  Renamed __repr__
to __str__ in AuthError, since it needs a customized string
representation.  In all three classes, made __init__ call the ancestor
class's __init__.



Index: Auth.py
===================================================================
RCS file: /cvsroot/tmda/tmda/TMDA/Auth.py,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- Auth.py	21 Jun 2003 02:30:17 -0000	1.19
+++ Auth.py	16 Nov 2003 21:46:46 -0000	1.20
@@ -29,6 +29,7 @@
 import md5
 import popen2
 import time
+import imaplib
 
 # TMDA imports
 import Version
@@ -152,16 +153,15 @@
         """Initializes the authentication mechanism.
         See init_file, init_checkpw, and init_remote for more details.
         """
-        try:
-            cmd = "self.init_%s(arg)" % type
-            eval( cmd )
-        except AttributeError, err:
-            self.debug( "Attribute Error: %s" % err )
-            raise ValueError, \
-                "Authentication type '%s' not recognised.\n " % type + \
-                "Must be one of %s" % repr(self.allowed_authtypes)
-        except ValueError, err:
-            raise err
+        mname = 'init_%s' % type
+        meth = getattr(self, mname, None)
+        if meth is None:
+            self.debug("Attribute Error: " \
+                       "Auth instance has no attribute '%s'" % mname)
+            raise ValueError(
+                "Authentication type '%s' not recognised.\n " \
+                "Must be one of %s" % (type, repr(self.allowed_authtypes)))
+        meth(arg)
 
     def init_file(self, file):
         """Initializes the authentication scheme with a flat file.
@@ -253,7 +253,6 @@
 
         if self.__authremote['proto'] == 'imaps':
             try:
-                import imaplib
                 self.IMAP4_SSL = imaplib.IMAP4_SSL
             except AttributeError:
                 class IMAP4_SSL(imaplib.IMAP4):
@@ -263,38 +262,44 @@
                         This connection will be used by the routines:
                         read, readline, send, shutdown.
                         """
-                        self.sock = socket.socket(socket.AF_INET, \
+                        self.host = host
+                        self.port = port
+                        self.sock = socket.socket(socket.AF_INET,
                                                   socket.SOCK_STREAM)
-                        self.sock.connect((self.host, self.port))
-                        self.sslsock = socket.ssl(self.sock)
-                        self.file = self.sock.makefile('rb')
+                        self.sock.connect((host, port))
+                        self.sslobj = socket.ssl(self.sock, None, None)
 
                     def read(self, size):
                         """Read 'size' bytes from remote."""
-                        buf = self.sslsock.read(size)
-                        return buf
+                        # sslobj.read() sometimes returns < size bytes
+                        data = self.sslobj.read(size)
+                        while len(data) < size:
+                            data += self.sslobj.read(size-len(data))
+                        return data
 
                     def readline(self):
                         """Read line from remote."""
-                        line = [ ]
-                        c = self.sslsock.read(1)
-                        while c:
-                            line.append(c)
-                            if c == '\n':
-                                break
-                            c = self.sslsock.read(1)
-                        buf = ''.join(line)
-                        return buf
+                        line = ""
+                        while 1:
+                            char = self.sslobj.read(1)
+                            line += char
+                            if char == "\n": return line
 
                     def send(self, data):
                         """Send data to remote."""
                         bytes = len(data)
                         while bytes > 0:
-                            sent = self.sslsock.write(data)
+                            sent = self.sslobj.write(data)
                             if sent == bytes:
-                                break   # avoid copy
+                                break    # avoid copy
                             data = data[sent:]
                             bytes = bytes - sent
+
+                    def shutdown(self):
+                        """Close I/O established in "open"."""
+                        self.sock.close()
+
+                self.IMAP4_SSL = locals()['IMAP4_SSL']
         elif self.__authremote['proto'] == 'ldap':
             try:
                 import ldap
@@ -470,7 +475,6 @@
             self.__authremote['port'] = authport
         port = self.__defaultauthports[self.__authremote['proto']]
         if self.__authremote['proto'] == 'imap':
-            import imaplib
             if self.__authremote['port']:
                 port = int(self.__authremote['port'])
             M = imaplib.IMAP4(self.__authremote['host'], port)
@@ -488,7 +492,6 @@
                 self.debug( "Uncaught %s: %s" % (err.__class__, err) )
                 return 0
         elif self.__authremote['proto'] == 'imaps':
-            import imaplib
             if self.__authremote['port']:
                 port = int(self.__authremote['port'])
             M = self.IMAP4_SSL(self.__authremote['host'], port)

Index: ChangeLog
===================================================================
RCS file: /cvsroot/tmda/tmda/TMDA/ChangeLog,v
retrieving revision 1.293
retrieving revision 1.294
diff -u -r1.293 -r1.294
--- ChangeLog	12 Nov 2003 03:20:08 -0000	1.293
+++ ChangeLog	16 Nov 2003 21:46:46 -0000	1.294
@@ -1,3 +1,21 @@
+2003-11-16  Tim Legant  <tim@catseye.net>
+
+	* Auth.py (Auth.init_auth_method): Cleaned up exception handling
+	so that error messages could actually be read!
+
+	* (Auth.init_remote): Fixed IMAP4_SSL class definition.
+	Previously, it was defined as a local variable which just
+	disappeared after init_remote() finished.  Now, we store it in an
+	instance variable named IMAP4_SSL.  Also, fixed various code
+	issues to bring it in line with the version distributed with
+	Python 2.3.
+
+	* Errors.py (AddressError, QueueError): Removed __repr__ method.
+	Called ancestor's __init__.
+
+	* (AuthError): Renamed __repr__ to __str__; cleaned it up.  Called
+	ancestor's __init__.
+
 2003-11-11  Tim Legant  <tim@catseye.net>
 
 	* AutoResponse.py (AutoResponse.__init__): Recreate incoming

Index: Errors.py
===================================================================
RCS file: /cvsroot/tmda/tmda/TMDA/Errors.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Errors.py	27 Apr 2003 07:58:17 -0000	1.10
+++ Errors.py	16 Nov 2003 21:46:46 -0000	1.11
@@ -45,10 +45,7 @@
 class AddressError(TMDAError):
     """Address errors."""
     def __init__(self, errmsg = ''):
-        self.args = errmsg
-
-    def __repr__(self):
-        return self.args
+        TMDAError.__init__(errmsg)
 
 class BadCryptoError(AddressError):
     """Bad (or no) cryptographic information in address."""
@@ -60,22 +57,20 @@
 
 class QueueError(TMDAError):
     def __init__(self, errmsg = 'Unknown error'):
-        self.args = errmsg
-
-    def __repr__(self):
-        return '%s:\n%s' % (self.__class__, self.args)
+        TMDAError.__init__(errmsg)
 
 class MessageError(QueueError):
     pass
 
 class AuthError(TMDAError):
     """Authentication Errors""" 
-    def __init__(self, errmsg = 'Authentication Error', helpmsg = ''):
+    def __init__(self, errmsg='Authentication Error', helpmsg=''):
+        TMDAError.__init__(self, errmsg)
         self.msg = errmsg
         self.help = helpmsg
 
-    def __repr__(self):
-        if self.help == '':
-          return '%s: %s' % (self.__class__, self.msg)
-        else:
-          return '%s: %s\n(%s)' % (self.__class__, self.msg, self.help)
+    def __str__(self):
+        s = '%s: %s' % (self.__class__, self.msg)
+        if self.help:
+            s += '\n(%s)' % (self.help,)
+        return s

_______________________________________
tmda-cvs mailing list
http://tmda.net/lists/listinfo/tmda-cvs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic