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 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 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 requestPair(self): self.status = InternalStatus.REQUESTED self._cancelTimeout() self.timeout = callLater(30, self.requestUnpair) pair = Packet.createPair(True) self._sendPacket(pair)