def process(self, header, body): msg = self._connection.receive_from_header_and_body(header, body) if isinstance(msg, ua.Message): if header.MessageType == ua.MessageType.SecureOpen: self.open_secure_channel(msg.SecurityHeader(), msg.SequenceHeader(), msg.body()) elif header.MessageType == ua.MessageType.SecureClose: self._connection.close() return False elif header.MessageType == ua.MessageType.SecureMessage: return self.process_message(msg.SecurityHeader(), msg.SequenceHeader(), msg.body()) elif isinstance(msg, ua.Hello): ack = ua.Acknowledge() ack.ReceiveBufferSize = msg.ReceiveBufferSize ack.SendBufferSize = msg.SendBufferSize data = uatcp_to_binary(ua.MessageType.Acknowledge, ack) self.socket.write(data) elif isinstance(msg, ua.ErrorMessage): self.logger.warning("Received an error message type") elif msg is None: pass # msg is a ChunkType.Intermediate of an ua.MessageType.SecureMessage else: self.logger.warning("Unsupported message type: %s", header.MessageType) raise utils.ServiceError(ua.StatusCodes.BadTcpMessageTypeInvalid) return True
def process(self, header, body): msg = self._connection.receive_from_header_and_body(header, body) if isinstance(msg, ua.Message): if header.MessageType == ua.MessageType.SecureOpen: self.open_secure_channel(msg.SecurityHeader(), msg.SequenceHeader(), msg.body()) elif header.MessageType == ua.MessageType.SecureClose: if not self.channel or header.ChannelId != self.channel.SecurityToken.ChannelId: self.logger.warning( "Request to close channel %s which was not issued, current channel is %s", header.ChannelId, self.channel) return False elif header.MessageType == ua.MessageType.SecureMessage: return self.process_message(msg.SecurityHeader(), msg.SequenceHeader(), msg.body()) elif isinstance(msg, ua.Hello): ack = ua.Acknowledge() ack.ReceiveBufferSize = msg.ReceiveBufferSize ack.SendBufferSize = msg.SendBufferSize data = self._connection.tcp_to_binary(ua.MessageType.Acknowledge, ack) self.socket.write(data) elif isinstance(msg, ua.ErrorMessage): self.logger.warning("Received an error message type") else: self.logger.warning("Unsupported message type: %s", header.MessageType) raise utils.ServiceError(ua.StatusCodes.BadTcpMessageTypeInvalid) return True
def process(self, header, body): if header.MessageType == ua.MessageType.Hello: hello = ua.Hello.from_binary(body) hdr = ua.Header(ua.MessageType.Acknowledge, ua.ChunkType.Single) ack = ua.Acknowledge() ack.ReceiveBufferSize = hello.ReceiveBufferSize ack.SendBufferSize = hello.SendBufferSize self._write_socket(hdr, ack) elif header.MessageType == ua.MessageType.Error: self.logger.warning("Received an error message type") elif header.MessageType == ua.MessageType.SecureOpen: self.open_secure_channel(body) elif header.MessageType == ua.MessageType.SecureClose: if not self.channel or header.ChannelId != self.channel.SecurityToken.ChannelId: self.logger.warning("Request to close channel %s which was not issued, current channel is %s", header.ChannelId, self.channel) return False elif header.MessageType == ua.MessageType.SecureMessage: algohdr = ua.SymmetricAlgorithmHeader.from_binary(body) seqhdr = ua.SequenceHeader.from_binary(body) return self.process_message(algohdr, seqhdr, body) else: self.logger.warning("Unsupported message type: %s", header.MessageType) return True