[tor-commits] [flashproxy/master] Pulling Facilitator stuff out of rtmfp package, adding some commentary and boilerplate for an SQSProxyPair (currently is just a TCPProxyPair)
dcf at torproject.org
dcf at torproject.org
Sun Jun 12 08:56:30 UTC 2011
commit 6307de6a85132ea3859ab0dca7e95db9b04d0af0
Author: Nate Hardison <nate at rescomp-09-154551.stanford.edu>
Date: Thu Jun 9 01:12:37 2011 -0700
Pulling Facilitator stuff out of rtmfp package, adding some commentary and boilerplate for an SQSProxyPair (currently is just a TCPProxyPair)
---
FacilitatorSocket.as | 103 +++++++++++++++++++++++++++++++
SQSProxyPair.as | 86 ++++++++++++++++++++++++++
events/FacilitatorSocketEvent.as | 22 +++++++
rtmfp/FacilitatorSocket.as | 104 --------------------------------
rtmfp/events/FacilitatorSocketEvent.as | 22 -------
swfcat.as | 25 +++++++-
6 files changed, 233 insertions(+), 129 deletions(-)
diff --git a/FacilitatorSocket.as b/FacilitatorSocket.as
new file mode 100644
index 0000000..3930fea
--- /dev/null
+++ b/FacilitatorSocket.as
@@ -0,0 +1,103 @@
+package
+{
+ import flash.events.Event;
+ import flash.events.EventDispatcher;
+ import flash.events.HTTPStatusEvent;
+ import flash.events.IOErrorEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.net.URLLoader;
+ import flash.net.URLLoaderDataFormat;
+ import flash.net.URLRequest;
+ import flash.net.URLRequestMethod;
+ import flash.net.URLVariables;
+
+ import events.FacilitatorSocketEvent;
+
+ [Event(name=FacilitatorSocketEvent.CONNECT_FAILED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
+ [Event(name=FacilitatorSocketEvent.REGISTRATION_FAILED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
+ [Event(name=FacilitatorSocketEvent.REGISTRATION_RECEIVED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
+ [Event(name=FacilitatorSocketEvent.REGISTRATIONS_EMPTY, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
+ public class FacilitatorSocket extends EventDispatcher
+ {
+ private var host:String;
+ private var port:uint;
+
+ public function FacilitatorSocket(host:String, port:uint)
+ {
+ this.host = host;
+ this.port = port;
+ }
+
+ public function get_registration():void
+ {
+ make_request(URLRequestMethod.GET);
+ }
+
+ public function post_registration(registration_data:String):void
+ {
+ var data:URLVariables = new URLVariables();
+ data.client = registration_data;
+ make_request(URLRequestMethod.POST, data);
+ }
+
+ private function fail():void
+ {
+ dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.CONNECT_FAILED));
+ }
+
+ private function make_request(method:String, data:URLVariables = null):void
+ {
+ var request:URLRequest = new URLRequest(url)
+ request.data = data;
+ request.method = method;
+
+ var url_loader:URLLoader = new URLLoader();
+ url_loader = new URLLoader();
+ url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
+
+ url_loader.addEventListener(Event.COMPLETE, on_complete_event);
+ url_loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, on_http_status_event);
+ url_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, on_security_error_event);
+ url_loader.addEventListener(IOErrorEvent.IO_ERROR, on_io_error_event);
+
+ url_loader.load(request);
+ }
+
+ private function on_complete_event(event:Event):void
+ {
+ try {
+ var client_id:String = event.target.data.client;
+ if (client_id == "Registration list empty") {
+ dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.REGISTRATIONS_EMPTY));
+ } else {
+ dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.REGISTRATION_RECEIVED, client_id));
+ }
+ } catch (e:Error) {
+ /* error is thrown for POST when we don't care about
+ the response anyways */
+ }
+
+ event.target.close()
+ }
+
+ private function on_http_status_event(event:HTTPStatusEvent):void
+ {
+ /* empty for now */
+ }
+
+ private function on_io_error_event(event:IOErrorEvent):void
+ {
+ fail();
+ }
+
+ private function on_security_error_event(event:SecurityErrorEvent):void
+ {
+ fail();
+ }
+
+ private function get url():String
+ {
+ return "http://" + host + ":" + port;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SQSProxyPair.as b/SQSProxyPair.as
new file mode 100644
index 0000000..54f763d
--- /dev/null
+++ b/SQSProxyPair.as
@@ -0,0 +1,86 @@
+package
+{
+ import flash.events.Event;
+ import flash.events.EventDispatcher;
+ import flash.events.IOErrorEvent;
+ import flash.events.ProgressEvent;
+ import flash.events.SecurityErrorEvent;
+ import flash.net.Socket;
+ import flash.utils.ByteArray;
+
+ public class SQSProxyPair extends ProxyPair
+ {
+ private var client_socket:Socket;
+
+ public function SQSProxyPair(ui:swfcat)
+ {
+ super(this, ui);
+
+ log("Starting SQS proxy pair");
+ setup_client_socket();
+ }
+
+ override public function set client(client_addr:Object):void
+ {
+ this.client_addr = client_addr;
+ log("Client: connecting to " + client_addr.host + ":" + client_addr.port + ".");
+ client_socket.connect(client_addr.host, client_addr.port);
+ }
+
+ override public function close():void
+ {
+ super.close();
+ if (client_socket != null && client_socket.connected) {
+ client_socket.close();
+ }
+ dispatchEvent(new Event(Event.CLOSE));
+ }
+
+ override public function get connected():Boolean
+ {
+ return (super.connected && client_socket != null && client_socket.connected);
+ }
+
+ override protected function transfer_bytes(src:Object, dst:Object, num_bytes:uint):void
+ {
+ var bytes:ByteArray = new ByteArray();
+
+ if (src == null) {
+ src = client_socket;
+ }
+
+ if (dst == null) {
+ dst = client_socket;
+ }
+
+ Socket(src).readBytes(bytes, 0, num_bytes);
+ log("SQSProxyPair: transferring " + num_bytes + " bytes.");
+ Socket(dst).writeBytes(bytes);
+ }
+
+ private function setup_client_socket():void
+ {
+ client_socket = new Socket();
+
+ client_socket.addEventListener(Event.CONNECT, function (e:Event):void {
+ log("Client: connected to " + client_addr.host + ":" + client_addr.port + ".");
+ if (connected) {
+ dispatchEvent(new Event(Event.CONNECT));
+ }
+ });
+ client_socket.addEventListener(Event.CLOSE, function (e:Event):void {
+ log("Client: closed.");
+ close();
+ });
+ client_socket.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {
+ log("Client: I/O error: " + e.text + ".");
+ close();
+ });
+ client_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function (e:SecurityErrorEvent):void {
+ log("Client: security error: " + e.text + ".");
+ close();
+ });
+ client_socket.addEventListener(ProgressEvent.SOCKET_DATA, client_to_relay);
+ }
+ }
+}
\ No newline at end of file
diff --git a/events/FacilitatorSocketEvent.as b/events/FacilitatorSocketEvent.as
new file mode 100644
index 0000000..9fc478b
--- /dev/null
+++ b/events/FacilitatorSocketEvent.as
@@ -0,0 +1,22 @@
+package events
+{
+ import flash.events.Event;
+
+ public class FacilitatorSocketEvent extends Event
+ {
+ public static const CONNECT_CLOSED:String = "connectClosed";
+ public static const CONNECT_FAILED:String = "connectFailed";
+ public static const CONNECT_SUCCESS:String = "connectSuccess";
+ public static const REGISTRATION_RECEIVED:String = "registrationReceived";
+ public static const REGISTRATION_FAILED:String = "registrationFailed";
+ public static const REGISTRATIONS_EMPTY:String = "registrationsEmpty";
+
+ public var client:String;
+
+ public function FacilitatorSocketEvent(type:String, client:String = null, bubbles:Boolean = false, cancelable:Boolean = false)
+ {
+ super(type, bubbles, cancelable);
+ this.client = client;
+ }
+ }
+}
diff --git a/rtmfp/FacilitatorSocket.as b/rtmfp/FacilitatorSocket.as
deleted file mode 100644
index 32c8a7d..0000000
--- a/rtmfp/FacilitatorSocket.as
+++ /dev/null
@@ -1,104 +0,0 @@
-package rtmfp
-{
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import flash.events.HTTPStatusEvent;
- import flash.events.IOErrorEvent;
- import flash.events.SecurityErrorEvent;
- import flash.net.URLLoader;
- import flash.net.URLLoaderDataFormat;
- import flash.net.URLRequest;
- import flash.net.URLRequestMethod;
- import flash.net.URLVariables;
- import flash.system.Security;
-
- import rtmfp.events.FacilitatorSocketEvent;
-
- [Event(name=FacilitatorSocketEvent.CONNECT_FAILED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
- [Event(name=FacilitatorSocketEvent.REGISTRATION_FAILED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
- [Event(name=FacilitatorSocketEvent.REGISTRATION_RECEIVED, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
- [Event(name=FacilitatorSocketEvent.REGISTRATIONS_EMPTY, type="com.flashproxy.rtmfp.events.FacilitatorSocketEvent")]
- public class FacilitatorSocket extends EventDispatcher
- {
- private var host:String;
- private var port:uint;
-
- public function FacilitatorSocket(host:String, port:uint)
- {
- this.host = host;
- this.port = port;
- }
-
- public function get_registration():void
- {
- make_request(URLRequestMethod.GET);
- }
-
- public function post_registration(registration_data:String):void
- {
- var data:URLVariables = new URLVariables();
- data.client = registration_data;
- make_request(URLRequestMethod.POST, data);
- }
-
- private function fail():void
- {
- dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.CONNECT_FAILED));
- }
-
- private function make_request(method:String, data:URLVariables = null):void
- {
- var request:URLRequest = new URLRequest(url)
- request.data = data;
- request.method = method;
-
- var url_loader:URLLoader = new URLLoader();
- url_loader = new URLLoader();
- url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
-
- url_loader.addEventListener(Event.COMPLETE, on_complete_event);
- url_loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, on_http_status_event);
- url_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, on_security_error_event);
- url_loader.addEventListener(IOErrorEvent.IO_ERROR, on_io_error_event);
-
- url_loader.load(request);
- }
-
- private function on_complete_event(event:Event):void
- {
- try {
- var client_id:String = event.target.data.client;
- if (client_id == "Registration list empty") {
- dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.REGISTRATIONS_EMPTY));
- } else {
- dispatchEvent(new FacilitatorSocketEvent(FacilitatorSocketEvent.REGISTRATION_RECEIVED, client_id));
- }
- } catch (e:Error) {
- /* error is thrown for POST when we don't care about
- the response anyways */
- }
-
- event.target.close()
- }
-
- private function on_http_status_event(event:HTTPStatusEvent):void
- {
- /* empty for now */
- }
-
- private function on_io_error_event(event:IOErrorEvent):void
- {
- fail();
- }
-
- private function on_security_error_event(event:SecurityErrorEvent):void
- {
- fail();
- }
-
- private function get url():String
- {
- return "http://" + host + ":" + port;
- }
- }
-}
\ No newline at end of file
diff --git a/rtmfp/events/FacilitatorSocketEvent.as b/rtmfp/events/FacilitatorSocketEvent.as
deleted file mode 100644
index a0599aa..0000000
--- a/rtmfp/events/FacilitatorSocketEvent.as
+++ /dev/null
@@ -1,22 +0,0 @@
-package rtmfp.events
-{
- import flash.events.Event;
-
- public class FacilitatorSocketEvent extends Event
- {
- public static const CONNECT_CLOSED:String = "connectClosed";
- public static const CONNECT_FAILED:String = "connectFailed";
- public static const CONNECT_SUCCESS:String = "connectSuccess";
- public static const REGISTRATION_RECEIVED:String = "registrationReceived";
- public static const REGISTRATION_FAILED:String = "registrationFailed";
- public static const REGISTRATIONS_EMPTY:String = "registrationsEmpty";
-
- public var client:String;
-
- public function FacilitatorSocketEvent(type:String, client:String = null, bubbles:Boolean = false, cancelable:Boolean = false)
- {
- super(type, bubbles, cancelable);
- this.client = client;
- }
- }
-}
diff --git a/swfcat.as b/swfcat.as
index 7729d2c..627a3cd 100644
--- a/swfcat.as
+++ b/swfcat.as
@@ -8,14 +8,22 @@ package
import flash.events.Event;
import flash.utils.setTimeout;
+ import FacilitatorSocket;
+ import events.FacilitatorSocketEvent;
+
+ import ProxyPair;
+ import RTMFPProxyPair;
+ import SQSProxyPair;
+ import TCPProxyPair;
+
import rtmfp.CirrusSocket;
- import rtmfp.FacilitatorSocket;
import rtmfp.events.CirrusSocketEvent;
- import rtmfp.events.FacilitatorSocketEvent;
public class swfcat extends Sprite
{
- /* Adobe's Cirrus server and Nate's key */
+ /* Adobe's Cirrus server for RTMFP connections.
+ The Cirrus key is defined at compile time by
+ reading from the CIRRUS_KEY environment var. */
private const DEFAULT_CIRRUS_ADDR:String = "rtmfp://p2p.rtmfp.net";
private const DEFAULT_CIRRUS_KEY:String = RTMFP::CIRRUS_KEY;
@@ -25,6 +33,7 @@ package
port: 9002
};
+ /* Default Tor client to use in case of RTMFP connection */
private const DEFAULT_TOR_CLIENT_ADDR:Object = {
host: "127.0.0.1",
port: 9002
@@ -122,6 +131,8 @@ package
fac_addr = DEFAULT_FACILITATOR_ADDR;
}
+ /* TODO: modify this for the client so that it can specify
+ a relay for the proxy to use */
relay_spec = this.loaderInfo.parameters["relay"];
if (relay_spec) {
puts("Relay spec: \"" + relay_spec + "\"");
@@ -259,6 +270,14 @@ package
return new RTMFPProxyPair(this, s_c, s_c.local_stream_name);
}
+ // currently is the same as TCPProxyPair
+ // could be interesting to see how this works
+ // can't imagine it will work terribly well...
+ private function sqs_proxy_pair_factory():ProxyPair
+ {
+ return new SQSProxyPair(this);
+ }
+
private function tcp_proxy_pair_factory():ProxyPair
{
return new TCPProxyPair(this);
More information about the tor-commits
mailing list