From 49b40a1cf352d33d778c81f0db0ffbd5fb80bc46 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 23 Oct 2012 10:17:23 -0500 Subject: [PATCH] utils compiles with python 3 --- VERSION | 2 +- gluon/utils.py | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/VERSION b/VERSION index 767f5e08..4cb4771e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.2.1 (2012-10-23 10:13:13) stable +Version 2.2.1 (2012-10-23 10:17:19) stable diff --git a/gluon/utils.py b/gluon/utils.py index 3ef03909..10fb2457 100644 --- a/gluon/utils.py +++ b/gluon/utils.py @@ -19,22 +19,37 @@ import random import time import os import re +import sys import logging import socket -import cPickle import base64 import zlib +python_version = sys.version_info[0] + +if python_version == 2: + import cPickle as pickle +else: + import pickle + + try: from Crypto.Cipher import AES except ImportError: - from contrib import aes as AES + try: + from .aes import AES + except ImportError: + from contrib.aes import AES try: from contrib.pbkdf2 import pbkdf2_hex HAVE_PBKDF2 = True except ImportError: - HAVE_PBKDF2 = False + try: + from .pbkdf2 import pbkdf2_hex + HAVE_PBKDF2 = True + except (ImportError, ValueError): + HAVE_PBKDF2 = False logger = logging.getLogger("web2py") @@ -115,7 +130,7 @@ def pad(s, n=32, padchar='.'): def secure_dumps(data, encryption_key, hash_key=None, compression_level=None): if not hash_key: hash_key = hashlib.sha1(encryption_key).hexdigest() - dump = cPickle.dumps(data) + dump = pickle.dumps(data) if compression_level: dump = zlib.compress(dump, compression_level) key = pad(encryption_key[:32]) @@ -141,8 +156,8 @@ def secure_loads(data, encryption_key, hash_key=None, compression_level=None): data = data.rstrip(' ') if compression_level: data = zlib.decompress(data) - return cPickle.loads(data) - except (TypeError, cPickle.UnpicklingError): + return pickle.loads(data) + except (TypeError, pickle.UnpicklingError): return None ### compute constant CTOKENS @@ -173,7 +188,10 @@ def initialize_urandom(): # try to add process-specific entropy frandom = open('/dev/urandom', 'wb') try: - frandom.write(''.join(chr(t) for t in ctokens)) + if python_version == 2: + frandom.write(''.join(chr(t) for t in ctokens)) # python 2 + else: + frandom.write(bytes([]).join(bytes([t]) for t in ctokens)) # python 3 finally: frandom.close() except IOError: @@ -185,8 +203,11 @@ def initialize_urandom(): """Cryptographically secure session management is not possible on your system because your system does not provide a cryptographically secure entropy source. This is not specific to web2py; consider deploying on a different operating system.""") - unpacked_ctokens = struct.unpack('=QQ', string.join( - (chr(x) for x in ctokens), '')) + if python_version == 2: + packed = ''.join(chr(x) for x in ctokens) # python 2 + else: + packed = bytes([]).join(bytes([x]) for x in ctokens) # python 3 + unpacked_ctokens = struct.unpack('=QQ', packed) return unpacked_ctokens, have_urandom UNPACKED_CTOKENS, HAVE_URANDOM = initialize_urandom()