commit d44dfc5db8acc391130579bdf260dc3e1a3610ed Author: Kathy Brade brade@torproject.org Date: Tue Apr 9 11:21:45 2013 -0400
Change bridge into a textbox and make it functional. --- src/chrome/content/network-settings.js | 88 +++++++++++++++++-------- src/chrome/content/network-settings.xul | 23 +++---- src/chrome/locale/en/network-settings.dtd | 5 +- src/chrome/locale/en/torcontroller.properties | 1 + 4 files changed, 72 insertions(+), 45 deletions(-)
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js index 73c10f1..98d4ed7 100644 --- a/src/chrome/content/network-settings.js +++ b/src/chrome/content/network-settings.js @@ -3,6 +3,8 @@ // // vim: set sw=2 sts=2 ts=8 et syntax=javascript:
+// TODO: if clean start and "Unable to read Tor settings" error is displayed, we should not bootstrap Tor or start the browser. + const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; @@ -405,15 +407,21 @@ function applyFirewallSettings() // Returns true if settings were successfully applied. function applyBridgeSettings() { - // TODO: validate user-entered data. See Vidalia's NetworkPage::save() - var settings = {}; settings[kTorConfKeyUseBridges] = null; settings[kTorConfKeyBridgeList] = null;
var useBridges = getElemValue(kUseBridgesCheckbox, false); - var bridgeList = getElemValue(kBridgeList, null); + var bridgeStr = getElemValue(kBridgeList, null);
+ var bridgeList = parseAndValidateBridges(bridgeStr); + if (useBridges && !bridgeList) + { + reportValidationError("error_bridges_missing"); + return false; + } + + setElemValue(kBridgeList, bridgeList); if (useBridges && bridgeList) { settings[kTorConfKeyUseBridges] = true; @@ -424,6 +432,42 @@ function applyBridgeSettings() }
+// Returns an array or null. +function parseAndValidateBridges(aStr) +{ + if (!aStr) + return null; + + var resultStr = aStr; + resultStr = resultStr.replace(/bridge/gi, ""); // Remove "bridge" everywhere. + resultStr = resultStr.replace(/\r\n/g, "\n"); // Convert \r\n pairs into \n. + resultStr = resultStr.replace(/\r/g, "\n"); // Convert \r into \n. + resultStr = resultStr.replace(/\n\n/g, "\n"); // Condense blank lines. + + var resultArray = new Array; + var tmpArray = resultStr.split('\n'); + for (var i = 0; i < tmpArray.length; i++) + { + let s = tmpArray[i].trim(); // Remove extraneous whitespace. + if (s.indexOf(' ') >= 0) + { + // Handle a space-separated list of bridge specs. + var tmpArray2 = s.split(' '); + for (var j = 0; j < tmpArray2.length; ++j) + { + let s2 = tmpArray2[j]; + if (s2.length > 0) + resultArray.push(s2); + } + } + else if (s.length > 0) + resultArray.push(s); + } + + return (0 == resultArray.length) ? null : resultArray; +} + + // Returns true if successful. function setConfAndReportErrors(aSettingsObj) { @@ -472,28 +516,27 @@ function setElemValue(aID, aValue) toggleElemUI(elem); break; case "textbox": - case "menulist": - elem.value = (aValue) ? aValue : ""; - break; - case "listbox": - // Remove all existing items. - while (elem.itemCount > 0) - elem.removeItemAt(0); - - // Add new items. - if (aValue && Array.isArray(aValue)) + var s = aValue; + if (Array.isArray(aValue)) { + s = ""; for (var i = 0; i < aValue.length; ++i) - elem.appendItem(aValue[i]); + { + if (s.length > 0) + s += '\n'; + s += aValue[i]; + } } + // fallthru + case "menulist": + elem.value = (s) ? s : ""; break; } } }
-// Returns a Boolean (for checkboxes), a string (textbox and menulist), or an -// array of strings (listbox). +// Returns a Boolean (for checkboxes) or a string (textbox and menulist). // Leading and trailing white space is trimmed from strings. function getElemValue(aID, aDefaultValue) { @@ -510,19 +553,6 @@ function getElemValue(aID, aDefaultValue) case "menulist": rv = elem.value; break; - case "listbox": - rv = elem.checked; - if (elem.itemCount > 0) - { - rv = []; - for (var i = 0; i < elem.itemCount; ++i) - { - var item = elem.getItemAtIndex(i); - if (item.label) - rv.push(item.label.trim()); - } - } - break; } }
diff --git a/src/chrome/content/network-settings.xul b/src/chrome/content/network-settings.xul index e1d839e..5daabac 100644 --- a/src/chrome/content/network-settings.xul +++ b/src/chrome/content/network-settings.xul @@ -110,22 +110,21 @@ oncommand="toggleElemUI(this);" /> <groupbox id="bridgeSpecificSettings"> <hbox> - <textbox id="addBridgeText" style="width: 320px" /> - <button id="addBridgeBtn" label="&addButton;" oncommand="AddBridge();" - style="width: 20px !important" /> - </hbox> - <hbox> - <listbox id="bridgeList" rows="4" style="width: 320px" /> + <vbox flex="1"> + <label value="&torsettings.useBridges.label;" control="bridgeList"/> + <textbox id="bridgeList" multiline="true" rows="4" /> + </vbox> +<!-- <vbox> - <button id="deleteBridge" label="&deleteButton;" style="width: 20px" - oncommand="DeleteBridge();"/> - <button id="copyBridgeList" label="&todo;" style="width: 20px" + <button id="copyBridgeList" label="Copy TODO" style="width: 20px" oncommand="copyBridgeList();"/> + <button id="pasteBridgeList" label="Paste TODO" style="width: 20px" + oncommand="pasteBridgeList();"/> + <button id="howToFindBridges" label="How can I find bridges? TODO" style="width: 20px" + oncommand="findBridgeList();"/> </vbox> - </hbox> -<!-- - <a href="TODO">How can I find bridges?</a> --> + </hbox> </groupbox> </vbox> </vbox> diff --git a/src/chrome/locale/en/network-settings.dtd b/src/chrome/locale/en/network-settings.dtd index 1fc15bb..5d5fa99 100644 --- a/src/chrome/locale/en/network-settings.dtd +++ b/src/chrome/locale/en/network-settings.dtd @@ -17,7 +17,4 @@ <!ENTITY torsettings.firewall.checkbox "My firewall only lets me connect to certain ports"> <!ENTITY torsettings.firewall.allowedPorts "Allowed Ports:"> <!ENTITY torsettings.useBridges.checkbox "My ISP blocks connections to the Tor network"> - -<!ENTITY addButton "+"> -<!ENTITY deleteButton "-"> -<!ENTITY todo "TODO"> +<!ENTITY torsettings.useBridges.label "Enter one or more bridge relays in the form address:port."> diff --git a/src/chrome/locale/en/torcontroller.properties b/src/chrome/locale/en/torcontroller.properties index 88882db..9331ecf 100644 --- a/src/chrome/locale/en/torcontroller.properties +++ b/src/chrome/locale/en/torcontroller.properties @@ -19,6 +19,7 @@ torlauncher.ensure_tor_is_running=Please ensure that Tor is running.
torlauncher.error_proxy_addr_missing=You must specify both an IP address or hostname and a port number to configure Tor to use a proxy to access the Internet. torlauncher.error_proxy_type_missing=You must select the proxy type. +torlauncher.error_bridges_missing=You must specify one or more bridges.
torlauncher.connect=Connect torlauncher.quit=Quit
tor-commits@lists.torproject.org