@@ -112,6 +112,7 @@ impl Closer {
112
112
113
113
pub struct ElectrumSession {
114
114
pub data_root : String ,
115
+ pub proxy : Option < String > ,
115
116
pub network : Network ,
116
117
pub url : ElectrumUrl ,
117
118
pub wallet : Option < Arc < RwLock < WalletCtx > > > ,
@@ -179,16 +180,43 @@ pub fn determine_electrum_url_from_net(network: &Network) -> Result<ElectrumUrl,
179
180
determine_electrum_url ( & network. electrum_url , network. tls , network. validate_domain )
180
181
}
181
182
183
+ fn socksify ( proxy : Option < & str > ) -> Option < String > {
184
+ const SOCKS5 : & str = "socks5://" ;
185
+ if let Some ( proxy) = proxy {
186
+ let trimmed = proxy. trim ( ) ;
187
+ if trimmed. is_empty ( ) {
188
+ None
189
+ } else if trimmed. starts_with ( SOCKS5 ) {
190
+ Some ( trimmed. to_string ( ) )
191
+ } else {
192
+ Some ( format ! ( "{}{}" , SOCKS5 , trimmed) )
193
+ }
194
+ } else {
195
+ None
196
+ }
197
+ }
198
+
182
199
impl ElectrumSession {
183
- pub fn new_session ( network : Network , db_root : & str , url : ElectrumUrl ) -> Result < Self , Error > {
184
- Ok ( Self :: create_session ( network, db_root, url) )
200
+ pub fn new_session (
201
+ network : Network ,
202
+ db_root : & str ,
203
+ proxy : Option < & str > ,
204
+ url : ElectrumUrl ,
205
+ ) -> Result < Self , Error > {
206
+ Ok ( Self :: create_session ( network, db_root, proxy, url) )
185
207
}
186
208
}
187
209
188
210
impl ElectrumSession {
189
- pub fn create_session ( network : Network , db_root : & str , url : ElectrumUrl ) -> Self {
211
+ pub fn create_session (
212
+ network : Network ,
213
+ db_root : & str ,
214
+ proxy : Option < & str > ,
215
+ url : ElectrumUrl ,
216
+ ) -> Self {
190
217
Self {
191
218
data_root : db_root. to_string ( ) ,
219
+ proxy : socksify ( proxy) ,
192
220
network,
193
221
url,
194
222
wallet : None ,
@@ -213,8 +241,16 @@ impl ElectrumSession {
213
241
Ok ( wallet. write ( ) . unwrap ( ) )
214
242
}
215
243
216
- pub fn build_request_agent ( & self ) -> ureq:: Agent {
217
- ureq:: Agent :: new ( ) . build ( )
244
+ pub fn build_request_agent ( & self ) -> Result < ureq:: Agent , Error > {
245
+ match & self . proxy {
246
+ Some ( proxy) => {
247
+ let proxy = ureq:: Proxy :: new ( & proxy) ?;
248
+ let mut agent = ureq:: agent ( ) ;
249
+ agent. set_proxy ( proxy) ;
250
+ Ok ( agent)
251
+ }
252
+ None => Ok ( ureq:: agent ( ) ) ,
253
+ }
218
254
}
219
255
}
220
256
@@ -296,6 +332,11 @@ impl Session<Error> for ElectrumSession {
296
332
info ! ( "setting db_root to {:?}" , self . data_root) ;
297
333
}
298
334
335
+ if self . proxy . is_none ( ) {
336
+ self . proxy = socksify ( net_params[ "proxy" ] . as_str ( ) ) ;
337
+ info ! ( "setting proxy to {:?}" , self . proxy) ;
338
+ }
339
+
299
340
let mnemonic = match self . get_mnemonic ( ) {
300
341
Ok ( mnemonic) => Some ( mnemonic. clone ( ) ) ,
301
342
Err ( _) => None ,
@@ -323,7 +364,7 @@ impl Session<Error> for ElectrumSession {
323
364
pin : String ,
324
365
details : PinGetDetails ,
325
366
) -> Result < Vec < Notification > , Error > {
326
- let agent = self . build_request_agent ( ) ;
367
+ let agent = self . build_request_agent ( ) ? ;
327
368
let manager = PinManager :: new ( agent) ?;
328
369
let client_key = SecretKey :: from_slice ( & hex:: decode ( & details. pin_identifier ) ?) ?;
329
370
let server_key = manager. get_pin ( pin. as_bytes ( ) , & client_key) ?;
@@ -627,7 +668,7 @@ impl Session<Error> for ElectrumSession {
627
668
}
628
669
629
670
fn set_pin ( & self , details : & PinSetDetails ) -> Result < PinGetDetails , Error > {
630
- let agent = self . build_request_agent ( ) ;
671
+ let agent = self . build_request_agent ( ) ? ;
631
672
let manager = PinManager :: new ( agent) ?;
632
673
let client_key = SecretKey :: new ( & mut thread_rng ( ) ) ;
633
674
let server_key = manager. set_pin ( details. pin . as_bytes ( ) , & client_key) ?;
@@ -800,7 +841,7 @@ impl Session<Error> for ElectrumSession {
800
841
let last_modified =
801
842
self . get_wallet ( ) ?. store . read ( ) ?. cache . assets_last_modified . clone ( ) ;
802
843
let base_url = self . network . registry_base_url ( ) ?;
803
- let agent = self . build_request_agent ( ) ;
844
+ let agent = self . build_request_agent ( ) ? ;
804
845
thread:: spawn ( move || {
805
846
match call_assets ( agent, base_url, registry_policy, last_modified) {
806
847
Ok ( p) => tx_assets. send ( Some ( p) ) ,
@@ -814,7 +855,7 @@ impl Session<Error> for ElectrumSession {
814
855
let last_modified =
815
856
self . get_wallet ( ) ?. store . read ( ) ?. cache . icons_last_modified . clone ( ) ;
816
857
let base_url = self . network . registry_base_url ( ) ?;
817
- let agent = self . build_request_agent ( ) ;
858
+ let agent = self . build_request_agent ( ) ? ;
818
859
thread:: spawn ( move || match call_icons ( agent, base_url, last_modified) {
819
860
Ok ( p) => tx_icons. send ( Some ( p) ) ,
820
861
Err ( _) => tx_icons. send ( None ) ,
0 commit comments