[tor-commits] [flashproxy/master] Remove *.as files.
dcf at torproject.org
dcf at torproject.org
Mon Apr 9 04:08:42 UTC 2012
commit cb5640e7a478cebac59e91144e69992d5593d490
Author: David Fifield <david at bamsoftware.com>
Date: Sat Mar 31 17:45:58 2012 -0700
Remove *.as files.
---
Makefile | 14 +--
ProxyPair.as | 194 --------------------
swfcat.as | 566 ----------------------------------------------------------
3 files changed, 3 insertions(+), 771 deletions(-)
diff --git a/Makefile b/Makefile
index 61c3901..94c5d1f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,23 +1,15 @@
PREFIX = /usr/local
BINDIR = $(PREFIX)/bin
-MXMLC ?= mxmlc
-
-TARGETS = swfcat.swf
-
-all: $(TARGETS)
-
-swfcat.swf: *.as badge.png
-
-%.swf: %.as
- $(MXMLC) -output $@ -static-link-runtime-shared-libraries $<
+all:
+ :
install:
mkdir -p $(BINDIR)
cp -f connector.py facilitator.py $(BINDIR)
clean:
- rm -f $(TARGETS)
+ :
test:
./connector-test.py
diff --git a/ProxyPair.as b/ProxyPair.as
deleted file mode 100644
index 237ab69..0000000
--- a/ProxyPair.as
+++ /dev/null
@@ -1,194 +0,0 @@
-package
-{
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import flash.events.IOErrorEvent;
- import flash.events.ProgressEvent;
- import flash.events.SecurityErrorEvent;
- import flash.events.TextEvent;
- import flash.net.Socket;
- import flash.utils.ByteArray;
- import flash.utils.clearTimeout;
- import flash.utils.setTimeout;
-
- /* An instance of a client-relay connection. */
- public class ProxyPair extends EventDispatcher
- {
- // Label for log messages.
- public var name:String;
-
- // Socket to client.
- private var s_c:*;
- private var connect_c:Function;
-
- // Socket to relay.
- private var s_r:*;
- private var connect_r:Function;
-
- // Parent swfcat, for UI updates and rate meter.
- private var ui:swfcat;
-
- // Pending byte read counts for relay and client sockets.
- private var r2c_schedule:Array;
- private var c2r_schedule:Array;
- // Callback id.
- private var flush_id:uint;
-
- public function log(msg:String):void
- {
- if (name)
- ui.puts(name + ": " + msg)
- else
- ui.puts(msg)
- }
-
- public function logdebug(msg:String):void
- {
- if (ui.debug)
- log(msg);
- }
-
- public function set_name(name:String):void
- {
- this.name = name;
- }
-
- public function ProxyPair(ui:swfcat, s_c:*, connect_c:Function, s_r:*, connect_r:Function)
- {
- this.ui = ui;
- /* s_c is a socket for connecting to the client. connect_c is a
- function that, when called, connects s_c. Likewise for s_r and
- connect_r. */
- this.s_c = s_c;
- this.connect_c = connect_c;
- this.s_r = s_r;
- this.connect_r = connect_r;
-
- this.c2r_schedule = [];
- this.r2c_schedule = [];
- }
-
- /* Return a function that shows an error message and closes the other half
- of a communication pair. */
- private function socket_error(message:String, other:*):Function
- {
- return function(e:Event):void {
- if (e is TextEvent)
- log(message + ": " + (e as TextEvent).text + ".");
- else
- log(message + ".");
- if (other && other.connected)
- other.close();
- dispatchEvent(new Event(Event.COMPLETE));
- };
- }
-
- public function connect():void
- {
- s_r.addEventListener(Event.CONNECT, relay_connected);
- s_r.addEventListener(Event.CLOSE, relay_closed);
- s_r.addEventListener(IOErrorEvent.IO_ERROR, socket_error("Relay: I/O error", s_c));
- s_r.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socket_error("Relay: security error", s_c));
- s_r.addEventListener(ProgressEvent.SOCKET_DATA, relay_to_client);
-
- s_c.addEventListener(Event.CONNECT, client_connected);
- s_c.addEventListener(Event.CLOSE, client_closed);
- s_c.addEventListener(IOErrorEvent.IO_ERROR, socket_error("Client: I/O error", s_r));
- s_c.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socket_error("Client: security error", s_r));
- s_c.addEventListener(ProgressEvent.SOCKET_DATA, client_to_relay);
-
- log("Relay: connecting.");
- connect_r();
- log("Client: connecting.");
- connect_c();
- }
-
- private function relay_connected(e:Event):void
- {
- log("Relay: connected.");
- }
-
- private function client_connected(e:Event):void
- {
- log("Client: connected.");
- }
-
- private function relay_closed(e:Event):void
- {
- log("Relay: closed.");
- flush();
- }
-
- private function client_closed(e:Event):void
- {
- log("Client: closed.");
- flush();
- }
-
- private function relay_to_client(e:ProgressEvent):void
- {
- r2c_schedule.push(e.bytesLoaded);
- flush();
- }
-
- private function client_to_relay(e:ProgressEvent):void
- {
- c2r_schedule.push(e.bytesLoaded);
- flush();
- }
-
- private function transfer_chunk(s_from:*, s_to:*, n:uint,
- label:String):void
- {
- var bytes:ByteArray;
-
- bytes = new ByteArray();
- s_from.readBytes(bytes, 0, n);
- s_to.writeBytes(bytes);
- s_to.flush();
- ui.rate_limit.update(n);
- logdebug(label + ": read " + bytes.length + ".");
- }
-
- /* Send as much data as the rate limit currently allows. */
- private function flush():void
- {
- var busy:Boolean;
-
- if (flush_id)
- clearTimeout(flush_id);
- flush_id = undefined;
-
- if (!s_r.connected && !s_c.connected)
- /* Can't do anything while both sockets are disconnected. */
- return;
-
- busy = true;
- while (busy && !ui.rate_limit.is_limited()) {
- busy = false;
- if (s_c.connected && r2c_schedule.length > 0) {
- transfer_chunk(s_r, s_c, r2c_schedule.shift(), "Relay");
- busy = true;
- }
- if (s_r.connected && c2r_schedule.length > 0) {
- transfer_chunk(s_c, s_r, c2r_schedule.shift(), "Client");
- busy = true;
- }
- }
-
- if (!s_r.connected && r2c_schedule.length == 0) {
- log("Client: closing.");
- s_c.close();
- }
- if (!s_c.connected && c2r_schedule.length == 0) {
- log("Relay: closing.");
- s_r.close();
- }
-
- if (!s_c.connected && !s_r.connected)
- dispatchEvent(new Event(Event.COMPLETE));
- else if (r2c_schedule.length > 0 || c2r_schedule.length > 0)
- flush_id = setTimeout(flush, ui.rate_limit.when() * 1000);
- }
- }
-}
diff --git a/swfcat.as b/swfcat.as
deleted file mode 100644
index 13d8788..0000000
--- a/swfcat.as
+++ /dev/null
@@ -1,566 +0,0 @@
-/* Flash parameters. These can change how the program runs from the outside.
- * They can be set as a URL query string, for example:
- * http://www.example.com/swfcat.swf?facilitator=127.0.0.1:9002&debug=1
- * or in the HTML markup for the embedding of the movie:
- * <object>
- * <param name="movie" value="http://www.example.com/swfcat.swf">
- * <param name="flashvars" value="facilitator=127.0.0.1:9002&debug=1">
- * <embed src="http://www.example.com/swfcat.swf"
- * flashvars="facilitator=127.0.0.1:9002&debug=1"></embed>
- * </object>
- *
- * debug=1
- * If set (to any value), show verbose terminal-like output instead of the
- * badge.
- *
- * facilitator=<HOST>:<PORT>
- * The address of the facilitator to use. By default it is
- * DEFAULT_FACILITATOR_ADDR. Both <HOST> and <PORT> must be present.
- *
- * max_clients=<NUM>
- * How many clients to serve concurrently. The default is
- * DEFAULT_MAX_NUM_PROXY_PAIRS.
- *
- * facilitator_poll_interval=<FLOAT>
- * How often to poll the facilitator, in seconds. The default is
- * DEFAULT_FACILITATOR_POLL_INTERVAL. There is a sanity-check minimum of 1.0 s.
- *
- * ratelimit=<FLOAT>(<UNIT>)?|off
- * 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".
- */
-
-package
-{
- import flash.display.Sprite;
- import flash.display.StageAlign;
- import flash.display.StageScaleMode;
- import flash.events.Event;
- import flash.events.IOErrorEvent;
- import flash.events.SecurityErrorEvent;
- import flash.external.ExternalInterface;
- import flash.net.Socket;
- import flash.net.URLLoader;
- import flash.net.URLLoaderDataFormat;
- import flash.net.URLRequest;
- import flash.net.URLRequestMethod;
- import flash.net.URLVariables;
- import flash.text.TextField;
- import flash.text.TextFormat;
- import flash.utils.setTimeout;
-
- public class swfcat extends Sprite
- {
- private const DEFAULT_FACILITATOR_ADDR:Object = {
- host: "tor-facilitator.bamsoftware.com",
- port: 9002
- };
-
- private const DEFAULT_MAX_NUM_PROXY_PAIRS:uint = 10;
-
- /* In seconds. */
- private const DEFAULT_FACILITATOR_POLL_INTERVAL:Number = 10.0;
- private const MIN_FACILITATOR_POLL_INTERVAL:Number = 1.0;
-
- // Bytes per second. Set to undefined to disable limit.
- public static const DEFAULT_RATE_LIMIT:Number = undefined;
- public static const MIN_RATE_LIMIT:Number = 10 * 1024;
- // Seconds.
- private static const RATE_LIMIT_HISTORY:Number = 5.0;
-
- /* TextField for debug output. */
- private var output_text:TextField;
-
- /* UI shown when debug is off. */
- private var badge:Badge;
-
- /* Proxy pairs currently connected (up to max_num_proxy_pairs). */
- private var proxy_pairs:Array;
-
- public var debug:Boolean;
- private var fac_addr:Object;
- private var max_num_proxy_pairs:uint;
- private var facilitator_poll_interval:Number;
-
- public var rate_limit:RateLimit;
-
- public function puts(s:String):void
- {
- if (output_text) {
- output_text.appendText(s + "\n");
- output_text.scrollV = output_text.maxScrollV;
- }
- }
-
- public function swfcat()
- {
- // Absolute positioning.
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.align = StageAlign.TOP_LEFT;
-
- badge = new Badge();
-
- proxy_pairs = [];
-
- // Wait until the query string parameters are loaded.
- this.loaderInfo.addEventListener(Event.COMPLETE, loaderinfo_complete);
- }
-
- private function loaderinfo_complete(e:Event):void
- {
- var tmp:*;
-
- debug = this.loaderInfo.parameters["debug"];
-
- if (debug) {
- output_text = new TextField();
- output_text.width = stage.stageWidth;
- output_text.height = stage.stageHeight;
- output_text.background = true;
- output_text.backgroundColor = 0x001f0f;
- output_text.textColor = 0x44cc44;
- addChild(output_text);
- } else {
- addChild(badge);
- }
-
- puts("Parameters loaded.");
-
- fac_addr = get_param_addr("facilitator", DEFAULT_FACILITATOR_ADDR);
- if (!fac_addr) {
- puts("Error: Facilitator spec must be in the form \"host:port\".");
- return;
- }
-
- tmp = get_param_number("max_clients", DEFAULT_MAX_NUM_PROXY_PAIRS);
- if (tmp == null || tmp < 0) {
- puts("Error: max_clients must be a nonnegative integer.");
- return;
- }
- max_num_proxy_pairs = uint(tmp);
-
- tmp = get_param_timespec("facilitator_poll_interval", DEFAULT_FACILITATOR_POLL_INTERVAL);
- if (tmp == null || tmp < MIN_FACILITATOR_POLL_INTERVAL) {
- puts("Error: facilitator_poll_interval must be a nonnegative number at least " + MIN_FACILITATOR_POLL_INTERVAL + ".");
- return;
- }
- facilitator_poll_interval = Number(tmp);
-
- if (this.loaderInfo.parameters["ratelimit"] == "off")
- tmp = undefined;
- else
- tmp = get_param_byte_count("ratelimit", DEFAULT_RATE_LIMIT);
- if (tmp === undefined) {
- /* No rate limit. */
- } else if (tmp == null || tmp < MIN_FACILITATOR_POLL_INTERVAL) {
- puts("Error: ratelimit must be a nonnegative number at least " + MIN_RATE_LIMIT + ".");
- return;
- }
- if (tmp)
- rate_limit = new BucketRateLimit(Number(tmp) * RATE_LIMIT_HISTORY, RATE_LIMIT_HISTORY);
- else
- rate_limit = new RateUnlimit();
-
- proxy_main();
- }
-
- /* Get an address structure from the given movie parameter, or the given
- default. Returns null on error. */
- private function get_param_addr(param:String, default_addr:Object):Object
- {
- var spec:String;
-
- spec = this.loaderInfo.parameters[param];
- if (spec)
- return parse_addr_spec(spec);
- else
- return default_addr;
- }
-
- /* Get a number from the given movie parameter, or the given default.
- Returns null on error. First check for a null return, and then call
- uint or whatever on the return value if no error. */
- private function get_param_number(param:String, default_val:Number):Object
- {
- var spec:String;
- var val:Number;
-
- spec = this.loaderInfo.parameters[param];
- if (spec) {
- val = Number(spec);
- if (isNaN(val))
- return null;
- else
- return val;
- } else {
- return default_val;
- }
- }
-
- /* Get a floating-point number of seconds from a time specification. The
- only time specification format is a decimal number of seconds.
- Returns null on error. */
- private function get_param_timespec(param:String, default_val:Number):Object
- {
- return get_param_number(param, default_val);
- }
-
- /* Get a count of bytes from a string specification like "100" or
- "1.3m". Returns null on error. */
- private function get_param_byte_count(param:String, default_val:Number):Object
- {
- var spec:String;
-
- spec = this.loaderInfo.parameters[param];
- if (spec)
- return parse_byte_count(spec);
- else
- return default_val;
- }
-
- /* The main logic begins here, after start-up issues are taken care of. */
- private function proxy_main():void
- {
- var fac_url:String;
- var loader:URLLoader;
-
- if (proxy_pairs.length >= max_num_proxy_pairs) {
- setTimeout(proxy_main, uint(facilitator_poll_interval * 1000));
- return;
- }
-
- loader = new URLLoader();
- /* Get the x-www-form-urlencoded values. */
- loader.dataFormat = URLLoaderDataFormat.VARIABLES;
- loader.addEventListener(Event.COMPLETE, fac_complete);
- loader.addEventListener(IOErrorEvent.IO_ERROR, function (e:IOErrorEvent):void {
- puts("Facilitator: I/O error: " + e.text + ".");
- });
- loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function (e:SecurityErrorEvent):void {
- puts("Facilitator: security error: " + e.text + ".");
- });
-
- fac_url = "http://" + encodeURIComponent(fac_addr.host)
- + ":" + encodeURIComponent(fac_addr.port) + "/";
- puts("Facilitator: connecting to " + fac_url + ".");
- loader.load(new URLRequest(fac_url));
- }
-
- private function fac_complete(e:Event):void
- {
- var loader:URLLoader;
- var client_spec:String;
- var relay_spec:String;
- var proxy_pair:Object;
-
- setTimeout(proxy_main, uint(facilitator_poll_interval * 1000));
-
- loader = e.target as URLLoader;
- client_spec = loader.data.client;
- if (client_spec == "") {
- puts("No clients.");
- return;
- } else if (!client_spec) {
- puts("Error: missing \"client\" in response.");
- return;
- }
- relay_spec = loader.data.relay;
- if (!relay_spec) {
- puts("Error: missing \"relay\" in response.");
- return;
- }
- puts("Facilitator: got client:\"" + client_spec + "\" "
- + "relay:\"" + relay_spec + "\".");
-
- try {
- proxy_pair = make_proxy_pair(client_spec, relay_spec);
- } catch (e:ArgumentError) {
- puts("Error: " + e);
- return;
- }
- proxy_pairs.push(proxy_pair);
- proxy_pair.addEventListener(Event.COMPLETE, function(e:Event):void {
- proxy_pair.log("Complete.");
- /* Delete from the list of active proxy pairs. */
- proxy_pairs.splice(proxy_pairs.indexOf(proxy_pair), 1);
- badge.proxy_end();
- });
- proxy_pair.connect();
-
- badge.proxy_begin();
- }
-
- private function make_proxy_pair(client_spec:String, relay_spec:String):ProxyPair
- {
- var proxy_pair:ProxyPair;
- var addr_c:Object;
- var addr_r:Object;
- var s_c:*;
- var s_r:Socket;
-
- addr_r = swfcat.parse_addr_spec(relay_spec);
- if (!addr_r)
- throw new ArgumentError("Relay spec must be in the form \"host:port\".");
-
- addr_c = swfcat.parse_addr_spec(client_spec);
- if (addr_c) {
- s_c = new Socket();
- s_r = new Socket();
- proxy_pair = new ProxyPair(this, s_c, function ():void {
- s_c.connect(addr_c.host, addr_c.port);
- }, s_r, function ():void {
- s_r.connect(addr_r.host, addr_r.port);
- });
- proxy_pair.set_name("<" + addr_c.host + ":" + addr_c.port + ","
- + addr_r.host + ":" + addr_r.port + ">");
- return proxy_pair;
- }
-
- throw new ArgumentError("Can't parse client spec \"" + client_spec + "\".");
- }
-
- /* Parse an address in the form "host:port". Returns an Object with
- keys "host" (String) and "port" (int). Returns null on error. */
- private static function parse_addr_spec(spec:String):Object
- {
- var parts:Array;
- var addr:Object;
-
- parts = spec.split(":", 2);
- if (parts.length != 2 || !parseInt(parts[1]))
- return null;
- addr = {}
- addr.host = parts[0];
- addr.port = parseInt(parts[1]);
-
- return addr;
- }
-
- /* Parse a count of bytes. A suffix of "k", "m", or "g" (or uppercase)
- does what you would think. Returns null on error. */
- private static function parse_byte_count(spec:String):Object
- {
- const UNITS:Object = {
- k: 1024, m: 1024 * 1024, g: 1024 * 1024 * 1024,
- K: 1024, M: 1024 * 1024, G: 1024 * 1024 * 1024
- };
- var count:Number, units:Object;
- var matches:Array;
-
- matches = spec.match(/^(\d+(?:\.\d*)?)(\w*)$/);
- if (matches == null)
- return null;
-
- count = Number(matches[1]);
- if (isNaN(count))
- return null;
-
- if (matches[2] == "") {
- units = 1;
- } else {
- units = UNITS[matches[2]];
- if (units == null)
- return null;
- }
-
- return count * Number(units);
- }
- }
-}
-
-import flash.events.MouseEvent;
-import flash.net.navigateToURL;
-import flash.net.URLRequest;
-import flash.text.TextField;
-import flash.text.TextFormat;
-import flash.utils.getTimer;
-
-class Badge extends flash.display.Sprite
-{
- private const FLASHPROXY_INFO_URL:String = "https://crypto.stanford.edu/flashproxy/";
-
- /* Number of proxy pairs currently connected. */
- private var num_proxy_pairs:int = 0;
- /* Number of proxy pairs ever connected. */
- private var total_proxy_pairs:int = 0;
-
- [Embed(source="badge.png")]
- private var BadgeImage:Class;
- private var tot_client_count_tf:TextField;
- private var tot_client_count_fmt:TextFormat;
- private var cur_client_count_tf:TextField;
- private var cur_client_count_fmt:TextFormat;
-
- public function Badge()
- {
- /* Setup client counter for badge. */
- tot_client_count_fmt = new TextFormat();
- tot_client_count_fmt.color = 0xFFFFFF;
- tot_client_count_fmt.align = "center";
- tot_client_count_fmt.font = "courier-new";
- tot_client_count_fmt.bold = true;
- tot_client_count_fmt.size = 10;
- tot_client_count_tf = new TextField();
- tot_client_count_tf.width = 20;
- tot_client_count_tf.height = 17;
- tot_client_count_tf.background = false;
- tot_client_count_tf.defaultTextFormat = tot_client_count_fmt;
- tot_client_count_tf.x=47;
- tot_client_count_tf.y=0;
-
- cur_client_count_fmt = new TextFormat();
- cur_client_count_fmt.color = 0xFFFFFF;
- cur_client_count_fmt.align = "center";
- cur_client_count_fmt.font = "courier-new";
- cur_client_count_fmt.bold = true;
- cur_client_count_fmt.size = 10;
- cur_client_count_tf = new TextField();
- cur_client_count_tf.width = 20;
- cur_client_count_tf.height = 17;
- cur_client_count_tf.background = false;
- cur_client_count_tf.defaultTextFormat = cur_client_count_fmt;
- cur_client_count_tf.x=47;
- cur_client_count_tf.y=6;
-
- addChild(new BadgeImage());
- addChild(tot_client_count_tf);
- addChild(cur_client_count_tf);
-
- /* Update the client counter on badge. */
- update_client_count();
-
- addEventListener(MouseEvent.CLICK, mouse_clicked);
- }
-
- public function proxy_begin():void
- {
- num_proxy_pairs++;
- total_proxy_pairs++;
- update_client_count();
- }
-
- public function proxy_end():void
- {
- num_proxy_pairs--;
- update_client_count();
- }
-
- private function update_client_count():void
- {
- /* Update total client count. */
- if (String(total_proxy_pairs).length == 1)
- tot_client_count_tf.text = "0" + String(total_proxy_pairs);
- else
- tot_client_count_tf.text = String(total_proxy_pairs);
-
- /* Update current client count. */
- cur_client_count_tf.text = "";
- for(var i:Number = 0; i < num_proxy_pairs; i++)
- cur_client_count_tf.appendText(".");
- }
-
- /* Show a web page with detailed information when the badge is clicked. */
- private function mouse_clicked(e:MouseEvent):void
- {
- try {
- navigateToURL(new URLRequest(FLASHPROXY_INFO_URL));
- } catch (err:Error) {
- }
- }
-}
-
-class RateLimit
-{
- public function RateLimit()
- {
- }
-
- public function update(n:Number):Boolean
- {
- return true;
- }
-
- public function when():Number
- {
- return 0.0;
- }
-
- public function is_limited():Boolean
- {
- return false;
- }
-}
-
-class RateUnlimit extends RateLimit
-{
- public function RateUnlimit()
- {
- }
-
- public override function update(n:Number):Boolean
- {
- return true;
- }
-
- public override function when():Number
- {
- return 0.0;
- }
-
- public override function is_limited():Boolean
- {
- return false;
- }
-}
-
-class BucketRateLimit extends RateLimit
-{
- private var amount:Number;
- private var capacity:Number;
- private var time:Number;
- private var last_update:uint;
-
- public function BucketRateLimit(capacity:Number, time:Number)
- {
- this.amount = 0.0;
- /* capacity / time is the rate we are aiming for. */
- this.capacity = capacity;
- this.time = time;
- this.last_update = getTimer();
- }
-
- private function age():void
- {
- var now:uint;
- var delta:Number;
-
- now = getTimer();
- delta = (now - last_update) / 1000.0;
- last_update = now;
-
- amount -= delta * capacity / time;
- if (amount < 0.0)
- amount = 0.0;
- }
-
- public override function update(n:Number):Boolean
- {
- age();
- amount += n;
-
- return amount <= capacity;
- }
-
- public override function when():Number
- {
- age();
- return (amount - capacity) / (capacity / time);
- }
-
- public override function is_limited():Boolean
- {
- age();
- return amount > capacity;
- }
-}
More information about the tor-commits
mailing list