Mercurial > p > roundup > code
diff roundup/password.py @ 270:a4241ddd22d7
Added the Password property type.
See "pydoc roundup.password" for implementation details. Have updated
some of the documentation too.
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 09 Oct 2001 07:25:59 +0000 |
| parents | |
| children | 1cc866cec608 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/roundup/password.py Tue Oct 09 07:25:59 2001 +0000 @@ -0,0 +1,111 @@ +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +# $Id: password.py,v 1.1 2001-10-09 07:25:59 richard Exp $ + +import sha, re + +def encodePassword(plaintext, scheme): + '''Encrypt the plaintext password. + ''' + if scheme == 'SHA': + s = sha.sha(plaintext).hexdigest() + elif scheme == 'plaintext': + pass + else: + raise ValueError, 'Unknown encryption scheme "%s"'%scheme + return s + +class Password: + '''The class encapsulates a Password property type value in the database. + + The encoding of the password is one if None, 'SHA' or 'plaintext'. The + encodePassword function is used to actually encode the password from + plaintext. The None encoding is used in legacy databases where no + encoding scheme is identified. + + The scheme is stored with the encoded data in the database: + {scheme}data + + Example usage: + >>> p = Password('sekrit') + >>> p == 'sekrit' + 1 + >>> p != 'not sekrit' + 1 + >>> 'sekrit' == p + 1 + >>> 'not sekrit' != p + 1 + ''' + + default_scheme = 'SHA' # new encryptions use this scheme + pwre = re.compile(r'{(\w+)}(.+)') + + def __init__(self, plaintext=None): + '''Call setPassword if plaintext is not None.''' + if plaintext is not None: + self.password = encodePassword(plaintext, self.default_scheme) + self.scheme = self.default_scheme + else: + self.password = None + self.scheme = self.default_scheme + + def unpack(self, encrypted): + '''Set the password info from the scheme:<encryted info> string + (the inverse of __str__) + ''' + m = self.pwre.match(encrypted) + if m: + self.scheme = m.group(1) + self.password = m.group(2) + else: + # currently plaintext - encrypt + self.password = encodePassword(plaintext, self.default_scheme) + self.scheme = self.default_scheme + + def setPassword(self, plaintext): + '''Sets encrypts plaintext.''' + self.password = encodePassword(plaintext, self.scheme) + + def __cmp__(self, plaintext): + '''Compare this password against the plaintext.''' + if self.password is None: + raise ValueError, 'Password not set' + return cmp(self.password, encodePassword(plaintext, self.scheme)) + + def __str__(self): + '''Stringify the encrypted password for database storage.''' + if self.password is None: + raise ValueError, 'Password not set' + return '{%s}%s'%(self.scheme, self.password) + +def test(): + p = Password('sekrit') + assert p == 'sekrit' + assert p != 'not sekrit' + assert 'sekrit' == p + assert 'not sekrit' != p + +if __name__ == '__main__': + test() + +# +# $Log: not supported by cvs2svn $ +# +# +# vim: set filetype=python ts=4 sw=4 et si
