ws: read the all-ICE declaration from the offer envelope, drop the proto field

Companion to hbb_common 68d2729: the full-ICE declaration now lives as
an `ice_policy: "all"` key inside the webrtc:// envelope, so the request
assembly no longer sets webrtc_all_ice and the controlled side asks the
envelope (endpoint_declares_all_ice) instead of a PunchHole field. The
rendezvous server carries the offer opaquely — no forwarding to keep in
sync. Skew behavior is unchanged: an unmarked or unparseable envelope
reads as the old Relay-only semantics.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExUfAkYbq8UC9pQCiLy8TQ
This commit is contained in:
rustdesk
2026-08-07 11:56:56 +08:00
parent 34752f21a0
commit ab0996fbbf
3 changed files with 13 additions and 10 deletions

View File

@@ -612,7 +612,8 @@ impl Client {
/// is configured, so skip building a guaranteed-dead pc + STUN/TURN gathering + answerer
/// signaling in that case. WebSocket-forced relay is deliberately NOT policy: ws only
/// tunnels the signaling/relay legs, so the offer keeps full ICE and may land a direct
/// connection - the flagship path for ws deployments (`webrtc_all_ice` tells the peer).
/// connection - the flagship path for ws deployments (the offer envelope's `ice_policy`
/// key tells the peer).
/// When policy relay *and* TURN are configured, WebRTC via TURN is a valid "relayed" path:
/// `connect` keeps a WebRTC win instead of replacing it with the RustDesk relay, and the
/// RelayResponse path races it without a P2P preference delay. Any request carrying an offer
@@ -888,10 +889,10 @@ impl Client {
force_relay: interface.is_force_relay(),
socket_addr_v6: ipv6.1.unwrap_or_default(),
switch_code,
// The offer's envelope itself declares its ICE policy (`ice_policy: "all"` under
// pure ws), telling the controlled side its answer may gather every candidate
// type despite force_relay instead of requiring TURN.
webrtc_sdp_offer: webrtc_sdp_offer.clone(),
// Full-ICE offer despite force_relay (ws transport): tells the controlled side
// its answer may gather every candidate type instead of requiring TURN.
webrtc_all_ice: !webrtc_sdp_offer.is_empty() && !interface.is_policy_relay(),
..Default::default()
});
let webrtc_session_key = webrtc_offerer