# HG changeset patch # User Pascal Volk # Date 1352052139 0 # Node ID 27334cfc0c90a304aae72fa30b464c8980ea4b8a # Parent 54172669bbae39b5b92ef7d124d3158f04253f26 VMM/pycompat: Removed module hashlib. diff -r 54172669bbae -r 27334cfc0c90 VirtualMailManager/password.py --- a/VirtualMailManager/password.py Sat Nov 03 16:22:48 2012 +0000 +++ b/VirtualMailManager/password.py Sun Nov 04 18:02:19 2012 +0000 @@ -15,22 +15,18 @@ schemes, encodings = list_schemes() """ +import hashlib + from crypt import crypt from random import SystemRandom from subprocess import Popen, PIPE -try: - import hashlib -except ImportError: - from VirtualMailManager.pycompat import hashlib - from VirtualMailManager import ENCODING from VirtualMailManager.emailaddress import EmailAddress from VirtualMailManager.common import get_unicode, version_str from VirtualMailManager.constants import VMM_ERROR from VirtualMailManager.errors import VMMError -COMPAT = hasattr(hashlib, 'compat') SALTCHARS = './0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' PASSWDCHARS = '._-+#*23456789abcdefghikmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' DEFAULT_B64 = (None, 'B64', 'BASE64') @@ -81,33 +77,17 @@ def _md4_new(): """Returns an new MD4-hash object if supported by the hashlib or - provided by PyCrypto - other `None`. + provided by PyCrypto - otherwise `None`. """ try: return hashlib.new('md4') except ValueError, err: if str(err) == 'unsupported hash type': - if not COMPAT: - try: - from Crypto.Hash import MD4 - return MD4.new() - except ImportError: - return None - else: - raise - - -def _sha256_new(data=''): - """Returns a new sha256 object from the hashlib. - - Returns `None` if the PyCrypto in pycompat.hashlib is too old.""" - if not COMPAT: - return hashlib.sha256(data) - try: - return hashlib.new('sha256', data) - except ValueError, err: - if str(err) == 'unsupported hash type': - return None + try: + from Crypto.Hash import MD4 + return MD4.new() + except ImportError: + return None else: raise @@ -248,26 +228,22 @@ def _sha256_hash(password, scheme, encoding): """Generates SHA256 hashes.""" - sha256 = _sha256_new(password) - if sha256: - if encoding in DEFAULT_B64: - digest = sha256.digest().encode('base64').rstrip() - else: - digest = sha256.hexdigest() - return _format_digest(digest, scheme, encoding) - return _dovecotpw(password, scheme, encoding) + sha256 = hashlib.sha256(password) + if encoding in DEFAULT_B64: + digest = sha256.digest().encode('base64').rstrip() + else: + digest = sha256.hexdigest() + return _format_digest(digest, scheme, encoding) def _sha512_hash(password, scheme, encoding): """Generates SHA512 hashes.""" - if not COMPAT: - sha512 = hashlib.sha512(password) - if encoding in DEFAULT_B64: - digest = sha512.digest().encode('base64').replace('\n', '') - else: - digest = sha512.hexdigest() - return _format_digest(digest, scheme, encoding) - return _dovecotpw(password, scheme, encoding) + sha512 = hashlib.sha512(password) + if encoding in DEFAULT_B64: + digest = sha512.digest().encode('base64').replace('\n', '') + else: + digest = sha512.hexdigest() + return _format_digest(digest, scheme, encoding) def _smd5_hash(password, scheme, encoding): @@ -296,30 +272,25 @@ def _ssha256_hash(password, scheme, encoding): """Generates SSHA256 (salted SHA256) hashes.""" - sha256 = _sha256_new(password) - if sha256: - salt = _get_salt(SALTED_ALGO_SALT_LEN) - sha256.update(salt) - if encoding in DEFAULT_B64: - digest = (sha256.digest() + salt).encode('base64').rstrip() - else: - digest = sha256.hexdigest() + salt.encode('hex') - return _format_digest(digest, scheme, encoding) - return _dovecotpw(password, scheme, encoding) + sha256 = hashlib.sha256(password) + salt = _get_salt(SALTED_ALGO_SALT_LEN) + sha256.update(salt) + if encoding in DEFAULT_B64: + digest = (sha256.digest() + salt).encode('base64').rstrip() + else: + digest = sha256.hexdigest() + salt.encode('hex') + return _format_digest(digest, scheme, encoding) def _ssha512_hash(password, scheme, encoding): """Generates SSHA512 (salted SHA512) hashes.""" - if not COMPAT: - salt = _get_salt(SALTED_ALGO_SALT_LEN) - sha512 = hashlib.sha512(password + salt) - if encoding in DEFAULT_B64: - digest = (sha512.digest() + salt).encode('base64').replace('\n', - '') - else: - digest = sha512.hexdigest() + salt.encode('hex') - return _format_digest(digest, scheme, encoding) - return _dovecotpw(password, scheme, encoding) + salt = _get_salt(SALTED_ALGO_SALT_LEN) + sha512 = hashlib.sha512(password + salt) + if encoding in DEFAULT_B64: + digest = (sha512.digest() + salt).encode('base64').replace('\n', '') + else: + digest = sha512.hexdigest() + salt.encode('hex') + return _format_digest(digest, scheme, encoding) _scheme_info = { 'CLEARTEXT': (_clear_hash, 0x10000f00), diff -r 54172669bbae -r 27334cfc0c90 VirtualMailManager/pycompat/hashlib.py --- a/VirtualMailManager/pycompat/hashlib.py Sat Nov 03 16:22:48 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2010 - 2012, Pascal Volk -# See COPYING for distribution information. - -""" - VirtualMailManager.pycompat.hashlib - - VirtualMailManager's minimal hashlib emulation for Python 2.4 - - hashlib.md5(...), hashlib.sha1(...), hashlib.new('md5', ...) and - hashlib.new('sha1', ...) will work always. - - When the PyCrypto module could be found in - sys.path hashlib.new('md4', ...) will also work. - - With PyCrypto >= 2.1.0alpha1 hashlib.new('sha256', ...) and - hashlib.sha256(...) becomes functional. -""" - - -import md5 as _md5 -import sha as _sha1 - -try: - import Crypto -except ImportError: - _md4 = None - SHA256 = None -else: - from Crypto.Hash import MD4 as _md4 - if hasattr(Crypto, 'version_info'): # <- Available since v2.1.0alpha1 - from Crypto.Hash import SHA256 # SHA256 works since v2.1.0alpha1 - sha256 = SHA256.new - else: - SHA256 = None - del Crypto - - -compat = 0x01 -md5 = _md5.new -sha1 = _sha1.new - - -def new(name, string=''): - """Return a new hashing object using the named algorithm, optionally - initialized with the provided string. - """ - if name in ('md5', 'MD5'): - return _md5.new(string) - if name in ('sha1', 'SHA1'): - return _sha1.new(string) - if not _md4: - raise ValueError('unsupported hash type') - if name in ('md4', 'MD4'): - return _md4.new(string) - if name in ('sha256', 'SHA256') and SHA256: - return SHA256.new(string) - raise ValueError('unsupported hash type')