[gjc] handle the case when gnomekeyring is present, but daemon is not running

This commit is contained in:
Yann Leboulanger 2006-10-11 20:38:23 +00:00
parent 6d1097f1e2
commit e0e503472a
1 changed files with 27 additions and 4 deletions

View File

@ -25,8 +25,14 @@ except ImportError:
else:
USER_HAS_GNOMEKEYRING = True
class PasswordStorage(object):
def get_password(self, account_name):
raise NotImplementedError
def save_password(self, account_name, password):
raise NotImplementedError
class SimplePasswordStorage(object):
class SimplePasswordStorage(PasswordStorage):
def get_password(self, account_name):
return gajim.config.get_per('accounts', account_name, 'password')
@ -35,7 +41,7 @@ class SimplePasswordStorage(object):
gajim.connections[account_name].password = password
class GnomePasswordStorage(object):
class GnomePasswordStorage(PasswordStorage):
def __init__(self):
self.keyring = gnomekeyring.get_default_keyring_sync()
@ -49,13 +55,21 @@ class GnomePasswordStorage(object):
except ValueError:
password = conf
## migrate the password over to keyring
self.save_password(account_name, password, update=False)
try:
self.save_password(account_name, password, update=False)
except gnomekeyring.NoKeyringDaemonError:
## no keyring daemon: in the future, stop using it
set_storage(SimplePasswordStorage())
return password
try:
return gnomekeyring.item_get_info_sync(self.keyring,
auth_token).get_secret()
except gnomekeyring.DeniedError:
return None
except gnomekeyring.NoKeyringDaemonError:
## no keyring daemon: in the future, stop using it
set_storage(SimplePasswordStorage())
return None
def save_password(self, account_name, password, update=True):
display_name = _('Gajim account %s') % account_name
@ -72,11 +86,20 @@ def get_storage():
global storage
if storage is None: # None is only in first time get_storage is called
if USER_HAS_GNOMEKEYRING:
storage = GnomePasswordStorage()
try:
storage = GnomePasswordStorage()
except gnomekeyring.NoKeyringDaemonError:
storage = SimplePasswordStorage()
else:
storage = SimplePasswordStorage()
return storage
def set_storage(storage_):
global storage
assert isinstance(storage, PasswordStorage)
storage = storage_
def get_password(account_name):
return get_storage().get_password(account_name)