diff options
author | SVN-Git Migration <python-modules-team@lists.alioth.debian.org> | 2015-10-08 12:22:05 -0700 |
---|---|---|
committer | SVN-Git Migration <python-modules-team@lists.alioth.debian.org> | 2015-10-08 12:22:05 -0700 |
commit | 64221cab08785f6b5289b53341a0da367acd5b1d (patch) | |
tree | 7478827035753ef3f576313f4bd0e6a058ea8005 /src | |
parent | 7d1cd972ba81f86e9161d7708278678a4b8d5f68 (diff) |
Imported Upstream version 1.9.12
Diffstat (limited to 'src')
-rw-r--r-- | src/launchpadlib.egg-info/PKG-INFO | 10 | ||||
-rw-r--r-- | src/launchpadlib.egg-info/SOURCES.txt | 210 | ||||
-rw-r--r-- | src/launchpadlib/NEWS.txt | 8 | ||||
-rw-r--r-- | src/launchpadlib/__init__.py | 2 | ||||
-rw-r--r-- | src/launchpadlib/credentials.py | 28 | ||||
-rw-r--r-- | src/launchpadlib/tests/test_credential_store.py | 40 |
6 files changed, 71 insertions, 227 deletions
diff --git a/src/launchpadlib.egg-info/PKG-INFO b/src/launchpadlib.egg-info/PKG-INFO index a3aed35..9392dbd 100644 --- a/src/launchpadlib.egg-info/PKG-INFO +++ b/src/launchpadlib.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: launchpadlib -Version: 1.9.11 +Version: 1.9.12 Summary: Script Launchpad through its web services interfaces. Officially supported. Home-page: https://help.launchpad.net/API/launchpadlib Author: LAZR Developers @@ -31,6 +31,11 @@ Description: .. NEWS for launchpadlib ===================== + 1.9.12 (2011-12-05) + =================== + - Move keyring base64 encoding to KeyringCredential and be more + defensive about decoding. [bug=900307] + 1.9.11 (2011-11-21) =================== - 1.9.10 was a bad release due to incomplete NEWS entries. @@ -39,7 +44,7 @@ Description: .. - Improve HACKING documentation. - - Imporove launchpadlib directory discovery on Windows. + - Improve launchpadlib directory discovery on Windows. - Added script to delete spurious bugtasks or split a bugtask from a bug. @@ -47,7 +52,6 @@ Description: .. - Base 64 encode serialized credentials before putting in keyring/wallet. - 1.9.10 (2011-11-21) =================== - Base 64 encode serialized credentials before putting in keyring/wallet. diff --git a/src/launchpadlib.egg-info/SOURCES.txt b/src/launchpadlib.egg-info/SOURCES.txt index 4d60a3a..61c80f5 100644 --- a/src/launchpadlib.egg-info/SOURCES.txt +++ b/src/launchpadlib.egg-info/SOURCES.txt @@ -3,216 +3,6 @@ HACKING.txt README.txt ez_setup.py setup.py -eggs/distribute-0.6.24-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/distribute-0.6.24-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/distribute-0.6.24-py2.6.egg/EGG-INFO/entry_points.txt -eggs/distribute-0.6.24-py2.6.egg/EGG-INFO/top_level.txt -eggs/docutils-0.8.1-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/docutils-0.8.1-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/docutils-0.8.1-py2.6.egg/EGG-INFO/top_level.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/README.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamsa.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamsb.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamsc.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamsn.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamso.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isoamsr.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isobox.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isocyr1.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isocyr2.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isodia.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isogrk1.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isogrk2.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isogrk3.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isogrk4-wide.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isogrk4.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isolat1.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isolat2.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomfrk-wide.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomfrk.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomopf-wide.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomopf.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomscr-wide.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isomscr.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isonum.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isopub.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/isotech.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/mmlalias.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/mmlextra-wide.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/mmlextra.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/s5defs.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/xhtml1-lat1.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/xhtml1-special.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/parsers/rst/include/xhtml1-symbol.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/writers/html4css1/template.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/writers/pep_html/template.txt -eggs/docutils-0.8.1-py2.6.egg/docutils/writers/s5_html/themes/README.txt -eggs/elementtree-1.2.7_20070827_preview-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/elementtree-1.2.7_20070827_preview-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/elementtree-1.2.7_20070827_preview-py2.6.egg/EGG-INFO/top_level.txt -eggs/httplib2-0.7.2-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/httplib2-0.7.2-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/httplib2-0.7.2-py2.6.egg/EGG-INFO/top_level.txt -eggs/httplib2-0.7.2-py2.6.egg/httplib2/cacerts.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/EGG-INFO/requires.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/EGG-INFO/top_level.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/lazr/authentication/NEWS.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/lazr/authentication/README.txt -eggs/lazr.authentication-0.1.2-py2.6.egg/lazr/authentication/version.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/EGG-INFO/requires.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/EGG-INFO/top_level.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/NEWS.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/README.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/version.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/authorizer.standalone.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/caching.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/collections.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/entries.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/hosted-files.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/operations.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/retry.standalone.txt -eggs/lazr.restfulclient-0.12.0-py2.6.egg/lazr/restfulclient/docs/toplevel.txt -eggs/simplejson-2.2.1-py2.6-linux-i686.egg/EGG-INFO/SOURCES.txt -eggs/simplejson-2.2.1-py2.6-linux-i686.egg/EGG-INFO/dependency_links.txt -eggs/simplejson-2.2.1-py2.6-linux-i686.egg/EGG-INFO/native_libs.txt -eggs/simplejson-2.2.1-py2.6-linux-i686.egg/EGG-INFO/top_level.txt -eggs/testresources-0.2.4-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/testresources-0.2.4-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/testresources-0.2.4-py2.6.egg/EGG-INFO/top_level.txt -eggs/wsgi_intercept-0.5.1-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/wsgi_intercept-0.5.1-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/wsgi_intercept-0.5.1-py2.6.egg/EGG-INFO/top_level.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/entry_points.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/requires.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/EGG-INFO/top_level.txt -eggs/z3c.recipe.scripts-1.0.1-py2.6.egg/z3c/recipe/scripts/README.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/entry_points.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/requires.txt -eggs/z3c.recipe.tag-0.4.0-py2.6.egg/EGG-INFO/top_level.txt -eggs/zc.buildout-1.5.2-py2.6.egg/README.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/entry_points.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/requires.txt -eggs/zc.buildout-1.5.2-py2.6.egg/EGG-INFO/top_level.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/allowhosts.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/bootstrap.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/buildout.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/debugging.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/dependencylinks.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/distribute.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/download.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/downloadcache.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/easy_install.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/extends-cache.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/repeatable.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/runsetup.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/setup.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/testing.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/testing_bugfix.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/unzip.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/update.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/upgrading_distribute.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/virtualenv.txt -eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/windows.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/entry_points.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/requires.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/top_level.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/zc/recipe/egg/README.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/zc/recipe/egg/api.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/zc/recipe/egg/custom.txt -eggs/zc.recipe.egg-1.3.2-py2.6.egg/zc/recipe/egg/selecting-python.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/entry_points.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/requires.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/EGG-INFO/top_level.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/zc/recipe/testrunner/README.txt -eggs/zc.recipe.testrunner-1.4.0-py2.6.egg/zc/recipe/testrunner/bugfixes.txt -eggs/zope.exceptions-3.6.1-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/zope.exceptions-3.6.1-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/zope.exceptions-3.6.1-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/zope.exceptions-3.6.1-py2.6.egg/EGG-INFO/requires.txt -eggs/zope.exceptions-3.6.1-py2.6.egg/EGG-INFO/top_level.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/SOURCES.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/dependency_links.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/namespace_packages.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/native_libs.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/requires.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/EGG-INFO/top_level.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/README.ru.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/README.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/adapter.ru.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/adapter.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/human.ru.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/human.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/index.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/verify.txt -eggs/zope.interface-3.8.0-py2.6-linux-i686.egg/zope/interface/tests/foodforthought.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/SOURCES.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/dependency_links.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/entry_points.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/namespace_packages.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/requires.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/EGG-INFO/top_level.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-arguments.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-colors.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-coverage-win32.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-coverage.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-debugging.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-discovery.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-edge-cases.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-errors.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-gc.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-knit.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-layers-api.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-layers-buff.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-layers-ntd.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-layers.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-leaks-err.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-leaks.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-profiling-cprofiler.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-profiling.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-progress.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-repeat.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-shuffle.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-simple.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-subunit-err.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-subunit-leaks.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-subunit.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-tb-format.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-test-selection.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-unexpected-success.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-verbose.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-wo-source.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/README.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sampletests.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sampletestsl.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample2/e.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample3/post_mortem5.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample3/post_mortem6.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample3/post_mortem_failure.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample3/set_trace5.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/sample3/set_trace6.txt -eggs/zope.testrunner-4.0.4-py2.6.egg/zope/testrunner/testrunner-ex/usecompiled/README.txt src/launchpadlib/NEWS.txt src/launchpadlib/README.txt src/launchpadlib/__init__.py diff --git a/src/launchpadlib/NEWS.txt b/src/launchpadlib/NEWS.txt index 89d307b..edef10a 100644 --- a/src/launchpadlib/NEWS.txt +++ b/src/launchpadlib/NEWS.txt @@ -2,6 +2,11 @@ NEWS for launchpadlib ===================== +1.9.12 (2011-12-05) +=================== +- Move keyring base64 encoding to KeyringCredential and be more + defensive about decoding. [bug=900307] + 1.9.11 (2011-11-21) =================== - 1.9.10 was a bad release due to incomplete NEWS entries. @@ -10,7 +15,7 @@ NEWS for launchpadlib - Improve HACKING documentation. -- Imporove launchpadlib directory discovery on Windows. +- Improve launchpadlib directory discovery on Windows. - Added script to delete spurious bugtasks or split a bugtask from a bug. @@ -18,7 +23,6 @@ NEWS for launchpadlib - Base 64 encode serialized credentials before putting in keyring/wallet. - 1.9.10 (2011-11-21) =================== - Base 64 encode serialized credentials before putting in keyring/wallet. diff --git a/src/launchpadlib/__init__.py b/src/launchpadlib/__init__.py index 9c9f97d..02dd2bb 100644 --- a/src/launchpadlib/__init__.py +++ b/src/launchpadlib/__init__.py @@ -14,4 +14,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with launchpadlib. If not, see <http://www.gnu.org/licenses/>. -__version__ = '1.9.11' +__version__ = '1.9.12' diff --git a/src/launchpadlib/credentials.py b/src/launchpadlib/credentials.py index 3e3ac0b..4b58a2e 100644 --- a/src/launchpadlib/credentials.py +++ b/src/launchpadlib/credentials.py @@ -36,7 +36,6 @@ import time from urllib import urlencode from urlparse import urljoin import webbrowser -import ConfigParser from base64 import ( b64decode, b64encode, @@ -85,10 +84,6 @@ class Credentials(OAuthAuthorizer): sio = StringIO() self.save(sio) serialized = sio.getvalue() - # Some users have reported problems with corrupted keyrings, both in - # Gnome and KDE, when newlines are included in the password. Avoid - # this problem by base 64 encoding the serialized value. - serialized = b64encode(serialized) return serialized @classmethod @@ -98,8 +93,6 @@ class Credentials(OAuthAuthorizer): This should probably be moved into OAuthAuthorizer. """ credentials = cls() - if 'consumer_key' not in value: - value = b64decode(value) credentials.load(StringIO(value)) return credentials @@ -178,7 +171,7 @@ class Credentials(OAuthAuthorizer): oauth_token=self._request_token.key, oauth_signature='&%s' % self._request_token.secret) url = web_root + access_token_page - headers = {'Referer' : web_root} + headers = {'Referer': web_root} response, content = httplib2.Http().request( url, method='POST', headers=headers, body=urlencode(params)) if response.status != 200: @@ -308,6 +301,8 @@ class KeyringCredentialStore(CredentialStore): integrating third-party websites into Launchpad. """ + B64MARKER = "<B64>" + @staticmethod def _ensure_keyring_imported(): """Ensure the keyring module is imported (postponing side effects). @@ -325,6 +320,10 @@ class KeyringCredentialStore(CredentialStore): """Store newly-authorized credentials in the keyring.""" self._ensure_keyring_imported() serialized = credentials.serialize() + # Some users have reported problems with corrupted keyrings, both in + # Gnome and KDE, when newlines are included in the password. Avoid + # this problem by base 64 encoding the serialized value. + serialized = self.B64MARKER + b64encode(serialized) keyring.set_password( 'launchpadlib', unique_key, serialized) @@ -335,10 +334,21 @@ class KeyringCredentialStore(CredentialStore): 'launchpadlib', unique_key) if credential_string is not None: credential_string = credential_string.encode('utf8') + if credential_string.startswith(self.B64MARKER): + try: + credential_string = b64decode( + credential_string[len(self.B64MARKER):]) + except TypeError: + # The credential_string should be base 64 but cannot be + # decoded. + return None try: credentials = Credentials.from_string(credential_string) return credentials - except ConfigParser.NoOptionError: + except: + # If any error occurs at this point the most reasonable thing + # to do is return no credentials, which will require + # re-authorization but the user will be able to proceed. return None return None diff --git a/src/launchpadlib/tests/test_credential_store.py b/src/launchpadlib/tests/test_credential_store.py index 772101e..d764267 100644 --- a/src/launchpadlib/tests/test_credential_store.py +++ b/src/launchpadlib/tests/test_credential_store.py @@ -1,4 +1,4 @@ -# Copyright 2010 Canonical Ltd. +# Copyright 2010-2011 Canonical Ltd. # This file is part of launchpadlib. # @@ -20,6 +20,8 @@ import os import tempfile import unittest +from base64 import b64decode + from launchpadlib.testing.helpers import ( fake_keyring, InMemoryKeyring, @@ -136,7 +138,6 @@ class TestKeyringCredentialStore(CredentialStoreTestCase): with fake_keyring(self.keyring): self.assertEquals(None, self.store.load("no such key")) - def test_keyring_returns_unicode(self): # Kwallet is reported to sometimes return Unicode, which broke the # credentials parsing. This test ensures a Unicode password is @@ -154,3 +155,38 @@ class TestKeyringCredentialStore(CredentialStoreTestCase): credential2 = self.store.load("unique key") self.assertEquals( credential.consumer.key, credential2.consumer.key) + self.assertEquals( + credential.consumer.secret, credential2.consumer.secret) + + def test_nonencoded_key_handled(self): + # For backwards compatibility with keys that are not base 64 encoded. + + class UnencodedInMemoryKeyring(InMemoryKeyring): + def get_password(self, service, username): + pw = super(UnencodedInMemoryKeyring, self).get_password( + service, username) + return b64decode(pw[5:]) + + self.keyring = UnencodedInMemoryKeyring() + with fake_keyring(self.keyring): + credential = self.make_credential("consumer key") + self.store.save(credential, "unique key") + credential2 = self.store.load("unique key") + self.assertEquals( + credential.consumer.key, credential2.consumer.key) + self.assertEquals( + credential.consumer.secret, credential2.consumer.secret) + + def test_corrupted_key_handled(self): + # A corrupted password results in None being returned. + + class CorruptedInMemoryKeyring(InMemoryKeyring): + def get_password(self, service, username): + return "bad" + + self.keyring = CorruptedInMemoryKeyring() + with fake_keyring(self.keyring): + credential = self.make_credential("consumer key") + self.store.save(credential, "unique key") + credential2 = self.store.load("unique key") + self.assertIsNone(credential2) |