diff --git a/onionshare/onionshare.py b/onionshare/onionshare.py index 59fcfb89..f2432ff3 100644 --- a/onionshare/onionshare.py +++ b/onionshare/onionshare.py @@ -8,9 +8,12 @@ def get_platform(): else: return platform.system() -if get_platform() == 'Tails': +def append_lib_on_tails(): + if get_platform() == 'Tails': sys.path.append(os.path.dirname(__file__)+'/../tails/lib') +append_lib_on_tails() + from stem.control import Controller from stem import SocketError diff --git a/test/onionshare_test.py b/test/onionshare_test.py index 2ad235c8..6b2f0873 100644 --- a/test/onionshare_test.py +++ b/test/onionshare_test.py @@ -14,12 +14,19 @@ def test_get_platform_returns_platform_system(): onionshare.platform.system = lambda: 'Sega Saturn' assert get_platform() == 'Sega Saturn' +def test_tails_appends_to_path(): + "adds '/../tails/lib' to the path when running on Tails" + original_path = sys.path + onionshare.platform.system = lambda: 'Tails' + append_lib_on_tails() + assert sys.path[-1][-13:] == '/../tails/lib' + def test_get_hidden_service_dir_windows_with_temp(): """ get_hidden_service_dir() uses a temporary directory from the Windows environment when defined """ - onionshare.get_platform = lambda: 'Windows' + onionshare.platform.system = lambda: 'Windows' os.environ['Temp'] = "C:\Internet Explorer\Secrets" expected_path = "C:/Internet Explorer/Secrets/onionshare_hidden_service_port" assert get_hidden_service_dir('port') == expected_path @@ -37,6 +44,63 @@ def test_get_hidden_service_dir_posix(): expected_path = "/tmp/onionshare_hidden_service_port" assert get_hidden_service_dir('port') == expected_path +class MockSubprocess(): + def __init__(self): + self.last_call = None + + def call(self, args): + self.last_call = args + + def last_call_args(self): + return self.last_call + +def test_tails_open_port(): + "tails_open_port() calls iptables with ACCEPT arg" + onionshare.get_platform = lambda: 'Tails' + onionshare.strings = {'punching_a_hole': ''} + + mock_subprocess = MockSubprocess() + onionshare.subprocess = mock_subprocess + onionshare.tails_open_port('port') + + expected_call = [ + '/sbin/iptables', '-I', 'OUTPUT', + '-o', 'lo', '-p', + 'tcp', '--dport', 'port', '-j', 'ACCEPT' + ] + actual_call = mock_subprocess.last_call_args() + assert actual_call == expected_call + +def test_load_strings_defaults_to_english(): + "load_strings() loads English by default" + locale.getdefaultlocale = lambda: ('en_US', 'UTF-8') + load_strings() + assert onionshare.strings['calculating_sha1'] == "Calculating SHA1 checksum." + +def test_load_strings_loads_other_languages(): + "load_strings() loads other languages in different locales" + locale.getdefaultlocale = lambda: ('fr_FR', 'UTF-8') + load_strings("fr") + print onionshare.strings + assert onionshare.strings['calculating_sha1'] == "Calculer un hachage SHA-1." + +def test_tails_close_port(): + "tails_close_port() calls iptables with REJECT arg" + onionshare.get_platform = lambda: 'Tails' + onionshare.strings = {'closing_hole': ''} + + mock_subprocess = MockSubprocess() + onionshare.subprocess = mock_subprocess + onionshare.tails_close_port('port') + + expected_call = [ + '/sbin/iptables', '-I', 'OUTPUT', + '-o', 'lo', '-p', + 'tcp', '--dport', 'port', '-j', 'REJECT' + ] + actual_call = mock_subprocess.last_call_args() + assert actual_call == expected_call + def test_generate_slug_length(): "generates a 32-character slug" assert len(slug) == 32