Changeset 414
- Timestamp:
- 01/22/03 23:17:40 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/URIparser.py (modified) (1 diff)
- trunk/RBTelepathy/RBTelepathy/Connection.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/AuthenticationHandler.py (modified) (9 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/Builder.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/ErrorHandler.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Packet/MessageHandler.py (modified) (2 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py (modified) (3 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py (modified) (8 diffs)
- trunk/RBTelepathy/RBTelepathy/Stream/SocketServer.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/URIparser.py
r406 r414 119 119 120 120 def __repr__(self): 121 return '< URI:%s>' % (self.geturi(),)121 return '<%s>' % (self.geturi(),) 122 122 123 123 def __str__(self): trunk/RBTelepathy/RBTelepathy/Connection.py
r413 r414 37 37 38 38 log = logging.getLogger('Connection') 39 StreamPacketHandlers = {} 39 40 RoutedPacketHandlers = {} 40 StreamPacketHandlers = {}41 41 42 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 45 45 46 46 def __init__(self): 47 self.StreamPacketHandlers = self.StreamPacketHandlers.copy() 47 48 self.RoutedPacketHandlers = self.RoutedPacketHandlers.copy() 48 self.StreamPacketHandlers = self.StreamPacketHandlers.copy() 49 50 def LoadDefaultHandlers(self): 51 pass 49 52 50 53 def SendPacket(self, *args, **kw): trunk/RBTelepathy/RBTelepathy/Packet/AuthenticationHandler.py
r412 r414 24 24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 25 26 import logging 27 from xml.sax.saxutils import quoteattr as xmlquoteattr 28 26 29 from RBMBuilder import * 27 30 import RBMElements 31 import URIAddress 28 32 29 33 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 31 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 36 33 class AuthenticationElement(RBMElements.RootElementBase, XMLClassBuilder .XMLClassBuilderBaseMixin):37 class AuthenticationElement(RBMElements.RootElementBase, XMLClassBuilderObjectMixin): 34 38 NamespaceSynonyms = RBNamespaceSynonyms 35 39 DefaultNamespace = RBNamespaceSynonyms[None] 36 ElementFactories = XMLClassBuilder.ElementFactorySet({ 40 ElementFactories = ElementFactorySet({ 41 (RBMessagingNamespace, 'simple'): EF.Static(RBMElements.URIAddressElement), 37 42 (RBMessagingNamespace, ): EF.Static(RBMElements.PacketChildElement), 38 43 }) 44 45 def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): 46 return self.ElementFactorySet._GetElementFactory(owner, parent, node, attributes, namespacemap) 39 47 40 48 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 46 54 47 55 ElementFactories = {(RBMessagingNamespace, 'authentication'): EF.Static(AuthenticationElement)} 56 StreamPacketHandlers = ElementFactories.keys() 57 RoutedPacketHandlers = () 48 58 49 59 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 58 68 59 69 def OnStreamPacket(self, connection, packet, *args, **kw): 70 self.log.debug('Received auth type=%r packet', packet._attributes.get('type', )) 60 71 AuthType = packet._attributes['type'] 61 72 try: … … 71 82 def _EnableType(self, AuthType): 72 83 klass = self.__class__ 73 self._ValidTypes[AuthType] = getattr(klass, AuthType)84 self._ValidTypes[AuthType] = getattr(klass, '_type_'+AuthType) 74 85 75 def _send_packet(self, AuthType, XMLBody=None):76 xml = "<authentication xmlns='%s' type='%s'" % ( namespace, AuthType)86 def _send_packet(self, connection, AuthType, XMLBody=None): 87 xml = "<authentication xmlns='%s' type='%s'" % (RBMessagingNamespace, AuthType) 77 88 if XMLBody: 78 89 xml += ">" + XMLBody + "</authentication>" 79 90 else: xml += "/>" 91 #print '* '*10 92 #print xml 93 #print 80 94 connection.SendPacket(xml) 81 95 … … 84 98 class ServerAuthenticationHandler(AuthenticationBaseHandler): 85 99 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 100 #~ Constants / Variables / Etc. 101 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 103 log = logging.getLogger('ServerAuthenticationHandler') 104 105 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 106 #~ Public Methods 87 107 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 108 89 109 def __init__(self): 110 AuthenticationBaseHandler.__init__(self) 90 111 self._EnableType('query') 91 112 self._EnableType('select') … … 96 117 97 118 def _type_query(self, connection, packet, *args, **kw): 98 self._reply_options( self,connection, packet, *args, **kw)119 self._reply_options(connection, packet, *args, **kw) 99 120 100 121 def _reply_options(self, connection, packet, *args, **kw): 101 self._send_packet( 'options', '<simple/>')122 self._send_packet(connection, 'options', '<simple/>') 102 123 103 124 def _type_select(self, connection, packet, *args, **kw): 104 self._reply_challenge( self,connection, packet, *args, **kw)125 self._reply_challenge(connection, packet, *args, **kw) 105 126 106 127 def _reply_challenge(self, connection, packet, *args, **kw): 107 128 self._EnableType('response') 108 self._send_packet( 'challenge', '<simple addr=""/>')129 self._send_packet(connection, 'challenge', '<simple addr=""/>') 109 130 110 131 def _type_response(self, connection, packet, *args, **kw): 111 self._reply_success(self, connection, packet, *args, **kw) 112 self._reply_failure(self, connection, packet, *args, **kw) 132 try: 133 simple = packet._getElements(node='simple')[0] 134 except (LookupError), e: 135 raise ErrorTypes.AuthenticationError('Did not find selected response "simple"') 136 137 if simple.addr.network: 138 connection.OnAuthenticated(True, simple.addr) 139 self._reply_success(connection, packet, *args, **kw) 140 else: 141 connection.OnAuthenticated(False, None) 142 self._reply_failure(connection, packet, *args, **kw) 113 143 114 144 def _reply_success(self, connection, packet, *args, **kw): 115 connection.OnAuthenticated(True) 116 self._send_packet('success') 145 self._send_packet(connection, 'success') 117 146 118 147 def _reply_failure(self, connection, packet, *args, **kw): 119 connection.OnAuthenticated(False) 120 self._send_packet('failure') 148 self._send_packet(connection, 'failure') 121 149 raise ErrorTypes.AuthenticationError('Invalid response to challenge') 122 150 … … 125 153 class ClientAuthenticationHandler(AuthenticationBaseHandler): 126 154 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 155 #~ Constants / Variables / Etc. 156 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 158 log = logging.getLogger('ClientAuthenticationHandler') 159 160 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 161 #~ Public Methods 162 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 164 def AuthorizeAs(self, connection, loginaddr): 165 self.loginaddr = URIAddress.URIAddress(loginaddr) 166 self._reply_query(connection, None) 167 168 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 127 169 #~ Protected Methods 128 170 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 130 172 def _reply_query(self, connection, packet, *args, **kw): 131 173 self._EnableType('options') 132 self._send_packet( 'query')174 self._send_packet(connection, 'query') 133 175 134 176 def _type_options(self, connection, packet, *args, **kw): 135 self._reply_select( self,connection, packet, *args, **kw)177 self._reply_select(connection, packet, *args, **kw) 136 178 137 179 def _reply_select(self, connection, packet, *args, **kw): 138 180 self._EnableType('challenge') 139 self._send_packet( 'select', '<simple/>')181 self._send_packet(connection, 'select', '<simple/>') 140 182 141 def _type_challe ge(self, connection, packet, *args, **kw):142 self._reply_response( self,connection, packet, *args, **kw)183 def _type_challenge(self, connection, packet, *args, **kw): 184 self._reply_response(connection, packet, *args, **kw) 143 185 144 186 def _reply_response(self, connection, packet, *args, **kw): 145 187 self._EnableType('success') 146 188 self._EnableType('failure') 147 self._send_packet( 'response', '<simple addr="account@network/path"/>')189 self._send_packet(connection, 'response', '<simple addr=%s/>' % (xmlquoteattr(str(self.loginaddr)),)) 148 190 149 191 def _type_success(self, connection, packet, *args, **kw): 150 connection.OnAuthenticated(True )192 connection.OnAuthenticated(True, self.loginaddr) 151 193 152 194 def _type_failure(self, connection, packet, *args, **kw): 153 connection.OnAuthenticated(False )195 connection.OnAuthenticated(False, self.loginaddr) 154 196 trunk/RBTelepathy/RBTelepathy/Packet/Builder.py
r413 r414 25 25 26 26 import weakref 27 from RBFoundation.XMLClassBuilder import XMLClassBuilder 27 from xml.parsers.expat import ExpatError 28 from RBFoundation.XMLClassBuilder import * 28 29 from RBFoundation.XMLClassBuilder import ElementFactory as EF 29 30 from RBMessaging import ErrorTypes … … 75 76 # Pass these along... 76 77 raise 78 except ExpatError, e: 79 raise ErrorTypes.PacketInvalidXMLError(str(e)) 77 80 except StandardError, e: 78 81 # Change these to PacketErrors trunk/RBTelepathy/RBTelepathy/Packet/ErrorHandler.py
r412 r414 24 24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 25 26 import logging 27 from RBMBuilder import * 28 import RBMElements 29 26 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 27 31 #~ Definitions 28 32 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29 33 30 class ErrorElement(RBMElements.RootElementBase, XMLClassBuilder .XMLClassBuilderBaseMixin):34 class ErrorElement(RBMElements.RootElementBase, XMLClassBuilderBaseMixin): 31 35 NamespaceSynonyms = RBNamespaceSynonyms 32 36 DefaultNamespace = RBNamespaceSynonyms[None] 33 ElementFactories = XMLClassBuilder.ElementFactorySet({37 ElementFactories = ElementFactorySet({ 34 38 (RBMessagingNamespace, ): EF.Static(RBMElements.PacketChildElement), 35 39 }) 40 41 def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): 42 return self.ElementFactorySet._GetElementFactory(owner, parent, node, attributes, namespacemap) 36 43 37 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 43 50 44 51 ElementFactories = {(RBMessagingNamespace, 'error'): EF.Static(ErrorElement)} 52 StreamPacketHandlers = ElementFactories.keys() 53 RoutedPacketHandlers = () 45 54 55 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 57 class LogErrorHandler(ErrorHandler): 58 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 #~ Constants / Variables / Etc. 60 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 62 log = logging.getLogger('LogErrorHandler') 63 64 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 #~ Public Methods 66 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 67 68 def OnStreamPacket(self, connection, packet, *args, **kw): 69 self.log.warn('%s: %s', packet._attributes.get('type', 'UnknownError'), str(packet)) 70 trunk/RBTelepathy/RBTelepathy/Packet/MessageHandler.py
r412 r414 31 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 class MessageElement(RBMElements.RouteableRootElement, RBM.StreamRootElement, XMLClassBuilder .XMLClassBuilderBaseMixin):33 class MessageElement(RBMElements.RouteableRootElement, RBM.StreamRootElement, XMLClassBuilderBaseMixin): 34 34 NamespaceSynonyms = RBNamespaceSynonyms 35 35 DefaultNamespace = RBNamespaceSynonyms[None] 36 ElementFactories = XMLClassBuilder.ElementFactorySet({36 ElementFactories = ElementFactorySet({ 37 37 (RBMessagingNamespace, 'to'): EF.Static(RBMElements.PacketChildElement), 38 38 (RBMessagingNamespace, 'from'): EF.Static(RBMElements.PacketChildElement), 39 39 (RBMessagingNamespace, 'stream'): EF.Static(RBMElements.PacketChildElement), 40 40 }) 41 42 def _xmlChildFactory(self, owner, parent, node, attributes, namespacemap): 43 return self.ElementFactorySet._GetElementFactory(owner, parent, node, attributes, namespacemap) 41 44 42 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 48 51 49 52 ElementFactories = {(RBMessagingNamespace, 'message'), EF.Static(MessageElement)} 53 StreamPacketHandlers = ElementFactories.keys() 54 RoutedPacketHandlers = () 50 55 51 56 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBTelepathy/RBTelepathy/Stream/Protocol.py
r413 r414 25 25 26 26 from RBMessaging import ErrorTypes 27 from RBMessaging.Packet import StandardStreamPacketBuilder28 27 from xml.sax.saxutils import escape as xmlescape 29 28 from xml.sax.saxutils import quoteattr as xmlquoteattr … … 40 39 41 40 delimiter = '\x1F' # ASCII unit seperator 42 data = None41 data = "" 43 42 stream = None 44 43 currentpacket = None … … 49 48 #~ Public Methods 50 49 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 51 52 def __init__(self, PacketBuilderClass=StandardStreamPacketBuilder):53 self.packetbuilder = PacketBuilderClass()54 50 55 51 def OnPacket(self, packet): trunk/RBTelepathy/RBTelepathy/Stream/SocketAdaptor.py
r413 r414 48 48 49 49 def __init__(self, socket): 50 self. _socket = socket50 self.socket = socket 51 51 52 52 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 72 72 if not self.isshutdown: 73 73 self.OnShutdown(how) 74 self.log.info('Connection closed by "%s" on %s', how, self. _socket.getpeername())74 self.log.info('Connection closed by "%s" on %s', how, self.socket.getpeername()) 75 75 self.isshutdown |= (allowread << 1) | (allowwrite << 0) 76 76 if self.isshutdown > 0: 77 self. _socket.shutdown(self.isshutdown-1)77 self.socket.shutdown(self.isshutdown-1) 78 78 except socket.error, exc: 79 79 self.log.exception("Socket error on shutdown") … … 95 95 96 96 def fileno(self): 97 if self. _socket:98 return self. _socket.fileno()97 if self.socket: 98 return self.socket.fileno() 99 99 else: return None 100 100 … … 109 109 110 110 def _NeedsRead(self): 111 return self. _socket and True111 return self.socket and True 112 112 113 113 def _ProcessRead(self, *args, **kw): … … 119 119 120 120 def _NeedsWrite(self): 121 return self. _socket and self._sendData and True or False121 return self.socket and self._sendData and True or False 122 122 123 123 def _ProcessWrite(self, *args, **kw): … … 130 130 131 131 def _NeedsError(self): 132 return self. _socket and True or False132 return self.socket and True or False 133 133 134 134 def _ProcessError(self): … … 139 139 def _SocketRecv(self, limit=8192): 140 140 try: 141 return self. _socket.recv(limit)141 return self.socket.recv(limit) 142 142 except socket.error, exc: 143 143 if not self._SetSocketError(exc): … … 146 146 def _SocketSend(self, data): 147 147 try: 148 return self. _socket.send(data)148 return self.socket.send(data) 149 149 except socket.error, exc: 150 150 if not self._SetSocketError(exc): trunk/RBTelepathy/RBTelepathy/Stream/SocketServer.py
r413 r414 36 36 37 37 def __init__(self, socket): 38 self.s erversocket = socket38 self.socket = socket 39 39 40 40 def OnNewConnection(self, server, socket, info): … … 48 48 49 49 def fileno(self): 50 return self.s erversocket.fileno()50 return self.socket.fileno() 51 51 52 52 def _NeedsRead(self): 53 return self.s erversocket and 153 return self.socket and 1 54 54 def _ProcessRead(self, *args, **kw): 55 socket, info = self.s erversocket.accept()55 socket, info = self.socket.accept() 56 56 self.OnNewConnection(self, socket, info) 57 57 … … 62 62 63 63 def _NeedsError(self): 64 return self.s erversocket and 164 return self.socket and 1 65 65 def _ProcessError(self): 66 66 pass
