Пример #1
0
  def test_get_streams(self):
    """
    Exercises the get_streams() method.
    """

    # get a list of fake, but good looking, streams
    valid_streams = (
      ("1", "NEW", "4", "10.10.10.1:80"),
      ("2", "SUCCEEDED", "4", "10.10.10.1:80"),
      ("3", "SUCCEEDED", "4", "10.10.10.1:80")
    )

    responses = ["%s\r\n" % " ".join(entry) for entry in valid_streams]

    mocking.mock_method(Controller, "get_info", mocking.return_value(
      "".join(responses)
    ))

    streams = self.controller.get_streams()
    self.assertEqual(len(valid_streams), len(streams))

    for index, stream in enumerate(streams):
      self.assertEqual(valid_streams[index][0], stream.id)
      self.assertEqual(valid_streams[index][1], stream.status)
      self.assertEqual(valid_streams[index][2], stream.circ_id)
      self.assertEqual(valid_streams[index][3], stream.target)
Пример #2
0
  def test_get_streams(self):
    """
    Exercises the get_streams() method.
    """

    # get a list of fake, but good looking, streams
    valid_streams = (
      ("1", "NEW", "4", "10.10.10.1:80"),
      ("2", "SUCCEEDED", "4", "10.10.10.1:80"),
      ("3", "SUCCEEDED", "4", "10.10.10.1:80")
    )

    responses = ["%s\r\n" % " ".join(entry) for entry in valid_streams]

    mocking.mock_method(Controller, "get_info", mocking.return_value(
      "".join(responses)
    ))

    streams = self.controller.get_streams()
    self.assertEqual(len(valid_streams), len(streams))

    for index, stream in enumerate(streams):
      self.assertEqual(valid_streams[index][0], stream.id)
      self.assertEqual(valid_streams[index][1], stream.status)
      self.assertEqual(valid_streams[index][2], stream.circ_id)
      self.assertEqual(valid_streams[index][3], stream.target)
Пример #3
0
    def test_get_exit_policy(self):
        """
    Exercises the get_exit_policy() method.
    """

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("ExitPolicyRejectPrivate", ):
                    "1",
                    ("ExitPolicy", "multiple=True"): [
                        "accept *:80,   accept *:443",
                        "accept 43.5.5.5,reject *:22"
                    ]
                },
                is_method=True))

        mocking.mock_method(
            Controller, "get_info",
            mocking.return_for_args(
                {
                    ("address", None):
                    "123.45.67.89",
                    ("exit-policy/default", ):
                    "reject *:25,reject *:119,reject *:135-139,reject *:445,reject *:563,reject *:1214,reject *:4661-4666,reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*"
                },
                is_method=True))

        expected = ExitPolicy(
            'reject 0.0.0.0/8:*',  # private entries
            'reject 169.254.0.0/16:*',
            'reject 127.0.0.0/8:*',
            'reject 192.168.0.0/16:*',
            'reject 10.0.0.0/8:*',
            'reject 172.16.0.0/12:*',
            'reject 123.45.67.89:*',  # relay's public address
            'accept *:80',  # finally we get to our ExitPolicy
            'accept *:443',
            'accept 43.5.5.5:*',
            'reject *:22',
            'reject *:25',  # default policy
            'reject *:119',
            'reject *:135-139',
            'reject *:445',
            'reject *:563',
            'reject *:1214',
            'reject *:4661-4666',
            'reject *:6346-6429',
            'reject *:6699',
            'reject *:6881-6999',
            'accept *:*',
        )

        self.assertEqual(expected, self.controller.get_exit_policy())
Пример #4
0
  def test_attach_stream(self):
    """
    Exercises the attach_stream() method.
    """

    # Response when the stream is in a state where it can't be attached (for
    # instance, it's already open).

    response = stem.response.ControlMessage.from_str("555 Connection is not managed by controller.\r\n")
    mocking.mock_method(Controller, "msg", mocking.return_value(response))

    self.assertRaises(UnsatisfiableRequest, self.controller.attach_stream, 'stream_id', 'circ_id')
Пример #5
0
    def test_event_listening(self):
        """
    Exercises the add_event_listener and remove_event_listener methods.
    """

        # set up for failure to create any events
        mocking.mock_method(Controller, "is_authenticated",
                            mocking.return_true())
        mocking.mock_method(Controller, "_attach_listeners",
                            mocking.return_value(([], [])))
        mocking.mock_method(
            Controller, "get_version",
            mocking.return_value(stem.version.Version('0.1.0.14')))
        self.assertRaises(InvalidRequest, self.controller.add_event_listener,
                          mocking.no_op(), EventType.BW)

        # set up to only fail newer events
        mocking.mock_method(
            Controller, "get_version",
            mocking.return_value(stem.version.Version('0.2.0.35')))

        # EventType.BW is one of the earliest events
        self.controller.add_event_listener(mocking.no_op(), EventType.BW)

        # EventType.SIGNAL was added in tor version 0.2.3.1-alpha
        self.assertRaises(InvalidRequest, self.controller.add_event_listener,
                          mocking.no_op(), EventType.SIGNAL)
Пример #6
0
 def test_event_listening(self):
   """
   Exercises the add_event_listener and remove_event_listener methods.
   """
   
   # set up for failure to create any events
   mocking.mock_method(Controller, "get_version", mocking.return_value(stem.version.Version('0.1.0.14')))
   self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.BW)
   
   # set up to only fail newer events
   mocking.mock_method(Controller, "get_version", mocking.return_value(stem.version.Version('0.2.0.35')))
   
   # EventType.BW is one of the earliest events
   self.controller.add_event_listener(mocking.no_op(), EventType.BW)
   
   # EventType.SIGNAL was added in tor version 0.2.3.1-alpha
   self.assertRaises(InvalidRequest, self.controller.add_event_listener, mocking.no_op(), EventType.SIGNAL)
Пример #7
0
    def test_get_network_status(self):
        """
    Exercises the get_network_status() method.
    """

        # Build a single router status entry.
        nickname = "Beaver"
        fingerprint = "/96bKo4soysolMgKn5Hex2nyFSY"
        desc = "r %s %s u5lTXJKGsLKufRLnSyVqT7TdGYw 2012-12-30 22:02:49 77.223.43.54 9001 0\ns Fast Named Running Stable Valid\nw Bandwidth=75" % (
            nickname, fingerprint)
        router = stem.descriptor.router_status_entry.RouterStatusEntryV2(desc)

        # Always return the same router status entry.
        mocking.mock_method(Controller, "get_info", mocking.return_value(desc))

        # Pretend to get the router status entry with its name.
        self.assertEqual(router, self.controller.get_network_status(nickname))

        # Pretend to get the router status entry with its fingerprint.
        hex_fingerprint = stem.descriptor.router_status_entry._base64_to_hex(
            fingerprint, False)
        self.assertEqual(router,
                         self.controller.get_network_status(hex_fingerprint))

        # Mangle hex fingerprint and try again.
        hex_fingerprint = hex_fingerprint[2:]
        self.assertRaises(ValueError, self.controller.get_network_status,
                          hex_fingerprint)

        # Raise an exception in the get_info() call.
        mocking.mock_method(Controller, "get_info",
                            mocking.raise_exception(InvalidArguments))

        # Get a default value when the call fails.

        self.assertEqual(
            "default returned",
            self.controller.get_network_status(nickname,
                                               default="default returned"))

        # No default value, accept the error.
        self.assertRaises(InvalidArguments, self.controller.get_network_status,
                          nickname)
Пример #8
0
  def test_get_exit_policy(self):
    """
    Exercises the get_exit_policy() method.
    """

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("ExitPolicyRejectPrivate",): "1",
      ("ExitPolicy", "multiple=True"): ["accept *:80,   accept *:443", "accept 43.5.5.5,reject *:22"]
    }, is_method = True))

    mocking.mock_method(Controller, "get_info", mocking.return_for_args({
      ("address", None): "123.45.67.89",
      ("exit-policy/default",): "reject *:25,reject *:119,reject *:135-139,reject *:445,reject *:563,reject *:1214,reject *:4661-4666,reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*"
    }, is_method = True))

    expected = ExitPolicy(
      'reject 0.0.0.0/8:*',  # private entries
      'reject 169.254.0.0/16:*',
      'reject 127.0.0.0/8:*',
      'reject 192.168.0.0/16:*',
      'reject 10.0.0.0/8:*',
      'reject 172.16.0.0/12:*',
      'reject 123.45.67.89:*',  # relay's public address
      'accept *:80',  # finally we get to our ExitPolicy
      'accept *:443',
      'accept 43.5.5.5:*',
      'reject *:22',
      'reject *:25',  # default policy
      'reject *:119',
      'reject *:135-139',
      'reject *:445',
      'reject *:563',
      'reject *:1214',
      'reject *:4661-4666',
      'reject *:6346-6429',
      'reject *:6699',
      'reject *:6881-6999',
      'accept *:*',
    )

    self.assertEqual(expected, self.controller.get_exit_policy())
Пример #9
0
    def test_get_socks_listeners_new(self):
        """
    Exercises the get_socks_listeners() method as if talking to a newer tor
    instance.
    """

        # multiple SOCKS listeners
        mocking.mock_method(
            Controller, "get_info",
            mocking.return_value('"127.0.0.1:1112" "127.0.0.1:1114"'))

        self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)],
                         self.controller.get_socks_listeners())

        # no SOCKS listeners
        mocking.mock_method(Controller, "get_info", mocking.return_value(""))
        self.assertEqual([], self.controller.get_socks_listeners())

        # check where GETINFO provides malformed content

        invalid_responses = (
            '"127.0.0.1"',  # address only
            '"1112"',  # port only
            '"5127.0.0.1:1112"',  # invlaid address
            '"127.0.0.1:991112"',  # invalid port
        )

        for response in invalid_responses:
            mocking.mock_method(Controller, "get_info",
                                mocking.return_value(response))
            self.assertRaises(stem.ProtocolError,
                              self.controller.get_socks_listeners)
Пример #10
0
  def test_get_socks_listeners_new(self):
    """
    Exercises the get_socks_listeners() method as if talking to a newer tor
    instance.
    """

    # multiple SOCKS listeners
    mocking.mock_method(Controller, "get_info", mocking.return_value(
      '"127.0.0.1:1112" "127.0.0.1:1114"'
    ))

    self.assertEqual(
      [('127.0.0.1', 1112), ('127.0.0.1', 1114)],
      self.controller.get_socks_listeners()
    )

    # no SOCKS listeners
    mocking.mock_method(Controller, "get_info", mocking.return_value(""))
    self.assertEqual([], self.controller.get_socks_listeners())

    # check where GETINFO provides malformed content

    invalid_responses = (
      '"127.0.0.1"',         # address only
      '"1112"',              # port only
      '"5127.0.0.1:1112"',   # invlaid address
      '"127.0.0.1:991112"',  # invalid port
    )

    for response in invalid_responses:
      mocking.mock_method(Controller, "get_info", mocking.return_value(response))
      self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
Пример #11
0
    def test_get_version(self):
        """
    Exercises the get_version() method.
    """

        try:
            # Use one version for first check.
            version_2_1 = "0.2.1.32"
            version_2_1_object = stem.version.Version(version_2_1)
            mocking.mock_method(Controller, "get_info",
                                mocking.return_value(version_2_1))

            # Return a version with a cold cache.
            self.assertEqual(version_2_1_object, self.controller.get_version())

            # Use a different version for second check.
            version_2_2 = "0.2.2.39"
            version_2_2_object = stem.version.Version(version_2_2)
            mocking.mock_method(Controller, "get_info",
                                mocking.return_value(version_2_2))

            # Return a version with a hot cache, so it will be the old version.
            self.assertEqual(version_2_1_object, self.controller.get_version())

            # Turn off caching.
            self.controller._is_caching_enabled = False
            # Return a version without caching, so it will be the new version.
            self.assertEqual(version_2_2_object, self.controller.get_version())

            # Raise an exception in the get_info() call.
            mocking.mock_method(Controller, "get_info",
                                mocking.raise_exception(InvalidArguments))

            # Get a default value when the call fails.
            self.assertEqual(
                "default returned",
                self.controller.get_version(default="default returned"))

            # No default value, accept the error.
            self.assertRaises(InvalidArguments, self.controller.get_version)

            # Give a bad version.  The stem.version.Version ValueError should bubble up.
            version_A_42 = "0.A.42.spam"
            mocking.mock_method(Controller, "get_info",
                                mocking.return_value(version_A_42))
            self.assertRaises(ValueError, self.controller.get_version)
        finally:
            # Turn caching back on before we leave.
            self.controller._is_caching_enabled = True
Пример #12
0
  def test_get_network_status(self):
    """
    Exercises the get_network_status() method.
    """

    # Build a single router status entry.
    nickname = "Beaver"
    fingerprint = "/96bKo4soysolMgKn5Hex2nyFSY"
    desc = "r %s %s u5lTXJKGsLKufRLnSyVqT7TdGYw 2012-12-30 22:02:49 77.223.43.54 9001 0\ns Fast Named Running Stable Valid\nw Bandwidth=75" % (nickname, fingerprint)
    router = stem.descriptor.router_status_entry.RouterStatusEntryV2(desc)

    # Always return the same router status entry.
    mocking.mock_method(Controller, "get_info", mocking.return_value(desc))

    # Pretend to get the router status entry with its name.
    self.assertEqual(router, self.controller.get_network_status(nickname))

    # Pretend to get the router status entry with its fingerprint.
    hex_fingerprint = stem.descriptor.router_status_entry._decode_fingerprint(fingerprint, False)
    self.assertEqual(router, self.controller.get_network_status(hex_fingerprint))

    # Mangle hex fingerprint and try again.
    hex_fingerprint = hex_fingerprint[2:]
    self.assertRaises(ValueError, self.controller.get_network_status, hex_fingerprint)

    # Raise an exception in the get_info() call.
    mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments))

    # Get a default value when the call fails.

    self.assertEqual(
      "default returned",
      self.controller.get_network_status(nickname, default = "default returned")
    )

    # No default value, accept the error.
    self.assertRaises(InvalidArguments, self.controller.get_network_status, nickname)
Пример #13
0
  def test_get_version(self):
    """
    Exercises the get_version() method.
    """

    try:
      # Use one version for first check.
      version_2_1 = "0.2.1.32"
      version_2_1_object = stem.version.Version(version_2_1)
      mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_1))

      # Return a version with a cold cache.
      self.assertEqual(version_2_1_object, self.controller.get_version())

      # Use a different version for second check.
      version_2_2 = "0.2.2.39"
      version_2_2_object = stem.version.Version(version_2_2)
      mocking.mock_method(Controller, "get_info", mocking.return_value(version_2_2))

      # Return a version with a hot cache, so it will be the old version.
      self.assertEqual(version_2_1_object, self.controller.get_version())

      # Turn off caching.
      self.controller._is_caching_enabled = False
      # Return a version without caching, so it will be the new version.
      self.assertEqual(version_2_2_object, self.controller.get_version())

      # Raise an exception in the get_info() call.
      mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments))

      # Get a default value when the call fails.
      self.assertEqual(
        "default returned",
        self.controller.get_version(default = "default returned")
      )

      # No default value, accept the error.
      self.assertRaises(InvalidArguments, self.controller.get_version)

      # Give a bad version.  The stem.version.Version ValueError should bubble up.
      version_A_42 = "0.A.42.spam"
      mocking.mock_method(Controller, "get_info", mocking.return_value(version_A_42))
      self.assertRaises(ValueError, self.controller.get_version)
    finally:
      # Turn caching back on before we leave.
      self.controller._is_caching_enabled = True
Пример #14
0
 def setUp(self):
     mock_method(RelayDescriptor, '_verify_digest', no_op())
Пример #15
0
 def setUp(self):
   mock_method(RelayDescriptor, '_verify_digest', no_op())
Пример #16
0
  def test_get_socks_listeners_old(self):
    """
    Exercises the get_socks_listeners() method as though talking to an old tor
    instance.
    """

    # An old tor raises stem.InvalidArguments for get_info about socks, but
    # get_socks_listeners should work anyway.

    mocking.mock_method(Controller, "get_info", mocking.raise_exception(InvalidArguments))

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "9050",
      ("SocksListenAddress", "multiple=True"): ["127.0.0.1"]
    }, is_method = True))
    self.assertEqual([('127.0.0.1', 9050)], self.controller.get_socks_listeners())

    # Again, an old tor, but SocksListenAddress overrides the port number.

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "9050",
      ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112"]
    }, is_method = True))
    self.assertEqual([('127.0.0.1', 1112)], self.controller.get_socks_listeners())

    # Again, an old tor, but multiple listeners

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "9050",
      ("SocksListenAddress", "multiple=True"): ["127.0.0.1:1112", "127.0.0.1:1114"]
    }, is_method = True))
    self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners())

    # Again, an old tor, but no SOCKS listeners

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "0",
      ("SocksListenAddress", "multiple=True"): []
    }, is_method = True))
    self.assertEqual([], self.controller.get_socks_listeners())

    # Where tor provides invalid ports or addresses

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "blarg",
      ("SocksListenAddress", "multiple=True"): ["127.0.0.1"]
    }, is_method = True))
    self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "0",
      ("SocksListenAddress", "multiple=True"): ["127.0.0.1:abc"]
    }, is_method = True))
    self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)

    mocking.mock_method(Controller, "get_conf", mocking.return_for_args({
      ("SocksPort",): "40",
      ("SocksListenAddress", "multiple=True"): ["500.0.0.1"]
    }, is_method = True))
    self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners)
Пример #17
0
    def setUp(self):
        socket = stem.socket.ControlSocket()

        mocking.mock_method(Controller, "add_event_listener", mocking.no_op())
        self.controller = Controller(socket)
        mocking.revert_mocking()
Пример #18
0
    def test_get_socks_listeners_old(self):
        """
    Exercises the get_socks_listeners() method as though talking to an old tor
    instance.
    """

        # An old tor raises stem.InvalidArguments for get_info about socks, but
        # get_socks_listeners should work anyway.

        mocking.mock_method(Controller, "get_info",
                            mocking.raise_exception(InvalidArguments))

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "9050",
                    ("SocksListenAddress", "multiple=True"): ["127.0.0.1"]
                },
                is_method=True))
        self.assertEqual([('127.0.0.1', 9050)],
                         self.controller.get_socks_listeners())

        # Again, an old tor, but SocksListenAddress overrides the port number.

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "9050",
                    ("SocksListenAddress", "multiple=True"):
                    ["127.0.0.1:1112"]
                },
                is_method=True))
        self.assertEqual([('127.0.0.1', 1112)],
                         self.controller.get_socks_listeners())

        # Again, an old tor, but multiple listeners

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ):
                    "9050",
                    ("SocksListenAddress", "multiple=True"):
                    ["127.0.0.1:1112", "127.0.0.1:1114"]
                },
                is_method=True))
        self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)],
                         self.controller.get_socks_listeners())

        # Again, an old tor, but no SOCKS listeners

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "0",
                    ("SocksListenAddress", "multiple=True"): []
                },
                is_method=True))
        self.assertEqual([], self.controller.get_socks_listeners())

        # Where tor provides invalid ports or addresses

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "blarg",
                    ("SocksListenAddress", "multiple=True"): ["127.0.0.1"]
                },
                is_method=True))
        self.assertRaises(stem.ProtocolError,
                          self.controller.get_socks_listeners)

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "0",
                    ("SocksListenAddress", "multiple=True"): ["127.0.0.1:abc"]
                },
                is_method=True))
        self.assertRaises(stem.ProtocolError,
                          self.controller.get_socks_listeners)

        mocking.mock_method(
            Controller, "get_conf",
            mocking.return_for_args(
                {
                    ("SocksPort", ): "40",
                    ("SocksListenAddress", "multiple=True"): ["500.0.0.1"]
                },
                is_method=True))
        self.assertRaises(stem.ProtocolError,
                          self.controller.get_socks_listeners)
Пример #19
0
  def setUp(self):
    self.stdout, self.stdout_real = StringIO.StringIO(), sys.stdout
    sys.stdout = self.stdout

    mocking.mock_method(RelayDescriptor, '_verify_digest', mocking.no_op())
Пример #20
0
    def setUp(self):
        self.stdout, self.stdout_real = StringIO.StringIO(), sys.stdout
        sys.stdout = self.stdout

        mocking.mock_method(RelayDescriptor, '_verify_digest', mocking.no_op())
Пример #21
0
  def setUp(self):
    socket = stem.socket.ControlSocket()

    mocking.mock_method(Controller, "add_event_listener", mocking.no_op())
    self.controller = Controller(socket, enable_caching = True)
    mocking.revert_mocking()