22#![ allow( deprecated) ]
33
44use futures:: SinkExt as _;
5+ use jsonwebtoken:: { DecodingKey , EncodingKey } ;
56use libsql:: Database ;
67use libsql_server:: {
7- auth:: { user_auth_strategies, Auth } ,
8+ auth:: {
9+ user_auth_strategies:: { self , jwt:: Token } ,
10+ Auth ,
11+ } ,
812 config:: UserApiConfig ,
913} ;
14+ use ring:: signature:: { Ed25519KeyPair , KeyPair } ;
1015use tempfile:: tempdir;
1116use tokio_stream:: StreamExt ;
1217use tokio_tungstenite:: {
@@ -17,19 +22,14 @@ use turmoil::net::TcpStream;
1722
1823use crate :: common:: net:: { init_tracing, SimServer , TestServer , TurmoilConnector } ;
1924
20- const TEST_JWT_KEY : & str = "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE2NTIwNTB9.5XhUDHQhtShszTssjjUzVuJA3r-031mT4inVkvYEYz64sOCxnNpZUZdVF-CmZ4t-JTSXFlm8ddscBgkhccBxDg" ;
21-
22- async fn make_standalone_server ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
23- let jwt_pem = include_bytes ! ( "jwt_key.pem" ) ;
24- let jwt_keys = vec ! [ jsonwebtoken:: DecodingKey :: from_ed_pem( jwt_pem) . unwrap( ) ] ;
25-
25+ async fn make_standalone_server ( auth_strategy : Auth ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
2626 init_tracing ( ) ;
2727 let tmp = tempdir ( ) ?;
2828 let server = TestServer {
2929 path : tmp. path ( ) . to_owned ( ) . into ( ) ,
3030 user_api_config : UserApiConfig {
3131 hrana_ws_acceptor : None ,
32- auth_strategy : Auth :: new ( user_auth_strategies :: Jwt :: new ( jwt_keys ) ) ,
32+ auth_strategy,
3333 ..Default :: default ( )
3434 } ,
3535 ..Default :: default ( )
@@ -40,16 +40,34 @@ async fn make_standalone_server() -> Result<(), Box<dyn std::error::Error>> {
4040 Ok ( ( ) )
4141}
4242
43+ fn gen_test_jwt_auth ( ) -> ( Auth , String ) {
44+ let doc = Ed25519KeyPair :: generate_pkcs8 ( & ring:: rand:: SystemRandom :: new ( ) ) . unwrap ( ) ;
45+ let encoding_key = EncodingKey :: from_ed_der ( doc. as_ref ( ) ) ;
46+
47+ let pair = Ed25519KeyPair :: from_pkcs8 ( doc. as_ref ( ) ) . unwrap ( ) ;
48+ let decoding_key = DecodingKey :: from_ed_der ( pair. public_key ( ) . as_ref ( ) ) ;
49+
50+ let claims = Token :: default ( ) ;
51+
52+ let header = jsonwebtoken:: Header :: new ( jsonwebtoken:: Algorithm :: EdDSA ) ;
53+ let token = jsonwebtoken:: encode ( & header, & claims, & encoding_key) . unwrap ( ) ;
54+
55+ let jwt_keys = vec ! [ decoding_key] ;
56+
57+ let auth = Auth :: new ( user_auth_strategies:: Jwt :: new ( jwt_keys) ) ;
58+
59+ ( auth, token)
60+ }
61+
4362#[ test]
4463fn http_hrana ( ) {
64+ let ( auth, token) = gen_test_jwt_auth ( ) ;
65+
4566 let mut sim = turmoil:: Builder :: new ( ) . build ( ) ;
46- sim. host ( "primary" , make_standalone_server) ;
67+ sim. host ( "primary" , move || make_standalone_server ( auth . clone ( ) ) ) ;
4768 sim. client ( "client" , async {
48- let db = Database :: open_remote_with_connector (
49- "http://primary:8080" ,
50- TEST_JWT_KEY ,
51- TurmoilConnector ,
52- ) ?;
69+ let db =
70+ Database :: open_remote_with_connector ( "http://primary:8080" , token, TurmoilConnector ) ?;
5371 let conn = db. connect ( ) ?;
5472
5573 conn. execute ( "create table t(x text)" , ( ) ) . await ?;
@@ -65,15 +83,18 @@ fn embedded_replica() {
6583 let tmp_embedded = tempdir ( ) . unwrap ( ) ;
6684 let tmp_embedded_path = tmp_embedded. path ( ) . to_owned ( ) ;
6785
86+ let ( auth, token) = gen_test_jwt_auth ( ) ;
87+
6888 let mut sim = turmoil:: Builder :: new ( ) . build ( ) ;
69- sim. host ( "primary" , make_standalone_server) ;
89+ sim. host ( "primary" , move || make_standalone_server ( auth. clone ( ) ) ) ;
90+
7091 sim. client ( "client" , async move {
7192 let path = tmp_embedded_path. join ( "embedded" ) ;
7293
7394 let db = Database :: open_with_remote_sync_connector (
7495 path. to_str ( ) . unwrap ( ) ,
7596 "http://primary:8080" ,
76- TEST_JWT_KEY ,
97+ token ,
7798 TurmoilConnector ,
7899 false ,
79100 None ,
@@ -92,9 +113,12 @@ fn embedded_replica() {
92113
93114#[ test]
94115fn ws_hrana ( ) {
116+ let ( auth, token) = gen_test_jwt_auth ( ) ;
117+
95118 let mut sim = turmoil:: Builder :: new ( ) . build ( ) ;
96- sim. host ( "primary" , make_standalone_server) ;
97- sim. client ( "client" , async {
119+ sim. host ( "primary" , move || make_standalone_server ( auth. clone ( ) ) ) ;
120+
121+ sim. client ( "client" , async move {
98122 let url = "ws://primary:8080" ;
99123
100124 let req = url. into_client_request ( ) . unwrap ( ) ;
@@ -116,7 +140,7 @@ fn ws_hrana() {
116140 }
117141
118142 let msg = ClientMsg :: Hello {
119- jwt : Some ( TEST_JWT_KEY . to_string ( ) ) ,
143+ jwt : Some ( token . to_string ( ) ) ,
120144 } ;
121145
122146 let msg_data = serde_json:: to_string ( & msg) . unwrap ( ) ;
0 commit comments