@@ -13,34 +13,12 @@ use tokio::sync::watch;
1313use super :: config:: Config ;
1414use super :: wallet:: BitcoindWallet ;
1515use super :: App as AppTrait ;
16+ use crate :: app:: v2:: ohttp:: { unwrap_ohttp_keys_or_else_fetch, validate_relay, RelayState } ;
1617use crate :: app:: { handle_interrupt, http_agent} ;
1718use crate :: db:: v2:: { ReceiverPersister , SenderPersister } ;
1819use crate :: db:: Database ;
1920
20- #[ derive( Debug , Clone ) ]
21- pub struct RelayState {
22- selected_relay : Option < payjoin:: Url > ,
23- #[ cfg( not( feature = "_danger-local-https" ) ) ]
24- failed_relays : Vec < payjoin:: Url > ,
25- }
26-
27- impl RelayState {
28- #[ cfg( feature = "_danger-local-https" ) ]
29- pub fn new ( ) -> Self { RelayState { selected_relay : None } }
30- #[ cfg( not( feature = "_danger-local-https" ) ) ]
31- pub fn new ( ) -> Self { RelayState { selected_relay : None , failed_relays : Vec :: new ( ) } }
32-
33- #[ cfg( not( feature = "_danger-local-https" ) ) ]
34- pub fn set_selected_relay ( & mut self , relay : payjoin:: Url ) { self . selected_relay = Some ( relay) ; }
35-
36- pub fn get_selected_relay ( & self ) -> Option < payjoin:: Url > { self . selected_relay . clone ( ) }
37-
38- #[ cfg( not( feature = "_danger-local-https" ) ) ]
39- pub fn add_failed_relay ( & mut self , relay : payjoin:: Url ) { self . failed_relays . push ( relay) ; }
40-
41- #[ cfg( not( feature = "_danger-local-https" ) ) ]
42- pub fn get_failed_relays ( & self ) -> Vec < payjoin:: Url > { self . failed_relays . clone ( ) }
43- }
21+ mod ohttp;
4422
4523#[ derive( Clone ) ]
4624pub ( crate ) struct App {
@@ -376,144 +354,6 @@ fn try_contributing_inputs(
376354 . commit_inputs ( ) )
377355}
378356
379- async fn unwrap_ohttp_keys_or_else_fetch (
380- config : & Config ,
381- relay_state : Arc < Mutex < RelayState > > ,
382- ) -> Result < payjoin:: OhttpKeys > {
383- if let Some ( keys) = config. v2 ( ) ?. ohttp_keys . clone ( ) {
384- println ! ( "Using OHTTP Keys from config" ) ;
385- Ok ( keys)
386- } else {
387- println ! ( "Bootstrapping private network transport over Oblivious HTTP" ) ;
388-
389- fetch_keys ( config, relay_state. clone ( ) )
390- . await
391- . and_then ( |keys| keys. ok_or_else ( || anyhow:: anyhow!( "No OHTTP keys found" ) ) )
392- }
393- }
394-
395- #[ cfg( not( feature = "_danger-local-https" ) ) ]
396- async fn fetch_keys (
397- config : & Config ,
398- relay_state : Arc < Mutex < RelayState > > ,
399- ) -> Result < Option < payjoin:: OhttpKeys > > {
400- use payjoin:: bitcoin:: secp256k1:: rand:: prelude:: SliceRandom ;
401- let payjoin_directory = config. v2 ( ) ?. pj_directory . clone ( ) ;
402- let relays = config. v2 ( ) ?. ohttp_relays . clone ( ) ;
403-
404- loop {
405- let failed_relays =
406- relay_state. lock ( ) . expect ( "Lock should not be poisoned" ) . get_failed_relays ( ) ;
407-
408- let remaining_relays: Vec < _ > =
409- relays. iter ( ) . filter ( |r| !failed_relays. contains ( r) ) . cloned ( ) . collect ( ) ;
410-
411- if remaining_relays. is_empty ( ) {
412- return Err ( anyhow ! ( "No valid relays available" ) ) ;
413- }
414-
415- let selected_relay =
416- match remaining_relays. choose ( & mut payjoin:: bitcoin:: key:: rand:: thread_rng ( ) ) {
417- Some ( relay) => relay. clone ( ) ,
418- None => return Err ( anyhow ! ( "Failed to select from remaining relays" ) ) ,
419- } ;
420-
421- relay_state
422- . lock ( )
423- . expect ( "Lock should not be poisoned" )
424- . set_selected_relay ( selected_relay. clone ( ) ) ;
425-
426- let ohttp_keys = {
427- payjoin:: io:: fetch_ohttp_keys ( selected_relay. clone ( ) , payjoin_directory. clone ( ) ) . await
428- } ;
429-
430- match ohttp_keys {
431- Ok ( keys) => return Ok ( Some ( keys) ) ,
432- Err ( payjoin:: io:: Error :: UnexpectedStatusCode ( e) ) => {
433- return Err ( payjoin:: io:: Error :: UnexpectedStatusCode ( e) . into ( ) ) ;
434- }
435- Err ( e) => {
436- log:: debug!( "Failed to connect to relay: {selected_relay}, {e:?}" ) ;
437- relay_state
438- . lock ( )
439- . expect ( "Lock should not be poisoned" )
440- . add_failed_relay ( selected_relay) ;
441- }
442- }
443- }
444- }
445-
446- ///Local relays are incapable of acting as proxies so we must opportunistically fetch keys from the config
447- #[ cfg( feature = "_danger-local-https" ) ]
448- async fn fetch_keys (
449- config : & Config ,
450- _relay_state : Arc < Mutex < RelayState > > ,
451- ) -> Result < Option < payjoin:: OhttpKeys > > {
452- let keys = config. v2 ( ) ?. ohttp_keys . clone ( ) . expect ( "No OHTTP keys set" ) ;
453-
454- Ok ( Some ( keys) )
455- }
456-
457- #[ cfg( not( feature = "_danger-local-https" ) ) ]
458- async fn validate_relay (
459- config : & Config ,
460- relay_state : Arc < Mutex < RelayState > > ,
461- ) -> Result < payjoin:: Url > {
462- use payjoin:: bitcoin:: secp256k1:: rand:: prelude:: SliceRandom ;
463- let payjoin_directory = config. v2 ( ) ?. pj_directory . clone ( ) ;
464- let relays = config. v2 ( ) ?. ohttp_relays . clone ( ) ;
465-
466- loop {
467- let failed_relays =
468- relay_state. lock ( ) . expect ( "Lock should not be poisoned" ) . get_failed_relays ( ) ;
469-
470- let remaining_relays: Vec < _ > =
471- relays. iter ( ) . filter ( |r| !failed_relays. contains ( r) ) . cloned ( ) . collect ( ) ;
472-
473- if remaining_relays. is_empty ( ) {
474- return Err ( anyhow ! ( "No valid relays available" ) ) ;
475- }
476-
477- let selected_relay =
478- match remaining_relays. choose ( & mut payjoin:: bitcoin:: key:: rand:: thread_rng ( ) ) {
479- Some ( relay) => relay. clone ( ) ,
480- None => return Err ( anyhow ! ( "Failed to select from remaining relays" ) ) ,
481- } ;
482-
483- relay_state
484- . lock ( )
485- . expect ( "Lock should not be poisoned" )
486- . set_selected_relay ( selected_relay. clone ( ) ) ;
487-
488- let ohttp_keys =
489- payjoin:: io:: fetch_ohttp_keys ( selected_relay. clone ( ) , payjoin_directory. clone ( ) ) . await ;
490-
491- match ohttp_keys {
492- Ok ( _) => return Ok ( selected_relay) ,
493- Err ( payjoin:: io:: Error :: UnexpectedStatusCode ( e) ) => {
494- return Err ( payjoin:: io:: Error :: UnexpectedStatusCode ( e) . into ( ) ) ;
495- }
496- Err ( e) => {
497- log:: debug!( "Failed to connect to relay: {selected_relay}, {e:?}" ) ;
498- relay_state
499- . lock ( )
500- . expect ( "Lock should not be poisoned" )
501- . add_failed_relay ( selected_relay) ;
502- }
503- }
504- }
505- }
506-
507- #[ cfg( feature = "_danger-local-https" ) ]
508- async fn validate_relay (
509- config : & Config ,
510- _relay_state : Arc < Mutex < RelayState > > ,
511- ) -> Result < payjoin:: Url > {
512- let relay = config. v2 ( ) ?. ohttp_relays . first ( ) . expect ( "no OHTTP relay set" ) . clone ( ) ;
513-
514- Ok ( relay)
515- }
516-
517357async fn post_request ( req : payjoin:: Request ) -> Result < reqwest:: Response > {
518358 let http = http_agent ( ) ?;
519359 http. post ( req. url )
0 commit comments