From 5dfb3bd4c124c2798319c50b8930bdc50e155e7a Mon Sep 17 00:00:00 2001 From: Jan-Wijbrand Kolman Date: Thu, 18 Feb 2010 13:15:55 +0000 Subject: [PATCH] put package in it new found home --- .installed.cfg | 82 +++++++++++++++++++++++++++++++ CHANGES.txt | 7 +++ LICENSE.txt | 54 ++++++++++++++++++++ README.txt | 11 +++++ bootstrap.py | 55 +++++++++++++++++++++ buildout.cfg | 25 ++++++++++ setup.py | 53 ++++++++++++++++++++ src/z3c/__init__.py | 1 + src/z3c/bcrypt/USAGE.txt | 42 ++++++++++++++++ src/z3c/bcrypt/__init__.py | 2 + src/z3c/bcrypt/configure.zcml | 26 ++++++++++ src/z3c/bcrypt/passwordmanager.py | 41 ++++++++++++++++ src/z3c/bcrypt/tests.py | 21 ++++++++ 13 files changed, 420 insertions(+) create mode 100644 .installed.cfg create mode 100644 CHANGES.txt create mode 100644 LICENSE.txt create mode 100644 README.txt create mode 100644 bootstrap.py create mode 100644 buildout.cfg create mode 100644 setup.py create mode 100644 src/z3c/__init__.py create mode 100644 src/z3c/bcrypt/USAGE.txt create mode 100644 src/z3c/bcrypt/__init__.py create mode 100644 src/z3c/bcrypt/configure.zcml create mode 100644 src/z3c/bcrypt/passwordmanager.py create mode 100644 src/z3c/bcrypt/tests.py diff --git a/.installed.cfg b/.installed.cfg new file mode 100644 index 0000000..608891b --- /dev/null +++ b/.installed.cfg @@ -0,0 +1,82 @@ +[buildout] +installed_develop_eggs = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs/z3c.bcrypt.egg-link +parts = devtools test + +[devtools] +__buildout_installed__ = /home/jw/project/grokdev/z3c.bcrypt/bin/ezmerge + /home/jw/project/grokdev/z3c.bcrypt/bin/ezrevert + /home/jw/project/grokdev/z3c.bcrypt/bin/eazysvn + /home/jw/project/grokdev/z3c.bcrypt/bin/ezswitch + /home/jw/project/grokdev/z3c.bcrypt/bin/ezbranch + /home/jw/project/grokdev/z3c.bcrypt/bin/iptest + /home/jw/project/grokdev/z3c.bcrypt/bin/ipythonx + /home/jw/project/grokdev/z3c.bcrypt/bin/ipcluster + /home/jw/project/grokdev/z3c.bcrypt/bin/ipython + /home/jw/project/grokdev/z3c.bcrypt/bin/pycolor + /home/jw/project/grokdev/z3c.bcrypt/bin/ipcontroller + /home/jw/project/grokdev/z3c.bcrypt/bin/ipengine + /home/jw/project/grokdev/z3c.bcrypt/bin/easy_install + /home/jw/project/grokdev/z3c.bcrypt/bin/easy_install-2.5 + /home/jw/project/grokdev/z3c.bcrypt/bin/fullrelease + /home/jw/project/grokdev/z3c.bcrypt/bin/postrelease + /home/jw/project/grokdev/z3c.bcrypt/bin/lasttagdiff + /home/jw/project/grokdev/z3c.bcrypt/bin/prerelease + /home/jw/project/grokdev/z3c.bcrypt/bin/release + /home/jw/project/grokdev/z3c.bcrypt/bin/longtest + /home/jw/project/grokdev/z3c.bcrypt/bin/python +__buildout_signature__ = zc.recipe.egg-1.2.2-py2.5.egg setuptools-0.6c11-py2.5.egg zc.buildout-1.4.3-py2.5.egg +_b = /home/jw/project/grokdev/z3c.bcrypt/bin +_d = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs +_e = /home/jw/.buildout/eggs +bin-directory = /home/jw/project/grokdev/z3c.bcrypt/bin +develop-eggs-directory = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs +eggs = %(__buildout_space_n__)sz3c.bcrypt + z3c.bcrypt [test] + cryptacular + eazysvn + ipython + setuptools + zest.releaser +eggs-directory = /home/jw/.buildout/eggs +executable = /home/jw/py2.5/bin/python +interpreter = python +recipe = zc.recipe.egg + +[test] +__buildout_installed__ = /home/jw/project/grokdev/z3c.bcrypt/parts/test + /home/jw/project/grokdev/z3c.bcrypt/bin/test +__buildout_signature__ = zc.recipe.testrunner-1.2.0-py2.5.egg zc.recipe.egg-1.2.2-py2.5.egg setuptools-0.6c11-py2.5.egg zope.testing-3.8.7-py2.5.egg zc.buildout-1.4.3-py2.5.egg zope.interface-3.5.2-py2.5-linux-i686.egg zope.exceptions-3.5.2-py2.5.egg +_b = /home/jw/project/grokdev/z3c.bcrypt/bin +_d = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs +_e = /home/jw/.buildout/eggs +bin-directory = /home/jw/project/grokdev/z3c.bcrypt/bin +defaults = ['-v'] +develop-eggs-directory = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs +eggs = %(__buildout_space_n__)sz3c.bcrypt + z3c.bcrypt [test] +eggs-directory = /home/jw/.buildout/eggs +executable = /home/jw/py2.5/bin/python +location = /home/jw/project/grokdev/z3c.bcrypt/parts/test +recipe = zc.recipe.testrunner +script = /home/jw/project/grokdev/z3c.bcrypt/bin/test + +[buildout] +parts = test devtools + +[buildout] +installed_develop_eggs = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs/z3c.bcrypt.egg-link + +[buildout] +parts = devtools test + +[buildout] +parts = test devtools + +[buildout] +installed_develop_eggs = /home/jw/project/grokdev/z3c.bcrypt/develop-eggs/z3c.bcrypt.egg-link + +[buildout] +parts = devtools test + +[buildout] +parts = test devtools diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000..e2f6fd5 --- /dev/null +++ b/CHANGES.txt @@ -0,0 +1,7 @@ +Changelog of z3c.bcrypt +======================= + +1.0 (unreleased) +---------------- + +- Initial public release. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0f06d96 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,54 @@ +Zope Public License (ZPL) Version 2.1 +------------------------------------- + +A copyright notice accompanies this license document that +identifies the copyright holders. + +This license has been certified as open source. It has also +been designated as GPL compatible by the Free Software +Foundation (FSF). + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the +following conditions are met: + +1. Redistributions in source code must retain the + accompanying copyright notice, this list of conditions, + and the following disclaimer. + +2. Redistributions in binary form must reproduce the accompanying + copyright notice, this list of conditions, and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Names of the copyright holders must not be used to + endorse or promote products derived from this software + without prior written permission from the copyright + holders. + +4. The right to distribute this software or to use it for + any purpose does not give you the right to use + Servicemarks (sm) or Trademarks (tm) of the copyright + holders. Use of them is covered by separate agreement + with the copyright holders. + +5. If any files are modified, you must cause the modified + files to carry prominent notices stating that you changed + the files and the date of any change. + +Disclaimer + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' + AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + NO EVENT SHALL THE COPYRIGHT HOLDERS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b9f8bd7 --- /dev/null +++ b/README.txt @@ -0,0 +1,11 @@ +z3c.bcrypt +========== + +z3c.bcrypt provides `zope.password`_ compatible "password manager" utilities +that use bcrypt (or alternatively pbkdf2) encoding for storing passwords. + +Both encoding schemes are implemented in the cryptacular_ library that is +a dependency for this pacakge. + +.. _`zope.password`: http://pypi.python.org/pypi/zope.password +.. _cryptacular: http://pypi.python.org/pypi/cryptacular diff --git a/bootstrap.py b/bootstrap.py new file mode 100644 index 0000000..1bfffe3 --- /dev/null +++ b/bootstrap.py @@ -0,0 +1,55 @@ +############################################################################## +# +# Copyright (c) 2006 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Bootstrap a buildout-based project + +Simply run this script in a directory containing a buildout.cfg. +The script accepts buildout command-line options, so you can +use the -c option to specify an alternate configuration file. + +$Id$ +""" + +import os, shutil, sys, tempfile, urllib2 + +tmpeggs = tempfile.mkdtemp() + +try: + import pkg_resources +except ImportError: + ez = {} + exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py' + ).read() in ez + ez['use_setuptools'](to_dir=tmpeggs, download_delay=0) + + import pkg_resources + +cmd = 'from setuptools.command.easy_install import main; main()' +if sys.platform == 'win32': + cmd = '"%s"' % cmd # work around spawn lamosity on windows + +ws = pkg_resources.working_set +assert os.spawnle( + os.P_WAIT, sys.executable, sys.executable, + '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout', + dict(os.environ, + PYTHONPATH= + ws.find(pkg_resources.Requirement.parse('setuptools')).location + ), + ) == 0 + +ws.add_entry(tmpeggs) +ws.require('zc.buildout') +import zc.buildout.buildout +zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap']) +shutil.rmtree(tmpeggs) diff --git a/buildout.cfg b/buildout.cfg new file mode 100644 index 0000000..9eed57c --- /dev/null +++ b/buildout.cfg @@ -0,0 +1,25 @@ +[buildout] +develop = . +extensions = buildout.dumppickedversions +parts = test devtools +prefer-final = true +unzip = true + +[test] +recipe = zc.recipe.testrunner +defaults = ['-v'] +eggs = + z3c.bcrypt + z3c.bcrypt [test] + +[devtools] +recipe = zc.recipe.egg +interpreter = python +eggs = + z3c.bcrypt + z3c.bcrypt [test] + cryptacular + eazysvn + ipython + setuptools + zest.releaser diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..81cb96c --- /dev/null +++ b/setup.py @@ -0,0 +1,53 @@ +from setuptools import setup, find_packages +import os.path + +version = '1.0dev' + +readme = open('README.txt').read() +changes = open('CHANGES.txt').read() +usage = open(os.path.join( + 'src', 'z3c', 'bcrypt', 'USAGE.txt')).read() + +long_description = '\n\n'.join([readme, usage, changes, '']) + +setup(name='z3c.bcrypt', + version=version, + description=( + "Password manager utility using bcrypt or pbkdf2 encoding. " + "Useful in combination with zope.password"), + long_description=long_description, + classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Web Environment', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: Zope Public License', + 'Programming Language :: Python', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Topic :: Internet :: WWW/HTTP', + 'Framework :: Zope3'], + keywords='zope authentication password bcrypy pbkdf2', + author = "The Health Agency and the Zope Community", + author_email = "zope3-dev@zope.org", + url='http://pypi.python.org/pypi/z3c.bcrypt', + license='ZPL 2.1', + package_dir={'': 'src'}, + packages=find_packages('src'), + namespace_packages=['z3c'], + include_package_data=True, + zip_safe=False, + install_requires=[ + 'setuptools', + 'cryptacular', + 'zope.interface', + 'zope.password', + ], + extras_require = dict( + test = [ + 'zope.testing', + ], + ), + entry_points={ + 'console_scripts': [] + }, + ) diff --git a/src/z3c/__init__.py b/src/z3c/__init__.py new file mode 100644 index 0000000..de40ea7 --- /dev/null +++ b/src/z3c/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/src/z3c/bcrypt/USAGE.txt b/src/z3c/bcrypt/USAGE.txt new file mode 100644 index 0000000..7356b33 --- /dev/null +++ b/src/z3c/bcrypt/USAGE.txt @@ -0,0 +1,42 @@ +z3c.bcrypt +=========== + + >>> from zope.interface.verify import verifyObject + >>> from zope.password.interfaces import IPasswordManager + >>> from z3c.bcrypt import BcryptPasswordManager + >>> manager = BcryptPasswordManager() + >>> verifyObject(IPasswordManager, manager) + True + + >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}" + + >>> encoded = manager.encodePassword(password) + >>> encoded + '$2a$...' + >>> manager.checkPassword(encoded, password) + True + >>> manager.checkPassword(encoded, password + u"wrong") + False + + >>> from z3c.bcrypt import PBKDF2PasswordManager + >>> manager = PBKDF2PasswordManager() + >>> verifyObject(IPasswordManager, manager) + True + + >>> encoded = manager.encodePassword(password) + >>> encoded + '$p5k2$...' + >>> manager.checkPassword(encoded, password) + True + >>> manager.checkPassword(encoded, password + u"wrong") + False + + >>> # A previously encoded password, should be decodable even if the + >>> # current encoding of the same password is different:: + >>> previouslyencoded = ( + ... '$p5k2$1000$LgAFPIlc9CgrlSaxHyTUMA=' + ... '=$IuUYplhMkR4qCl8-ONRVjEgJNwE=') + >>> encoded == previouslyencoded + False + >>> manager.checkPassword(previouslyencoded , password) + True diff --git a/src/z3c/bcrypt/__init__.py b/src/z3c/bcrypt/__init__.py new file mode 100644 index 0000000..8630d3a --- /dev/null +++ b/src/z3c/bcrypt/__init__.py @@ -0,0 +1,2 @@ +from z3c.bcrypt.passwordmanager import BcryptPasswordManager +from z3c.bcrypt.passwordmanager import PBKDF2PasswordManager diff --git a/src/z3c/bcrypt/configure.zcml b/src/z3c/bcrypt/configure.zcml new file mode 100644 index 0000000..9ffe649 --- /dev/null +++ b/src/z3c/bcrypt/configure.zcml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/z3c/bcrypt/passwordmanager.py b/src/z3c/bcrypt/passwordmanager.py new file mode 100644 index 0000000..e5cea04 --- /dev/null +++ b/src/z3c/bcrypt/passwordmanager.py @@ -0,0 +1,41 @@ +############################################################################## +# +# Copyright (c) 2007-2008 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Password Managers using bcrypt or pbkdf2 encoding. +""" + +from zope.interface import implements +from zope.password.interfaces import IPasswordManager +from cryptacular import bcrypt, pbkdf2 + +class BcryptPasswordManager(object): + """bcrypt password manager. + """ + + implements(IPasswordManager) + + def __init__(self): + self._manager = bcrypt.BCRYPTPasswordManager() + + def encodePassword(self, password, salt=None): + return self._manager.encode(password) + + def checkPassword(self, encoded_password, password): + return self._manager.check(encoded_password, password) + +class PBKDF2PasswordManager(BcryptPasswordManager): + """pbkdf2 password manager. + """ + + def __init__(self): + self._manager = pbkdf2.PBKDF2PasswordManager() diff --git a/src/z3c/bcrypt/tests.py b/src/z3c/bcrypt/tests.py new file mode 100644 index 0000000..c9ae944 --- /dev/null +++ b/src/z3c/bcrypt/tests.py @@ -0,0 +1,21 @@ +############################################################################## +# +# Copyright (c) 2007-2008 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +import unittest +from zope.testing import doctest + +def test_suite(): + return unittest.TestSuite(( + doctest.DocFileSuite( + 'USAGE.txt', optionflags=doctest.ELLIPSIS), + )) \ No newline at end of file