Changeset 476

Show
Ignore:
Timestamp:
03/17/03 23:35:30 (5 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

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

    r459 r476  
    5454 
    5555    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     56    #~ Special  
     57    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     58 
     59    def __init__(self, *args, **kw): 
     60        self.log.debug("Host connection created") 
     61        super(Connection, self).__init__(*args, **kw) 
     62 
     63    def __del__(self): 
     64        self.log.debug("Client connection destroyed") 
     65        try: super(Connection, self).__del__() 
     66        except AttributeError: pass 
     67 
     68    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    5669    #~ Public Methods  
    5770    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBMessaging/RBMessaging/Client/Handlers/Authentication.py

    r467 r476  
    2626from RBTelepathy.Handlers import * 
    2727from RBMessaging.Packet import AuthenticationMethods 
    28  
    29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    30 #~ Constants / Variables / Etc.  
    31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    32  
    33 try: 
    34     raise ImportError 
    35     from Crypto.PublicKey import RSA 
    36     import pickle 
    37     sendkey = pickle.load(open('send.rsa')) 
    38     recvkey = pickle.load(open('send.rsa')) 
    39 except ImportError: 
    40     sendkey = None 
    41     recvkey = None 
    4228 
    4329#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    8066            raise ErrorTypes.AuthenticationError('Sequence type not specified') 
    8167 
    82         print 
    83         print "AuthRecving:", packet.toxml(True) 
    84         print 
     68        #print 
     69        #print "AuthRecving:", packet.toxml(True) 
     70        #print 
    8571 
    8672        try: OnAuthType = self._CallOnAuthType(AuthType) 
     
    8975        else: return OnAuthType(packet, *args, **kw) 
    9076 
    91     def AuthorizeAs(self, loginaddr, kind="response"): 
     77    def AuthorizeAs(self, loginaddr, kind="query"): 
    9278        self.loginaddr = URIAddress.URIAddress(loginaddr) 
    9379        getattr(self, '_reply_'+kind)(None) 
    9480 
    9581    def SendPacket(self, packet, *args, **kw): 
    96         print 
    97         print "AuthSending:", packet.toxml(True) 
    98         print 
     82        #print 
     83        #print "AuthSending:", packet.toxml(True) 
     84        #print 
    9985        return self.connection.SendPacket(packet, *args, **kw) 
    10086 
     
    114100 
    115101    def _type_options(self, packet, *args, **kw): 
    116         print "Available Authentication Types:", [method.type_ for method in packet['method',]] 
     102        #print "Available Authentication Types:", [method.type_ for method in packet['method',]] 
    117103        self._reply_select(packet, *args, **kw) 
    118104 
    119105    def _reply_select(self, packet, *args, **kw): 
    120         #raise NotImplementedError 
    121106        response = authentication() 
    122107        response.attrs['type'] = 'select' 
     
    125110 
    126111        # Select method 
     112        #raise NotImplementedError 
    127113        response += AuthenticationMethods.AuthenticationBaseMethod() 
    128114        response[-1].attrs['type'] = 'sha-hash' 
     
    139125        response[-1].attrs['addr'] = str(self.loginaddr) 
    140126 
    141         if sendkey: 
    142             # Use PublicKey 
    143             response += AuthenticationMethods.RSAPublicKey() 
    144             response[-1].Sign(sendkey, 'password') 
    145         else: 
    146             response += AuthenticationMethods.SHAHash() 
    147             response[-1].Sign('secret', 'password') 
     127        #response += AuthenticationMethods.Passkey() 
     128        response += AuthenticationMethods.Plaintext() 
     129        #response += AuthenticationMethods.MD5Hash() 
     130        #response += AuthenticationMethods.SHAHash() 
     131        response[-1].Sign('secret') 
    148132 
    149133        self.SendPacket(response) 
     
    161145        response[-1].attrs['addr'] = str(self.loginaddr) 
    162146 
    163         if sendkey: 
    164             # Use PublicKey 
    165             response += AuthenticationMethods.RSAPublicKey() 
    166             response[-1].Sign(sendkey, 'password') 
    167         else: 
    168             response += AuthenticationMethods.SHAHash() 
    169             response[-1].Sign('secret', 'password') 
     147        response += AuthenticationMethods.SHAHash() 
     148        response[-1].Sign('secret')#, 'password') 
    170149 
    171150        self.SendPacket(response) 
  • trunk/RBMessaging/RBMessaging/Client/Handlers/Message.py

    r465 r476  
    4444        }) 
    4545 
    46     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    47     #~ Public Methods  
    48     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    49  
    50     def GetAddresses(self, nodename='to'): 
    51         existing = self.iternodes(nodename) 
    52         result = [each.addr for each in existing] 
    53         return result 
    54  
    55     def SetAddresses(self, addresses, nodename='to'): 
    56         print "XXX: RouteableRootElement.SetAddresses needs work" 
    57  
    5846#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    5947 
  • trunk/RBMessaging/RBMessaging/Host/Connection.py

    r459 r476  
    4848 
    4949    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     50    #~ Special  
     51    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     52 
     53    def __init__(self, *args, **kw): 
     54        self.log.debug("Host connection created") 
     55        super(Connection, self).__init__(*args, **kw) 
     56 
     57    def __del__(self): 
     58        self.log.debug("Host connection destroyed") 
     59        try: super(Connection, self).__del__() 
     60        except AttributeError: pass 
     61 
     62    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    5063    #~ Public Methods  
    5164    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBMessaging/RBMessaging/Host/Handlers/Authentication.py

    r467 r476  
    103103 
    104104    def GetAccountData(self, asaddr, *args): 
     105        print "TODO: RBMessaging.Host.Handlers.Authentication.HostAuthentication.GetAccountData" 
    105106        return "secret" 
    106107        raise ErrorTypes.AuthenticationError('Authentication data not available') 
  • trunk/RBMessaging/RBMessaging/Host/Handlers/Message.py

    r465 r476  
    8080            self.router.AuthorityRoutes[key] = [self.OnRoutedPacket] 
    8181 
     82    def __del__(self): 
     83        self.log.debug('Message handler destroyed') 
     84        try: super(HostMessage, self).__del__() 
     85        except AttributeError: pass 
     86 
    8287    def OnRoutedPacket(self, packet, addresses): 
    8388        # Copy the root level packet, so we can adjust it's addresses 
     
    8994 
    9095    def OnStreamPacket(self, packet): 
    91         # TODO: Flush out 
    92         #fromlist = packet.GetAddresses('from') 
    93         #if fromlist: raise ValueError, '"from" element not allowed on a user connection' 
     96        fromlist = packet.GetAddresses('from') 
     97        if len(fromlist) > 1:  
     98            # Having something sent from more than one address is strange.   
     99            raise ErrorTypes.PacketMalformedError, 'Only one "from" element allowed.' 
     100        elif len(fromlist) == 1:  
     101            # Check to make sure it is from the same account...  
     102            # TODO: more checks should probably be done 
     103            if fromlist[0].addr.network != self.connection.loginaddr.network: 
     104                raise ErrorTypes.PacketMalformedError, 'Invalid "from" address specified.' 
     105            if fromlist[0].addr.account != self.connection.loginaddr.account: 
     106                raise ErrorTypes.PacketMalformedError, 'Invalid "from" address specified.' 
     107        else: 
     108            from_ = Elements.URIAddressElement('from') 
     109            from_.addr = str(self.connection.loginaddr) 
     110            packet.insertelem(0, from_) 
    94111        tolist = packet.GetAddresses('to') 
    95112 
    96         self.log.info('Sending "%s" packet to Router', packet.node) 
    97113        if not self.router: 
    98114            self.router = connection.model().GetRouter('message') 
    99115            if not self.router: 
    100116                raise ErrorTypes.RoutingError, 'No router available' 
     117 
     118        self.log.info('Sending "%s" packet to Router', packet.node) 
    101119        routecommands = self.router.RoutePacket(packet, tolist) 
    102120        if routecommands: 
  • trunk/RBMessaging/RBMessaging/Packet/AuthenticationMethods.py

    r467 r476  
    6868    def _set_challenge(self, challenge): 
    6969        self.delnodes('challenge') 
    70         self.addnode('challenge').adddata(challenge) 
     70        if challenge: 
     71            self.addnode('challenge').adddata(challenge) 
    7172    def _del_challenge(self): 
    7273        self.delnodes('challenge') 
     
    102103        raise NotImplementedError 
    103104 
     105    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     106    #~ Protected Methods  
     107    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     108 
     109    def _GetTimeMethodChallenge(self, handler, asaddr): 
     110        challenge = self.challenge 
     111        try:  
     112            senttime = time.mktime(DateUtils.fromisoformat(challenge)) 
     113        except ValueError:  
     114            return None 
     115        else: 
     116            timenow = time.mktime(time.gmtime()) 
     117            timedelta = abs(timenow - senttime) 
     118            timedeltawindow = getattr(handler, 'MethodChallengeTimeLimit', 30) 
     119            if timedelta <= timedeltawindow: 
     120                return challenge 
     121            else:  
     122                raise ErrorTypes.AuthenticationError, 'Authentication challenge utc time is not within valid window.  (delta=%r, window=%r)' % (timedelta, timedeltawindow) 
     123 
     124    def _SetTimeMethodChallenge(self, astime=None): 
     125        return DateUtils.isoformat(astime or time.gmtime()) 
     126 
    104127#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    105128 
     
    146169 
    147170        def Sign(self, response=None, challenge=None): 
     171            if challenge is not None: 
     172                self.challenge = challenge 
    148173            if response is not None: 
    149174                self.response = response  
    150             if challenge is not None: 
    151                 self.challenge = challenge 
    152175 
    153176        def SetChallenge(self, handler, asaddr): 
    154177            self.response = None 
    155             self.challenge = "passkey" 
    156  
    157         def Verify(self, handler, asaddr): 
    158             # TODO: Need to verify challenge is valid -- no reply attack 
     178            self.challenge = None #"passkey" 
     179 
     180        def Verify(self, handler, asaddr): 
    159181            challenge = self.challenge or '' 
    160182            if challenge: 
     
    184206        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    185207 
    186         def Sign(self, reponse, challenge='password'): 
     208        def Sign(self, response, challenge='password'): 
     209            self.challenge = challenge 
    187210            self.response = response  
    188             self.challenge = challenge 
     211 
     212        def GetValidChallenge(self, handler, asaddr): 
     213            challenge = self.challenge 
     214            try: 
     215                if challenge == handler.__challenge: 
     216                    return challenge 
     217            except AttributeError: pass 
     218            return "password" 
    189219 
    190220        def SetChallenge(self, handler, asaddr): 
     
    193223 
    194224        def Verify(self, handler, asaddr): 
    195             # TODO: Need to verify challenge is valid -- no reply attack 
    196             password = handler.GetAccountData(asaddr, self.challenge or 'password'
    197             return self.response == password  
     225            challenge = self.GetValidChallenge(handler, asaddr) 
     226            password = handler.GetAccountData(asaddr, challenge
     227            return self.response.strip() == password.strip() 
    198228except ImportError:  
    199229    pass 
     
    218248        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    219249 
    220         def Sign(self, reponse, challenge): 
    221             self.challenge = challenge 
    222             self.response = md5.new(reponse + challenge).hexdigest() 
     250        def Sign(self, reponse, challenge=None): 
     251            if challenge is None: 
     252                self.challenge = self._SetTimeMethodChallenge() 
     253            else: self.challenge = challenge 
     254            self.response = md5.new(reponse + self.challenge).hexdigest() 
     255 
     256        def GetValidChallenge(self, handler, asaddr): 
     257            challenge = self.challenge 
     258            try: 
     259                if challenge == handler.__challenge: 
     260                    return challenge 
     261            except AttributeError: pass 
     262            result = self._GetTimeMethodChallenge(handler, asaddr) 
     263            if result is not None: return result 
     264            raise ErrorTypes.AuthenticationError, 'Invalid challenge data' 
    223265 
    224266        def SetChallenge(self, handler, asaddr): 
    225267            self.response = None 
    226             handler.__challenge = self.challenge = str(id(self) ^ id(handler)) 
    227  
    228         def Verify(self, handler, asaddr): 
    229             # TODO: Need to verify challenge is valid -- no reply attack 
     268            handler.__challenge = self.challenge = self._SetTimeMethodChallenge() 
     269 
     270        def Verify(self, handler, asaddr): 
    230271            password = handler.GetAccountData(asaddr, 'md5-password', 'password') 
    231             correct = md5.new(password + self.challenge).hexdigest() 
     272            challenge = self.GetValidChallenge(handler, asaddr) 
     273            correct = md5.new(password + challenge).hexdigest() 
    232274            return self.response == correct 
    233275except ImportError:  
     
    241283try: 
    242284    import sha 
     285    import time 
     286    from RBFoundation import DateUtils 
     287 
    243288    class SHAHash(AuthenticationBaseMethod): 
    244289        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    253298        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    254299 
    255         def Sign(self, reponse, challenge): 
    256             self.challenge = challenge 
    257             self.response = sha.new(reponse + challenge).hexdigest() 
     300        def Sign(self, reponse, challenge=None): 
     301            if challenge is None: 
     302                self.challenge = self._SetTimeMethodChallenge() 
     303            else: self.challenge = challenge 
     304            self.response = sha.new(reponse + self.challenge).hexdigest() 
     305 
     306        def GetValidChallenge(self, handler, asaddr): 
     307            challenge = self.challenge 
     308            try: 
     309                if challenge == handler.__challenge: 
     310                    return challenge 
     311            except AttributeError: pass 
     312            result = self._GetTimeMethodChallenge(handler, asaddr) 
     313            if result is not None: return result 
     314            raise ErrorTypes.AuthenticationError, 'Invalid challenge data' 
    258315 
    259316        def SetChallenge(self, handler, asaddr): 
    260317            self.response = None 
    261             handler.__challenge = self.challenge = str(id(self) ^ id(handler)) 
    262  
    263         def Verify(self, handler, asaddr): 
    264             # TODO: Need to verify challenge is valid -- no reply attack 
     318            handler.__challenge = self.challenge = self._SetTimeMethodChallenge() 
     319 
     320        def Verify(self, handler, asaddr): 
    265321            password = handler.GetAccountData(asaddr, 'sha-password', 'password') 
    266             correct = sha.new(password + self.challenge).hexdigest() 
     322            challenge = self.GetValidChallenge(handler, asaddr) 
     323            correct = sha.new(password + challenge).hexdigest() 
    267324            return self.response == correct 
    268325except ImportError:  
     
    288345        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    289346 
    290         def Sign(self, key, challenge): 
    291             self.challenge = challenge 
     347        def Sign(self, key, challenge=None): 
     348            if challenge is None: 
     349                self.challenge = self._SetTimeMethodChallenge() 
     350            else: self.challenge = challenge 
    292351            self.response = str(key.sign(self.challenge)[0]) 
    293352 
     353        def GetValidChallenge(self, handler, asaddr): 
     354            challenge = self.challenge 
     355            try: 
     356                if challenge == handler.__challenge: 
     357                    return challenge 
     358            except AttributeError: pass 
     359            result = self._GetTimeMethodChallenge(handler, asaddr) 
     360            if result is not None: return result 
     361            raise ErrorTypes.AuthenticationError, 'Invalid challenge data' 
     362 
    294363        def SetChallenge(self, handler, asaddr): 
    295364            self.response = None 
    296             handler.__challenge = self.challenge = str(id(self) ^ id(handler)) 
    297  
    298         def Verify(self, handler, asaddr): 
    299             # TODO: Need to verify challenge is valid -- no reply attack 
     365            handler.__challenge = self.challenge = self._SetTimeMethodChallenge() 
     366 
     367        def Verify(self, handler, asaddr): 
    300368            key = handler.GetAccountData(asaddr, 'rsa-publickey', 'dsa-publickey', 'publickey') 
    301369            signature = long(self.response) 
    302             return key.verify(self.challenge, (signature,)) 
     370            challenge = self.GetValidChallenge(handler, asaddr) 
     371            return key.verify(challenge, (signature,)) 
    303372except ImportError:  
    304373    pass 
  • trunk/RBMessaging/demo/simple/all.py

    r466 r476  
    3333if __name__ == '__main__': 
    3434    logging.basicConfig() 
    35     logging.root.setLevel(logging.INFO) 
    36     #logging.root.setLevel(logging.DEBUG) 
     35    #logging.root.setLevel(logging.INFO) 
     36    logging.root.setLevel(logging.DEBUG) 
    3737 
    3838    try: 
  • trunk/RBMessaging/demo/simple/host.py

    r463 r476  
    3333if __name__ == '__main__': 
    3434    logging.basicConfig() 
    35     logging.root.setLevel(logging.INFO) 
    36     #logging.root.setLevel(logging.DEBUG) 
     35    #logging.root.setLevel(logging.INFO) 
     36    logging.root.setLevel(logging.DEBUG) 
    3737 
    3838    try: 
  • trunk/RBMessaging/demo/simple/recv.py

    r463 r476  
    3333if __name__ == '__main__': 
    3434    logging.basicConfig() 
    35     logging.root.setLevel(logging.INFO) 
    36     #logging.root.setLevel(logging.DEBUG) 
     35    #logging.root.setLevel(logging.INFO) 
     36    logging.root.setLevel(logging.DEBUG) 
    3737 
    3838    try: 
  • trunk/RBMessaging/demo/simple/send.py

    r463 r476  
    3333if __name__ == '__main__': 
    3434    logging.basicConfig() 
    35     logging.root.setLevel(logging.INFO) 
    36     #logging.root.setLevel(logging.DEBUG) 
     35    #logging.root.setLevel(logging.INFO) 
     36    logging.root.setLevel(logging.DEBUG) 
    3737 
    3838    try: 
  • trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py

    r465 r476  
    4949    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    5050 
     51    isshutdown = False 
    5152    _sendData = None 
    52     isshutdown = False 
    5353    _isshutdown_send = False 
    5454    _isshutdown_recv = False 
     55    maxsend = 100000 
    5556    log = logging.getLogger('SocketStream') 
    5657 
     
    8081            raise ErrorTypes.StreamError('Cannot write to stream after shutdown') 
    8182        else: 
    82             self._sendData.append([data, len(data)]
     83            self._sendData.append(data
    8384    def _delSendData(self): 
    8485        del self._sendData 
     
    8788 
    8889    def send(self, data): 
    89         self.SendData.append([data, len(data)]
     90        self.SendData.append(data
    9091    write = send 
    9192 
     
    144145 
    145146    def _ProcessWrite(self, *args, **kw): 
    146         remaining = self._sendData[0][1] 
    147         data = self._sendData[0][0] 
    148         if remaining > 100000: 
    149             start, end = -remaining, -remaining + 100000 
    150             nSent = self._SocketSend(data[start:end], *args, **kw) 
     147        data = self._sendData[0] 
     148        remaining = len(data) 
     149        if remaining > self.maxsend: 
     150            nSent = self._SocketSend(buffer(data, 0, self.maxsend), *args, **kw) 
    151151        else: 
    152             nSent = self._SocketSend(data[-remaining:], *args, **kw) 
     152            nSent = self._SocketSend(data, *args, **kw) 
    153153        if nSent is not None: 
    154             remaining -= nSent 
    155             if remaining > 0: 
    156                 print ":: Sent", nSent 
    157                 self._sendData[0][1] = remaining 
    158             else: 
    159                 self._sendData.pop(0) 
     154            data = buffer(data, nSent) 
     155            if data: self._sendData[0] = data 
     156            else: self._sendData.pop(0) 
    160157 
    161158        if self.isshutdown: