remoteRF-server 1.1.0.dev53__py3-none-any.whl → 1.1.0.dev55__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- remoteRF_server/server/direct_path.py +8 -3
- remoteRF_server/server/federation/cluster.py +2 -1
- remoteRF_server/server/federation/peers.py +25 -5
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/METADATA +1 -1
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/RECORD +9 -9
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/WHEEL +0 -0
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/entry_points.txt +0 -0
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/licenses/LICENSE +0 -0
- {remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/top_level.txt +0 -0
|
@@ -440,6 +440,12 @@ def _get_loop() -> asyncio.AbstractEventLoop:
|
|
|
440
440
|
return _loop
|
|
441
441
|
|
|
442
442
|
|
|
443
|
+
def _key(session_key: str, remote: dict) -> str:
|
|
444
|
+
"""session/offer-id; the id may not carry the separator, or a client could
|
|
445
|
+
give each offer a session of its own and dodge the cap."""
|
|
446
|
+
return f"{session_key}/{str(remote.get('id', ''))[:32].replace('/', '')}"
|
|
447
|
+
|
|
448
|
+
|
|
443
449
|
def offer(session_key: str, user: str, ice: str) -> dict:
|
|
444
450
|
"""ACC:direct_offer, already authenticated: answer the client's ICE offer.
|
|
445
451
|
|
|
@@ -450,7 +456,7 @@ def offer(session_key: str, user: str, ice: str) -> dict:
|
|
|
450
456
|
"""
|
|
451
457
|
try:
|
|
452
458
|
remote = json.loads(ice)
|
|
453
|
-
key =
|
|
459
|
+
key = _key(session_key, remote)
|
|
454
460
|
answer = asyncio.run_coroutine_threadsafe(
|
|
455
461
|
_offer(key, user, remote), _get_loop()
|
|
456
462
|
).result(20)
|
|
@@ -468,8 +474,7 @@ def offer_bound(session_key: str, user: str, ice: str, *, bound: dict) -> dict:
|
|
|
468
474
|
path could be prepared.
|
|
469
475
|
"""
|
|
470
476
|
remote = json.loads(ice)
|
|
471
|
-
|
|
472
|
-
return asyncio.run_coroutine_threadsafe(_offer(key, user, remote, bound), _get_loop()).result(20)
|
|
477
|
+
return asyncio.run_coroutine_threadsafe(_offer(_key(session_key, remote), user, remote, bound), _get_loop()).result(20)
|
|
473
478
|
|
|
474
479
|
|
|
475
480
|
def shutdown() -> None:
|
|
@@ -784,7 +784,8 @@ def _take_statuses(name: str, cluster: dict, statuses: list[dict]) -> None:
|
|
|
784
784
|
parties[peer]["sharing"] = {"groups": status["groups"], "devices": status["devices"],
|
|
785
785
|
"detail": status.get("detail", [])}
|
|
786
786
|
if status.get("route"):
|
|
787
|
-
|
|
787
|
+
# A member's row for its owner carries the name as peer_name.
|
|
788
|
+
_pin_route(peer, parties[peer].get("display_name") or parties[peer].get("peer_name"), status["route"])
|
|
788
789
|
|
|
789
790
|
|
|
790
791
|
def _pin_route(peer: str, display_name: str | None, route: dict) -> None:
|
|
@@ -130,21 +130,41 @@ class PeerStore:
|
|
|
130
130
|
).rowcount > 0
|
|
131
131
|
|
|
132
132
|
|
|
133
|
+
def _relay_route(host: str) -> tuple[str, int] | None:
|
|
134
|
+
"""The relay route this deployment's own discovery document advertises:
|
|
135
|
+
the public, SNI-routed port every client dials -- not the tunnel's
|
|
136
|
+
backend port that global.env keeps, which only the VPS itself can reach."""
|
|
137
|
+
import requests
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
document = requests.get(
|
|
141
|
+
f"https://{host}/.well-known/remoterf-deployment", timeout=5, allow_redirects=False
|
|
142
|
+
).json()
|
|
143
|
+
for route in document.get("routes", []):
|
|
144
|
+
if route.get("kind") == "relay" and route.get("host") and route.get("port"):
|
|
145
|
+
return str(route["host"]), int(route["port"])
|
|
146
|
+
except Exception: # noqa: BLE001 - no document, no route this tick
|
|
147
|
+
return None
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
|
|
133
151
|
def own_route() -> dict | None:
|
|
134
|
-
"""This lab's relay route, for its status note: the name clients
|
|
135
|
-
|
|
152
|
+
"""This lab's relay route, for its status note: the name and port clients
|
|
153
|
+
dial, and the CA every client already pins."""
|
|
136
154
|
from .. import global_onboarding
|
|
137
155
|
|
|
138
156
|
host = global_onboarding.hostname()
|
|
139
|
-
port = global_onboarding.load().get("GLOBAL_RELAY_GRPC_PORT")
|
|
140
157
|
ca_path = Path(os.getenv("REMOTERF_CERT_DIR", global_onboarding.cfg_dir() / "certs")) / "ca.crt"
|
|
141
158
|
try:
|
|
142
159
|
ca_pem = ca_path.read_text("utf-8")
|
|
143
160
|
except OSError:
|
|
144
161
|
return None
|
|
145
|
-
if not host
|
|
162
|
+
if not host:
|
|
163
|
+
return None
|
|
164
|
+
relay = _relay_route(host)
|
|
165
|
+
if relay is None:
|
|
146
166
|
return None
|
|
147
167
|
try:
|
|
148
|
-
return validate_route({"grpc_endpoint": f"{
|
|
168
|
+
return validate_route({"grpc_endpoint": f"{relay[0]}:{relay[1]}", "tls_server_name": relay[0], "ca_pem": ca_pem})
|
|
149
169
|
except ValueError:
|
|
150
170
|
return None
|
|
@@ -56,7 +56,7 @@ remoteRF_server/server/commands.py,sha256=J70-S7TdpD5vkjUqDLnGhWv5bwNogNx9GAp85L
|
|
|
56
56
|
remoteRF_server/server/console.py,sha256=J91LfwPVmBgielOxfE740NOYduekggyZkqi-47y_A4w,4472
|
|
57
57
|
remoteRF_server/server/control.py,sha256=Uq1Fk0zIoHHX_EXfz3OuNle8urvO_UhAiB5Lk5cs2e4,5177
|
|
58
58
|
remoteRF_server/server/device_manager.py,sha256=PPuCwlPSmjfVpCqy_hCaOr9WvFgE8mqtLMhWOAgXNDA,39281
|
|
59
|
-
remoteRF_server/server/direct_path.py,sha256=
|
|
59
|
+
remoteRF_server/server/direct_path.py,sha256=eQAkCgOuKUiyqd-PfSbVCG_Z9MhrTS_hWjlyTVTyeZU,20508
|
|
60
60
|
remoteRF_server/server/dynamic_v2.py,sha256=AMhQEFhNAvCNcF-PdfCCQQLmeoaR7s1Os8et1KFGn_8,70814
|
|
61
61
|
remoteRF_server/server/global_onboarding.py,sha256=NcKG8TYhCJEiaCtdXL1jEgVm-R_xWpOIj5KI4bWfkr0,39942
|
|
62
62
|
remoteRF_server/server/grpc_server.py,sha256=91FpJubzN_Wfuk6fW_owIEzNCukd333sAGW68FUU8pk,46787
|
|
@@ -71,7 +71,7 @@ remoteRF_server/server/deployment/capabilities.py,sha256=20RxmGG03VoQQZnV3jGhc-3
|
|
|
71
71
|
remoteRF_server/server/federation/__init__.py,sha256=CxdBYJpp1uFwOpC1NpDMxrDOXjxk_4vjUSpVI6vFE14,735
|
|
72
72
|
remoteRF_server/server/federation/admin.py,sha256=t3F17FIytekzclPICmaFJEA4-F5OuWcDx3rgmFga17A,9187
|
|
73
73
|
remoteRF_server/server/federation/cli.py,sha256=S7K7dM3h-WlJ6sGiVj47J26PXte39gVPx_vc-cAQwVs,18559
|
|
74
|
-
remoteRF_server/server/federation/cluster.py,sha256=
|
|
74
|
+
remoteRF_server/server/federation/cluster.py,sha256=lHCYaoGal_dp_E5ohH7TOhxHIscnA5QPpkz1GCOCx1o,39327
|
|
75
75
|
remoteRF_server/server/federation/contracts.py,sha256=NYh7lb_9etJHFfzXwevjC4HfSBUypLxg5xGeBgydLF4,29305
|
|
76
76
|
remoteRF_server/server/federation/destination.py,sha256=XawmGCiVbL_MfNNn8xwV9_bYxUDW1L7efCpL11K2JAc,35909
|
|
77
77
|
remoteRF_server/server/federation/devices.py,sha256=2Wwt7kRHx_aVHaJpBlIWrnryAGWviVM7_ZVXKaie8LY,24257
|
|
@@ -81,7 +81,7 @@ remoteRF_server/server/federation/home_devices.py,sha256=NQaIw9xPS8oNwRWOm3WU6L0
|
|
|
81
81
|
remoteRF_server/server/federation/identity.py,sha256=UtQJKm2mChWZto0ZCg385k_ObrwOUtxY7XFyU_s5Q10,7436
|
|
82
82
|
remoteRF_server/server/federation/legacy_state.py,sha256=SpeTZHFqymNYGWG7A3B-78dIRIVLYltBbE2zGDWzt-Q,19838
|
|
83
83
|
remoteRF_server/server/federation/migrations.py,sha256=bKdURVs4jmFYzIJXrgtmspAcg1_UKStg4JMAEwlsuuY,53270
|
|
84
|
-
remoteRF_server/server/federation/peers.py,sha256=
|
|
84
|
+
remoteRF_server/server/federation/peers.py,sha256=rr1ZU0M5w0Z4CgLVy67mB51Y_E50P63GibDlwysA1sA,7379
|
|
85
85
|
remoteRF_server/server/federation/permissions.py,sha256=ou4uFsMAGHnDeBW6zbpGeUTwp0thlYXT5nIAgd3B1rg,15861
|
|
86
86
|
remoteRF_server/server/federation/principals.py,sha256=CsRYa8POmtMaxKzAGwY14sxBTNS5uKjM1nUE19mjpoQ,10410
|
|
87
87
|
remoteRF_server/server/federation/runtime.py,sha256=5CoDlu0jSQrFdwRoGL2Z4_CWxnA46B3j6-eNQo8N2FI,7624
|
|
@@ -91,9 +91,9 @@ remoteRF_server/tools/gen_certs.py,sha256=Vbyu8JjRu__UYPVmyCRXt5SOw0Za1HV7g1md3G
|
|
|
91
91
|
remoteRF_server/tools/gist_status.py,sha256=SFv2iQgQrIKT9gxKrU-_Dr7S0p0rE4wQM6J3OC6FcoM,4649
|
|
92
92
|
remoteRF_server/tools/gist_status_testing.py,sha256=IYw7UkPjAUpKDTtIlnYGb5g6SJkwz4TRGUfJJ6f4LhQ,2690
|
|
93
93
|
remoteRF_server/tools/introspect_uhd.py,sha256=vUpPb0rM9tsHPxWadS3EfMDE-gMd-TvNV0TjrZOQqBY,4531
|
|
94
|
-
remoterf_server-1.1.0.
|
|
95
|
-
remoterf_server-1.1.0.
|
|
96
|
-
remoterf_server-1.1.0.
|
|
97
|
-
remoterf_server-1.1.0.
|
|
98
|
-
remoterf_server-1.1.0.
|
|
99
|
-
remoterf_server-1.1.0.
|
|
94
|
+
remoterf_server-1.1.0.dev55.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
95
|
+
remoterf_server-1.1.0.dev55.dist-info/METADATA,sha256=PX-Elj4DSOm87vykN79Trm72ODHZsBvWDTNihGs18qU,42069
|
|
96
|
+
remoterf_server-1.1.0.dev55.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
97
|
+
remoterf_server-1.1.0.dev55.dist-info/entry_points.txt,sha256=_bbKk65PfYi-n6zUjqOiOwcalf_Ws1TCGATIe1TukxE,136
|
|
98
|
+
remoterf_server-1.1.0.dev55.dist-info/top_level.txt,sha256=NuYWe8dSx3qdbxshWBwOgx68EHmJ9I8Zvxam4ARsQ_I,30
|
|
99
|
+
remoterf_server-1.1.0.dev55.dist-info/RECORD,,
|
|
File without changes
|
{remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{remoterf_server-1.1.0.dev53.dist-info → remoterf_server-1.1.0.dev55.dist-info}/top_level.txt
RENAMED
|
File without changes
|