Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 def test_bytes_to_timestamp(self):
     encoded = bytes.fromhex('00000000')
     self.assertIsInstance(bytes_to_timestamp(encoded), datetime)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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)