[tor-commits] [flashproxy/master] Nuke RTMFP stuff.

dcf at torproject.org dcf at torproject.org
Mon Apr 9 04:08:41 UTC 2012


commit a43697091c161330ebc7f59372850f46ea372f65
Author: David Fifield <david at bamsoftware.com>
Date:   Sun Mar 11 22:33:19 2012 -0700

    Nuke RTMFP stuff.
---
 README                              |   60 ----------
 RTMFPSocket.as                      |  217 -----------------------------------
 design.txt                          |   10 --
 init.d/cumulus                      |   60 ----------
 patches/cumulus-no-manage-log.patch |   39 ------
 swfcat.as                           |  108 +-----------------
 6 files changed, 2 insertions(+), 492 deletions(-)

diff --git a/README b/README
index 006db8c..86524c7 100644
--- a/README
+++ b/README
@@ -95,34 +95,6 @@ without having to do port forwarding.
 2. Run Tor using the included torrc file.
 	$ tor -f flashproxy/torrc
 
-=== Using RTMFP
-
-This method uses a protocol called RTMFP to communicate through a NAT
-without port forwarding. However it uses a public server at a fixed
-address as an intermediary, so it can be easily blocked. (The
-intermediate server is operated by the flash proxy developers, not by
-Adobe as is usual with RTMFP.) This method also requires Flash Player on
-the Tor client, which the other methods don't.
-
-1. Download swfcat.swf from
-	https://crypto.stanford.edu/flashproxy/swfcat.swf
-   and save it locally. We will assume it is saved at
-   /home/user/flashproxy/swfcat.swf.
-2. Run the connector, without giving it a facilitator, and listening on
-   local ports only. In this configuration, it is the swfcat.swf program
-   that communicates with the facilitator, not the connector.
-	$ ./connector.py 127.0.0.1:9001 127.0.0.1:9002
-3. Open in a browser
-	file:///home/user/flashproxy/swfcat.swf?client=1&debug=1
-   This should *not* be the same browser you use to browse over Tor. You
-   should not run Flash in your Tor browser. Use a separate Firefox
-   profile (firefox -no-remote -ProfileManager) or use a separate
-   browser entirely.
-4. Run Tor using the included torrc file.
-	$ tor -f flashproxy/torrc
-
-You will see status messages in the swfcat.swf window.
-
 === Troubleshooting
 
 Make sure someone is viewing https://crypto.stanford.edu/flashproxy/, or
@@ -213,35 +185,3 @@ crossdomaind server on CentOS. "make install" copies files to /usr/local/bin.
 	# cp init.d/crossdomaind /etc/init.d/crossdomaind
 	# chkconfig --add crossdomaind
 	# service crossdomaind start
-
-=== Building the Cumulus RTMFP server
-
-There is a free RTMFP rendezvous server called Cumulus. It is a
-replacement for the Adobe Cirrus service at rtmfp://p2p.rtmfp.net/.
-These are instructions to build and install it.
-
-First install the prerequisite libpoco, http://poco.sourceforge.net/.
-You only need the "Basic Edition."
-	# apt-get install libpoco-dev
-or
-	$ cd poco-VERSION
-	$ ./configure && make
-	# make install
-
-Follow these steps to install the Cumulus server. You need to open port
-1935/udp in the firewall.
-	$ git clone git://github.com/OpenRTMFP/Cumulus.git
-	$ cd Cumulus
-	$ patch -p0 < ~/flashproxy/patches/cumulus-no-manage-log.patch
-	$ cd CumulusLib
-	$ make LIBS=./
-	# cp libCumulus.so /usr/local/lib
-	$ cd ../../CumulusService
-	$ make
-	# cp CumulusService /usr/local/bin
-	# useradd -d /dev/null -s /bin/false cumulus
-	# mkdir /var/cumulus
-	# chown -R cumulus.cumulus /var/cumulus
-	# cp flashproxy/init.d/cumulus /etc/init.d/cumulus
-	# chkconfig --add cumulus
-	# service cumulus start
diff --git a/RTMFPSocket.as b/RTMFPSocket.as
deleted file mode 100644
index 421f9cc..0000000
--- a/RTMFPSocket.as
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
-The RTMFPSocket class provides a socket-like interface around RTMFP
-NetConnection and NetStream. Each RTMFPSocket contains one NetConnection and two
-NetStreams, one for reading and one for writing.
-
-To create a listening socket:
-    var rs:RTMFPSocket = new RTMFPSocket(url, key);
-    rs.addEventListener(Event.COMPLETE, function (e:Event):void {
-        // rs.id is set and can be sent out of band to the client.
-    });
-    rs.addEventListener(RTMFPSocket.ACCEPT_EVENT, function (e:Event):void {
-        // rs.peer_id is the ID of the connected client.
-    });
-    rs.listen();
-To connect to a listening socket:
-    // Receive peer_id out of band.
-    var rs:RTMFPSocket = new RTMFPSocket(url, key);
-    rs.addEventListener(Event.CONNECT, function (e:Event):void {
-        // rs.id and rs.peer_id are now set.
-    });
-*/
-
-package
-{
-    import flash.events.Event;
-    import flash.events.EventDispatcher;
-    import flash.events.IOErrorEvent;
-    import flash.events.NetStatusEvent;
-    import flash.events.ProgressEvent;
-    import flash.net.NetConnection;
-    import flash.net.NetStream;
-    import flash.utils.ByteArray;
-
-    public class RTMFPSocket extends EventDispatcher
-    {
-        public static const ACCEPT_EVENT:String = "accept";
-
-        public var connected:Boolean;
-
-        private var nc:NetConnection;
-        private var incoming:NetStream;
-        private var outgoing:NetStream;
-
-        /* Cache to hold the peer ID between when connect is called and the
-           NetConnection exists. */
-        private var connect_peer_id:String;
-
-        private var buffer:ByteArray;
-
-        private var cirrus_url:String;
-        private var cirrus_key:String;
-
-        public function RTMFPSocket(cirrus_url:String, cirrus_key:String = "")
-        {
-            connected = false;
-
-            buffer = new ByteArray();
-
-            this.cirrus_url = cirrus_url;
-            this.cirrus_key = cirrus_key;
-
-            nc = new NetConnection();
-        }
-
-        public function get id():String
-        {
-            return nc.nearID;
-        }
-
-        public function get peer_id():String
-        {
-            return incoming.farID;
-        }
-
-        /* NetStatusEvents that aren't handled more specifically in
-           listen_netstatus_event or connect_netstatus_event. */
-        private function generic_netstatus_event(e:NetStatusEvent):void
-        {
-            switch (e.info.code) {
-            case "NetConnection.Connect.Closed":
-                connected = false;
-                dispatchEvent(new Event(Event.CLOSE));
-                break;
-            case "NetStream.Connect.Closed":
-                connected = false;
-                close();
-                break;
-            default:
-                var event:IOErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR);
-                event.text = e.info.code;
-                dispatchEvent(event);
-                break;
-            }
-        }
-
-        private function listen_netstatus_event(e:NetStatusEvent):void
-        {
-            switch (e.info.code) {
-            case "NetConnection.Connect.Success":
-                outgoing = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
-                outgoing.client = {
-                    onPeerConnect: listen_onpeerconnect
-                };
-                outgoing.publish("server");
-
-                /* listen is complete, ready to accept. */
-                dispatchEvent(new Event(Event.COMPLETE));
-                break;
-            case "NetStream.Connect.Success":
-                break;
-            default:
-                return generic_netstatus_event(e);
-                break;
-            }
-        }
-
-        private function listen_onpeerconnect(peer:NetStream):Boolean {
-            incoming = new NetStream(nc, peer.farID);
-            incoming.client = {
-                r: receive_data
-            };
-            incoming.play("client");
-
-            connected = true;
-            dispatchEvent(new Event(ACCEPT_EVENT));
-
-            return true;
-        }
-
-        private function connect_netstatus_event(e:NetStatusEvent):void
-        {
-            switch (e.info.code) {
-            case "NetConnection.Connect.Success":
-                outgoing = new NetStream(nc, NetStream.DIRECT_CONNECTIONS);
-                outgoing.publish("client");
-
-                incoming = new NetStream(nc, connect_peer_id);
-                incoming.client = {
-                    r: receive_data
-                };
-                incoming.play("server");
-                break;
-            case "NetStream.Connect.Success":
-                connected = true;
-                dispatchEvent(new Event(Event.CONNECT));
-                break;
-            default:
-                return generic_netstatus_event(e);
-                break;
-            }
-        }
-
-        /* Function called back when the other side does a send. */
-        private function receive_data(bytes:ByteArray):void {
-            var event:ProgressEvent;
-
-            event = new ProgressEvent(ProgressEvent.SOCKET_DATA);
-            event.bytesLoaded = bytes.bytesAvailable;
-
-            bytes.readBytes(buffer, buffer.length, bytes.bytesAvailable);
-
-            dispatchEvent(event);
-        }
-
-        public function listen():void
-        {
-            nc.addEventListener(NetStatusEvent.NET_STATUS, listen_netstatus_event);
-            nc.connect(cirrus_url, cirrus_key);
-        }
-
-        public function connect(peer_id:String):void
-        {
-            /* Store for later reading by connect_netstatus_event. */
-            this.connect_peer_id = peer_id;
-
-            nc.addEventListener(NetStatusEvent.NET_STATUS, connect_netstatus_event);
-            nc.connect(cirrus_url, cirrus_key);
-        }
-
-        public function close():void
-        {
-            if (outgoing)
-                outgoing.close();
-            if (incoming)
-                incoming.close();
-            if (nc)
-                nc.close();
-        }
-
-        public function readBytes(output:ByteArray, offset:uint = 0, length:uint = 0):void
-        {
-            buffer.readBytes(output, offset, length);
-            if (buffer.bytesAvailable == 0) {
-                /* Reclaim memory space. */
-                buffer.clear();
-            }
-        }
-
-        public function writeBytes(input:ByteArray, offset:uint = 0, length:uint = 0):void
-        {
-            var sendbuf:ByteArray;
-
-            /* Read into a new buffer, in case offset and length do not
-               completely span input. */
-            sendbuf = new ByteArray();
-            sendbuf.writeBytes(input, offset, length);
-
-            /* Use a short method name because it's sent over the wire. */
-            outgoing.send("r", sendbuf);
-        }
-
-        public function flush():void
-        {
-            /* Ignored. */
-        }
-    }
-}
diff --git a/design.txt b/design.txt
index 55427b6..b797262 100644
--- a/design.txt
+++ b/design.txt
@@ -108,12 +108,6 @@ Design of flash proxies
 
     client=[<address>]:<port>
 
-  or the form:
-
-    POST / HTTP/1.0
-
-    client=[<rtmfp-id>]:<port>
-
   The facilitator sends a 200 reply if the registration was successful
   and an error status otherwise. If the connector omits the [<address>]
   part, the facilitator will automatically fill it in based on the HTTP
@@ -147,10 +141,6 @@ Design of flash proxies
 
     client=[<address>:<port>]&relay=<address>:<port>
 
-  or this:
-
-    client=[<rtmfp-id>]&relay=<address>:<port>
-
   If the value for the client parameter is empty, it means that there are no
   client registrations for this proxy.
 
diff --git a/init.d/cumulus b/init.d/cumulus
deleted file mode 100755
index ba4f4d8..0000000
--- a/init.d/cumulus
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/sh
-#
-# cumulus      This shell script takes care of starting and stopping
-#              the Cumulus server.
-#
-# chkconfig: 2345 90 10
-# description: Cumulus RTMFP server.
-# processname: CumulusService
-# pidfile: /var/cumulus/cumulus.pid
-
-# Installation instructions:
-# cp init.d/cumulus /etc/init.d/cumulus
-# chkconfig --add cumulus
-# service cumulus start
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-BINDIR=/usr/local/bin
-VARDIR=/var/cumulus
-CUMULUS=$BINDIR/CumulusService
-PIDFILE=$VARDIR/cumulus.pid
-USER=cumulus
-
-# See how we were called.
-case "$1" in
-  start)
-	[ -x $CUMULUS ] || exit 1
-	echo -n $"Starting Cumulus server: "
-	cd $VARDIR && daemon --user cumulus --pidfile $PIDFILE $CUMULUS --daemon --pidfile=$PIDFILE
-	RETVAL=$?
-	echo
-	[ $RETVAL -eq 0 ] && touch /var/lock/subsys/cumulus
-	;;
-  stop)
-	# Stop daemon.
-	echo -n $"Shutting down Cumulus server: "
-	killproc CumulusService
-	RETVAL=$?
-	echo
-	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/cumulus
-	;;
-  status)
-	status cumulus
-	RETVAL=$?
-	;;
-  restart|reload)
-	$0 stop
-	$0 start
-	;;
-  condrestart)
-	[ -f /var/lock/subsys/cumulus ] && restart || :
-	;;
-  *)
-	echo $"Usage: $0 {start|stop|status|restart}"
-	RETVAL=3
-	;;
-esac
-
-exit $RETVAL
diff --git a/patches/cumulus-no-manage-log.patch b/patches/cumulus-no-manage-log.patch
deleted file mode 100644
index 810b52d..0000000
--- a/patches/cumulus-no-manage-log.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-Don't try to re-open log files. This avoids a failure after --daemon
-causes a chdir to /.
-
-diff --git a/CumulusService/sources/main.cpp b/CumulusService/sources/main.cpp
-index 891621f..39ea4eb 100644
---- a/CumulusService/sources/main.cpp
-+++ b/CumulusService/sources/main.cpp
-@@ -132,7 +132,6 @@ protected:
- 	void dumpHandler(const char* data,int size) {
- 		cout.write(data,size);
- 		_logStream.write(data,size);
--		manageLogFile();
- 	}
- 
- 	void logHandler(Thread::TID threadId,const std::string& threadName,Priority priority,const char *filePath,long line, const char *text) {
-@@ -140,23 +139,6 @@ protected:
- 		_logStream << DateTimeFormatter::format(LocalDateTime(),"%d/%m %H:%M:%S.%c  ")
- 				<< g_logPriorities[priority-1] << '\t' << threadName << '(' << threadId << ")\t"
- 				<< Path(filePath).getFileName() << '[' << line << "]  " << text << std::endl;
--		manageLogFile();
--	}
--
--	void manageLogFile() {
--		if(_logFile.getSize()>LOG_SIZE) {
--			_logStream.close();
--			int num = 10;
--			File file(LOG_FILE(10));
--			if(file.exists())
--				file.remove();
--			while(--num>=0) {
--				file = LOG_FILE_VAR(num);
--				if(file.exists())
--					file.renameTo(LOG_FILE_VAR(num+1));
--			}
--			_logStream.open(LOG_FILE(0),ios::in | ios::ate);
--		}	
- 	}
- 
- 	bool onConnection(Client& client) {
diff --git a/swfcat.as b/swfcat.as
index 76b35c4..13d8788 100644
--- a/swfcat.as
+++ b/swfcat.as
@@ -29,17 +29,6 @@
  * What rate to limit all proxy traffic combined to. The special value "off"
  * disables the limit. The default is DEFAULT_RATE_LIMIT. There is a
  * sanity-check minimum of "10K".
- *
- * client=1
- * If set (to any value), run in client RTMFP mode. In this mode, rather than
- * connecting to a facilitator and attempting to serve clients, swfcat starts an
- * RTMFP socket and connects to a local address (to the connector, to be exact).
- * See README for more on running in client RTMFP mode. No argument is required
- * to use RTMFP when in the usual server mode.
- *
- * local=<HOST>:<PORT>
- * When in client RTMFP mode (client=1), connect to this local address. The
- * default is DEFAULT_LOCAL_TOR_CLIENT_ADDR.
  */
 
 package
@@ -63,19 +52,11 @@ package
 
     public class swfcat extends Sprite
     {
-        private const RTMFP_URL:String = "rtmfp://tor-facilitator.bamsoftware.com";
-
         private const DEFAULT_FACILITATOR_ADDR:Object = {
             host: "tor-facilitator.bamsoftware.com",
             port: 9002
         };
 
-        /* Local Tor client to use in case of RTMFP connection. */
-        private const DEFAULT_LOCAL_TOR_CLIENT_ADDR:Object = {
-            host: "127.0.0.1",
-            port: 9002
-        };
-
         private const DEFAULT_MAX_NUM_PROXY_PAIRS:uint = 10;
 
         /* In seconds. */
@@ -101,7 +82,6 @@ package
         private var fac_addr:Object;
         private var max_num_proxy_pairs:uint;
         private var facilitator_poll_interval:Number;
-        private var local_addr:Object;
 
         public var rate_limit:RateLimit;
 
@@ -133,7 +113,7 @@ package
 
             debug = this.loaderInfo.parameters["debug"];
 
-            if (debug || this.loaderInfo.parameters["client"]) {
+            if (debug) {
                 output_text = new TextField();
                 output_text.width = stage.stageWidth;
                 output_text.height = stage.stageHeight;
@@ -182,16 +162,7 @@ package
             else
                 rate_limit = new RateUnlimit();
 
-            local_addr = get_param_addr("local", DEFAULT_LOCAL_TOR_CLIENT_ADDR);
-            if (!local_addr) {
-                puts("Error: Local spec must be in the form \"host:port\".");
-                return;
-            }
-
-            if (this.loaderInfo.parameters["client"])
-                client_main();
-            else
-                proxy_main();
+            proxy_main();
         }
 
         /* Get an address structure from the given movie parameter, or the given
@@ -320,68 +291,6 @@ package
             badge.proxy_begin();
         }
 
-        private function client_main():void
-        {
-            var rs:RTMFPSocket;
-
-            puts("Making RTMFP socket.");
-            rs = new RTMFPSocket(RTMFP_URL);
-            rs.addEventListener(Event.COMPLETE, function (e:Event):void {
-                puts("Got RTMFP id " + rs.id);
-                register(rs);
-            });
-            rs.addEventListener(RTMFPSocket.ACCEPT_EVENT, client_accept);
-
-            rs.listen();
-        }
-
-        private function client_accept(e:Event):void {
-            var rs:RTMFPSocket;
-            var s_t:Socket;
-            var proxy_pair:ProxyPair;
-
-            rs = e.target as RTMFPSocket;
-            s_t = new Socket();
-
-            puts("Got RTMFP connection from " + rs.peer_id);
-
-            proxy_pair = new ProxyPair(this, rs, function ():void {
-                /* Do nothing; already connected. */
-            }, s_t, function ():void {
-                s_t.connect(local_addr.host, local_addr.port);
-            });
-            proxy_pair.connect();
-        }
-
-        private function register(rs:RTMFPSocket):void {
-            var fac_url:String;
-            var loader:URLLoader;
-            var request:URLRequest;
-
-            loader = new URLLoader();
-            loader.addEventListener(Event.COMPLETE, function (e:Event):void {
-                puts("Facilitator: registered.");
-            });
-            loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function (e:SecurityErrorEvent):void {
-                puts("Facilitator: security error: " + e.text + ".");
-                rs.close();
-            });
-            loader.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {
-                puts("Facilitator: I/O error: " + e.text + ".");
-                rs.close();
-            });
-
-            fac_url = "http://" + encodeURIComponent(fac_addr.host)
-                + ":" + encodeURIComponent(fac_addr.port) + "/";
-            request = new URLRequest(fac_url);
-            request.method = URLRequestMethod.POST;
-            request.data = new URLVariables();
-            request.data["client"] = rs.id;
-
-            puts("Facilitator: connecting to " + fac_url + ".");
-            loader.load(request);
-        }
-
         private function make_proxy_pair(client_spec:String, relay_spec:String):ProxyPair
         {
             var proxy_pair:ProxyPair;
@@ -408,19 +317,6 @@ package
                 return proxy_pair;
             }
 
-            if (client_spec.match(/^[0-9A-Fa-f]{64}$/)) {
-                s_c = new RTMFPSocket(RTMFP_URL);
-                s_r = new Socket();
-                proxy_pair = new ProxyPair(this, s_c, function ():void {
-                    s_c.connect(client_spec);
-                }, s_r, function ():void {
-                    s_r.connect(addr_r.host, addr_r.port);
-                });
-                proxy_pair.set_name("<" + client_spec.substr(0, 4) + "...,"
-                    + addr_r.host + ":" + addr_r.port + ">");
-                return proxy_pair;
-            }
-
             throw new ArgumentError("Can't parse client spec \"" + client_spec + "\".");
         }
 





More information about the tor-commits mailing list