[tor-commits] [ooni-probe/master] Add some documentation to b0wser protocol and server

art at torproject.org art at torproject.org
Wed Jul 11 13:56:42 UTC 2012


commit 4391e65f226f9b45ceaa08465f466903de14f8e0
Author: Arturo Filastò <hellais at torproject.org>
Date:   Wed Jul 11 12:54:09 2012 +0200

    Add some documentation to b0wser protocol and server
---
 oonib/b0wser.py |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/oonib/b0wser.py b/oonib/b0wser.py
index 6da1997..4b01cc7 100644
--- a/oonib/b0wser.py
+++ b/oonib/b0wser.py
@@ -5,6 +5,12 @@ from ooni.plugoo import reports
 from ooni.protocols.b0wser import Mutator
 
 class B0wserProtocol(protocol.Protocol):
+    """
+    This implements the B0wser protocol for the server side.
+    It gets instanced once for every client that connects to the oonib.
+    For every instance of protocol there is only 1 mutation.
+    Once the last step is reached the connection is closed on the serverside.
+    """
     steps = [{'data': "STEP1", 'wait': 4},
              {'data': "STEP2", 'wait': 4},
              {'data': "STEP3", 'wait': 4}]
@@ -16,12 +22,22 @@ class B0wserProtocol(protocol.Protocol):
     report = reports.Report('b0wser', 'b0wser.yamlooni')
 
     def next_state(self):
+        """
+        This is called once I have completed one step of the protocol and need
+        to proceed to the next step.
+        """
         data = self.mutator.get_mutation(self.state)
         self.transport.write(data)
         self.state += 1
         self.received_data = 0
 
     def dataReceived(self, data):
+        """
+        This is called every time some data is received. I transition to the
+        next step once the amount of data that I expect to receive is received.
+
+        @param data: the data that has been sent by the client.
+        """
         if len(self.steps) <= self.state:
             self.transport.loseConnection()
             return
@@ -31,6 +47,17 @@ class B0wserProtocol(protocol.Protocol):
             self.next_state()
 
     def censorship_detected(self, report):
+        """
+        I have detected the possible presence of censorship we need to write a
+        report on it.
+
+        @param report: a dict containing the report to be written. Must contain
+                       the keys 'reason', 'proto_state' and 'mutator_state'.
+                       The reason is the reason for which the connection was
+                       closed. The proto_state is the current state of the
+                       protocol instance and mutator_state is what was being
+                       mutated.
+        """
         print "The connection was closed because of %s" % report['reason']
         print "I may have matched the censorship fingerprint"
         print "State %s, Mutator %s" % (report['proto_state'],
@@ -39,6 +66,10 @@ class B0wserProtocol(protocol.Protocol):
 
 
     def connectionLost(self, reason):
+        """
+        The connection was closed. This may be because of a legittimate reason
+        or it may be because of a censorship event.
+        """
         report = {'reason': reason, 'proto_state': self.state,
                 'mutator_state': self.mutator.state(), 'trigger': None}
 
@@ -53,6 +84,14 @@ class B0wserProtocol(protocol.Protocol):
             self.censorship_detected(report)
 
 class B0wserServer(protocol.ServerFactory):
+    """
+    This is the main class that deals with the b0wser server side component.
+    We keep track of global state of every client here.
+    Every client is identified by their IP address and the state of mutation is
+    stored by using their IP address as a key. This may lead to some bugs if
+    two different clients are sharing the same IP, but hopefully the
+    probability of such thing is not that likely.
+    """
     protocol = B0wserProtocol
     mutations = {}
     def buildProtocol(self, addr):





More information about the tor-commits mailing list