From 015d3221e19eaff44d139831c57972451f179a24 Mon Sep 17 00:00:00 2001
From: Brendan Taylor <bct@diffeq.com>
Date: Sat, 8 Dec 2007 08:51:10 +0000
Subject: [PATCH] corrected realtime notification of session cancellation

---
 src/chat_control.py          |  9 +++++----
 src/common/stanza_session.py | 15 ++++++++++-----
 src/gajim.py                 | 25 +++++++++++++------------
 src/negotiation.py           |  2 +-
 4 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/src/chat_control.py b/src/chat_control.py
index bfc4beb4c2..d78a7f1c50 100644
--- a/src/chat_control.py
+++ b/src/chat_control.py
@@ -1464,6 +1464,9 @@ class ChatControl(ChatControlBase):
 		self.mouse_over_in_last_30_secs = False
 		self.kbd_activity_in_last_30_secs = False
 
+	def on_cancel_session_negotiation(self):
+		msg = _('Session negotiation cancelled')
+		ChatControlBase.print_conversation_line(self, msg, 'status', '', None)
 
 	# print esession settings to textview
 	def print_esession_details(self):
@@ -2155,7 +2158,7 @@ class ChatControl(ChatControlBase):
 		# this is reverse logic, as we are on 'activate' (before change happens)
 		tb = self.xml.get_widget('gpg_togglebutton')
 		tb.set_active(not tb.get_active())
-	
+
 	def _on_convert_to_gc_menuitem_activate(self, widget):
 		'''user want to invite some friends to chat'''
 		dialogs.TransformChatToMUC(self.account, [self.contact.jid])
@@ -2164,9 +2167,7 @@ class ChatControl(ChatControlBase):
 		if self.session and self.session.enable_encryption:
 			self.session.terminate_e2e()
 
-			msg = _('Encryption disabled')
-			ChatControlBase.print_conversation_line(self, msg, 
-				'status', '', None)
+			self.print_esession_details()
 
 			jid = str(self.session.jid)
 
diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py
index 23b994fa4a..d8625d6a74 100644
--- a/src/common/stanza_session.py
+++ b/src/common/stanza_session.py
@@ -36,7 +36,7 @@ class StanzaSession(object):
 		self.last_send = 0
 		self.status = None
 		self.negotiated = {}
-	
+
 	def generate_thread_id(self):
 		return "".join([random.choice(string.ascii_letters) for x in xrange(0,32)])
 
@@ -46,7 +46,7 @@ class StanzaSession(object):
 
 		msg.setAttr('to', self.jid)
 		self.conn.send_stanza(msg)
-	
+
 		if isinstance(msg, xmpp.Message):
 			self.last_send = time.time()
 
@@ -72,8 +72,7 @@ class StanzaSession(object):
 		'''A negotiation has been cancelled, so reset this session to its default state.'''
 
 		if hasattr(self, 'control'):
-			msg = _('Session negotiation cancelled')
-			self.control.print_conversation_line(self, msg, 'status', '', None)
+			self.control.on_cancel_session_negotiation()
 
 		self.status = None
 		self.negotiated = {}
@@ -350,7 +349,7 @@ class EncryptedStanzaSession(StanzaSession):
 			hash = crypto.sha256(mac_o_calculated)
 
 			if not eir_pubkey.verify(hash, signature):
-				raise exceptions.NegotiationError, 'public key signature verification failed!' 
+				raise exceptions.NegotiationError, 'public key signature verification failed!'
 
 		elif mac_o_calculated != mac_o:
 			raise exceptions.NegotiationError, 'calculated mac_%s differs from received mac_%s' % (i_o, i_o)
@@ -903,3 +902,9 @@ otherwise, list the fields we haven't implemented'''
 		no_log_for = no_log_for.split()
 
 		return self.loggable and account not in no_log_for and self.jid not in no_log_for
+
+	def cancelled_negotiation(self):
+		StanzaSession.cancelled_negotiation(self)
+		self.enable_encryption = False
+
+		self.km_o = ''
diff --git a/src/gajim.py b/src/gajim.py
index 51659d9cf1..d268e0ae2e 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -1902,8 +1902,6 @@ class Interface:
 		jid, session, form = data
 
 		if form.getField('accept') and not form['accept'] in ('1', 'true'):
-			dialogs.InformationDialog(_('Session negotiation cancelled'),
-					_('The client at %s cancelled the session negotiation.') % (jid))
 			session.cancelled_negotiation()
 			return
 
@@ -2018,23 +2016,26 @@ class Interface:
 		except exceptions.Cancelled:
 			# user cancelled the negotiation
 
-			session.cancelled_negotiation()
+			session.reject_negotiation()
 
 			return
 
-		if form.getField('terminate'):
-			if form.getField('terminate').getValue() in ('1', 'true'):
-				session.acknowledge_termination()
+		if form.getField('terminate') and\
+		form.getField('terminate').getValue() in ('1', 'true'):
+			was_encrypted = session.enable_encryption
+			ctrl = session.control
 
-				gajim.connections[account].delete_session(str(jid), session.thread_id)
+			session.acknowledge_termination()
+			gajim.connections[account].delete_session(str(jid), session.thread_id)
 
-				ctrl = gajim.interface.msg_win_mgr.get_control(str(jid), account)
+			if ctrl:
+				new_sess = gajim.connections[account].make_new_session(str(jid))
+				ctrl.set_session(new_sess)
 
-				if ctrl:
-					new_sess = gajim.connections[account].make_new_session(str(jid))
-					ctrl.set_session(new_sess)
+				if was_encrypted:
+					ctrl.print_esession_details()
 
-				return
+			return
 
 		# non-esession negotiation. this isn't very useful, but i'm keeping it around
 		# to test my test suite.
diff --git a/src/negotiation.py b/src/negotiation.py
index d0473266cd..8cc4c9ad5f 100644
--- a/src/negotiation.py
+++ b/src/negotiation.py
@@ -19,7 +19,7 @@ def show_sas_dialog(session, jid, sas, on_success):
 		on_success(checked)
 
 	def failure_cb():
-		session.cancelled_negotiation()
+		session.reject_negotiation()
 
 	dialogs.ConfirmationDialogCheck(_('''OK to continue with negotiation?'''),
 		_('''You've begun an encrypted session with %s, but it can't be guaranteed that you're talking directly to the person you think you are.
-- 
GitLab