[tor-commits] [sbws/master] stem: return a new Tor configuration dictionary
juga at torproject.org
juga at torproject.org
Wed Jan 9 17:12:00 UTC 2019
commit a44ff55d4d6adc8161ecaf3dc74989422ce06309
Author: juga0 <juga at riseup.net>
Date: Thu Dec 6 18:28:41 2018 +0000
stem: return a new Tor configuration dictionary
when parsing user configuration, instead of modifying the one
passed to the function.
Fixes bug #28738. Bugfix v0.1.1
---
sbws/util/stem.py | 14 +++++++-------
tests/unit/util/test_stem.py | 13 +++++++++++++
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/sbws/util/stem.py b/sbws/util/stem.py
index bd8f7d0..d2fa5d8 100644
--- a/sbws/util/stem.py
+++ b/sbws/util/stem.py
@@ -119,14 +119,15 @@ def _init_controller_socket(socket):
def parse_user_torrc_config(torrc, torrc_text):
"""Parse the user configuration torrc text call `extra_lines`
- to a dictionary suitable to use with stem and update the existing torrc.
+ to a dictionary suitable to use with stem and return a new torrc
+ dictionary that merges that dictionary with the existing torrc.
Example:
[tor]
extra_lines =
Log debug file /tmp/tor-debug.log
NumCPUs 1
"""
-
+ torrc_dict = torrc.copy()
for line in torrc_text.split('\n'):
# Remove leading and trailing whitespace, if any
line = line.strip()
@@ -144,7 +145,7 @@ def parse_user_torrc_config(torrc, torrc_text):
key, value)
# It's really easy to add to the torrc if the key doesn't exist
if key not in torrc:
- torrc.update({key: value})
+ torrc_dict.update({key: value})
# But if it does, we have to make a list of values. For example, say
# the user wants to add a SocksPort and we already have
# 'SocksPort auto' in the torrc. We'll go from
@@ -154,12 +155,12 @@ def parse_user_torrc_config(torrc, torrc_text):
else:
existing_val = torrc[key]
if isinstance(existing_val, str):
- torrc.update({key: [existing_val, value]})
+ torrc_dict.update({key: [existing_val, value]})
else:
assert isinstance(existing_val, list)
existing_val.append(value)
- torrc.update({key: existing_val})
- return torrc
+ torrc_dict.update({key: existing_val})
+ return torrc_dict
def launch_tor(conf):
@@ -186,7 +187,6 @@ def launch_tor(conf):
})
torrc = parse_user_torrc_config(torrc, conf['tor']['extra_lines'])
-
# Finally launch Tor
try:
stem.process.launch_tor_with_config(
diff --git a/tests/unit/util/test_stem.py b/tests/unit/util/test_stem.py
index 888f2db..8edf789 100644
--- a/tests/unit/util/test_stem.py
+++ b/tests/unit/util/test_stem.py
@@ -11,3 +11,16 @@ def test_parse_user_torrc_config_new_keyvalue_options_success():
torrc_dict = parse_user_torrc_config({}, config_torrc_extra_lines)
assert torrc_dict == \
{'Log': 'debug file /tmp/tor-debug.log', 'NumCPUs': '1'}
+
+
+def test_parse_user_torrc_config_existing_keyvalue_options_fail(caplog):
+ torrc_dict = {'SocksPort': 'auto'}
+ config_torrc_extra_lines = """
+ SocksPort 9050
+ """
+ torrc_dict_new = parse_user_torrc_config(
+ torrc_dict, config_torrc_extra_lines)
+ # the new dictionary contains the existing key option and a list with both
+ # the existing value and the new value
+ assert torrc_dict_new != torrc_dict
+ assert torrc_dict_new == {'SocksPort': ['auto', '9050']}
More information about the tor-commits
mailing list