[avm] add a PassphraseRequest class that queue GPG passphrase requests. Fixes #4164
This commit is contained in:
parent
d82635a55a
commit
81509d894a
1 changed files with 64 additions and 35 deletions
99
src/gajim.py
99
src/gajim.py
|
@ -432,6 +432,64 @@ class GlibIdleQueue(idlequeue.IdleQueue):
|
||||||
def process(self):
|
def process(self):
|
||||||
self.check_time_events()
|
self.check_time_events()
|
||||||
|
|
||||||
|
class PassphraseRequest:
|
||||||
|
def __init__(self, keyid):
|
||||||
|
self.keyid = keyid
|
||||||
|
self.callbacks = []
|
||||||
|
self.dialog_created = False
|
||||||
|
self.completed = False
|
||||||
|
|
||||||
|
def run_callback(self, account, callback):
|
||||||
|
gajim.connections[account].gpg_passphrase(self.passphrase)
|
||||||
|
callback()
|
||||||
|
|
||||||
|
def add_callback(self, account, cb):
|
||||||
|
if self.completed:
|
||||||
|
self.run_callback(account, cb)
|
||||||
|
else:
|
||||||
|
self.callbacks.append((account, cb))
|
||||||
|
if not self.dialog_created:
|
||||||
|
self.create_dialog(account)
|
||||||
|
|
||||||
|
def complete(self, passphrase):
|
||||||
|
self.passphrase = passphrase
|
||||||
|
self.completed = True
|
||||||
|
if passphrase is not None:
|
||||||
|
gobject.timeout_add(30000, gajim.interface.forget_gpg_passphrase,
|
||||||
|
self.keyid)
|
||||||
|
for (account, cb) in self.callbacks:
|
||||||
|
self.run_callback(account, cb)
|
||||||
|
del self.callbacks
|
||||||
|
|
||||||
|
def create_dialog(self, account):
|
||||||
|
title = _('Passphrase Required')
|
||||||
|
second = _('Enter GPG key passphrase for key %s (account %s).'
|
||||||
|
) % (self.keyid, account)
|
||||||
|
|
||||||
|
def _cancel():
|
||||||
|
# user cancelled, continue without GPG
|
||||||
|
gajim.connections[account].gpg_passphrase(None)
|
||||||
|
callback()
|
||||||
|
|
||||||
|
def _ok(passphrase, checked, count):
|
||||||
|
if count < 3:
|
||||||
|
done = gajim.connections[account].test_gpg_passphrase(passphrase)
|
||||||
|
else:
|
||||||
|
done = True
|
||||||
|
passphrase = None
|
||||||
|
|
||||||
|
if done:
|
||||||
|
self.complete(passphrase)
|
||||||
|
else:
|
||||||
|
# ask again
|
||||||
|
dialogs.PassphraseDialog(_('Wrong Passphrase'),
|
||||||
|
_('Please retype your GPG passphrase or press Cancel.'),
|
||||||
|
ok_handler=(_ok, count + 1), cancel_handler=_cancel)
|
||||||
|
|
||||||
|
dialogs.PassphraseDialog(title, second, ok_handler=(_ok, 0),
|
||||||
|
cancel_handler=_cancel)
|
||||||
|
self.dialog_created = True
|
||||||
|
|
||||||
class Interface:
|
class Interface:
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -1409,41 +1467,12 @@ class Interface:
|
||||||
#('GPG_PASSWORD_REQUIRED', account, (callback,))
|
#('GPG_PASSWORD_REQUIRED', account, (callback,))
|
||||||
callback = array[0]
|
callback = array[0]
|
||||||
keyid = gajim.config.get_per('accounts', account, 'keyid')
|
keyid = gajim.config.get_per('accounts', account, 'keyid')
|
||||||
if self.gpg_passphrase.has_key(keyid):
|
if keyid in self.gpg_passphrase:
|
||||||
gajim.connections[account].gpg_passphrase(self.gpg_passphrase[keyid])
|
request = self.gpg_passphrase[keyid]
|
||||||
callback()
|
else:
|
||||||
return
|
request = PassphraseRequest(keyid)
|
||||||
|
self.gpg_passphrase[keyid] = request
|
||||||
title = _('Passphrase Required')
|
request.add_callback(account, callback)
|
||||||
second = _('Enter GPG key passphrase for account %s.') % account
|
|
||||||
|
|
||||||
def _cancel():
|
|
||||||
# user cancelled, continue without GPG
|
|
||||||
gajim.connections[account].gpg_passphrase(None)
|
|
||||||
callback()
|
|
||||||
|
|
||||||
def _ok(passphrase, checked, count):
|
|
||||||
if count < 3:
|
|
||||||
count += 1
|
|
||||||
done = gajim.connections[account].test_gpg_passphrase(passphrase)
|
|
||||||
else:
|
|
||||||
done = True
|
|
||||||
passphrase = None
|
|
||||||
|
|
||||||
if done:
|
|
||||||
if passphrase is not None:
|
|
||||||
self.gpg_passphrase[keyid] = passphrase
|
|
||||||
gobject.timeout_add(30000, self.forget_gpg_passphrase, keyid)
|
|
||||||
gajim.connections[account].gpg_passphrase(passphrase)
|
|
||||||
callback()
|
|
||||||
else:
|
|
||||||
# ask again
|
|
||||||
dialogs.PassphraseDialog(_('Wrong Passphrase'),
|
|
||||||
_('Please retype your GPG passphrase or press Cancel.'),
|
|
||||||
ok_handler=(_ok, count), cancel_handler=_cancel)
|
|
||||||
|
|
||||||
dialogs.PassphraseDialog(title, second, ok_handler=(_ok, 0),
|
|
||||||
cancel_handler=_cancel)
|
|
||||||
|
|
||||||
def handle_event_roster_info(self, account, array):
|
def handle_event_roster_info(self, account, array):
|
||||||
#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
|
#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
|
||||||
|
|
Loading…
Add table
Reference in a new issue