Exemplo n.º 1
0
    def _send_msg(self, dat):
        """Send the message to the core node

        Args:
            dat (dict): message object to send
        Returns:
            bytes: query ID for request/response type message
        """
        if KeyType.domain_id not in dat or KeyType.source_user_id not in dat:
            self.logger.warn("Message must include domain_id and source_id")
            return None
        try:
            if self.is_secure_connection:
                msg = message_key_types.make_message(
                    PayloadType.Type_encrypted_msgpack,
                    dat,
                    key_name=self.aes_key_name)
            else:
                msg = message_key_types.make_message(PayloadType.Type_msgpack,
                                                     dat)
            self.connection.sendall(msg)
        except Exception as e:
            self.logger.error(traceback.format_exc())
            return None
        return self.query_id
Exemplo n.º 2
0
def direct_send_to_user(sock, msg, name=None):
    if name is None:
        sock.sendall(
            message_key_types.make_message(PayloadType.Type_msgpack, msg))
    else:
        sock.sendall(
            message_key_types.make_message(PayloadType.Type_encrypted_msgpack,
                                           msg,
                                           key_name=name))
Exemplo n.º 3
0
    def send_message_in_network(self, nodeinfo=None, payload_type=PayloadType.Type_any, domain_id=None, msg=None):
        """Send message over a domain network

        Args:
            nodeinfo (NodeInfo): NodeInfo object of the destination
            payload_type (bytes): message format type
            domain_id (bytes): target domain_id
            msg (dict): message to send
        Returns:
            bool: True if successful
        """
        if nodeinfo is None:
            if domain_id not in self.domains:
                return False
            if msg[KeyType.destination_node_id] not in self.domains[domain_id]['neighbor'].nodeinfo_list:
                return False
            nodeinfo = self.domains[domain_id]['neighbor'].nodeinfo_list[msg[KeyType.destination_node_id]]
        msg[KeyType.source_node_id] = self.domains[domain_id]['neighbor'].my_node_id

        if payload_type == PayloadType.Type_any:
            if nodeinfo.key_manager is not None and nodeinfo.key_manager.key_name is not None and \
                    nodeinfo.key_manager.key_name in message_key_types.encryptors:
                payload_type = PayloadType.Type_encrypted_msgpack
            else:
                payload_type = PayloadType.Type_msgpack

        if payload_type in [PayloadType.Type_msgpack, PayloadType.Type_binary]:
            data_to_send = message_key_types.make_message(payload_type, msg)
        elif payload_type == PayloadType.Type_encrypted_msgpack:
            payload_type = PayloadType.Type_encrypted_msgpack
            data_to_send = message_key_types.make_message(payload_type, msg, key_name=nodeinfo.key_manager.key_name)
            if data_to_send is None:
                self.logger.error("Fail to encrypt message")
                return False
        else:
            return False

        if len(data_to_send) > TCP_THRESHOLD_SIZE:
            _send_data_by_tcp(ipv4=nodeinfo.ipv4, ipv6=nodeinfo.ipv6, port=nodeinfo.port, msg=data_to_send)
            self.stats.update_stats_increment("network", "send_msg_by_tcp", 1)
            self.stats.update_stats_increment("network", "sent_data_size", len(data_to_send))
            return True
        if nodeinfo.ipv6 is not None and self.socket_udp6 is not None:
            self.socket_udp6.sendto(data_to_send, (nodeinfo.ipv6, nodeinfo.port))
            self.stats.update_stats_increment("network", "send_msg_by_udp6", 1)
            self.stats.update_stats_increment("network", "sent_data_size", len(data_to_send))
            return True
        if nodeinfo.ipv4 is not None and self.socket_udp is not None:
            self.socket_udp.sendto(data_to_send, (nodeinfo.ipv4, nodeinfo.port))
            self.stats.update_stats_increment("network", "send_msg_by_udp4", 1)
            self.stats.update_stats_increment("network", "sent_data_size", len(data_to_send))
            return True
Exemplo n.º 4
0
def test_make_message2():
    """
    """
    data = {
        message_key_types.KeyType.command: MsgType.MESSAGE,
        message_key_types.KeyType.asset_group_id: "asset_group_id_001",
        message_key_types.KeyType.source_user_id: "source_user_id_12345",
        message_key_types.KeyType.query_id: "query_id_67890",
        message_key_types.KeyType.status: bbc_error.ESUCCESS,
    }
    message = message_key_types.make_message(message_key_types.PayloadType.Type_msgpack, data, 0)
    # print(message)
    assert (message[:message_key_types.Message.HEADER_LEN] == b'\x00\x02\x00\x00\x00\x00\x00S')

    msg_obj = message_key_types.Message()
    msg_obj.recv(bytes(message))
    parsed_data = msg_obj.parse()
    assert (msg_obj.payload_type == message_key_types.PayloadType.Type_msgpack)
    assert (msg_obj.format_version == 0)
    assert (msg_obj.msg_len == 83)        # 'S' == 83
    print(parsed_data)
    assert (parsed_data[message_key_types.KeyType.command] == MsgType.MESSAGE)
    assert (_bytes_to_str(parsed_data[message_key_types.KeyType.asset_group_id]) == "asset_group_id_001")
    assert (_bytes_to_str(parsed_data[message_key_types.KeyType.source_user_id]) == "source_user_id_12345")
    assert (_bytes_to_str(parsed_data[message_key_types.KeyType.query_id]) == "query_id_67890")
    assert (parsed_data[message_key_types.KeyType.status] == bbc_error.ESUCCESS)
Exemplo n.º 5
0
def test_make_message():
    """
    """
    data = {  }
    message = message_key_types.make_message(message_key_types.PayloadType.Type_msgpack, data, 0)
    # print(message)
    assert (message == b'\x00\x02\x00\x00\x00\x00\x00\x01\x80')
    assert (message[:message_key_types.Message.HEADER_LEN] == b'\x00\x02\x00\x00\x00\x00\x00\x01')