Skip to content

Commit b4d60db

Browse files
committed
feat: auth on restore and check
1 parent a23c1bb commit b4d60db

File tree

6 files changed

+91
-41
lines changed

6 files changed

+91
-41
lines changed

crates/cdk-axum/src/router_handlers.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,18 @@ pub async fn post_melt_bolt11(
322322
///
323323
/// Check whether a secret has been spent already or not.
324324
pub async fn post_check(
325+
auth: AuthHeader,
325326
State(state): State<MintState>,
326327
Json(payload): Json<CheckStateRequest>,
327328
) -> Result<Json<CheckStateResponse>, Response> {
328-
let state = state.mint.check_state(&payload).await.map_err(|err| {
329-
tracing::error!("Could not check state of proofs");
330-
into_response(err)
331-
})?;
329+
let state = state
330+
.mint
331+
.check_state(auth.into(), &payload)
332+
.await
333+
.map_err(|err| {
334+
tracing::error!("Could not check state of proofs");
335+
into_response(err)
336+
})?;
332337

333338
Ok(Json(state))
334339
}
@@ -390,13 +395,18 @@ pub async fn post_swap(
390395
))]
391396
/// Restores blind signature for a set of outputs.
392397
pub async fn post_restore(
398+
auth: AuthHeader,
393399
State(state): State<MintState>,
394400
Json(payload): Json<RestoreRequest>,
395401
) -> Result<Json<RestoreResponse>, Response> {
396-
let restore_response = state.mint.restore(payload).await.map_err(|err| {
397-
tracing::error!("Could not process restore: {}", err);
398-
into_response(err)
399-
})?;
402+
let restore_response = state
403+
.mint
404+
.restore(auth.into(), payload)
405+
.await
406+
.map_err(|err| {
407+
tracing::error!("Could not process restore: {}", err);
408+
into_response(err)
409+
})?;
400410

401411
Ok(Json(restore_response))
402412
}

crates/cdk-integration-tests/src/direct_mint_connection.rs

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use cdk::{Error, Mint};
1616
use uuid::Uuid;
1717

1818
pub struct DirectMintConnection {
19+
pub cat: Option<AuthToken>,
1920
pub mint: Arc<Mint>,
2021
}
2122

@@ -60,76 +61,80 @@ impl MintConnector for DirectMintConnection {
6061
async fn post_mint_quote(
6162
&self,
6263
request: MintQuoteBolt11Request,
63-
_auth_token: Option<AuthToken>,
64+
auth_token: Option<AuthToken>,
6465
) -> Result<MintQuoteBolt11Response<String>, Error> {
6566
self.mint
66-
.get_mint_bolt11_quote(None, request)
67+
.get_mint_bolt11_quote(auth_token, request)
6768
.await
6869
.map(Into::into)
6970
}
7071

7172
async fn get_mint_quote_status(
7273
&self,
7374
quote_id: &str,
74-
_auth_token: Option<AuthToken>,
75+
auth_token: Option<AuthToken>,
7576
) -> Result<MintQuoteBolt11Response<String>, Error> {
7677
let quote_id_uuid = Uuid::from_str(quote_id).unwrap();
7778
self.mint
78-
.check_mint_quote(None, &quote_id_uuid)
79+
.check_mint_quote(auth_token, &quote_id_uuid)
7980
.await
8081
.map(Into::into)
8182
}
8283

8384
async fn post_mint(
8485
&self,
8586
request: MintBolt11Request<String>,
86-
_auth_token: Option<AuthToken>,
87+
auth_token: Option<AuthToken>,
8788
) -> Result<MintBolt11Response, Error> {
8889
let request_uuid = request.try_into().unwrap();
89-
self.mint.process_mint_request(None, request_uuid).await
90+
self.mint
91+
.process_mint_request(auth_token, request_uuid)
92+
.await
9093
}
9194

9295
async fn post_melt_quote(
9396
&self,
9497
request: MeltQuoteBolt11Request,
95-
_auth_token: Option<AuthToken>,
98+
auth_token: Option<AuthToken>,
9699
) -> Result<MeltQuoteBolt11Response<String>, Error> {
97100
self.mint
98-
.get_melt_bolt11_quote(None, &request)
101+
.get_melt_bolt11_quote(auth_token, &request)
99102
.await
100103
.map(Into::into)
101104
}
102105

103106
async fn get_melt_quote_status(
104107
&self,
105108
quote_id: &str,
106-
_auth_token: Option<AuthToken>,
109+
auth_token: Option<AuthToken>,
107110
) -> Result<MeltQuoteBolt11Response<String>, Error> {
108111
let quote_id_uuid = Uuid::from_str(quote_id).unwrap();
109112
self.mint
110-
.check_melt_quote(None, &quote_id_uuid)
113+
.check_melt_quote(auth_token, &quote_id_uuid)
111114
.await
112115
.map(Into::into)
113116
}
114117

115118
async fn post_melt(
116119
&self,
117120
request: MeltBolt11Request<String>,
118-
_auth_token: Option<AuthToken>,
121+
auth_token: Option<AuthToken>,
119122
) -> Result<MeltQuoteBolt11Response<String>, Error> {
120123
let request_uuid = request.try_into().unwrap();
121124
self.mint
122-
.melt_bolt11(None, &request_uuid)
125+
.melt_bolt11(auth_token, &request_uuid)
123126
.await
124127
.map(Into::into)
125128
}
126129

127130
async fn post_swap(
128131
&self,
129132
swap_request: SwapRequest,
130-
_auth_token: Option<AuthToken>,
133+
auth_token: Option<AuthToken>,
131134
) -> Result<SwapResponse, Error> {
132-
self.mint.process_swap_request(None, swap_request).await
135+
self.mint
136+
.process_swap_request(auth_token, swap_request)
137+
.await
133138
}
134139

135140
async fn get_mint_info(&self) -> Result<MintInfo, Error> {
@@ -139,36 +144,44 @@ impl MintConnector for DirectMintConnection {
139144
async fn post_check_state(
140145
&self,
141146
request: CheckStateRequest,
142-
_auth_token: Option<AuthToken>,
147+
auth_token: Option<AuthToken>,
143148
) -> Result<CheckStateResponse, Error> {
144-
self.mint.check_state(&request).await
149+
self.mint.check_state(auth_token, &request).await
145150
}
146151

147152
async fn post_restore(
148153
&self,
149154
request: RestoreRequest,
150-
_auth_token: Option<AuthToken>,
155+
auth_token: Option<AuthToken>,
151156
) -> Result<RestoreResponse, Error> {
152-
self.mint.restore(request).await
157+
self.mint.restore(auth_token, request).await
153158
}
154159

155160
/// Get Blind Auth keys
156161
async fn get_mint_blind_auth_keys(&self) -> Result<Vec<KeySet>, Error> {
157-
todo!();
162+
Ok(self.mint.auth_pubkeys().await?.keysets)
158163
}
164+
159165
/// Get Blind Auth Keyset
160-
async fn get_mint_blind_auth_keyset(&self, _keyset_id: Id) -> Result<KeySet, Error> {
161-
todo!();
166+
async fn get_mint_blind_auth_keyset(&self, keyset_id: Id) -> Result<KeySet, Error> {
167+
Ok(self
168+
.mint
169+
.keyset(&keyset_id)
170+
.await?
171+
.ok_or(Error::UnknownKeySet)?)
162172
}
173+
163174
/// Get Blind Auth keysets
164175
async fn get_mint_blind_auth_keysets(&self) -> Result<KeysetResponse, Error> {
165-
todo!();
176+
self.mint.auth_keysets().await
166177
}
178+
167179
/// Post mint blind auth
168180
async fn post_mint_blind_auth(
169181
&self,
170-
_request: MintAuthRequest,
182+
request: MintAuthRequest,
171183
) -> Result<MintBolt11Response, Error> {
172-
todo!();
184+
let cat = self.cat.clone().ok_or(Error::AuthRequired)?;
185+
self.mint.mint_blind_auth(cat, request).await
173186
}
174187
}

crates/cdk-integration-tests/src/init_direct_mint.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::sync::Arc;
44
use cdk::amount::SplitTarget;
55
use cdk::cdk_database::mint_memory::MintMemoryDatabase;
66
use cdk::cdk_database::WalletMemoryDatabase;
7-
use cdk::nuts::{CurrencyUnit, MintInfo, MintQuoteState, Nuts};
7+
use cdk::nuts::{AuthToken, CurrencyUnit, MintInfo, MintQuoteState, Nuts};
88
use cdk::types::QuoteTTL;
99
use cdk::{Amount, Mint, Wallet};
1010
use rand::random;
@@ -60,12 +60,18 @@ pub async fn create_and_start_test_mint() -> anyhow::Result<Arc<Mint>> {
6060
Ok(mint_arc)
6161
}
6262

63-
pub fn get_mint_connector(mint: Arc<Mint>) -> DirectMintConnection {
64-
DirectMintConnection { mint }
63+
pub fn get_mint_connector(cat: Option<String>, mint: Arc<Mint>) -> DirectMintConnection {
64+
DirectMintConnection {
65+
mint,
66+
cat: cat.map(|cat| AuthToken::ClearAuth(cat)),
67+
}
6568
}
6669

67-
pub fn create_test_wallet_for_mint(mint: Arc<Mint>) -> anyhow::Result<Arc<Wallet>> {
68-
let connector = get_mint_connector(mint);
70+
pub fn create_test_wallet_for_mint(
71+
cat: Option<String>,
72+
mint: Arc<Mint>,
73+
) -> anyhow::Result<Arc<Wallet>> {
74+
let connector = get_mint_connector(cat, mint);
6975

7076
let seed = random::<[u8; 32]>();
7177
let mint_url = connector.mint.config.mint_url().to_string();

crates/cdk-integration-tests/tests/pure_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use cdk_integration_tests::init_direct_mint::{
1111
#[tokio::test]
1212
pub async fn test_swap_to_send() -> anyhow::Result<()> {
1313
let mint_bob = create_and_start_test_mint().await?;
14-
let wallet_alice = create_test_wallet_for_mint(mint_bob.clone())?;
14+
let wallet_alice = create_test_wallet_for_mint(None, mint_bob.clone())?;
1515

1616
// Alice gets 64 sats
1717
receive(wallet_alice.clone(), 64).await?;
@@ -33,7 +33,7 @@ pub async fn test_swap_to_send() -> anyhow::Result<()> {
3333
assert_eq!(Amount::from(24), wallet_alice.total_balance().await?);
3434

3535
// Alice sends cashu, Carol receives
36-
let wallet_carol = create_test_wallet_for_mint(mint_bob.clone())?;
36+
let wallet_carol = create_test_wallet_for_mint(None, mint_bob.clone())?;
3737
let received_amount = wallet_carol
3838
.receive_proofs(token.proofs(), SplitTarget::None, &[], &[])
3939
.await?;

crates/cdk/src/mint/check_spendable.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,27 @@ use std::collections::HashSet;
22

33
use tracing::instrument;
44

5-
use super::{CheckStateRequest, CheckStateResponse, Mint, ProofState, PublicKey, State};
5+
use super::{
6+
AuthToken, CheckStateRequest, CheckStateResponse, Method, Mint, ProofState, PublicKey,
7+
RoutePath, State,
8+
};
9+
use crate::nuts::ProtectedEndpoint;
610
use crate::Error;
711

812
impl Mint {
913
/// Check state
1014
#[instrument(skip_all)]
1115
pub async fn check_state(
1216
&self,
17+
auth_token: Option<AuthToken>,
1318
check_state: &CheckStateRequest,
1419
) -> Result<CheckStateResponse, Error> {
20+
self.verify_auth(
21+
auth_token,
22+
&ProtectedEndpoint::new(Method::Get, RoutePath::MintBolt11),
23+
)
24+
.await?;
25+
1526
let states = self.localstore.get_proofs_states(&check_state.ys).await?;
1627

1728
let states = states

crates/cdk/src/mint/mod.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,17 @@ impl Mint {
438438

439439
/// Restore
440440
#[instrument(skip_all)]
441-
pub async fn restore(&self, request: RestoreRequest) -> Result<RestoreResponse, Error> {
441+
pub async fn restore(
442+
&self,
443+
auth_token: Option<AuthToken>,
444+
request: RestoreRequest,
445+
) -> Result<RestoreResponse, Error> {
446+
self.verify_auth(
447+
auth_token,
448+
&ProtectedEndpoint::new(Method::Get, RoutePath::MintBolt11),
449+
)
450+
.await?;
451+
442452
let output_len = request.outputs.len();
443453

444454
let mut outputs = Vec::with_capacity(output_len);

0 commit comments

Comments
 (0)