Skip to content

Commit c9f6b13

Browse files
committed
Include request struct in handshake_auth instead of cookies
1 parent 23474f7 commit c9f6b13

10 files changed

Lines changed: 27 additions & 28 deletions

rust/loro-websocket-server/src/lib.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ type AuthFuture =
108108
Pin<Box<dyn Future<Output = Result<Option<Permission>, String>> + Send + 'static>>;
109109
type AuthFn = Arc<dyn Fn(String, CrdtType, Vec<u8>) -> AuthFuture + Send + Sync>;
110110

111-
type HandshakeAuthFn = dyn Fn(&str, Option<&str>, &HashMap<String, String>) -> bool + Send + Sync;
111+
type HandshakeAuthFn = dyn Fn(&str, Option<&str>, &tungstenite::handshake::server::Request) -> bool + Send + Sync;
112112

113113
#[derive(Clone)]
114114
pub struct ServerConfig<DocCtx = ()> {
@@ -122,7 +122,7 @@ pub struct ServerConfig<DocCtx = ()> {
122122
/// Parameters:
123123
/// - `workspace_id`: extracted from request path `/{workspace}` (empty if missing)
124124
/// - `token`: `token` query parameter if present
125-
/// - `cookies`: parsed cookies from `Cookie` header
125+
/// - `request`: the full HTTP request (headers, uri, etc)
126126
///
127127
/// Return true to accept, false to reject with 401.
128128
pub handshake_auth: Option<Arc<HandshakeAuthFn>>,
@@ -926,19 +926,7 @@ where
926926
None
927927
});
928928

929-
// Parse cookies
930-
let mut cookies = HashMap::new();
931-
if let Some(header) = req.headers().get("Cookie") {
932-
if let Ok(s) = header.to_str() {
933-
for cookie in cookie::Cookie::split_parse(s) {
934-
if let Ok(c) = cookie {
935-
cookies.insert(c.name().to_string(), c.value().to_string());
936-
}
937-
}
938-
}
939-
}
940-
941-
let allowed = (check)(workspace_id, token, &cookies);
929+
let allowed = (check)(workspace_id, token, req);
942930
if !allowed {
943931
warn!(workspace=%workspace_id, token=?token, "handshake auth denied");
944932
// Build a 401 Unauthorized response

rust/loro-websocket-server/tests/e2e.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ async fn e2e_sync_two_clients_docupdate_roundtrip() {
1414
let addr = listener.local_addr().unwrap();
1515
let server_task = tokio::spawn(async move {
1616
let cfg: Cfg = server::ServerConfig {
17-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
17+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
1818
..Default::default()
1919
};
2020
server::serve_incoming_with_config(listener, cfg)
@@ -65,7 +65,7 @@ async fn workspaces_are_isolated() {
6565
let addr = listener.local_addr().unwrap();
6666
let server_task = tokio::spawn(async move {
6767
let cfg: Cfg = server::ServerConfig {
68-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
68+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
6969
..Default::default()
7070
};
7171
server::serve_incoming_with_config(listener, cfg)
@@ -104,7 +104,7 @@ async fn e2e_sync_two_clients_loro_adaptor_roundtrip() {
104104
let addr = listener.local_addr().unwrap();
105105
let server_task = tokio::spawn(async move {
106106
let cfg: Cfg = server::ServerConfig {
107-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
107+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
108108
..Default::default()
109109
};
110110
server::serve_incoming_with_config(listener, cfg)
@@ -154,7 +154,7 @@ async fn e2e_sync_two_clients_elo_adaptor_roundtrip() {
154154
let addr = listener.local_addr().unwrap();
155155
let server_task = tokio::spawn(async move {
156156
let cfg: Cfg = server::ServerConfig {
157-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
157+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
158158
..Default::default()
159159
};
160160
server::serve_incoming_with_config(listener, cfg)

rust/loro-websocket-server/tests/elo_accept_broadcast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ async fn elo_accepts_join_and_broadcasts_updates() {
1111
let addr = listener.local_addr().unwrap();
1212
let server_task = tokio::spawn(async move {
1313
let cfg: server::ServerConfig<()> = server::ServerConfig {
14-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
14+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
1515
..Default::default()
1616
};
1717
server::serve_incoming_with_config(listener, cfg)

rust/loro-websocket-server/tests/elo_fragment_reassembly.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ async fn elo_fragment_reassembly_broadcasts_original_frames() {
1919
let addr = listener.local_addr().unwrap();
2020
let server_task = tokio::spawn(async move {
2121
let cfg: server::ServerConfig<()> = server::ServerConfig {
22-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
22+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
2323
..Default::default()
2424
};
2525
server::serve_incoming_with_config(listener, cfg)

rust/loro-websocket-server/tests/handshake_auth.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ async fn handshake_rejects_invalid_token_with_401() {
99
let addr = listener.local_addr().unwrap();
1010
let server_task = tokio::spawn(async move {
1111
let cfg: server::ServerConfig<()> = server::ServerConfig {
12-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
12+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
1313
..Default::default()
1414
};
1515
server::serve_incoming_with_config(listener, cfg)

rust/loro-websocket-server/tests/handshake_cookies.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,19 @@ async fn handshake_auth_can_read_cookies() {
1010
let addr = listener.local_addr().unwrap();
1111
let server_task = tokio::spawn(async move {
1212
let cfg: server::ServerConfig<()> = server::ServerConfig {
13-
handshake_auth: Some(Arc::new(|_ws, _token, cookies| {
14-
cookies.get("session").map(|v| v.as_str()) == Some("valid")
13+
handshake_auth: Some(Arc::new(|_ws, _token, req| {
14+
if let Some(header) = req.headers().get("Cookie") {
15+
if let Ok(s) = header.to_str() {
16+
for cookie in cookie::Cookie::split_parse(s) {
17+
if let Ok(c) = cookie {
18+
if c.name() == "session" && c.value() == "valid" {
19+
return true;
20+
}
21+
}
22+
}
23+
}
24+
}
25+
false
1526
})),
1627
..Default::default()
1728
};

rust/loro-websocket-server/tests/join_denied.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ async fn join_denied_returns_error() {
1313
let cfg: server::ServerConfig<()> = server::ServerConfig {
1414
authenticate: Some(Arc::new(|_room, _crdt, _auth| Box::pin(async { Ok(None) }))),
1515
default_permission: Permission::Write,
16-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
16+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
1717
..Default::default()
1818
};
1919
let server_task = tokio::spawn(async move {

rust/loro-websocket-server/tests/join_snapshot_load.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async fn join_sends_snapshot_from_loader() {
2424
})
2525
})
2626
})),
27-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
27+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
2828
..Default::default()
2929
};
3030
let server_task = tokio::spawn(async move {

rust/loro-websocket-server/tests/readonly_receive.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async fn readonly_receives_updates_writer_sends() {
2424
})
2525
})),
2626
default_permission: Permission::Write,
27-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
27+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
2828
..Default::default()
2929
};
3030
let server_task = tokio::spawn(async move {

rust/loro-websocket-server/tests/reject_update_without_join.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ async fn reject_update_without_join() {
99
let addr = listener.local_addr().unwrap();
1010
let server_task = tokio::spawn(async move {
1111
let cfg: server::ServerConfig<()> = server::ServerConfig {
12-
handshake_auth: Some(Arc::new(|_ws, token, _cookies| token == Some("secret"))),
12+
handshake_auth: Some(Arc::new(|_ws, token, _req| token == Some("secret"))),
1313
..Default::default()
1414
};
1515
server::serve_incoming_with_config(listener, cfg)

0 commit comments

Comments
 (0)