changeset f383d60c4dd3 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=f383d60c4dd3 description: use NEC to handle failed-decrypt events
diffstat:
src/chat_control.py | 25 ++++++++++++++++ src/common/connection_handlers.py | 4 +- src/common/connection_handlers_events.py | 12 +++++++ src/common/zeroconf/connection_handlers_zeroconf.py | 2 +- src/gui_interface.py | 32 ++++++-------------- 5 files changed, 50 insertions(+), 25 deletions(-)
diffs (154 lines):
diff -r 636901a4fb36 -r f383d60c4dd3 src/chat_control.py --- a/src/chat_control.py Mon Nov 29 10:00:23 2010 +0100 +++ b/src/chat_control.py Mon Nov 29 10:50:30 2010 +0100 @@ -1601,6 +1601,8 @@ self._nec_pep_received) gajim.ged.register_event_handler('vcard-received', ged.GUI1, self._nec_vcard_received) + gajim.ged.register_event_handler('failed-decrypt', ged.GUI1, + self._nec_failed_decrypt)
# PluginSystem: adding GUI extension point for this ChatControl # instance object @@ -2589,6 +2591,8 @@ self._nec_pep_received) gajim.ged.remove_event_handler('vcard-received', ged.GUI1, self._nec_vcard_received) + gajim.ged.remove_event_handler('failed-decrypt', ged.GUI1, + self._nec_failed_decrypt)
self.send_chatstate('gone', self.contact) self.contact.chatstate = None @@ -3036,6 +3040,27 @@ self.begin_negotiation() self.session.negotiate_archiving()
+ def _nec_failed_decrypt(self, obj): + if obj.session != self.session: + return + + obj.printed_in_chat = True + + details = _('Unable to decrypt message from %s\nIt may have been ' + 'tampered with.') % obj.fjid + self.print_conversation_line(details, 'status', '', obj.timestamp) + + # terminate the session + thread_id = self.session.thread_id + self.session.terminate_e2e() + obj.conn.delete_session(obj.fjid, thread_id) + + # restart the session + self.begin_e2e_negotiation() + + # Stop emission so it doesn't go to gui_interface + return True + def got_connected(self): ChatControlBase.got_connected(self) # Refreshing contact diff -r 636901a4fb36 -r f383d60c4dd3 src/common/connection_handlers.py --- a/src/common/connection_handlers.py Mon Nov 29 10:00:23 2010 +0100 +++ b/src/common/connection_handlers.py Mon Nov 29 10:50:30 2010 +0100 @@ -1407,8 +1407,8 @@ obj.stanza = obj.session.decrypt_stanza(obj.stanza) obj.msgtxt = obj.stanza.getBody() except Exception: - self.dispatch('FAILED_DECRYPT', (obj.fjid, obj.timestamp, - obj.session)) + gajim.nec.push_incoming_event(FailedDecryptEvent(None, + conn=self, msg_obj=obj)) return
if obj.enc_tag and self.USE_GPG: diff -r 636901a4fb36 -r f383d60c4dd3 src/common/connection_handlers_events.py --- a/src/common/connection_handlers_events.py Mon Nov 29 10:00:23 2010 +0100 +++ b/src/common/connection_handlers_events.py Mon Nov 29 10:50:30 2010 +0100 @@ -1562,3 +1562,15 @@ class PasswordRequiredEvent(nec.NetworkIncomingEvent): name = 'password-required' base_network_events = [] + +class FailedDecryptEvent(nec.NetworkIncomingEvent): + name = 'failed-decrypt' + base_network_events = [] + + def generate(self): + self.conn = self.msg_obj.conn + self.fjid = self.msg_obj.fjid + self.timestamp = self.msg_obj.timestamp + self.session = self.msg_obj.session + self.printed_in_chat = False + return True diff -r 636901a4fb36 -r f383d60c4dd3 src/common/zeroconf/connection_handlers_zeroconf.py --- a/src/common/zeroconf/connection_handlers_zeroconf.py Mon Nov 29 10:00:23 2010 +0100 +++ b/src/common/zeroconf/connection_handlers_zeroconf.py Mon Nov 29 10:50:30 2010 +0100 @@ -132,7 +132,7 @@ try: msg = session.decrypt_stanza(msg) except Exception: - self.dispatch('FAILED_DECRYPT', (frm, tim)) + self.dispatch('FAILED_DECRYPT', (frm, tim, session))
msgtxt = msg.getBody() subject = msg.getSubject() # if not there, it's None diff -r 636901a4fb36 -r f383d60c4dd3 src/gui_interface.py --- a/src/gui_interface.py Mon Nov 29 10:00:23 2010 +0100 +++ b/src/gui_interface.py Mon Nov 29 10:50:30 2010 +0100 @@ -1063,26 +1063,10 @@ def handle_atom_entry(self, obj): AtomWindow.newAtomEntry(obj.atom_entry)
- def handle_event_failed_decrypt(self, account, data): - jid, tim, session = data - - details = _('Unable to decrypt message from ' - '%s\nIt may have been tampered with.') % jid - - ctrl = session.control - if ctrl: - ctrl.print_conversation_line(details, 'status', '', tim) - else: - dialogs.WarningDialog(_('Unable to decrypt message'), - details) - - # terminate the session - session.terminate_e2e() - session.conn.delete_session(jid, session.thread_id) - - # restart the session - if ctrl: - ctrl.begin_e2e_negotiation() + def handle_event_failed_decrypt(self, obj): + details = _('Unable to decrypt message from %s\nIt may have been ' + 'tampered with.') % obj.fjid + dialogs.WarningDialog(_('Unable to decrypt message'), details)
def handle_event_zc_name_conflict(self, obj): def on_ok(new_name): @@ -1420,11 +1404,11 @@ 'FILE_REQUEST_ERROR': [self.handle_event_file_request_error], 'FILE_SEND_ERROR': [self.handle_event_file_send_error], 'SIGNED_IN': [self.handle_event_signed_in], - 'FAILED_DECRYPT': [self.handle_event_failed_decrypt], 'atom-entry-received': [self.handle_atom_entry], 'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase], 'bookmarks-received': [self.handle_event_bookmarks], 'connection-lost': [self.handle_event_connection_lost], + 'failed-decrypt': [(self.handle_event_failed_decrypt, ged.GUI2)], 'fingerprint-error': [self.handle_event_fingerprint_error], 'gc-invitation-received': [self.handle_event_gc_invitation], 'gc-presence-received': [self.handle_event_gc_presence], @@ -1474,7 +1458,11 @@ """ for event_name, event_handlers in self.handlers.iteritems(): for event_handler in event_handlers: - gajim.ged.register_event_handler(event_name, ged.GUI1, + prio = ged.GUI1 + if type(event_handler) == tuple: + prio = event_handler[1] + event_handler = event_handler[0] + gajim.ged.register_event_handler(event_name, prio, event_handler)
################################################################################