Ejemplo n.º 1
0
  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)
Ejemplo n.º 2
0
  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)
Ejemplo n.º 3
0
  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)
Ejemplo n.º 4
0
  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])
Ejemplo n.º 5
0
 def requestPair(self):
   self.status = InternalStatus.REQUESTED
   self._cancelTimeout()
   self.timeout = callLater(30, self.requestUnpair)
   pair = Packet.createPair(True)
   self._sendPacket(pair)
Ejemplo n.º 6
0
 def sendCancel(self, reference):
   cancel = Packet.createCancel(reference)
   self._sendPacket(cancel)
Ejemplo n.º 7
0
 def sendNotification(self, text, title, application, reference):
   notification = Packet.createNotification(text, title, application, reference)
   self._sendPacket(notification)
Ejemplo n.º 8
0
 def sendPing(self):
   ping = Packet.createPing()
   self._sendPacket(ping)
Ejemplo n.º 9
0
 def sendRing(self):
   ring = Packet.createRing()
   self._sendPacket(ring)
Ejemplo n.º 10
0
 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)