summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/vpn/fw/firewall.py
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2017-10-06 02:30:06 +0200
committerKali Kaneko <kali@leap.se>2017-10-06 18:32:11 +0200
commitb66ec16f764be769e4a15dae783292ac4cd32f3b (patch)
tree92526be03d34d8e8a1e1d35803da02137103a330 /src/leap/bitmask/vpn/fw/firewall.py
parent08ca6b5dbe38c927037e1e6e8256c5dd8a11f03d (diff)
[bug] use sytem-wide bitmask-root, if found
we make a distinction between the system-wide bitmask-root, which should be placed there by the maintainers of whatever packages your distribution uses, and the bitmask-root that is placed by the bundles (using polkit). since the bundles copying over the helper from user-writeable folders is a potential attack vector, we prefer to use the package's version if present. also, if we cannot find either, we abort the launching of the VPN. we've discussed that this might move to the service initialization instead, but I think the cases in which this is needed should be rare. I fix also a corner-case in which we were using getcwd() at import time. if you execute code and then remove the installation path, this will raise a traceback in bitmaskctl. I think it's nicer to catch the error properly when starting.
Diffstat (limited to 'src/leap/bitmask/vpn/fw/firewall.py')
-rw-r--r--src/leap/bitmask/vpn/fw/firewall.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/leap/bitmask/vpn/fw/firewall.py b/src/leap/bitmask/vpn/fw/firewall.py
index 9cd65ed6..63aac36e 100644
--- a/src/leap/bitmask/vpn/fw/firewall.py
+++ b/src/leap/bitmask/vpn/fw/firewall.py
@@ -44,6 +44,10 @@ def check_root(cmd):
return cmd
+class FirewallError(Exception):
+ pass
+
+
class _OSXFirewallManager(object):
def __init__(self, remotes):
self._remotes = list(remotes)
@@ -83,7 +87,11 @@ class _LinuxFirewallManager(object):
This allows us to achieve fail close on a vpn connection.
"""
- BITMASK_ROOT = "/usr/local/sbin/bitmask-root"
+ _SYSTEM_BITMASK_ROOT = '/usr/sbin/bitmask-root'
+ if os.path.isfile(_SYSTEM_BITMASK_ROOT):
+ BITMASK_ROOT = _SYSTEM_BITMASK_ROOT
+ else:
+ BITMASK_ROOT = "/usr/local/sbin/bitmask-root"
def __init__(self, remotes):
"""
@@ -114,11 +122,16 @@ class _LinuxFirewallManager(object):
if restart:
cmd.append("restart")
result = '<did not run>'
+ if not os.path.isfile(self.BITMASK_ROOT):
+ raise FirewallError('Could not find bitmask-root!')
try:
retcode, result = commands.getstatusoutput(
' '.join(cmd + gateways))
except Exception:
- log.failure('Error launching the firewall')
+ msg = 'Error launching the firewall'
+ log.failure(msg)
+ if NOT_ROOT:
+ raise FirewallError(msg)
finally:
log.debug(result)
emit_async(catalog.VPN_STATUS_CHANGED)