Changeset 466

Show
Ignore:
Timestamp:
03/03/03 01:03:50 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBMessaging/RBMessaging/Client/Handlers/Authentication.py

    r465 r466  
    2525 
    2626from RBTelepathy.Handlers import * 
     27from RBMessaging.Packet import AuthenticationMethods 
    2728 
    2829#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    4445#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4546 
    46 class method(Elements.PacketElement): 
    47     __slots__ = [] 
    48     ElementFactories = PacketFactorySet({ 
    49         'response': Elements.Factory(Elements.PacketElement), 
    50         'challenge': Elements.Factory(Elements.PacketElement), 
    51         }) 
    52  
    53     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    54     #~ Properties  
    55     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    56  
    57     def _get_challenge(self): 
    58         challenge = self['challenge',] 
    59         if len(challenge) > 1: 
    60             raise ErrorTypes.AuthenticationError, '"%s" expected a single "challenge" element' % (self.node,) 
    61         elif len(challenge) == 1: 
    62             challenge = ''.join(map(str, challenge[0].iterdata())) 
    63         else: challenge = 'password' 
    64         return challenge 
    65     def _set_challenge(self, challenge): 
    66         self.delnodes('challenge') 
    67         self.addnode('challenge').adddata(challenge) 
    68     def _del_challenge(self, challenge): 
    69         self.delnodes('challenge') 
    70     challenge = property(_get_challenge, _set_challenge, _del_challenge) 
    71  
    72     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    73  
    74     def _get_response(self): 
    75         response = self['response',] 
    76         if len(response) != 1: 
    77             raise ErrorTypes.AuthenticationError, '"%s" expected a single "response" child element' % (self.node,) 
    78         else: response = ''.join(map(str, response[0].iterdata())) 
    79         return response 
    80     def _set_response(self, response): 
    81         self.delnodes('response') 
    82         self.addnode('response').adddata(response) 
    83     def _del_response(self, response): 
    84         self.delnodes('response') 
    85     response = property(_get_response, _set_response, _del_response) 
    86  
    87 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    88  
    8947class authentication(Elements.RootElementBase): 
    9048    __slots__ = [] 
    9149    ElementFactories = PacketFactorySet({ 
    9250        'as': Elements.Factory(Elements.URIAddressElement), 
    93         'method': Elements.Factory(method), 
     51        'method': AuthenticationMethods.MethodFactory(), 
    9452        }) 
    9553 
     
    13391    def AuthorizeAs(self, loginaddr, bShort=True): 
    13492        self.loginaddr = URIAddress.URIAddress(loginaddr) 
    135         if bShort: self._reply_response(None) 
    136         else: self._reply_query(None) 
     93        if bShort:  
     94            self._reply_response(None) 
     95        else:  
     96            self._reply_query(None) 
    13797 
    13898    def SendPacket(self, packet, *args, **kw): 
     
    160120 
    161121    def _reply_select(self, packet, *args, **kw): 
     122        raise NotImplementedError 
    162123        packet = authentication() 
    163124        packet.attrs['type'] = 'select' 
    164125        packet += 'as', 
    165126        packet[-1].attrs['addr'] = str(self.loginaddr) 
    166         packet += method() 
     127        packet += AuthenticationMethods.AuthenticationBaseMethod() 
    167128        packet[-1].attrs['type'] = 'plaintext' 
    168129        self.SendPacket(packet) 
     
    176137        packet += 'as', 
    177138        packet[-1].attrs['addr'] = str(self.loginaddr) 
    178         packet += method() 
    179139 
    180140        if sendkey: 
    181141            # Use PublicKey 
    182             packet[-1].attrs['type'] = 'publickey' 
    183             packet[-1] += 'challenge', 
    184             signdata = 'password' 
    185             packet[-1][-1] += signdata 
    186             packet[-1] += 'response', 
    187             packet[-1][-1] += str(sendkey.sign(signdata, '')[0]) 
    188             #print packet[-1].toxml(True) 
     142            packet += AuthenticationMethods.RSAPublicKey() 
     143            packet[-1].Sign(sendkey, 'password') 
    189144        else: 
    190             packet[-1].attrs['type'] = 'sha-hash' 
    191             packet[-1] += 'challenge', 
    192             packet[-1][-1] += 'password' 
    193             packet[-1] += 'response', 
    194             import sha 
    195             packet[-1][-1] += sha.new('secret'+'password').hexdigest() 
     145            packet += AuthenticationMethods.SHAHash() 
     146            packet[-1].Sign('secret', 'password') 
     147 
    196148        self.SendPacket(packet) 
    197149 
     
    202154        self.connection.OnAuthenticated(False, self.loginaddr) 
    203155 
     156    def _reply_answer(self, packet, *args, **kw): 
     157        packet = authentication() 
     158        packet.attrs['type'] = 'answer' 
     159        packet += 'as', 
     160        packet[-1].attrs['addr'] = str(self.loginaddr) 
     161 
     162        if sendkey: 
     163            # Use PublicKey 
     164            packet += AuthenticationMethods.RSAPublicKey() 
     165            packet[-1].Sign(sendkey, 'password') 
     166        else: 
     167            packet += AuthenticationMethods.SHAHash() 
     168            packet[-1].Sign('secret', 'password') 
     169 
     170        self.SendPacket(packet) 
     171 
  • trunk/RBMessaging/RBMessaging/Host/Handlers/Authentication.py

    r465 r466  
    8686 
    8787    def _reply_options(self, packet, *args, **kw): 
     88        raise NotImplementedError 
    8889        packet.attrs['type'] = 'options' 
    8990        for authmethod in ('passkey', 'plaintext', 'md5-hash', 'sha-hash', 'publickey', 'radius'): 
    90             packet += AuthenticationMethod.AuthenticationBaseMethod() 
     91            packet += AuthenticationMethods.AuthenticationBaseMethod() 
    9192            packet[-1].attrs['type'] = authmethod 
    9293        self.SendPacket(packet) 
     
    99100        self.SendPacket(packet) 
    100101 
    101     def _type_response(self, packet, *args, **kw): 
     102    def _type_answer(self, packet, *args, **kw): 
    102103        try: as_ = packet['as',][0] 
    103104        except (LookupError), e: 
     
    110111            if method.Verify(self, as_.addr): 
    111112                self.connection.OnAuthenticated(True, as_.addr) 
    112                 self._reply_success(packet, *args, **kw) 
     113                return True 
    113114            else: 
    114115                self.connection.OnAuthenticated(False, as_.addr) 
     116                raise ErrorTypes.AuthenticationError('Invalid authentication') 
     117        except ErrorTypes.AuthenticationError, err: 
     118            self.connection.OnAuthenticated(False, as_.addr) 
     119            raise 
     120 
     121    def _type_response(self, packet, *args, **kw): 
     122        """Like the "answer" packet type, only with a "success" or "failure" response.""" 
     123        try: 
     124            result = self._type_answer(packet, *args, **kw) 
     125            if result: 
     126                self._reply_success(packet, *args, **kw) 
     127                return result 
     128            else: 
    115129                self._reply_failure(packet, *args, **kw) 
    116130                raise ErrorTypes.AuthenticationError('Invalid authentication') 
    117131        except ErrorTypes.AuthenticationError, err: 
    118             self.connection.OnAuthenticated(False, as_.addr) 
    119132            self._reply_failure(packet, *args, **kw) 
    120133            raise