Skip to content

Commit 105678c

Browse files
committed
Merge parallel feature flag local certificate logic in cli ohttp
These ohttp functions had parallel methods when running tests vs running in production. This made it difficult to read as there were two functions that appeared to do completely different things when a feature flag was present.
1 parent 1063687 commit 105678c

File tree

2 files changed

+38
-99
lines changed

2 files changed

+38
-99
lines changed

payjoin-cli/src/app/v2/mod.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use tokio::sync::watch;
1616
use super::config::Config;
1717
use super::wallet::BitcoindWallet;
1818
use super::App as AppTrait;
19-
use crate::app::v2::ohttp::{unwrap_ohttp_keys_or_else_fetch, validate_relay, RelayManager};
19+
use crate::app::v2::ohttp::{unwrap_ohttp_keys_or_else_fetch, RelayManager};
2020
use crate::app::{handle_interrupt, http_agent};
2121
use crate::db::v2::{ReceiverPersister, SenderPersister};
2222
use crate::db::Database;
@@ -77,8 +77,9 @@ impl AppTrait for App {
7777

7878
async fn receive_payjoin(&self, amount: Amount) -> Result<()> {
7979
let address = self.wallet().get_new_address()?;
80-
let ohttp_keys =
81-
unwrap_ohttp_keys_or_else_fetch(&self.config, self.relay_manager.clone()).await?;
80+
let ohttp_keys = unwrap_ohttp_keys_or_else_fetch(&self.config, self.relay_manager.clone())
81+
.await?
82+
.ohttp_keys;
8283
let mut persister = ReceiverPersister::new(self.db.clone());
8384
let new_receiver = NewReceiver::new(
8485
address,
@@ -307,7 +308,10 @@ impl App {
307308
self.relay_manager.lock().expect("Lock should not be poisoned").get_selected_relay();
308309
let ohttp_relay = match selected_relay {
309310
Some(relay) => relay,
310-
None => validate_relay(&self.config, self.relay_manager.clone()).await?,
311+
None =>
312+
unwrap_ohttp_keys_or_else_fetch(&self.config, self.relay_manager.clone())
313+
.await?
314+
.relay_url,
311315
};
312316
Ok(ohttp_relay)
313317
}

payjoin-cli/src/app/v2/ohttp.rs

Lines changed: 30 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,50 @@
11
use std::sync::{Arc, Mutex};
22

3-
#[cfg(feature = "_danger-local-https")]
4-
use anyhow::Result;
5-
#[cfg(not(feature = "_danger-local-https"))]
63
use anyhow::{anyhow, Result};
74

85
use super::Config;
96

107
#[derive(Debug, Clone)]
118
pub struct RelayManager {
129
selected_relay: Option<payjoin::Url>,
13-
#[cfg(not(feature = "_danger-local-https"))]
1410
failed_relays: Vec<payjoin::Url>,
1511
}
1612

1713
impl RelayManager {
18-
#[cfg(feature = "_danger-local-https")]
19-
pub fn new() -> Self { RelayManager { selected_relay: None } }
20-
#[cfg(not(feature = "_danger-local-https"))]
2114
pub fn new() -> Self { RelayManager { selected_relay: None, failed_relays: Vec::new() } }
2215

23-
#[cfg(not(feature = "_danger-local-https"))]
2416
pub fn set_selected_relay(&mut self, relay: payjoin::Url) { self.selected_relay = Some(relay); }
2517

2618
pub fn get_selected_relay(&self) -> Option<payjoin::Url> { self.selected_relay.clone() }
2719

28-
#[cfg(not(feature = "_danger-local-https"))]
2920
pub fn add_failed_relay(&mut self, relay: payjoin::Url) { self.failed_relays.push(relay); }
3021

31-
#[cfg(not(feature = "_danger-local-https"))]
3222
pub fn get_failed_relays(&self) -> Vec<payjoin::Url> { self.failed_relays.clone() }
3323
}
3424

35-
pub(crate) async fn unwrap_ohttp_keys_or_else_fetch(
36-
config: &Config,
37-
relay_manager: Arc<Mutex<RelayManager>>,
38-
) -> Result<payjoin::OhttpKeys> {
39-
if let Some(keys) = config.v2()?.ohttp_keys.clone() {
40-
println!("Using OHTTP Keys from config");
41-
Ok(keys)
42-
} else {
43-
println!("Bootstrapping private network transport over Oblivious HTTP");
44-
45-
fetch_keys(config, relay_manager.clone())
46-
.await
47-
.and_then(|keys| keys.ok_or_else(|| anyhow::anyhow!("No OHTTP keys found")))
48-
}
25+
pub(crate) struct ValidatedOhttpKeys {
26+
pub(crate) ohttp_keys: payjoin::OhttpKeys,
27+
pub(crate) relay_url: payjoin::Url,
4928
}
5029

51-
#[cfg(not(feature = "_danger-local-https"))]
52-
async fn fetch_keys(
30+
pub(crate) async fn unwrap_ohttp_keys_or_else_fetch(
5331
config: &Config,
5432
relay_manager: Arc<Mutex<RelayManager>>,
55-
) -> Result<Option<payjoin::OhttpKeys>> {
56-
use payjoin::bitcoin::secp256k1::rand::prelude::SliceRandom;
57-
let payjoin_directory = config.v2()?.pj_directory.clone();
58-
let relays = config.v2()?.ohttp_relays.clone();
59-
60-
loop {
61-
let failed_relays =
62-
relay_manager.lock().expect("Lock should not be poisoned").get_failed_relays();
63-
64-
let remaining_relays: Vec<_> =
65-
relays.iter().filter(|r| !failed_relays.contains(r)).cloned().collect();
66-
67-
if remaining_relays.is_empty() {
68-
return Err(anyhow!("No valid relays available"));
69-
}
70-
71-
let selected_relay =
72-
match remaining_relays.choose(&mut payjoin::bitcoin::key::rand::thread_rng()) {
73-
Some(relay) => relay.clone(),
74-
None => return Err(anyhow!("Failed to select from remaining relays")),
75-
};
76-
77-
relay_manager
78-
.lock()
79-
.expect("Lock should not be poisoned")
80-
.set_selected_relay(selected_relay.clone());
33+
) -> Result<ValidatedOhttpKeys> {
34+
let config_keys = config.v2()?.ohttp_keys.clone();
35+
let mut fetched_keys = fetch_ohttp_keys(config, relay_manager).await?;
8136

82-
let ohttp_keys = {
83-
payjoin::io::fetch_ohttp_keys(selected_relay.clone(), payjoin_directory.clone()).await
84-
};
85-
86-
match ohttp_keys {
87-
Ok(keys) => return Ok(Some(keys)),
88-
Err(payjoin::io::Error::UnexpectedStatusCode(e)) => {
89-
return Err(payjoin::io::Error::UnexpectedStatusCode(e).into());
90-
}
91-
Err(e) => {
92-
log::debug!("Failed to connect to relay: {selected_relay}, {e:?}");
93-
relay_manager
94-
.lock()
95-
.expect("Lock should not be poisoned")
96-
.add_failed_relay(selected_relay);
97-
}
98-
}
37+
if let Some(keys) = config_keys {
38+
fetched_keys.ohttp_keys = keys;
9939
}
100-
}
10140

102-
///Local relays are incapable of acting as proxies so we must opportunistically fetch keys from the config
103-
#[cfg(feature = "_danger-local-https")]
104-
async fn fetch_keys(
105-
config: &Config,
106-
_relay_manager: Arc<Mutex<RelayManager>>,
107-
) -> Result<Option<payjoin::OhttpKeys>> {
108-
let keys = config.v2()?.ohttp_keys.clone().expect("No OHTTP keys set");
109-
110-
Ok(Some(keys))
41+
Ok(fetched_keys)
11142
}
11243

113-
#[cfg(not(feature = "_danger-local-https"))]
114-
pub(crate) async fn validate_relay(
44+
async fn fetch_ohttp_keys(
11545
config: &Config,
11646
relay_manager: Arc<Mutex<RelayManager>>,
117-
) -> Result<payjoin::Url> {
47+
) -> Result<ValidatedOhttpKeys> {
11848
use payjoin::bitcoin::secp256k1::rand::prelude::SliceRandom;
11949
let payjoin_directory = config.v2()?.pj_directory.clone();
12050
let relays = config.v2()?.ohttp_relays.clone();
@@ -141,11 +71,26 @@ pub(crate) async fn validate_relay(
14171
.expect("Lock should not be poisoned")
14272
.set_selected_relay(selected_relay.clone());
14373

144-
let ohttp_keys =
145-
payjoin::io::fetch_ohttp_keys(selected_relay.clone(), payjoin_directory.clone()).await;
74+
let ohttp_keys = {
75+
#[cfg(feature = "_danger-local-https")]
76+
{
77+
let cert_der = crate::app::read_local_cert()?;
78+
payjoin::io::fetch_ohttp_keys_with_cert(
79+
&selected_relay,
80+
&payjoin_directory,
81+
cert_der,
82+
)
83+
.await
84+
}
85+
#[cfg(not(feature = "_danger-local-https"))]
86+
{
87+
payjoin::io::fetch_ohttp_keys(&selected_relay, &payjoin_directory).await
88+
}
89+
};
14690

14791
match ohttp_keys {
148-
Ok(_) => return Ok(selected_relay),
92+
Ok(keys) =>
93+
return Ok(ValidatedOhttpKeys { ohttp_keys: keys, relay_url: selected_relay }),
14994
Err(payjoin::io::Error::UnexpectedStatusCode(e)) => {
15095
return Err(payjoin::io::Error::UnexpectedStatusCode(e).into());
15196
}
@@ -159,13 +104,3 @@ pub(crate) async fn validate_relay(
159104
}
160105
}
161106
}
162-
163-
#[cfg(feature = "_danger-local-https")]
164-
pub(crate) async fn validate_relay(
165-
config: &Config,
166-
_relay_manager: Arc<Mutex<RelayManager>>,
167-
) -> Result<payjoin::Url> {
168-
let relay = config.v2()?.ohttp_relays.first().expect("no OHTTP relay set").clone();
169-
170-
Ok(relay)
171-
}

0 commit comments

Comments
 (0)