mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
125 lines
3 KiB
JavaScript
125 lines
3 KiB
JavaScript
/* global TESTING, Util, Params, Config, UI, Broker, Snowflake */
|
|
|
|
/*
|
|
UI
|
|
*/
|
|
|
|
class DebugUI extends UI {
|
|
|
|
constructor() {
|
|
super();
|
|
// Setup other DOM handlers if it's debug mode.
|
|
this.$status = document.getElementById('status');
|
|
this.$msglog = document.getElementById('msglog');
|
|
this.$msglog.value = '';
|
|
}
|
|
|
|
// Status bar
|
|
setStatus(msg) {
|
|
var txt;
|
|
txt = document.createTextNode('Status: ' + msg);
|
|
while (this.$status.firstChild) {
|
|
this.$status.removeChild(this.$status.firstChild);
|
|
}
|
|
return this.$status.appendChild(txt);
|
|
}
|
|
|
|
setActive(connected) {
|
|
super.setActive(connected);
|
|
return this.$msglog.className = connected ? 'active' : '';
|
|
}
|
|
|
|
log(msg) {
|
|
// Scroll to latest
|
|
this.$msglog.value += msg + '\n';
|
|
return this.$msglog.scrollTop = this.$msglog.scrollHeight;
|
|
}
|
|
|
|
}
|
|
|
|
// DOM elements references.
|
|
DebugUI.prototype.$msglog = null;
|
|
|
|
DebugUI.prototype.$status = null;
|
|
|
|
/*
|
|
Entry point.
|
|
*/
|
|
|
|
var snowflake, query, debug, ui, silenceNotifications, log, dbg, init;
|
|
|
|
(function() {
|
|
|
|
if (((typeof TESTING === "undefined" || TESTING === null) || !TESTING) && !Util.featureDetect()) {
|
|
console.log('webrtc feature not detected. shutting down');
|
|
return;
|
|
}
|
|
|
|
snowflake = null;
|
|
|
|
query = new URLSearchParams(location.search);
|
|
|
|
debug = Params.getBool(query, 'debug', false);
|
|
|
|
silenceNotifications = Params.getBool(query, 'silent', false);
|
|
|
|
// Log to both console and UI if applicable.
|
|
// Requires that the snowflake and UI objects are hooked up in order to
|
|
// log to console.
|
|
log = function(msg) {
|
|
console.log('Snowflake: ' + msg);
|
|
return snowflake != null ? snowflake.ui.log(msg) : void 0;
|
|
};
|
|
|
|
dbg = function(msg) {
|
|
if (debug || ((snowflake != null ? snowflake.ui : void 0) instanceof DebugUI)) {
|
|
return log(msg);
|
|
}
|
|
};
|
|
|
|
init = function() {
|
|
var broker, config, ui;
|
|
config = new Config;
|
|
if ('off' !== query['ratelimit']) {
|
|
config.rateLimitBytes = Params.getByteCount(query, 'ratelimit', config.rateLimitBytes);
|
|
}
|
|
ui = null;
|
|
if (document.getElementById('status') !== null) {
|
|
ui = new DebugUI();
|
|
} else {
|
|
ui = new UI();
|
|
}
|
|
broker = new Broker(config);
|
|
snowflake = new Snowflake(config, ui, broker);
|
|
log('== snowflake proxy ==');
|
|
if (Util.snowflakeIsDisabled(config.cookieName)) {
|
|
// Do not activate the proxy if any number of conditions are true.
|
|
log('Currently not active.');
|
|
return;
|
|
}
|
|
// Otherwise, begin setting up WebRTC and acting as a proxy.
|
|
dbg('Contacting Broker at ' + broker.url);
|
|
snowflake.setRelayAddr(config.relayAddr);
|
|
return snowflake.beginWebRTC();
|
|
};
|
|
|
|
// Notification of closing tab with active proxy.
|
|
window.onbeforeunload = function() {
|
|
if (
|
|
!silenceNotifications &&
|
|
snowflake !== null &&
|
|
ui.active
|
|
) {
|
|
return Snowflake.MESSAGE.CONFIRMATION;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
window.onunload = function() {
|
|
if (snowflake !== null) { snowflake.disable(); }
|
|
return null;
|
|
};
|
|
|
|
window.onload = init;
|
|
|
|
}());
|