added more CRYPT examples and doctests, fixed other doctests
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-07-20 08:58:08) dev
|
Version 2.00.0 (2012-07-20 10:17:51) dev
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ import random
|
|||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
from gluon.contrib.pbkdf2 import pbkdf2_hex
|
from contrib.pbkdf2 import pbkdf2_hex
|
||||||
|
|
||||||
logger = logging.getLogger("web2py")
|
logger = logging.getLogger("web2py")
|
||||||
|
|
||||||
|
|||||||
+35
-5
@@ -130,7 +130,7 @@ class IS_MATCH(Validator):
|
|||||||
('hello', None)
|
('hello', None)
|
||||||
|
|
||||||
>>> IS_MATCH('hell')('hello')
|
>>> IS_MATCH('hell')('hello')
|
||||||
('hello', 'invalid expression')
|
('hello', None)
|
||||||
|
|
||||||
>>> IS_MATCH('hell.*', strict=False)('hello')
|
>>> IS_MATCH('hell.*', strict=False)('hello')
|
||||||
('hello', None)
|
('hello', None)
|
||||||
@@ -139,10 +139,10 @@ class IS_MATCH(Validator):
|
|||||||
('shello', 'invalid expression')
|
('shello', 'invalid expression')
|
||||||
|
|
||||||
>>> IS_MATCH('hello', search=True)('shello')
|
>>> IS_MATCH('hello', search=True)('shello')
|
||||||
('hello', None)
|
('shello', None)
|
||||||
|
|
||||||
>>> IS_MATCH('hello', search=True, strict=False)('shellox')
|
>>> IS_MATCH('hello', search=True, strict=False)('shellox')
|
||||||
('hello', None)
|
('shellox', None)
|
||||||
|
|
||||||
>>> IS_MATCH('.*hello.*', search=True, strict=False)('shellox')
|
>>> IS_MATCH('.*hello.*', search=True, strict=False)('shellox')
|
||||||
('shellox', None)
|
('shellox', None)
|
||||||
@@ -2635,7 +2635,36 @@ class CRYPT(object):
|
|||||||
Important: hashed password is returned as a LazyCrypt object and computed only if needed.
|
Important: hashed password is returned as a LazyCrypt object and computed only if needed.
|
||||||
The LasyCrypt object also knows how to compare itself with an existing salted password
|
The LasyCrypt object also knows how to compare itself with an existing salted password
|
||||||
|
|
||||||
Some tests:
|
Supports standard algorithms
|
||||||
|
|
||||||
|
>>> for alg in ('md5','sha1','sha256','sha384','sha512'):
|
||||||
|
... print str(CRYPT(digest_alg=alg,salt=True)('test')[0])
|
||||||
|
md5$...$...
|
||||||
|
sha1$...$...
|
||||||
|
sha256$...$...
|
||||||
|
sha384$...$...
|
||||||
|
sha512$...$...
|
||||||
|
|
||||||
|
The syntax is always alg$salt$hash
|
||||||
|
|
||||||
|
Supports for pbkdf2
|
||||||
|
|
||||||
|
>>> alg = 'pbkdf2(1000,20,sha512)'
|
||||||
|
>>> print str(CRYPT(digest_alg=alg,salt=True)('test')[0])
|
||||||
|
pbkdf2(1000,20,sha512)$...$...
|
||||||
|
|
||||||
|
An optional hmac_key can be specified and it is used as salt prefix
|
||||||
|
|
||||||
|
>>> a = str(CRYPT(digest_alg='md5',key='mykey',salt=True)('test')[0])
|
||||||
|
>>> print a
|
||||||
|
md5$...$...
|
||||||
|
|
||||||
|
Even if the algorithm changes the hash can still be validated
|
||||||
|
|
||||||
|
>>> CRYPT(digest_alg='sha1',key='mykey',salt=True)('test')[0] == a
|
||||||
|
True
|
||||||
|
|
||||||
|
If no salt is specified CRYPT can guess the algorithms from length:
|
||||||
|
|
||||||
>>> a = str(CRYPT(digest_alg='sha1',salt=False)('test')[0])
|
>>> a = str(CRYPT(digest_alg='sha1',salt=False)('test')[0])
|
||||||
>>> a
|
>>> a
|
||||||
@@ -3112,7 +3141,8 @@ class IS_IPV4(Validator):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
doctest.testmod()
|
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user