class MessageParser(Parser): def __init__(self, manager, dispatcher): self.manager = manager self.dispatcher = dispatcher self.interpreter = MessageInterpreter(manager, dispatcher) def handleMessage(self, msg): """ Figure out what to do with this message """ needs_activation = self.senderNeedsActivation(msg["type"], msg["sender"]) self.parse(msg) if needs_activation: content = self.manager.get_node_hash() self.dispatcher.send("nodelisthash", target=msg["sender"], content=content) def parse(self, msg): """ Figures out what message type was given, then passes it to MessageProcessor """ method_type = "received_{0}".format(msg["type"]) try: method = getattr(self.interpreter, method_type) method(msg) except: self.interpreter.received_chat(msg) def senderNeedsActivation(self, message, sender): """Checks to see if the sender is active or even authorized""" if self.manager.isActive(sender): return False if self.manager.isAuthorized(sender): self.manager.activate_node(sender) PynaDisplay.log("Registered {0} at {1}".format(sender["alias"], sender["location"])) return True return self.isAcceptableAnonymousMessage(message, sender) def isAcceptableAnonymousMessage(self, message, sender): """Verifies that the message is authorizable""" if message != "nodelist": PynaDisplay.warn("Untrusted message received from {0}".format(sender)) return False return True
def __init__(self, manager, dispatcher): self.manager = manager self.dispatcher = dispatcher self.interpreter = MessageInterpreter(manager, dispatcher)