diff --git a/docs/images/callable.png b/docs/images/callable.png index 67a7e492..5dec3a65 100644 Binary files a/docs/images/callable.png and b/docs/images/callable.png differ diff --git a/docs/providers/callable.rst b/docs/providers/callable.rst index 9d1b4b35..a9091e99 100644 --- a/docs/providers/callable.rst +++ b/docs/providers/callable.rst @@ -18,43 +18,21 @@ Example: .. code-block:: python - """`Callable` providers examples.""" + """`Callable` providers example.""" + + from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg - class SomeCrypt(object): + # Password hasher and verifier providers (hash function could be changed + # anytime (for example, to sha512) without any changes in client's code): + password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) + password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - - # Encrypt and decrypt function providers: - encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) - decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - - # Making some asserts: - initial_data = 'some_data' - - encrypted1 = encrypt(initial_data) - decrypted1 = decrypt(encrypted1) - - assert decrypted1 == initial_data - - # Context keyword arguments priority example: - encrypted2 = encrypt(initial_data, password='another_secret') - decrypted2 = decrypt(encrypted2) - - assert decrypted2 != initial_data + # Making some asserts (client's code): + hashed_password = password_hasher('super secret') + assert password_verifier('super secret', hashed_password) diff --git a/examples/providers/callable.py b/examples/providers/callable.py index 73654eb4..a85023dc 100644 --- a/examples/providers/callable.py +++ b/examples/providers/callable.py @@ -1,40 +1,18 @@ -"""`Callable` providers examples.""" +"""`Callable` providers example.""" + +from passlib.hash import sha256_crypt from objects.providers import Callable from objects.injections import KwArg -class SomeCrypt(object): +# Password hasher and verifier providers (hash function could be changed +# anytime (for example, to sha512) without any changes in client's code): +password_hasher = Callable(sha256_crypt.encrypt, + KwArg('salt_size', 16), + KwArg('rounds', 10000)) +password_verifier = Callable(sha256_crypt.verify) - """Example class SomeCrypt.""" - - @staticmethod - def encrypt(data, password): - """Encypt data using password.""" - return ''.join((password, data, password)) - - @staticmethod - def decrypt(data, password): - """Decrypt data using password.""" - return data[len(password):-len(password)] - - -# Encrypt and decrypt function providers: -encrypt = Callable(SomeCrypt.encrypt, - KwArg('password', 'secret123')) -decrypt = Callable(SomeCrypt.decrypt, - KwArg('password', 'secret123')) - -# Making some asserts: -initial_data = 'some_data' - -encrypted1 = encrypt(initial_data) -decrypted1 = decrypt(encrypted1) - -assert decrypted1 == initial_data - -# Context keyword arguments priority example: -encrypted2 = encrypt(initial_data, password='another_secret') -decrypted2 = decrypt(encrypted2) - -assert decrypted2 != initial_data +# Making some asserts (client's code): +hashed_password = password_hasher('super secret') +assert password_verifier('super secret', hashed_password)