Changeset 465
- Timestamp:
- 03/03/03 00:05:52 (6 years ago)
- Files:
-
- trunk/RBMessaging/RBMessaging/Client/Handlers/Authentication.py (modified) (2 diffs)
- trunk/RBMessaging/RBMessaging/Client/Handlers/Error.py (modified) (1 diff)
- trunk/RBMessaging/RBMessaging/Client/Handlers/Message.py (modified) (1 diff)
- trunk/RBMessaging/RBMessaging/Host/Handlers/Authentication.py (modified) (5 diffs)
- trunk/RBMessaging/RBMessaging/Host/Handlers/Error.py (modified) (1 diff)
- trunk/RBMessaging/RBMessaging/Host/Handlers/Message.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Handlers/__init__.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/Elements.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py (modified) (6 diffs)
- trunk/RBTelepathy/demo/simple/client/AuthenticationHandler.py (modified) (2 diffs)
- trunk/RBTelepathy/demo/simple/client/ErrorHandler.py (modified) (1 diff)
- trunk/RBTelepathy/demo/simple/client/MessageHandler.py (modified) (1 diff)
- trunk/RBTelepathy/demo/simple/host/AuthenticationHandler.py (modified) (2 diffs)
- trunk/RBTelepathy/demo/simple/host/ErrorHandler.py (modified) (1 diff)
- trunk/RBTelepathy/demo/simple/host/MessageHandler.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBMessaging/RBMessaging/Client/Handlers/Authentication.py
r463 r465 44 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 45 46 class method(Elements.PacketElement , XMLClassBuilderObjectMixin):46 class method(Elements.PacketElement): 47 47 __slots__ = [] 48 48 ElementFactories = PacketFactorySet({ … … 87 87 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 88 89 class authentication(Elements.RootElementBase , XMLClassBuilderObjectMixin):89 class authentication(Elements.RootElementBase): 90 90 __slots__ = [] 91 91 ElementFactories = PacketFactorySet({ trunk/RBMessaging/RBMessaging/Client/Handlers/Error.py
r463 r465 30 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 31 32 class error(Elements.RootElementBase , XMLClassBuilderObjectMixin):32 class error(Elements.RootElementBase): 33 33 __slots__ = [] 34 34 ElementFactories = PacketFactorySet({ trunk/RBMessaging/RBMessaging/Client/Handlers/Message.py
r463 r465 31 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 class message(Elements.StreamRootElement , XMLClassBuilderObjectMixin):33 class message(Elements.StreamRootElement): 34 34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 35 35 #~ Constants / Variables / Etc. trunk/RBMessaging/RBMessaging/Host/Handlers/Authentication.py
r463 r465 25 25 26 26 from RBTelepathy.Handlers import * 27 from RBMessaging.Packet import AuthenticationMethods 27 28 28 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 30 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 32 32 class AuthBaseMethod(Elements.PacketElement, XMLClassBuilderObjectMixin): 33 __slots__ = [] 34 ElementFactories = PacketFactorySet({ 35 'response': Elements.Factory(Elements.PacketElement), 36 'challenge': Elements.Factory(Elements.PacketElement), 37 }) 38 39 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 40 #~ Properties 41 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 42 43 def _get_challenge(self): 44 challenge = self['challenge',] 45 if len(challenge) > 1: 46 raise ErrorTypes.AuthenticationError, '"%s" expected a single "challenge" element' % (self.node,) 47 elif len(challenge) == 1: 48 challenge = ''.join(map(str, challenge[0].iterdata())) 49 else: challenge = 'password' 50 return challenge 51 def _set_challenge(self, challenge): 52 self.delnodes('challenge') 53 self.addnode('challenge').adddata(challenge) 54 def _del_challenge(self, challenge): 55 self.delnodes('challenge') 56 challenge = property(_get_challenge, _set_challenge, _del_challenge) 57 58 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 60 def _get_response(self): 61 response = self['response',] 62 if len(response) != 1: 63 raise ErrorTypes.AuthenticationError, '"%s" expected a single "response" child element' % (self.node,) 64 else: response = ''.join(map(str, response[0].iterdata())) 65 return response 66 def _set_response(self, response): 67 self.delnodes('response') 68 self.addnode('response').adddata(response) 69 def _del_response(self, response): 70 self.delnodes('response') 71 response = property(_get_response, _set_response, _del_response) 72 73 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 75 class AuthPlaintext(AuthBaseMethod): 76 AuthDB = { ('send', 'password'): 'secret', ('recv', 'password'): 'secret' } 77 def Authenticate(self, handler, asaddr): 78 correct = self.AuthDB[asaddr.account, self.challenge] 79 return self.response == correct 80 81 class AuthMD5(AuthBaseMethod): 82 AuthDB = { 'send': 'secret', 'recv': 'secret' } 83 def Authenticate(self, handler, asaddr): 84 import md5 85 correct = md5.new(self.AuthDB[asaddr.account] + self.challenge).hexdigest() 86 return self.response == correct 87 88 class AuthSHA(AuthBaseMethod): 89 AuthDB = { 'send': 'secret', 'recv': 'secret' } 90 def Authenticate(self, handler, asaddr): 91 import sha 92 correct = sha.new(self.AuthDB[asaddr.account] + self.challenge).hexdigest() 93 return self.response == correct 94 95 try: 96 raise ImportError 97 from Crypto.PublicKey import RSA 98 import pickle 99 class AuthPublicKey(AuthBaseMethod): 100 AuthDB = { 101 'send': pickle.load(open('send.rsa')), 102 'recv': pickle.load(open('send.rsa')), 103 } 104 def Authenticate(self, handler, asaddr): 105 signature = long(self.response) 106 key = self.AuthDB[asaddr.account] 107 return key.verify(self.challenge, (signature,)) 108 109 DefaultAuthMethod = AuthPublicKey # XXX:XXX:XXX:XXX 110 except ImportError: 111 DefaultAuthMethod = AuthSHA # XXX:XXX:XXX:XXX 112 113 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 114 115 class authentication(Elements.RootElementBase, XMLClassBuilderObjectMixin): 33 class authentication(Elements.RootElementBase): 116 34 __slots__ = [] 117 35 ElementFactories = PacketFactorySet({ 118 36 'as': Elements.Factory(Elements.URIAddressElement), 119 'method': Elements.Factory(DefaultAuthMethod),37 'method': AuthenticationMethods.MethodFactory(), 120 38 }) 121 39 … … 153 71 else: return OnAuthType(packet, *args, **kw) 154 72 73 def GetAccountData(self, asaddr, *args): 74 return "secret" 75 raise ErrorTypes.AuthenticationError('Authentication data not available') 76 155 77 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156 78 #~ Protected Methods … … 166 88 packet.attrs['type'] = 'options' 167 89 for authmethod in ('passkey', 'plaintext', 'md5-hash', 'sha-hash', 'publickey', 'radius'): 168 packet += Auth BaseMethod()90 packet += AuthenticationMethod.AuthenticationBaseMethod() 169 91 packet[-1].attrs['type'] = authmethod 170 92 self.SendPacket(packet) … … 185 107 raise ErrorTypes.AuthenticationError('Did not find response "method" element') 186 108 187 if method.Authenticate(self, as_.addr): 188 self.connection.OnAuthenticated(True, as_.addr) 189 self._reply_success(packet, *args, **kw) 190 else: 109 try: 110 if method.Verify(self, as_.addr): 111 self.connection.OnAuthenticated(True, as_.addr) 112 self._reply_success(packet, *args, **kw) 113 else: 114 self.connection.OnAuthenticated(False, as_.addr) 115 self._reply_failure(packet, *args, **kw) 116 raise ErrorTypes.AuthenticationError('Invalid authentication') 117 except ErrorTypes.AuthenticationError, err: 191 118 self.connection.OnAuthenticated(False, as_.addr) 192 119 self._reply_failure(packet, *args, **kw) 193 raise ErrorTypes.AuthenticationError('Invalid authentication')120 raise 194 121 195 122 def _reply_success(self, packet, *args, **kw): trunk/RBMessaging/RBMessaging/Host/Handlers/Error.py
r463 r465 30 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 31 32 class error(Elements.RootElementBase , XMLClassBuilderObjectMixin):32 class error(Elements.RootElementBase): 33 33 __slots__ = [] 34 34 ElementFactories = PacketFactorySet({ trunk/RBMessaging/RBMessaging/Host/Handlers/Message.py
r463 r465 31 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 class message(Elements.StreamRootElement , XMLClassBuilderObjectMixin):33 class message(Elements.StreamRootElement): 34 34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 35 35 #~ Constants / Variables / Etc. trunk/RBTelepathy/RBTelepathy/Handlers/__init__.py
r463 r465 35 35 documentation is painfully wrong, here is a short pseudocode stub:: 36 36 37 class PacketElementToBuild(Element.RootElementBase , XMLClassBuilderBaseMixin):37 class PacketElementToBuild(Element.RootElementBase) 38 38 NamespaceSynonyms = { 39 39 'shortname': 'an.extremely.long.xmlns.that.is.used.frequently', … … 79 79 80 80 from RBTelepathy import ErrorTypes 81 from RBTelepathy.Packet import *82 from RBTelepathy.Packet.Builder import *83 81 from RBTelepathy.Packet import Elements 84 82 from RBTelepathy.Packet import StreamElements 85 83 from RBTelepathy.Packet import URIAddress 84 from RBTelepathy.Packet.Builder import PacketFactorySet 86 85 87 86 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBTelepathy/RBTelepathy/Packet/Elements.py
r461 r465 25 25 26 26 from RBFoundation import XMLNode 27 from RBFoundation import XMLClassBuilder 27 28 import URIAddress 28 29 … … 57 58 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 59 59 class PacketElement(PacketElementBase):60 class LeafElement(PacketElementBase): 60 61 pass 61 62 62 63 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 64 64 class RootElementBase(PacketElementBase): 65 class PacketElement(PacketElementBase, XMLClassBuilder.XMLClassBuilderBaseMixin): 66 pass 67 68 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 70 class RootElementBase(PacketElement): 65 71 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 72 #~ Public Methods trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py
r464 r465 49 49 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 50 51 _sendData = ""51 _sendData = None 52 52 isshutdown = False 53 53 _isshutdown_send = False … … 73 73 74 74 def _getSendData(self): 75 if self._sendData is None: 76 self._sendData = [] 75 77 return self._sendData 76 78 def _setSendData(self, data): … … 78 80 raise ErrorTypes.StreamError('Cannot write to stream after shutdown') 79 81 else: 80 self._sendData = data82 self._sendData.append([data, len(data)]) 81 83 def _delSendData(self): 82 84 del self._sendData … … 85 87 86 88 def send(self, data): 87 self.SendData += data89 self.SendData.append([data, len(data)]) 88 90 write = send 89 91 … … 142 144 143 145 def _ProcessWrite(self, *args, **kw): 144 nSent = self._SocketSend(self._sendData, *args, **kw) 145 self._sendData = self._sendData[nSent:] 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) 151 else: 152 nSent = self._SocketSend(data[-remaining:], *args, **kw) 153 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) 160 146 161 if self.isshutdown: 147 162 # Ok, we're shutdown, but were still sending data … … 218 233 try: 219 234 self._sendDataLock.acquire(True) 220 SocketStream._delSendData( )235 SocketStream._delSendData(self) 221 236 finally: 222 237 self._sendDataLock.release() trunk/RBTelepathy/demo/simple/client/AuthenticationHandler.py
r463 r465 45 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 46 47 class method(Elements.PacketElement , XMLClassBuilderObjectMixin):47 class method(Elements.PacketElement): 48 48 __slots__ = [] 49 49 NamespaceSynonyms = {None: DefaultNamespace} … … 90 90 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 91 91 92 class authentication(Elements.RootElementBase , XMLClassBuilderObjectMixin):92 class authentication(Elements.RootElementBase): 93 93 __slots__ = [] 94 94 NamespaceSynonyms = {None: DefaultNamespace} trunk/RBTelepathy/demo/simple/client/ErrorHandler.py
r463 r465 36 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 37 38 class error(Elements.RootElementBase , XMLClassBuilderObjectMixin):38 class error(Elements.RootElementBase): 39 39 __slots__ = [] 40 40 NamespaceSynonyms = {None: DefaultNamespace} trunk/RBTelepathy/demo/simple/client/MessageHandler.py
r463 r465 37 37 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38 38 39 class message(Elements.StreamRootElement , XMLClassBuilderObjectMixin):39 class message(Elements.StreamRootElement): 40 40 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 41 #~ Constants / Variables / Etc. trunk/RBTelepathy/demo/simple/host/AuthenticationHandler.py
r463 r465 36 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 37 38 class AuthBaseMethod(Elements.PacketElement , XMLClassBuilderObjectMixin):38 class AuthBaseMethod(Elements.PacketElement): 39 39 __slots__ = [] 40 40 NamespaceSynonyms = {None: DefaultNamespace} … … 120 120 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 121 122 class authentication(Elements.RootElementBase , XMLClassBuilderObjectMixin):122 class authentication(Elements.RootElementBase): 123 123 __slots__ = [] 124 124 NamespaceSynonyms = {None: DefaultNamespace} trunk/RBTelepathy/demo/simple/host/ErrorHandler.py
r463 r465 36 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 37 38 class error(Elements.RootElementBase , XMLClassBuilderObjectMixin):38 class error(Elements.RootElementBase): 39 39 __slots__ = [] 40 40 NamespaceSynonyms = {None: DefaultNamespace} trunk/RBTelepathy/demo/simple/host/MessageHandler.py
r463 r465 37 37 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38 38 39 class message(Elements.StreamRootElement , XMLClassBuilderObjectMixin):39 class message(Elements.StreamRootElement): 40 40 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 41 #~ Constants / Variables / Etc.
