summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 12:22:05 -0700
committerSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 12:22:05 -0700
commit64221cab08785f6b5289b53341a0da367acd5b1d (patch)
tree7478827035753ef3f576313f4bd0e6a058ea8005 /src
parent7d1cd972ba81f86e9161d7708278678a4b8d5f68 (diff)
Imported Upstream version 1.9.12
Diffstat (limited to 'src')
-rw-r--r--src/launchpadlib.egg-info/PKG-INFO10
-rw-r--r--src/launchpadlib.egg-info/SOURCES.txt210
-rw-r--r--src/launchpadlib/NEWS.txt8
-rw-r--r--src/launchpadlib/__init__.py2
-rw-r--r--src/launchpadlib/credentials.py28
-rw-r--r--src/launchpadlib/tests/test_credential_store.py40
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)