Changeset 9113
- Timestamp:
- 12/08/07 06:49:38 (10 months ago)
- Location:
- trunk/src
- Files:
-
- 4 modified
-
chat_control.py (modified) (7 diffs)
-
common/stanza_session.py (modified) (21 diffs)
-
gajim.py (modified) (2 diffs)
-
message_control.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/chat_control.py
r9071 r9113 1058 1058 self.xml.get_widget('gpg_togglebutton').set_active(True) 1059 1059 1060 self.session = session 1061 1062 # does this window have an existing, active esession? 1063 self.esessioned = False 1060 self.set_session(session) 1064 1061 1065 1062 self.status_tooltip = gtk.Tooltips() … … 1468 1465 self.kbd_activity_in_last_30_secs = False 1469 1466 1467 1468 # print esession settings to textview 1469 def print_esession_details(self): 1470 if self.session and self.session.enable_encryption: 1471 msg = _('E2E encryption enabled') 1472 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1473 1474 if self.session.loggable: 1475 msg = _('Session WILL be logged') 1476 else: 1477 msg = _('Session WILL NOT be logged') 1478 1479 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1480 else: 1481 msg = _('E2E encryption disabled') 1482 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1483 1470 1484 def print_conversation(self, text, frm = '', tim = None, 1471 1485 encrypted = False, subject = None, xhtml = None): … … 1487 1501 name = '' 1488 1502 else: 1489 # ESessions1490 1503 if self.session and self.session.enable_encryption: 1491 if not self.esessioned: 1492 msg = _('Encryption enabled') 1493 ChatControlBase.print_conversation_line(self, msg, 1494 'status', '', tim) 1495 1496 if self.session.loggable: 1497 msg = _('Session WILL be logged') 1498 else: 1499 msg = _('Session WILL NOT be logged') 1500 1501 ChatControlBase.print_conversation_line(self, msg, 1502 'status', '', tim) 1503 1504 self.esessioned = True 1505 elif not encrypted: 1504 if not encrypted: 1506 1505 msg = _('The following message was NOT encrypted') 1507 1506 ChatControlBase.print_conversation_line(self, msg, 1508 1507 'status', '', tim) 1509 elif self.esessioned:1510 msg = _('Encryption disabled')1511 ChatControlBase.print_conversation_line(self, msg,1512 'status', '', tim)1513 self.esessioned = False1514 1508 else: 1515 1509 # GPG encryption 1516 1510 ec = gajim.encrypted_chats[self.account] 1517 1511 if encrypted and jid not in ec: 1518 msg = _(' Encryption enabled')1512 msg = _('OpenPGP Encryption enabled') 1519 1513 ChatControlBase.print_conversation_line(self, msg, 1520 1514 'status', '', tim) 1521 1515 ec.append(jid) 1522 1516 elif not encrypted and jid in ec: 1523 msg = _(' Encryption disabled')1517 msg = _('OpenPGP Encryption disabled') 1524 1518 ChatControlBase.print_conversation_line(self, msg, 1525 1519 'status', '', tim) … … 2004 1998 def read_queue(self): 2005 1999 '''read queue and print messages containted in it''' 2000 2006 2001 jid = self.contact.jid 2007 2002 jid_with_resource = jid … … 2009 2004 jid_with_resource += '/' + self.resource 2010 2005 events = gajim.events.get_events(self.account, jid_with_resource) 2006 2007 if hasattr(self, 'session') and self.session and self.session.enable_encryption: 2008 self.print_esession_details() 2011 2009 2012 2010 # Is it a pm ? … … 2170 2168 ChatControlBase.print_conversation_line(self, msg, 2171 2169 'status', '', None) 2172 self.esessioned = False2173 2170 2174 2171 jid = str(self.session.jid) … … 2177 2174 self.session.thread_id) 2178 2175 2179 self.se ssion = gajim.connections[self.account].make_new_session(jid)2176 self.set_session(gajim.connections[self.account].make_new_session(jid)) 2180 2177 else: 2181 2178 if not self.session: 2182 self.session = gajim.connections[self.account].make_new_session( 2183 self.contact.jid) 2179 fjid = self.contact.get_full_jid() 2180 new_sess = gajim.connections[self.account].make_new_session(fjid) 2181 self.set_session(new_sess) 2184 2182 2185 2183 # XXX decide whether to use 4 or 3 message negotiation -
trunk/src/common/stanza_session.py
r9064 r9113 72 72 '''A negotiation has been cancelled, so reset this session to its default state.''' 73 73 74 # XXX notify the user 75 74 if hasattr(self, 'control'): 75 msg = _('Session negotiation cancelled') 76 self.control.print_conversation_line(self, msg, 'status', '', None) 77 76 78 self.status = None 77 79 self.negotiated = {} … … 93 95 94 96 def acknowledge_termination(self): 95 # we could send an acknowledgement message here, but we won't.97 # we could send an acknowledgement message to the remote client here 96 98 self.status = None 97 99 … … 106 108 107 109 # an encrypted stanza negotiation has several states. i've represented them 108 # as the following values in the 'status' 110 # as the following values in the 'status' 109 111 # attribute of the session object: 110 112 … … 144 146 # _s denotes 'self' (ie. this client) 145 147 self._kc_s = None 146 148 147 149 # _o denotes 'other' (ie. the client at the other end of the session) 148 150 self._kc_o = None … … 162 164 self.decrypter = self.cipher.new(self._kc_o, self.cipher.MODE_CTR, 163 165 counter=self.decryptcounter) 164 166 165 167 def get_kc_o(self): 166 168 return self._kc_o … … 168 170 kc_s = property(get_kc_s, set_kc_s) 169 171 kc_o = property(get_kc_o, set_kc_o) 170 172 171 173 def encryptcounter(self): 172 174 self.c_s = (self.c_s + 1) % (2 ** self.n) 173 175 return crypto.encode_mpi_with_padding(self.c_s) 174 176 175 177 def decryptcounter(self): 176 178 self.c_o = (self.c_o + 1) % (2 ** self.n) … … 232 234 def decompress(self, compressed): 233 235 if self.compression == None: 234 return compressed 236 return compressed 235 237 236 238 def encrypt(self, encryptable): … … 344 346 345 347 mac_o_calculated = self.hmac(self.ks_o, content) 346 348 347 349 if self.negotiated['recv_pubkey']: 348 350 hash = crypto.sha256(mac_o_calculated) … … 381 383 b64ed = base64.b64encode(self.hash(pubkey_s)) 382 384 pubkey_s = '<fingerprint>%s</fingerprint>' % b64ed 383 385 384 386 id_s = self.encrypt(pubkey_s + sign_s) 385 387 else: … … 396 398 # XXX save retained secret? 397 399 self.check_identity(lambda : ()) 398 400 399 401 return (xmpp.DataField(name='identity', value=base64.b64encode(id_s)), \ 400 402 xmpp.DataField(name='mac', value=base64.b64encode(m_s))) … … 438 440 439 441 self.n_s = crypto.generate_nonce() 440 442 441 443 x.addChild(node=xmpp.DataField(name='my_nonce', value=base64.b64encode(self.n_s), typ='hidden')) 442 444 … … 455 457 456 458 self.send(request) 457 459 458 460 # 4.3 esession response (bob) 459 461 def verify_options_bob(self, form): … … 571 573 572 574 to_add = { 'my_nonce': self.n_s, 573 'dhkeys': crypto.encode_mpi(self.d), 574 'counter': crypto.encode_mpi(self.c_o), 575 'dhkeys': crypto.encode_mpi(self.d), 576 'counter': crypto.encode_mpi(self.c_o), 575 577 'nonce': self.n_o } 576 578 … … 667 669 self.verify_identity(form, self.d, True, 'b') 668 670 else: 669 srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) 671 srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) 670 672 rshashes = [self.hmac(self.n_s, rs) for (rs,v) in srses] 671 673 … … 678 680 result.addChild(node=xmpp.DataField(name='rshashes', value=rshashes)) 679 681 result.addChild(node=xmpp.DataField(name='dhkeys', value=base64.b64encode(crypto.encode_mpi(e)))) 680 682 681 683 self.form_o = ''.join(map(lambda el: xmpp.c14n.c14n(el), form.getChildren())) 682 684 … … 688 690 feature.addChild(node=result) 689 691 self.send(accept) 690 692 691 693 if self.sigmai: 692 694 self.status = 'active' … … 694 696 else: 695 697 self.status = 'identified-alice' 696 698 697 699 # 4.5 esession accept (bob) 698 700 def accept_e2e_bob(self, form): … … 725 727 726 728 srs = '' 727 729 728 730 srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) 729 731 rshashes = [base64.b64decode(rshash) for rshash in form.getField('rshashes').getValues()] … … 768 770 self.enable_encryption = True 769 771 772 if hasattr(self, 'control'): 773 self.control.print_esession_details() 774 770 775 def final_steps_alice(self, form): 771 776 srs = '' … … 794 799 self.verify_identity(form, self.d, False, 'b') 795 800 # Note: If Alice discovers an error then she SHOULD ignore any encrypted content she received in the stanza. 796 801 797 802 if self.negotiated['logging'] == 'mustnot': 798 803 self.loggable = False … … 800 805 self.status = 'active' 801 806 self.enable_encryption = True 807 808 if hasattr(self, 'control'): 809 self.control.print_esession_details() 802 810 803 811 # calculate and store the new retained secret -
trunk/src/gajim.py
r9110 r9113 2032 2032 2033 2033 if ctrl: 2034 ctrl.session = gajim.connections[account].make_new_session(str(jid)) 2034 new_sess = gajim.connections[account].make_new_session(str(jid)) 2035 ctrl.set_session(new_sess) 2035 2036 2036 2037 return … … 2045 2046 if not contact: 2046 2047 connection = gajim.connections[account] 2047 contact = gajim.contacts.create_contact(jid = jid.getStripped(), resource = resource, show = connection.get_status()) 2048 contact = gajim.contacts.create_contact(jid = jid.getStripped(), 2049 resource = resource, show = connection.get_status()) 2048 2050 self.roster.new_chat(contact, account, resource = resource) 2049 2051 -
trunk/src/message_control.py
r8926 r9113 118 118 119 119 def set_session(self, session): 120 if session == self.session:120 if hasattr(self, 'session') and session == self.session: 121 121 return 122 122 123 if self.session: 123 was_encrypted = False 124 125 if hasattr(self, 'session') and self.session: 126 if self.session.enable_encryption: 127 was_encrypted = True 128 124 129 print "starting a new session, dropping the old one!" 125 130 gajim.connections[self.account].delete_session(self.session.jid, self.session.thread_id) 126 131 127 132 self.session = session 133 134 if session: 135 session.control = self 136 137 if was_encrypted: 138 self.print_esession_details() 128 139 129 140 def send_message(self, message, keyID = '', type = 'chat', … … 135 146 136 147 if not self.session: 137 self.session = gajim.connections[self.account].make_new_session(self.contact.get_full_jid()) 148 fjid = self.contact.get_full_jid() 149 new_session = gajim.connections[self.account].make_new_session(fjid) 150 151 self.set_session(new_session) 138 152 139 153 # Send and update history
