Files
grin-web-wallet/scripts/tor_proxy.js
2024-12-20 18:08:44 -08:00

229 lines
6.1 KiB
JavaScript
Executable File

// Use strict
"use strict";
// Classes
// TorProxy class
class TorProxy {
// Public
// Constructor
constructor(settings) {
// Set settings
this.settings = settings;
// Set use custom Tor proxy to setting's default value
this.useCustomTorProxy = TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_DEFAULT_VALUE;
// Set custom Tor proxy address to setting's default value
this.customTorProxyAddress = TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_DEFAULT_VALUE;
// Set self
var self = this;
// Once database is initialized
Database.onceInitialized(function() {
// Return promise
return new Promise(function(resolve, reject) {
// Return creating settings
return Promise.all([
// Use custom Tor proxy setting
self.settings.createValue(TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_NAME, TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_DEFAULT_VALUE),
// Custom Tor proxy address setting
self.settings.createValue(TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_NAME, TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_DEFAULT_VALUE)
]).then(function() {
// Initialize settings
var settings = [
// Use custom Tor proxy setting
TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_NAME,
// Custom Tor proxy address setting
TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_NAME
];
// Return getting settings' values
return Promise.all(settings.map(function(setting) {
// Return getting setting's value
return self.settings.getValue(setting);
})).then(function(settingValues) {
// Set use custom Tor proxy to setting's value
self.useCustomTorProxy = settingValues[settings.indexOf(TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_NAME)];
// Set custom Tor proxy address to setting's value
self.customTorProxyAddress = settingValues[settings.indexOf(TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_NAME)];
// Resolve
resolve();
// Catch errors
}).catch(function(error) {
// Reject
reject();
});
// Catch errors
}).catch(function(error) {
// Reject
reject();
});
});
});
// Settings change event
$(this.settings).on(Settings.CHANGE_EVENT, function(event, setting) {
// Initialize Tor proxy setting changes
var torProxySettingChanged = false;
// Check what setting was changes
switch(setting[Settings.DATABASE_SETTING_NAME]) {
// Use custom Tor proxy setting
case TorProxy.SETTINGS_USE_CUSTOM_TOR_PROXY_NAME:
// Set use custom Tor proxy to setting's value
self.useCustomTorProxy = setting[Settings.DATABASE_VALUE_NAME];
// Set Tor Proxy settings changed
torProxySettingChanged = true;
// Break
break;
// Custom Tor proxy address setting
case TorProxy.SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_NAME:
// Set custom Tor proxy address to setting's value
self.customTorProxyAddress = setting[Settings.DATABASE_VALUE_NAME];
// Set Tor Proxy settings changed
torProxySettingChanged = true;
// Break
break;
}
// Check if a Tor proxy setting was changed
if(torProxySettingChanged === true) {
// Trigger settings change event
$(self).trigger(TorProxy.SETTINGS_CHANGE_EVENT);
}
});
}
// Using custom Tor proxy
usingCustomTorProxy() {
// Return if using a custom Tor proxy
return this.useCustomTorProxy === true;
}
// Get address
getAddress() {
// Check if not using a custom Tor proxy
if(this.usingCustomTorProxy() === false) {
// Return default Tor Proxy address
return TorProxy.DEFAULT_TOR_PROXY_ADDRESS;
}
// Otherwise
else {
// Get custom Tor proxy address
var customTorProxyAddress = this.customTorProxyAddress.trim();
// Check if custom Tor proxy address isn't set
if(customTorProxyAddress["length"] === 0) {
// Return custom Tor proxy address
return customTorProxyAddress;
}
// Otherwise
else {
// Check if custom Tor proxy address doesn't have a protocol
if(Common.urlContainsProtocol(customTorProxyAddress) === false) {
// Add protocol to custom Tor proxy address
customTorProxyAddress = Common.HTTP_PROTOCOL + "//" + customTorProxyAddress;
}
// Return custom Tor proxy address upgraded if applicable and with a trailing slash
return Common.removeTrailingSlashes(Common.upgradeApplicableInsecureUrl(customTorProxyAddress)) + "/";
}
}
}
// Settings change event
static get SETTINGS_CHANGE_EVENT() {
// Return settings change event
return "TorProxySettingsChangeEvent";
}
// Private
// Settings use custom Tor proxy name
static get SETTINGS_USE_CUSTOM_TOR_PROXY_NAME() {
// Return settings use custom Tor proxy name
return "Use Custom Tor Proxy";
}
// Settings use custom Tor proxy default value
static get SETTINGS_USE_CUSTOM_TOR_PROXY_DEFAULT_VALUE() {
// Return settings use custom Tor proxy default value
return false;
}
// Settings custom Tor proxy address name
static get SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_NAME() {
// Return settings custom Tor proxy address name
return "Custom Tor Proxy Address";
}
// Settings custom Tor proxy address default value
static get SETTINGS_CUSTOM_TOR_PROXY_ADDRESS_DEFAULT_VALUE() {
// Return settings custom Tor proxy address default value
return "";
}
// Default Tor proxy address
static get DEFAULT_TOR_PROXY_ADDRESS() {
// Set server
var server = (Common.isExtension() === true || location["protocol"] === Common.FILE_PROTOCOL) ? new URL(HTTPS_SERVER_ADDRESS) : location;
// Return default Tor proxy address
return ((server["protocol"] === Common.HTTPS_PROTOCOL) ? Common.HTTPS_PROTOCOL : Common.HTTP_PROTOCOL) + "//" + server["hostname"] + "/tor/";
}
}
// Main function
// Set global object's Tor proxy
globalThis["TorProxy"] = TorProxy;