Exemple #1
0
    def test_redraw_file_win(self):
        # Setup
        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')),
            Packet(type=FILE,
                   name='testfile2.txt',
                   assembly_pt_list=7 * [b'a'],
                   packets=100,
                   size="15.0KB",
                   contact=create_contact('Charlie'))
        ]

        # Test
        window = self.create_window(WIN_TYPE_FILE)
        self.assertPrints(
            f"""\

File name         Size        Sender      Complete    
────────────────────────────────────────────────────────────────────────────────
testfile.txt      100.0KB     Bob         50.00%      
testfile2.txt     15.0KB      Charlie     7.00%       

{6*(CURSOR_UP_ONE_LINE+CLEAR_ENTIRE_LINE)}""", window.redraw_file_win)
Exemple #2
0
    def test_class(self):
        # Setup
        settings = Settings()
        members = [create_contact(n) for n in ['Alice', 'Bob', 'Charlie']]
        sg_mock = lambda: None
        group = Group('testgroup', False, False, members, settings, sg_mock)

        # Test
        for c in group:
            self.assertIsInstance(c, Contact)
        self.assertEqual(len(group), 3)

        bytestring = group.dump_g()
        self.assertIsInstance(bytestring, bytes)
        self.assertEqual(len(bytestring), 1024 + 2 + (20 * 1024))

        self.assertEqual(
            group.get_list_of_member_accounts(),
            ['*****@*****.**', '*****@*****.**', '*****@*****.**'])
        self.assertEqual(group.get_list_of_member_nicks(),
                         ['Alice', 'Bob', 'Charlie'])

        self.assertTrue(group.has_members())
        self.assertFalse(group.has_member('*****@*****.**'))

        group.add_members([create_contact(n) for n in ['David']])
        self.assertTrue(group.has_member('*****@*****.**'))

        self.assertFalse(group.remove_members(['*****@*****.**']))
        self.assertTrue(group.remove_members(['*****@*****.**']))
        self.assertFalse(group.has_member('*****@*****.**'))

        # Teardown
        cleanup()
Exemple #3
0
 def setUp(self) -> None:
     """Pre-test actions."""
     self.settings = Settings()
     self.window = TxWindow(name='Alice',
                            type=WIN_TYPE_CONTACT,
                            type_print='contact',
                            window_contacts=[create_contact('Alice')])
Exemple #4
0
    def test_contact_canceled_file(self):
        # Setup
        account    = '*****@*****.**'
        contact    = create_contact('Alice')
        origin     = ORIGIN_CONTACT_HEADER
        type_      = 'file'
        settings   = Settings()
        packet     = Packet(account, contact, origin, type_, settings)
        file_data  = os.urandom(10000)
        compressed = zlib.compress(file_data, level=9)
        file_key   = os.urandom(32)
        encrypted  = encrypt_and_sign(compressed, key=file_key)
        encrypted += file_key
        encoded    = base64.b85encode(encrypted)
        file_data  = US_BYTE.join([b'testfile.txt', b'11.0B', b'00d 00h 00m 00s', encoded])
        packets    = self.mock_file_preprocessor(file_data)
        packets    = packets[:20]
        packets.append(byte_padding(F_C_HEADER))  # Add cancel packet

        # Test
        for p in packets:
            packet.add_packet(p)
        self.assertEqual(len(packet.assembly_pt_list), 0)  # Cancel packet empties packet list
        self.assertFalse(packet.lt_active)
        self.assertFalse(packet.is_complete)
Exemple #5
0
    def test_long_file(self):
        # Setup
        account    = '*****@*****.**'
        contact    = create_contact('Alice')
        origin     = ORIGIN_CONTACT_HEADER
        type_      = 'file'
        settings   = Settings()
        packet     = Packet(account, contact, origin, type_, settings)

        file_data  = os.urandom(10000)
        compressed = zlib.compress(file_data, level=9)
        file_key   = os.urandom(32)
        encrypted  = encrypt_and_sign(compressed, key=file_key)
        encrypted += file_key
        encoded    = base64.b85encode(encrypted)

        file_data  = US_BYTE.join([b'testfile.txt', b'11.0B', b'00d 00h 00m 00s', encoded])
        packets    = self.mock_file_preprocessor(file_data)

        # Test
        for p in packets:
            packet.add_packet(p)
        self.assertIsNone(packet.assemble_and_store_file())

        self.assertTrue(os.path.isfile('received_files/Alice/testfile.txt'))
        self.assertEqual(os.path.getsize('received_files/Alice/testfile.txt'), 10000)

        # Teardown
        shutil.rmtree('received_files/')
Exemple #6
0
    def test_long_message(self):
        # Setup
        account  = '*****@*****.**'
        contact  = create_contact('Alice')
        origin   = ORIGIN_USER_HEADER
        type_    = 'message'
        settings = Settings()
        packet   = Packet(account, contact, origin, type_, settings)

        long_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.")

        packets = self.mock_message_preprocessor(long_msg)

        # Test
        for p in packets:
            packet.add_packet(p)

        message = packet.assemble_message_packet()
        message = message[1:].decode()
        self.assertEqual(message, long_msg)
Exemple #7
0
 def test_fingerprint_print_command(self):
     # Setup
     window = Window(name='Alice',
                     type='contact',
                     contact=create_contact('Alice'))
     # Test
     self.assertIsNone(fingerprints(window))
Exemple #8
0
    def test_print_contacts(self):
        self.contact_list.contacts.append(create_contact(LOCAL_ID))
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Alice')).log_messages = False
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Alice')).kex_status = KEX_STATUS_PENDING
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Bob')).notifications = False
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Charlie')).kex_status = KEX_STATUS_UNVERIFIED
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Bob')).file_reception = False
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('Bob')).kex_status = KEX_STATUS_VERIFIED
        self.contact_list.get_contact_by_pub_key(nick_to_pub_key(
            'David')).rx_fingerprint = bytes(FINGERPRINT_LENGTH)
        self.contact_list.get_contact_by_pub_key(
            nick_to_pub_key('David')).kex_status = bytes(KEX_STATUS_NO_RX_PSK)
        self.assert_prints(
            CLEAR_ENTIRE_SCREEN + CURSOR_LEFT_UP_CORNER + f"""\

Contact    Account    Logging    Notify    Files     Key Ex
────────────────────────────────────────────────────────────────────────────────
Alice      hpcra      No         Yes       Accept    {ECDHE} (Pending)
Bob        zwp3d      Yes        No        Reject    {ECDHE} (Verified)
Charlie    n2a3c      Yes        Yes       Accept    {ECDHE} (Unverified)
David      u22uy      Yes        Yes       Accept    {PSK}  (No contact key)
Eric       jszzy      Yes        Yes       Accept    {ECDHE} (Verified)


""", self.contact_list.print_contacts)
Exemple #9
0
    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)
Exemple #10
0
    def test_invalid_nick_raises_se(self) -> None:
        # Setup
        window = TxWindow(type=WIN_TYPE_CONTACT, contact=create_contact('Bob'))

        # Test
        self.assert_se("Error: Nick must be printable.", change_nick,
                       UserInput("nick Alice\x01"), window, *self.args)
Exemple #11
0
    def setUp(self):
        self.short_msg = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
        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.")

        self.unittest_dir  = cd_unittest()
        self.ts            = datetime.now()
        self.contact       = create_contact('Alice')
        self.settings      = Settings(log_file_masking=True)
        self.onion_pub_key = nick_to_pub_key('Alice')
        self.window_list   = WindowList()
        self.whisper_header = b'\x00'

        compressed        = zlib.compress(b'file_data', level=COMPRESSION_LEVEL)
        file_key          = os.urandom(SYMMETRIC_KEY_LENGTH)
        encrypted         = encrypt_and_sign(compressed, key=file_key)
        encrypted        += file_key
        self.short_f_data = (int_to_bytes(1) + int_to_bytes(2) + b'testfile.txt' + US_BYTE + encrypted)
Exemple #12
0
 def test_get_group_by_id(self):
     members = [create_contact('Laura')]
     group_id = os.urandom(GROUP_ID_LENGTH)
     self.group_list.add_group('test_group_12', group_id, False, False,
                               members)
     self.assertEqual(
         self.group_list.get_group_by_id(group_id).name, 'test_group_12')
Exemple #13
0
 def setUp(self):
     self.settings = Settings()
     self.queues   = gen_queue_dict()
     self.window   = TxWindow(uid=nick_to_pub_key("Alice"),
                              log_messages=True)
     self.window.window_contacts = [create_contact('Alice')]
     self.args     = self.settings, self.queues, self.window
Exemple #14
0
    def test_cancel_message_during_normal(self):
        # Setup
        user_input = UserInput('cm')
        settings = Settings()
        window = TxWindow(name='Alice',
                          type=WIN_TYPE_CONTACT,
                          type_print='contact',
                          uid='*****@*****.**')
        window.window_contacts = [create_contact()]

        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('testmessage1', settings, '*****@*****.**', '*****@*****.**',
             False, False, '*****@*****.**'))
        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('testmessage2', settings, '*****@*****.**', '*****@*****.**',
             False, False, '*****@*****.**'))
        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('testmessage3', settings, '*****@*****.**', '*****@*****.**',
             False, False, '*****@*****.**'))
        time.sleep(0.1)

        # Test
        self.assertIsNone(
            cancel_packet(user_input, window, settings, self.queues))
        time.sleep(0.1)

        self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 2)
Exemple #15
0
 def setUp(self):
     self.settings = Settings()
     self.window = TxWindow(name='Alice',
                            type=WIN_TYPE_CONTACT,
                            type_print='contact',
                            window_contacts=[create_contact('Alice')])
     self.window.group = create_group('test_group')
Exemple #16
0
 def test_has_group_id(self):
     members = [create_contact('Laura')]
     group_id = os.urandom(GROUP_ID_LENGTH)
     self.assertFalse(self.group_list.has_group_id(group_id))
     self.group_list.add_group('test_group_12', group_id, False, False,
                               members)
     self.assertTrue(self.group_list.has_group_id(group_id))
Exemple #17
0
    def test_cancel_message_during_normal(self) -> None:
        # Setup
        user_input = UserInput('cm')
        settings = Settings()
        window = TxWindow(name='Alice',
                          type=WIN_TYPE_CONTACT,
                          type_print='contact',
                          uid=nick_to_pub_key("Alice"))
        window.window_contacts = [create_contact('Alice')]

        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('test_message1', nick_to_pub_key("Alice"), False, False,
             nick_to_pub_key("Alice")))
        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('test_message2', nick_to_pub_key("Charlie"), False, False,
             nick_to_pub_key("Charlie")))
        self.queues[MESSAGE_PACKET_QUEUE].put(
            ('test_message3', nick_to_pub_key("Alice"), False, False,
             nick_to_pub_key("Alice")))

        # Test
        self.assert_se("Cancelled queued messages to contact Alice.",
                       cancel_packet, user_input, window, settings,
                       self.queues)
        self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 2)
Exemple #18
0
 def test_fingerprint_print_command(self):
     # Setup
     window = TxWindow(name='Alice',
                       type=WIN_TYPE_CONTACT,
                       contact=create_contact())
     # Test
     self.assertIsNone(show_fingerprints(window))
Exemple #19
0
    def test_removal_of_contact_logs(self) -> None:
        # Setup
        short_msg = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."

        # Create temp file that must be removed.
        with open(self.tmp_file_name, 'wb+') as f:
            f.write(os.urandom(LOG_ENTRY_LENGTH))

        # Add a long message sent to both Alice and Bob.
        for p in assembly_packet_creator(MESSAGE, self.msg):
            write_log_entry(p, nick_to_pub_key('Alice'),   self.tfc_log_database)
            write_log_entry(p, nick_to_pub_key('Charlie'), self.tfc_log_database)

        # Add a short message sent to both Alice and Bob.
        for p in assembly_packet_creator(MESSAGE, short_msg):
            write_log_entry(p, nick_to_pub_key('Alice'),   self.tfc_log_database)
            write_log_entry(p, nick_to_pub_key('Charlie'), self.tfc_log_database)

        # Test
        self.assert_se(f"Removed log entries for contact '{nick_to_short_address('Alice')}'.",
                       remove_logs, *self.args, selector=nick_to_pub_key('Alice'))

        self.assert_se(f"Removed log entries for contact '{nick_to_short_address('Charlie')}'.",
                       remove_logs, *self.args, selector=nick_to_pub_key('Charlie'))

        self.assert_se(f"Found no log entries for contact '{nick_to_short_address('Alice')}'.",
                       remove_logs, *self.args, selector=nick_to_pub_key('Alice'))

        self.contact_list.contacts = [create_contact('Alice')]

        self.assert_se(f"Found no log entries for contact 'Alice'.",
                       remove_logs, *self.args, selector=nick_to_pub_key('Alice'))

        self.assert_se(f"Found no log entries for group '2e8b2Wns7dWjB'.",
                       remove_logs, *self.args, selector=group_name_to_group_id('searched_group'))
Exemple #20
0
 def test_psk_raises_fr(self):
     # Setup
     contact = create_contact()
     contact.tx_fingerprint = bytes(FINGERPRINT_LEN)
     window = TxWindow(name='Alice', type=WIN_TYPE_CONTACT, contact=contact)
     # Test
     self.assertFR("Pre-shared keys have no fingerprints.",
                   show_fingerprints, window)
Exemple #21
0
 def test_contact_printing(self):
     # Setup
     contact_list = ContactList(MasterKey(), Settings())
     contact_list.contacts = [
         create_contact(n) for n in ['Alice', 'Bob', 'Charlie', 'David']
     ]
     # Teardown
     self.assertIsNone(contact_list.print_contacts())
Exemple #22
0
    def test_add_members(self):
        self.group.members = []
        self.assertFalse(self.group.has_member('*****@*****.**'))
        self.assertFalse(self.group.has_member('*****@*****.**'))

        self.group.add_members([create_contact(n) for n in ['David', 'Eric']])
        self.assertTrue(self.group.has_member('*****@*****.**'))
        self.assertTrue(self.group.has_member('*****@*****.**'))
Exemple #23
0
    def test_no_contact_raises_se(self) -> None:
        # Setup
        window = TxWindow(type=WIN_TYPE_CONTACT, contact=create_contact('Bob'))
        window.contact = None

        # Test
        self.assert_se("Error: Window does not have contact.", change_nick,
                       UserInput("nick Alice\x01"), window, *self.args)
Exemple #24
0
    def test_invalid_nick_raises_fr(self):
        # Setup
        user_input = UserInput("nick Alice\x01")
        window = TxWindow(type=WIN_TYPE_CONTACT, contact=create_contact('Bob'))

        # Test
        self.assertFR("Nick must be printable.", change_nick, user_input,
                      window, self.contact_list, self.group_list, None, None)
Exemple #25
0
    def test_group_management_message_header(self):
        # Setup
        user_input = UserInput(plaintext='Test message', type=MESSAGE)
        window     = TxWindow(log_messages=True)
        window.window_contacts = [create_contact('Alice')]

        # Test
        self.assertIsNone(queue_message(user_input, window, *self.args, header=GROUP_MSG_INVITE_HEADER))
        self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 1)
Exemple #26
0
    def test_private_message_header(self) -> None:
        # Setup
        user_input = UserInput(plaintext='Test message', type=MESSAGE)
        window     = TxWindow(log_messages=True)
        window.window_contacts = [create_contact('Alice')]

        # Test
        self.assertIsNone(queue_message(user_input, window, *self.args))
        self.assertEqual(self.queues[MESSAGE_PACKET_QUEUE].qsize(), 1)
Exemple #27
0
 def test_psk_raises_fr(self):
     # Setup
     contact = create_contact('Alice')
     contact.tx_fingerprint = bytes(32)
     window = Window(name='Alice', type='contact', contact=contact)
     # Test
     self.assertFR(
         "Key have been pre-shared with Alice and thus have no fingerprints.",
         fingerprints, window)
Exemple #28
0
 def setUp(self):
     """Pre-test actions."""
     self.window = TxWindow(uid=nick_to_pub_key("Alice"),
                            name='Alice',
                            window_contacts=[create_contact('Alice')],
                            log_messages=True)
     self.settings = Settings()
     self.queues = gen_queue_dict()
     self.args = self.window, self.settings, self.queues
Exemple #29
0
 def test_add_group(self):
     members = [create_contact('Laura')]
     self.group_list.add_group('test_group_12', bytes(GROUP_ID_LENGTH),
                               False, False, members)
     self.group_list.add_group('test_group_12', bytes(GROUP_ID_LENGTH),
                               False, True, members)
     self.assertTrue(
         self.group_list.get_group('test_group_12').notifications)
     self.assertEqual(len(self.group_list), len(self.group_names) + 1)
Exemple #30
0
    def test_keyboard_interrupt_raises_se(self, *_: Any) -> None:
        # Setup
        contact      = create_contact('Alice', kex_status=KEX_STATUS_NO_RX_PSK)
        contact_list = ContactList(contacts=[contact])
        window       = TxWindow(type=WIN_TYPE_CONTACT,
                                uid=nick_to_pub_key("Alice"),
                                contact=contact)

        # Test
        self.assert_se("PSK verification aborted.", rxp_load_psk, window, contact_list, *self.args)