Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ABW-3465] Decode deep link and download metadata #180

Merged
merged 85 commits into from
Jul 9, 2024
Merged
Changes from 1 commit
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
d3cde8b
HKDF key agreement
GhenadieVP Apr 28, 2024
c30ac72
wip
GhenadieVP Apr 29, 2024
009c20e
wip
GhenadieVP Apr 30, 2024
a81a3b8
wip
GhenadieVP Apr 30, 2024
b2eb4d0
wip
GhenadieVP May 30, 2024
db36c21
wip
danvleju-rdx Jun 6, 2024
8aab5f5
rename to key_agreement
GhenadieVP Jun 7, 2024
7b40d1e
rename keys
GhenadieVP Jun 7, 2024
c1a2216
Add SymmetricKey
GhenadieVP Jun 7, 2024
95e72aa
compare by public key
GhenadieVP Jun 7, 2024
2042513
move hkdf
GhenadieVP Jun 7, 2024
0fbcec0
Fix hkdf ref
GhenadieVP Jun 7, 2024
1b6b418
update link_request
GhenadieVP Jun 8, 2024
eeb44cd
wip
GhenadieVP Jun 10, 2024
ff8b32e
[ABW-3208] Callback_path fetching (#159)
jakub-rdx Jun 10, 2024
4560409
wip
danvleju-rdx Jun 10, 2024
66ee8d8
wip
GhenadieVP Jun 10, 2024
56c7b57
wip
GhenadieVP Jun 11, 2024
ee32831
Merge branch 'main' into rcm_linking
GhenadieVP Jun 11, 2024
e98055d
update parser
GhenadieVP Jun 11, 2024
03a7cea
export
GhenadieVP Jun 11, 2024
645aaa3
wip
danvleju-rdx Jun 11, 2024
3ea7600
wip
danvleju-rdx Jun 11, 2024
11c6ca4
no hkdf for now
GhenadieVP Jun 11, 2024
e1f0bd7
change WalletInteractionId from UUID to String
danvleju-rdx Jun 11, 2024
03c7032
Revert "wip"
danvleju-rdx Jun 11, 2024
1daf79f
Merge branch 'main' into ABW-3230-use-wallet-interaction-models-from-…
danvleju-rdx Jun 11, 2024
c13ea5e
wip
GhenadieVP Jun 11, 2024
ba91c39
wip
GhenadieVP Jun 11, 2024
4d62681
Merge remote-tracking branch 'origin/ABW-3230-use-wallet-interaction-…
GhenadieVP Jun 11, 2024
9e77d70
wip
GhenadieVP Jun 11, 2024
41dcb77
request in deepLink
GhenadieVP Jun 11, 2024
944c2a0
Implement RadixConnectSessionStorage for kotlin (#163)
micbakos-rdx Jun 12, 2024
bd34a56
Expose kotlin serde for RadixConnectMobileLinkRequest (#164)
micbakos-rdx Jun 13, 2024
8842991
request in deepLink URL
GhenadieVP Jun 13, 2024
2774460
Optional request body for `GET` methods (#165)
micbakos-rdx Jun 13, 2024
f99a4df
wip
GhenadieVP Jun 14, 2024
e4a933a
Merge branch 'rcm_linking' of https://github.com/radixdlt/sargon into…
GhenadieVP Jun 14, 2024
696136f
Merge branch 'main' into rcm_linking
GhenadieVP Jun 14, 2024
cdbc6da
wip
GhenadieVP Jun 14, 2024
88b947b
Redo PR #164 since some methods of `RadixConnectMobileLinkRequest` we…
micbakos-rdx Jun 14, 2024
7483c16
Merge branch 'main' into rcm_linking
GhenadieVP Jun 17, 2024
855edf9
wip
GhenadieVP Jun 18, 2024
24f5cd0
signature validation
GhenadieVP Jun 18, 2024
9fde320
wip
GhenadieVP Jun 20, 2024
e18ac17
wip
GhenadieVP Jun 20, 2024
f5c5bcf
wip
GhenadieVP Jun 20, 2024
94132fb
wip
GhenadieVP Jun 20, 2024
6778672
Merge branch 'main' into rcm_linking
GhenadieVP Jun 20, 2024
b7ddec5
hkdf
GhenadieVP Jun 20, 2024
27da157
wip
GhenadieVP Jun 21, 2024
16a2691
update parse_url_into_request test
danvleju-rdx Jun 21, 2024
981a249
tests
danvleju-rdx Jun 21, 2024
e9509a4
tests
danvleju-rdx Jun 21, 2024
5e35944
wip
sergiupuhalschi-rdx Jun 24, 2024
83950f0
Merge branch 'main' into mb/af-dl
matiasbzurovski Jun 26, 2024
f8ca099
WIP
matiasbzurovski Jun 26, 2024
32bf160
WIP
matiasbzurovski Jun 26, 2024
b8fe839
Add tests
matiasbzurovski Jun 26, 2024
32ff810
Updates
matiasbzurovski Jun 27, 2024
9deeede
Merge main
sergiupuhalschi-rdx Jun 28, 2024
ce8c80b
Revert changes after merge
sergiupuhalschi-rdx Jun 29, 2024
74c5315
Add cards manager. Update mod structure
sergiupuhalschi-rdx Jun 29, 2024
f76160e
Rename cards
sergiupuhalschi-rdx Jul 1, 2024
52c59ee
Updates to model and logic
matiasbzurovski Jul 1, 2024
15f727c
Add parser struct
matiasbzurovski Jul 1, 2024
2d13af8
WIP add metadata support
matiasbzurovski Jul 1, 2024
f917270
Logic to fetch metadata
matiasbzurovski Jul 1, 2024
4f944a3
Merge branch 'main' into mb/deferred-parsing
matiasbzurovski Jul 2, 2024
b572e9e
Bump
matiasbzurovski Jul 2, 2024
5c99851
Lint
matiasbzurovski Jul 2, 2024
dcf9795
Remove connector card from parser
matiasbzurovski Jul 2, 2024
23871a1
Implement home cards manager
sergiupuhalschi-rdx Jul 2, 2024
3c114a7
Implement home cards ordering
sergiupuhalschi-rdx Jul 3, 2024
2272670
Add home cards manager init for new wallet function
sergiupuhalschi-rdx Jul 3, 2024
ab3570f
Changes after feedback
matiasbzurovski Jul 3, 2024
2f8a090
Rename exposed functions
sergiupuhalschi-rdx Jul 4, 2024
7b025ea
changes after feedback
matiasbzurovski Jul 4, 2024
e187b29
Expose home cards manager in kt
sergiupuhalschi-rdx Jul 4, 2024
a3479e8
Version bump
sergiupuhalschi-rdx Jul 4, 2024
2d50937
Replace StartRadQuest card after resolving DL if needed. Update defau…
sergiupuhalschi-rdx Jul 8, 2024
0527ee2
Update API
sergiupuhalschi-rdx Jul 8, 2024
4af5f0e
Address PR comment
sergiupuhalschi-rdx Jul 9, 2024
9021fdc
Version bump
sergiupuhalschi-rdx Jul 9, 2024
c54e8b2
Merge branch 'main' into mb/deferred-parsing
sergiupuhalschi-rdx Jul 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 75 additions & 39 deletions src/wallet/home_cards/manager.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use crate::prelude::*;
use std::{
borrow::Borrow,
sync::{RwLock, RwLockWriteGuard},
};
use std::sync::{RwLock, RwLockWriteGuard};

/// Manages the home cards by handling storage, parsing, and updating operations.
/// Call `bootstrap` before invoking any other public functions.
#[derive(uniffi::Object)]
pub struct HomeCardsManager {
/// Parser for handling deferred deep links.
Expand Down Expand Up @@ -55,18 +53,20 @@
#[uniffi::export]
impl HomeCardsManager {
/// Initializes `HomeCards` by loading from storage.
/// This function should be called before invoking any other public functions.
/// Notifies `HomeCardsObserver`.
#[uniffi::method]
pub async fn wallet_started(&self) -> Result<()> {
pub async fn bootstrap(&self) -> Result<()> {
let stored_cars = self.load_cards().await?;
self.update_cards(|write_guard| {
self.insert_cards(write_guard, stored_cars)
Self::insert_cards(write_guard, stored_cars)
})
.await?;

Check warning on line 64 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L64

Added line #L64 was not covered by tests
Ok(())
}

/// Initializes and saves to storage default `HomeCards`.
/// Marks the wallet creation and populates the set of cards required for a new wallet.
/// Notifies `HomeCardsObserver`.
pub async fn wallet_created(&self) -> Result<()> {
let default_cards = HomeCards::from_iter([
Expand All @@ -76,42 +76,26 @@
]);
let updated_cards = self
.update_cards(|write_guard| {
self.insert_cards(write_guard, default_cards)
Self::insert_cards(write_guard, default_cards.clone())
})
.await?;

Check warning on line 81 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L81

Added line #L81 was not covered by tests
self.save_cards(updated_cards).await
}

/// Handles a deferred deep link by parsing it and saving the generated `HomeCards` to `HomeCardsStorage`.
/// `HomeCard::ContinueRadQuest` if found in the link parsing result, replaces `HomeCard::StartRadQuest` if it's stored.
/// `HomeCard::ContinueRadQuest` if found in the link parsing result, replaces `HomeCard::StartRadQuest`.
/// Notifies `HomeCardsObserver`.
#[uniffi::method]
pub async fn deep_link_received(
pub async fn deferred_deep_link_received(
&self,
encoded_value: String,
) -> Result<()> {
let deep_link_cards = self.parser.parse(encoded_value).await?;
let stored_cards = self.load_cards().await?;
let updated_cards = self
.update_cards(|write_guard| {
let mut new_cards = stored_cards.clone();
let card_to_remove = &HomeCard::StartRadQuest;
if stored_cards.contains_id(card_to_remove)
&& deep_link_cards.contains_id(&HomeCard::ContinueRadQuest)
{
new_cards.remove_id(card_to_remove);
write_guard.remove_id(card_to_remove);
}
deep_link_cards.into_iter().for_each(|card| {
if new_cards.try_insert_unique(card).is_ok() {
debug!("Home card inserted");
} else {
debug!("Home card insert failed");
}
});
self.insert_cards(write_guard, new_cards)
Self::insert_cards(write_guard, deep_link_cards)
})
.await?;

Check warning on line 98 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L98

Added line #L98 was not covered by tests
self.save_cards(updated_cards).await
}

Expand All @@ -123,13 +107,13 @@
.update_cards(|write_guard| {
write_guard.remove_id(&card);
})
.await?;

Check warning on line 110 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L110

Added line #L110 was not covered by tests
self.save_cards(updated_cards).await
}
}

impl HomeCardsManager {
/// Updates home cards both in-memory and in storage after applying `f` function, then notifies the observer.
/// Updates in-memory home cards after applying `f` function, then notifies the observer.
async fn update_cards<F>(&self, f: F) -> Result<HomeCards>
where
F: FnOnce(&mut RwLockWriteGuard<HomeCards>),
Expand All @@ -139,27 +123,47 @@
.write()
.map_err(|_| CommonError::FailedUpdatingHomeCards)?;

f(&mut write_guard);

Check warning on line 126 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L126

Added line #L126 was not covered by tests

let updated_cards = write_guard.clone();
updated_cards.sort();

Check warning on line 129 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L128-L129

Added lines #L128 - L129 were not covered by tests

self.observer.handle_cards_update(updated_cards.clone());
Ok(updated_cards)

Check warning on line 132 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L131-L132

Added lines #L131 - L132 were not covered by tests
}

fn insert_cards(
&self,
write_guard: &mut RwLockWriteGuard<HomeCards>,
cards: HomeCards,
) {
cards.into_iter().for_each(|card| {
println!("Cards to insert before: {:?}", write_guard.clone());

let cards_to_insert = if write_guard
.contains_id(&HomeCard::StartRadQuest)
&& cards.contains_id(&HomeCard::ContinueRadQuest)
{
write_guard.remove_id(&HomeCard::StartRadQuest);
cards
} else if write_guard.contains_id(&HomeCard::ContinueRadQuest)
&& cards.contains_id(&HomeCard::StartRadQuest)
{
let mut updated_cards = cards.clone();
updated_cards.remove_id(&HomeCard::StartRadQuest);
updated_cards

Check warning on line 152 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L150-L152

Added lines #L150 - L152 were not covered by tests
} else {
cards
};
println!("Cards to insert after: {:?}", write_guard.clone());

cards_to_insert.into_iter().for_each(|card| {
if write_guard.try_insert_unique(card).is_ok() {
debug!("Home card inserted");
} else {
debug!("Home card insert failed");
}
})
});
GhenadieVP marked this conversation as resolved.
Show resolved Hide resolved

println!("Updated cards: {:?}", write_guard.clone());
}
}

Expand All @@ -179,7 +183,7 @@
let bytes = serialize(&cards)?;
self.cards_storage
.save_cards(bytes.into())
.await

Check warning on line 186 in src/wallet/home_cards/manager.rs

View check run for this annotation

Codecov / codecov/patch

src/wallet/home_cards/manager.rs#L186

Added line #L186 was not covered by tests
.map_err(|_| CommonError::FailedSavingHomeCards)
}
}
Expand Down Expand Up @@ -286,7 +290,7 @@
type SUT = HomeCardsManager;

#[actix_rt::test]
async fn test_wallet_started_with_stored_cards() {
async fn test_bootstrap_with_stored_cards() {
let expected_cards = HomeCards::from_iter(vec![HomeCard::Connector]);
let observer = Arc::new(MockHomeCardsObserver::new());
let manager = SUT::new(
Expand All @@ -298,14 +302,14 @@
observer.clone(),
);

manager.wallet_started().await.unwrap();
manager.bootstrap().await.unwrap();
let handled_cards = observer.handled_cards.lock().unwrap().clone();

pretty_assertions::assert_eq!(handled_cards, Some(expected_cards));
}

#[actix_rt::test]
async fn test_wallet_started_failing() {
async fn test_bootstrap_failing() {
let observer = Arc::new(MockHomeCardsObserver::new());
let manager = SUT::new(
Arc::new(MockAntenna::new_always_failing()),
Expand All @@ -314,7 +318,7 @@
observer.clone(),
);

let result = manager.wallet_started().await.unwrap_err();
let result = manager.bootstrap().await.unwrap_err();
assert_eq!(result, CommonError::HomeCardsNotFound);
}

Expand Down Expand Up @@ -376,7 +380,37 @@
}

#[actix_rt::test]
async fn test_deep_link_received() {
async fn test_wallet_created_after_deferred_deep_link_received() {
let deep_link_cards = HomeCards::from_iter(vec![
HomeCard::Dapp { icon_url: None },
HomeCard::ContinueRadQuest,
]);
let observer = Arc::new(MockHomeCardsObserver::new());
let manager = SUT::init(
Arc::new(MockDeferredDeepLinkParser::succeeding(
deep_link_cards.clone(),
)),
Arc::new(MockHomeCardsStorage::new_empty()),
observer.clone(),
);

manager
.deferred_deep_link_received("encoded_value".to_string())
.await
.unwrap();
manager.wallet_created().await.unwrap();

let expected_cards = HomeCards::from_iter(vec![
HomeCard::Dapp { icon_url: None },
HomeCard::ContinueRadQuest,
HomeCard::Connector,
]);
let handled_cards = observer.handled_cards.lock().unwrap().clone();
pretty_assertions::assert_eq!(handled_cards, Some(expected_cards));
}

#[actix_rt::test]
async fn test_deferred_deep_link_received() {
let observer = Arc::new(MockHomeCardsObserver::new());
let stored_cards = HomeCards::from_iter(vec![
HomeCard::Connector,
Expand All @@ -396,11 +430,13 @@
observer.clone(),
);

manager.wallet_started().await.unwrap();
manager.bootstrap().await.unwrap();
manager
.deep_link_received("encoded_value".to_string())
.deferred_deep_link_received("encoded_value".to_string())
.await
.unwrap();
// Covers the case where `HomeCard::StartRadQuest` shouldn't replace the already existing `HomeCard::ContinueRadQuest`
manager.wallet_created().await.unwrap();

let expected_cards = HomeCards::from_iter(vec![
HomeCard::ContinueRadQuest,
Expand All @@ -424,7 +460,7 @@
observer.clone(),
);

manager.wallet_started().await.unwrap();
manager.bootstrap().await.unwrap();
manager.card_dismissed(HomeCard::Connector).await.unwrap();

let handled_cards = observer.handled_cards.lock().unwrap().clone();
Expand All @@ -444,7 +480,7 @@
observer.clone(),
);

manager.wallet_started().await.unwrap();
manager.bootstrap().await.unwrap();
manager
.card_dismissed(HomeCard::StartRadQuest)
.await
Expand Down
Loading