tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2021
- 17 participants
- 2169 discussions

18 Mar '21
commit c662522e355437f96158f5402b30ea3f0c797bac
Author: juga0 <juga(a)riseup.net>
Date: Wed Mar 17 09:25:12 2021 +0000
fix: CI: Use all tox environments for python 3.8
Closes: #40070
---
.gitlab-ci.yml | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 098781f..da457b3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -113,12 +113,7 @@ python38:
- apt install -yqq dvipng
image: $BASE_IMAGE
script:
- - tox -e inst
- - tox -e setup
- - tox -e py38
- - tox -e integration
- - tox -e lint
- - tox -e doc
+ - tox
python39:
variables:
1
0

18 Mar '21
commit 888fb6e88366e4bdaced0239d833ecee11fac636
Author: juga0 <juga(a)riseup.net>
Date: Wed Mar 17 12:51:35 2021 +0000
fix: semi-automatic correction of typos
Closes #33599.
---
docs/source/contributing.rst | 10 +++++-----
docs/source/examples/sbws.example.ini | 2 +-
docs/source/generator.rst | 6 +++---
docs/source/glossary.rst | 4 ++--
docs/source/how_works.rst | 2 +-
docs/source/implementation.rst | 10 +++++-----
docs/source/man_sbws.rst | 2 +-
docs/source/roadmap.rst | 2 +-
docs/source/testing.rst | 2 +-
sbws/core/generate.py | 2 +-
sbws/core/scanner.py | 8 ++++----
sbws/core/stats.py | 2 +-
sbws/globals.py | 4 ++--
sbws/lib/circuitbuilder.py | 2 +-
sbws/lib/destination.py | 8 ++++----
sbws/lib/relaylist.py | 2 +-
sbws/lib/relayprioritizer.py | 4 ++--
sbws/lib/resultdump.py | 13 +++++++------
sbws/lib/v3bwfile.py | 8 ++++----
sbws/util/fs.py | 6 +++---
sbws/util/stem.py | 4 ++--
tests/integration/chutney_data/client_bwscanner.tmpl | 2 +-
tests/integration/run.sh | 2 +-
tests/unit/core/test_generate.py | 4 ++--
tests/unit/lib/test_destination.py | 2 +-
tests/unit/lib/test_relaylist.py | 2 +-
tests/unit/lib/test_resultdump.py | 2 +-
tests/unit/lib/test_v3bwfile.py | 2 +-
tests/unit/util/test_state.py | 2 +-
29 files changed, 61 insertions(+), 60 deletions(-)
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index c17aa4a..551ba7d 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -111,11 +111,11 @@ New features should add a corresponding documentation in /docs.
An editor compatible with `EditorConfig <https://editorconfig.org/>`_ will
help you to follow the general formatting code style.
-Timestamps must be in UTC. It is prefered to use ``datetime`` objects or
+Timestamps must be in UTC. It is preferred to use ``datetime`` objects or
Unix timestamps. Timestamps read by the user should be always formatted in
`ISO 8601 <https://en.wikipedia.org/wiki/ISO_8601>`_
-Functional style is prefered:
+Functional style is preferred:
- use list comprenhensions lambda, map, reduce
- avoid reasigigning variables, instead create new ones
@@ -148,7 +148,7 @@ and possibly the bugfix version.
The commit message should contain ``Closes: #bugnumber``.
From version 1.0.2 we started to prefix the summary with the subpackage or
-component, though we have not standarized the words to use, eg: ``scanner``,
+component, though we have not standardized the words to use, eg: ``scanner``,
``generate``, ``v3bwfile``, ``relaylist``, ``doc``, ``test``, ``CI``.
From version 1.0.3, we also started to prefix the summary with ``new``,
@@ -156,7 +156,7 @@ From version 1.0.3, we also started to prefix the summary with ``new``,
sections in the CHANGELOG.
From version 1.1.0 we started to use the words ``new``, ``chg`` and ``fix``,
-not in the sense `gitchangelog`_ use them, but to match sematic versioning
+not in the sense `gitchangelog`_ use them, but to match semantic versioning
changes major, minor and patch.
Try to make each commit a logically separate changes.::
@@ -313,7 +313,7 @@ Example commit message
between, but conventions vary here
-.. rubric:: External eferences
+.. rubric:: External references
.. [DIST] https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project
.. [MERG] https://www.atlassian.com/git/tutorials/merging-vs-rebasing
diff --git a/docs/source/examples/sbws.example.ini b/docs/source/examples/sbws.example.ini
index 1a2d6a4..657da48 100644
--- a/docs/source/examples/sbws.example.ini
+++ b/docs/source/examples/sbws.example.ini
@@ -30,7 +30,7 @@ country = ZZ
max_num_failures = 3
## The following logging options are set by default.
-## There is no need to change them unless other options are prefered.
+## There is no need to change them unless other options are preferred.
; [logging]
; # Whether or not to log to a rotating file the directory paths.log_dname
; to_file = yes
diff --git a/docs/source/generator.rst b/docs/source/generator.rst
index 7d43d33..986be0c 100644
--- a/docs/source/generator.rst
+++ b/docs/source/generator.rst
@@ -23,15 +23,15 @@ Each relay bandwidth measurements are selected in the following way:
#. At least two bandwidth measurements (``Result`` s) MUST have been obtained
within an arbitrary number of seconds (currently one day).
- If they are not, the relay MUST NOT be included in the Bandwith File.
-#. The measurements than are are older than an arbitrary number of senconds
+ If they are not, the relay MUST NOT be included in the Bandwidth File.
+#. The measurements than are are older than an arbitrary number of seconds
in the past MUST be discarded.
Currently this number is the same as ``data_period`` (5 days) when not
scaling as Torflow and 28 days when scaling as Torflow.
If the number of relays to include in the Bandwidth File are less than
a percententage (currently 60%) than the number of relays in the consensus,
-additional Header Lines MUST be added (see XXX) to the Bandwith File and the
+additional Header Lines MUST be added (see XXX) to the Bandwidth File and the
relays SHOULD NOT be included.
.. image:: ./images/activity_aggr_file.svg
diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
index 7d175b6..b7b0a03 100644
--- a/docs/source/glossary.rst
+++ b/docs/source/glossary.rst
@@ -20,7 +20,7 @@ Glossary
generator
Term to refer to the tool that generates the
- :term:`bandwidth list file` s. Often used as a synomym for
+ :term:`bandwidth list file` s. Often used as a synonym for
:term:`scanner`.
bandwidth list file
@@ -44,6 +44,6 @@ Glossary
destination
The term used by ``sbws`` to refer to a Web server where the
- :term:`scanner` request files to perform the bandwith measurements.
+ :term:`scanner` request files to perform the bandwidth measurements.
.. [#] https://metrics.torproject.org/glossary.html
diff --git a/docs/source/how_works.rst b/docs/source/how_works.rst
index ebe4cf9..d45e4ca 100644
--- a/docs/source/how_works.rst
+++ b/docs/source/how_works.rst
@@ -26,7 +26,7 @@ by a :term:`directory authority` to report relays’ bandwidth in its vote.
.. image:: ./images/dirauths_bwauths.png
-Intialization
+Initialization
--------------
.. At some point it should be able to get environment variables
diff --git a/docs/source/implementation.rst b/docs/source/implementation.rst
index ad48a51..68f72b5 100644
--- a/docs/source/implementation.rst
+++ b/docs/source/implementation.rst
@@ -10,7 +10,7 @@ re-implement the feature:
Possible advantages using other software:
-- zero maintainance
+- zero maintenance
- not reinventing the wheel
Possible disadvantages using other software:
@@ -36,10 +36,10 @@ A first solution would be to obtain the git revision at runtime, but:
the git revision of that other repository.
So next solution was to obtain the git revision at build/install time.
-To achive this, an script should be called from the installer or at runtime
+To achieve this, an script should be called from the installer or at runtime
whenever `__version__` needs to be read.
-While it could be implemented by us, there're two external tools that achive
+While it could be implemented by us, there're two external tools that achieve
this.
setuptools_scm
@@ -102,7 +102,7 @@ Changing Bandwidth file monitoring KeyValues
--------------------------------------------
In version 1.1.0 we added KeyValues call ``recent_X_count`` and
-``relay_X_count`` which implied to modify serveral parts of the code.
+``relay_X_count`` which implied to modify several parts of the code.
We only stored numbers for simpliciy, but then the value of this numbers
accumulate over the time and there is no way to know to which number decrease
@@ -159,7 +159,7 @@ will be correct after 5 days and they have been wrong for long time.
Additionally ``recent_measurement_failure_count`` will be negative, since it's
calculated as ``recent_measurement_attempt_count`` minus all the results.
-While the total number of results in the last 5 days is corrrect, the number of
+While the total number of results in the last 5 days is correct, the number of
the attempts won't be until 5 days have pass.
Disadvantages
diff --git a/docs/source/man_sbws.rst b/docs/source/man_sbws.rst
index 608c36d..3586cef 100644
--- a/docs/source/man_sbws.rst
+++ b/docs/source/man_sbws.rst
@@ -75,7 +75,7 @@ In the following list, the first path is the default location when running
**sbws** as a system service.
**$HOME/.sbws.ini** or **/etc/sbws/sbws.ini**
- Location where **sbws** searchs for a custom configuration file, when the
+ Location where **sbws** searches for a custom configuration file, when the
option **--config** is not provided.
**$HOME/.sbws** or **/var/lib/sbws**
diff --git a/docs/source/roadmap.rst b/docs/source/roadmap.rst
index 4fc4b01..ba27b24 100644
--- a/docs/source/roadmap.rst
+++ b/docs/source/roadmap.rst
@@ -6,7 +6,7 @@ Roadmap
Release 1.0.0
--------------
-Autum 2018
+Autumn 2018
- Minimal Viable Product (MVP)
Release 1.1.0
diff --git a/docs/source/testing.rst b/docs/source/testing.rst
index ac15027..ebe2ae5 100644
--- a/docs/source/testing.rst
+++ b/docs/source/testing.rst
@@ -3,7 +3,7 @@
Installing tests dependencies and running tests
==================================================
-To run the tests, extra Python depenencies are needed:
+To run the tests, extra Python dependencies are needed:
- Flake8_
- tox_
diff --git a/sbws/core/generate.py b/sbws/core/generate.py
index ecc0b53..add7a79 100644
--- a/sbws/core/generate.py
+++ b/sbws/core/generate.py
@@ -121,7 +121,7 @@ def gen_parser(sub):
"--min-num",
default=NUM_MIN_RESULTS,
type=int,
- help="Mininum number of a results to consider them.",
+ help="Minimum number of a results to consider them.",
)
return p
diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index 38ddef2..dbcceb9 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -355,7 +355,7 @@ def measure_relay(args, conf, destinations, cb, rl, relay):
return [
ResultError(relay, [], "", our_nick, msg=reason),
]
- # Pick a destionation
+ # Pick a destination
dest = destinations.next()
# When there're no any functional destinations.
if not dest:
@@ -686,7 +686,7 @@ def main_loop(
the ``Result`` from the queue and write it to disk, so this doesn't block
the measurement threads.
- If there was an exception not catched by ``measure_relay``, it will call
+ If there was an exception not caught by ``measure_relay``, it will call
instead ``result_putter_error``, which logs the error and complete
immediately.
@@ -774,7 +774,7 @@ def wait_for_results(num_relays_to_measure, pending_results):
While there are relays being measured, just log the progress
and sleep :const:`~sbws.globals.TIMEOUT_MEASUREMENTS` (3mins),
- which is aproximately the time it can take to measure a relay in
+ which is approximately the time it can take to measure a relay in
the worst case.
When there has not been any relay measured in ``TIMEOUT_MEASUREMENTS``
@@ -914,7 +914,7 @@ def run_speedtest(args, conf):
except KeyboardInterrupt:
log.info("Interrupted by the user.")
stop_threads(signal.SIGINT, None)
- # Any exception not catched at this point would make the scanner stall.
+ # Any exception not caught at this point would make the scanner stall.
# Log it and exit gracefully.
except Exception as e:
log.critical(FILLUP_TICKET_MSG)
diff --git a/sbws/core/stats.py b/sbws/core/stats.py
index bd8c88b..0aebcfc 100644
--- a/sbws/core/stats.py
+++ b/sbws/core/stats.py
@@ -51,7 +51,7 @@ def _result_type_per_relay(data, result_type):
def _get_box_plot_values(iterable):
- """Reutrn the min, q1, med, q1, and max of the input list or iterable.
+ """Return the min, q1, med, q1, and max of the input list or iterable.
This function is NOT perfect, and I think that's fine for basic statistical
needs. Instead of median, it will return low or high median. Same for q1
and q3."""
diff --git a/sbws/globals.py b/sbws/globals.py
index 4658868..16d8aa5 100644
--- a/sbws/globals.py
+++ b/sbws/globals.py
@@ -33,7 +33,7 @@ TORRC_STARTING_POINT = {
"SafeLogging": "0",
"LogTimeGranularity": "1",
"ProtocolWarnings": "1",
- # To be able to responde to MaxAdvertisedBandwidth as soon as possible.
+ # To be able to respond to MaxAdvertisedBandwidth as soon as possible.
# If ``FetchDirInfoExtraEarly` is set, but not
# `FetchDirInfoEarly`, Tor will throw this error:
# `FetchDirInfoExtraEarly requires that you also set FetchDirInfoEarly`
@@ -52,7 +52,7 @@ TORRC_RUNTIME_OPTIONS = {
# so do not let Tor to build them.
"__DisablePredictedCircuits": "1",
# The scanner attach the streams to the circuit itself,
- # so do not let Tor to attache them.
+ # so do not let Tor to attach them.
"__LeaveStreamsUnattached": "1",
}
# Options that can be set at runtime and can fail with some Tor versions
diff --git a/sbws/lib/circuitbuilder.py b/sbws/lib/circuitbuilder.py
index 8b9c520..e2b84f2 100644
--- a/sbws/lib/circuitbuilder.py
+++ b/sbws/lib/circuitbuilder.py
@@ -96,7 +96,7 @@ class CircuitBuilder:
# In a future refactor, remove this class, since sbws chooses the relays to
-# build the circuit, the relays are not just choosen as random as this class
+# build the circuit, the relays are not just chosen as random as this class
# does.
class GapsCircuitBuilder(CircuitBuilder):
"""Same as ``CircuitBuilder`` but implements build_circuit."""
diff --git a/sbws/lib/destination.py b/sbws/lib/destination.py
index ae1e695..5d1e390 100644
--- a/sbws/lib/destination.py
+++ b/sbws/lib/destination.py
@@ -164,7 +164,7 @@ class Destination:
num_attempts_stored=NUM_DESTINATION_ATTEMPTS_STORED,
factor_increment_retry=FACTOR_INCREMENT_DESTINATION_RETRY,
):
- """Initalizes the Web server from which the data is downloaded.
+ """Initializes the Web server from which the data is downloaded.
:param str url: Web server data URL to download.
:param int max_dl: Maximum size of the the data to download.
@@ -192,8 +192,8 @@ class Destination:
self._max_seconds_between_retries = max_seconds_between_retries
# Using a deque (FIFO) to do not grow forever and
# to do not have to remove old attempts.
- # Store tuples of timestamp and whether the destination succed or not
- # (succed, 1, failed, 0).
+ # Store tuples of timestamp and whether the destination succeed or not
+ # (succeed, 1, failed, 0).
# Initialize it as if it never failed.
self._attempts = collections.deque(
[
@@ -268,7 +268,7 @@ class Destination:
And False otherwise.
When the destination is tried again after the consecutive failures,
- the time to try again is incremented and resetted as soon as the
+ the time to try again is incremented and reset as soon as the
destination does not fail.
"""
# NOTE: does a destination fail because several threads are using
diff --git a/sbws/lib/relaylist.py b/sbws/lib/relaylist.py
index 0128786..698fb8e 100644
--- a/sbws/lib/relaylist.py
+++ b/sbws/lib/relaylist.py
@@ -138,7 +138,7 @@ class Relay:
def consensus_bandwidth_is_unmeasured(self):
# measured appears only votes, unmeasured appears in consensus
# therefore is_unmeasured is needed to know whether the bandwidth
- # value in consensus is comming from bwauth measurements or not.
+ # value in consensus is coming from bwauth measurements or not.
return self._from_ns("is_unmeasured")
@property
diff --git a/sbws/lib/relayprioritizer.py b/sbws/lib/relayprioritizer.py
index f70c7a6..8f3bf96 100644
--- a/sbws/lib/relayprioritizer.py
+++ b/sbws/lib/relayprioritizer.py
@@ -100,7 +100,7 @@ class RelayPrioritizer:
those measurements.
:param bool prioritize_result_error: whether prioritize or not
- measurements that did not succed.
+ measurements that did not succeed.
:param bool return_fraction: whether to return only a fraction of the
relays seen in the network or return all.
@@ -177,7 +177,7 @@ class RelayPrioritizer:
# In a future refactor, a new attribute should not be created,
# then no need to remove it.
del relay.priority
- # Increment the number of times a realy was "prioritized" to be
+ # Increment the number of times a really was "prioritized" to be
# measured.
relay.increment_relay_recent_priority_list()
yield relay
diff --git a/sbws/lib/resultdump.py b/sbws/lib/resultdump.py
index e60f3bc..b168cbd 100644
--- a/sbws/lib/resultdump.py
+++ b/sbws/lib/resultdump.py
@@ -130,7 +130,7 @@ def trim_results_ip_changed(
return new_results_dict
if on_changed_ipv6 is True:
log.warning(
- "Reseting bandwidth results when IPv6 changes,"
+ "Resetting bandwidth results when IPv6 changes,"
" is not yet implemented."
)
return result_dict
@@ -258,7 +258,7 @@ class Result:
"""
Initializes a ``Result.Relay``.
- .. note:: in a future refactor the attributes should be dinamic
+ .. note:: in a future refactor the attributes should be dynamic
to easy adding/removing them.
They are shared by :class:`~sbws.lib.relaylist.Relay` and
:class:`~sbws.lib.v3bwfile.V3BWLine` and there should not be
@@ -283,7 +283,8 @@ class Result:
def __init__(self, relay, circ, dest_url, scanner_nick, t=None):
"""
- Initilizes the measurement and the relay with all the relay attributes.
+ Initializes the measurement and the relay with all the relay
+ attributes.
"""
self._relay = Result.Relay(
relay.fingerprint,
@@ -351,7 +352,7 @@ class Result:
@property
def relay_recent_measurement_attempt(self):
- """Returns the relay recent measurements attemps.
+ """Returns the relay recent measurements attempts.
It is initialized in :class:`~sbws.lib.relaylist.Relay` and
incremented in :func:`~sbws.core.scanner.main_loop`.
@@ -614,7 +615,7 @@ class ResultErrorSecondRelay(ResultError):
the second relay is an exit without `bad` flag and can exit to port 443.
- If the relay to measure is an exit, the second relay is not an exit.
- It is instanciated in :func:`~sbws.core.scanner.measure_relay`.
+ It is instantiated in :func:`~sbws.core.scanner.measure_relay`.
.. note:: this duplicates code and add more tech-debt,
since it's the same as the other
@@ -666,7 +667,7 @@ class ResultErrorDestination(ResultError):
"""
Error when there is not a working destination Web Server.
- It is instanciated in :func:`~sbws.core.scanner.measure_relay`.
+ It is instantiated in :func:`~sbws.core.scanner.measure_relay`.
.. note:: this duplicates code and add more tech-debt,
since it's the same as the other
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 45a974b..6010099 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -56,7 +56,7 @@ HEADER_KEYS_V1_1_ORDERED = ["version"]
# They can also be pass as an argument to `Header` to overwrite default values,
# what is done in unit tests.
# `latest bandwidth` is special cause it gets its value from timestamp, which
-# is not a KeyValue, but it's always pass as an agument.
+# is not a KeyValue, but it's always pass as an argument.
# It could be separaed in other list, but so far there is no need, cause:
# 1. when it's pass to the Header to initialize it, it's just ignored.
# 2. when the file is created, it's took into account.
@@ -175,7 +175,7 @@ LINE_TERMINATOR = TERMINATOR + LINE_SEP
# KeyValue separator in Bandwidth Lines
BWLINE_KEYVALUES_SEP_V1 = " "
-# not inclding in the files the extra bws for now
+# not including in the files the extra bws for now
BWLINE_KEYS_V0 = ["node_id", "bw"]
BWLINE_KEYS_V1_1 = [
"master_key_ed25519",
@@ -590,7 +590,7 @@ class V3BWHeader(object):
return len(self.__str__().split(LINE_SEP))
def add_stats(self, **kwargs):
- # Using kwargs because attributes might chage.
+ # Using kwargs because attributes might change.
[
setattr(self, k, str(v))
for k, v in kwargs.items()
@@ -958,7 +958,7 @@ class V3BWLine(object):
@staticmethod
def rtt_from_results(results):
- # convert from miliseconds to seconds
+ # convert from milliseconds to seconds
rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts]
rtt = round(median(rtts)) if rtts else None
return rtt
diff --git a/sbws/util/fs.py b/sbws/util/fs.py
index f079219..7a9660d 100644
--- a/sbws/util/fs.py
+++ b/sbws/util/fs.py
@@ -11,7 +11,7 @@ Disk space requirements
v3bw files: the maximum space required is ~{mb_bw} MB, after {d_bw} days.
result files: the maximum space required is ~{mb_results} MB, after {d_r} days.
tor directory: the space required is ~{mb_tor} MB.
-code and depenencies: the space required is ~{mb_code} MB
+code and dependencies: the space required is ~{mb_code} MB
Total disk space required is: ~{mb_total} MB
"""
@@ -28,7 +28,7 @@ def sbws_required_disk_space(conf):
size_v3bw_file = 7500 * 220
# default crontab configuration will run genenerate every hour
num_v3bw_files_day = 24
- # ~1000 is the length of a line when the result is successfull
+ # ~1000 is the length of a line when the result is successful
# ~4550 is the number of lines of the biggest result file
size_result_file = 4550 * 1000
num_result_files_day = 1
@@ -66,7 +66,7 @@ def sbws_required_disk_space(conf):
text_dict["mb_results"] = round(results_max_space_after_delete / 1000 ** 2)
text_dict["d_r"] = results_delete_after_days
# not counted rotated files and assuming that when it is not rotated the
- # size will be aproximately 10MiB
+ # size will be approximately 10MiB
space_log_files = 0
if conf.getboolean("logging", "to_file"):
size_log_file = conf.getint("logging", "to_file_max_bytes")
diff --git a/sbws/util/stem.py b/sbws/util/stem.py
index f2bea86..cecd5d7 100644
--- a/sbws/util/stem.py
+++ b/sbws/util/stem.py
@@ -296,7 +296,7 @@ def get_socks_info(controller):
except SocketClosed as e:
if not settings.end_event.is_set():
log.debug(e)
- # This might need to return the eception if this happen in other cases
+ # This might need to return the exception if this happen in other cases
# than when stopping the scanner.
except ControllerError as e:
log.debug(e)
@@ -359,7 +359,7 @@ def is_torrc_starting_point_set(tor_controller):
value_set = tor_controller.get_conf(k)
if v != value_set:
log.exception(
- "Uncorrectly configured %s, should be %s, is %s",
+ "Incorrectly configured %s, should be %s, is %s",
k,
v,
value_set,
diff --git a/tests/integration/chutney_data/client_bwscanner.tmpl b/tests/integration/chutney_data/client_bwscanner.tmpl
index dc6d0d8..7821858 100644
--- a/tests/integration/chutney_data/client_bwscanner.tmpl
+++ b/tests/integration/chutney_data/client_bwscanner.tmpl
@@ -3,7 +3,7 @@ SocksPort $socksport
#NOTE: Setting TestingClientConsensusDownloadSchedule doesn't
# help -- dl_stats.schedule is not DL_SCHED_CONSENSUS
-# at boostrap time.
+# at bootstrap time.
# Try to download after:
# the minimum initial consensus time to start with,
# a few eager fetches,
diff --git a/tests/integration/run.sh b/tests/integration/run.sh
index 90a5322..f31684f 100755
--- a/tests/integration/run.sh
+++ b/tests/integration/run.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-# Instead of exiting inmmediately when any of this commands fail,
+# Instead of exiting immediately when any of this commands fail,
# the scanner, generate and coverage lines could continue and store there was
# an error on that command. It's just simpler with `-e`.
set -ex
diff --git a/tests/unit/core/test_generate.py b/tests/unit/core/test_generate.py
index 539bf79..5fe2e6e 100644
--- a/tests/unit/core/test_generate.py
+++ b/tests/unit/core/test_generate.py
@@ -14,7 +14,7 @@ def test_gen_parser_arg_round_digs():
parent_parser = argparse.ArgumentParser(prog="sbws")
subparsers = parent_parser.add_subparsers(help="generate help")
parser_generate = gen_parser(subparsers)
- # Explicitely set empty arguments, otherwise pytest will use pytest
+ # Explicitly set empty arguments, otherwise pytest will use pytest
# arguments
args = parser_generate.parse_args([])
assert args.round_digs == PROP276_ROUND_DIG
@@ -29,6 +29,6 @@ def test_gen_parser_arg_round_digs():
# or use the short version
args = parser_generate.parse_args(["-r", str(TORFLOW_ROUND_DIG)])
assert args.round_digs == TORFLOW_ROUND_DIG
- # or use round-digs explicitely
+ # or use round-digs explicitly
args = parser_generate.parse_args(["--round-digs", str(PROP276_ROUND_DIG)])
assert args.round_digs == PROP276_ROUND_DIG
diff --git a/tests/unit/lib/test_destination.py b/tests/unit/lib/test_destination.py
index 99eae7a..2b329d2 100644
--- a/tests/unit/lib/test_destination.py
+++ b/tests/unit/lib/test_destination.py
@@ -57,7 +57,7 @@ def test_destination_is_functional():
d.add_success()
assert not d._are_last_attempts_failures()
assert d.is_functional()
- # And the delta to try is resetted
+ # And the delta to try is reset
assert not d._is_last_try_old_enough()
# When the delta time to retry a destination increase too much,
diff --git a/tests/unit/lib/test_relaylist.py b/tests/unit/lib/test_relaylist.py
index 0d1c6ee..3ce61d1 100644
--- a/tests/unit/lib/test_relaylist.py
+++ b/tests/unit/lib/test_relaylist.py
@@ -4,7 +4,7 @@ from datetime import datetime
# When datetime is imported as a class (`from datetime import datetime`) it can
# not be mocked because it is a built-in type. It can only be mocked when
# imported as module.
-# freezegun is able to mock any datetime object, it also allows comparations.
+# freezegun is able to mock any datetime object, it also allows comparisons.
from freezegun import freeze_time
from sbws.lib.relaylist import Relay, RelayList
diff --git a/tests/unit/lib/test_resultdump.py b/tests/unit/lib/test_resultdump.py
index 2a5f7f6..ea1a035 100644
--- a/tests/unit/lib/test_resultdump.py
+++ b/tests/unit/lib/test_resultdump.py
@@ -47,7 +47,7 @@ def test_trim_results_ip_changed_on_changed_ipv6(
# There might be other logs from other threads.
with caplog.at_level(logging.WARNING):
assert (
- "Reseting bandwidth results when IPv6 changes, "
+ "Resetting bandwidth results when IPv6 changes, "
"is not yet implemented.\n" in caplog.text
)
diff --git a/tests/unit/lib/test_v3bwfile.py b/tests/unit/lib/test_v3bwfile.py
index cb26474..6841e8f 100644
--- a/tests/unit/lib/test_v3bwfile.py
+++ b/tests/unit/lib/test_v3bwfile.py
@@ -369,7 +369,7 @@ def test_torflow_scale(mock_consensus, datadir, tmpdir, conf):
results = load_result_file(str(datadir.join("results.txt")))
# Since v1.1.0, it'll write bw=1 if the minimum percent of measured relays
# wasn't reached. Therefore mock the consensus number.
- # Because the consensus number is mocked, it'll try to read the sate path.
+ # Because the consensus number is mocked, it'll try to read the state path.
# Obtain it from conf, so that the root directory exists.
v3bwfile = V3BWFile.from_results(
results,
diff --git a/tests/unit/util/test_state.py b/tests/unit/util/test_state.py
index 3937ce5..0f1f248 100644
--- a/tests/unit/util/test_state.py
+++ b/tests/unit/util/test_state.py
@@ -79,7 +79,7 @@ def test_state_iter(tmpdir):
def test_two_instances(tmpdir):
- """Test that 2 different intances don't overwrite each other"""
+ """Test that 2 different instances don't overwrite each other"""
s1 = State(os.path.join(str(tmpdir), "state.dat"))
s2 = State(os.path.join(str(tmpdir), "state.dat"))
s1["x"] = "foo"
1
0
commit d6de5a4b2a91e06e1c8b506ec28d227dec662567
Author: juga0 <juga(a)riseup.net>
Date: Wed Mar 17 09:21:42 2021 +0000
fix: 2nd round of automatic format
black insists to keep one long line and flake complain, therefore make
flake to ignore it.
---
sbws/lib/resultdump.py | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/sbws/lib/resultdump.py b/sbws/lib/resultdump.py
index 4c22209..e60f3bc 100644
--- a/sbws/lib/resultdump.py
+++ b/sbws/lib/resultdump.py
@@ -400,8 +400,7 @@ class Result:
"scanner": self.scanner,
"version": self.version,
"relay_in_recent_consensus": self.relay_in_recent_consensus,
- "relay_recent_measurement_attempt":
- self.relay_recent_measurement_attempt,
+ "relay_recent_measurement_attempt": self.relay_recent_measurement_attempt, # noqa
"relay_recent_priority_list": self.relay_recent_priority_list,
}
@@ -507,11 +506,7 @@ class ResultError(Result):
def to_dict(self):
d = super().to_dict()
- d.update(
- {
- "msg": self.msg,
- }
- )
+ d.update({"msg": self.msg})
return d
@@ -831,8 +826,7 @@ class ResultSuccess(Result):
"relay_burst_bandwidth": self.relay_burst_bandwidth,
"relay_observed_bandwidth": self.relay_observed_bandwidth,
"consensus_bandwidth": self.consensus_bandwidth,
- "consensus_bandwidth_is_unmeasured":
- self.consensus_bandwidth_is_unmeasured,
+ "consensus_bandwidth_is_unmeasured": self.consensus_bandwidth_is_unmeasured, # noqa
}
)
return d
1
0

[community/master] updating section open user research content/user-research/open/contents.lr
by gus@torproject.org 18 Mar '21
by gus@torproject.org 18 Mar '21
18 Mar '21
commit 38a039de7d2471e0dc4233f33a446621d5b20576
Author: nah <nah(a)riseup.net>
Date: Wed Mar 17 10:30:29 2021 -0300
updating section open user research content/user-research/open/contents.lr
Apply 1 suggestion(s) to 1 file(s)
adding a pipe
---
content/user-research/open/contents.lr | 38 ++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/content/user-research/open/contents.lr b/content/user-research/open/contents.lr
index c1f5c1a..813cde3 100644
--- a/content/user-research/open/contents.lr
+++ b/content/user-research/open/contents.lr
@@ -17,31 +17,37 @@ key: 2
html: two-columns-page.html
---
body:
+
These are our current needs for testing Tor products, as well as methodologies and testing scripts. Before running Tor user research, be sure you read our [Guidelines to becoming a user researcher with Tor](https://community.torproject.org/user-research/guidelines).
### Tor Browser for Desktop
-* [User Research: Onboarding](https://dip.torproject.org/torproject/ux/research/blob/master/s…
-* [User Research: Security Settings](https://dip.torproject.org/torproject/ux/research/blob/master/scr…
-* User Research: New Identity
-* [User Needs Discovery](https://dip.torproject.org/torproject/ux/research/blob/master/sc…
+* [Tor Browser Usage](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%…
+* [User Research: Onboarding](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scr…
+* [Discovery: Get Bridges](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/script…
+* [User Needs Discovery](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scri…
### Tor Browser for Android
-* [User Research: Onboarding](https://dip.torproject.org/torproject/ux/research/blob/master/s…
-* User Research: Security Settings
-* User Research: New Identity
-* [User Needs Discovery](https://dip.torproject.org/torproject/ux/research/blob/master/sc…
+* [Tor Browser Usage](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%…
+* [User Research: Onboarding](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scr…
+* [User Needs Discovery](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scri…
+
+### Emma
+* [Run Emma Network Test](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%2…
+
+### Other Research
+* [Censored Continent: Understanding the use of tools during Internet censorship in Africa: Cameroon, Nigeria, Uganda and Zimbabwe as case studies.](https://research.torproject.org/techreports/icfp-censored-contine…
-### Onion Services
-* User Research: Onion Security Indicator
## Past User Research
We’re committed to open design, so you can see the user research we’ve conducted in the global-south. If you want to run user research with us, please [get in touch.](https://lists.torproject.org/cgi-bin/mailman/listinfo/ux)
| Project | Methodology | Locations | Dates | Reporting |
| -------- | ----------- | --------- | --------- | ----- |
-| Tor Launcher | Usability testing ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/1.India_User_testing_Tor_Launcher_Test.pdf)) | Mumbai(IN) | Q118 | .pdf |
-| Onion Security Indicator | Usability testing ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/2.User_testing_.onion_states_Test.pdf)) | Mumbai(IN), Kampala(UG), Valencia(ES), Mombasa(KE)| Q118, Q218 | [.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/reports/2018/ur_kenya_2018_Feature_report__Onions_and_Circuit_Display.pdf) |
-| TB Circuit Display | Usability testing ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/3.User_testing_circuit_display_Test.pdf)) | Kampala(UG), Nairobi(KE), Mombasa(KE) | Q118, Q218 | [.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/reports/2018/ur_kenya_2018_Feature_report__Onions_and_Circuit_Display.pdf) |
-| Tor Browser for Desktop | User needs discovery ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/4.00_user_needs_discovery.pdf)) | Bogotá(CL), Cali(CL), Valle del Cauca(CL), Kampala(UG), Hoima(UG), Nairobi(KE) | 2018 | [.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/reports/2018/ur_colombia_2018_report_tbb-tba.pdf) |
-| Tor Browser for Android | User needs discovery ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/4.00_user_needs_discovery.pdf)) | Bogotá(CL), Cali(CL), Valle del Cauca(CL), Kampala(UG), Hoima(UG), Nairobi(KE) | 2018 | [.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/reports/2018/ur_colombia_2018_report_tbb-tba.pdf) |
-| Tor Users Demographics | Survey ([.pdf](https://dip.torproject.org/torproject/ux/research/blob/master/scripts%20and%20activities/2018/6.Spanish_-_Tor_Project_Survey_-_Tor_Users_Demographics.pdf)) | Online | 2018 | .pdf |
+| Discovery: Get Bridges | User Discovery ([.md](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2020/discovery-bridges.md)) | Online | Q420, Q121 | [.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/reports/2021/User_Research_-_Bridges.pdf) |
+| Tor Users Demographics | Survey ([.md](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2020/user_demographics-en.md)) | Online | 2020 | n/a |
+| User Research: Security Settings | Usability testing ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2019/2.Tor_Browser_Desktop_-_Security_Settings.pdf)) | Multiple locations | 2019 | n/a |
+| Tor Launcher | Usability testing ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2018/1.India_User_testing_Tor_Launcher_Test.pdf)) | Mumbai(IN) | Q118 | .pdf |
+| Onion Security Indicator | Usability testing ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2018/2.User_testing_.onion_states_Test.pdf)) | Mumbai(IN), Kampala(UG), Valencia(ES), Mombasa(KE)| Q118, Q218 | [.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/reports/2018/ur_kenya_2018_Feature_report__Onions_and_Circuit_Display.pdf) |
+| TB Circuit Display | Usability testing ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2018/3.User_testing_circuit_display_Test.pdf)) | Kampala(UG), Nairobi(KE), Mombasa(KE) | Q118, Q218 | [.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/reports/2018/ur_kenya_2018_Feature_report__Onions_and_Circuit_Display.pdf) |
+| Tor Browser for Desktop | User needs discovery ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2018/4.00_user_needs_discovery.pdf)) | Bogotá(CL), Cali(CL), Valle del Cauca(CL), Kampala(UG), Hoima(UG), Nairobi(KE) | 2018 | [.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/reports/2018/ur_colombia_2018_report_tbb-tba.pdf) |
+| Tor Browser for Android | User needs discovery ([.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/scripts%20and%20activities/2018/4.00_user_needs_discovery.pdf)) | Bogotá(CL), Cali(CL), Valle del Cauca(CL), Kampala(UG), Hoima(UG), Nairobi(KE) | 2018 | [.pdf](https://gitlab.torproject.org/tpo/ux/research/-/blob/master/reports/2018/ur_colombia_2018_report_tbb-tba.pdf) |
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 26353: Prevent speculative connect that violated FPI.
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit b8a7ec28cb0c5a73af76209c4ead228f4eb3813e
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Jul 14 08:50:55 2018 -0700
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
---
toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm b/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
index ffa42297073e..82c7a3b950c2 100644
--- a/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
+++ b/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
@@ -74,6 +74,9 @@ class RemoteWebNavigation {
fixupFlags |= Services.uriFixup.FIXUP_FLAG_PRIVATE_CONTEXT;
}
uri = Services.uriFixup.createFixupURI(aURI, fixupFlags);
+/*******************************************************************************
+ TOR BROWSER: Disable the following speculative connect until
+ we can make it properly obey first-party isolation.
// We know the url is going to be loaded, let's start requesting network
// connection before the content process asks.
@@ -97,6 +100,7 @@ class RemoteWebNavigation {
}
Services.io.speculativeConnect(uri, principal, null);
}
+*******************************************************************************/
} catch (ex) {
// Can't setup speculative connection for this uri string for some
// reason (such as failing to parse the URI), just ignore it.
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 25658: Replace security slider with security level UI
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit a3808d6fb2f97b4e1f91272a76561ff15d7aaebe
Author: Richard Pospesel <richard(a)torproject.org>
Date: Mon Mar 4 16:09:51 2019 -0800
Bug 25658: Replace security slider with security level UI
This patch adds a new 'securitylevel' component to Tor Browser intended
to replace the torbutton 'Security Slider'.
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Strings used by this patch are pulled from the torbutton extension, but
en-US defaults are provided if there is an error loading from the
extension. With this patch applied, the usual work-flow of "./mach build
&& ./mach run" work as expected, even if the torbutton extension is
disabled.
---
browser/base/content/browser.js | 10 +
browser/base/content/browser.xhtml | 5 +
browser/components/moz.build | 1 +
browser/components/preferences/preferences.xhtml | 1 +
browser/components/preferences/privacy.inc.xhtml | 2 +
browser/components/preferences/privacy.js | 19 +
.../securitylevel/content/securityLevel.js | 501 +++++++++++++++++++++
.../securitylevel/content/securityLevelButton.css | 9 +
.../content/securityLevelButton.inc.xhtml | 7 +
.../securitylevel/content/securityLevelButton.svg | 21 +
.../securitylevel/content/securityLevelPanel.css | 82 ++++
.../content/securityLevelPanel.inc.xhtml | 38 ++
.../content/securityLevelPreferences.css | 26 ++
.../content/securityLevelPreferences.inc.xhtml | 62 +++
browser/components/securitylevel/jar.mn | 6 +
browser/components/securitylevel/moz.build | 1 +
16 files changed, 791 insertions(+)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index b21807a5de65..fca047983973 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -216,6 +216,11 @@ XPCOMUtils.defineLazyScriptGetter(
["DownloadsButton", "DownloadsIndicatorView"],
"chrome://browser/content/downloads/indicator.js"
);
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["SecurityLevelButton"],
+ "chrome://browser/content/securitylevel/securityLevel.js"
+);
XPCOMUtils.defineLazyScriptGetter(
this,
"gEditItemOverlay",
@@ -1876,6 +1881,9 @@ var gBrowserInit = {
// doesn't flicker as the window is being shown.
DownloadsButton.init();
+ // Init the SecuritySettingsButton
+ SecurityLevelButton.init();
+
// Certain kinds of automigration rely on this notification to complete
// their tasks BEFORE the browser window is shown. SessionStore uses it to
// restore tabs into windows AFTER important parts like gMultiProcessBrowser
@@ -2558,6 +2566,8 @@ var gBrowserInit = {
DownloadsButton.uninit();
+ SecurityLevelButton.uninit();
+
gAccessibilityServiceIndicator.uninit();
AccessibilityRefreshBlocker.uninit();
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 34f823ad790e..9f9d4aedd3c3 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -20,6 +20,8 @@
<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/tabbrowser.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/downloads/downloads.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPanel.css"?>
+<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelButton.css"?>
<?xml-stylesheet href="chrome://browser/content/places/places.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/usercontext/usercontext.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
@@ -623,6 +625,7 @@
#include ../../components/controlcenter/content/protectionsPanel.inc.xhtml
#include ../../components/downloads/content/downloadsPanel.inc.xhtml
#include ../../../devtools/startup/enableDevToolsPopup.inc.xhtml
+#include ../../components/securitylevel/content/securityLevelPanel.inc.xhtml
#include browser-allTabsMenu.inc.xhtml
<hbox id="downloads-animation-container">
@@ -1136,6 +1139,8 @@
</stack>
</toolbarbutton>
+#include ../../components/securitylevel/content/securityLevelButton.inc.xhtml
+
<toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
removable="true"
onmousedown="PanelUI.showSubView('appMenu-libraryView', this, event);"
diff --git a/browser/components/moz.build b/browser/components/moz.build
index cf3f566eba71..8d6d2503e4a0 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -52,6 +52,7 @@ DIRS += [
'protocolhandler',
'resistfingerprinting',
'search',
+ 'securitylevel',
'sessionstore',
'shell',
'ssb',
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index e8a91cdd821d..06500fdac0c2 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -12,6 +12,7 @@
<?xml-stylesheet href="chrome://browser/skin/preferences/search.css"?>
<?xml-stylesheet href="chrome://browser/skin/preferences/containers.css"?>
<?xml-stylesheet href="chrome://browser/skin/preferences/privacy.css"?>
+<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPreferences.css"?>
<!DOCTYPE html>
diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
index 572b0233c8c4..f36145ea80d4 100644
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -913,6 +913,8 @@
<html:h1 data-l10n-id="security-header"/>
</hbox>
+#include ../securitylevel/content/securityLevelPreferences.inc.xhtml
+
<!-- addons, forgery (phishing) UI Security -->
<groupbox id="browsingProtectionGroup" data-category="panePrivacy" hidden="true">
<label><html:h2 data-l10n-id="security-browsing-protection"/></label>
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index e044d2d0f999..81ded441b6e6 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -77,6 +77,12 @@ XPCOMUtils.defineLazyGetter(this, "AlertsServiceDND", function() {
}
});
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["SecurityLevelPreferences"],
+ "chrome://browser/content/securitylevel/securityLevel.js"
+);
+
XPCOMUtils.defineLazyServiceGetter(
this,
"listManager",
@@ -275,6 +281,18 @@ function addCustomBlockingLearnMore() {
var gPrivacyPane = {
_pane: null,
+ /**
+ * Show the Security Level UI
+ */
+ _initSecurityLevel() {
+ SecurityLevelPreferences.init();
+ let unload = () => {
+ window.removeEventListener("unload", unload);
+ SecurityLevelPreferences.uninit();
+ };
+ window.addEventListener("unload", unload);
+ },
+
/**
* Whether the prompt to restart Firefox should appear when changing the autostart pref.
*/
@@ -415,6 +433,7 @@ var gPrivacyPane = {
this.trackingProtectionReadPrefs();
this.networkCookieBehaviorReadPrefs();
this._initTrackingProtectionExtensionControl();
+ this._initSecurityLevel();
Services.telemetry.setEventRecordingEnabled("pwmgr", true);
diff --git a/browser/components/securitylevel/content/securityLevel.js b/browser/components/securitylevel/content/securityLevel.js
new file mode 100644
index 000000000000..b47d0cfb545e
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevel.js
@@ -0,0 +1,501 @@
+"use strict";
+
+ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ CustomizableUI: "resource:///modules/CustomizableUI.jsm",
+ PanelMultiView: "resource:///modules/PanelMultiView.jsm",
+});
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+/*
+ Security Level Prefs
+
+ Getters and Setters for relevant torbutton prefs
+*/
+const SecurityLevelPrefs = {
+ security_slider_pref : "extensions.torbutton.security_slider",
+ security_custom_pref : "extensions.torbutton.security_custom",
+
+ get securitySlider() {
+ try {
+ return Services.prefs.getIntPref(this.security_slider_pref);
+ } catch(e) {
+ // init pref to 4 (standard)
+ const val = 4;
+ Services.prefs.setIntPref(this.security_slider_pref, val);
+ return val;
+ }
+ },
+
+ set securitySlider(val) {
+ Services.prefs.setIntPref(this.security_slider_pref, val);
+ },
+
+ get securityCustom() {
+ try {
+ return Services.prefs.getBoolPref(this.security_custom_pref);
+ } catch(e) {
+ // init custom to false
+ const val = false;
+ Services.prefs.setBoolPref(this.security_custom_pref, val);
+ return val;
+ }
+ },
+
+ set securityCustom(val) {
+ Services.prefs.setBoolPref(this.security_custom_pref, val);
+ },
+}; /* Security Level Prefs */
+
+/*
+ Security Level Button Code
+
+ Controls init and update of the security level toolbar button
+*/
+
+const SecurityLevelButton = {
+ _securityPrefsBranch : null,
+
+ _populateXUL : function(securityLevelButton) {
+ if (securityLevelButton != null) {
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.securityLevel);
+ securityLevelButton.setAttribute("label", TorStrings.securityLevel.securityLevel);
+ }
+ },
+
+ _configUIFromPrefs : function(securityLevelButton) {
+ if (securityLevelButton != null) {
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let classList = securityLevelButton.classList;
+ classList.remove("standard", "safer", "safest");
+ switch(securitySlider) {
+ case 4:
+ classList.add("standard");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.standard.tooltip);
+ break;
+ case 2:
+ classList.add("safer");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.safer.tooltip);
+ break;
+ case 1:
+ classList.add("safest");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.safest.tooltip);
+ break;
+ }
+ }
+ },
+
+ get button() {
+ let button = document.getElementById("security-level-button");
+ if (!button) {
+ return null;
+ }
+ return button;
+ },
+
+ get anchor() {
+ let anchor = this.button.icon;
+ if (!anchor) {
+ return null;
+ }
+
+ anchor.setAttribute("consumeanchor", SecurityLevelButton.button.id);
+ return anchor;
+ },
+
+ init : function() {
+ // set the initial class based off of the current pref
+ let button = this.button;
+ this._populateXUL(button);
+ this._configUIFromPrefs(button);
+
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+
+ CustomizableUI.addListener(this);
+
+ SecurityLevelPanel.init();
+ },
+
+ uninit : function() {
+ CustomizableUI.removeListener(this);
+
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+
+ SecurityLevelPanel.uninit();
+ },
+
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider") {
+ this._configUIFromPrefs(this.button);
+ }
+ break;
+ }
+ },
+
+ // callback for entering the 'Customize Firefox' screen to set icon
+ onCustomizeStart : function(window) {
+ let navigatorToolbox = document.getElementById("navigator-toolbox");
+ let button = navigatorToolbox.palette.querySelector("#security-level-button");
+ this._populateXUL(button);
+ this._configUIFromPrefs(button);
+ },
+
+ // callback when CustomizableUI modifies DOM
+ onWidgetAfterDOMChange : function(aNode, aNextNode, aContainer, aWasRemoval) {
+ if (aNode.id == "security-level-button" && !aWasRemoval) {
+ this._populateXUL(aNode);
+ this._configUIFromPrefs(aNode);
+ }
+ },
+
+ // for when the toolbar button needs to be activated and displays the Security Level panel
+ //
+ // In the toolbarbutton xul you'll notice we register this callback for both onkeypress and
+ // onmousedown. We do this to match the behavior of other panel spawning buttons such as Downloads,
+ // Library, and the Hamburger menus. Using oncommand alone would result in only getting fired
+ // after onclick, which is mousedown followed by mouseup.
+ onCommand : function(aEvent) {
+ // snippet stolen from /browser/components/downloads/indicator.js DownloadsIndicatorView.onCommand(evt)
+ if (
+ (aEvent.type == "mousedown" && aEvent.button != 0) ||
+ (aEvent.type == "keypress" && aEvent.key != " " && aEvent.key != "Enter")
+ ) {
+ return;
+ }
+
+ // we need to set this attribute for the button to be shaded correctly to look like it is pressed
+ // while the security level panel is open
+ this.button.setAttribute("open", "true");
+ SecurityLevelPanel.show();
+ },
+}; /* Security Level Button */
+
+/*
+ Security Level Panel Code
+
+ Controls init and update of the panel in the security level hanger
+*/
+
+const SecurityLevelPanel = {
+ _securityPrefsBranch : null,
+ _panel : null,
+ _anchor : null,
+ _populated : false,
+
+ _populateXUL : function() {
+ // get the panel elements we need to populate
+ let panelview = document.getElementById("securityLevel-panelview");
+ let labelHeader = panelview.querySelector("#securityLevel-header");
+ let labelCustomWarning = panelview.querySelector("#securityLevel-customWarning")
+ let labelLearnMore = panelview.querySelector("#securityLevel-learnMore");
+ let buttonRestoreDefaults = panelview.querySelector("#securityLevel-restoreDefaults");
+ let buttonAdvancedSecuritySettings = panelview.querySelector("#securityLevel-advancedSecuritySettings");
+
+ labelHeader.setAttribute("value", TorStrings.securityLevel.securityLevel);
+ labelCustomWarning.setAttribute("value", TorStrings.securityLevel.customWarning);
+ labelLearnMore.setAttribute("value", TorStrings.securityLevel.learnMore);
+ labelLearnMore.setAttribute("href", TorStrings.securityLevel.learnMoreURL);
+ buttonRestoreDefaults.setAttribute("label", TorStrings.securityLevel.restoreDefaults);
+ buttonAdvancedSecuritySettings.setAttribute("label", TorStrings.securityLevel.advancedSecuritySettings);
+
+ // rest of the XUL is set based on security prefs
+ this._configUIFromPrefs();
+
+ this._populated = true;
+ },
+
+ _configUIFromPrefs : function() {
+ // get security prefs
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let securityCustom = SecurityLevelPrefs.securityCustom;
+
+ // get the panel elements we need to populate
+ let panelview = document.getElementById("securityLevel-panelview");
+ let labelLevel = panelview.querySelector("#securityLevel-level");
+ let labelCustomWarning = panelview.querySelector("#securityLevel-customWarning")
+ let summary = panelview.querySelector("#securityLevel-summary");
+ let buttonRestoreDefaults = panelview.querySelector("#securityLevel-restoreDefaults");
+ let buttonAdvancedSecuritySettings = panelview.querySelector("#securityLevel-advancedSecuritySettings");
+
+ // only visible when user is using custom settings
+ labelCustomWarning.hidden = !securityCustom;
+ buttonRestoreDefaults.hidden = !securityCustom;
+
+ // Descriptions change based on security level
+ switch(securitySlider) {
+ // standard
+ case 4:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.standard.level);
+ summary.textContent = TorStrings.securityLevel.standard.summary;
+ break;
+ // safer
+ case 2:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.safer.level);
+ summary.textContent = TorStrings.securityLevel.safer.summary;
+ break;
+ // safest
+ case 1:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.safest.level);
+ summary.textContent = TorStrings.securityLevel.safest.summary;
+ break;
+ }
+
+ // override the summary text with custom warning
+ if (securityCustom) {
+ summary.textContent = TorStrings.securityLevel.custom.summary;
+ }
+ },
+
+ init : function() {
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+ },
+
+ uninit : function() {
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+ },
+
+ show : function() {
+ // we have to defer this until after the browser has finished init'ing before
+ // we can populate the panel
+ if (!this._populated) {
+ this._populateXUL();
+ }
+
+ let panel = document.getElementById("securityLevel-panel");
+ panel.hidden = false;
+ PanelMultiView.openPopup(panel, SecurityLevelButton.anchor, "bottomcenter topright",
+ 0, 0, false, null).catch(Cu.reportError);
+ },
+
+ hide : function() {
+ let panel = document.getElementById("securityLevel-panel");
+ PanelMultiView.hidePopup(panel);
+ },
+
+ restoreDefaults : function() {
+ SecurityLevelPrefs.securityCustom = false;
+ // hide and reshow so that layout re-renders properly
+ this.hide();
+ this.show(this._anchor);
+ },
+
+ openAdvancedSecuritySettings : function() {
+ openPreferences("privacy-securitylevel");
+ this.hide();
+ },
+
+ // callback when prefs change
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider" || data == "security_custom") {
+ this._configUIFromPrefs();
+ }
+ break;
+ }
+ },
+
+ // callback when the panel is displayed
+ onPopupShown : function(event) {
+ SecurityLevelButton.button.setAttribute("open", "true");
+ },
+
+ // callback when the panel is hidden
+ onPopupHidden : function(event) {
+ SecurityLevelButton.button.removeAttribute("open");
+ }
+}; /* Security Level Panel */
+
+/*
+ Security Level Preferences Code
+
+ Code to handle init and update of security level section in about:preferences#privacy
+*/
+
+const SecurityLevelPreferences =
+{
+ _securityPrefsBranch : null,
+
+ _populateXUL : function() {
+ let groupbox = document.getElementById("securityLevel-groupbox");
+
+ let labelHeader = groupbox.querySelector("#securityLevel-header");
+ labelHeader.textContent = TorStrings.securityLevel.securityLevel;
+
+ let spanOverview = groupbox.querySelector("#securityLevel-overview");
+ spanOverview.textContent = TorStrings.securityLevel.overview;
+
+ let labelLearnMore = groupbox.querySelector("#securityLevel-learnMore");
+ labelLearnMore.setAttribute("value", TorStrings.securityLevel.learnMore);
+ labelLearnMore.setAttribute("href", TorStrings.securityLevel.learnMoreURL);
+
+ let radiogroup = document.getElementById("securityLevel-radiogroup");
+ radiogroup.addEventListener("command", SecurityLevelPreferences.selectSecurityLevel);
+
+ let populateRadioElements = function(vboxQuery, stringStruct) {
+ let vbox = groupbox.querySelector(vboxQuery);
+
+ let radio = vbox.querySelector("radio");
+ radio.setAttribute("label", stringStruct.level);
+
+ let customWarning = vbox.querySelector("#securityLevel-customWarning");
+ customWarning.setAttribute("value", TorStrings.securityLevel.customWarning);
+
+ let labelSummary = vbox.querySelector("#securityLevel-summary");
+ labelSummary.textContent = stringStruct.summary;
+
+ let labelRestoreDefaults = vbox.querySelector("#securityLevel-restoreDefaults");
+ labelRestoreDefaults.setAttribute("value", TorStrings.securityLevel.restoreDefaults);
+ labelRestoreDefaults.addEventListener("click", SecurityLevelPreferences.restoreDefaults);
+
+ let description1 = vbox.querySelector("#securityLevel-description1");
+ if (description1) {
+ description1.textContent = stringStruct.description1;
+ }
+ let description2 = vbox.querySelector("#securityLevel-description2");
+ if (description2) {
+ description2.textContent = stringStruct.description2;
+ }
+ let description3 = vbox.querySelector("#securityLevel-description3");
+ if (description3) {
+ description3.textContent = stringStruct.description3;
+ }
+ };
+
+ populateRadioElements("#securityLevel-vbox-standard", TorStrings.securityLevel.standard);
+ populateRadioElements("#securityLevel-vbox-safer", TorStrings.securityLevel.safer);
+ populateRadioElements("#securityLevel-vbox-safest", TorStrings.securityLevel.safest);
+ },
+
+ _configUIFromPrefs : function() {
+ // read our prefs
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let securityCustom = SecurityLevelPrefs.securityCustom;
+
+ // get our elements
+ let groupbox = document.getElementById("securityLevel-groupbox");
+
+ let radiogroup = groupbox.querySelector("#securityLevel-radiogroup");
+ let labelStandardCustom = groupbox.querySelector("#securityLevel-vbox-standard label#securityLevel-customWarning");
+ let labelSaferCustom = groupbox.querySelector("#securityLevel-vbox-safer label#securityLevel-customWarning");
+ let labelSafestCustom = groupbox.querySelector("#securityLevel-vbox-safest label#securityLevel-customWarning");
+ let labelStandardRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-standard label#securityLevel-restoreDefaults");
+ let labelSaferRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-safer label#securityLevel-restoreDefaults");
+ let labelSafestRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-safest label#securityLevel-restoreDefaults");
+
+ // hide custom label by default until we know which level we're at
+ labelStandardCustom.hidden = true;
+ labelSaferCustom.hidden = true;
+ labelSafestCustom.hidden = true;
+
+ labelStandardRestoreDefaults.hidden = true;
+ labelSaferRestoreDefaults.hidden = true;
+ labelSafestRestoreDefaults.hidden = true;
+
+ switch(securitySlider) {
+ // standard
+ case 4:
+ radiogroup.value = "standard";
+ labelStandardCustom.hidden = !securityCustom;
+ labelStandardRestoreDefaults.hidden = !securityCustom;
+ break;
+ // safer
+ case 2:
+ radiogroup.value = "safer";
+ labelSaferCustom.hidden = !securityCustom;
+ labelSaferRestoreDefaults.hidden = !securityCustom;
+ break;
+ // safest
+ case 1:
+ radiogroup.value = "safest";
+ labelSafestCustom.hidden = !securityCustom;
+ labelSafestRestoreDefaults.hidden = !securityCustom;
+ break;
+ }
+ },
+
+ init : function() {
+ // populate XUL with localized strings
+ this._populateXUL();
+
+ // read prefs and populate UI
+ this._configUIFromPrefs();
+
+ // register for pref chagnes
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+ },
+
+ uninit : function() {
+ // unregister for pref change events
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+ },
+
+ // callback for when prefs change
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider" ||
+ data == "security_custom") {
+ this._configUIFromPrefs();
+ }
+ break;
+ }
+ },
+
+ selectSecurityLevel : function() {
+ // radio group elements
+ let radiogroup = document.getElementById("securityLevel-radiogroup");
+
+ // update pref based on selected radio option
+ switch (radiogroup.value) {
+ case "standard":
+ SecurityLevelPrefs.securitySlider = 4;
+ break;
+ case "safer":
+ SecurityLevelPrefs.securitySlider = 2;
+ break;
+ case "safest":
+ SecurityLevelPrefs.securitySlider = 1;
+ break;
+ }
+
+ SecurityLevelPreferences.restoreDefaults();
+ },
+
+ restoreDefaults : function() {
+ SecurityLevelPrefs.securityCustom = false;
+ },
+}; /* Security Level Prefereces */
+
+Object.defineProperty(this, "SecurityLevelButton", {
+ value: SecurityLevelButton,
+ enumerable: true,
+ writable: false
+});
+
+Object.defineProperty(this, "SecurityLevelPanel", {
+ value: SecurityLevelPanel,
+ enumerable: true,
+ writable: false
+});
+
+Object.defineProperty(this, "SecurityLevelPreferences", {
+ value: SecurityLevelPreferences,
+ enumerable: true,
+ writable: false
+});
diff --git a/browser/components/securitylevel/content/securityLevelButton.css b/browser/components/securitylevel/content/securityLevelButton.css
new file mode 100644
index 000000000000..81f2365bae28
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.css
@@ -0,0 +1,9 @@
+toolbarbutton#security-level-button.standard {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#standard");
+}
+toolbarbutton#security-level-button.safer {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#safer");
+}
+toolbarbutton#security-level-button.safest {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#safest");
+}
diff --git a/browser/components/securitylevel/content/securityLevelButton.inc.xhtml b/browser/components/securitylevel/content/securityLevelButton.inc.xhtml
new file mode 100644
index 000000000000..96ee1ec0ca49
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.inc.xhtml
@@ -0,0 +1,7 @@
+<toolbarbutton id="security-level-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ badged="true"
+ removable="true"
+ onmousedown="SecurityLevelButton.onCommand(event);"
+ onkeypress="SecurityLevelButton.onCommand(event);"
+ closemenu="none"
+ cui-areatype="toolbar"/>
diff --git a/browser/components/securitylevel/content/securityLevelButton.svg b/browser/components/securitylevel/content/securityLevelButton.svg
new file mode 100644
index 000000000000..8535cdcc531e
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.svg
@@ -0,0 +1,21 @@
+<svg width="14px" height="16px" viewBox="0 0 14 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <style>
+ use:not(:target) {
+ display: none;
+ }
+ </style>
+ <defs>
+ <g id="standard_icon" stroke="none" stroke-width="1">
+ <path d="M7.0 2.16583509C7.0 2.16583509 2.0 4.24375717 2.0 4.24375717C2.0 4.24375717 2.0 7.27272727 2.0 7.27272727C2.0 10.2413541 4.13435329 13.0576771 7.0 13.9315843C9.8656467 13.0576771 12.0 10.2413541 12.0 7.27272727C12.0 7.27272727 12.0 4.24375717 12.0 4.24375717C12.0 4.24375717 7.0 2.16583509 7.0 2.16583509C7.0 2.16583509 7.0 2.16583509 7.0 2.16583509M7.0 0.0C7.0 0.0 14.0 2.90909091 14.0 2.90909091C14.0 2.90909091 14.0 7.27272727 14.0 7.27272727C14.0 11.3090909 11.0133333 15.0836364 7.0 16.0C2.98666667 15.0836364 0.0 11.3090909 0.0 7.27272727C0.0 7.27272727 0.0 2.90909091 0.0 2.90909091C0.0 2.90909091 7.0 0.0 7.0 0.0C7.0 0.0 7.0 0.0 7.0 0.0" />
+ </g>
+ <g id="safer_icon" stroke="none" stroke-width="1">
+ <path fill-rule="nonzero" d="M7.0 2.1658351C7.0 13.931584 7.0 2.1658351 7.0 13.931584C9.8656467 13.057677 12.0 10.241354 12.0 7.2727273C12.0 7.2727273 12.0 4.2437572 12.0 4.2437572C12.0 4.2437572 7.0 2.1658351 7.0 2.1658351C7.0 2.1658351 7.0 2.1658351 7.0 2.1658351M7.0 0.0C7.0 0.0 14.0 2.9090909 14.0 2.9090909C14.0 2.9090909 14.0 7.2727273 14.0 7.2727273C14.0 11.309091 11.013333 15.083636 7.0 16.0C2.9866667 15.083636 0.0 11.309091 0.0 7.2727273C0.0 7.2727273 0.0 2.9090909 0.0 2.9090909C0.0 2.9090909 7.0 0.0 7.0 0.0"/>
+ </g>
+ <g id="safest_icon" stroke="none" stroke-width="1">
+ <path d="M7.0 0.0C7.0 0.0 14.0 2.90909091 14.0 2.90909091C14.0 2.90909091 14.0 7.27272727 14.0 7.27272727C14.0 11.3090909 11.0133333 15.0836364 7.0 16.0C2.98666667 15.0836364 0.0 11.3090909 0.0 7.27272727C0.0 7.27272727 0.0 2.90909091 0.0 2.90909091C0.0 2.90909091 7.0 0.0 7.0 0.0C7.0 0.0 7.0 0.0 7.0 0.0" />
+ </g>
+ </defs>
+ <use id="standard" fill="context-fill" fill-opacity="context-fill-opacity" href="#standard_icon" />
+ <use id="safer" fill="context-fill" fill-opacity="context-fill-opacity" href="#safer_icon" />
+ <use id="safest" fill="context-fill" fill-opacity="context-fill-opacity" href="#safest_icon" />
+</svg>
diff --git a/browser/components/securitylevel/content/securityLevelPanel.css b/browser/components/securitylevel/content/securityLevelPanel.css
new file mode 100644
index 000000000000..70022e2bd4b2
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPanel.css
@@ -0,0 +1,82 @@
+/* Security Level CSS */
+
+panel#securityLevel-panel > .panel-arrowcontainer > .panel-arrowcontent {
+ padding: 0;
+}
+
+panelview#securityLevel-panelview {
+ width: 20em;
+}
+
+panelview#securityLevel-panelview>vbox.panel-subview-body {
+ padding: 1em;
+}
+
+label#securityLevel-header {
+ text-transform: uppercase;
+ color: var(--panel-disabled-color);
+ font-size: 0.85em;
+ margin: 0 0 0.4em 0;
+ padding: 0;
+}
+
+hbox#securityLevel-levelHbox {
+ margin-bottom: 1em;
+}
+
+label#securityLevel-level {
+ font-size: 1.5em;
+ margin: 0 0.5em 0 0;
+ padding: 0;
+}
+
+label#securityLevel-customWarning {
+ border-radius: 2px;
+ background-color: #ffe845;
+ text-transform: uppercase;
+ font-weight: bolder;
+ font-size: 0.8em;
+ height: 1em;
+ line-height: 1em;
+ vertical-align: middle;
+ margin: auto;
+ padding: 0.4em;
+}
+
+panelview#securityLevel-panelview description {
+ margin: 0 -0.5em 0.5em 0;
+ padding: 0 !important;
+}
+
+label#securityLevel-learnMore {
+ margin: 0 0 1.0em 0;
+ padding: 0;
+}
+
+panelview#securityLevel-panelview button {
+ -moz-appearance: none;
+ background-color: var(--arrowpanel-dimmed);
+}
+
+panelview#securityLevel-panelview button:hover {
+ background-color: var(--arrowpanel-dimmed-further);
+}
+
+panelview#securityLevel-panelview button:active {
+ background-color: var(--arrowpanel-dimmed-even-further);
+}
+
+button#securityLevel-restoreDefaults {
+ margin: 0 0 1.0em 0;
+ padding: 0.45em;
+ color: inherit !important;
+}
+
+button#securityLevel-advancedSecuritySettings {
+ margin: 0 -1.0em -1.0em -1.0em;
+ border-radius: 0;
+ border-top: 1px solid var(--panel-separator-color);
+ padding: 0;
+ height: 3.0em;
+ color: inherit !important;
+}
diff --git a/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml b/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
new file mode 100644
index 000000000000..4abbb12dd856
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
@@ -0,0 +1,38 @@
+<panel id="securityLevel-panel"
+ role="group"
+ type="arrow"
+ orient="vertical"
+ level="top"
+ hidden="true"
+ class="panel-no-padding"
+ onpopupshown="SecurityLevelPanel.onPopupShown(event);"
+ onpopuphidden="SecurityLevelPanel.onPopupHidden(event);"
+ >
+ <panelmultiview mainViewId="securityLevel-panelview">
+ <panelview id="securityLevel-panelview" descriptionheightworkaround="true">
+ <vbox class="panel-subview-body">
+ <label id="securityLevel-header"/>
+ <hbox id="securityLevel-levelHbox">
+ <label id="securityLevel-level"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description id="securityLevel-summary"/>
+ <label
+ id="securityLevel-learnMore"
+ class="learnMore text-link"
+ onclick="SecurityLevelPanel.hide();"
+ is="text-link"/>
+ <button
+ id="securityLevel-restoreDefaults"
+ oncommand="SecurityLevelPanel.restoreDefaults();"/>
+ <button
+ id="securityLevel-advancedSecuritySettings"
+ oncommand="SecurityLevelPanel.openAdvancedSecuritySettings();"/>
+ </vbox>
+ </panelview>
+ </panelmultiview>
+</panel>
diff --git a/browser/components/securitylevel/content/securityLevelPreferences.css b/browser/components/securitylevel/content/securityLevelPreferences.css
new file mode 100644
index 000000000000..0d1040d177d8
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPreferences.css
@@ -0,0 +1,26 @@
+label#securityLevel-customWarning {
+ border-radius: 2px;
+ background-color: #ffe845;
+ text-transform: uppercase;
+ font-weight: bolder;
+ font-size: 0.7em;
+ height: 1em;
+ line-height: 1em;
+ padding: 0.35em;
+}
+
+radiogroup#securityLevel-radiogroup radio {
+ font-weight: bold;
+}
+
+vbox#securityLevel-vbox-standard,
+vbox#securityLevel-vbox-safer,
+vbox#securityLevel-vbox-safest {
+ margin-top: 0.4em;
+}
+
+vbox#securityLevel-vbox-standard description.indent,
+vbox#securityLevel-vbox-safer description.indent,
+vbox#securityLevel-vbox-safest description.indent {
+ margin-inline-start: 0 !important;
+}
diff --git a/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml b/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
new file mode 100644
index 000000000000..a108d44a7b51
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
@@ -0,0 +1,62 @@
+<groupbox id="securityLevel-groupbox" data-category="panePrivacy" hidden="true">
+ <label><html:h2 id="securityLevel-header"/></label>
+ <vbox data-subcategory="securitylevel" flex="1">
+ <description flex="1">
+ <html:span id="securityLevel-overview" class="tail-with-learn-more"/>
+ <label id="securityLevel-learnMore" class="learnMore text-link" is="text-link"/>
+ </description>
+ <radiogroup id="securityLevel-radiogroup">
+ <vbox id="securityLevel-vbox-standard">
+ <hbox>
+ <radio value="standard"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ </vbox>
+ <vbox id="securityLevel-vbox-safer">
+ <hbox>
+ <radio value="safer"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ <description id="securityLevel-description1" class="indent tip-caption"/>
+ <description id="securityLevel-description2" class="indent tip-caption"/>
+ <description id="securityLevel-description3" class="indent tip-caption"/>
+ </vbox>
+ <vbox id="securityLevel-vbox-safest">
+ <hbox>
+ <radio value="safest"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ <description id="securityLevel-description1" class="indent tip-caption"/>
+ <description id="securityLevel-description2" class="indent tip-caption"/>
+ <description id="securityLevel-description3" class="indent tip-caption"/>
+ </vbox>
+ </radiogroup>
+ </vbox>
+</groupbox>
diff --git a/browser/components/securitylevel/jar.mn b/browser/components/securitylevel/jar.mn
new file mode 100644
index 000000000000..9ac408083fbc
--- /dev/null
+++ b/browser/components/securitylevel/jar.mn
@@ -0,0 +1,6 @@
+browser.jar:
+ content/browser/securitylevel/securityLevel.js (content/securityLevel.js)
+ content/browser/securitylevel/securityLevelPanel.css (content/securityLevelPanel.css)
+ content/browser/securitylevel/securityLevelButton.css (content/securityLevelButton.css)
+ content/browser/securitylevel/securityLevelPreferences.css (content/securityLevelPreferences.css)
+ content/browser/securitylevel/securityLevelButton.svg (content/securityLevelButton.svg)
diff --git a/browser/components/securitylevel/moz.build b/browser/components/securitylevel/moz.build
new file mode 100644
index 000000000000..7e103239c8d6
--- /dev/null
+++ b/browser/components/securitylevel/moz.build
@@ -0,0 +1 @@
+JAR_MANIFESTS += ['jar.mn']
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 23247: Communicating security expectations for .onion
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit 3b0641f3b4ae08f0d6214d5cebbee793bad803f0
Author: Richard Pospesel <richard(a)torproject.org>
Date: Fri Jun 8 13:38:40 2018 -0700
Bug 23247: Communicating security expectations for .onion
Encrypting pages hosted on Onion Services with SSL/TLS is redundant
(in terms of hiding content) as all traffic within the Tor network is
already fully encrypted. Therefore, serving HTTP pages from an Onion
Service is more or less fine.
Prior to this patch, Tor Browser would mostly treat pages delivered
via Onion Services as well as pages delivered in the ordinary fashion
over the internet in the same way. This created some inconsistencies
in behaviour and misinformation presented to the user relating to the
security of pages delivered via Onion Services:
- HTTP Onion Service pages did not have any 'lock' icon indicating
the site was secure
- HTTP Onion Service pages would be marked as unencrypted in the Page
Info screen
- Mixed-mode content restrictions did not apply to HTTP Onion Service
pages embedding Non-Onion HTTP content
This patch fixes the above issues, and also adds several new 'Onion'
icons to the mix to indicate all of the various permutations of Onion
Services hosted HTTP or HTTPS pages with HTTP or HTTPS content.
Strings for Onion Service Page Info page are pulled from Torbutton's
localization strings.
---
browser/base/content/browser-siteIdentity.js | 39 ++++++++-----
browser/base/content/pageinfo/security.js | 64 ++++++++++++++++++----
.../shared/identity-block/identity-block.inc.css | 19 +++++++
.../themes/shared/identity-block/onion-slash.svg | 5 ++
.../themes/shared/identity-block/onion-warning.svg | 6 ++
browser/themes/shared/identity-block/onion.svg | 3 +
browser/themes/shared/jar.inc.mn | 3 +
dom/base/nsContentUtils.cpp | 19 +++++++
dom/base/nsContentUtils.h | 5 ++
dom/base/nsGlobalWindowOuter.cpp | 3 +-
dom/ipc/WindowGlobalActor.cpp | 4 +-
dom/ipc/WindowGlobalChild.cpp | 6 +-
dom/presentation/PresentationRequest.cpp | 3 +-
dom/security/nsMixedContentBlocker.cpp | 16 +++++-
security/manager/ssl/nsSecureBrowserUI.cpp | 12 ++++
15 files changed, 175 insertions(+), 32 deletions(-)
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 80c3f2a86538..9da8fab971c6 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -131,6 +131,10 @@ var gIdentityHandler = {
);
},
+ get _uriIsOnionHost() {
+ return this._uriHasHost ? this._uri.host.toLowerCase().endsWith(".onion") : false;
+ },
+
// smart getters
get _identityPopup() {
delete this._identityPopup;
@@ -624,9 +628,9 @@ var gIdentityHandler = {
get pointerlockFsWarningClassName() {
// Note that the fullscreen warning does not handle _isSecureInternalUI.
if (this._uriHasHost && this._isSecureConnection) {
- return "verifiedDomain";
+ return this._uriIsOnionHost ? "onionVerifiedDomain" : "verifiedDomain";
}
- return "unknownIdentity";
+ return this._uriIsOnionHost ? "onionUnknownIdentity" : "unknownIdentity";
},
/**
@@ -634,6 +638,10 @@ var gIdentityHandler = {
* built-in (returns false) or imported (returns true).
*/
_hasCustomRoot() {
+ if (!this._secInfo) {
+ return false;
+ }
+
let issuerCert = null;
issuerCert = this._secInfo.succeededCertChain[
this._secInfo.succeededCertChain.length - 1
@@ -676,11 +684,13 @@ var gIdentityHandler = {
"identity.extension.label",
[extensionName]
);
- } else if (this._uriHasHost && this._isSecureConnection) {
+ } else if (this._uriHasHost && this._isSecureConnection && this._secInfo) {
// This is a secure connection.
- this._identityBox.className = "verifiedDomain";
+ // _isSecureConnection implicitly includes onion services, which may not have an SSL certificate
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.className = uriIsOnionHost ? "onionVerifiedDomain" : "verifiedDomain";
if (this._isMixedActiveContentBlocked) {
- this._identityBox.classList.add("mixedActiveBlocked");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedActiveBlocked" : "mixedActiveBlocked");
}
if (!this._isCertUserOverridden) {
// It's a normal cert, verifier is the CA Org.
@@ -691,17 +701,17 @@ var gIdentityHandler = {
}
} else if (this._isBrokenConnection) {
// This is a secure connection, but something is wrong.
- this._identityBox.className = "unknownIdentity";
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.className = uriIsOnionHost ? "onionUnknownIdentity" : "unknownIdentity";
if (this._isMixedActiveContentLoaded) {
- this._identityBox.classList.add("mixedActiveContent");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedActiveContent" : "mixedActiveContent");
} else if (this._isMixedActiveContentBlocked) {
- this._identityBox.classList.add(
- "mixedDisplayContentLoadedActiveBlocked"
- );
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedDisplayContentLoadedActiveBlocked" : "mixedDisplayContentLoadedActiveBlocked");
} else if (this._isMixedPassiveContentLoaded) {
- this._identityBox.classList.add("mixedDisplayContent");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedDisplayContent" : "mixedDisplayContent");
} else {
+ // TODO: ignore weak https cipher for onionsites?
this._identityBox.classList.add("weakCipher");
}
} else if (this._isAboutCertErrorPage) {
@@ -713,8 +723,8 @@ var gIdentityHandler = {
(gBrowser.selectedBrowser.documentURI.scheme == "about" ||
gBrowser.selectedBrowser.documentURI.scheme == "chrome"))
) {
- // This is a local resource (and shouldn't be marked insecure).
- this._identityBox.className = "unknownIdentity";
+ // This is a local resource or an onion site (and shouldn't be marked insecure).
+ this._identityBox.className = this._uriIsOnionHost ? "onionUnknownIdentity" : "unknownIdentity";
} else {
// This is an insecure connection.
let warnOnInsecure =
@@ -738,7 +748,8 @@ var gIdentityHandler = {
}
if (this._isCertUserOverridden) {
- this._identityBox.classList.add("certUserOverridden");
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.classList.add(uriIsOnionHost ? "onionCertUserOverridden" : "certUserOverridden");
// Cert is trusted because of a security exception, verifier is a special string.
tooltip = gNavigatorBundle.getString(
"identity.identified.verified_by_you"
diff --git a/browser/base/content/pageinfo/security.js b/browser/base/content/pageinfo/security.js
index 966d3fdb3901..4331ebc4b219 100644
--- a/browser/base/content/pageinfo/security.js
+++ b/browser/base/content/pageinfo/security.js
@@ -22,6 +22,13 @@ ChromeUtils.defineModuleGetter(
"PluralForm",
"resource://gre/modules/PluralForm.jsm"
);
+XPCOMUtils.defineLazyGetter(
+ this,
+ "gTorButtonBundle",
+ function() {
+ return Services.strings.createBundle("chrome://torbutton/locale/torbutton.properties");
+ }
+);
var security = {
async init(uri, windowInfo) {
@@ -70,6 +77,11 @@ var security = {
(Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT);
var isEV = ui.state & Ci.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL;
+ var isOnion = false;
+ const hostName = this.windowInfo.hostName;
+ if (hostName && hostName.endsWith(".onion")) {
+ isOnion = true;
+ }
let secInfo = await window.opener.gBrowser.selectedBrowser.browsingContext.currentWindowGlobal.getSecurityInfo();
if (secInfo) {
@@ -95,6 +107,7 @@ var security = {
isBroken,
isMixed,
isEV,
+ isOnion,
cert,
certChain: certChainArray,
certificateTransparency: undefined,
@@ -154,6 +167,7 @@ var security = {
isBroken,
isMixed,
isEV,
+ isOnion,
cert: null,
certificateTransparency: null,
};
@@ -350,22 +364,50 @@ async function securityOnLoad(uri, windowInfo) {
}
msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
} else if (info.encryptionStrength > 0) {
- hdr = pkiBundle.getFormattedString(
- "pageInfo_EncryptionWithBitsAndProtocol",
- [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
- );
+ if (!info.isOnion) {
+ hdr = pkiBundle.getFormattedString(
+ "pageInfo_EncryptionWithBitsAndProtocol",
+ [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
+ );
+ } else {
+ try {
+ hdr = gTorButtonBundle.formatStringFromName(
+ "pageInfo_OnionEncryptionWithBitsAndProtocol",
+ [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
+ );
+ } catch(err) {
+ hdr = "Connection Encrypted (Onion Service, "
+ + info.encryptionAlgorithm
+ + ", "
+ + info.encryptionStrength
+ + " bit keys, "
+ + info.version
+ + ")";
+ }
+ }
msg1 = pkiBundle.getString("pageInfo_Privacy_Encrypted1");
msg2 = pkiBundle.getString("pageInfo_Privacy_Encrypted2");
} else {
- hdr = pkiBundle.getString("pageInfo_NoEncryption");
- if (windowInfo.hostName != null) {
- msg1 = pkiBundle.getFormattedString("pageInfo_Privacy_None1", [
- windowInfo.hostName,
- ]);
+ if (!info.isOnion) {
+ hdr = pkiBundle.getString("pageInfo_NoEncryption");
+ if (windowInfo.hostName != null) {
+ msg1 = pkiBundle.getFormattedString("pageInfo_Privacy_None1", [
+ windowInfo.hostName,
+ ]);
+ } else {
+ msg1 = pkiBundle.getString("pageInfo_Privacy_None4");
+ }
+ msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
} else {
- msg1 = pkiBundle.getString("pageInfo_Privacy_None4");
+ try {
+ hdr = gTorButtonBundle.GetStringFromName("pageInfo_OnionEncryption");
+ } catch (err) {
+ hdr = "Connection Encrypted (Onion Service)";
+ }
+
+ msg1 = pkiBundle.getString("pageInfo_Privacy_Encrypted1");
+ msg2 = pkiBundle.getString("pageInfo_Privacy_Encrypted2");
}
- msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
}
setText("security-technical-shortform", hdr);
setText("security-technical-longform1", msg1);
diff --git a/browser/themes/shared/identity-block/identity-block.inc.css b/browser/themes/shared/identity-block/identity-block.inc.css
index 27a990e08bc8..011fb9f3081c 100644
--- a/browser/themes/shared/identity-block/identity-block.inc.css
+++ b/browser/themes/shared/identity-block/identity-block.inc.css
@@ -172,6 +172,25 @@ toolbar[brighttext] #identity-box[pageproxystate="valid"].chromeUI > #identity-i
list-style-image: url(chrome://browser/skin/connection-mixed-active-loaded.svg);
}
+#identity-box[pageproxystate="valid"].onionUnknownIdentity > #identity-icon,
+#identity-box[pageproxystate="valid"].onionVerifiedDomain > #identity-icon,
+#identity-box[pageproxystate="valid"].onionMixedActiveBlocked > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion.svg);
+ visibility: visible;
+}
+
+#identity-box[pageproxystate="valid"].onionMixedDisplayContent > #identity-icon,
+#identity-box[pageproxystate="valid"].onionMixedDisplayContentLoadedActiveBlocked > #identity-icon,
+#identity-box[pageproxystate="valid"].onionCertUserOverridden > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion-warning.svg);
+ visibility: visible;
+}
+
+#identity-box[pageproxystate="valid"].onionMixedActiveContent > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion-slash.svg);
+ visibility: visible;
+}
+
#permissions-granted-icon {
list-style-image: url(chrome://browser/skin/permissions.svg);
}
diff --git a/browser/themes/shared/identity-block/onion-slash.svg b/browser/themes/shared/identity-block/onion-slash.svg
new file mode 100644
index 000000000000..e7c98b769482
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion-slash.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M3.409559 13.112147C3.409559 13.112147 8.200807 8.103115 8.200807 8.103115C8.200807 8.103115 8.200807 6.516403 8.200807 6.516403C8.620819 6.516403 9.009719 6.703075 9.274171 6.998639C9.274171 6.998639 10.160863 6.080835 10.160863 6.080835C9.663071 5.567487 8.978607 5.256367 8.200807 5.256367C8.200807 5.256367 8.200807 4.400787 8.200807 4.400787C9.196391 4.400787 10.098639 4.805243 10.736435 5.458595C10.736435 5.458595 11.623127 4.540791 11.623127 4.540791C10.751991 3.669655 9.538623 3.125195 8.200807 3.125195C8.200807 3.125195 8.200807 2.269615 8.200807 2.269615C9.756407 2.269615 11.172003 2.907411 12.214255 3.918551C12.214255 3.918551 13.100947 3.000747 13.100947 3.000747C11.825355 1.756267 10.098639 0.994023 8.185251 0.994023C4.311807 0.994023 1.185051 4.120779 1.185051 7.994223C1.185051 10.016503 2.040631 11.836555 3.409559 13.112147C3.409559 13.112147 3.409559 13.112147 3.409559 13.112147" fill-opacity="context-fill-opacity" fill="context-fill" />
+ <path d="M14.205423 4.416343C14.205423 4.416343 13.287619 5.380815 13.287619 5.380815C13.692075 6.158615 13.909859 7.045307 13.909859 7.994223C13.909859 11.152091 11.358675 13.718831 8.200807 13.718831C8.200807 13.718831 8.200807 12.863251 8.200807 12.863251C10.891995 12.863251 13.069835 10.669855 13.069835 7.978667C13.069835 7.278647 12.929831 6.625295 12.665379 6.018611C12.665379 6.018611 11.685351 7.045307 11.685351 7.045307C11.763131 7.340871 11.809799 7.651991 11.809799 7.963111C11.809799 9.954279 10.207531 11.556547 8.216363 11.572103C8.216363 11.572103 8.216363 10.716523 8.216363 10.716523C9.725295 10.700967 10.954219 9.472043 10.954219 7.963111C10.954219 7.916443 10.954219 7.854219 10.954219 7.807551C10.954219 7.807551 4.887379 14.169955 4.887379 14.169955C5.867407 14.698859 6.987439 14.994423 8.185251 14.994423C12.058695 14.994423 15.185451 11.867667 15.185451 7.994223C15.185451 6.687519 14.827663 5.474151 14.205423 4.416343C14.205423 4.416343 14.205423 4.416343 14.205423
4.416343" fill-opacity="context-fill-opacity" fill="context-fill" />
+ <path d="M1.791735 15.461103C1.402835 15.461103 1.045047 15.212207 0.889487 14.838863C0.733927 14.465519 0.827267 14.014395 1.107271 13.734387C1.107271 13.734387 13.458735 0.822907 13.458735 0.822907C13.847635 0.434007 14.454319 0.449563 14.827663 0.838467C15.201007 1.227367 15.216563 1.865163 14.843223 2.269619C14.843223 2.269619 2.491759 15.181099 2.491759 15.181099C2.289531 15.352215 2.040635 15.461107 1.791739 15.461107C1.791739 15.461107 1.791735 15.461103 1.791735 15.461103" fill="#ff0039" />
+</svg>
diff --git a/browser/themes/shared/identity-block/onion-warning.svg b/browser/themes/shared/identity-block/onion-warning.svg
new file mode 100644
index 000000000000..d42a7dab7246
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion-warning.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M15.8630401732 14.127C15.8630401732 14.127 12.6649598146 7.716 12.6649598146 7.716C12.4469357756 7.279935 12.0003277145 7.0043454 11.5116853046 7.0043454C11.0230428947 7.0043454 10.5764348336 7.279935 10.3584107946 7.716C10.3584107946 7.716 7.1573218938 14.127 7.1573218938 14.127C6.95646770542 14.527294 6.97733695982 15.002669 7.21250176686 15.38393C7.4476665739 15.765191 7.86372750208 15.998191 8.3126020986 16.0C8.3126020986 16.0 14.7077599684 16.0 14.7077599684 16.0C15.1566344646 15.9982 15.572695794 15.765191 15.8078605007 15.38393C16.0430252075 15.002669 16.0638944619 14.527294 15.8630371647 14.127C15.8630371647 14.127 15.8630401732 14.127 15.8630401732 14.127" fill="#ffbf00" />
+ <path d="M11.5106824572 8.0C11.6210488221 7.99691 11.7223975832 8.060469 11.7674113916 8.161C11.7674113916 8.161 14.9644889028 14.573 14.9644889028 14.573C15.0126456349 14.66534 15.0076715118 14.776305 14.9514518866 14.864C14.9011992034 14.95041 14.8079143382 15.002854 14.7077599684 15.001048C14.7077599684 15.001048 8.3126020986 15.001048 8.3126020986 15.001048C8.2124480296 15.002854 8.1191607576 14.950409 8.0689101804 14.864C8.0124814615 14.77637 8.0075053327 14.665298 8.0558731642 14.573C8.0558731642 14.573 11.2529506754 8.161 11.2529506754 8.161C11.2981038796 8.0601247 11.3999560701 7.9964997 11.5106824572 8.0M11.5106824572 6.9999751C11.0194557096 6.9969427 10.5701148893 7.2754275 10.3554022524 7.716C10.3554022524 7.716 7.1573218938 14.127 7.1573218938 14.127C6.95646770542 14.527294 6.97733695982 15.002669 7.21250176686 15.38393C7.4476665739 15.765191 7.86372750208 15.998191 8.3126020986 16.0C8.3126020986 16.0 14.7077599684 16.0 14.7077599684 16.0C15.1566344646 15.9982 15.57269
5794 15.765191 15.8078605007 15.38393C16.0430252075 15.002669 16.0638944619 14.527294 15.8630371647 14.127C15.8630371647 14.127 12.6649598146 7.716 12.6649598146 7.716C12.4504036219 7.2757546 12.0015481798 6.9973287 11.5106824572 6.9999751C11.5106824572 6.9999751 11.5106824572 6.9999751 11.5106824572 6.9999751" opacity="0.35" fill="#d76e00" />
+ <path d="M11.5327451 12.0C11.8096733867 12.0 12.0341688 11.776142 12.0341688 11.5C12.0341688 11.5 12.0341688 9.5 12.0341688 9.5C12.0341688 9.2238576 11.8096733867 9.0 11.5327451 9.0C11.2558168133 9.0 11.0313214 9.2238576 11.0313214 9.5C11.0313214 9.5 11.0313214 11.5 11.0313214 11.5C11.0313214 11.776142 11.2558168133 12.0 11.5327451 12.0C11.5327451 12.0 11.5327451 12.0 11.5327451 12.0M11.5327451 12.809C11.1500294496 12.809 10.8397775466 13.118371 10.8397775466 13.5C10.8397775466 13.881629 11.1500294496 14.191 11.5327451 14.191C11.9154607504 14.191 12.2257126534 13.881629 12.2257126534 13.5C12.2257126534 13.118371 11.9154607504 12.809 11.5327451 12.809C11.5327451 12.809 11.5327451 12.809 11.5327451 12.809" fill="#ffffff" />
+ <path d="M7.08030321348 6.552C7.90163523408 6.56 8.5645173655 7.225 8.5645173655 8.046C8.5645173655 8.866 7.90163523408 9.532 7.08030321348 9.54C7.08030321348 9.54 7.08030321348 6.552 7.08030321348 6.552M6.30610502068 13.756C6.30610502068 13.756 9.4991711423 7.353 9.4991711423 7.353C9.5453021227 7.259 9.6144985933 7.184 9.6716608951 7.098C9.2845617987 6.039 8.2756973143 5.277 7.08030321348 5.271C7.08030321348 5.271 7.08030321348 4.417 7.08030321348 4.417C8.5043465215 4.423 9.7238089599 5.251 10.3164917733 6.443C10.6795225321 6.21 11.1067355245 6.074 11.5519997701 6.074C11.5519997701 6.074 11.5620282441 6.074 11.5620282441 6.074C11.5620282441 6.074 11.5640339389 6.074 11.5640339389 6.074C11.5660396337 6.074 11.5690481759 6.075 11.5710538707 6.075C10.8108955415 4.35 9.0900094031 3.141 7.08030321348 3.135C7.08030321348 3.135 7.08030321348 2.281 7.08030321348 2.281C9.6716608951 2.288 11.8618796167 3.993 12.5889439817 6.34C13.0231769059 6.561 13.3922247491 6.9 13.6088397875 7.344C13.60
88397875 7.344 14.1162805719 8.361 14.1162805719 8.361C14.1202919615 8.256 14.1313232829 8.152 14.1313232829 8.046C14.1313232829 4.155 10.9683425833 1.0 7.06626334988 1.0C3.16318126908 1.0 0.00020056948 4.155 0.00020056948 8.046C0.00020056948 11.603 2.64571201068 14.536 6.08046435568 15.015C6.03633907008 14.595 6.10252699848 14.16 6.30610502068 13.756C6.30610502068 13.756 6.30610502068 13.756 6.30610502068 13.756" fill-opacity="context-fill-opacity" fill="context-fill" />
+</svg>
diff --git a/browser/themes/shared/identity-block/onion.svg b/browser/themes/shared/identity-block/onion.svg
new file mode 100644
index 000000000000..b123a9786acc
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M8.01435945 13.726867125C8.01435945 13.726867125 8.01435945 12.87830525 8.01435945 12.87830525C10.70227825 12.87051775 12.87869375 10.689666 12.87869375 7.9998060125C12.87869375 5.310140275 10.70227825 3.1292621 8.01435945 3.121500325C8.01435945 3.121500325 8.01435945 2.272938975 8.01435945 2.272938975C11.170899375 2.280892725 13.727061375 4.8415202875 13.727061375 7.9998060125C13.727061375 11.158285375 11.170899375 13.719105 8.01435945 13.726867125C8.01435945 13.726867125 8.01435945 13.726867125 8.01435945 13.726867125M8.01435945 10.756805625C9.5304373 10.74884925 10.75758175 9.5180185125 10.75758175 7.9998060125C10.75758175 6.4817875 9.5304373 5.2509564125 8.01435945 5.2430005625C8.01435945 5.2430005625 8.01435945 4.3946332875 8.01435945 4.3946332875C9.999251625 4.4023945375 11.60614275 6.013167425 11.60614275 7.9998060125C11.60614275 9.986639375 9.999251625 11.597411125 8.01435945 11.605172375C8.01435945 11.605172375 8.01435945 10.756805625 8.01435945 10.756805625M8.01
435945 6.5157454625C8.8276046625 6.5235067125 9.484837025 7.184620575 9.484837025 7.9998060125C9.484837025 8.815185875 8.8276046625 9.4762985125 8.01435945 9.4840608125C8.01435945 9.4840608125 8.01435945 6.5157454625 8.01435945 6.5157454625M1.0 7.9998060125C1.0 11.8659705 4.1338360375 15.0 8.0000000875 15.0C11.8659705 15.0 15.0 11.8659705 15.0 7.9998060125C15.0 4.1338360375 11.8659705 1.0 8.0000000875 1.0C4.1338360375 1.0 1.0 4.1338360375 1.0 7.9998060125C1.0 7.9998060125 1.0 7.9998060125 1.0 7.9998060125" fill-rule="even-odd" fill-opacity="context-fill-opacity" fill="context-fill" />
+</svg>
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
index 8cfe1b69c371..71fea38eb829 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -57,6 +57,9 @@
skin/classic/browser/connection-secure.svg (../shared/identity-block/connection-secure.svg)
skin/classic/browser/connection-mixed-passive-loaded.svg (../shared/identity-block/connection-mixed-passive-loaded.svg)
skin/classic/browser/connection-mixed-active-loaded.svg (../shared/identity-block/connection-mixed-active-loaded.svg)
+ skin/classic/browser/onion.svg (../shared/identity-block/onion.svg)
+ skin/classic/browser/onion-slash.svg (../shared/identity-block/onion-slash.svg)
+ skin/classic/browser/onion-warning.svg (../shared/identity-block/onion-warning.svg)
skin/classic/browser/info.svg (../shared/info.svg)
skin/classic/browser/newInstall.css (../shared/newInstall.css)
skin/classic/browser/newInstallPage.css (../shared/newInstallPage.css)
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
index da92cb4967b0..2f090de19231 100644
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -9057,6 +9057,25 @@ bool nsContentUtils::ComputeIsSecureContext(nsIChannel* aChannel) {
return principal->GetIsOriginPotentiallyTrustworthy();
}
+/* static */ bool nsContentUtils::DocumentHasOnionURI(Document* aDocument) {
+ if (!aDocument) {
+ return false;
+ }
+
+ nsIURI* uri = aDocument->GetDocumentURI();
+ if (!uri) {
+ return false;
+ }
+
+ nsAutoCString host;
+ if (NS_SUCCEEDED(uri->GetHost(host))) {
+ bool hasOnionURI = StringEndsWith(host, NS_LITERAL_CSTRING(".onion"));
+ return hasOnionURI;
+ }
+
+ return false;
+}
+
/* static */
void nsContentUtils::TryToUpgradeElement(Element* aElement) {
NodeInfo* nodeInfo = aElement->NodeInfo();
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
index b8dc0092e32b..08a117fc2803 100644
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -2999,6 +2999,11 @@ class nsContentUtils {
*/
static bool HttpsStateIsModern(Document* aDocument);
+ /**
+ * Returns true of the document's URI is a .onion
+ */
+ static bool DocumentHasOnionURI(Document* aDocument);
+
/**
* Returns true if the channel is for top-level window and is over secure
* context.
diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp
index da9d56e843a2..abe1e56d9714 100644
--- a/dom/base/nsGlobalWindowOuter.cpp
+++ b/dom/base/nsGlobalWindowOuter.cpp
@@ -1868,7 +1868,8 @@ bool nsGlobalWindowOuter::ComputeIsSecureContext(Document* aDocument,
return false;
}
- if (nsContentUtils::HttpsStateIsModern(aDocument)) {
+ if (nsContentUtils::HttpsStateIsModern(aDocument) ||
+ nsContentUtils::DocumentHasOnionURI(aDocument)) {
return true;
}
diff --git a/dom/ipc/WindowGlobalActor.cpp b/dom/ipc/WindowGlobalActor.cpp
index 25204e1fc20e..b6dfa63fe664 100644
--- a/dom/ipc/WindowGlobalActor.cpp
+++ b/dom/ipc/WindowGlobalActor.cpp
@@ -14,6 +14,7 @@
#include "mozilla/dom/JSWindowActorParent.h"
#include "mozilla/dom/JSWindowActorChild.h"
#include "mozilla/net/CookieJarSettings.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
namespace mozilla {
namespace dom {
@@ -118,7 +119,8 @@ WindowGlobalInit WindowGlobalActor::WindowInitializer(
nsCOMPtr<nsIURI> innerDocURI = NS_GetInnermostURI(doc->GetDocumentURI());
if (innerDocURI) {
mozilla::Get<WindowContext::IDX_IsSecure>(init.context().mFields) =
- innerDocURI->SchemeIs("https");
+ innerDocURI->SchemeIs("https") ||
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI);
}
nsCOMPtr<nsIChannel> mixedChannel;
aWindow->GetDocShell()->GetMixedContentChannel(getter_AddRefs(mixedChannel));
diff --git a/dom/ipc/WindowGlobalChild.cpp b/dom/ipc/WindowGlobalChild.cpp
index d545661be835..142c35ea4e17 100644
--- a/dom/ipc/WindowGlobalChild.cpp
+++ b/dom/ipc/WindowGlobalChild.cpp
@@ -38,6 +38,8 @@
#include "nsIHttpChannelInternal.h"
#include "nsIURIMutator.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
+
using namespace mozilla::ipc;
using namespace mozilla::dom::ipc;
@@ -223,7 +225,9 @@ void WindowGlobalChild::OnNewDocument(Document* aDocument) {
nsCOMPtr<nsIURI> innerDocURI =
NS_GetInnermostURI(aDocument->GetDocumentURI());
if (innerDocURI) {
- txn.SetIsSecure(innerDocURI->SchemeIs("https"));
+ txn.SetIsSecure(
+ innerDocURI->SchemeIs("https") ||
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI));
}
nsCOMPtr<nsIChannel> mixedChannel;
mWindowGlobal->GetDocShell()->GetMixedContentChannel(
diff --git a/dom/presentation/PresentationRequest.cpp b/dom/presentation/PresentationRequest.cpp
index 020cbda1c1b1..35c0ae575568 100644
--- a/dom/presentation/PresentationRequest.cpp
+++ b/dom/presentation/PresentationRequest.cpp
@@ -468,7 +468,8 @@ bool PresentationRequest::IsProhibitMixedSecurityContexts(Document* aDocument) {
nsCOMPtr<Document> doc = aDocument;
while (doc && !nsContentUtils::IsChromeDoc(doc)) {
- if (nsContentUtils::HttpsStateIsModern(doc)) {
+ if (nsContentUtils::HttpsStateIsModern(doc) ||
+ nsContentUtils::DocumentHasOnionURI(doc)) {
return true;
}
diff --git a/dom/security/nsMixedContentBlocker.cpp b/dom/security/nsMixedContentBlocker.cpp
index 477c1543ab20..ee0fddeb3e2c 100644
--- a/dom/security/nsMixedContentBlocker.cpp
+++ b/dom/security/nsMixedContentBlocker.cpp
@@ -587,8 +587,8 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
return NS_OK;
}
- // Check the parent scheme. If it is not an HTTPS page then mixed content
- // restrictions do not apply.
+ // Check the parent scheme. If it is not an HTTPS or .onion page then mixed
+ // content restrictions do not apply.
nsCOMPtr<nsIURI> innerRequestingLocation =
NS_GetInnermostURI(requestingLocation);
if (!innerRequestingLocation) {
@@ -599,6 +599,17 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
bool parentIsHttps = innerRequestingLocation->SchemeIs("https");
if (!parentIsHttps) {
+ bool parentIsOnion = IsPotentiallyTrustworthyOnion(innerRequestingLocation);
+ if (!parentIsOnion) {
+ *aDecision = ACCEPT;
+ return NS_OK;
+ }
+ }
+
+ bool isHttpScheme = innerContentLocation->SchemeIs("http");
+ // .onion URLs are encrypted and authenticated. Don't treat them as mixed
+ // content if potentially trustworthy (i.e. whitelisted).
+ if (isHttpScheme && IsPotentiallyTrustworthyOnion(innerContentLocation)) {
*aDecision = ACCEPT;
return NS_OK;
}
@@ -618,7 +629,6 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
return NS_OK;
}
- bool isHttpScheme = innerContentLocation->SchemeIs("http");
if (isHttpScheme && IsPotentiallyTrustworthyOrigin(innerContentLocation)) {
*aDecision = ACCEPT;
return NS_OK;
diff --git a/security/manager/ssl/nsSecureBrowserUI.cpp b/security/manager/ssl/nsSecureBrowserUI.cpp
index fd9a26d42b79..0dd53ded3708 100644
--- a/security/manager/ssl/nsSecureBrowserUI.cpp
+++ b/security/manager/ssl/nsSecureBrowserUI.cpp
@@ -9,6 +9,7 @@
#include "mozilla/Logging.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/Document.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
#include "nsContentUtils.h"
#include "nsIChannel.h"
#include "nsDocShell.h"
@@ -136,6 +137,17 @@ void nsSecureBrowserUI::UpdateForLocationOrMixedContentChange() {
}
}
}
+
+ // any protocol routed over tor is secure
+ if (!(mState & nsIWebProgressListener::STATE_IS_SECURE)) {
+ nsCOMPtr<nsIURI> innerDocURI = NS_GetInnermostURI(win->GetDocumentURI());
+ if (innerDocURI &&
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI)) {
+ MOZ_LOG(gSecureBrowserUILog, LogLevel::Debug, (" is onion"));
+ mState = (mState & ~nsIWebProgressListener::STATE_IS_INSECURE) |
+ nsIWebProgressListener::STATE_IS_SECURE;
+ }
+ }
}
// Add the mixed content flags from the window
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 27511: Add new identity button to toolbar
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit 7034e1a388f1375662e4f5285f2525db319e2331
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Oct 4 19:08:33 2019 +0200
Bug 27511: Add new identity button to toolbar
Also added 'New circuit for this site' button to CustomizableUI, but
not visible by default.
---
browser/base/content/browser.xhtml | 10 ++++++++++
.../components/customizableui/CustomizableUI.jsm | 21 +++++++++++++++++++++
browser/themes/shared/icons/new_circuit.svg | 8 ++++++++
browser/themes/shared/icons/new_identity.svg | 9 +++++++++
browser/themes/shared/jar.inc.mn | 3 +++
browser/themes/shared/menupanel.inc.css | 8 ++++++++
browser/themes/shared/toolbarbutton-icons.inc.css | 8 ++++++++
7 files changed, 67 insertions(+)
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 9f9d4aedd3c3..7032d6c4cfe1 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -1295,6 +1295,16 @@
ondragenter="newWindowButtonObserver.onDragOver(event)"
ondragexit="newWindowButtonObserver.onDragExit(event)"/>
+ <toolbarbutton id="new-identity-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&torbutton.context_menu.new_identity;"
+ oncommand="torbutton_new_identity();"
+ tooltiptext="&torbutton.context_menu.new_identity;"/>
+
+ <toolbarbutton id="new-circuit-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&torbutton.context_menu.new_circuit;"
+ oncommand="torbutton_new_circuit();"
+ tooltiptext="&torbutton.context_menu.new_circuit;"/>
+
<toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
observes="View:FullScreen"
type="checkbox"
diff --git a/browser/components/customizableui/CustomizableUI.jsm b/browser/components/customizableui/CustomizableUI.jsm
index e2f006c73464..1c0064249158 100644
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -68,6 +68,8 @@ const kSubviewEvents = ["ViewShowing", "ViewHiding"];
*/
var kVersion = 16;
+var kTorVersion = 1;
+
/**
* Buttons removed from built-ins by version they were removed. kVersion must be
* bumped any time a new id is added to this. Use the button id as key, and
@@ -566,6 +568,20 @@ var CustomizableUIInternal = {
navbarPlacements.push("fxa-toolbar-menu-button");
}
}
+
+ let currentTorVersion = gSavedState.currentTorVersion;
+ if (currentTorVersion < 1 && gSavedState.placements) {
+ let navbarPlacements = gSavedState.placements[CustomizableUI.AREA_NAVBAR];
+ if (navbarPlacements) {
+ let secLevelIndex = navbarPlacements.indexOf("security-level-button");
+ if (secLevelIndex === -1) {
+ let urlbarIndex = navbarPlacements.indexOf("urlbar-container");
+ secLevelIndex = urlbarIndex + 1;
+ navbarPlacements.splice(secLevelIndex, 0, "security-level-button");
+ }
+ navbarPlacements.splice(secLevelIndex + 1, 0, "new-identity-button");
+ }
+ }
},
/**
@@ -2369,6 +2385,10 @@ var CustomizableUIInternal = {
gSavedState.currentVersion = 0;
}
+ if (!("currentTorVersion" in gSavedState)) {
+ gSavedState.currentTorVersion = 0;
+ }
+
gSeenWidgets = new Set(gSavedState.seen || []);
gDirtyAreaCache = new Set(gSavedState.dirtyAreaCache || []);
gNewElementCount = gSavedState.newElementCount || 0;
@@ -2447,6 +2467,7 @@ var CustomizableUIInternal = {
seen: gSeenWidgets,
dirtyAreaCache: gDirtyAreaCache,
currentVersion: kVersion,
+ currentTorVersion: kTorVersion,
newElementCount: gNewElementCount,
};
diff --git a/browser/themes/shared/icons/new_circuit.svg b/browser/themes/shared/icons/new_circuit.svg
new file mode 100644
index 000000000000..e0a93cc83502
--- /dev/null
+++ b/browser/themes/shared/icons/new_circuit.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>Icon / New Circuit(a)1.5x</title>
+ <g id="Icon-/-New-Circuit" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <path d="M13.4411138,10.1446317 L9.5375349,10.1446317 C8.99786512,10.1446317 8.56164018,10.5818326 8.56164018,11.1205264 C8.56164018,11.6592203 8.99786512,12.0964212 9.5375349,12.0964212 L11.4571198,12.0964212 C10.7554515,13.0479185 9.73466563,13.692009 8.60067597,13.9359827 C8.41818366,13.9720908 8.23276366,14.0033194 8.04734366,14.0218614 C7.97219977,14.0277168 7.89803177,14.0306445 7.82288788,14.0335722 C6.07506044,14.137017 4.290149,13.4499871 3.38647049,11.857327 C2.52280367,10.3349312 2.77263271,8.15966189 3.93687511,6.87343267 C5.12453898,5.56183017 7.44814431,5.04363008 8.21226987,3.38558497 C9.01738301,4.92847451 9.60682342,5.02801577 10.853041,6.15029468 C11.2892659,6.54455615 11.9704404,7.55558307 12.1861132,8.10501179 C12.3051723,8.40949094 12.5013272,9.17947187 12.5013272,9.17947187 L14.2862386,9.17947187 C14.2091429,7.59754654 13.439162,5.96877827 12.2261248,4.93628166 C11.279507,4.13116853 10.5065984,3.84718317 9.77662911,2.8088312 C9.63219669,2.60194152 9.599
99216,2.4565332 9.56290816,2.21646311 C9.53851079,2.00762164 9.54143848,1.78511764 9.62048595,1.53919218 C9.65952174,1.41720534 9.59804037,1.28545955 9.47702943,1.23764071 L6.40296106,0.0167964277 C6.32391359,-0.0134563083 6.23413128,-0.00272146652 6.16679454,0.0480250584 L5.95502539,0.206120002 C5.85743592,0.280288 5.82815908,0.416913259 5.89159223,0.523285783 C6.70060895,1.92564648 6.36978064,2.82542141 5.8984235,3.20211676 C5.4914754,3.4900057 4.99084141,3.72226864 4.63366394,3.95453159 C3.82367132,4.47956294 3.03222071,5.02508808 2.40374451,5.76774396 C0.434388969,8.09427695 0.519291809,12.0046871 2.77165682,14.1077402 C3.65288975,14.9284676 4.70295247,15.4749686 5.81742423,15.7570022 C5.81742423,15.7570022 6.13556591,15.833122 6.21754107,15.8497122 C7.36616915,16.0829511 8.53529102,16.0146384 9.62243774,15.6672199 C9.67416016,15.6525815 9.77174963,15.620377 9.76784605,15.6154975 C10.7730176,15.2700308 11.7049971,14.7010841 12.4652191,13.90573 L12.4652191,15.0241053 C12.4652191,
15.5627992 12.901444,16 13.4411138,16 C13.9798077,16 14.4170085,15.5627992 14.4170085,15.0241053 L14.4170085,11.1205264 C14.4170085,10.5818326 13.9798077,10.1446317 13.4411138,10.1446317" id="Fill-3" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ <path d="M5.107,7.462 C4.405,8.078 4,8.946 4,9.839 C4,10.712 4.422,11.57 5.13,12.132 C5.724,12.607 6.627,12.898 7.642,12.949 L7.642,5.8 C7.39,6.029 7.103,6.227 6.791,6.387 C5.993,6.812 5.489,7.133 5.107,7.462" id="Fill-1" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ </g>
+</svg>
diff --git a/browser/themes/shared/icons/new_identity.svg b/browser/themes/shared/icons/new_identity.svg
new file mode 100644
index 000000000000..91d5b35f7e80
--- /dev/null
+++ b/browser/themes/shared/icons/new_identity.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>New Identity Icon</title>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="New-Identity-Icon" fill="#000000" fill-rule="nonzero">
+ <path d="M4.65687153,14.5532899 L5.79494313,12.0855326 C5.8689125,11.9251399 5.6620883,11.7793527 5.53742729,11.9040137 L3.77194352,13.6694975 L2.32342782,12.2228406 L4.089841,10.4564274 C4.21450201,10.3317664 4.06871482,10.1249422 3.90832206,10.1989116 L1.43773764,11.338287 L0.206601383,10.1087306 C0.0509544211,9.9532834 -0.0167994233,9.75447206 0.00351451705,9.53432844 C0.0238284574,9.31418483 0.154794797,9.13897939 0.330406365,9.0302193 L4.61213917,6.53066101 C4.98542292,6.31331572 5.42541251,6.16259067 5.8659261,6.07796117 C6.63682488,5.92985954 7.40999434,6.06817199 8.09666802,6.42610336 L12.618483,1.910278 C13.0562019,1.47313888 13.7399062,1.45652879 14.1403159,1.87828207 C14.5407256,2.30003536 14.523905,2.96081599 14.0861861,3.39795511 L9.56437119,7.91378047 C9.92258101,8.57753432 10.0391721,9.37155544 9.91292178,10.1416209 C9.85023328,10.5817332 9.67706706,10.9989392 9.45960494,11.3937636 L6.95651989,15.6478297 C6.84761416,15.82321 6.6720026,15.9319701 6.47398108
,15.9964916 C6.25354962,16.0167745 6.0544801,15.9491049 5.89883314,15.7936577 L4.65687153,14.5532899 L4.65687153,14.5532899 Z M6.35600863,9.57888316 C6.35684236,9.57982492 6.35770616,9.58074275 6.35860024,9.58163642 L7.56801202,10.7899206 C7.78820303,11.010009 8.15567242,10.9533982 8.29166823,10.678253 C8.42766403,10.4031079 8.55818512,10.1511975 8.61427424,9.83946755 C8.73630873,9.14856819 8.51477165,8.45005355 8.01189873,7.92920397 C8.01085853,7.92816425 8.00979562,7.92715687 8.00871022,7.92618158 C8.00773493,7.92509618 8.00672754,7.92403327 8.00568783,7.92299307 C7.48483824,7.42012014 6.7863236,7.19858307 6.09542425,7.32061756 C5.78369428,7.37670668 5.53178393,7.50722777 5.25663877,7.64322357 C4.98149362,7.77921937 4.92488284,8.14668876 5.14497116,8.36687978 L6.35325537,9.57629155 C6.35414904,9.57718564 6.35506687,9.57804944 6.35600863,9.57888316 L6.35600863,9.57888316 Z M3.56503003,4.86094581 C3.44279837,4.85716019 3.33693302,4.76594656 3.31450832,4.6450962 C3.29259157,4.5009814
3 3.24425431,4.36089837 3.1719467,4.23194774 C3.04272848,4.15978087 2.90235166,4.11153221 2.75793184,4.08964745 C2.63678145,4.06729735 2.5453314,3.9616241 2.54155161,3.83961366 C2.53777182,3.71760322 2.62276629,3.61489221 2.74265726,3.59658884 C2.88757581,3.57942626 3.02687427,3.53584537 3.15371096,3.46798665 C3.21938702,3.3436261 3.26061987,3.20700605 3.27529255,3.0651408 C3.29205048,2.94466859 3.39451537,2.85825378 3.5172925,2.86104768 C3.6386065,2.86399065 3.74452528,2.95324633 3.76872081,3.07292141 C3.79288781,3.21715288 3.84342323,3.35694342 3.91777207,3.4852254 C4.04615548,3.55876237 4.18583906,3.60883869 4.32991405,3.63297757 C4.45015386,3.6576218 4.53936117,3.76418021 4.54139495,3.88559216 C4.54342874,4.00700411 4.45770065,4.10814717 4.33816215,4.12536877 C4.1960481,4.14067978 4.05931708,4.18249381 3.9349938,4.24866259 C3.86697751,4.37522253 3.82328954,4.51422019 3.80607564,4.65882867 C3.78847982,4.77811508 3.68677836,4.86339193 3.56503003,4.86094581 Z M14.4103464,14.3126948
C14.2513672,14.307719 14.1137716,14.188804 14.0849193,14.0314492 C14.045996,13.7585014 13.9510862,13.4938971 13.8061961,13.2543814 C13.5663773,13.109665 13.301434,13.0148623 13.0281329,12.9759728 C12.8707684,12.946921 12.75198,12.8095493 12.7470672,12.6509372 C12.7421545,12.492325 12.8525523,12.3587997 13.0082799,12.3350024 C13.2816632,12.3044807 13.5433622,12.2185794 13.7775725,12.0824861 C13.9099238,11.8524988 13.992337,11.5955854 14.0197279,11.3275956 C14.0417134,11.1717293 14.1740126,11.0598594 14.3327736,11.0628895 C14.4905572,11.0667732 14.6282205,11.1831391 14.6593783,11.3389665 C14.703143,11.6110771 14.8017156,11.8740418 14.9490566,12.1117486 C15.1872615,12.2578242 15.450159,12.3559923 15.7221615,12.4004323 C15.8783433,12.4324665 15.9942186,12.5709889 15.9968634,12.7288231 C15.9995083,12.8866572 15.8881575,13.0181443 15.7328877,13.0405352 C15.4641157,13.0669716 15.2064728,13.14931 14.9763475,13.2823129 C14.8406047,13.5164173 14.7548186,13.7777086 14.724105,14.0506041 C14.70
09285,14.2056508 14.5685348,14.3162427 14.4103464,14.3126948 Z M8.37194288,2.75251202 C8.23729358,2.7482977 8.12075529,2.6475812 8.09631849,2.5143077 C8.06335201,2.28313133 7.98296703,2.05902158 7.86025062,1.85616098 C7.65713325,1.73359169 7.43273641,1.65329741 7.2012608,1.62035947 C7.06797908,1.59575373 6.9673698,1.47940513 6.96320889,1.34506671 C6.95904797,1.21072829 7.05255074,1.09763741 7.18444606,1.07748204 C7.41599123,1.0516313 7.6376403,0.978876138 7.83600755,0.863610339 C7.94810399,0.668819911 8.01790485,0.45122403 8.04110388,0.224246882 C8.05972477,0.0922341146 8.17177714,-0.00251545243 8.30624168,5.089704e-05 C8.43987839,0.00334026838 8.55647391,0.101897787 8.58286336,0.233877601 C8.61993042,0.464344927 8.70341768,0.687066016 8.82820981,0.888394549 C9.02996027,1.012115 9.25262444,1.09525963 9.4830002,1.13289867 C9.6152802,1.16003037 9.71342219,1.27735361 9.71566226,1.41103311 C9.71790232,1.5447126 9.62359245,1.65607713 9.49208487,1.67504141 C9.26444525,1.69743199 9.0462315
3,1.76716948 8.85132417,1.87981789 C8.73635526,2.07809534 8.66369764,2.2993991 8.63768445,2.53053117 C8.61805481,2.66184983 8.50592239,2.75551697 8.37194288,2.75251202 Z" id="Shape" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
index 71fea38eb829..e4a3c8d2d41c 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -302,3 +302,6 @@
skin/classic/browser/install-ssb.svg (../shared/install-ssb.svg)
skin/classic/browser/critical.svg (../shared/icons/critical.svg)
skin/classic/browser/webRTC-indicator.css (../shared/webRTC-indicator.css)
+
+ skin/classic/browser/new_circuit.svg (../shared/icons/new_circuit.svg)
+ skin/classic/browser/new_identity.svg (../shared/icons/new_identity.svg)
diff --git a/browser/themes/shared/menupanel.inc.css b/browser/themes/shared/menupanel.inc.css
index c919f32a1454..eae453ec5004 100644
--- a/browser/themes/shared/menupanel.inc.css
+++ b/browser/themes/shared/menupanel.inc.css
@@ -183,3 +183,11 @@ toolbarpaletteitem[place="palette"] > #bookmarks-menu-button,
-moz-context-properties: fill, fill-opacity;
fill-opacity: 0;
}
+
+#appMenuNewIdentity {
+ list-style-image: url("chrome://browser/skin/new_identity.svg");
+}
+
+#appMenuNewCircuit {
+ list-style-image: url("chrome://browser/skin/new_circuit.svg");
+}
diff --git a/browser/themes/shared/toolbarbutton-icons.inc.css b/browser/themes/shared/toolbarbutton-icons.inc.css
index 9514eb1d5338..cf02f871c9a4 100644
--- a/browser/themes/shared/toolbarbutton-icons.inc.css
+++ b/browser/themes/shared/toolbarbutton-icons.inc.css
@@ -233,6 +233,14 @@ toolbar[brighttext] {
list-style-image: url("chrome://browser/skin/new-tab.svg");
}
+#new-identity-button {
+ list-style-image: url("chrome://browser/skin/new_identity.svg");
+}
+
+#new-circuit-button {
+ list-style-image: url("chrome://browser/skin/new_circuit.svg");
+}
+
#privatebrowsing-button {
list-style-image: url("chrome://browser/skin/privateBrowsing.svg");
}
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 31563: force reloading search extensions if extensions.enabledScopes has changed
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit fb76d3c21e3136a1197bbbe9a518a43a83b2a57c
Author: Alex Catarineu <acat(a)torproject.org>
Date: Sat Aug 31 16:23:20 2019 +0200
Bug 31563: force reloading search extensions if extensions.enabledScopes has changed
---
toolkit/components/search/SearchService.jsm | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/toolkit/components/search/SearchService.jsm b/toolkit/components/search/SearchService.jsm
index 46b992bec8ec..608f3c475458 100644
--- a/toolkit/components/search/SearchService.jsm
+++ b/toolkit/components/search/SearchService.jsm
@@ -975,6 +975,7 @@ SearchService.prototype = {
let locale = Services.locale.requestedLocale;
let buildID = Services.appinfo.platformBuildID;
let appVersion = Services.appinfo.version;
+ let enabledScopes = Services.prefs.getIntPref("extensions.enabledScopes", -1);
// Allows us to force a cache refresh should the cache format change.
cache.version = SearchUtils.CACHE_VERSION;
@@ -988,6 +989,10 @@ SearchService.prototype = {
cache.appVersion = appVersion;
cache.locale = locale;
+ // Bug 31563: we want to force reloading engines if extensions.enabledScopes
+ // pref changes
+ cache.enabledScopes = enabledScopes;
+
if (gModernConfig) {
cache.builtInEngineList = this._searchOrder;
// For built-in engines we don't want to store all their data in the cache
@@ -1049,7 +1054,8 @@ SearchService.prototype = {
!cache.engines ||
cache.version != SearchUtils.CACHE_VERSION ||
cache.locale != Services.locale.requestedLocale ||
- cache.buildID != buildID;
+ cache.buildID != buildID ||
+ cache.enabledScopes != Services.prefs.getIntPref("extensions.enabledScopes", -1);
let enginesCorrupted = false;
if (!rebuildCache) {
1
0

[tor-browser/tor-browser-78.9.0esr-10.0-1] Bug 30541: Disable WebGL readPixel() for web content
by sysrqb@torproject.org 17 Mar '21
by sysrqb@torproject.org 17 Mar '21
17 Mar '21
commit 2659c9c84b8cb76606c359041cddef2938f2269c
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed May 29 12:29:19 2019 +0000
Bug 30541: Disable WebGL readPixel() for web content
---
dom/canvas/ClientWebGLContext.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dom/canvas/ClientWebGLContext.cpp b/dom/canvas/ClientWebGLContext.cpp
index 42c0b1ba6b80..c7f2559332d3 100644
--- a/dom/canvas/ClientWebGLContext.cpp
+++ b/dom/canvas/ClientWebGLContext.cpp
@@ -4118,6 +4118,14 @@ bool ClientWebGLContext::ReadPixels_SharedPrecheck(
return false;
}
+ // Security check passed, but don't let content readPixel calls through for
+ // now, if Resist Fingerprinting Mode is enabled.
+ if (nsContentUtils::ResistFingerprinting(aCallerType)) {
+ JsWarning("readPixels: Not allowed in Resist Fingerprinting Mode");
+ out_error.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return false;
+ }
+
return true;
}
1
0