Changeset 9113

Show
Ignore:
Timestamp:
12/08/07 06:49:38 (10 months ago)
Author:
bct
Message:

realtime notification of esession begin/end

Location:
trunk/src
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/chat_control.py

    r9071 r9113  
    10581058                        self.xml.get_widget('gpg_togglebutton').set_active(True) 
    10591059 
    1060                 self.session = session 
    1061  
    1062                 # does this window have an existing, active esession? 
    1063                 self.esessioned = False 
     1060                self.set_session(session) 
    10641061 
    10651062                self.status_tooltip = gtk.Tooltips() 
     
    14681465                self.kbd_activity_in_last_30_secs = False 
    14691466 
     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 
    14701484        def print_conversation(self, text, frm = '', tim = None, 
    14711485                encrypted = False, subject = None, xhtml = None): 
     
    14871501                        name = '' 
    14881502                else: 
    1489                         # ESessions 
    14901503                        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: 
    15061505                                        msg = _('The following message was NOT encrypted') 
    15071506                                        ChatControlBase.print_conversation_line(self, msg,  
    15081507                                                'status', '', tim) 
    1509                         elif self.esessioned: 
    1510                                 msg = _('Encryption disabled') 
    1511                                 ChatControlBase.print_conversation_line(self, msg,  
    1512                                         'status', '', tim) 
    1513                                 self.esessioned = False 
    15141508                        else: 
    15151509                                # GPG encryption 
    15161510                                ec = gajim.encrypted_chats[self.account] 
    15171511                                if encrypted and jid not in ec: 
    1518                                         msg = _('Encryption enabled') 
     1512                                        msg = _('OpenPGP Encryption enabled') 
    15191513                                        ChatControlBase.print_conversation_line(self, msg,  
    15201514                                                'status', '', tim) 
    15211515                                        ec.append(jid) 
    15221516                                elif not encrypted and jid in ec: 
    1523                                         msg = _('Encryption disabled') 
     1517                                        msg = _('OpenPGP Encryption disabled') 
    15241518                                        ChatControlBase.print_conversation_line(self, msg, 
    15251519                                                'status', '', tim) 
     
    20041998        def read_queue(self): 
    20051999                '''read queue and print messages containted in it''' 
     2000 
    20062001                jid = self.contact.jid 
    20072002                jid_with_resource = jid 
     
    20092004                        jid_with_resource += '/' + self.resource 
    20102005                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() 
    20112009 
    20122010                # Is it a pm ? 
     
    21702168                        ChatControlBase.print_conversation_line(self, msg,  
    21712169                                'status', '', None) 
    2172                         self.esessioned = False 
    21732170 
    21742171                        jid = str(self.session.jid) 
     
    21772174                                self.session.thread_id) 
    21782175 
    2179                         self.session = gajim.connections[self.account].make_new_session(jid) 
     2176                        self.set_session(gajim.connections[self.account].make_new_session(jid)) 
    21802177                else: 
    21812178                        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) 
    21842182 
    21852183                        # XXX decide whether to use 4 or 3 message negotiation 
  • trunk/src/common/stanza_session.py

    r9064 r9113  
    7272                '''A negotiation has been cancelled, so reset this session to its default state.''' 
    7373 
    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 
    7678                self.status = None 
    7779                self.negotiated = {} 
     
    9395 
    9496        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 
    9698                self.status = None 
    9799 
     
    106108 
    107109# 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' 
    109111# attribute of the session object: 
    110112 
     
    144146                # _s denotes 'self' (ie. this client) 
    145147                self._kc_s = None 
    146          
     148 
    147149                # _o denotes 'other' (ie. the client at the other end of the session) 
    148150                self._kc_o = None 
     
    162164                self.decrypter = self.cipher.new(self._kc_o, self.cipher.MODE_CTR, 
    163165                        counter=self.decryptcounter) 
    164          
     166 
    165167        def get_kc_o(self): 
    166168                return self._kc_o 
     
    168170        kc_s = property(get_kc_s, set_kc_s) 
    169171        kc_o = property(get_kc_o, set_kc_o) 
    170          
     172 
    171173        def encryptcounter(self): 
    172174                self.c_s = (self.c_s + 1) % (2 ** self.n) 
    173175                return crypto.encode_mpi_with_padding(self.c_s) 
    174          
     176 
    175177        def decryptcounter(self): 
    176178                self.c_o = (self.c_o + 1) % (2 ** self.n) 
     
    232234        def decompress(self, compressed): 
    233235                if self.compression == None: 
    234                         return compressed  
     236                        return compressed 
    235237 
    236238        def encrypt(self, encryptable): 
     
    344346 
    345347                mac_o_calculated = self.hmac(self.ks_o, content) 
    346          
     348 
    347349                if self.negotiated['recv_pubkey']: 
    348350                        hash = crypto.sha256(mac_o_calculated) 
     
    381383                                b64ed = base64.b64encode(self.hash(pubkey_s)) 
    382384                                pubkey_s = '<fingerprint>%s</fingerprint>' % b64ed 
    383                  
     385 
    384386                        id_s = self.encrypt(pubkey_s + sign_s) 
    385387                else: 
     
    396398                                # XXX save retained secret? 
    397399                                self.check_identity(lambda : ()) 
    398                  
     400 
    399401                return (xmpp.DataField(name='identity', value=base64.b64encode(id_s)), \ 
    400402                                                xmpp.DataField(name='mac', value=base64.b64encode(m_s))) 
     
    438440 
    439441                self.n_s = crypto.generate_nonce() 
    440          
     442 
    441443                x.addChild(node=xmpp.DataField(name='my_nonce', value=base64.b64encode(self.n_s), typ='hidden')) 
    442444 
     
    455457 
    456458                self.send(request) 
    457          
     459 
    458460        # 4.3 esession response (bob) 
    459461        def verify_options_bob(self, form): 
     
    571573 
    572574                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), 
    575577                                                         'nonce': self.n_o } 
    576578 
     
    667669                        self.verify_identity(form, self.d, True, 'b') 
    668670                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()) 
    670672                        rshashes = [self.hmac(self.n_s, rs) for (rs,v) in srses] 
    671673 
     
    678680                        result.addChild(node=xmpp.DataField(name='rshashes', value=rshashes)) 
    679681                        result.addChild(node=xmpp.DataField(name='dhkeys', value=base64.b64encode(crypto.encode_mpi(e)))) 
    680                  
     682 
    681683                        self.form_o = ''.join(map(lambda el: xmpp.c14n.c14n(el), form.getChildren())) 
    682684 
     
    688690                feature.addChild(node=result) 
    689691                self.send(accept) 
    690          
     692 
    691693                if self.sigmai: 
    692694                        self.status = 'active' 
     
    694696                else: 
    695697                        self.status = 'identified-alice' 
    696          
     698 
    697699        # 4.5 esession accept (bob) 
    698700        def accept_e2e_bob(self, form): 
     
    725727 
    726728                srs = '' 
    727          
     729 
    728730                srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) 
    729731                rshashes = [base64.b64decode(rshash) for rshash in form.getField('rshashes').getValues()] 
     
    768770                self.enable_encryption = True 
    769771 
     772                if hasattr(self, 'control'): 
     773                        self.control.print_esession_details() 
     774 
    770775        def final_steps_alice(self, form): 
    771776                srs = '' 
     
    794799                self.verify_identity(form, self.d, False, 'b') 
    795800# Note: If Alice discovers an error then she SHOULD ignore any encrypted content she received in the stanza. 
    796          
     801 
    797802                if self.negotiated['logging'] == 'mustnot': 
    798803                        self.loggable = False 
     
    800805                self.status = 'active' 
    801806                self.enable_encryption = True 
     807 
     808                if hasattr(self, 'control'): 
     809                        self.control.print_esession_details() 
    802810 
    803811        # calculate and store the new retained secret 
  • trunk/src/gajim.py

    r9110 r9113  
    20322032 
    20332033                                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) 
    20352036 
    20362037                                return 
     
    20452046                                if not contact: 
    20462047                                        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()) 
    20482050                                self.roster.new_chat(contact, account, resource = resource) 
    20492051 
  • trunk/src/message_control.py

    r8926 r9113  
    118118 
    119119        def set_session(self, session): 
    120                 if session == self.session: 
     120                if hasattr(self, 'session') and session == self.session: 
    121121                        return 
    122122 
    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 
    124129                        print "starting a new session, dropping the old one!" 
    125130                        gajim.connections[self.account].delete_session(self.session.jid, self.session.thread_id) 
    126131 
    127132                self.session = session 
     133 
     134                if session: 
     135                        session.control = self 
     136 
     137                        if was_encrypted: 
     138                                self.print_esession_details() 
    128139 
    129140        def send_message(self, message, keyID = '', type = 'chat', 
     
    135146 
    136147                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) 
    138152 
    139153                # Send and update history