Mercurial > p > roundup > code
comparison roundup/password.py @ 4683:2f66d44616ad
windows: Fix failing password tests due to missing crypt module
| author | anatoly techtonik <techtonik@gmail.com> |
|---|---|
| date | Wed, 28 Nov 2012 02:56:33 +0300 |
| parents | 6e3e4f24c753 |
| children | efdce3d32698 |
comparison
equal
deleted
inserted
replaced
| 4682:0c2cad65ebba | 4683:2f66d44616ad |
|---|---|
| 43 """decode using variant of base64""" | 43 """decode using variant of base64""" |
| 44 off = len(data) % 4 | 44 off = len(data) % 4 |
| 45 if off == 0: | 45 if off == 0: |
| 46 return b64decode(data, "./") | 46 return b64decode(data, "./") |
| 47 elif off == 1: | 47 elif off == 1: |
| 48 raise ValueError("invalid bas64 input") | 48 raise ValueError("Invalid base64 input") |
| 49 elif off == 2: | 49 elif off == 2: |
| 50 return b64decode(data + "==", "./") | 50 return b64decode(data + "==", "./") |
| 51 else: | 51 else: |
| 52 return b64decode(data + "=", "./") | 52 return b64decode(data + "=", "./") |
| 53 | 53 |
| 160 salt = random.choice(saltchars) + random.choice(saltchars) | 160 salt = random.choice(saltchars) + random.choice(saltchars) |
| 161 s = crypt.crypt(plaintext, salt) | 161 s = crypt.crypt(plaintext, salt) |
| 162 elif scheme == 'plaintext': | 162 elif scheme == 'plaintext': |
| 163 s = plaintext | 163 s = plaintext |
| 164 else: | 164 else: |
| 165 raise PasswordValueError, 'unknown encryption scheme %r'%scheme | 165 raise PasswordValueError, 'Unknown encryption scheme %r'%scheme |
| 166 return s | 166 return s |
| 167 | 167 |
| 168 def generatePassword(length=8): | 168 def generatePassword(length=8): |
| 169 chars = string.letters+string.digits | 169 chars = string.letters+string.digits |
| 170 return ''.join([random.choice(chars) for x in range(length)]) | 170 return ''.join([random.choice(chars) for x in range(length)]) |
| 273 self.plaintext = None | 273 self.plaintext = None |
| 274 else: | 274 else: |
| 275 # currently plaintext - encrypt | 275 # currently plaintext - encrypt |
| 276 self.setPassword(encrypted, scheme, config=config) | 276 self.setPassword(encrypted, scheme, config=config) |
| 277 if strict and self.scheme not in self.known_schemes: | 277 if strict and self.scheme not in self.known_schemes: |
| 278 raise PasswordValueError, "unknown encryption scheme: %r" % (self.scheme,) | 278 raise PasswordValueError, "Unknown encryption scheme: %r" % (self.scheme,) |
| 279 | 279 |
| 280 def setPassword(self, plaintext, scheme=None, config=None): | 280 def setPassword(self, plaintext, scheme=None, config=None): |
| 281 """Sets encrypts plaintext.""" | 281 """Sets encrypts plaintext.""" |
| 282 if scheme is None: | 282 if scheme is None: |
| 283 scheme = self.default_scheme | 283 scheme = self.default_scheme |
| 305 assert p != 'not sekrit' | 305 assert p != 'not sekrit' |
| 306 assert 'sekrit' == p | 306 assert 'sekrit' == p |
| 307 assert 'not sekrit' != p | 307 assert 'not sekrit' != p |
| 308 | 308 |
| 309 # crypt | 309 # crypt |
| 310 p = Password('sekrit', 'crypt') | 310 if crypt: # not available on Windows |
| 311 assert p == 'sekrit' | 311 p = Password('sekrit', 'crypt') |
| 312 assert p != 'not sekrit' | 312 assert p == 'sekrit' |
| 313 assert 'sekrit' == p | 313 assert p != 'not sekrit' |
| 314 assert 'not sekrit' != p | 314 assert 'sekrit' == p |
| 315 assert 'not sekrit' != p | |
| 315 | 316 |
| 316 # PBKDF2 - low level function | 317 # PBKDF2 - low level function |
| 317 from binascii import unhexlify | 318 from binascii import unhexlify |
| 318 k = pbkdf2("password", "ATHENA.MIT.EDUraeburn", 1200, 32) | 319 k = pbkdf2("password", "ATHENA.MIT.EDUraeburn", 1200, 32) |
| 319 assert k == unhexlify("5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13") | 320 assert k == unhexlify("5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13") |
