From 2dcd30b4787be90c5754b8698f01765bb46961b1 Mon Sep 17 00:00:00 2001 From: Terry Mancey Date: Tue, 14 Jan 2020 02:15:47 +0000 Subject: [PATCH 1/2] Refactored OnGetTransactionHistory to OnGetTransactionHistoryCallback --- .../include/bat/confirmations/confirmations.h | 4 ++-- .../src/bat/confirmations/internal/confirmations_impl.cc | 2 +- .../src/bat/confirmations/internal/confirmations_impl.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h b/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h index 5e10507cef7e..a71575cec3ae 100644 --- a/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h +++ b/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h @@ -24,7 +24,7 @@ namespace confirmations { using TransactionInfo = ::ledger::TransactionInfo; using TransactionsInfo = ::ledger::TransactionsInfo; -using OnGetTransactionHistory = ::ledger::GetTransactionHistoryCallback; +using OnGetTransactionHistoryCallback = ::ledger::GetTransactionHistoryCallback; // |_environment| indicates that URL requests should use production, staging or // development servers but can be overridden via command-line arguments @@ -63,7 +63,7 @@ class CONFIRMATIONS_EXPORT Confirmations { // argument — |TransactionsInfo| which contains a list of |TransactionInfo| // transactions and associated earned ads rewards virtual void GetTransactionHistory( - OnGetTransactionHistory callback) = 0; + OnGetTransactionHistoryCallback callback) = 0; // Should be called to confirm an ad was viewed, clicked, dismissed or landed virtual void ConfirmAd( diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc index 3065ee7f1419..75644533bbd5 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc @@ -887,7 +887,7 @@ void ConfirmationsImpl::UpdateAdsRewards( } void ConfirmationsImpl::GetTransactionHistory( - OnGetTransactionHistory callback) { + OnGetTransactionHistoryCallback callback) { auto unredeemed_transactions = GetUnredeemedTransactions(); double unredeemed_estimated_pending_rewards = GetEstimatedPendingRewardsForTransactions(unredeemed_transactions); diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h index eb855df2ddd1..84aea531a961 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h @@ -57,7 +57,7 @@ class ConfirmationsImpl : public Confirmations { // Transaction history void GetTransactionHistory( - OnGetTransactionHistory callback) override; + OnGetTransactionHistoryCallback callback) override; void AddUnredeemedTransactionsToPendingRewards(); void AddTransactionsToPendingRewards( const std::vector& transactions); From 268cb47677817e6e117cd6301c02ab6678c1103d Mon Sep 17 00:00:00 2001 From: Terry Mancey Date: Tue, 14 Jan 2020 02:18:52 +0000 Subject: [PATCH 2/2] Fixes intermittent crash if Confirmations library is called before being instantiated --- .../include/bat/confirmations/confirmations.h | 8 +- .../include/bat/confirmations/wallet_info.h | 2 +- ...ns_create_confirmation_request_unittest.cc | 10 +- ...ns_fetch_payment_token_request_unittest.cc | 10 +- ...ions_get_signed_tokens_request_unittest.cc | 10 +- .../internal/confirmations_impl.cc | 170 ++++++++++++++++-- .../internal/confirmations_impl.h | 4 +- ..._redeem_payment_tokens_request_unittest.cc | 10 +- ..._request_signed_tokens_request_unittest.cc | 10 +- .../confirmations_security_helper_unittest.cc | 10 +- .../confirmations_string_helper_unittest.cc | 10 +- ...confirmations_unblinded_tokens_unittest.cc | 10 +- .../src/bat/confirmations/wallet_info.cc | 2 +- .../src/bat/ledger/internal/ledger_impl.cc | 63 +++++-- .../src/bat/ledger/internal/ledger_impl.h | 7 + 15 files changed, 292 insertions(+), 44 deletions(-) diff --git a/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h b/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h index a71575cec3ae..a694cbc3f6f6 100644 --- a/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h +++ b/vendor/bat-native-confirmations/include/bat/confirmations/confirmations.h @@ -25,6 +25,7 @@ using TransactionInfo = ::ledger::TransactionInfo; using TransactionsInfo = ::ledger::TransactionsInfo; using OnGetTransactionHistoryCallback = ::ledger::GetTransactionHistoryCallback; +using OnInitializeCallback = std::function; // |_environment| indicates that URL requests should use production, staging or // development servers but can be overridden via command-line arguments @@ -46,8 +47,11 @@ class CONFIRMATIONS_EXPORT Confirmations { static Confirmations* CreateInstance( ConfirmationsClient* confirmations_client); - // Should be called from Ledger to initialize Confirmations - virtual void Initialize() = 0; + // Should be called from Ledger to initialize Confirmations. The callback + // takes one argument - |true| if Confirmations was successfully initialized; + // otherwise |false| + virtual void Initialize( + OnInitializeCallback callback) = 0; // Should be called when the wallet |payment_id| and |private_key| are set in // the Ledger library, e.g. initializing a wallet, creating a new wallet or diff --git a/vendor/bat-native-confirmations/include/bat/confirmations/wallet_info.h b/vendor/bat-native-confirmations/include/bat/confirmations/wallet_info.h index f633ae246127..987c4e5286f7 100644 --- a/vendor/bat-native-confirmations/include/bat/confirmations/wallet_info.h +++ b/vendor/bat-native-confirmations/include/bat/confirmations/wallet_info.h @@ -17,7 +17,7 @@ struct CONFIRMATIONS_EXPORT WalletInfo { WalletInfo(const WalletInfo& info); ~WalletInfo(); - bool IsValid(); + bool IsValid() const; bool operator==(const WalletInfo& info) const; diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_create_confirmation_request_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_create_confirmation_request_unittest.cc index b89985bde367..38019f3c286c 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_create_confirmation_request_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_create_confirmation_request_unittest.cc @@ -17,6 +17,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsCreateConfirmationRequestTest : public ::testing::Test { @@ -44,7 +46,13 @@ class ConfirmationsCreateConfirmationRequestTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsCreateConfirmationRequestTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_fetch_payment_token_request_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_fetch_payment_token_request_unittest.cc index 71419fc7fe51..c72b85453b92 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_fetch_payment_token_request_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_fetch_payment_token_request_unittest.cc @@ -14,6 +14,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsFetchPaymentTokenRequestTest : public ::testing::Test { @@ -41,7 +43,13 @@ class ConfirmationsFetchPaymentTokenRequestTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsFetchPaymentTokenRequestTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_get_signed_tokens_request_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_get_signed_tokens_request_unittest.cc index bc73e903b923..2f77a745fbae 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_get_signed_tokens_request_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_get_signed_tokens_request_unittest.cc @@ -16,6 +16,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsGetSignedTokensRequestTest : public ::testing::Test { @@ -43,7 +45,13 @@ class ConfirmationsGetSignedTokensRequestTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsGetSignedTokensRequestTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc index 75644533bbd5..32d62de8174d 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.cc @@ -56,12 +56,16 @@ ConfirmationsImpl::~ConfirmationsImpl() { StopPayingOutRedeemedTokens(); } -void ConfirmationsImpl::Initialize() { +void ConfirmationsImpl::Initialize( + OnInitializeCallback callback) { BLOG(INFO) << "Initializing confirmations"; + initialize_callback_ = callback; + if (is_initialized_) { BLOG(INFO) << "Already initialized confirmations"; + initialize_callback_(false); return; } @@ -69,8 +73,9 @@ void ConfirmationsImpl::Initialize() { } void ConfirmationsImpl::MaybeStart() { + DCHECK(state_has_loaded_); + if (is_initialized_ || - !state_has_loaded_ || !wallet_info_.IsValid() || catalog_issuers_.empty()) { return; @@ -88,11 +93,15 @@ void ConfirmationsImpl::MaybeStart() { } void ConfirmationsImpl::NotifyAdsIfConfirmationsIsReady() { + DCHECK(state_has_loaded_); + bool is_ready = unblinded_tokens_->IsEmpty() ? false : true; confirmations_client_->SetConfirmationsIsReady(is_ready); } std::string ConfirmationsImpl::ToJSON() const { + DCHECK(state_has_loaded_); + base::Value dictionary(base::Value::Type::DICTIONARY); // Catalog issuers @@ -234,6 +243,8 @@ base::Value ConfirmationsImpl::GetTransactionHistoryAsDictionary( } bool ConfirmationsImpl::FromJSON(const std::string& json) { + DCHECK(state_has_loaded_); + base::Optional value = base::JSONReader::Read(json); if (!value || !value->is_dict()) { BLOG(ERROR) << "Failed to parse JSON: " << json; @@ -283,6 +294,9 @@ bool ConfirmationsImpl::FromJSON(const std::string& json) { bool ConfirmationsImpl::ParseCatalogIssuersFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* catalog_issuers_value = dictionary->FindKey("catalog_issuers"); if (!catalog_issuers_value) { @@ -312,8 +326,19 @@ bool ConfirmationsImpl::GetCatalogIssuersFromDictionary( std::string* public_key, std::map* issuers) const { DCHECK(dictionary); + if (!dictionary) { + return false; + } + DCHECK(public_key); + if (!public_key) { + return false; + } + DCHECK(issuers); + if (!issuers) { + return false; + } // Public key auto* public_key_value = dictionary->FindKey("public_key"); @@ -359,6 +384,9 @@ bool ConfirmationsImpl::GetCatalogIssuersFromDictionary( bool ConfirmationsImpl::ParseNextTokenRedemptionDateInSecondsFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* next_token_redemption_date_in_seconds_value = dictionary->FindKey("next_token_redemption_date_in_seconds"); @@ -378,6 +406,9 @@ bool ConfirmationsImpl::ParseNextTokenRedemptionDateInSecondsFromJSON( bool ConfirmationsImpl::ParseConfirmationsFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* confirmations_value = dictionary->FindKey("confirmations"); if (!confirmations_value) { @@ -405,7 +436,14 @@ bool ConfirmationsImpl::GetConfirmationsFromDictionary( base::DictionaryValue* dictionary, std::vector* confirmations) { DCHECK(dictionary); + if (!dictionary) { + return false; + } + DCHECK(confirmations); + if (!confirmations) { + return false; + } // Confirmations auto* confirmations_value = dictionary->FindKey("failed_confirmations"); @@ -562,6 +600,9 @@ bool ConfirmationsImpl::GetConfirmationsFromDictionary( bool ConfirmationsImpl::ParseTransactionHistoryFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* transaction_history_value = dictionary->FindKey("transaction_history"); if (!transaction_history_value) { @@ -589,7 +630,14 @@ bool ConfirmationsImpl::GetTransactionHistoryFromDictionary( base::DictionaryValue* dictionary, std::vector* transaction_history) { DCHECK(dictionary); + if (!dictionary) { + return false; + } + DCHECK(transaction_history); + if (!transaction_history) { + return false; + } // Transaction auto* transactions_value = dictionary->FindKey("transactions"); @@ -654,6 +702,9 @@ bool ConfirmationsImpl::GetTransactionHistoryFromDictionary( bool ConfirmationsImpl::ParseUnblindedTokensFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* unblinded_tokens_value = dictionary->FindKey("unblinded_tokens"); if (!unblinded_tokens_value) { @@ -670,6 +721,9 @@ bool ConfirmationsImpl::ParseUnblindedTokensFromJSON( bool ConfirmationsImpl::ParseUnblindedPaymentTokensFromJSON( base::DictionaryValue* dictionary) { DCHECK(dictionary); + if (!dictionary) { + return false; + } auto* unblinded_payment_tokens_value = dictionary->FindKey("unblinded_payment_tokens"); @@ -687,9 +741,12 @@ bool ConfirmationsImpl::ParseUnblindedPaymentTokensFromJSON( } void ConfirmationsImpl::SaveState() { - BLOG(INFO) << "Saving confirmations state"; + if (!state_has_loaded_) { + NOTREACHED(); + return; + } - DCHECK(state_has_loaded_); + BLOG(INFO) << "Saving confirmations state"; std::string json = ToJSON(); auto callback = std::bind(&ConfirmationsImpl::OnStateSaved, this, _1); @@ -727,27 +784,29 @@ void ConfirmationsImpl::OnStateLoaded( << " values"; confirmations_json = ToJSON(); + } else { + BLOG(INFO) << "Successfully loaded confirmations state"; } if (!FromJSON(confirmations_json)) { + state_has_loaded_ = false; + BLOG(ERROR) << "Failed to parse confirmations state: " << confirmations_json; confirmations_client_->ConfirmationsTransactionHistoryDidChange(); + initialize_callback_(false); + return; } - BLOG(INFO) << "Successfully loaded confirmations state"; - - confirmations_client_->ConfirmationsTransactionHistoryDidChange(); - - NotifyAdsIfConfirmationsIsReady(); - - MaybeStart(); + initialize_callback_(true); } void ConfirmationsImpl::ResetState() { + DCHECK(state_has_loaded_); + BLOG(INFO) << "Resetting confirmations to default state"; auto callback = std::bind(&ConfirmationsImpl::OnStateReset, this, _1); @@ -765,7 +824,14 @@ void ConfirmationsImpl::OnStateReset(const Result result) { } void ConfirmationsImpl::SetWalletInfo(std::unique_ptr info) { + if (!state_has_loaded_) { + return; + } + if (!info->IsValid()) { + BLOG(ERROR) << "SetWalletInfo (Invalid wallet):"; + BLOG(ERROR) << " Payment id: " << info->payment_id; + BLOG(ERROR) << " Private key: " << info->private_key; return; } @@ -787,6 +853,13 @@ void ConfirmationsImpl::SetWalletInfo(std::unique_ptr info) { } void ConfirmationsImpl::SetCatalogIssuers(std::unique_ptr info) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << + "Unable to set catalog issuers as Confirmations state is not ready"; + return; + } + BLOG(INFO) << "SetCatalogIssuers:"; BLOG(INFO) << " Public key: " << info->public_key; BLOG(INFO) << " Issuers:"; @@ -810,11 +883,15 @@ void ConfirmationsImpl::SetCatalogIssuers(std::unique_ptr info) { std::map ConfirmationsImpl::GetCatalogIssuers() const { + DCHECK(state_has_loaded_); + return catalog_issuers_; } bool ConfirmationsImpl::IsValidPublicKeyForCatalogIssuers( const std::string& public_key) const { + DCHECK(state_has_loaded_); + auto it = catalog_issuers_.find(public_key); if (it == catalog_issuers_.end()) { return false; @@ -825,6 +902,8 @@ bool ConfirmationsImpl::IsValidPublicKeyForCatalogIssuers( void ConfirmationsImpl::AppendConfirmationToQueue( const ConfirmationInfo& confirmation_info) { + DCHECK(state_has_loaded_); + confirmations_.push_back(confirmation_info); SaveState(); @@ -841,6 +920,8 @@ void ConfirmationsImpl::AppendConfirmationToQueue( void ConfirmationsImpl::RemoveConfirmationFromQueue( const ConfirmationInfo& confirmation_info) { + DCHECK(state_has_loaded_); + auto it = std::find_if(confirmations_.begin(), confirmations_.end(), [=](const ConfirmationInfo& info) { return (info.id == confirmation_info.id); @@ -866,17 +947,21 @@ void ConfirmationsImpl::RemoveConfirmationFromQueue( } void ConfirmationsImpl::UpdateAdsRewards(const bool should_refresh) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << + "Unable to update ads rewards as Confirmations state is not ready"; + } + + DCHECK(wallet_info_.IsValid()); + ads_rewards_->Update(wallet_info_, should_refresh); } void ConfirmationsImpl::UpdateAdsRewards( const double estimated_pending_rewards, const uint64_t next_payment_date_in_seconds) { - if (!state_has_loaded_) { - // We should not update ads rewards until state has successfully loaded - // otherwise our values will be overwritten - return; - } + DCHECK(state_has_loaded_); estimated_pending_rewards_ = estimated_pending_rewards; next_payment_date_in_seconds_ = next_payment_date_in_seconds; @@ -888,6 +973,13 @@ void ConfirmationsImpl::UpdateAdsRewards( void ConfirmationsImpl::GetTransactionHistory( OnGetTransactionHistoryCallback callback) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << + "Unable to get transaction history as Confirmations state is not ready"; + return; + } + auto unredeemed_transactions = GetUnredeemedTransactions(); double unredeemed_estimated_pending_rewards = GetEstimatedPendingRewardsForTransactions(unredeemed_transactions); @@ -969,6 +1061,8 @@ uint64_t ConfirmationsImpl::GetAdNotificationsReceivedThisMonthForTransactions( std::vector ConfirmationsImpl::GetTransactionHistory( const uint64_t from_timestamp_in_seconds, const uint64_t to_timestamp_in_seconds) { + DCHECK(state_has_loaded_); + std::vector transactions(transaction_history_.size()); auto it = std::copy_if(transaction_history_.begin(), @@ -984,10 +1078,14 @@ std::vector ConfirmationsImpl::GetTransactionHistory( } std::vector ConfirmationsImpl::GetTransactions() const { + DCHECK(state_has_loaded_); + return transaction_history_; } std::vector ConfirmationsImpl::GetUnredeemedTransactions() { + DCHECK(state_has_loaded_); + auto count = unblinded_payment_tokens_->Count(); if (count == 0) { // There are no outstanding unblinded payment tokens to redeem @@ -1003,6 +1101,8 @@ std::vector ConfirmationsImpl::GetUnredeemedTransactions() { double ConfirmationsImpl::GetEstimatedRedemptionValue( const std::string& public_key) const { + DCHECK(state_has_loaded_); + double estimated_redemption_value = 0.0; auto it = catalog_issuers_.find(public_key); @@ -1022,6 +1122,8 @@ double ConfirmationsImpl::GetEstimatedRedemptionValue( void ConfirmationsImpl::AppendTransactionToHistory( const double estimated_redemption_value, const ConfirmationType confirmation_type) { + DCHECK(state_has_loaded_); + TransactionInfo info; info.timestamp_in_seconds = Time::NowInSeconds(); info.estimated_redemption_value = estimated_redemption_value; @@ -1035,6 +1137,12 @@ void ConfirmationsImpl::AppendTransactionToHistory( } void ConfirmationsImpl::ConfirmAd(std::unique_ptr info) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << "Unable to confirm ad as Confirmations state is not ready"; + return; + } + BLOG(INFO) << "Confirm ad:" << std::endl << " id: " << info->id << std::endl << " creative_set_id: " << info->creative_set_id @@ -1052,6 +1160,13 @@ void ConfirmationsImpl::ConfirmAction( const std::string& uuid, const std::string& creative_set_id, const ConfirmationType& type) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << + "Unable to confirm action as Confirmations state is not ready"; + return; + } + BLOG(INFO) << "Confirm action:" << std::endl << " creative_set_id: " << creative_set_id << std::endl << " uuid: " << uuid @@ -1061,6 +1176,17 @@ void ConfirmationsImpl::ConfirmAction( } bool ConfirmationsImpl::OnTimer(const uint32_t timer_id) { + DCHECK(state_has_loaded_); + if (!state_has_loaded_) { + BLOG(ERROR) << + "Unable to trigger event as Confirmations state is not ready"; + return false; + } + + if (!is_initialized_) { + return false; + } + BLOG(INFO) << "OnTimer:" << std::endl << " timer_id: " << timer_id << std::endl @@ -1084,10 +1210,14 @@ bool ConfirmationsImpl::OnTimer(const uint32_t timer_id) { } void ConfirmationsImpl::RefillTokensIfNecessary() const { + DCHECK(wallet_info_.IsValid()); + refill_tokens_->Refill(wallet_info_, public_key_); } uint64_t ConfirmationsImpl::CalculateTokenRedemptionTimeInSeconds() { + DCHECK(state_has_loaded_); + if (next_token_redemption_date_in_seconds_ == 0) { UpdateNextTokenRedemptionDate(); } @@ -1109,10 +1239,14 @@ uint64_t ConfirmationsImpl::CalculateTokenRedemptionTimeInSeconds() { } uint64_t ConfirmationsImpl::GetNextTokenRedemptionDateInSeconds() { + DCHECK(state_has_loaded_); + return next_token_redemption_date_in_seconds_; } void ConfirmationsImpl::UpdateNextTokenRedemptionDate() { + DCHECK(state_has_loaded_); + next_token_redemption_date_in_seconds_ = Time::NowInSeconds(); if (!_is_debug) { @@ -1151,6 +1285,8 @@ void ConfirmationsImpl::StartRetryingFailedConfirmations( } void ConfirmationsImpl::RetryFailedConfirmations() { + DCHECK(state_has_loaded_); + StopRetryingFailedConfirmations(); if (confirmations_.size() == 0) { @@ -1202,6 +1338,8 @@ void ConfirmationsImpl::StartPayingOutRedeemedTokens( } void ConfirmationsImpl::PayoutRedeemedTokens() const { + DCHECK(wallet_info_.IsValid()); + payout_tokens_->Payout(wallet_info_); } diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h index 84aea531a961..92252eeddc3f 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_impl.h @@ -33,7 +33,7 @@ class ConfirmationsImpl : public Confirmations { explicit ConfirmationsImpl(ConfirmationsClient* confirmations_client); ~ConfirmationsImpl() override; - void Initialize() override; + void Initialize(OnInitializeCallback callback) override; // Wallet void SetWalletInfo(std::unique_ptr info) override; @@ -98,6 +98,8 @@ class ConfirmationsImpl : public Confirmations { private: bool is_initialized_; + OnInitializeCallback initialize_callback_; + void MaybeStart(); // Wallet diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_redeem_payment_tokens_request_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_redeem_payment_tokens_request_unittest.cc index 60972bc9d9ef..f825f22325fd 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_redeem_payment_tokens_request_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_redeem_payment_tokens_request_unittest.cc @@ -25,6 +25,8 @@ using ::testing::_; using ::testing::Invoke; +using std::placeholders::_1; + namespace confirmations { class ConfirmationsRedeemPaymentTokensRequestTest : public ::testing::Test { @@ -82,7 +84,13 @@ class ConfirmationsRedeemPaymentTokensRequestTest : public ::testing::Test { callback(SUCCESS); })); - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsRedeemPaymentTokensRequestTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_request_signed_tokens_request_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_request_signed_tokens_request_unittest.cc index d156d038c752..a86987f3310e 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_request_signed_tokens_request_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_request_signed_tokens_request_unittest.cc @@ -18,6 +18,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsRequestSignedTokensRequestTest : public ::testing::Test { @@ -45,7 +47,13 @@ class ConfirmationsRequestSignedTokensRequestTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsRequestSignedTokensRequestTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_security_helper_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_security_helper_unittest.cc index 0d12671f4e88..1922e188f207 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_security_helper_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_security_helper_unittest.cc @@ -16,6 +16,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsSecurityHelperTest : public ::testing::Test { @@ -40,7 +42,13 @@ class ConfirmationsSecurityHelperTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsSecurityHelperTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_string_helper_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_string_helper_unittest.cc index 8c9e34fd852b..d7420f0e53e4 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_string_helper_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_string_helper_unittest.cc @@ -15,6 +15,8 @@ // npm run test -- brave_unit_tests --filter=Confirmations* +using std::placeholders::_1; + namespace confirmations { class ConfirmationsStringHelperTest : public ::testing::Test { @@ -39,7 +41,13 @@ class ConfirmationsStringHelperTest : public ::testing::Test { void SetUp() override { // Code here will be called immediately after the constructor (right before // each test) - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsStringHelperTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_unblinded_tokens_unittest.cc b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_unblinded_tokens_unittest.cc index 9f12292c6d5b..9fd4d237205b 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_unblinded_tokens_unittest.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_unblinded_tokens_unittest.cc @@ -23,6 +23,8 @@ using ::testing::_; using ::testing::Invoke; +using std::placeholders::_1; + namespace confirmations { class ConfirmationsUnblindedTokensTest : public ::testing::Test { @@ -77,7 +79,13 @@ class ConfirmationsUnblindedTokensTest : public ::testing::Test { callback(SUCCESS); })); - confirmations_->Initialize(); + auto callback = std::bind( + &ConfirmationsUnblindedTokensTest::OnInitialize, this, _1); + confirmations_->Initialize(callback); + } + + void OnInitialize(const bool success) { + EXPECT_EQ(true, success); } void TearDown() override { diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/wallet_info.cc b/vendor/bat-native-confirmations/src/bat/confirmations/wallet_info.cc index 09952a45d551..8ddc1cae6d21 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/wallet_info.cc +++ b/vendor/bat-native-confirmations/src/bat/confirmations/wallet_info.cc @@ -17,7 +17,7 @@ WalletInfo::WalletInfo(const WalletInfo& info) : WalletInfo::~WalletInfo() = default; -bool WalletInfo::IsValid() { +bool WalletInfo::IsValid() const { return !payment_id.empty() && !private_key.empty(); } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc index 6225e4ee0784..a9af03171832 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc @@ -98,14 +98,51 @@ void LedgerImpl::OnWalletInitializedInternal( bat_promotion_->Refresh(false); bat_contribution_->Initialize(); bat_promotion_->Initialize(); + + // Set wallet info for Confirmations when launching the browser or creating + // a wallet for the first time + auto wallet_info = bat_state_->GetWalletInfo(); + SetConfirmationsWalletInfo(wallet_info); } else { BLOG(this, ledger::LogLevel::LOG_ERROR) << "Failed to initialize wallet"; } } -void LedgerImpl::Initialize(ledger::InitializeCallback callback) { +void LedgerImpl::Initialize( + ledger::InitializeCallback callback) { DCHECK(!initializing_); + if (initializing_) { + BLOG(this, ledger::LogLevel::LOG_ERROR) << + "Already initializing ledger"; + return; + } + initializing_ = true; + + InitializeConfirmations(callback); +} + +void LedgerImpl::InitializeConfirmations( + ledger::InitializeCallback callback) { + confirmations::_environment = ledger::_environment; + confirmations::_is_debug = ledger::is_debug; + + bat_confirmations_.reset( + confirmations::Confirmations::CreateInstance(ledger_client_)); + + auto initialized_callback = std::bind(&LedgerImpl::OnConfirmationsInitialized, + this, _1, callback); + bat_confirmations_->Initialize(initialized_callback); +} + +void LedgerImpl::OnConfirmationsInitialized( + const bool success, + ledger::InitializeCallback callback) { + if (!success) { + BLOG(this, ledger::LogLevel::LOG_ERROR) << + "Failed to initialize confirmations"; + } + ledger::InitializeCallback on_wallet = std::bind(&LedgerImpl::OnWalletInitializedInternal, this, @@ -302,7 +339,6 @@ void LedgerImpl::OnLedgerStateLoaded( callback(ledger::Result::INVALID_LEDGER_STATE); } else { auto wallet_info = bat_state_->GetWalletInfo(); - SetConfirmationsWalletInfo(wallet_info); auto on_pub_load = std::bind( &LedgerImpl::OnPublisherStateLoaded, this, @@ -324,16 +360,9 @@ void LedgerImpl::OnLedgerStateLoaded( void LedgerImpl::SetConfirmationsWalletInfo( const ledger::WalletInfoProperties& wallet_info) { - if (!bat_confirmations_) { - confirmations::_environment = ledger::_environment; - confirmations::_is_debug = ledger::is_debug; - - bat_confirmations_.reset( - confirmations::Confirmations::CreateInstance(ledger_client_)); - bat_confirmations_->Initialize(); - } - auto confirmations_wallet_info = GetConfirmationsWalletInfo(wallet_info); + DCHECK(confirmations_wallet_info.IsValid()); + bat_confirmations_->SetWalletInfo( std::make_unique(confirmations_wallet_info)); } @@ -937,7 +966,13 @@ void LedgerImpl::SetWalletInfo( const ledger::WalletInfoProperties& info) { bat_state_->SetWalletInfo(info); - SetConfirmationsWalletInfo(info); + if (!initializing_) { + // Only update wallet info for Confirmations if |SetWalletInfo| was not + // called when launching the browser or creating a wallet for the first time + // (i.e. recovering a wallet), as these scenarios are covered in + // |OnWalletInitializedInternal| + SetConfirmationsWalletInfo(info); + } } const confirmations::WalletInfo LedgerImpl::GetConfirmationsWalletInfo( @@ -1140,9 +1175,7 @@ void LedgerImpl::SetCatalogIssuers(const std::string& info) { issuers_info->issuers.push_back(issuer_info); } - if (bat_confirmations_) { - bat_confirmations_->SetCatalogIssuers(std::move(issuers_info)); - } + bat_confirmations_->SetCatalogIssuers(std::move(issuers_info)); } void LedgerImpl::ConfirmAd(const std::string& info) { diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h index 02000da1e966..761edad919e3 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h @@ -610,6 +610,13 @@ class LedgerImpl : public ledger::Ledger, ledger::GetContributionReportCallback callback) override; private: + void InitializeConfirmations( + ledger::InitializeCallback callback); + + void OnConfirmationsInitialized( + const bool success, + ledger::InitializeCallback callback); + void OnLoad(ledger::VisitDataPtr visit_data, const uint64_t& current_time) override;