@@ -33,12 +33,16 @@ use ldk_server_protos::endpoints::{
3333} ;
3434use ldk_server_protos:: error:: { ErrorCode , ErrorResponse } ;
3535use reqwest:: header:: CONTENT_TYPE ;
36- use reqwest:: Client ;
36+ use reqwest:: { Certificate , Client } ;
3737use std:: time:: { SystemTime , UNIX_EPOCH } ;
3838
3939const APPLICATION_OCTET_STREAM : & str = "application/octet-stream" ;
4040
4141/// Client to access a hosted instance of LDK Server.
42+ ///
43+ /// The client requires the server's TLS certificate to be provided for verification.
44+ /// This certificate can be found at `<server_storage_dir>/tls_cert.pem` after the
45+ /// server generates it on first startup.
4246#[ derive( Clone ) ]
4347pub struct LdkServerClient {
4448 base_url : String ,
@@ -48,9 +52,21 @@ pub struct LdkServerClient {
4852
4953impl LdkServerClient {
5054 /// Constructs a [`LdkServerClient`] using `base_url` as the ldk-server endpoint.
55+ ///
56+ /// `base_url` should not include the scheme, e.g., `localhost:3000`.
5157 /// `api_key` is used for HMAC-based authentication.
52- pub fn new ( base_url : String , api_key : String ) -> Self {
53- Self { base_url, client : Client :: new ( ) , api_key }
58+ /// `server_cert_pem` is the server's TLS certificate in PEM format. This can be
59+ /// found at `<server_storage_dir>/tls_cert.pem` after the server starts.
60+ pub fn new ( base_url : String , api_key : String , server_cert_pem : & [ u8 ] ) -> Result < Self , String > {
61+ let cert = Certificate :: from_pem ( server_cert_pem)
62+ . map_err ( |e| format ! ( "Failed to parse server certificate: {e}" ) ) ?;
63+
64+ let client = Client :: builder ( )
65+ . add_root_certificate ( cert)
66+ . build ( )
67+ . map_err ( |e| format ! ( "Failed to build HTTP client: {e}" ) ) ?;
68+
69+ Ok ( Self { base_url, client, api_key } )
5470 }
5571
5672 /// Computes the HMAC-SHA256 authentication header value.
@@ -75,7 +91,7 @@ impl LdkServerClient {
7591 pub async fn get_node_info (
7692 & self , request : GetNodeInfoRequest ,
7793 ) -> Result < GetNodeInfoResponse , LdkServerError > {
78- let url = format ! ( "http ://{}/{GET_NODE_INFO_PATH}" , self . base_url) ;
94+ let url = format ! ( "https ://{}/{GET_NODE_INFO_PATH}" , self . base_url) ;
7995 self . post_request ( & request, & url) . await
8096 }
8197
@@ -84,7 +100,7 @@ impl LdkServerClient {
84100 pub async fn get_balances (
85101 & self , request : GetBalancesRequest ,
86102 ) -> Result < GetBalancesResponse , LdkServerError > {
87- let url = format ! ( "http ://{}/{GET_BALANCES_PATH}" , self . base_url) ;
103+ let url = format ! ( "https ://{}/{GET_BALANCES_PATH}" , self . base_url) ;
88104 self . post_request ( & request, & url) . await
89105 }
90106
@@ -93,7 +109,7 @@ impl LdkServerClient {
93109 pub async fn onchain_receive (
94110 & self , request : OnchainReceiveRequest ,
95111 ) -> Result < OnchainReceiveResponse , LdkServerError > {
96- let url = format ! ( "http ://{}/{ONCHAIN_RECEIVE_PATH}" , self . base_url) ;
112+ let url = format ! ( "https ://{}/{ONCHAIN_RECEIVE_PATH}" , self . base_url) ;
97113 self . post_request ( & request, & url) . await
98114 }
99115
@@ -102,7 +118,7 @@ impl LdkServerClient {
102118 pub async fn onchain_send (
103119 & self , request : OnchainSendRequest ,
104120 ) -> Result < OnchainSendResponse , LdkServerError > {
105- let url = format ! ( "http ://{}/{ONCHAIN_SEND_PATH}" , self . base_url) ;
121+ let url = format ! ( "https ://{}/{ONCHAIN_SEND_PATH}" , self . base_url) ;
106122 self . post_request ( & request, & url) . await
107123 }
108124
@@ -111,7 +127,7 @@ impl LdkServerClient {
111127 pub async fn bolt11_receive (
112128 & self , request : Bolt11ReceiveRequest ,
113129 ) -> Result < Bolt11ReceiveResponse , LdkServerError > {
114- let url = format ! ( "http ://{}/{BOLT11_RECEIVE_PATH}" , self . base_url) ;
130+ let url = format ! ( "https ://{}/{BOLT11_RECEIVE_PATH}" , self . base_url) ;
115131 self . post_request ( & request, & url) . await
116132 }
117133
@@ -120,7 +136,7 @@ impl LdkServerClient {
120136 pub async fn bolt11_send (
121137 & self , request : Bolt11SendRequest ,
122138 ) -> Result < Bolt11SendResponse , LdkServerError > {
123- let url = format ! ( "http ://{}/{BOLT11_SEND_PATH}" , self . base_url) ;
139+ let url = format ! ( "https ://{}/{BOLT11_SEND_PATH}" , self . base_url) ;
124140 self . post_request ( & request, & url) . await
125141 }
126142
@@ -129,7 +145,7 @@ impl LdkServerClient {
129145 pub async fn bolt12_receive (
130146 & self , request : Bolt12ReceiveRequest ,
131147 ) -> Result < Bolt12ReceiveResponse , LdkServerError > {
132- let url = format ! ( "http ://{}/{BOLT12_RECEIVE_PATH}" , self . base_url) ;
148+ let url = format ! ( "https ://{}/{BOLT12_RECEIVE_PATH}" , self . base_url) ;
133149 self . post_request ( & request, & url) . await
134150 }
135151
@@ -138,7 +154,7 @@ impl LdkServerClient {
138154 pub async fn bolt12_send (
139155 & self , request : Bolt12SendRequest ,
140156 ) -> Result < Bolt12SendResponse , LdkServerError > {
141- let url = format ! ( "http ://{}/{BOLT12_SEND_PATH}" , self . base_url) ;
157+ let url = format ! ( "https ://{}/{BOLT12_SEND_PATH}" , self . base_url) ;
142158 self . post_request ( & request, & url) . await
143159 }
144160
@@ -147,7 +163,7 @@ impl LdkServerClient {
147163 pub async fn open_channel (
148164 & self , request : OpenChannelRequest ,
149165 ) -> Result < OpenChannelResponse , LdkServerError > {
150- let url = format ! ( "http ://{}/{OPEN_CHANNEL_PATH}" , self . base_url) ;
166+ let url = format ! ( "https ://{}/{OPEN_CHANNEL_PATH}" , self . base_url) ;
151167 self . post_request ( & request, & url) . await
152168 }
153169
@@ -156,7 +172,7 @@ impl LdkServerClient {
156172 pub async fn splice_in (
157173 & self , request : SpliceInRequest ,
158174 ) -> Result < SpliceInResponse , LdkServerError > {
159- let url = format ! ( "http ://{}/{SPLICE_IN_PATH}" , self . base_url) ;
175+ let url = format ! ( "https ://{}/{SPLICE_IN_PATH}" , self . base_url) ;
160176 self . post_request ( & request, & url) . await
161177 }
162178
@@ -165,7 +181,7 @@ impl LdkServerClient {
165181 pub async fn splice_out (
166182 & self , request : SpliceOutRequest ,
167183 ) -> Result < SpliceOutResponse , LdkServerError > {
168- let url = format ! ( "http ://{}/{SPLICE_OUT_PATH}" , self . base_url) ;
184+ let url = format ! ( "https ://{}/{SPLICE_OUT_PATH}" , self . base_url) ;
169185 self . post_request ( & request, & url) . await
170186 }
171187
@@ -174,7 +190,7 @@ impl LdkServerClient {
174190 pub async fn close_channel (
175191 & self , request : CloseChannelRequest ,
176192 ) -> Result < CloseChannelResponse , LdkServerError > {
177- let url = format ! ( "http ://{}/{CLOSE_CHANNEL_PATH}" , self . base_url) ;
193+ let url = format ! ( "https ://{}/{CLOSE_CHANNEL_PATH}" , self . base_url) ;
178194 self . post_request ( & request, & url) . await
179195 }
180196
@@ -183,7 +199,7 @@ impl LdkServerClient {
183199 pub async fn force_close_channel (
184200 & self , request : ForceCloseChannelRequest ,
185201 ) -> Result < ForceCloseChannelResponse , LdkServerError > {
186- let url = format ! ( "http ://{}/{FORCE_CLOSE_CHANNEL_PATH}" , self . base_url) ;
202+ let url = format ! ( "https ://{}/{FORCE_CLOSE_CHANNEL_PATH}" , self . base_url) ;
187203 self . post_request ( & request, & url) . await
188204 }
189205
@@ -192,7 +208,7 @@ impl LdkServerClient {
192208 pub async fn list_channels (
193209 & self , request : ListChannelsRequest ,
194210 ) -> Result < ListChannelsResponse , LdkServerError > {
195- let url = format ! ( "http ://{}/{LIST_CHANNELS_PATH}" , self . base_url) ;
211+ let url = format ! ( "https ://{}/{LIST_CHANNELS_PATH}" , self . base_url) ;
196212 self . post_request ( & request, & url) . await
197213 }
198214
@@ -201,7 +217,7 @@ impl LdkServerClient {
201217 pub async fn list_payments (
202218 & self , request : ListPaymentsRequest ,
203219 ) -> Result < ListPaymentsResponse , LdkServerError > {
204- let url = format ! ( "http ://{}/{LIST_PAYMENTS_PATH}" , self . base_url) ;
220+ let url = format ! ( "https ://{}/{LIST_PAYMENTS_PATH}" , self . base_url) ;
205221 self . post_request ( & request, & url) . await
206222 }
207223
@@ -210,7 +226,7 @@ impl LdkServerClient {
210226 pub async fn update_channel_config (
211227 & self , request : UpdateChannelConfigRequest ,
212228 ) -> Result < UpdateChannelConfigResponse , LdkServerError > {
213- let url = format ! ( "http ://{}/{UPDATE_CHANNEL_CONFIG_PATH}" , self . base_url) ;
229+ let url = format ! ( "https ://{}/{UPDATE_CHANNEL_CONFIG_PATH}" , self . base_url) ;
214230 self . post_request ( & request, & url) . await
215231 }
216232
0 commit comments