summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2005-03-31 05:52:23 +0000
committerNick Mathewson <nickm@torproject.org>2005-03-31 05:52:23 +0000
commit14296cd49c66cc6ad2f0158c1d657aba66975e50 (patch)
tree2150f3afe84b807544bd3ecb31a6ce03cfa4df96
parent13bd755ae65c5978243ad6e7028a478dc51b7547 (diff)
downloadtor-14296cd49c66cc6ad2f0158c1d657aba66975e50.tar.gz
tor-14296cd49c66cc6ad2f0158c1d657aba66975e50.zip
First cut at server-poker.
svn:r3924
-rw-r--r--contrib/ExerciseServer.py109
-rwxr-xr-xcontrib/TorControl.py2
2 files changed, 110 insertions, 1 deletions
diff --git a/contrib/ExerciseServer.py b/contrib/ExerciseServer.py
new file mode 100644
index 0000000000..06c9a6a40e
--- /dev/null
+++ b/contrib/ExerciseServer.py
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+import TorControl
+import threading
+import socket
+import struct
+import random
+
+SOCKS_PORT=9050
+CONTROL_PORT=9051
+
+def runSocks4A(nonce, targetHost, targetPort, targetURL):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect(("127.0.0.1", SOCKS_PORT))
+ socksheader = struct.pack("!BBHL", 4, 0x01, targetPort, 1)
+ username = ""
+ socksheader = "%s%s\x00%s\x00" %(socksheader, username, nonce)
+ s.send(socksheader)
+ response = s.recv(8)
+ version,status,port=struct.unpack("!BBH",response[:4])
+ if status != 90:
+ print "Error: non-successful SOCKS status"
+ s.close()
+ return 0
+
+ s.send("GET %s HTTP/1.0\r\nHost: %s\r\n\r\n"%(targetURL,targetHost))
+ while 1:
+ r = s.recv(1024)
+ if not r:
+ s.close()
+ return 1
+
+HOSTS_TO_TEST = [ "moria1", "mordor", "tor26"]
+EXITS_TO_TEST = [ "pvt", ]
+TARGETS = [ ("www.seul.org", "/"), ]
+
+CIRCS_AT_A_TIME = 3
+CIRC_LEN = 3
+
+def launchCirc(s):
+ htt = HOSTS_TO_TEST[:]
+ random.shuffle(htt)
+ path = htt[:CIRC_LEN-1]+[random.choice(EXITS_TO_TEST)]
+ circid = TorControl.extend_circuit(s, 0, path)
+ return circid, path
+
+def runControl(s):
+ circs = {}
+ streams = {}
+ _h = lambda body,circs=circs,streams=streams,s=s:handleEvent(s,body,
+ circs,streams)
+ TorControl._event_handler = _h
+ TorControl.set_events(s,
+ [TorControl.EVENT_TYPE.CIRCSTATUS,
+ TorControl.EVENT_TYPE.STREAMSTATUS])
+ TorControl.set_option(s,"__LeaveStreamsUnattached 1")
+ while 1:
+ while len(circs) < CIRCS_AT_A_TIME:
+ c,p = launchCirc(s)
+ print "launching circuit %s to %s"%(c,p)
+ circs[c]=p
+ _, tp, body = TorControl.receive_message(s)
+ if tp == TorControl.MSG_TYPE.EVENT:
+ handleEvent(s, body, circs, streams)
+
+def handleEvent(s, body, circs, streams):
+ event, args = TorControl.unpack_event(body)
+ if event == TorControl.EVENT_TYPE.STREAMSTATUS:
+ status, ident, target = args
+ print "Got stream event:",TorControl.STREAM_STATUS.nameOf[status],\
+ ident,target
+ if status in (TorControl.STREAM_STATUS.NEW_CONNECT,
+ TorControl.STREAM_STATUS.NEW_RESOLVE,
+ TorControl.STREAM_STATUS.DETACHED):
+ if not target.endswith(".exnonce"):
+ TorControl.attach_stream(s, ident, 0)
+ else:
+ circid, (host,url) = streams[target]
+ TorControl.redirect_stream(s, ident, host)
+ TorControl.attach_stream(s, ident, circid)
+ elif event == TorControl.EVENT_TYPE.CIRCSTATUS:
+ status, ident, path = args
+ print "Got circuit event",TorControl.CIRC_STATUS.nameOf[status],\
+ ident,path
+ if status in (TorControl.CIRC_STATUS.CLOSED,
+ TorControl.CIRC_STATUS.FAILED):
+ if circs.has_key(ident):
+ print "Circuit failed."
+ del circs[ident]
+ elif status == TorControl.CIRC_STATUS.BUILT:
+ nonce = random.randint(1,100000000)
+ nonce = "%s.exnonce" % nonce
+ host,url = random.choice(TARGETS)
+ streams[nonce] = ident, (host,url)
+ print "Launching socks4a connection"
+ t = threading.Thread(target=runSocks4A, args=(nonce, host, 80, url))
+ t.setDaemon(1)
+ t.start()
+
+
+def run():
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect(("127.0.0.1", CONTROL_PORT))
+ TorControl.authenticate(s)
+ runControl(s)
+
+if __name__ == '__main__':
+ run()
+
diff --git a/contrib/TorControl.py b/contrib/TorControl.py
index 5a63ad4187..815ceecc83 100755
--- a/contrib/TorControl.py
+++ b/contrib/TorControl.py
@@ -206,7 +206,7 @@ def receive_reply(s, expected=None):
_, tp, body = receive_message(s)
if tp == MSG_TYPE.EVENT:
if _event_handler is not None:
- _event_handler(tp, body)
+ _event_handler(body)
elif tp == MSG_TYPE.ERROR:
if len(body)<2:
raise ProtocolError("(Truncated error message)")