示例#1
0
    def test_class(self):
        # Setup
        contact_list           = ContactList(nicks=['Alice', 'Bob', 'local'])
        group_list             = GroupList(groups=['testgroup'])
        packet_list            = PacketList()
        settings               = Settings()
        window_list            = WindowList(contact_list, group_list, packet_list, settings)
        window_list.active_win = window_list.get_window('*****@*****.**')

        # Test
        self.assertEqual(len(window_list), 3)

        for w in window_list:
            self.assertIsInstance(w, Window)

        self.assertIsNone(window_list.select_rx_window('*****@*****.**'))

        self.assertTrue(window_list.active_win.is_active)
        self.assertEqual(window_list.active_win, window_list.get_window('*****@*****.**'))

        self.assertTrue(window_list.has_window('*****@*****.**'))
        self.assertFalse(window_list.has_window('*****@*****.**'))

        local_win = window_list.get_local_window()
        self.assertIsInstance(local_win, Window)
        self.assertEqual(local_win.name, 'system messages')

        file_win = window_list.get_window('file_window')
        self.assertIsInstance(file_win, FileWindow)
示例#2
0
    def setUp(self):
        self.settings = Settings()
        self.contact_list = ContactList(
            nicks=['Alice', 'Bob', 'Charlie', LOCAL_ID])
        self.group_list = GroupList(groups=['test_group', 'test_group2'])
        self.packet_list = PacketList()

        group = self.group_list.get_group('test_group')
        group.members = list(
            map(self.contact_list.get_contact, ['Alice', 'Bob', 'Charlie']))

        self.window_list = WindowList(self.settings, self.contact_list,
                                      self.group_list, self.packet_list)
示例#3
0
    def test_group_msg(self):
        # Setup
        ts = datetime.datetime.now()
        apct_list = self.create_message_apct(ORIGIN_CONTACT_HEADER,
                                             b'testmessage',
                                             group_name=b'testgroup')
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        group = group_list.get_group('testgroup')
        group.log_messages = True
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertIsNone(
                process_message(ts, p, window_list, packet_list, contact_list,
                                key_list, group_list, settings, master_key))

        # Teardown
        cleanup()
示例#4
0
    def test_file(self):
        # Setup
        ts = datetime.datetime.now()
        apct_list = self.create_file_apct()
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertIsNone(
                process_message(ts, p, window_list, packet_list, contact_list,
                                key_list, group_list, settings, master_key))

        # Teardown
        shutil.rmtree('received_files/')
示例#5
0
    def test_invalid_window_raises_fr(self):
        # Setup
        message = b'testgroup'
        ts = datetime.datetime.now()
        timestamp = double_to_bytes(time.time() * 1000)
        header = GROUP_MESSAGE_HEADER + timestamp + b'test_group' + US_BYTE
        apct_list = self.create_message_apct(ORIGIN_CONTACT_HEADER,
                                             message,
                                             header=header)
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertFR("Received message to unknown group.",
                          process_message, ts, p, window_list, packet_list,
                          contact_list, key_list, group_list, settings,
                          master_key)

        # Teardown
        cleanup()
示例#6
0
    def test_invalid_group_message_header(self):
        # Setup
        message = b'testgroup'
        ts = datetime.datetime.now()
        apct_list = self.create_message_apct(ORIGIN_CONTACT_HEADER,
                                             message,
                                             header=GROUP_MESSAGE_HEADER)
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertFR("Received an invalid group message.",
                          process_message, ts, p, window_list, packet_list,
                          contact_list, key_list, group_list, settings,
                          master_key)
示例#7
0
    def test_group_remove_member_msg(self):
        # Setup
        message = b'testgroup' + US_BYTE + b'*****@*****.**' + US_BYTE + b'*****@*****.**'
        ts = datetime.datetime.now()
        apct_list = self.create_message_apct(ORIGIN_CONTACT_HEADER,
                                             message,
                                             header=GROUP_MSG_MEMBER_RM_HEADER)
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertIsNone(
                process_message(ts, p, window_list, packet_list, contact_list,
                                key_list, group_list, settings, master_key))

        # Teardown
        cleanup()
示例#8
0
    def setUp(self):
        self.msg = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean condimentum consectetur purus quis"
                    " dapibus. Fusce venenatis lacus ut rhoncus faucibus. Cras sollicitudin commodo sapien, sed bibendu"
                    "m velit maximus in. Aliquam ac metus risus. Sed cursus ornare luctus. Integer aliquet lectus id ma"
                    "ssa blandit imperdiet. Ut sed massa eget quam facilisis rutrum. Mauris eget luctus nisl. Sed ut el"
                    "it iaculis, faucibus lacus eget, sodales magna. Nunc sed commodo arcu. In hac habitasse platea dic"
                    "tumst. Integer luctus aliquam justo, at vestibulum dolor iaculis ac. Etiam laoreet est eget odio r"
                    "utrum, vel malesuada lorem rhoncus. Cras finibus in neque eu euismod. Nulla facilisi. Nunc nec ali"
                    "quam quam, quis ullamcorper leo. Nunc egestas lectus eget est porttitor, in iaculis felis sceleris"
                    "que. In sem elit, fringilla id viverra commodo, sagittis varius purus. Pellentesque rutrum loborti"
                    "s neque a facilisis. Mauris id tortor placerat, aliquam dolor ac, venenatis arcu.").encode()

        self.ts              = datetime.now()
        self.master_key      = MasterKey()
        self.settings        = Settings(logfile_masking=True)

        self.contact_list    = ContactList(nicks=['Alice', 'Bob', 'Charlie', LOCAL_ID])
        self.key_list        = KeyList(    nicks=['Alice', 'Bob', 'Charlie', LOCAL_ID])
        self.group_list      = GroupList( groups=['testgroup'])
        self.packet_list     = PacketList(contact_list=self.contact_list, settings=self.settings)
        self.window_list     = WindowList(contact_list=self.contact_list, settings=self.settings, group_list=self.group_list, packet_list=self.packet_list)
        self.group_list.get_group('testgroup').log_messages = True
        for account in self.contact_list.get_list_of_accounts():
            keyset          = self.key_list.get_keyset(account)
            keyset.tx_harac = 1
            keyset.rx_harac = 1
            keyset.tx_hek   = KEY_LENGTH * b'\x01'
            keyset.rx_hek   = KEY_LENGTH * b'\x01'
            keyset.tx_key   = KEY_LENGTH * b'\x01'
            keyset.rx_key   = KEY_LENGTH * b'\x01'

        self.message = b'testgroup' + US_BYTE + b'*****@*****.**' + US_BYTE + b'*****@*****.**'
示例#9
0
    def test_active_win_is_none_if_local_key_is_not_present(self):
        # Setup
        self.contact_list.contacts = []

        # Test
        window_list = WindowList(self.settings, self.contact_list,
                                 self.group_list, self.packet_list)
        self.assertEqual(window_list.active_win, None)
示例#10
0
    def test_normal_msg(self):
        # Setup
        message = (
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean condimentum consectetur purus quis"
            " dapibus. Fusce venenatis lacus ut rhoncus faucibus. Cras sollicitudin commodo sapien, sed bibendu"
            "m velit maximus in. Aliquam ac metus risus. Sed cursus ornare luctus. Integer aliquet lectus id ma"
            "ssa blandit imperdiet. Ut sed massa eget quam facilisis rutrum. Mauris eget luctus nisl. Sed ut el"
            "it iaculis, faucibus lacus eget, sodales magna. Nunc sed commodo arcu. In hac habitasse platea dic"
            "tumst. Integer luctus aliquam justo, at vestibulum dolor iaculis ac. Etiam laoreet est eget odio r"
            "utrum, vel malesuada lorem rhoncus. Cras finibus in neque eu euismod. Nulla facilisi. Nunc nec ali"
            "quam quam, quis ullamcorper leo. Nunc egestas lectus eget est porttitor, in iaculis felis sceleris"
            "que. In sem elit, fringilla id viverra commodo, sagittis varius purus. Pellentesque rutrum loborti"
            "s neque a facilisis. Mauris id tortor placerat, aliquam dolor ac, venenatis arcu."
            .encode())
        ts = datetime.datetime.now()
        apct_list = self.create_message_apct(ORIGIN_CONTACT_HEADER, message)
        contact_list = ContactList(nicks=['Alice', 'Bob', 'local'])
        key_list = KeyList(nicks=['Alice', 'Bob', 'local'])
        keyset = key_list.get_keyset('*****@*****.**')
        keyset.rx_harac = 1
        keyset.rx_key = 32 * b'\x01'
        keyset.rx_hek = 32 * b'\x01'
        group_list = GroupList(groups=['testgroup'])
        settings = Settings()
        packet_list = PacketList(contact_list=contact_list, settings=settings)
        window_list = WindowList(contact_list=contact_list,
                                 group_list=group_list,
                                 packet_list=packet_list,
                                 settings=settings)
        master_key = MasterKey()

        # Test
        for p in apct_list:
            self.assertIsNone(
                process_message(ts, p, window_list, packet_list, contact_list,
                                key_list, group_list, settings, master_key))

        # Teardown
        cleanup()
示例#11
0
class TestWindowList(TFCTestCase):
    def setUp(self):
        self.settings = Settings()
        self.contact_list = ContactList(
            nicks=['Alice', 'Bob', 'Charlie', LOCAL_ID])
        self.group_list = GroupList(groups=['test_group', 'test_group2'])
        self.packet_list = PacketList()

        group = self.group_list.get_group('test_group')
        group.members = list(
            map(self.contact_list.get_contact, ['Alice', 'Bob', 'Charlie']))

        self.window_list = WindowList(self.settings, self.contact_list,
                                      self.group_list, self.packet_list)

    def create_window(self, uid):
        return RxWindow(uid, self.contact_list, self.group_list, self.settings,
                        self.packet_list)

    def test_active_win_is_none_if_local_key_is_not_present(self):
        # Setup
        self.contact_list.contacts = []

        # Test
        window_list = WindowList(self.settings, self.contact_list,
                                 self.group_list, self.packet_list)
        self.assertEqual(window_list.active_win, None)

    def test_active_win_is_local_win_if_local_key_is_present(self):
        # Setup
        self.contact_list.contacts = [create_contact(LOCAL_ID)]

        # Test
        self.assertEqual(self.window_list.active_win.uid, LOCAL_ID)

    def test_len_returns_number_of_windows(self):
        self.assertEqual(len(self.window_list), 7)

    def test_window_list_iterates_over_windows(self):
        for w in self.window_list:
            self.assertIsInstance(w, RxWindow)

    def test_group_windows(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g) for g in ['test_group', 'test_group2']
        ]

        # Test
        for g in self.window_list.get_group_windows():
            self.assertEqual(g.type, WIN_TYPE_GROUP)

    def test_has_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g) for g in ['test_group', 'test_group2']
        ]

        # Test
        self.assertTrue(self.window_list.has_window('test_group'))
        self.assertTrue(self.window_list.has_window('test_group2'))
        self.assertFalse(self.window_list.has_window('test_group3'))

    def test_remove_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g) for g in ['test_group', 'test_group2']
        ]

        # Test
        self.assertEqual(len(self.window_list), 2)
        self.assertIsNone(self.window_list.remove_window('test_group3'))
        self.assertEqual(len(self.window_list), 2)
        self.assertIsNone(self.window_list.remove_window('test_group2'))
        self.assertEqual(len(self.window_list), 1)

    def test_select_rx_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g) for g in ['test_group', 'test_group2']
        ]
        tg_win = self.window_list.windows[0]
        tg2_win = self.window_list.windows[1]
        tg_win.is_active = True
        self.window_list.active_win = tg_win

        # Test
        self.assertPrints(
            f"""{CLEAR_ENTIRE_SCREEN}{CURSOR_LEFT_UP_CORNER}
                This window for test_group2 is currently empty.                 

""", self.window_list.select_rx_window, 'test_group2')
        self.assertFalse(tg_win.is_active)
        self.assertTrue(tg2_win.is_active)

    def test_select_rx_file_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g)
            for g in ['test_group', 'test_group2', WIN_TYPE_FILE]
        ]
        tg_win = self.window_list.windows[0]
        tg_win.is_active = True
        self.window_list.active_win = tg_win
        self.packet_list.packets = [
            Packet(type=FILE,
                   name='testfile.txt',
                   assembly_pt_list=5 * [b'a'],
                   packets=10,
                   size="100.0KB",
                   contact=create_contact('Bob'))
        ]

        # Test
        self.assertPrints(
            f"""\

File name        Size        Sender     Complete    
────────────────────────────────────────────────────────────────────────────────
testfile.txt     100.0KB     Bob        50.00%      

{5*(CURSOR_UP_ONE_LINE+CLEAR_ENTIRE_LINE)}""",
            self.window_list.select_rx_window, WIN_TYPE_FILE)

        self.assertFalse(tg_win.is_active)
        self.assertTrue(self.window_list.get_window(WIN_TYPE_FILE).is_active)

    def test_get_local_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g)
            for g in ['test_group', 'test_group2', WIN_TYPE_FILE, LOCAL_ID]
        ]

        # Test
        self.assertEqual(self.window_list.get_local_window().uid, LOCAL_ID)

    def test_get_non_existing_window(self):
        # Setup
        self.window_list.windows = [
            self.create_window(g)
            for g in ['test_group', WIN_TYPE_FILE, LOCAL_ID]
        ]

        # Test existing window
        self.assertTrue(self.window_list.has_window('test_group'))
        window = self.window_list.get_window('test_group')
        self.assertEqual(window.uid, 'test_group')

        # Test non-existing window
        self.assertFalse(self.window_list.has_window('test_group2'))
        window2 = self.window_list.get_window('test_group2')
        self.assertEqual(window2.uid, 'test_group2')
        self.assertTrue(self.window_list.has_window('test_group2'))
示例#12
0
def output_loop(queues:       Dict[bytes, 'Queue'],
                settings:     'Settings',
                contact_list: 'ContactList',
                key_list:     'KeyList',
                group_list:   'GroupList',
                master_key:   'MasterKey',
                stdin_fd:     int,
                unittest:     bool = False) -> None:
    """Process received packets according to their priority."""
    l_queue = queues[LOCAL_KEY_PACKET_HEADER]
    p_queue = queues[PUBLIC_KEY_PACKET_HEADER]
    m_queue = queues[MESSAGE_PACKET_HEADER]
    c_queue = queues[COMMAND_PACKET_HEADER]
    i_queue = queues[IMPORTED_FILE_HEADER]
    e_queue = queues[EXIT_QUEUE]

    sys.stdin   = os.fdopen(stdin_fd)
    packet_buf  = dict()  # type: Dict[str, List[Tuple[datetime, bytes]]]
    pubkey_buf  = dict()  # type: Dict[str, bytes]
    packet_list = PacketList(settings, contact_list)
    window_list = WindowList(settings, contact_list, group_list, packet_list)

    clear_screen()
    while True:
        try:
            if l_queue.qsize() != 0:
                ts, packet = l_queue.get()
                process_local_key(ts, packet, window_list, contact_list, key_list, settings)

            if not contact_list.has_local_contact():
                time.sleep(0.01)
                continue

            if c_queue.qsize() != 0:
                ts, packet = c_queue.get()
                process_command(ts, packet, window_list, packet_list, contact_list, key_list, group_list, settings, master_key, pubkey_buf, e_queue)
                continue

            if p_queue.qsize() != 0:
                ts, packet = p_queue.get()
                process_public_key(ts, packet, window_list, settings, pubkey_buf)
                continue

            if window_list.active_win is not None and window_list.active_win.uid == WIN_TYPE_FILE:
                window_list.active_win.redraw_file_win()

            # Prioritize buffered messages
            for rx_account in packet_buf:
                if contact_list.has_contact(rx_account) and key_list.has_rx_key(rx_account) and packet_buf[rx_account]:
                    ts, packet = packet_buf[rx_account].pop(0)
                    process_message(ts, packet, window_list, packet_list, contact_list, key_list, group_list, settings, master_key)
                    continue

            if m_queue.qsize() != 0:
                ts, packet = m_queue.get()
                rx_account = packet[PACKET_LENGTH:].decode()

                if contact_list.has_contact(rx_account) and key_list.has_rx_key(rx_account):
                    process_message(ts, packet, window_list, packet_list, contact_list, key_list, group_list, settings, master_key)
                else:
                    packet_buf.setdefault(rx_account, []).append((ts, packet))
                continue

            if i_queue.qsize() != 0:
                ts, packet = i_queue.get()
                process_imported_file(ts, packet, window_list, settings)
                continue

            time.sleep(0.01)

            if unittest and queues[UNITTEST_QUEUE].qsize() != 0:
                break

        except (FunctionReturn, KeyboardInterrupt):
            pass