Пример #1
0
def whisper(
    user_input: 'UserInput',
    window: 'TxWindow',
    settings: 'Settings',
    queues: 'QueueDict',
) -> None:
    """\
    Send a message to the contact that overrides their enabled logging
    setting for that message.

    The functionality of this feature is impossible to enforce, but if
    the recipient can be trusted and they do not modify their client,
    this feature can be used to send the message off-the-record.
    """
    try:
        message = user_input.plaintext.strip().split(' ', 1)[1]
    except IndexError:
        raise SoftError("Error: No whisper message specified.",
                        head_clear=True)

    queue_message(user_input=UserInput(message, MESSAGE),
                  window=window,
                  settings=settings,
                  queues=queues,
                  whisper=True,
                  log_as_ph=True)
Пример #2
0
 def queue_delayer():
     """Place packets to queue after delay."""
     time.sleep(0.01)
     queues[WINDOW_SELECT_QUEUE].put(window.window_contacts)
     time.sleep(0.01)
     queue_command(b'test',            settings, queues)                                              # 1
     queue_message(user_input, window, settings, queues)                                              # 2
     queue_message(user_input, window, settings, queues)                                              # 3
     queue_command(b'test',            settings, queues)                                              # 4
     queues[TM_NOISE_COMMAND_QUEUE].put((C_N_HEADER + bytes(PADDING_LENGTH)))                         # 5
     queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_EXIT_COMMAND, queues[RELAY_PACKET_QUEUE])  # 6
     queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_WIPE_COMMAND, queues[RELAY_PACKET_QUEUE])  # 7
     queues[SENDER_MODE_QUEUE].put(settings)
Пример #3
0
def input_loop(queues: Dict[bytes, 'Queue[bytes]'], settings: 'Settings',
               gateway: 'Gateway', contact_list: 'ContactList',
               group_list: 'GroupList', master_key: 'MasterKey',
               onion_service: 'OnionService', stdin_fd: int) -> NoReturn:
    """Get input from user and process it accordingly.

    Running this loop as a process allows handling different functions
    including inputs, key exchanges, file loading and assembly packet
    generation, separate from assembly packet output.
    """
    sys.stdin = os.fdopen(stdin_fd)
    window = TxWindow(contact_list, group_list)

    while True:
        with ignored(EOFError, FunctionReturn, KeyboardInterrupt):
            readline.set_completer(
                get_tab_completer(contact_list, group_list, settings, gateway))
            readline.parse_and_bind('tab: complete')

            window.update_window(group_list)

            while not onion_service.is_delivered:
                export_onion_service_data(contact_list, settings,
                                          onion_service, gateway)

            while not contact_list.has_local_contact():
                new_local_key(contact_list, settings, queues)

            while not contact_list.has_contacts():
                add_new_contact(contact_list, group_list, settings, queues,
                                onion_service)

            while not window.is_selected():
                window.select_tx_window(settings, queues, onion_service,
                                        gateway)

            user_input = get_input(window, settings)

            if user_input.type == MESSAGE:
                queue_message(user_input, window, settings, queues)

            elif user_input.type == FILE:
                queue_file(window, settings, queues)

            elif user_input.type == COMMAND:
                process_command(user_input, window, contact_list, group_list,
                                settings, queues, master_key, onion_service,
                                gateway)
Пример #4
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)
Пример #5
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)
Пример #6
0
    def test_group_message_header(self):
        # Setup
        user_input = UserInput(plaintext='Test message', type=MESSAGE)
        window     = TxWindow(name='test_group',
                              type=WIN_TYPE_GROUP,
                              group=create_group('test_group'),
                              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)
Пример #7
0
        def queue_delayer():
            """Place datagrams into queue after delay."""
            time.sleep(delay)
            queue_command(b'test', settings, queues)

            time.sleep(delay)
            queue_to_nc(
                PUBLIC_KEY_DATAGRAM_HEADER + TFC_PUBLIC_KEY_LENGTH * b'a' +
                nick_to_pub_key('Alice'),  # 1
                queues[RELAY_PACKET_QUEUE])

            time.sleep(delay)
            queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_WIPE_COMMAND,
                        queues[RELAY_PACKET_QUEUE])  # 2

            time.sleep(delay)
            queue_to_nc(UNENCRYPTED_DATAGRAM_HEADER + UNENCRYPTED_EXIT_COMMAND,
                        queues[RELAY_PACKET_QUEUE])  # 3

            time.sleep(delay)
            queues[KEY_MANAGEMENT_QUEUE].put((
                KDB_ADD_ENTRY_HEADER,
                LOCAL_PUBKEY,  # 4
                SYMMETRIC_KEY_LENGTH * b'a',
                SYMMETRIC_KEY_LENGTH * b'a',
                SYMMETRIC_KEY_LENGTH * b'a',
                SYMMETRIC_KEY_LENGTH * b'a'))

            time.sleep(delay)
            queue_message(user_input, window, settings, queues)  # 5

            time.sleep(delay)
            queue_message(user_input, window, settings, queues)  # 6

            time.sleep(delay)
            queues[KEY_MANAGEMENT_QUEUE].put(
                (KDB_ADD_ENTRY_HEADER, nick_to_pub_key('Alice'),
                 SYMMETRIC_KEY_LENGTH * b'a', SYMMETRIC_KEY_LENGTH * b'a',
                 SYMMETRIC_KEY_LENGTH * b'a', SYMMETRIC_KEY_LENGTH * b'a'))

            time.sleep(delay)
            queue_message(user_input, window, settings, queues)  # 7

            time.sleep(delay)
            queue_message(user_input, window, settings, queues)  # 8

            time.sleep(delay)
            queues[SENDER_MODE_QUEUE].put(settings)