Skip to content

Commit 58979c7

Browse files
authored
Merge pull request from GHSA-3f48-9j7q-q2gv
* service: Listen on loopback interface and log listener URL * pyproject.toml: Add dev-dependency on psutil * Update poetry.lock * tests: Verify the service listens on the loopback interface
1 parent 1d1e51a commit 58979c7

4 files changed

Lines changed: 95 additions & 21 deletions

File tree

ni_measurementlink_service/_internal/service_manager.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,11 @@ def start(
112112
raise ValueError(
113113
f"Unknown interface was provided in the .serviceconfig file: {interface}"
114114
)
115-
port = str(self.server.add_insecure_port("[::]:0"))
115+
host = "[::1]"
116+
port = str(self.server.add_insecure_port(f"{host}:0"))
117+
address = f"http://{host}:{port}"
116118
self.server.start()
117-
_logger.info("Measurement service hosted on port: %s", port)
119+
_logger.info("Measurement service listening on: %s", address)
118120
self.discovery_client.register_measurement_service(port, service_info, measurement_info)
119121

120122
self.port = port

poetry.lock

Lines changed: 58 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ types-protobuf = "^4.21"
5151
types-pkg-resources = "*"
5252
types-pywin32 = {version = ">=304", platform = "win32"}
5353
grpc-stubs = "^1.53"
54+
psutil = ">=5.9"
55+
types-psutil = ">=5.9"
5456

5557
[tool.poetry.group.docs]
5658
optional = true

tests/acceptance/test_security.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from ipaddress import ip_address
2+
from typing import Generator
3+
4+
import psutil
5+
import pytest
6+
7+
from ni_measurementlink_service.measurement.service import MeasurementService
8+
from tests.utilities import loopback_measurement
9+
from tests.utilities.discovery_service_process import DiscoveryServiceProcess
10+
11+
12+
def test___loopback_measurement___listening_on_loopback_interface(
13+
measurement_service: MeasurementService,
14+
):
15+
port = int(measurement_service.grpc_service.port)
16+
17+
listener_ips = [
18+
ip_address(conn.laddr.ip)
19+
for conn in psutil.Process().connections()
20+
if conn.laddr.port == port and conn.status == psutil.CONN_LISTEN
21+
]
22+
assert len(listener_ips) >= 1 and all([ip.is_loopback for ip in listener_ips])
23+
24+
25+
@pytest.fixture(scope="module")
26+
def measurement_service(
27+
discovery_service_process: DiscoveryServiceProcess,
28+
) -> Generator[MeasurementService, None, None]:
29+
"""Test fixture that creates and hosts a measurement service."""
30+
with loopback_measurement.measurement_service.host_service() as service:
31+
yield service

0 commit comments

Comments
 (0)