summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug-6541_honor-ports-on-eip-service1
-rw-r--r--src/leap/bitmask/services/eip/eipconfig.py18
-rw-r--r--src/leap/bitmask/services/eip/vpnlauncher.py35
-rw-r--r--src/leap/bitmask/services/eip/vpnprocess.py6
4 files changed, 50 insertions, 10 deletions
diff --git a/changes/bug-6541_honor-ports-on-eip-service b/changes/bug-6541_honor-ports-on-eip-service
new file mode 100644
index 00000000..97b4c0b5
--- /dev/null
+++ b/changes/bug-6541_honor-ports-on-eip-service
@@ -0,0 +1 @@
+ Client must honor the ports specified in eip-service.json (Bug #6541)
diff --git a/src/leap/bitmask/services/eip/eipconfig.py b/src/leap/bitmask/services/eip/eipconfig.py
index f4d6b216..d5947eb1 100644
--- a/src/leap/bitmask/services/eip/eipconfig.py
+++ b/src/leap/bitmask/services/eip/eipconfig.py
@@ -302,6 +302,24 @@ class EIPConfig(ServiceConfig):
logger.error("Invalid ip address in config: %s" % (ip_addr_str,))
return None
+ def get_gateway_ports(self, index=0):
+ """
+ Return the ports of the gateway.
+
+ :param index: the gateway number to get the ports from
+ :type index: int
+
+ :rtype: list of int
+ """
+ gateways = self.get_gateways()
+ leap_assert(len(gateways) > 0, "We don't have any gateway!")
+ if index > len(gateways):
+ index = 0
+ logger.warning("Provided an unknown gateway index %s, " +
+ "defaulting to 0")
+
+ return gateways[index]["capabilities"]["ports"]
+
def get_client_cert_path(self,
providerconfig=None,
about_to_download=False):
diff --git a/src/leap/bitmask/services/eip/vpnlauncher.py b/src/leap/bitmask/services/eip/vpnlauncher.py
index 72e19413..7793d624 100644
--- a/src/leap/bitmask/services/eip/vpnlauncher.py
+++ b/src/leap/bitmask/services/eip/vpnlauncher.py
@@ -106,12 +106,15 @@ class VPNLauncher(object):
UP_SCRIPT = None
DOWN_SCRIPT = None
+ PREFERRED_PORTS = ("443", "80", "53", "1194")
+
@classmethod
@abstractmethod
def get_gateways(kls, eipconfig, providerconfig):
"""
- Return the selected gateways for a given provider, looking at the EIP
- config file.
+ Return a list with the selected gateways for a given provider, looking
+ at the EIP config file.
+ Each item of the list is a tuple containing (gateway, port).
:param eipconfig: eip configuration object
:type eipconfig: EIPConfig
@@ -122,21 +125,37 @@ class VPNLauncher(object):
:rtype: list
"""
gateways = []
+
settings = Settings()
domain = providerconfig.get_domain()
gateway_conf = settings.get_selected_gateway(domain)
gateway_selector = VPNGatewaySelector(eipconfig)
if gateway_conf == GATEWAY_AUTOMATIC:
- gateways = gateway_selector.get_gateways()
+ gws = gateway_selector.get_gateways()
else:
- gateways = [gateway_conf]
+ gws = [gateway_conf]
- if not gateways:
+ if not gws:
logger.error('No gateway was found!')
raise VPNLauncherException('No gateway was found!')
- logger.debug("Using gateways ips: {0}".format(', '.join(gateways)))
+ for idx, gw in enumerate(gws):
+ ports = eipconfig.get_gateway_ports(idx)
+
+ the_port = "1194" # default port
+
+ # pick the port preferring this order:
+ for port in kls.PREFERRED_PORTS:
+ if port in ports:
+ the_port = port
+ break
+ else:
+ continue
+
+ gateways.append((gw, the_port))
+
+ logger.debug("Using gateways (ip, port): {0!r}".format(gateways))
return gateways
@classmethod
@@ -194,8 +213,8 @@ class VPNLauncher(object):
gateways = kls.get_gateways(eipconfig, providerconfig)
- for gw in gateways:
- args += ['--remote', gw, '1194', 'udp']
+ for ip, port in gateways:
+ args += ['--remote', ip, port, 'udp']
args += [
'--client',
diff --git a/src/leap/bitmask/services/eip/vpnprocess.py b/src/leap/bitmask/services/eip/vpnprocess.py
index 8dc6021f..3e46418c 100644
--- a/src/leap/bitmask/services/eip/vpnprocess.py
+++ b/src/leap/bitmask/services/eip/vpnprocess.py
@@ -961,9 +961,11 @@ class VPNProcess(protocol.ProcessProtocol, VPNManager):
:rtype: list
"""
- gateways = self._launcher.get_gateways(
+ gateways_ports = self._launcher.get_gateways(
self._eipconfig, self._providerconfig)
- return gateways
+
+ # filter out ports since we don't need that info
+ return [gateway for gateway, port in gateways_ports]
# shutdown