Skip to content

Commit 6e03ab1

Browse files
committed
Use session enpoint url for directory when available
when merging the ohttp-key fetching and validation functions I found that there was some logic that was skipping the correct directory selection. By ensuring that the directory is chosen per session we can ensure that the correct directory is used no matter the initial config at intialization.
1 parent 105678c commit 6e03ab1

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ 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 = unwrap_ohttp_keys_or_else_fetch(&self.config, self.relay_manager.clone())
81-
.await?
82-
.ohttp_keys;
80+
let ohttp_keys =
81+
unwrap_ohttp_keys_or_else_fetch(&self.config, None, self.relay_manager.clone())
82+
.await?
83+
.ohttp_keys;
8384
let mut persister = ReceiverPersister::new(self.db.clone());
8485
let new_receiver = NewReceiver::new(
8586
address,
@@ -161,7 +162,9 @@ impl App {
161162
println!("Receive session established");
162163
let mut pj_uri = session.pj_uri();
163164
pj_uri.amount = amount;
164-
let ohttp_relay = self.unwrap_relay_or_else_fetch().await?;
165+
let ohttp_relay = self
166+
.unwrap_relay_or_else_fetch(Some(session.pj_uri().extras.endpoint().clone()))
167+
.await?;
165168

166169
println!("Request Payjoin by sharing this Payjoin Uri:");
167170
println!("{pj_uri}");
@@ -202,7 +205,7 @@ impl App {
202205
}
203206

204207
async fn long_poll_post(&self, req_ctx: &mut Sender<WithReplyKey>) -> Result<Psbt> {
205-
let ohttp_relay = self.unwrap_relay_or_else_fetch().await?;
208+
let ohttp_relay = self.unwrap_relay_or_else_fetch(Some(req_ctx.endpoint().clone())).await?;
206209

207210
match req_ctx.extract_v2(ohttp_relay.clone()) {
208211
Ok((req, ctx)) => {
@@ -247,7 +250,9 @@ impl App {
247250
&self,
248251
session: &mut Receiver<WithContext>,
249252
) -> Result<Receiver<UncheckedProposal>> {
250-
let ohttp_relay = self.unwrap_relay_or_else_fetch().await?;
253+
let ohttp_relay = self
254+
.unwrap_relay_or_else_fetch(Some(session.pj_uri().extras.endpoint().clone()))
255+
.await?;
251256

252257
loop {
253258
let (req, context) = session.extract_req(&ohttp_relay)?;
@@ -303,13 +308,16 @@ impl App {
303308
Ok(payjoin_proposal)
304309
}
305310

306-
async fn unwrap_relay_or_else_fetch(&self) -> Result<payjoin::Url> {
311+
async fn unwrap_relay_or_else_fetch(
312+
&self,
313+
directory: Option<payjoin::Url>,
314+
) -> Result<payjoin::Url> {
307315
let selected_relay =
308316
self.relay_manager.lock().expect("Lock should not be poisoned").get_selected_relay();
309317
let ohttp_relay = match selected_relay {
310318
Some(relay) => relay,
311319
None =>
312-
unwrap_ohttp_keys_or_else_fetch(&self.config, self.relay_manager.clone())
320+
unwrap_ohttp_keys_or_else_fetch(&self.config, directory, self.relay_manager.clone())
313321
.await?
314322
.relay_url,
315323
};

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,30 @@ pub(crate) struct ValidatedOhttpKeys {
2929

3030
pub(crate) async fn unwrap_ohttp_keys_or_else_fetch(
3131
config: &Config,
32+
directory: Option<payjoin::Url>,
3233
relay_manager: Arc<Mutex<RelayManager>>,
3334
) -> Result<ValidatedOhttpKeys> {
34-
let config_keys = config.v2()?.ohttp_keys.clone();
35-
let mut fetched_keys = fetch_ohttp_keys(config, relay_manager).await?;
36-
37-
if let Some(keys) = config_keys {
38-
fetched_keys.ohttp_keys = keys;
35+
if let Some(ohttp_keys) = config.v2()?.ohttp_keys.clone() {
36+
println!("Using OHTTP Keys from config");
37+
return Ok(ValidatedOhttpKeys {
38+
ohttp_keys,
39+
relay_url: config.v2()?.ohttp_relays[0].clone(),
40+
});
41+
} else {
42+
println!("Bootstrapping private network transport over Oblivious HTTP");
43+
let fetched_keys = fetch_ohttp_keys(config, directory, relay_manager).await?;
44+
45+
Ok(fetched_keys)
3946
}
40-
41-
Ok(fetched_keys)
4247
}
4348

4449
async fn fetch_ohttp_keys(
4550
config: &Config,
51+
directory: Option<payjoin::Url>,
4652
relay_manager: Arc<Mutex<RelayManager>>,
4753
) -> Result<ValidatedOhttpKeys> {
4854
use payjoin::bitcoin::secp256k1::rand::prelude::SliceRandom;
49-
let payjoin_directory = config.v2()?.pj_directory.clone();
55+
let payjoin_directory = directory.unwrap_or(config.v2()?.pj_directory.clone());
5056
let relays = config.v2()?.ohttp_relays.clone();
5157

5258
loop {

0 commit comments

Comments
 (0)