tor: Add option to toggle bridge relay

This commit is contained in:
James Valleroy 2016-06-27 22:09:47 -04:00 committed by Sunil Mohan Adapa
parent 1c98d1272f
commit 38382ec09c
No known key found for this signature in database
GPG Key ID: 36C361440C9BC971
5 changed files with 61 additions and 8 deletions

View File

@ -53,6 +53,8 @@ def parse_arguments():
configure = subparsers.add_parser('configure', help='Configure Tor')
configure.add_argument('--service', choices=['enable', 'disable'],
help='Configure Tor service')
configure.add_argument('--relay', choices=['enable', 'disable'],
help='Configure relay')
configure.add_argument('--hidden-service', choices=['enable', 'disable'],
help='Configure hidden service')
configure.add_argument('--apt-transport-tor',
@ -123,6 +125,12 @@ def subcommand_configure(arguments):
if arguments.service == 'disable':
_disable()
restart = arguments.service == None and arguments.hidden_service == None
if arguments.relay == 'enable':
_enable_relay(restart=restart)
elif arguments.relay == 'disable':
_disable_relay(restart=restart)
restart = arguments.service == None
if arguments.hidden_service == 'enable':
_enable_hs(restart=restart)
@ -140,7 +148,17 @@ def subcommand_configure(arguments):
def get_status():
"""Return dict with Tor status."""
return {'ports': get_ports(), 'hidden_service': get_hidden_service()}
return {'relay_enabled': is_relay_enabled(),
'ports': get_ports(),
'hidden_service': get_hidden_service()}
def is_relay_enabled():
"""Return whether bridge relay is enabled."""
aug = augeas_load()
orport = aug.get(TOR_CONFIG + '/ORPort')
bridge = aug.get(TOR_CONFIG + '/BridgeRelay')
return orport == 'auto' and bridge == '1'
def get_ports():
@ -227,6 +245,30 @@ def _disable():
action_utils.service_disable('tor')
def _enable_relay(restart=True):
"""Enable Tor bridge relay."""
aug = augeas_load()
aug.set(TOR_CONFIG + '/ORPort', 'auto')
aug.set(TOR_CONFIG + '/BridgeRelay', '1')
aug.save()
if restart:
if is_enabled() and is_running():
action_utils.service_restart('tor')
def _disable_relay(restart=False):
"""Disable Tor bridge relay."""
aug = augeas_load()
aug.remove(TOR_CONFIG + '/ORPort')
aug.set(TOR_CONFIG + '/BridgeRelay', '0')
aug.save()
if restart:
if is_enabled() and is_running():
action_utils.service_restart('tor')
def _enable_hs(restart=True):
"""Enable Tor hidden service"""
if get_hidden_service()['enabled']:

View File

@ -31,6 +31,13 @@ class TorForm(forms.Form): # pylint: disable=W0232
enabled = forms.BooleanField(
label=_('Enable Tor'),
required=False)
relay_enabled = forms.BooleanField(
label=_('Enable Tor bridge relay'),
required=False,
help_text=format_lazy(_(
'When enabled, your {box_name} will run a Tor bridge relay with '
'obfsproxy, so it can help circumvent censorship.'),
box_name=_(cfg.box_name)))
hs_enabled = forms.BooleanField(
label=_('Enable Tor Hidden Service'),
required=False,

View File

@ -93,17 +93,15 @@
value="{% trans "Update setup" %}"/>
</form>
<h3>{% trans "Bridge" %}</h3>
{% if status.relay_enabled %}
<h3>{% trans "Bridge Relay" %}</h3>
<p>
{% blocktrans trimmed %}
Your {{ box_name }} is configured as a Tor bridge with obfsproxy,
so it can help circumvent censorship. If your {{ box_name }} is
behind a router or firewall, you should make sure the following
ports are open, and port-forwarded, if necessary:
If your {{ box_name }} is behind a router or firewall, you should
make sure the following ports are open, and port-forwarded, if
necessary:
{% endblocktrans %}
</p>
<div class="row">
<div class="col-sm-3">
<table class="table table-bordered table-condensed table-striped">
@ -124,6 +122,7 @@
</table>
</div>
</div>
{% endif %}
<h3>{% trans "SOCKS" %}</h3>

View File

@ -59,6 +59,7 @@ def get_status():
return {'enabled': is_enabled(),
'is_running': is_running(),
'relay_enabled': status['relay_enabled'],
'ports': ports,
'hs_enabled': hs_info['enabled'],
'hs_status': hs_info['status'],

View File

@ -80,6 +80,10 @@ def __apply_changes(request, old_status, new_status):
arg_value = 'enable' if new_status['enabled'] else 'disable'
arguments.extend(['--service', arg_value])
if old_status['relay_enabled'] != new_status['relay_enabled']:
arg_value = 'enable' if new_status['relay_enabled'] else 'disable'
arguments.extend(['--relay', arg_value])
if old_status['hs_enabled'] != new_status['hs_enabled']:
arg_value = 'enable' if new_status['hs_enabled'] else 'disable'
arguments.extend(['--hidden-service', arg_value])