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.
@@ -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 = f"{session_key}/{str(remote.get('id', ''))[:32]}"
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
- key = f"{session_key}/{str(remote.get('id', ''))[:32]}"
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
- _pin_route(peer, parties[peer].get("display_name"), status["route"])
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 dial,
135
- the relay's gRPC port, and the CA every client already pins."""
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 or not port:
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"{host}:{port}", "tls_server_name": host, "ca_pem": ca_pem})
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoteRF-server
3
- Version: 1.1.0.dev53
3
+ Version: 1.1.0.dev55
4
4
  Summary: RemoteRF server-side control package
5
5
  License: GPL-3.0-or-later
6
6
  Classifier: Programming Language :: Python :: 3
@@ -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=2OmmL9cn9rZayQbuIwXdisWJp7kSV2eLGgM_V1ccJeE,20299
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=MKg6vE7WIz33zl2-yghnutIdDEXz6aGJDv-Uo-cXwk8,39215
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=VsmI_5tWciLltDCtQL84bMjdk_ZAwwr4e2ATXDMH15M,6618
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.dev53.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
95
- remoterf_server-1.1.0.dev53.dist-info/METADATA,sha256=bMZCNvldB-N-Jc-N0hdlIDB1TsaQrzyF5h39gTco-2U,42069
96
- remoterf_server-1.1.0.dev53.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
97
- remoterf_server-1.1.0.dev53.dist-info/entry_points.txt,sha256=_bbKk65PfYi-n6zUjqOiOwcalf_Ws1TCGATIe1TukxE,136
98
- remoterf_server-1.1.0.dev53.dist-info/top_level.txt,sha256=NuYWe8dSx3qdbxshWBwOgx68EHmJ9I8Zvxam4ARsQ_I,30
99
- remoterf_server-1.1.0.dev53.dist-info/RECORD,,
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,,