aboutsummaryrefslogtreecommitdiff
path: root/networks/hs-intro-fail-2
diff options
context:
space:
mode:
Diffstat (limited to 'networks/hs-intro-fail-2')
-rw-r--r--networks/hs-intro-fail-2189
1 files changed, 189 insertions, 0 deletions
diff --git a/networks/hs-intro-fail-2 b/networks/hs-intro-fail-2
new file mode 100644
index 0000000..23d4c6e
--- /dev/null
+++ b/networks/hs-intro-fail-2
@@ -0,0 +1,189 @@
+from chutney.Testing import *
+
+authority_nodes = Node.create(3, {
+ "tag": "a",
+ "authority": 1,
+ "relay": 1,
+ "torrc": "authority.tmpl"
+})
+
+# hidden service (hs) nodes
+hs_nodes = []
+
+hs_servers = []
+
+from twisted.web import server, resource
+from twisted.internet import reactor
+
+# Use twisted to create web servers in this script
+class Site(resource.Resource):
+ isLeaf = True
+ numberRequests = 0
+
+ def __init__(self, siteNum):
+ self.siteNum = siteNum
+
+ def render_GET(self, request):
+ self.numberRequests += 1
+ request.setHeader("content-type", "text/plain")
+ return str(self.siteNum)
+
+base_port = 10080
+for i in range(2):
+
+ port = base_port + i
+
+ node = Node(
+ tag="h",
+ hiddenservice=1,
+ torrc="hidden-service.tmpl",
+ hiddenservicetarget="127.0.0.1:%i" % port
+ )
+ hs_nodes.append(node)
+
+ site = server.Site(Site(i))
+
+ s = reactor.listenTCP(port, site)
+ hs_servers.append(s)
+
+ port += 1
+
+client_nodes = Node.create(12, {
+ "tag": "c",
+ "torrc": "client.tmpl"
+})
+
+relay_nodes = Node.create(10, {
+ "tag": "r",
+ "relay": 1,
+ "torrc": "intro.tmpl"
+})
+
+thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0})
+
+initial_nodes = authority_nodes + relay_nodes + client_nodes + hs_nodes[:1]
+
+def start():
+ if not all([ n.getController().start() for n in initial_nodes ]):
+ return False
+
+ logging.info("All initial nodes running")
+
+ nodes_by_fingerprint = get_node_fingerprints(authority_nodes + relay_nodes)
+
+ track_introduction_points(hs_nodes[0])
+
+ node_0_published_descriptor = threading.Event()
+
+ def hs_node_0_listener(logevent):
+ if "Successfully uploaded v2 rend descriptors" in logevent.message:
+ node_0_published_descriptor.set()
+
+
+ hs_nodes[0].getStemController().add_event_listener(hs_node_0_listener, EventType.INFO)
+
+ node_0_published_descriptor.wait()
+
+ hs_nodes[0].getStemController().remove_event_listener(hs_node_0_listener)
+
+ # list to cope with scope problems
+ node_counter = [len(hs_nodes) - 1]
+ node_counter_lock = threading.RLock()
+
+ nodes_published_descriptors = threading.Event()
+
+ def hs_node_listener(logevent):
+ if "Successfully uploaded v2 rend descriptors" in logevent.message:
+ with node_counter_lock:
+ node_counter[0] -= 1
+
+ if node_counter[0] == 0:
+ nodes_published_descriptors.set()
+
+ for node in hs_nodes[1:]:
+ node.getController().start()
+ track_introduction_points(node)
+
+ node.getStemController().add_event_listener(hs_node_listener, EventType.INFO)
+
+ nodes_published_descriptors.wait()
+
+ for node in hs_nodes[1:]:
+ node.getStemController().remove_event_listener(hs_node_listener)
+
+ test_intro_failure(nodes_by_fingerprint)
+
+def test_intro_failure(nodes_by_fingerprint):
+ connection_test()
+
+ time.sleep(5)
+
+ # Select a random node that is being used as an introduction point
+ nodenum = random.choice(node_intro_circuits.keys())
+ fingerprint = random.choice(node_intro_circuits[nodenum].values())
+
+ node = nodes_by_fingerprint[fingerprint]
+
+ logging.info("stopping " + node._env["nick"] + " (" + fingerprint + ")")
+
+ node.getStemController().close()
+ node.getController().stop()
+
+ logging.info("begining to watch for the establishment of new introduction points")
+
+ changed = [False for n in hs_nodes]
+
+ intro_points_before = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
+
+ time.sleep(20)
+
+ intro_points_after = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
+
+ for i, node in enumerate(hs_nodes):
+ before = intro_points_before[i]
+ after = intro_points_after[i]
+
+ if before != after:
+ changed[i] = True
+
+ if all(changed):
+ logging.info("All changed")
+ else:
+ logging.info("All did not change")
+
+ check_same_intro_points()
+
+ connection_test()
+
+ for server in hs_servers:
+ server.stopListening()
+
+ reactor.stop()
+
+ stop()
+
+def connection_test():
+ logging.info("Connecting to clients")
+
+ responses = {str(i): 0 for i in range(len(hs_servers))}
+
+ for c in client_nodes:
+ result = c.query("http://2oiifbe3wne4iaqb.onion/");
+
+ if result in responses:
+ responses[result] += 1
+ else:
+ logging.info("Unknown response: " + str(result))
+
+ test_pass = True
+
+ for node, responses in sorted(responses.items()):
+ logging.info(node + ": " + str(responses))
+
+ if responses == 0:
+ test_pass = False
+
+ if test_pass:
+ logging.info("Test PASS")
+ else:
+ logging.info("Test FAIL")