Commit Graph

48 Commits

Author SHA1 Message Date
rustdesk eed7052d1d webrtc: declare the ICE policy inside the offer envelope, not a proto field
Reverts the webrtc_all_ice proto field (64b54ab) in favor of an
`ice_policy: "all"` key inside the webrtc:// envelope JSON, next to the
RTCSessionDescription fields. Same information, better carrier:

- it is a property of the offer itself, so it rides with the offer;
- the rendezvous server never has to know: the envelope is an opaque,
  length-bounded string to hbbs, so no forwarding code and no vendored
  proto copies to keep in sync;
- serde ignores unknown JSON keys when parsing RTCSessionDescription,
  so every skew combination degrades exactly like the proto field did:
  absence - not an error - is the old Relay-only reading.

endpoint_declares_all_ice() is the receiving side: parse failure,
foreign scheme or missing key all read as "not declared".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExUfAkYbq8UC9pQCiLy8TQ
2026-08-22 13:21:01 +08:00
rustdesk a992c646bf proto: webrtc_all_ice — full-ICE offers under transport-forced relay
use_ws() folds into force_relay because a ws tunnel kills classic TCP/UDP
punching — but ICE opens its own sockets and does not care how signaling
reaches the server. Without a signal, the controlled side must treat every
force_relay offer as Relay-only ICE (answer gated on TURN), which locks
WebSocket deployments out of direct WebRTC entirely.

webrtc_all_ice marks an offer that gathered every candidate type: the
controller's force_relay covers only classic punching, not ICE policy.
Absent/false keeps today's semantics on every skew combination (old
controller, old server dropping the field, old controlled side).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExUfAkYbq8UC9pQCiLy8TQ
2026-08-22 13:21:01 +08:00
rustdesk 7c4456be9b proto: drop the reserved tag in PunchHole
`requester_id = 11` was added and removed in the same rebase batch, never
reached main, and never reached hbbs — whose vendored copy of this file still
stops at field 9. So nothing has ever written or read tag 11, and reserving it
guards a wire format that does not exist.

It was also inconsistent with what this branch already does: `IceCandidate`
retyped tag 2 from `string to_id` to `bytes socket_addr` in place, which is only
sound because none of this proto has shipped. Same premise, so tag 11 is free.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 13:21:01 +08:00
rustdesk 0a36139a58 fix(webrtc): reject malformed fragment framing, correct receive-path docs
`next()` read every non-FRAG_END header as "more fragments", so a peer whose
framing had diverged was only caught by the MAX_FRAME_LENGTH cap — and a
FRAG_MORE carrying no payload was never caught at all: it adds nothing to the
accumulator, so the cap never trips and the loop spins for as long as the peer
keeps writing, with no error and no teardown. Decide the header's meaning in one
match, so a future header kind cannot be handled in one place and missed in the
other. Neither case is reachable from send_bytes_inner, which emits FRAG_MORE
only for a full MAX_FRAGMENT_PAYLOAD chunk.

Release the accumulator on the error paths rather than truncating it: at the cap
that is ~1 GiB still referenced through the SESSIONS clone.

Doc corrections, all of them overclaims in the previous pass:

- the cancel-safety entry held only for the successful read path.
  read_data_channel does await after dequeuing on its ErrShortBuffer and DCEP
  branches, and next() awaits pc.close() on its error paths — where
  RTCPeerConnection::close latches is_closed before its first await, so a
  cancelled close silently turns every later close into a no-op and leaves the
  pc in SESSIONS.
- recv_state: cancellation drops the guard mid-message, so it is the
  single-reader assumption, not the mutex, that ultimately keeps two readers
  from splicing into one accumulator.
- is_relayed: stream.rs promised None before pair selection while webrtc.rs
  documented Some(true) under Relay policy; align both.
- get_local_endpoint: examples/webrtc.rs calls it too, not only the tests.
- PunchHole.reserved 11: named the wrong writer — PunchHole is written by the
  rendezvous server, not by peers. Reserve the name as well as the tag.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 13:21:01 +08:00
rustdesk f98f3e8732 feat: WebRTC data-plane framing, DTLS binding, and pc-leak fixes
- 1-byte-header fragmentation past the 64KB SCTP cap; empty-message and clean-EOF handling
- is_relayed() via selected candidate-pair stats for the direct/relayed flag
- IdPk.dtls_fingerprint + rendezvous webrtc SDP/IceCandidate proto fields
- fix pc leaks: Weak capture breaks the state-handler Arc self-cycle; close pc on new() error paths

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 13:21:01 +08:00
rustdesk 1998a198ec fix: route WebRTC ICE without requester id 2026-08-22 13:21:01 +08:00
rustdesk d4e727306f feat: add rendezvous WebRTC signaling fields 2026-08-22 13:21:01 +08:00
RustDesk 5438d20225 switch_code 2026-07-17 17:44:01 +08:00
21pages 91b13be6fd Add controlled context for controller audit attribution
Add ControlledContext to rendezvous messages so the server can pass a controller-user audit ref to the controlled client.

The controlled client returns the ref when posting audit logs, allowing the server to associate those logs with the controller user.

Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-06-26 14:16:56 +08:00
RustDesk c8cbb6be28 Update rendezvous.proto 2026-05-13 18:06:39 +08:00
RustDesk 42af0f0aed Merge pull request #533 from fufesou/feat/terminal-retry-output
feat(terminal): flag, retry output
2026-05-07 12:08:56 +08:00
fufesou a4309b5b2b feat(terminal): flag, retry output
Signed-off-by: fufesou <linlong1266@gmail.com>
2026-04-29 23:37:43 +08:00
fufesou a24767a0ad feat: option, privacy mode
Signed-off-by: fufesou <linlong1266@gmail.com>
2026-04-21 21:14:36 +08:00
RustDesk 6fb03d076e http_proxy_request 2026-03-24 20:39:19 +08:00
RustDesk 48c37de3e6 Update message.proto 2026-03-02 12:12:05 +08:00
RustDesk dea7d6cbd8 Update message.proto 2026-03-02 11:57:58 +08:00
21pages e163e2d829 add three state control permissions
Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-01-07 12:42:21 +08:00
21pages 510ebdca50 Revert "add ControlPermissions"
This reverts commit 178c97d59f.
2026-01-07 12:42:01 +08:00
21pages 178c97d59f add ControlPermissions
Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-01-05 22:13:56 +08:00
RustDesk 4637bf8fc1 Revert "Allow restricting remote control permissions for different users" 2026-01-05 22:06:13 +08:00
21pages 3a0034f104 controlling strategy
Signed-off-by: 21pages <sunboeasy@gmail.com>
2025-12-29 14:08:43 +08:00
fufesou ae7aaf9629 refact: proto, remove unused field
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-11-13 19:21:44 +08:00
fufesou 4fe91763b7 fix: Wayland resolution
1. Add filed `scale` in `message SwitchDisplay`(`message.proto`).
2. Add new function to get all display info.
3. Add help link of KDE Plasma Wayland.

Signed-off-by: fufesou <linlong1266@gmail.com>
2025-11-12 23:16:04 +08:00
21pages 44e8a46e94 Revert "ab default password"
This reverts commit f9e903b762.
2025-09-04 18:26:50 +08:00
21pages 3dbe437a8c Revert "remove support_controlling_salt field in Hash"
This reverts commit 11dba932e0.
2025-09-04 18:26:29 +08:00
21pages 11dba932e0 remove support_controlling_salt field in Hash
Signed-off-by: 21pages <sunboeasy@gmail.com>
2025-09-04 17:18:17 +08:00
21pages f9e903b762 ab default password
Signed-off-by: 21pages <sunboeasy@gmail.com>
2025-09-02 11:31:11 +08:00
fufesou 29bae8a4d4 feat: opt, show my cursor
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-08-27 07:47:16 +08:00
RustDesk 221c2bfb3e Merge pull request #335 from fufesou/feat/clipboard_file_audit
feat: clipboard files, audit
2025-08-25 15:03:33 +08:00
fufesou f6fb16d6e7 feat: file transfer, digest flag, is_resume
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-08-12 07:10:34 +08:00
fufesou fee1a11f15 feat: clipboard files, audit
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-08-11 09:03:25 +08:00
fufesou 215b0e7700 feat: file transfer, resume
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-08-06 16:28:46 +08:00
fufesou 79734df69c feat: terminal, restore sessions
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-07-18 08:16:52 +08:00
RustDesk f850a167ac terminal persistent 2025-06-30 00:31:09 +08:00
RustDesk 117ea7c341 terminal 2025-06-29 14:08:03 +08:00
RustDesk df95f44499 more udp punch 2025-06-10 12:01:43 +08:00
RustDesk b69b097c6f kcp stream 2025-06-03 19:41:30 +08:00
RustDesk 0e279c1a8f Update rendezvous.proto 2025-05-23 21:55:40 +08:00
fufesou b08c92ad34 feat: screenshot
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-04-28 18:34:59 +08:00
fufesou 14936c8800 Remove in login request.
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-03-24 20:57:41 +08:00
fufesou f4cc39135c feat: remote printer, reuse fs
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-03-23 11:58:27 +08:00
fufesou 07d3cc5d15 Feat. Remote printer.
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-03-16 22:56:53 +08:00
fufesou e608898d08 refact, reload peers
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-02-20 09:27:57 +08:00
RustDesk 895024221e Update message.proto 2025-02-20 01:12:25 +08:00
Adwin White 4b161a2050 feat: add camera permission 2025-02-19 12:11:52 +08:00
Adwin White f8fbf40f98 feat: add camera connection type 2025-02-19 12:11:52 +08:00
fufesou e646eb9f4d feat: file clipboard, try empty message
Signed-off-by: fufesou <linlong1266@gmail.com>
2025-01-24 01:23:57 +08:00
21pages 49c6b24a7a init
Signed-off-by: 21pages <sunboeasy@gmail.com>
2025-01-20 16:06:27 +08:00