Hello community, here is the log from the commit of package python-keyring for openSUSE:Factory checked in at 2016-09-08 17:37:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-keyring (Old) and /work/SRC/openSUSE:Factory/.python-keyring.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-keyring" Changes: -------- --- /work/SRC/openSUSE:Factory/python-keyring/python-keyring.changes 2016-06-12 18:53:14.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-keyring.new/python-keyring.changes 2016-09-08 17:37:21.000000000 +0200 @@ -1,0 +2,36 @@ +Fri Aug 12 21:41:15 UTC 2016 - [email protected] + +- update to 9.3.1: + * Link to the new Gitter chat room is now in the + readme. + * Issue #235: ``kwallet`` backend now returns + string objects instead of ``dbus.String`` objects, + for less surprising reprs. + * Minor doc fixes. + +------------------------------------------------------------------- +Wed Jun 29 13:34:12 UTC 2016 - [email protected] + +- update to 9.3: +9.3 +--- +* Pull Request #226: In SecretService backend, unlock + individual entries. +9.2.1 +----- +* Issue #230: Don't rely on dbus-python and instead + defer to SecretStorage to describe the installation + requirements. +9.2 +--- +* Issue #231 via #233: On Linux, ``secretstorage`` + is now a declared dependency, allowing recommended + keyring to work simply after installation. +9.1 +--- +* Issue #83 via #229: ``kwallet`` backend now stores + the service name as a folder name in the backend rather + than storing all passwords in a Python folder. +- Adjust Requires +- Use pypi.io for Source url +------------------------------------------------------------------- Old: ---- keyring-9.0.tar.gz New: ---- keyring-9.3.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-keyring.spec ++++++ --- /var/tmp/diff_new_pack.JZnDZA/_old 2016-09-08 17:37:21.000000000 +0200 +++ /var/tmp/diff_new_pack.JZnDZA/_new 2016-09-08 17:37:21.000000000 +0200 @@ -17,13 +17,13 @@ Name: python-keyring -Version: 9.0 +Version: 9.3.1 Release: 0 Url: https://bitbucket.org/kang/python-keyring-lib Summary: Store and access your passwords safely License: Python-2.0 and MIT Group: Development/Languages/Python -Source: https://pypi.python.org/packages/source/k/keyring/keyring-%{version}.tar.gz +Source: https://pypi.io/packages/source/k/keyring/keyring-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: python-devel >= 2.7 BuildRequires: python-setuptools @@ -35,6 +35,7 @@ %if 0%{?suse_version} && 0%{?suse_version} <= 1110 BuildRequires: python-unittest2 %endif +Requires: python-SecretStorage Requires: python-setuptools Requires(post): update-alternatives Requires(postun): update-alternatives ++++++ keyring-9.0.tar.gz -> keyring-9.3.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/.hgignore new/keyring-9.3.1/.hgignore --- old/keyring-9.0/.hgignore 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/.hgignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,2 +0,0 @@ -build -dist diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/.hgtags new/keyring-9.3.1/.hgtags --- old/keyring-9.0/.hgtags 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/.hgtags 2016-07-14 16:12:11.000000000 +0200 @@ -110,3 +110,8 @@ 45a70dfe822cbdc889142e1d984a5074396ba711 8.6 87d6d34cdea1b3b40bb60c3286b672c69ec49223 8.6.1 d8633f6d4baf8abcffa80c456a89bf0ff09ff706 8.7 +a17bfebdf428e42ff31b71beee3e700b8329acdf 9.0 +e0adabb76d3d729c55c9211d9f5314fcce210149 9.1 +074f2c9cade6bc89372133e6d2674cfcff4b4194 9.2 +3cc50ae65bc4ceef0ce7d06f8b455d3e655396f3 9.2.1 +94e5cb8fd63b71ed9f711d3c3abeaaf9b7fd0e1d 9.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/CHANGES.rst new/keyring-9.3.1/CHANGES.rst --- old/keyring-9.0/CHANGES.rst 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/CHANGES.rst 2016-07-14 16:12:11.000000000 +0200 @@ -1,6 +1,43 @@ CHANGES ======= +9.3.1 +----- + +* Link to the new Gitter chat room is now in the + readme. +* Issue #235: ``kwallet`` backend now returns + string objects instead of ``dbus.String`` objects, + for less surprising reprs. +* Minor doc fixes. + +9.3 +--- + +* Issue #161: In SecretService backend, unlock + individual entries. + +9.2.1 +----- + +* Issue #230: Don't rely on dbus-python and instead + defer to SecretStorage to describe the installation + requirements. + +9.2 +--- + +* Issue #231 via #233: On Linux, ``secretstorage`` + is now a declared dependency, allowing recommended + keyring to work simply after installation. + +9.1 +--- + +* Issue #83 via #229: ``kwallet`` backend now stores + the service name as a folder name in the backend rather + than storing all passwords in a Python folder. + 9.0 --- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/PKG-INFO new/keyring-9.3.1/PKG-INFO --- old/keyring-9.0/PKG-INFO 2016-04-10 21:47:14.000000000 +0200 +++ new/keyring-9.3.1/PKG-INFO 2016-07-14 16:12:52.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: keyring -Version: 9.0 +Version: 9.3.1 Summary: Store and access your passwords safely. Home-page: https://github.com/jaraco/keyring Author: Jason R. Coombs @@ -26,8 +26,9 @@ * Mac OS X `Keychain <https://en.wikipedia.org/wiki/Keychain_%28software%29>`_ - * Linux Secret Service (requires `secretstorage - <https://pypi.python.org/pypi/secretstorage>`_) + * Freedesktop `Secret Service + <http://standards.freedesktop.org/secret-service/>`_ (requires + `secretstorage <https://pypi.python.org/pypi/secretstorage>`_) * `KWallet <https://en.wikipedia.org/wiki/KWallet>`_ (requires `dbus <https://pypi.python.org/pypi/dbus-python>`_) * `Windows Credential Vault @@ -40,20 +41,21 @@ Installation Instructions ------------------------- - easy_install or pip - =================== + Install from Index + ================== - Run easy_install or pip:: + Install using your favorite installer. For example: - $ easy_install keyring $ pip install keyring - Source installation - =================== - - Download the source tarball from https://pypi.python.org/pypi/keyring, - uncompress it, and then run "setup.py install". + Linux + ----- + On Linux, the recommended keyring relies on SecretStorage, which in + turn relies on dbus-python, but dbus-python does not install correctly + when using the Python installers, so dbus-python must be installed + as a system package. See `SecretStorage + <https://github.com/mitya57/secretstorage>`_ for details. ------------- Using Keyring @@ -187,6 +189,30 @@ print("failed to store password") print("password", keyring.get_password("demo-service", "tarek")) + + Using Keyring on Ubuntu 16.04 + ============================= + + The following is a complete transcript for installing keyring in a + virtual environment on Ubuntu 16.04. No config file was used.:: + + $ sudo apt install python3-venv libdbus-glib-1-dev + $ cd /tmp + $ pyvenv py3 + $ source py3/bin/activate + $ pip install -U pip + $ pip install secretstorage dbus-python + $ pip install keyring + $ python + >>> import keyring + >>> keyring.get_keyring() + <keyring.backends.SecretService.Keyring object at 0x7f9b9c971ba8> + >>> keyring.set_password("system", "username", "password") + >>> keyring.get_password("system", "username") + 'password' + + + Using Keyring on headless Linux systems ======================================= @@ -269,7 +295,7 @@ ------------------- Keyring is instrumented with `pytest runner - <https://bitbucket.org/jaraco/pytest-runner>`_. Thus, you may invoke the tests + <https://github.com/pytest-dev/pytest-runner>`_. Thus, you may invoke the tests from any supported Python (with setuptools installed) using this command:: python setup.py test @@ -319,6 +345,11 @@ .. _this post: http://tarekziade.wordpress.com/2009/03/27/pycon-hallway-session-1-a-keyring-library-for-python/ .. _Google Summer of Code: http://socghop.appspot.com/ + + .. image:: https://badges.gitter.im/jaraco/keyring.svg + :alt: Join the chat at https://gitter.im/jaraco/keyring + :target: https://gitter.im/jaraco/keyring?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + Keywords: keyring Keychain GnomeKeyring Kwallet password storage Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/README.rst new/keyring-9.3.1/README.rst --- old/keyring-9.0/README.rst 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/README.rst 2016-07-14 16:12:11.000000000 +0200 @@ -18,8 +18,9 @@ * Mac OS X `Keychain <https://en.wikipedia.org/wiki/Keychain_%28software%29>`_ -* Linux Secret Service (requires `secretstorage - <https://pypi.python.org/pypi/secretstorage>`_) +* Freedesktop `Secret Service + <http://standards.freedesktop.org/secret-service/>`_ (requires + `secretstorage <https://pypi.python.org/pypi/secretstorage>`_) * `KWallet <https://en.wikipedia.org/wiki/KWallet>`_ (requires `dbus <https://pypi.python.org/pypi/dbus-python>`_) * `Windows Credential Vault @@ -32,20 +33,21 @@ Installation Instructions ------------------------- -easy_install or pip -=================== +Install from Index +================== -Run easy_install or pip:: +Install using your favorite installer. For example: - $ easy_install keyring $ pip install keyring -Source installation -=================== - -Download the source tarball from https://pypi.python.org/pypi/keyring, -uncompress it, and then run "setup.py install". +Linux +----- +On Linux, the recommended keyring relies on SecretStorage, which in +turn relies on dbus-python, but dbus-python does not install correctly +when using the Python installers, so dbus-python must be installed +as a system package. See `SecretStorage +<https://github.com/mitya57/secretstorage>`_ for details. ------------- Using Keyring @@ -179,6 +181,30 @@ print("failed to store password") print("password", keyring.get_password("demo-service", "tarek")) + +Using Keyring on Ubuntu 16.04 +============================= + +The following is a complete transcript for installing keyring in a +virtual environment on Ubuntu 16.04. No config file was used.:: + + $ sudo apt install python3-venv libdbus-glib-1-dev + $ cd /tmp + $ pyvenv py3 + $ source py3/bin/activate + $ pip install -U pip + $ pip install secretstorage dbus-python + $ pip install keyring + $ python + >>> import keyring + >>> keyring.get_keyring() + <keyring.backends.SecretService.Keyring object at 0x7f9b9c971ba8> + >>> keyring.set_password("system", "username", "password") + >>> keyring.get_password("system", "username") + 'password' + + + Using Keyring on headless Linux systems ======================================= @@ -261,7 +287,7 @@ ------------------- Keyring is instrumented with `pytest runner -<https://bitbucket.org/jaraco/pytest-runner>`_. Thus, you may invoke the tests +<https://github.com/pytest-dev/pytest-runner>`_. Thus, you may invoke the tests from any supported Python (with setuptools installed) using this command:: python setup.py test @@ -310,3 +336,8 @@ .. _this post: http://tarekziade.wordpress.com/2009/03/27/pycon-hallway-session-1-a-keyring-library-for-python/ .. _Google Summer of Code: http://socghop.appspot.com/ + + +.. image:: https://badges.gitter.im/jaraco/keyring.svg + :alt: Join the chat at https://gitter.im/jaraco/keyring + :target: https://gitter.im/jaraco/keyring?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/hook-keyring.backend.py new/keyring-9.3.1/hook-keyring.backend.py --- old/keyring-9.0/hook-keyring.backend.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/hook-keyring.backend.py 2016-07-14 16:12:11.000000000 +0200 @@ -7,3 +7,10 @@ 'keyring.backends.' + mod_name for mod_name in _backend_mod_names ] + +import pkg_resources + +hiddenimports.extend( + ep.module_name + for ep in pkg_resources.iter_entry_points('keyring.backends') +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring/backends/SecretService.py new/keyring-9.3.1/keyring/backends/SecretService.py --- old/keyring-9.0/keyring/backends/SecretService.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/keyring/backends/SecretService.py 2016-07-14 16:12:11.000000000 +0200 @@ -52,6 +52,9 @@ items = collection.search_items( {"username": username, "service": service}) for item in items: + if hasattr(item, 'unlock'): + if item.is_locked() and item.unlock()[0]: + raise InitError('failed to unlock item') return item.get_secret().decode('utf-8') def set_password(self, service, username, password): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring/backends/kwallet.py new/keyring-9.3.1/keyring/backends/kwallet.py --- old/keyring-9.0/keyring/backends/kwallet.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/keyring/backends/kwallet.py 2016-07-14 16:12:11.000000000 +0200 @@ -14,7 +14,6 @@ class DBusKeyring(KeyringBackend): """KDE KWallet via D-Bus""" - folder = 'Python' appid = 'Python program' @properties.ClassProperty @@ -36,7 +35,29 @@ super(DBusKeyring, self).__init__(*arg, **kw) self.handle = -1 - def connected(self): + def _migrate(self, service): + old_folder = 'Python' + entry_list = [] + if self.iface.hasFolder(self.handle, old_folder, self.appid): + entry_list = self.iface.readPasswordList( + self.handle, old_folder, '*@*', self.appid) + + for entry in entry_list.items(): + key = entry[0] + password = entry[1] + + username, service = key.rsplit('@', 1) + ret = self.iface.writePassword( + self.handle, service, username, password, self.appid) + if ret == 0: + self.iface.removeEntry(self.handle, old_folder, key, self.appid) + + entry_list = self.iface.readPasswordList( + self.handle, old_folder, '*', self.appid) + if not entry_list: + self.iface.removeFolder(self.handle, old_folder, self.appid) + + def connected(self, service): if self.handle >= 0: return True bus = dbus.SessionBus() @@ -50,39 +71,36 @@ self.handle = -1 if self.handle < 0: return False - if not self.iface.hasFolder(self.handle, self.folder, self.appid): - self.iface.createFolder(self.handle, self.folder, self.appid) + self._migrate(service) return True def get_password(self, service, username): """Get password of the username for the service """ - key = username + '@' + service - if not self.connected(): + if not self.connected(service): # the user pressed "cancel" when prompted to unlock their keyring. return None - if not self.iface.hasEntry(self.handle, self.folder, key, self.appid): + if not self.iface.hasEntry(self.handle, service, username, self.appid): return None - return self.iface.readPassword( - self.handle, self.folder, key, self.appid) + password = self.iface.readPassword( + self.handle, service, username, self.appid) + return str(password) def set_password(self, service, username, password): """Set password for the username of the service """ - key = username + '@' + service - if not self.connected(): + if not self.connected(service): # the user pressed "cancel" when prompted to unlock their keyring. raise PasswordSetError("Cancelled by user") self.iface.writePassword( - self.handle, self.folder, key, password, self.appid) + self.handle, service, username, password, self.appid) def delete_password(self, service, username): """Delete the password for the username of the service. """ - key = username + '@' + service - if not self.connected(): + if not self.connected(service): # the user pressed "cancel" when prompted to unlock their keyring. raise PasswordDeleteError("Cancelled by user") - if not self.iface.hasEntry(self.handle, self.folder, key, self.appid): + if not self.iface.hasEntry(self.handle, service, username, self.appid): raise PasswordDeleteError("Password not found") - self.iface.removeEntry(self.handle, self.folder, key, self.appid) + self.iface.removeEntry(self.handle, service, username, self.appid) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring/core.py new/keyring-9.3.1/keyring/core.py --- old/keyring-9.0/keyring/core.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/keyring/core.py 2016-07-14 16:12:11.000000000 +0200 @@ -62,7 +62,6 @@ """ Load a keyring specified in the config file or infer the best available. """ - _load_library_extensions() keyrings = filter(limit, backend.get_all_keyring()) set_keyring( @@ -146,40 +145,5 @@ except (configparser.NoOptionError, configparser.NoSectionError): pass -@once -def _load_library_extensions(): - """ - Locate all setuptools entry points by the name 'keyring backends' - and initialize them. - - Any third-party library may register an entry point by adding the - following to their setup.py:: - - entry_points = { - 'keyring backends': [ - 'plugin name = mylib.mymodule:initialize_func', - ], - }, - - `plugin name` can be anything. - `initialize_func` is optional and will be invoked by keyring on startup. - - Most plugins will simply provide or import a KeyringBackend in `mymodule`. - """ - group = 'keyring backends' - try: - pkg_resources = __import__('pkg_resources') - except ImportError: - return - entry_points = pkg_resources.iter_entry_points(group=group) - for ep in entry_points: - try: - log.info('Loading keyring backends from %s', ep.name) - init_func = ep.load() - if callable(init_func): - init_func() - except Exception as exc: - log.exception("Error initializing plugin %s (%s).", ep, exc) - # init the _keyring_backend init_backend() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring/tests/backends/test_kwallet.py new/keyring-9.3.1/keyring/tests/backends/test_kwallet.py --- old/keyring-9.0/keyring/tests/backends/test_kwallet.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/keyring/tests/backends/test_kwallet.py 2016-07-14 16:12:11.000000000 +0200 @@ -1,11 +1,68 @@ +import string import unittest from keyring.backends import kwallet +from ..util import random_string from ..test_backend import BackendBasicTests - @unittest.skipUnless(kwallet.DBusKeyring.viable, "Need DBus") class DBusKWalletTestCase(BackendBasicTests, unittest.TestCase): + # Remove '@' from service name as this is not supported in service names + # '@' will cause troubles during migration of kwallet entries + DIFFICULT_CHARS = BackendBasicTests.DIFFICULT_CHARS.replace('@', '') + def init_keyring(self): return kwallet.DBusKeyring() + + def tearDown(self): + for item in self.credentials_created: + # Suppress errors, as only one pre/post migration item will be present + try: + self.keyring.delete_password(*item) + except: + pass + + # TODO Remove empty folders created during tests + + def set_password(self, service, username, password, old_format=False): + # set the password and save the result so the test runner can clean + # up after if necessary. + self.credentials_created.add((service, username)) + + if old_format: + username = username+'@'+service + service = 'Python' + + super(DBusKWalletTestCase, self).set_password(service, username, password) + + def check_set_get(self, service, username, password): + keyring = self.keyring + + # for the non-existent password + self.assertEqual(keyring.get_password(service, username), None) + + # common usage + self.set_password(service, username, password, True) + # re-init keyring to force migration + self.keyring = keyring = self.init_keyring() + ret_password = keyring.get_password(service, username) + self.assertEqual( + ret_password, password, + "Incorrect password for username: '%s' on service: '%s'. '%s' != '%s'" + % (service, username, ret_password, password)) + + # for the empty password + self.set_password(service, username, "", True) + # re-init keyring to force migration + self.keyring = keyring = self.init_keyring() + ret_password = keyring.get_password(service, username) + self.assertEqual( + ret_password, "", + "Incorrect password for username: '%s' on service: '%s'. '%s' != '%s'" + % (service, username, ret_password, "")) + ret_password = keyring.get_password('Python', username+'@'+service) + self.assertEqual( + ret_password, None, + "Not 'None' password returned for username: '%s' on service: '%s'. '%s' != '%s'. Passwords from old folder should be deleted during migration." + % (service, username, ret_password, None)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring/tests/test_backend.py new/keyring-9.3.1/keyring/tests/test_backend.py --- old/keyring-9.0/keyring/tests/test_backend.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/keyring/tests/test_backend.py 2016-07-14 16:12:11.000000000 +0200 @@ -14,7 +14,6 @@ from .util import random_string from keyring import errors -DIFFICULT_CHARS = string.whitespace + string.punctuation # unicode only characters # Sourced from The Quick Brown Fox... Pangrams # http://www.columbia.edu/~fdc/utf8/ @@ -32,6 +31,8 @@ """Test for the keyring's basic functions. password_set and password_get """ + DIFFICULT_CHARS = string.whitespace + string.punctuation + def setUp(self): self.keyring = self.init_keyring() self.credentials_created = set() @@ -67,30 +68,30 @@ self.check_set_get(service, username, password) def test_difficult_chars(self): - password = random_string(20, DIFFICULT_CHARS) - username = random_string(20, DIFFICULT_CHARS) - service = random_string(20, DIFFICULT_CHARS) + password = random_string(20, self.DIFFICULT_CHARS) + username = random_string(20, self.DIFFICULT_CHARS) + service = random_string(20, self.DIFFICULT_CHARS) self.check_set_get(service, username, password) def test_delete_present(self): - password = random_string(20, DIFFICULT_CHARS) - username = random_string(20, DIFFICULT_CHARS) - service = random_string(20, DIFFICULT_CHARS) + password = random_string(20, self.DIFFICULT_CHARS) + username = random_string(20, self.DIFFICULT_CHARS) + service = random_string(20, self.DIFFICULT_CHARS) self.keyring.set_password(service, username, password) self.keyring.delete_password(service, username) self.assertIsNone(self.keyring.get_password(service, username)) def test_delete_not_present(self): - username = random_string(20, DIFFICULT_CHARS) - service = random_string(20, DIFFICULT_CHARS) + username = random_string(20, self.DIFFICULT_CHARS) + service = random_string(20, self.DIFFICULT_CHARS) self.assertRaises(errors.PasswordDeleteError, self.keyring.delete_password, service, username) def test_delete_one_in_group(self): - username1 = random_string(20, DIFFICULT_CHARS) - username2 = random_string(20, DIFFICULT_CHARS) - password = random_string(20, DIFFICULT_CHARS) - service = random_string(20, DIFFICULT_CHARS) + username1 = random_string(20, self.DIFFICULT_CHARS) + username2 = random_string(20, self.DIFFICULT_CHARS) + password = random_string(20, self.DIFFICULT_CHARS) + service = random_string(20, self.DIFFICULT_CHARS) self.keyring.set_password(service, username1, password) self.set_password(service, username2, password) self.keyring.delete_password(service, username1) @@ -105,7 +106,7 @@ def test_unicode_and_ascii_chars(self): source = (random_string(10, UNICODE_CHARS) + random_string(10) + - random_string(10, DIFFICULT_CHARS)) + random_string(10, self.DIFFICULT_CHARS)) password = random_string(20, source) username = random_string(20, source) service = random_string(20, source) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring.egg-info/PKG-INFO new/keyring-9.3.1/keyring.egg-info/PKG-INFO --- old/keyring-9.0/keyring.egg-info/PKG-INFO 2016-04-10 21:47:14.000000000 +0200 +++ new/keyring-9.3.1/keyring.egg-info/PKG-INFO 2016-07-14 16:12:52.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: keyring -Version: 9.0 +Version: 9.3.1 Summary: Store and access your passwords safely. Home-page: https://github.com/jaraco/keyring Author: Jason R. Coombs @@ -26,8 +26,9 @@ * Mac OS X `Keychain <https://en.wikipedia.org/wiki/Keychain_%28software%29>`_ - * Linux Secret Service (requires `secretstorage - <https://pypi.python.org/pypi/secretstorage>`_) + * Freedesktop `Secret Service + <http://standards.freedesktop.org/secret-service/>`_ (requires + `secretstorage <https://pypi.python.org/pypi/secretstorage>`_) * `KWallet <https://en.wikipedia.org/wiki/KWallet>`_ (requires `dbus <https://pypi.python.org/pypi/dbus-python>`_) * `Windows Credential Vault @@ -40,20 +41,21 @@ Installation Instructions ------------------------- - easy_install or pip - =================== + Install from Index + ================== - Run easy_install or pip:: + Install using your favorite installer. For example: - $ easy_install keyring $ pip install keyring - Source installation - =================== - - Download the source tarball from https://pypi.python.org/pypi/keyring, - uncompress it, and then run "setup.py install". + Linux + ----- + On Linux, the recommended keyring relies on SecretStorage, which in + turn relies on dbus-python, but dbus-python does not install correctly + when using the Python installers, so dbus-python must be installed + as a system package. See `SecretStorage + <https://github.com/mitya57/secretstorage>`_ for details. ------------- Using Keyring @@ -187,6 +189,30 @@ print("failed to store password") print("password", keyring.get_password("demo-service", "tarek")) + + Using Keyring on Ubuntu 16.04 + ============================= + + The following is a complete transcript for installing keyring in a + virtual environment on Ubuntu 16.04. No config file was used.:: + + $ sudo apt install python3-venv libdbus-glib-1-dev + $ cd /tmp + $ pyvenv py3 + $ source py3/bin/activate + $ pip install -U pip + $ pip install secretstorage dbus-python + $ pip install keyring + $ python + >>> import keyring + >>> keyring.get_keyring() + <keyring.backends.SecretService.Keyring object at 0x7f9b9c971ba8> + >>> keyring.set_password("system", "username", "password") + >>> keyring.get_password("system", "username") + 'password' + + + Using Keyring on headless Linux systems ======================================= @@ -269,7 +295,7 @@ ------------------- Keyring is instrumented with `pytest runner - <https://bitbucket.org/jaraco/pytest-runner>`_. Thus, you may invoke the tests + <https://github.com/pytest-dev/pytest-runner>`_. Thus, you may invoke the tests from any supported Python (with setuptools installed) using this command:: python setup.py test @@ -319,6 +345,11 @@ .. _this post: http://tarekziade.wordpress.com/2009/03/27/pycon-hallway-session-1-a-keyring-library-for-python/ .. _Google Summer of Code: http://socghop.appspot.com/ + + .. image:: https://badges.gitter.im/jaraco/keyring.svg + :alt: Join the chat at https://gitter.im/jaraco/keyring + :target: https://gitter.im/jaraco/keyring?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + Keywords: keyring Keychain GnomeKeyring Kwallet password storage Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring.egg-info/SOURCES.txt new/keyring-9.3.1/keyring.egg-info/SOURCES.txt --- old/keyring-9.0/keyring.egg-info/SOURCES.txt 2016-04-10 21:47:14.000000000 +0200 +++ new/keyring-9.3.1/keyring.egg-info/SOURCES.txt 2016-07-14 16:12:52.000000000 +0200 @@ -1,5 +1,4 @@ .gitignore -.hgignore .hgtags .travis.yml CHANGES.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/keyring.egg-info/requires.txt new/keyring-9.3.1/keyring.egg-info/requires.txt --- old/keyring-9.0/keyring.egg-info/requires.txt 2016-04-10 21:47:14.000000000 +0200 +++ new/keyring-9.3.1/keyring.egg-info/requires.txt 2016-07-14 16:12:52.000000000 +0200 @@ -1,4 +1,7 @@ +[:sys_platform=="linux2" or sys_platform=="linux"] +secretstorage + [:sys_platform=="win32"] pywin32-ctypes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/keyring-9.0/setup.py new/keyring-9.3.1/setup.py --- old/keyring-9.0/setup.py 2016-04-10 21:46:45.000000000 +0200 +++ new/keyring-9.3.1/setup.py 2016-07-14 16:12:11.000000000 +0200 @@ -38,6 +38,9 @@ extras_require={ 'test': test_requirements, ':sys_platform=="win32"': ['pywin32-ctypes'], + ':sys_platform=="linux2" or sys_platform=="linux"': [ + "secretstorage", + ], }, setup_requires=[ 'setuptools_scm>=1.9',
