diff --git a/src/common/passwords.py b/src/common/passwords.py new file mode 100644 index 000000000..8c29bef68 --- /dev/null +++ b/src/common/passwords.py @@ -0,0 +1,84 @@ +## +## Copyright (C) 2006 Gustavo J. A. M. Carneiro +## Copyright (C) 2006 Nikos Kouremenos +## +## 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; version 2 only. +## +## 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. +## + +__all__ = ['get_password', 'save_password'] + +import gobject + +from common import gajim + +try: + import gnomekeyring +except ImportError: + USER_HAS_GNOMEKEYRING = False +else: + USER_HAS_GNOMEKEYRING = True + + +class SimplePasswordStorage(object): + def get_password(self, account_name): + return gajim.config.get_per('accounts', account_name, 'password') + + def save_password(self, account_name, password): + gajim.connections[account_name].password = password + + +class GnomePasswordStorage(object): + def __init__(self): + self.keyring = gnomekeyring.get_default_keyring_sync() + + def get_password(self, account_name): + conf = gajim.config.get_per('accounts', account_name, 'password') + try: + unused, auth_token = conf.split("gnomekeyring:") + auth_token = int(auth_token) + print "load: token for account %s: %i" % (account_name, auth_token) + except ValueError: + password = conf + ## migrate the password over to keyring + self.save_password(account_name, password, update=False) + return password + try: + return gnomekeyring.item_get_info_sync(self.keyring, auth_token).get_secret() + except gnomekeyring.DeniedError: + return None + + def save_password(self, account_name, password, update=True): + display_name = ("Gajim account %s" % (account_name,)) + attributes = dict(account_name=str(account_name), gajim=1) + auth_token = gnomekeyring.item_create_sync( + self.keyring, gnomekeyring.ITEM_GENERIC_SECRET, + display_name, attributes, password, update) + print "save(update=%i): token for account %s: %i" % (update, account_name, auth_token) + token = "gnomekeyring:%i" % (auth_token,) + gajim.config.set_per('accounts', account_name, 'password', token) + + +storage = None +def get_storage(): + global storage + if storage is None: + if USER_HAS_GNOMEKEYRING: + #FIXME: detect if we're running under GNOME or not + #before deciding to use the GnomeKeyring backend + storage = GnomePasswordStorage() + else: + storage = SimplePasswordStorage() + return storage + +def get_password(account_name): + return get_storage().get_password(account_name) + +def save_password(account_name, password): + return get_storage().save_password(account_name, password)