-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

The attached patch registers a fallback credentials store that uses
the GNOME keyring to retrieve passwords. It will not store new
passwords in the GNOME keyring.

This integration will also only be enabled in case that the GNOME
keyring python module is actually installed on the system.

Cheers,

Jelmer
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iJwEAQECAAYFAkob/LYACgkQDLQl4QYPZuUYZwP+LRqrr8AAJa+fULxT9XLsiGuS
e+CtRZEfs2PxjIEs2DDPf4s5NdZFwPjR1qH3YEBWGPD6w06J9ErFciA5mTISMfbx
stiPQkCDW09oPQ1sCJLtLljrmeILurOjQE2XPNTkLSLMIONlhncGoZ4N8DdR5N7w
T1/rDlmGxlus9hYpzE4=
=w03l
-----END PGP SIGNATURE-----

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]
# target_branch: lp:bzr-gtk
# testament_sha1: 3d287f06b04891808ca3129a8595b2234149ea07
# timestamp: 2009-05-26 16:26:48 +0200
# base_revision_id: [email protected]\
#   zhtopap2bn9vjtpc
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2009-05-11 13:46:33 +0000
+++ NEWS	2009-05-21 20:26:23 +0000
@@ -16,6 +16,11 @@
 
   * Mark as compatible with bzr 1.13.
 
+ FEATURES
+
+  * Support storing credentials in the GNOME Keyring if it is 
+    available. (Jelmer Vernooij)
+
 0.95.0	2008-08-04
 
  UI

=== modified file '__init__.py'
--- __init__.py	2009-05-07 09:41:56 +0000
+++ __init__.py	2009-05-21 20:26:23 +0000
@@ -36,7 +36,10 @@
 
 import bzrlib
 import bzrlib.api
-from bzrlib import errors
+from bzrlib import (
+    config,
+    errors,
+    )
 from bzrlib.commands import plugin_cmds
 
 import os.path
@@ -150,6 +153,19 @@
         return "No DISPLAY. Unable to run GTK+ application."
 
 
+credential_store_registry = getattr(config, "credential_store_registry", None)
+if credential_store_registry is not None:
+    try:
+        credential_store_registry.register_lazy(
+            "gnome-keyring", "bzrlib.plugins.gtk.keyring", "GnomeKeyringCredentialStore",
+            help="The GNOME Keyring.", fallback=True)
+    except TypeError:
+    # Fallback credentials stores were introduced in Bazaar 1.15
+        credential_store_registry.register_lazy(
+            "gnome-keyring", "bzrlib.plugins.gtk.keyring", "GnomeKeyringCredentialStore",
+            help="The GNOME Keyring.")
+
+
 def load_tests(basic_tests, module, loader):
     testmod_names = [
         'tests',

=== added file 'keyring.py'
--- keyring.py	1970-01-01 00:00:00 +0000
+++ keyring.py	2009-05-21 21:00:16 +0000
@@ -0,0 +1,77 @@
+# Copyright (C) 2009 Jelmer Vernooij <[email protected]>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import gobject
+try:
+    import gnomekeyring
+except ImportError:
+    gnomekeyring = None
+
+from bzrlib.config import (
+    CredentialStore,
+    )
+
+
+class GnomeKeyringCredentialStore(CredentialStore):
+
+    def __init__(self):
+        CredentialStore.__init__(self)
+        # External apps that load bzrlib may also set this, so 
+        # don't override:
+        if gobject.get_application_name() is None:
+            gobject.set_application_name("bzr")
+
+    def decode_password(self, credentials):
+        if gnomekeyring is None:
+            return None
+        attrs = {}
+        if "scheme" in credentials:
+            attrs["protocol"] = credentials["scheme"].encode("utf-8")
+        if "host" in credentials:
+            attrs["server"] = credentials["host"].encode("utf-8")
+        if "user" in credentials:
+            attrs["user"] = credentials["user"].encode("utf-8")
+        if credentials.get("port") is not None:
+            attrs["port"] = credentials["port"]
+        try:
+            items = gnomekeyring.find_items_sync(
+                gnomekeyring.ITEM_NETWORK_PASSWORD, attrs)
+            return items[0].secret
+        except (gnomekeyring.NoMatchError, gnomekeyring.DeniedError):
+            return None
+
+    def get_credentials(self, scheme, host, port=None, user=None, path=None, 
+                        realm=None):
+        if gnomekeyring is None:
+            return None
+        attrs = {
+            "protocol": scheme.encode("utf-8"),
+            "server": host.encode("utf-8"),
+            }
+        # TODO: realm ?
+        if port is not None:
+            attrs["port"] = port
+        if user is not None:
+            attrs["user"] = user.encode("utf-8")
+        credentials = { "scheme": scheme, "host": host, "port": port, 
+            "realm": realm, "user": user}
+        try:
+            items = gnomekeyring.find_items_sync(
+                gnomekeyring.ITEM_NETWORK_PASSWORD, attrs)
+            credentials["user"] = items[0].attributes["user"]
+            credentials["password"] = items[0].secret
+        except (gnomekeyring.NoMatchError, gnomekeyring.DeniedError):
+            return None

# Begin bundle
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
-- 
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.canonical.com/mailman/listinfo/bzr-gtk

Reply via email to