def lineReceived(self, line): try: packet = Packet.load(line) debug(f"RecvFrom(self.address) - {packet}") except JSONDecodeError as e: error(f"Unserialization error: {line}") exception(e) return if not self.transport.TLS: if packet.isType(PacketType.IDENTITY): self._handleIdentity(packet) else: warning(f"Device {self.name} not identified, ignoring non encrypted packet {packet.getType()}") else: if packet.isType(PacketType.PAIR): self._handlePairing(packet) elif self.isTrusted(): if packet.isType(PacketType.REQUEST): self._handleNotify(packet) elif packet.isType(PacketType.PING): self.sendPing() else: warning(f"Discarding unsupported packet {packet.getType()} for {self.name}") else: warning(f"Device {self.name} not paired, ignoring packet {packet.getType()}") self.status = InternalStatus.NOT_PAIRED pair = Packet.createPair(False) self._sendPacket(pair)
def _handlePairing(self, packet): self._cancelTimeout() if packet.get("pair") is True: if self.status == InternalStatus.REQUESTED: info("Pair answer") certificate = Certificate(self.transport.getPeerCertificate()).dumpPEM() self.status = InternalStatus.PAIRED if self.isTrusted(): self.factory.database.updateDevice(self.identifier, self.name, self.device) else: self.factory.database.pairDevice(self.identifier, certificate, self.name, self.device) else: info("Pair request") pair = Packet.createPair(False) if self.status == InternalStatus.PAIRED or self.isTrusted(): info("I'm already paired, but they think I'm not") self.factory.database.updateDevice(self.identifier, self.name, self.device) pair.set("pair", True) else: info("Pairing started by the other end, rejecting their request") self._sendPacket(pair) else: info("Unpair request") if self.status == InternalStatus.REQUESTED: info("Canceled by other peer") self.status = InternalStatus.NOT_PAIRED self.factory.database.unpairDevice(self.identifier)
def requestUnpair(self): if self.status == InternalStatus.REQUESTED: info("Pairing request timed out") self._cancelTimeout() self.status = InternalStatus.NOT_PAIRED pair = Packet.createPair(False) self._sendPacket(pair) self.factory.database.unpairDevice(self.identifier)
def datagramReceived(self, datagram, addr): try: packet = Packet.load(datagram) debug(f"RecvFrom({addr[0]}:{addr[1]}) - {packet}") except JSONDecodeError as e: error(f"Unserialization error: {datagram}") exception(e) return if not packet.isType(PacketType.IDENTITY): info(f"Received a UDP packet of wrong type {packet.getType()}") elif packet.get("deviceId") == self.identifier: debug("Ignoring my own broadcast") else: debug(f"Received UDP identity packet from {addr[0]}, trying reverse connection") self.announceIdentity(addr[0])
def requestPair(self): self.status = InternalStatus.REQUESTED self._cancelTimeout() self.timeout = callLater(30, self.requestUnpair) pair = Packet.createPair(True) self._sendPacket(pair)
def sendCancel(self, reference): cancel = Packet.createCancel(reference) self._sendPacket(cancel)
def sendNotification(self, text, title, application, reference): notification = Packet.createNotification(text, title, application, reference) self._sendPacket(notification)
def sendPing(self): ping = Packet.createPing() self._sendPacket(ping)
def sendRing(self): ring = Packet.createRing() self._sendPacket(ring)
def __init__(self, identifier, name, discovery_port, service_port): self.identifier = identifier self.name = name self.port = discovery_port self.packet = Packet.createIdentity(self.identifier, self.name, service_port)