Merge ssh://github.com/web2py/web2py

This commit is contained in:
Michele Comitini
2013-07-30 23:25:22 +02:00
7 changed files with 128 additions and 16 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.6.0-development+timestamp.2013.07.27.06.46.34
Version 2.6.0-development+timestamp.2013.07.29.07.50.41
+5
View File
@@ -122,6 +122,8 @@
'edit views:': 'modifica viste (view):',
'Editing bigul': 'Editing bigul',
'Editing file "%s"': 'Modifica del file "%s"',
'Editing italo': 'Editing italo',
'Editing italo3': 'Editing italo3',
'Editing Language file': 'Modifica file linguaggio',
'Enterprise Web Framework': 'Enterprise Web Framework',
'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"',
@@ -205,6 +207,7 @@
'NO': 'NO',
'No databases in this application': 'Nessun database presente in questa applicazione',
'no match': 'nessuna corrispondenza',
'no package selected': 'no package selected',
'online designer': 'online designer',
'or alternatively': 'or alternatively',
'Or Get from URL:': 'Or Get from URL:',
@@ -257,6 +260,7 @@
'selected': 'selezionato',
'session': 'session',
'session expired': 'sessions scaduta',
'Set Breakpoint on %s at line %s: %s': 'Set Breakpoint on %s at line %s: %s',
'shell': 'shell',
'Site': 'sito',
'some files could not be removed': 'non è stato possibile rimuovere alcuni files',
@@ -269,6 +273,7 @@
'Stylesheet': 'Foglio di stile (stylesheet)',
'Submit': 'Submit',
'submit': 'invia',
'successful': 'successful',
'Sure you want to delete this object?': 'Vuoi veramente cancellare questo oggetto?',
'table': 'tabella',
'test': 'test',
+2 -1
View File
@@ -23,7 +23,7 @@
'Administrative Interface': 'Interfaccia Amministrativa',
'Administrative interface': 'Interfaccia amministrativa',
'Ajax Recipes': 'Ajax Recipes',
'An error occured, please %s the page': "È stato rilevato un errore, prego %s la pagina",
'An error occured, please %s the page': 'È stato rilevato un errore, prego %s la pagina',
'And': 'E',
'appadmin is disabled because insecure channel': 'Amministrazione (appadmin) disabilitata: comunicazione non sicura',
'Are you sure you want to delete this object?': 'Sicuro di voler cancellare questo oggetto ?',
@@ -82,6 +82,7 @@
'Edit This App': 'Modifica questa applicazione',
'Email and SMS': 'Email e SMS',
'Email non valida': 'Email non valida',
'enter a number between %(min)g and %(max)g': 'enter a number between %(min)g and %(max)g',
'enter an integer between %(min)g and %(max)g': 'inserisci un intero tra %(min)g e %(max)g',
'Errors': 'Errori',
'Errors in form, please check it out.': 'Errori nel form, ricontrollalo',
+91
View File
@@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
"""
pbkdf2_ctypes
~~~~~~
This module implements pbkdf2 for Python using crypto lib from
openssl.
Note: This module is intended as a plugin replacement of pbkdf2.py
by Armin Ronacher.
:copyright: Copyright (c) 2013: Michele Comitini <mcm@glisco.it>
:license: LGPLv3
"""
import ctypes
import ctypes.util
import hashlib
import platform
import os.path
try: # check that we have proper OpenSSL on the system.
system = platform.system()
if system == 'Windows':
if platform.architecture()[0] == '64bit':
crypto = ctypes.CDLL(os.path.basename(
ctypes.util.find_library('libeay64')))
else:
crypto = ctypes.CDLL(os.path.basename(
ctypes.util.find_library('libeay32')))
else:
crypto = ctypes.CDLL(os.path.basename(
ctypes.util.find_library('crypto')))
PKCS5_PBKDF2_HMAC = crypto.PKCS5_PBKDF2_HMAC
hashlib_to_crypto_map = {hashlib.md5: crypto.EVP_md5,
hashlib.sha1: crypto.EVP_sha1,
hashlib.sha256: crypto.EVP_sha256,
hashlib.sha224: crypto.EVP_sha224,
hashlib.sha384: crypto.EVP_sha384,
hashlib.sha512: crypto.EVP_sha512}
except OSError, AttributeError:
raise ImportError('Cannot find a compatible OpenSSL installation '
'on your system')
def pkcs5_pbkdf2_hmac(data, salt, iterations=1000, keylen=24, hashfunc=None):
c_pass = ctypes.c_char_p(data)
c_passlen = ctypes.c_int(len(data))
c_salt = ctypes.c_char_p(salt)
c_saltlen = ctypes.c_int(len(salt))
c_iter = ctypes.c_int(iterations)
c_keylen = ctypes.c_int(keylen)
if hashfunc:
crypto_hashfunc = hashlib_to_crypto_map.get(hashfunc)
crypto_hashfunc.restype = ctypes.c_void_p
if crypto_hashfunc is None:
raise ValueError('Unknown digest' + str(hashfunc))
c_digest = ctypes.c_void_p(crypto_hashfunc())
else:
crypto.EVP_sha1.restype = ctypes.c_void_p
c_digest = ctypes.c_void_p(crypto.EVP_sha1())
c_buff = ctypes.create_string_buffer('\000' * keylen)
err = PKCS5_PBKDF2_HMAC(c_pass, c_passlen,
c_salt, c_saltlen,
c_iter,
c_digest,
c_keylen,
c_buff)
if err == 0:
raise ValueError('wrong parameters')
return c_buff.raw[:keylen]
def pbkdf2_hex(data, salt, iterations=1000, keylen=24, hashfunc=None):
return pkcs5_pbkdf2_hmac(data, salt, iterations, keylen, hashfunc).\
encode('hex')
def pbkdf2_bin(data, salt, iterations=1000, keylen=24, hashfunc=None):
return pkcs5_pbkdf2_hmac(data, salt, iterations, keylen, hashfunc)
if __name__ == '__main__':
crypto.SSLeay_version.restype = ctypes.c_char_p
print crypto.SSLeay_version(0)
for h in hashlib_to_crypto_map:
pkcs5_pbkdf2_hmac('secret' * 11, 'salt', hashfunc=h)
+3 -3
View File
@@ -8348,10 +8348,10 @@ class Table(object):
if is_active and is_active in fieldnames:
self._before_delete.append(
lambda qset: qset.update(is_active=False))
newquery = lambda query, t=self: \
newquery = lambda query, t=self, name=self._tablename: \
reduce(AND,[db[tn].is_active == True
for tn in db._adapter.tables(query)
if tn==t.name or getattr(db[tn],'_ot',None)==t.name])
if tn==name or getattr(db[tn],'_ot',None)==name])
query = self._common_filter
if query:
newquery = query & newquery
@@ -8584,7 +8584,7 @@ class Table(object):
for field in self:
if field.type=='upload' and field.name in fields:
value = fields[field.name]
if value and not isinstance(value,str):
if value is not None and not isinstance(value,str):
if hasattr(value,'file') and hasattr(value,'filename'):
new_name = field.store(value.file,filename=value.filename)
elif hasattr(value,'read') and hasattr(value,'name'):
+22 -10
View File
@@ -30,6 +30,25 @@ from dal import BaseAdapter
logger = logging.getLogger("web2py")
def enable_autocomplete_and_history(adir,env):
try:
import rlcompleter
import atexit
import readline
except ImportError:
pass
else:
readline.parse_and_bind("bind ^I rl_complete"
if sys.platform == 'darwin'
else "tab: complete")
history_file = os.path.join(adir,'.pythonhistory')
try:
readline.read_history_file(history_file)
except IOError:
open(history_file, 'a').close()
atexit.register(readline.write_history_file, history_file)
readline.set_completer(rlcompleter.Completer(env).complete)
def exec_environment(
pyfile='',
@@ -159,8 +178,7 @@ def run(
import_models=False,
startfile=None,
bpython=False,
python_code=False
):
python_code=False):
"""
Start interactive shell or run Python script (startfile) in web2py
controller environment. appname is formatted like:
@@ -174,6 +192,7 @@ def run(
if not a:
die(errmsg)
adir = os.path.join('applications', a)
if not os.path.exists(adir):
if sys.stdin and not sys.stdin.name == '/dev/null':
confirm = raw_input(
@@ -271,14 +290,7 @@ def run(
except:
logger.warning(
'import IPython error; use default python shell')
try:
import readline
import rlcompleter
except ImportError:
pass
else:
readline.set_completer(rlcompleter.Completer(_env).complete)
readline.parse_and_bind('tab:complete')
enable_autocomplete_and_history(adir,_env)
code.interact(local=_env)
+4 -1
View File
@@ -44,7 +44,10 @@ except ImportError:
import hmac
try:
from contrib.pbkdf2 import pbkdf2_hex
try:
from contrib.pbkdf2_ctypes import pbkdf2_hex
except ImportError:
from contrib.pbkdf2 import pbkdf2_hex
HAVE_PBKDF2 = True
except ImportError:
try: