コード例 #1
0
 def __init__(self,
              data=None,
              ip: str = None,
              port: int = 0,
              family: int = 0,
              factor: Data = None):
     if data is None:
         assert ip is not None and port is not 0, 'IP:port error: (%s:%d' % (
             ip, port)
         if family is 0:
             family = self.family_ipv4
         if family == self.family_ipv4:
             # IPv4
             address = self.data_from_ipv4(ip=ip)
         else:
             # IPv6?
             address = None
         assert address is not None, 'failed to convert IP: %s, %d' % (
             ip, family)
         data = MutableData(capacity=8)
         data.append(0)
         data.append(family)
         data.append(UInt16Data(value=port))
         data.append(address)
         assert factor is not None, 'xor factor empty'
         data = self.xor(data=data, factor=factor)
     super().__init__(data=data, ip=ip, port=port, family=family)
コード例 #2
0
 def __init__(self,
              data=None,
              ip: str = None,
              port: int = 0,
              family: int = 0):
     if data is None:
         assert ip is not None and port is not 0, 'IP:port error: (%s:%d' % (
             ip, port)
         if family is 0:
             family = self.family_ipv4
         if family == self.family_ipv4:
             # IPv4
             address = self.data_from_ipv4(ip=ip)
         else:
             # IPv6?
             address = None
         assert address is not None, 'failed to convert IP: %s, %d' % (
             ip, family)
         data = MutableData(capacity=8)
         data.append(0)
         data.append(family)
         data.append(UInt16Data(value=port))
         data.append(address)
     elif isinstance(data, MappedAddressValue):
         ip = data.ip
         port = data.port
         family = data.family
     super().__init__(data=data)
     self.__family = family
     self.__port = port
     self.__ip = ip
コード例 #3
0
 def data_from_ipv4(cls, ip: str) -> Data:
     # IPv4
     array = ip.split('.')
     assert len(array) == 4, 'IPv4 address error: %s' % ip
     data = MutableData(capacity=4)
     for i in range(4):
         data.append(int(array[i]))
     return data
コード例 #4
0
 def _respond(self, head: Header, remote_ip: str, remote_port: int,
              local_port: int) -> bool:
     # local (server) address
     assert self.source_address is not None, 'source address not set'
     local_ip = self.source_address[0]
     assert local_port > 0, 'local port error'
     # changed (another) address
     assert self.changed_address is not None, 'changed address not set'
     changed_ip = self.changed_address[0]
     changed_port = self.changed_address[1]
     # create attributes
     value = MappedAddressValue(ip=remote_ip, port=remote_port)
     data1 = Attribute(tag=MappedAddress, value=value)
     # Xor
     value = XorMappedAddressValue(ip=remote_ip,
                                   port=remote_port,
                                   factor=head.trans_id)
     data4 = Attribute(tag=XorMappedAddress, value=value)
     # Xor2
     value = XorMappedAddressValue2(ip=remote_ip,
                                    port=remote_port,
                                    factor=head.trans_id)
     data5 = Attribute(tag=XorMappedAddress2, value=value)
     # source address
     value = SourceAddressValue(ip=local_ip, port=local_port)
     data2 = Attribute(tag=SourceAddress, value=value)
     # changed address
     value = ChangedAddressValue(ip=changed_ip, port=changed_port)
     data3 = Attribute(tag=ChangedAddress, value=value)
     # software
     value = SoftwareValue(description=self.software)
     data6 = Attribute(tag=Software, value=value)
     # pack
     length = data1.length + data2.length + data3.length + data4.length + data5.length + data6.length
     body = MutableData(capacity=length)
     body.append(data1)
     body.append(data2)
     body.append(data3)
     body.append(data4)
     body.append(data5)
     body.append(data6)
     pack = Package.new(msg_type=BindResponse,
                        trans_id=head.trans_id,
                        body=body)
     res = self.send(data=pack,
                     destination=(remote_ip, remote_port),
                     source=(local_ip, local_port))
     return res == pack.length
コード例 #5
0
 def __init__(self, description: str, data: Data = None):
     if data is None:
         data = description.encode('utf-8')
         length = len(data)
         tail = length & 3
         if tail > 0:
             length += 4 - tail
         mutable = MutableData(capacity=length)
         mutable.copy(index=0, source=data)
         if tail > 0:
             # set '\0' to fill the tail spaces
             length -= 1
             mutable.set_byte(index=length, value=0)
         data = mutable
     super().__init__(data=data)
     self.__desc = description
コード例 #6
0
 def __init__(self,
              data=None,
              msg_type: MessageType = None,
              msg_length: MessageLength = None,
              trans_id: TransactionID = None):
     if data is None:
         if trans_id is None:
             trans_id = TransactionID.generate()
         length = msg_type.length + msg_length.length + trans_id.length
         data = MutableData(capacity=length)
         data.append(msg_type)
         data.append(msg_length)
         data.append(trans_id)
     elif isinstance(data, Header):
         if msg_type is None:
             msg_type = data.type
         if msg_length is None:
             msg_length = data.msg_length
         if trans_id is None:
             trans_id = data.trans_id
     super().__init__(data=data)
     self.__type = msg_type
     self.__msg_length = msg_length
     self.__trans_id = trans_id