[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [Git][tpo/applications/tor-browser][tor-browser-102.10.0esr-12.5-1] 2 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...



Title: GitLab

Pier Angelo Vendrame pushed to branch tor-browser-102.10.0esr-12.5-1 at The Tor Project / Applications / Tor Browser

Commits:

  • d2c3dcac
    by Henry Wilkes at 2023-04-17T15:10:44+01:00
    fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
    
    Bug 41617 - Tidy up:
    
    - Lint builtinBridgeDialog.jsm and connectionPane.js.
    - Use TorConnect.canBeginBootstrap.
    - Always start Bootstrapping with the built in bridges, regardless of a
      previous errors.
    - Wait until settings have been applied before starting bootstrap.
    - Use new string ids for the new strings. Mark the old ones for removal.
    - Clean up unused properties.
    
  • 64ea04a6
    by Henry Wilkes at 2023-04-17T15:23:13+01:00
    fixup! Add TorStrings module for localization
    
    Bug 41617 - Tidy up:
    
    - Use new string ids for the new strings. Mark the old ones for removal.
    - Use "website" rather than "web site".
    

4 changed files:

Changes:

  • browser/components/torpreferences/content/builtinBridgeDialog.jsm
    1 1
     "use strict";
    
    2 2
     
    
    3
    -const obs = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
    
    4
    -
    
    5 3
     var EXPORTED_SYMBOLS = ["BuiltinBridgeDialog"];
    
    6 4
     
    
    5
    +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
    
    6
    +
    
    7 7
     const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
    
    8 8
     
    
    9 9
     const {
    
    10 10
       TorSettings,
    
    11
    -  TorSettingsTopics,
    
    12 11
       TorBridgeSource,
    
    13 12
       TorBuiltinBridgeTypes,
    
    14 13
     } = ChromeUtils.import("resource:///modules/TorSettings.jsm");
    
    15 14
     
    
    16
    -const {
    
    17
    -  TorConnect,
    
    18
    -  TorConnectTopics,
    
    19
    -  TorConnectState,
    
    20
    -} = ChromeUtils.import("resource:///modules/TorConnect.jsm");
    
    15
    +const { TorConnect, TorConnectTopics } = ChromeUtils.import(
    
    16
    +  "resource:///modules/TorConnect.jsm"
    
    17
    +);
    
    21 18
     
    
    22 19
     class BuiltinBridgeDialog {
    
    23 20
       constructor(onSubmit) {
    
    24 21
         this._onSubmit_ = onSubmit;
    
    25 22
         this._dialog = null;
    
    26
    -    this._window = null;
    
    27 23
         this._acceptButton = null;
    
    28 24
       }
    
    29 25
     
    
    30 26
       static get selectors() {
    
    31 27
         return {
    
    32
    -      header: "#torPreferences-builtinBridge-header",
    
    33 28
           description: "#torPreferences-builtinBridge-description",
    
    34 29
           radiogroup: "#torPreferences-builtinBridge-typeSelection",
    
    35 30
           obfsRadio: "#torPreferences-builtinBridges-radioObfs",
    
    ... ... @@ -38,22 +33,20 @@ class BuiltinBridgeDialog {
    38 33
           snowflakeDescr: "#torPreferences-builtinBridges-descrSnowflake",
    
    39 34
           meekAzureRadio: "#torPreferences-builtinBridges-radioMeekAzure",
    
    40 35
           meekAzureDescr: "#torPreferences-builtinBridges-descrMeekAzure",
    
    41
    -      acceptButton: "accept" /* not really a selector but a key for dialog's getButton */,
    
    42 36
         };
    
    43 37
       }
    
    44 38
     
    
    45 39
       _populateXUL(window, aDialog) {
    
    46 40
         const selectors = BuiltinBridgeDialog.selectors;
    
    47 41
     
    
    48
    -    this._window = window;
    
    49 42
         this._dialog = aDialog;
    
    50 43
         const dialogWin = this._dialog.parentElement;
    
    51 44
         dialogWin.setAttribute("title", TorStrings.settings.builtinBridgeHeader);
    
    52 45
     
    
    53 46
         this._dialog.querySelector(selectors.description).textContent =
    
    54
    -      TorStrings.settings.builtinBridgeDescription;
    
    47
    +      TorStrings.settings.builtinBridgeDescription2;
    
    55 48
     
    
    56
    -    this._acceptButton = this._dialog.getButton(selectors.acceptButton);
    
    49
    +    this._acceptButton = this._dialog.getButton("accept");
    
    57 50
         this.onTorStateChange();
    
    58 51
     
    
    59 52
         let radioGroup = this._dialog.querySelector(selectors.radiogroup);
    
    ... ... @@ -63,19 +56,19 @@ class BuiltinBridgeDialog {
    63 56
             elemRadio: this._dialog.querySelector(selectors.obfsRadio),
    
    64 57
             elemDescr: this._dialog.querySelector(selectors.obfsDescr),
    
    65 58
             label: TorStrings.settings.builtinBridgeObfs4Title,
    
    66
    -        descr: TorStrings.settings.builtinBridgeObfs4Description,
    
    59
    +        descr: TorStrings.settings.builtinBridgeObfs4Description2,
    
    67 60
           },
    
    68 61
           snowflake: {
    
    69 62
             elemRadio: this._dialog.querySelector(selectors.snowflakeRadio),
    
    70 63
             elemDescr: this._dialog.querySelector(selectors.snowflakeDescr),
    
    71 64
             label: TorStrings.settings.builtinBridgeSnowflake,
    
    72
    -        descr: TorStrings.settings.builtinBridgeSnowflakeDescription,
    
    65
    +        descr: TorStrings.settings.builtinBridgeSnowflakeDescription2,
    
    73 66
           },
    
    74 67
           "meek-azure": {
    
    75 68
             elemRadio: this._dialog.querySelector(selectors.meekAzureRadio),
    
    76 69
             elemDescr: this._dialog.querySelector(selectors.meekAzureDescr),
    
    77 70
             label: TorStrings.settings.builtinBridgeMeekAzure,
    
    78
    -        descr: TorStrings.settings.builtinBridgeMeekAzureDescription,
    
    71
    +        descr: TorStrings.settings.builtinBridgeMeekAzureDescription2,
    
    79 72
           },
    
    80 73
         };
    
    81 74
     
    
    ... ... @@ -96,8 +89,8 @@ class BuiltinBridgeDialog {
    96 89
           radioGroup.selectedItem = null;
    
    97 90
         }
    
    98 91
     
    
    99
    -    this._dialog.addEventListener("dialogaccept", e => {
    
    100
    -      this.onSubmit(radioGroup.value);
    
    92
    +    this._dialog.addEventListener("dialogaccept", () => {
    
    93
    +      this.onSubmit(radioGroup.value, TorConnect.canBeginBootstrap);
    
    101 94
         });
    
    102 95
         this._dialog.addEventListener("dialoghelp", e => {
    
    103 96
           window.top.openTrustedLinkIn(
    
    ... ... @@ -110,14 +103,20 @@ class BuiltinBridgeDialog {
    110 103
         this._dialog.style.minWidth = "0";
    
    111 104
         this._dialog.style.minHeight = "0";
    
    112 105
     
    
    113
    -    obs.addObserver(this, TorConnectTopics.StateChange);
    
    106
    +    Services.obs.addObserver(this, TorConnectTopics.StateChange);
    
    114 107
       }
    
    115 108
     
    
    116 109
       onTorStateChange() {
    
    117
    -    if (TorConnect.state === TorConnectState.Configuring) {
    
    118
    -      this._acceptButton.setAttribute("label", TorStrings.settings.bridgeButtonConnect);
    
    110
    +    if (TorConnect.canBeginBootstrap) {
    
    111
    +      this._acceptButton.setAttribute(
    
    112
    +        "label",
    
    113
    +        TorStrings.settings.bridgeButtonConnect
    
    114
    +      );
    
    119 115
         } else {
    
    120
    -      this._acceptButton.setAttribute("label", TorStrings.settings.bridgeButtonAccept);
    
    116
    +      this._acceptButton.setAttribute(
    
    117
    +        "label",
    
    118
    +        TorStrings.settings.bridgeButtonAccept
    
    119
    +      );
    
    121 120
         }
    
    122 121
       }
    
    123 122
     
    
    ... ... @@ -130,25 +129,26 @@ class BuiltinBridgeDialog {
    130 129
     
    
    131 130
       observe(subject, topic, data) {
    
    132 131
         switch (topic) {
    
    133
    -      case TorConnectTopics.StateChange: {
    
    132
    +      case TorConnectTopics.StateChange:
    
    134 133
             this.onTorStateChange();
    
    135 134
             break;
    
    136
    -      }
    
    137 135
         }
    
    138 136
       }
    
    139 137
     
    
    140 138
       close() {
    
    141 139
         // unregister our observer topics
    
    142
    -    obs.removeObserver(this, TorConnectTopics.StateChange);
    
    140
    +    Services.obs.removeObserver(this, TorConnectTopics.StateChange);
    
    143 141
       }
    
    144 142
     
    
    145 143
       openDialog(gSubDialog) {
    
    146 144
         gSubDialog.open(
    
    147 145
           "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml",
    
    148
    -      { features: "resizable=yes",
    
    146
    +      {
    
    147
    +        features: "resizable=yes",
    
    149 148
             closingCallback: () => {
    
    150 149
               this.close();
    
    151
    -        },},
    
    150
    +        },
    
    151
    +      },
    
    152 152
           this
    
    153 153
         );
    
    154 154
       }
    

  • browser/components/torpreferences/content/connectionPane.js
    ... ... @@ -323,7 +323,7 @@ const gConnectionPane = (function() {
    323 323
           prefpane.querySelector(selectors.bridges.header).innerText =
    
    324 324
             TorStrings.settings.bridgesHeading;
    
    325 325
           prefpane.querySelector(selectors.bridges.description).textContent =
    
    326
    -        TorStrings.settings.bridgesDescription;
    
    326
    +        TorStrings.settings.bridgesDescription2;
    
    327 327
           {
    
    328 328
             const learnMore = prefpane.querySelector(selectors.bridges.learnMore);
    
    329 329
             learnMore.setAttribute("value", TorStrings.settings.learnMore);
    
    ... ... @@ -424,7 +424,8 @@ const gConnectionPane = (function() {
    424 424
             selectors.bridges.currentHeader
    
    425 425
           );
    
    426 426
           bridgeHeader.textContent = TorStrings.settings.bridgeCurrent;
    
    427
    -      prefpane.querySelector(selectors.bridges.switchLabel).textContent = TorStrings.settings.allBridgesEnabled;
    
    427
    +      prefpane.querySelector(selectors.bridges.switchLabel).textContent =
    
    428
    +        TorStrings.settings.allBridgesEnabled;
    
    428 429
           const bridgeSwitch = prefpane.querySelector(selectors.bridges.switch);
    
    429 430
           bridgeSwitch.addEventListener("change", () => {
    
    430 431
             TorSettings.bridges.enabled = bridgeSwitch.checked;
    
    ... ... @@ -887,34 +888,34 @@ const gConnectionPane = (function() {
    887 888
             });
    
    888 889
           }
    
    889 890
     
    
    890
    -      {
    
    891
    -        this._confirmBridgeRemoval = () => {
    
    892
    -          const aParentWindow = Services.wm.getMostRecentWindow("navigator:browser");
    
    893
    -
    
    894
    -          const ps = Services.prompt;
    
    895
    -          const btnFlags =
    
    896
    -            ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING +
    
    897
    -            ps.BUTTON_POS_0_DEFAULT +
    
    898
    -            ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL;
    
    899
    -
    
    900
    -          const notUsed = { value: false };
    
    901
    -          const btnIndex = ps.confirmEx(
    
    902
    -            aParentWindow,
    
    903
    -            TorStrings.settings.bridgeRemoveAllDialogTitle,
    
    904
    -            TorStrings.settings.bridgeRemoveAllDialogDescription,
    
    905
    -            btnFlags,
    
    906
    -            TorStrings.settings.remove,
    
    907
    -            null,
    
    908
    -            null,
    
    909
    -            null,
    
    910
    -            notUsed
    
    911
    -          );
    
    891
    +      this._confirmBridgeRemoval = () => {
    
    892
    +        const aParentWindow = Services.wm.getMostRecentWindow(
    
    893
    +          "navigator:browser"
    
    894
    +        );
    
    912 895
     
    
    913
    -          if (btnIndex === 0) {
    
    914
    -            this.onRemoveAllBridges();
    
    915
    -          }
    
    916
    -        };
    
    917
    -      }
    
    896
    +        const ps = Services.prompt;
    
    897
    +        const btnFlags =
    
    898
    +          ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING +
    
    899
    +          ps.BUTTON_POS_0_DEFAULT +
    
    900
    +          ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL;
    
    901
    +
    
    902
    +        const notUsed = { value: false };
    
    903
    +        const btnIndex = ps.confirmEx(
    
    904
    +          aParentWindow,
    
    905
    +          TorStrings.settings.bridgeRemoveAllDialogTitle,
    
    906
    +          TorStrings.settings.bridgeRemoveAllDialogDescription,
    
    907
    +          btnFlags,
    
    908
    +          TorStrings.settings.remove,
    
    909
    +          null,
    
    910
    +          null,
    
    911
    +          null,
    
    912
    +          notUsed
    
    913
    +        );
    
    914
    +
    
    915
    +        if (btnIndex === 0) {
    
    916
    +          this.onRemoveAllBridges();
    
    917
    +        }
    
    918
    +      };
    
    918 919
     
    
    919 920
           // Advanced setup
    
    920 921
           prefpane.querySelector(selectors.advanced.header).innerText =
    
    ... ... @@ -1058,25 +1059,41 @@ const gConnectionPane = (function() {
    1058 1059
         },
    
    1059 1060
     
    
    1060 1061
         onAddBuiltinBridge() {
    
    1061
    -      const builtinBridgeDialog = new BuiltinBridgeDialog(aBridgeType => {
    
    1062
    -        if (!aBridgeType) {
    
    1063
    -          TorSettings.bridges.enabled = false;
    
    1064
    -          TorSettings.bridges.builtin_type = "";
    
    1065
    -        } else {
    
    1066
    -          TorSettings.bridges.enabled = true;
    
    1067
    -          TorSettings.bridges.source = TorBridgeSource.BuiltIn;
    
    1068
    -          TorSettings.bridges.builtin_type = aBridgeType;
    
    1069
    -        }
    
    1070
    -        TorSettings.saveToPrefs();
    
    1071
    -        TorSettings.applySettings().then(result => {
    
    1062
    +      const builtinBridgeDialog = new BuiltinBridgeDialog(
    
    1063
    +        async (bridgeType, connect) => {
    
    1064
    +          if (!bridgeType) {
    
    1065
    +            TorSettings.bridges.enabled = false;
    
    1066
    +            TorSettings.bridges.builtin_type = "";
    
    1067
    +          } else {
    
    1068
    +            TorSettings.bridges.enabled = true;
    
    1069
    +            TorSettings.bridges.source = TorBridgeSource.BuiltIn;
    
    1070
    +            TorSettings.bridges.builtin_type = bridgeType;
    
    1071
    +          }
    
    1072
    +          TorSettings.saveToPrefs();
    
    1073
    +          await TorSettings.applySettings();
    
    1074
    +
    
    1072 1075
               this._populateBridgeCards();
    
    1073
    -        });
    
    1074
    -        // The bridge dialog button is "connect" when Tor is not bootstrapped,
    
    1075
    -        // so do the connect
    
    1076
    -        if (TorConnect.state == TorConnectState.Configuring) {
    
    1077
    -          TorConnect.openTorConnect({ beginBootstrap: true })
    
    1076
    +
    
    1077
    +          // The bridge dialog button is "connect" when Tor is not bootstrapped,
    
    1078
    +          // so do the connect.
    
    1079
    +          if (connect) {
    
    1080
    +            // Start Bootstrapping, which should use the configured bridges.
    
    1081
    +            // NOTE: We do this regardless of any previous TorConnect Error.
    
    1082
    +            if (TorConnect.canBeginBootstrap) {
    
    1083
    +              TorConnect.beginBootstrap();
    
    1084
    +            }
    
    1085
    +            // Open "about:torconnect".
    
    1086
    +            // FIXME: If there has been a previous bootstrapping error then
    
    1087
    +            // "about:torconnect" will be trying to get the user to use
    
    1088
    +            // AutoBootstrapping. It is not set up to handle a forced direct
    
    1089
    +            // entry to plain Bootstrapping from this dialog so the UI will not
    
    1090
    +            // be aligned. In particular the
    
    1091
    +            // AboutTorConnect.uiState.bootstrapCause will be aligned to
    
    1092
    +            // whatever was shown previously in "about:torconnect" instead.
    
    1093
    +            TorConnect.openTorConnect();
    
    1094
    +          }
    
    1078 1095
             }
    
    1079
    -      });
    
    1096
    +      );
    
    1080 1097
           builtinBridgeDialog.openDialog(gSubDialog);
    
    1081 1098
         },
    
    1082 1099
     
    

  • browser/modules/TorStrings.jsm
    ... ... @@ -94,7 +94,7 @@ const Loader = {
    94 94
           quickstartCheckbox: "Always connect automatically",
    
    95 95
           // Bridge settings
    
    96 96
           bridgesHeading: "Bridges",
    
    97
    -      bridgesDescription:
    
    97
    +      bridgesDescription2:
    
    98 98
             "Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.",
    
    99 99
           bridgeLocation: "Your location",
    
    100 100
           bridgeLocationAutomatic: "Automatic",
    
    ... ... @@ -116,7 +116,8 @@ const Loader = {
    116 116
           allBridgesEnabled: "Use current bridges",
    
    117 117
           bridgeRemoveAll: "Remove All Bridges",
    
    118 118
           bridgeRemoveAllDialogTitle: "Remove all bridges?",
    
    119
    -      bridgeRemoveAllDialogDescription: "If these bridges were received from torproject.org or added manually, this action cannot be undone",
    
    119
    +      bridgeRemoveAllDialogDescription:
    
    120
    +        "If these bridges were received from torproject.org or added manually, this action cannot be undone",
    
    120 121
           bridgeAdd: "Add a New Bridge",
    
    121 122
           bridgeSelectBrowserBuiltin:
    
    122 123
             "Choose from one of Tor Browser’s built-in bridges",
    
    ... ... @@ -138,20 +139,18 @@ const Loader = {
    138 139
           // Scan bridge QR dialog
    
    139 140
           scanQrTitle: "Scan the QR code",
    
    140 141
           // Builtin bridges dialog
    
    141
    -      builtinBridgeTitle: "Built-In Bridges",
    
    142 142
           builtinBridgeHeader: "Select a Built-In Bridge",
    
    143
    -      builtinBridgeDescription:
    
    143
    +      builtinBridgeDescription2:
    
    144 144
             "Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.",
    
    145
    -      builtinBridgeObfs4: "obfs4",
    
    146 145
           builtinBridgeObfs4Title: "obfs4 (Built-in)",
    
    147
    -      builtinBridgeObfs4Description:
    
    146
    +      builtinBridgeObfs4Description2:
    
    148 147
             "Makes your Tor traffic look like random data. May not work in heavily censored regions.",
    
    149 148
           builtinBridgeSnowflake: "Snowflake",
    
    150
    -      builtinBridgeSnowflakeDescription:
    
    149
    +      builtinBridgeSnowflakeDescription2:
    
    151 150
             "Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.",
    
    152 151
           builtinBridgeMeekAzure: "meek-azure",
    
    153
    -      builtinBridgeMeekAzureDescription:
    
    154
    -        "Makes it look like you’re connected to a Microsoft web site, instead of using Tor. May work in heavily censored regions, but is usually very slow.",
    
    152
    +      builtinBridgeMeekAzureDescription2:
    
    153
    +        "Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.",
    
    155 154
           bridgeButtonConnect: "Connect",
    
    156 155
           bridgeButtonAccept: "OK",
    
    157 156
           // Request bridges dialog
    

  • toolkit/torbutton/chrome/locale/en-US/settings.properties
    ... ... @@ -26,7 +26,9 @@ settings.quickstartCheckbox=Always connect automatically
    26 26
     
    
    27 27
     # Bridge settings
    
    28 28
     settings.bridgesHeading=Bridges
    
    29
    -settings.bridgesDescription=Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
    
    29
    +# Old description used up to 12.0 - TODO: remove when 12.5 becomes stable:
    
    30
    +settings.bridgesDescription=Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
    
    31
    +settings.bridgesDescription2=Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.
    
    30 32
     settings.bridgeLocation=Your location
    
    31 33
     settings.bridgeLocationAutomatic=Automatic
    
    32 34
     settings.bridgeLocationFrequent=Frequently selected locations
    
    ... ... @@ -72,20 +74,26 @@ settings.cancel=Cancel
    72 74
     settings.scanQrTitle=Scan the QR code
    
    73 75
     
    
    74 76
     # Builtin bridges dialog
    
    75
    -settings.builtinBridgeTitle=Built-In Bridges
    
    76
    -# Bug 41617: Todo - delete builtinBridgeHeader, no longer user
    
    77 77
     settings.builtinBridgeHeader=Select a Built-In Bridge
    
    78
    -settings.builtinBridgeDescription=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.
    
    79
    -settings.builtinBridgeObfs4=obfs4
    
    78
    +settings.builtinBridgeDescription2=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.
    
    80 79
     settings.builtinBridgeObfs4Title=obfs4 (Built-in)
    
    81
    -settings.builtinBridgeObfs4Description=Makes your Tor traffic look like random data. May not work in heavily censored regions.
    
    80
    +settings.builtinBridgeObfs4Description2=Makes your Tor traffic look like random data. May not work in heavily censored regions.
    
    82 81
     settings.builtinBridgeSnowflake=Snowflake
    
    83
    -settings.builtinBridgeSnowflakeDescription=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.
    
    82
    +settings.builtinBridgeSnowflakeDescription2=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.
    
    84 83
     settings.builtinBridgeMeekAzure=meek-azure
    
    85
    -settings.builtinBridgeMeekAzureDescription=Makes it look like you’re connected to a Microsoft web site, instead of using Tor. May work in heavily censored regions, but is usually very slow.
    
    84
    +settings.builtinBridgeMeekAzureDescription2=Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.
    
    86 85
     settings.bridgeButtonConnect=Connect
    
    87 86
     settings.bridgeButtonAccept=OK
    
    88 87
     
    
    88
    +# Old dialog strings used up to 12.0 - TODO: remove when 12.5 becomes stable:
    
    89
    +settings.builtinBridgeTitle=Built-In Bridges
    
    90
    +settings.builtinBridgeDescription=Tor Browser includes some specific types of bridges known as “pluggable transports”.
    
    91
    +settings.builtinBridgeObfs4=obfs4
    
    92
    +settings.builtinBridgeObfs4Description=obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges.
    
    93
    +settings.builtinBridgeSnowflakeDescription=Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers.
    
    94
    +settings.builtinBridgeMeekAzureDescription=meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor.
    
    95
    +# end
    
    96
    +
    
    89 97
     # Request bridges dialog
    
    90 98
     settings.requestBridgeDialogTitle=Request Bridge
    
    91 99
     settings.submitCaptcha=Submit
    

  • _______________________________________________
    tor-commits mailing list
    tor-commits@xxxxxxxxxxxxxxxxxxxx
    https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits