Code

roundup-admin install checks for existing tracker in target home
[roundup.git] / roundup / password.py
index 459e1f7877c86d94f9e3b0924dd9767f65c3a0b0..14dbcda0da9338193fbd2b128dbf0881be899778 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: password.py,v 1.7 2002-09-26 13:38:35 gmcm Exp $
+# $Id: password.py,v 1.12 2004-03-22 07:45:39 richard Exp $
 
-__doc__ = """
-Password handling (encoding, decoding).
+"""Password handling (encoding, decoding).
 """
+__docformat__ = 'restructuredtext'
 
-import sha, re, string
+import sha, re, string, random
 try:
     import crypt
 except:
     crypt = None
     pass
 
+class PasswordValueError(ValueError):
+    ''' The password value is not valid '''
+    pass
+
 def encodePassword(plaintext, scheme, other=None):
     '''Encrypt the plaintext password.
     '''
+    if plaintext is None:
+        plaintext = ""
     if scheme == 'SHA':
         s = sha.sha(plaintext).hexdigest()
     elif scheme == 'crypt' and crypt is not None:
@@ -43,9 +49,13 @@ def encodePassword(plaintext, scheme, other=None):
     elif scheme == 'plaintext':
         s = plaintext
     else:
-        raise ValueError, 'Unknown encryption scheme "%s"'%scheme
+        raise PasswordValueError, 'unknown encryption scheme %r'%scheme
     return s
 
+def generatePassword(length=8):
+    chars = string.letters+string.digits
+    return ''.join([random.choice(chars) for x in range(length)])
+
 class Password:
     '''The class encapsulates a Password property type value in the database. 
 
@@ -72,13 +82,15 @@ class Password:
     default_scheme = 'SHA'        # new encryptions use this scheme
     pwre = re.compile(r'{(\w+)}(.+)')
 
-    def __init__(self, plaintext=None, scheme=None):
+    def __init__(self, plaintext=None, scheme=None, encrypted=None):
         '''Call setPassword if plaintext is not None.'''
         if scheme is None:
             scheme = self.default_scheme
         if plaintext is not None:
             self.password = encodePassword(plaintext, self.default_scheme)
             self.scheme = self.default_scheme
+        elif encrypted is not None:
+            self.unpack(encrypted)
         else:
             self.password = None
             self.scheme = self.default_scheme