Skip to content

Commit 01b4a31

Browse files
authored
Merge pull request #354 from h3poteto/fix/tls
Use ring when rustls-tls
2 parents d51a7dc + 5fd607e commit 01b4a31

File tree

8 files changed

+52
-8
lines changed

8 files changed

+52
-8
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ rustls-tls = [
2222
"tokio-tungstenite/rustls-tls-native-roots",
2323
"reqwest/rustls-tls",
2424
"oauth2/rustls-tls",
25+
"dep:rustls",
26+
"dep:rustls-native-certs",
27+
"dep:rustls-pki-types",
2528
]
2629

2730
[dependencies]
@@ -47,6 +50,9 @@ tokio-tungstenite = { version = "0.27", features = ["url"] }
4750
tokio-util = { version = "0.7.10", features = ["codec"] }
4851
tracing = "0.1.40"
4952
url = "2.5.0"
53+
rustls = { version = "0.23", features = ["ring"], default-features = false, optional = true }
54+
rustls-native-certs = { version = "0.8", optional = true }
55+
rustls-pki-types = { version = "1", optional = true }
5056
urlencoding = "2.1"
5157
uuid = { version = "1.8", features = ["v4"] }
5258

src/firefish/web_socket.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use serde::Deserialize;
1414
use serde_json::json;
1515
use tokio::net::TcpStream;
1616
use tokio_tungstenite::{
17-
MaybeTlsStream, WebSocketStream, connect_async,
17+
MaybeTlsStream, WebSocketStream, connect_async_tls_with_config,
1818
tungstenite::{
1919
Error as WebSocketError,
2020
client::IntoClientRequest,
@@ -188,7 +188,9 @@ impl WebSocket {
188188
})?;
189189
req.headers_mut()
190190
.insert("User-Agent", self.user_agent.parse().unwrap());
191-
let (socket, response) = connect_async(req).await.map_err(|e| {
191+
let connector = crate::tls::build_connector();
192+
let (socket, response) =
193+
connect_async_tls_with_config(req, None, false, connector).await.map_err(|e| {
192194
error!("Failed to connect: {}", e);
193195
match e {
194196
WebSocketError::Http(response) => match response.status() {

src/gotosocial/web_socket.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use serde::Deserialize;
1414
use tokio_tungstenite::tungstenite::client::IntoClientRequest;
1515
use tokio_tungstenite::tungstenite::http::StatusCode;
1616
use tokio_tungstenite::{
17-
connect_async, tungstenite::error, tungstenite::protocol::Message as WebSocketMessage,
17+
connect_async_tls_with_config, tungstenite::error,
18+
tungstenite::protocol::Message as WebSocketMessage,
1819
tungstenite::protocol::frame::coding::CloseCode,
1920
};
2021
use tracing::{debug, error, info, warn};
@@ -172,7 +173,9 @@ impl WebSocket {
172173
})?;
173174
req.headers_mut()
174175
.insert("User-Agent", self.user_agent.parse().unwrap());
175-
let (mut socket, response) = connect_async(req).await.map_err(|e| {
176+
let connector = crate::tls::build_connector();
177+
let (mut socket, response) =
178+
connect_async_tls_with_config(req, None, false, connector).await.map_err(|e| {
176179
error!("Failed to connect: {}", e);
177180
match e {
178181
error::Error::Http(response) => match response.status() {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub mod pixelfed;
5959
pub mod pleroma;
6060
pub mod response;
6161
pub mod streaming;
62+
pub(crate) mod tls;
6263

6364
pub use self::megalodon::Megalodon;
6465
use crate::error::Error;

src/mastodon/web_socket.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use async_trait::async_trait;
1212
use futures_util::{SinkExt, StreamExt};
1313
use serde::Deserialize;
1414
use tokio_tungstenite::{
15-
connect_async,
15+
connect_async_tls_with_config,
1616
tungstenite::{
1717
Error as WebSocketError,
1818
client::IntoClientRequest,
@@ -186,7 +186,9 @@ impl WebSocket {
186186
})?;
187187
req.headers_mut()
188188
.insert("User-Agent", self.user_agent.parse().unwrap());
189-
let (mut socket, response) = connect_async(req).await.map_err(|e| {
189+
let connector = crate::tls::build_connector();
190+
let (mut socket, response) =
191+
connect_async_tls_with_config(req, None, false, connector).await.map_err(|e| {
190192
error!("Failed to connect: {}", e);
191193
match e {
192194
WebSocketError::Http(response) => match response.status() {

src/pleroma/web_socket.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use async_trait::async_trait;
1212
use futures_util::{SinkExt, StreamExt};
1313
use serde::Deserialize;
1414
use tokio_tungstenite::{
15-
connect_async,
15+
connect_async_tls_with_config,
1616
tungstenite::{
1717
Error as WebSocketError,
1818
client::IntoClientRequest,
@@ -186,7 +186,9 @@ impl WebSocket {
186186
})?;
187187
req.headers_mut()
188188
.insert("User-Agent", self.user_agent.parse().unwrap());
189-
let (mut socket, response) = connect_async(req).await.map_err(|e| {
189+
let connector = crate::tls::build_connector();
190+
let (mut socket, response) =
191+
connect_async_tls_with_config(req, None, false, connector).await.map_err(|e| {
190192
error!("Failed to connect: {}", e);
191193
match e {
192194
WebSocketError::Http(response) => match response.status() {

src/tls.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use tokio_tungstenite::Connector;
2+
3+
#[cfg(feature = "rustls-tls")]
4+
pub fn build_connector() -> Option<Connector> {
5+
use std::sync::Arc;
6+
7+
let mut root_store = rustls::RootCertStore::empty();
8+
for cert in rustls_native_certs::load_native_certs().certs {
9+
let _ = root_store.add(cert);
10+
}
11+
let config = rustls::ClientConfig::builder_with_provider(Arc::new(
12+
rustls::crypto::ring::default_provider(),
13+
))
14+
.with_safe_default_protocol_versions()
15+
.expect("Failed to set TLS protocol versions")
16+
.with_root_certificates(root_store)
17+
.with_no_client_auth();
18+
19+
Some(Connector::Rustls(Arc::new(config)))
20+
}
21+
22+
#[cfg(not(feature = "rustls-tls"))]
23+
pub fn build_connector() -> Option<Connector> {
24+
None
25+
}

0 commit comments

Comments
 (0)