Skip to content

Commit d021ce2

Browse files
hmzdotdariusc93
andauthored
fix(websocket): don't dial /dnsaddr addresses (#5613)
## Description Returns `Error::InvalidMultiaddr` when `parse_ws_dial_addr` is called with `/dnsaddr`. As per its specification, `/dnsaddr` domains are not meant to be directly dialed, instead it should be appended with `_dnsaddr.` and used for DNS lookups afterwards Related: #5529 Fixes: #5601 ## Notes & open questions * Is it okay to return an error, or should I perform a DNS lookup and resolve that DNS afterwards if address has `/dnsaddr`? * If so, how should I handle that case where DNS lookup returns multiple multiaddrs? ## Change checklist - [x] I have performed a self-review of my own code - [ ] I have made corresponding changes to the documentation - [x] I have added tests that prove my fix is effective or that my feature works - [x] A changelog entry has been made in the appropriate crates --------- Co-authored-by: Darius Clark <[email protected]>
1 parent 8387749 commit d021ce2

File tree

8 files changed

+30
-10
lines changed

8 files changed

+30
-10
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ libp2p-upnp = { version = "0.3.1", path = "protocols/upnp" }
112112
libp2p-webrtc = { version = "0.8.0-alpha", path = "transports/webrtc" }
113113
libp2p-webrtc-utils = { version = "0.3.0", path = "misc/webrtc-utils" }
114114
libp2p-webrtc-websys = { version = "0.4.0-alpha.2", path = "transports/webrtc-websys" }
115-
libp2p-websocket = { version = "0.44.0", path = "transports/websocket" }
116-
libp2p-websocket-websys = { version = "0.4.0", path = "transports/websocket-websys" }
115+
libp2p-websocket = { version = "0.44.1", path = "transports/websocket" }
116+
libp2p-websocket-websys = { version = "0.4.1", path = "transports/websocket-websys" }
117117
libp2p-webtransport-websys = { version = "0.4.0", path = "transports/webtransport-websys" }
118118
libp2p-yamux = { version = "0.46.0", path = "muxers/yamux" }
119119
multiaddr = "0.18.1"

transports/websocket-websys/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.4.1
2+
3+
- fix: Return `None` when extracting a `/dnsaddr` address
4+
See [PR 5613](https://github.com/libp2p/rust-libp2p/pull/5613)
5+
16
## 0.4.0
27

38
- Implement refactored `Transport`.

transports/websocket-websys/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "libp2p-websocket-websys"
33
edition = "2021"
44
rust-version = "1.60.0"
55
description = "WebSocket for libp2p under WASM environment"
6-
version = "0.4.0"
6+
version = "0.4.1"
77
authors = ["Vince Vasta <[email protected]>"]
88
license = "MIT"
99
repository = "https://github.com/libp2p/rust-libp2p"

transports/websocket-websys/src/lib.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@ fn extract_websocket_url(addr: &Multiaddr) -> Option<String> {
130130
}
131131
(Some(Protocol::Dns(h)), Some(Protocol::Tcp(port)))
132132
| (Some(Protocol::Dns4(h)), Some(Protocol::Tcp(port)))
133-
| (Some(Protocol::Dns6(h)), Some(Protocol::Tcp(port)))
134-
| (Some(Protocol::Dnsaddr(h)), Some(Protocol::Tcp(port))) => {
133+
| (Some(Protocol::Dns6(h)), Some(Protocol::Tcp(port))) => {
135134
format!("{}:{}", &h, port)
136135
}
137136
_ => return None,
@@ -549,6 +548,12 @@ mod tests {
549548
.unwrap();
550549
assert!(extract_websocket_url(&addr).is_none());
551550

551+
// Check `/dnsaddr`
552+
let addr = "/dnsaddr/example.com/tcp/2222/ws"
553+
.parse::<Multiaddr>()
554+
.unwrap();
555+
assert!(extract_websocket_url(&addr).is_none());
556+
552557
// Check non-ws address
553558
let addr = "/ip4/127.0.0.1/tcp/2222".parse::<Multiaddr>().unwrap();
554559
assert!(extract_websocket_url(&addr).is_none());

transports/websocket/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.44.1
2+
3+
- fix: Return `Error::InvalidMultiaddr` when dialed to a `/dnsaddr` address
4+
See [PR 5613](https://github.com/libp2p/rust-libp2p/pull/5613)
5+
16
## 0.44.0
27

38
- Implement refactored `Transport`.

transports/websocket/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "libp2p-websocket"
33
edition = "2021"
44
rust-version = { workspace = true }
55
description = "WebSocket transport for libp2p"
6-
version = "0.44.0"
6+
version = "0.44.1"
77
authors = ["Parity Technologies <[email protected]>"]
88
license = "MIT"
99
repository = "https://github.com/libp2p/rust-libp2p"

transports/websocket/src/framed.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,7 @@ fn parse_ws_dial_addr<T>(addr: Multiaddr) -> Result<WsAddress, Error<T>> {
510510
}
511511
(Some(Protocol::Dns(h)), Some(Protocol::Tcp(port)))
512512
| (Some(Protocol::Dns4(h)), Some(Protocol::Tcp(port)))
513-
| (Some(Protocol::Dns6(h)), Some(Protocol::Tcp(port)))
514-
| (Some(Protocol::Dnsaddr(h)), Some(Protocol::Tcp(port))) => {
513+
| (Some(Protocol::Dns6(h)), Some(Protocol::Tcp(port))) => {
515514
break (format!("{h}:{port}"), tls::dns_name_ref(&h)?)
516515
}
517516
(Some(_), Some(p)) => {
@@ -993,6 +992,12 @@ mod tests {
993992
assert_eq!(info.server_name, "::1".try_into().unwrap());
994993
assert_eq!(info.tcp_addr, "/ip6/::1/tcp/2222".parse().unwrap());
995994

995+
// Check `/dnsaddr`
996+
let addr = "/dnsaddr/example.com/tcp/2222/ws"
997+
.parse::<Multiaddr>()
998+
.unwrap();
999+
parse_ws_dial_addr::<io::Error>(addr).unwrap_err();
1000+
9961001
// Check non-ws address
9971002
let addr = "/ip4/127.0.0.1/tcp/2222".parse::<Multiaddr>().unwrap();
9981003
parse_ws_dial_addr::<io::Error>(addr).unwrap_err();

0 commit comments

Comments
 (0)