def add_complete_message_to_message_list( timestamp: bytes, onion_pub_key: bytes, group_msg_id: bytes, packet: 'Packet', message_list: List[MsgTuple], window: Union['TxWindow', 'RxWindow']) -> bytes: """Add complete log file message to `message_list`.""" whisper_byte, header, message = separate_headers( packet.assemble_message_packet(), [WHISPER_FIELD_LENGTH, MESSAGE_HEADER_LENGTH]) whisper = bytes_to_bool(whisper_byte) if header == PRIVATE_MESSAGE_HEADER and window.type == WIN_TYPE_CONTACT: message_list.append((bytes_to_timestamp(timestamp), message.decode(), onion_pub_key, packet.origin, whisper, False)) elif header == GROUP_MESSAGE_HEADER and window.type == WIN_TYPE_GROUP: purp_group_id, message = separate_header(message, GROUP_ID_LENGTH) if window.group is not None and purp_group_id != window.group.group_id: return group_msg_id purp_msg_id, message = separate_header(message, GROUP_MSG_ID_LENGTH) if packet.origin == ORIGIN_USER_HEADER: if purp_msg_id == group_msg_id: return group_msg_id group_msg_id = purp_msg_id message_list.append((bytes_to_timestamp(timestamp), message.decode(), onion_pub_key, packet.origin, whisper, False)) return group_msg_id
def test_bytes_to_timestamp(self): encoded = bytes.fromhex('00000000') self.assertIsInstance(bytes_to_timestamp(encoded), datetime)
import time import unittest from unittest import mock from src.common.db_contacts import ContactList from src.common.db_logs import access_logs, change_log_db_key, log_writer_loop, remove_logs, write_log_entry from src.common.encoding import bytes_to_timestamp from src.common.statics import * from tests.mock_classes import create_contact, GroupList, MasterKey, RxWindow, Settings from tests.utils import assembly_packet_creator, cd_unittest, cleanup, group_name_to_group_id, nick_to_pub_key from tests.utils import nick_to_short_address, tear_queues, TFCTestCase, gen_queue_dict TIMESTAMP_BYTES = bytes.fromhex('08ceae02') STATIC_TIMESTAMP = bytes_to_timestamp(TIMESTAMP_BYTES).strftime( '%H:%M:%S.%f')[:-TIMESTAMP_LENGTH] class TestLogWriterLoop(unittest.TestCase): def setUp(self): self.unittest_dir = cd_unittest() def tearDown(self): cleanup(self.unittest_dir) def test_function_logs_normal_data(self): # Setup settings = Settings() master_key = MasterKey() queues = gen_queue_dict()
def access_logs(window: Union['TxWindow', 'RxWindow'], contact_list: 'ContactList', group_list: 'GroupList', settings: 'Settings', master_key: 'MasterKey', msg_to_load: int = 0, export: bool = False) -> None: """\ Load 'msg_to_load' last messages from log database and display or export them. The default value of zero for `msg_to_load` means all messages for the window will be retrieved from the log database. """ file_name = f'{DIR_USER_DATA}{settings.software_operation}_logs' log_file = get_logfile(file_name) packet_list = PacketList(settings, contact_list) message_log = [] # type: List[MsgTuple] group_msg_id = b'' for ct in iter(lambda: log_file.read(LOG_ENTRY_LENGTH), b''): plaintext = auth_and_decrypt(ct, master_key.master_key, database=file_name) onion_pub_key, timestamp, origin, assembly_packet = separate_headers( plaintext, [ ONION_SERVICE_PUBLIC_KEY_LENGTH, TIMESTAMP_LENGTH, ORIGIN_HEADER_LENGTH ]) if window.type == WIN_TYPE_CONTACT and onion_pub_key != window.uid: continue packet = packet_list.get_packet(onion_pub_key, origin, MESSAGE, log_access=True) try: packet.add_packet(assembly_packet) except FunctionReturn: continue if not packet.is_complete: continue whisper_byte, header, message = separate_headers( packet.assemble_message_packet(), [WHISPER_FIELD_LENGTH, MESSAGE_HEADER_LENGTH]) whisper = bytes_to_bool(whisper_byte) if header == PRIVATE_MESSAGE_HEADER and window.type == WIN_TYPE_CONTACT: message_log.append( (bytes_to_timestamp(timestamp), message.decode(), onion_pub_key, packet.origin, whisper, False)) elif header == GROUP_MESSAGE_HEADER and window.type == WIN_TYPE_GROUP: purp_group_id, message = separate_header(message, GROUP_ID_LENGTH) if window.group is not None and purp_group_id != window.group.group_id: continue purp_msg_id, message = separate_header(message, GROUP_MSG_ID_LENGTH) if packet.origin == ORIGIN_USER_HEADER: if purp_msg_id == group_msg_id: continue group_msg_id = purp_msg_id message_log.append( (bytes_to_timestamp(timestamp), message.decode(), onion_pub_key, packet.origin, whisper, False)) log_file.close() print_logs(message_log[-msg_to_load:], export, msg_to_load, window, contact_list, group_list, settings)