diff --git a/browser/extensions/api/brave_rewards_api.cc b/browser/extensions/api/brave_rewards_api.cc index 81648172a148..9cbf5a43366f 100644 --- a/browser/extensions/api/brave_rewards_api.cc +++ b/browser/extensions/api/brave_rewards_api.cc @@ -480,11 +480,13 @@ ExtensionFunction::ResponseAction BraveRewardsClaimPromotionFunction::Run() { data->SetIntKey("result", 1); return RespondNow(OneArgument(std::move(data))); } + rewards_service->ClaimPromotion( + params->promotion_id, base::BindOnce( - &BraveRewardsClaimPromotionFunction::OnClaimPromotion, - this, - params->promotion_id)); + &BraveRewardsClaimPromotionFunction::OnClaimPromotion, + this, + params->promotion_id)); return RespondLater(); } diff --git a/browser/ui/webui/brave_rewards_page_ui.cc b/browser/ui/webui/brave_rewards_page_ui.cc index 24ee1af1c09c..58ed7a1fb91d 100644 --- a/browser/ui/webui/brave_rewards_page_ui.cc +++ b/browser/ui/webui/brave_rewards_page_ui.cc @@ -630,6 +630,7 @@ void RewardsDOMHandler::ClaimPromotion(const base::ListValue* args) { #if !defined(OS_ANDROID) rewards_service_->ClaimPromotion( + promotion_id, base::Bind(&RewardsDOMHandler::OnClaimPromotion, weak_factory_.GetWeakPtr(), promotion_id)); diff --git a/components/brave_ads/browser/ads_service_impl_unittest.cc b/components/brave_ads/browser/ads_service_impl_unittest.cc index ae5885478f05..9a5f56a604be 100644 --- a/components/brave_ads/browser/ads_service_impl_unittest.cc +++ b/components/brave_ads/browser/ads_service_impl_unittest.cc @@ -47,7 +47,8 @@ class MockRewardsService : public RewardsService { MOCK_METHOD1(GetExcludedList, void(const brave_rewards::GetContentSiteListCallback&)); MOCK_METHOD0(FetchPromotions, void()); - MOCK_METHOD1(ClaimPromotion, void(brave_rewards::ClaimPromotionCallback)); + MOCK_METHOD2(ClaimPromotion, void(const std::string&, + brave_rewards::ClaimPromotionCallback)); MOCK_METHOD2(ClaimPromotion, void(const std::string&, brave_rewards::AttestPromotionCallback)); MOCK_METHOD3(AttestPromotion, void(const std::string&, diff --git a/components/brave_rewards/browser/rewards_service.h b/components/brave_rewards/browser/rewards_service.h index a8e29c5629e5..04f044c790c1 100644 --- a/components/brave_rewards/browser/rewards_service.h +++ b/components/brave_rewards/browser/rewards_service.h @@ -139,7 +139,9 @@ class RewardsService : public KeyedService { virtual void GetExcludedList(const GetContentSiteListCallback& callback) = 0; virtual void FetchPromotions() = 0; // Used by desktop - virtual void ClaimPromotion(ClaimPromotionCallback callback) = 0; + virtual void ClaimPromotion( + const std::string& promotion_id, + ClaimPromotionCallback callback) = 0; // Used by Android virtual void ClaimPromotion( const std::string& promotion_id, diff --git a/components/brave_rewards/browser/rewards_service_browsertest.cc b/components/brave_rewards/browser/rewards_service_browsertest.cc index da2011a7f05b..6a98898dcbc0 100644 --- a/components/brave_rewards/browser/rewards_service_browsertest.cc +++ b/components/brave_rewards/browser/rewards_service_browsertest.cc @@ -136,6 +136,7 @@ namespace brave_test_resp { std::string registrarVK_; std::string verification_; std::string promotions_; + std::string promotion_empty_key_; std::string promotion_claim_; std::string creds_tokens_; std::string creds_tokens_prod_; @@ -380,7 +381,11 @@ class BraveRewardsBrowserTest } } else if (URLMatches(url, "/promotions?", PREFIX_V1, ServerTypes::kPromotion)) { - *response = brave_test_resp::promotions_; + if (promotion_empty_key_) { + *response = brave_test_resp::promotion_empty_key_; + } else { + *response = brave_test_resp::promotions_; + } } else if (URLMatches(url, "/promotions/", PREFIX_V1, ServerTypes::kPromotion)) { if (url.find("claims") != std::string::npos) { @@ -679,6 +684,10 @@ class BraveRewardsBrowserTest ASSERT_TRUE(base::ReadFileToString(path.AppendASCII("promotions_resp.json"), &brave_test_resp::promotions_)); + ASSERT_TRUE(base::ReadFileToString( + path.AppendASCII("promotion_empty_key_resp.json"), + &brave_test_resp::promotion_empty_key_)); + ASSERT_TRUE(base::ReadFileToString(path.AppendASCII("captcha_resp.json"), &brave_test_resp::captcha_)); ASSERT_TRUE( @@ -1436,7 +1445,8 @@ class BraveRewardsBrowserTest double reconciled_tip_total_ = 0; double pending_balance_ = 0; double external_balance_ = 0; - double verified_wallet_ = false; + bool verified_wallet_ = false; + bool promotion_empty_key_ = false; const std::string external_wallet_address_ = "abe5f454-fedd-4ea9-9203-470ae7315bb3"; }; @@ -2786,3 +2796,16 @@ IN_PROC_BROWSER_TEST_F( "[color=contribute]", "-50.0BAT"); } + +IN_PROC_BROWSER_TEST_F( + BraveRewardsBrowserTest, + PromotionHasEmptyPublicKey) { + promotion_empty_key_ = true; + EnableRewards(); + + WaitForPromotionInitialization(); + rewards_service_browsertest_utils::WaitForElementToAppear( + OpenRewardsPopup(), + "[data-test-id=notification-close]", + false); +} diff --git a/components/brave_rewards/browser/rewards_service_impl.cc b/components/brave_rewards/browser/rewards_service_impl.cc index 0f3549cf4ba2..b60cd7beeabf 100644 --- a/components/brave_rewards/browser/rewards_service_impl.cc +++ b/components/brave_rewards/browser/rewards_service_impl.cc @@ -1344,6 +1344,7 @@ void RewardsServiceImpl::OnAttestationAndroid( } void RewardsServiceImpl::ClaimPromotion( + const std::string& promotion_id, ClaimPromotionCallback callback) { if (!Connected()) { return; @@ -1353,7 +1354,7 @@ void RewardsServiceImpl::ClaimPromotion( AsWeakPtr(), std::move(callback)); - bat_ledger_->ClaimPromotion("", std::move(claim_callback)); + bat_ledger_->ClaimPromotion(promotion_id, "", std::move(claim_callback)); } void RewardsServiceImpl::ClaimPromotion( @@ -1368,7 +1369,7 @@ void RewardsServiceImpl::ClaimPromotion( promotion_id, std::move(callback)); - bat_ledger_->ClaimPromotion("", std::move(claim_callback)); + bat_ledger_->ClaimPromotion(promotion_id, "", std::move(claim_callback)); } void RewardsServiceImpl::GetWalletPassphrase( diff --git a/components/brave_rewards/browser/rewards_service_impl.h b/components/brave_rewards/browser/rewards_service_impl.h index 4e0d4abee6a4..f024d761fb9f 100644 --- a/components/brave_rewards/browser/rewards_service_impl.h +++ b/components/brave_rewards/browser/rewards_service_impl.h @@ -114,7 +114,9 @@ class RewardsServiceImpl : public RewardsService, void CreateWallet(CreateWalletCallback callback) override; void FetchWalletProperties() override; void FetchPromotions() override; - void ClaimPromotion(ClaimPromotionCallback callback) override; + void ClaimPromotion( + const std::string& promotion_id, + ClaimPromotionCallback callback) override; void ClaimPromotion( const std::string& promotion_id, AttestPromotionCallback callback) override; diff --git a/components/services/bat_ledger/bat_ledger_impl.cc b/components/services/bat_ledger/bat_ledger_impl.cc index a8171e256fac..3b735c47060a 100644 --- a/components/services/bat_ledger/bat_ledger_impl.cc +++ b/components/services/bat_ledger/bat_ledger_impl.cc @@ -238,12 +238,14 @@ void BatLedgerImpl::OnClaimPromotion( delete holder; } void BatLedgerImpl::ClaimPromotion( + const std::string& promotion_id, const std::string& payload, ClaimPromotionCallback callback) { // deleted in OnClaimPromotion auto* holder = new CallbackHolder( AsWeakPtr(), std::move(callback)); ledger_->ClaimPromotion( + promotion_id, payload, std::bind(BatLedgerImpl::OnClaimPromotion, holder, _1, _2)); } diff --git a/components/services/bat_ledger/bat_ledger_impl.h b/components/services/bat_ledger/bat_ledger_impl.h index 7b9602eaae0d..cefbe5dca7eb 100644 --- a/components/services/bat_ledger/bat_ledger_impl.h +++ b/components/services/bat_ledger/bat_ledger_impl.h @@ -71,6 +71,7 @@ class BatLedgerImpl : public mojom::BatLedger, void FetchPromotions(FetchPromotionsCallback callback) override; void ClaimPromotion( + const std::string& promotion_id, const std::string& payload, ClaimPromotionCallback callback) override; void AttestPromotion( diff --git a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom index 097852baff7c..f2985e351df8 100644 --- a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom +++ b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom @@ -59,7 +59,7 @@ interface BatLedger { SetPublisherExclude(string publisher_key, ledger.mojom.PublisherExclude exclude) => (ledger.mojom.Result result); RestorePublishers() => (ledger.mojom.Result result); FetchPromotions() => (ledger.mojom.Result result, array promotion); - ClaimPromotion(string payload) => (ledger.mojom.Result result, string response); + ClaimPromotion(string promotion_id, string payload) => (ledger.mojom.Result result, string response); AttestPromotion(string promotion_id, string solution) => (ledger.mojom.Result result, ledger.mojom.Promotion? promotion); GetWalletPassphrase() => (string wallet_passphrase); RecoverWallet(string passPhrase) => (ledger.mojom.Result result, double balance); diff --git a/test/data/rewards-data/promotion_empty_key_resp.json b/test/data/rewards-data/promotion_empty_key_resp.json new file mode 100644 index 000000000000..cfc01fff5e9c --- /dev/null +++ b/test/data/rewards-data/promotion_empty_key_resp.json @@ -0,0 +1,16 @@ +{ + "promotions": [ + { + "id": "6820f6a4-c6ef-481d-879c-d2c30c8928c3", + "createdAt": "2019-10-30T08:07:07.092836Z", + "expiresAt": "2025-02-29T08:07:07.092836Z", + "version": 5, + "suggestionsPerGrant": 120, + "approximateValue": "30.0", + "type": "ugp", + "available": true, + "platform": "", + "publicKeys": [] + } + ] +} \ No newline at end of file diff --git a/vendor/bat-native-ledger/include/bat/ledger/ledger.h b/vendor/bat-native-ledger/include/bat/ledger/ledger.h index 294f0b9f3038..935af45daeae 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/ledger.h +++ b/vendor/bat-native-ledger/include/bat/ledger/ledger.h @@ -181,6 +181,7 @@ class LEDGER_EXPORT Ledger { // desktop: { "captchaImage": "{{captchaImage}}", "hint": "{{hint}}" } // iOS and Android: { "nonce": "{{nonce}}" } virtual void ClaimPromotion( + const std::string& promotion_id, const std::string& payload, ClaimPromotionCallback callback) const = 0; diff --git a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom index d89c6feeec95..e814f50638a8 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom +++ b/vendor/bat-native-ledger/include/bat/ledger/public/interfaces/ledger.mojom @@ -233,7 +233,7 @@ enum Result { AC_TABLE_EMPTY = 14, NOT_ENOUGH_FUNDS = 15, TIP_ERROR = 16, - CORRUPTED_WALLET = 17, + CORRUPTED_DATA = 17, GRANT_ALREADY_CLAIMED = 18, CONTRIBUTION_AMOUNT_TOO_LOW = 19, @@ -249,7 +249,8 @@ enum Result { RETRY = 29, RETRY_SHORT = 30, RETRY_LONG = 31, - CONTINUE = 32 + CONTINUE = 32, + IN_PROGRESS= 33 }; enum PublisherStatus { diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc index 948c5eb2c152..e6d96c99c0b3 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc @@ -134,14 +134,34 @@ void CredentialsCommon::GetSignedCredsFromResponse( return; } + auto* signed_creds = parsed_response.FindListKey("signed_creds"); + if (!signed_creds || signed_creds->GetList().empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << + "Failed to parse signed creds"; + callback(ledger::Result::RETRY); + return; + } + + auto* public_key = parsed_response.FindStringKey("public_key"); + if (!public_key || public_key->empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Public key is empty"; + callback(ledger::Result::RETRY); + return; + } + + auto* batch_proof = parsed_response.FindStringKey("batch_proof"); + if (!batch_proof || batch_proof->empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Batch proof is empty"; + callback(ledger::Result::RETRY); + return; + } + auto creds_batch = ledger::CredsBatch::New(); creds_batch->trigger_id = trigger.id; creds_batch->trigger_type = trigger.type; - base::JSONWriter::Write( - *parsed_response.FindListKey("signed_creds"), - &creds_batch->signed_creds); - creds_batch->public_key = *parsed_response.FindStringKey("public_key"); - creds_batch->batch_proof = *parsed_response.FindStringKey("batch_proof"); + base::JSONWriter::Write(*signed_creds, &creds_batch->signed_creds); + creds_batch->public_key = *public_key; + creds_batch->batch_proof = *batch_proof; ledger_->SaveSignedCreds(std::move(creds_batch), callback); } 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 65be18a4cf58..ef8857397c68 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 @@ -487,7 +487,7 @@ void LedgerImpl::OnPublisherStateLoaded( } if (GetPaymentId().empty() || GetWalletPassphrase().empty()) { - callback(ledger::Result::CORRUPTED_WALLET); + callback(ledger::Result::CORRUPTED_DATA); return; } @@ -819,9 +819,10 @@ void LedgerImpl::FetchWalletProperties( } void LedgerImpl::ClaimPromotion( + const std::string& promotion_id, const std::string& payload, ledger::ClaimPromotionCallback callback) const { - bat_promotion_->Claim(payload, std::move(callback)); + bat_promotion_->Claim(promotion_id, payload, std::move(callback)); } void LedgerImpl::AttestPromotion( 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 e38b4daa812c..b1638a8822b0 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 @@ -208,6 +208,7 @@ class LedgerImpl : public ledger::Ledger { void FetchPromotions(ledger::FetchPromotionCallback callback) const override; void ClaimPromotion( + const std::string& promotion_id, const std::string& payload, ledger::ClaimPromotionCallback callback) const override; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h index 2a3b9ee2eb05..f1bad7c0adb3 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h @@ -167,8 +167,10 @@ class MockLedgerImpl : public LedgerImpl { MOCK_CONST_METHOD1(FetchPromotions, void(ledger::FetchPromotionCallback)); - MOCK_CONST_METHOD2(ClaimPromotion, - void(const std::string&, const ledger::ClaimPromotionCallback)); + MOCK_CONST_METHOD3(ClaimPromotion, void( + const std::string&, + const std::string&, + const ledger::ClaimPromotionCallback)); MOCK_CONST_METHOD3(AttestPromotion, void(const std::string&, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc index 5f5344b7115d..2b1c94735588 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc @@ -113,9 +113,9 @@ void Promotion::Fetch(ledger::FetchPromotionCallback callback) { const std::string& passphrase = ledger_->GetWalletPassphrase(); if (wallet_payment_id.empty() || passphrase.empty()) { ledger::PromotionList empty_list; - callback(ledger::Result::CORRUPTED_WALLET, std::move(empty_list)); + callback(ledger::Result::CORRUPTED_DATA, std::move(empty_list)); ledger::WalletProperties properties; - ledger_->OnWalletProperties(ledger::Result::CORRUPTED_WALLET, properties); + ledger_->OnWalletProperties(ledger::Result::CORRUPTED_DATA, properties); return; } @@ -182,9 +182,13 @@ void Promotion::OnGetAllPromotions( HandleExpiredPromotions(ledger_, &promotions); ledger::PromotionList list; - bool success = ParseFetchResponse(response, &list); + std::vector corrupted_promotions; + ledger::Result result = ParseFetchResponse( + response, + &list, + &corrupted_promotions); - if (!success) { + if (result == ledger::Result::LEDGER_ERROR) { BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Failed to parse promotions"; ProcessFetchedPromotions( ledger::Result::LEDGER_ERROR, @@ -193,6 +197,14 @@ void Promotion::OnGetAllPromotions( return; } + // even though that some promotions are corrupted + // we should display non corrupted ones either way + if (result == ledger::Result::CORRUPTED_DATA) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << + "Promotions are not correct: " << + base::JoinString(corrupted_promotions, ", "); + } + for (auto & item : list) { auto it = promotions.find(item->id); if (it != promotions.end() && @@ -251,8 +263,32 @@ void Promotion::LegacyClaimedSaved( } void Promotion::Claim( + const std::string& promotion_id, + const std::string& payload, + ledger::ClaimPromotionCallback callback) { + auto promotion_callback = std::bind(&Promotion::OnClaimPromotion, + this, + _1, + payload, + callback); + + ledger_->GetPromotion(promotion_id, promotion_callback); +} + +void Promotion::OnClaimPromotion( + ledger::PromotionPtr promotion, const std::string& payload, ledger::ClaimPromotionCallback callback) { + if (!promotion) { + callback(ledger::Result::LEDGER_ERROR, ""); + return; + } + + if (promotion->status != ledger::PromotionStatus::ACTIVE) { + callback(ledger::Result::IN_PROGRESS, ""); + return; + } + attestation_->Start(payload, callback); } @@ -260,15 +296,38 @@ void Promotion::Attest( const std::string& promotion_id, const std::string& solution, ledger::AttestPromotionCallback callback) { - auto confirm_callback = std::bind(&Promotion::OnAttestPromotion, + auto promotion_callback = std::bind(&Promotion::OnAttestPromotion, this, _1, - promotion_id, + solution, callback); - attestation_->Confirm(solution, confirm_callback); + + ledger_->GetPromotion(promotion_id, promotion_callback); } void Promotion::OnAttestPromotion( + ledger::PromotionPtr promotion, + const std::string& solution, + ledger::AttestPromotionCallback callback) { + if (!promotion) { + callback(ledger::Result::LEDGER_ERROR, nullptr); + return; + } + + if (promotion->status != ledger::PromotionStatus::ACTIVE) { + callback(ledger::Result::IN_PROGRESS, nullptr); + return; + } + + auto confirm_callback = std::bind(&Promotion::OnAttestedPromotion, + this, + _1, + promotion->id, + callback); + attestation_->Confirm(solution, confirm_callback); +} + +void Promotion::OnAttestedPromotion( const ledger::Result result, const std::string& promotion_id, ledger::AttestPromotionCallback callback) { diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.h b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.h index b964018e3aae..5be55ea8d9dd 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.h @@ -34,6 +34,7 @@ class Promotion { void Fetch(ledger::FetchPromotionCallback callback); void Claim( + const std::string& promotion_id, const std::string& payload, ledger::ClaimPromotionCallback callback); @@ -66,7 +67,17 @@ class Promotion { const ledger::Result result, const std::string& promotion_string); + void OnClaimPromotion( + ledger::PromotionPtr promotion, + const std::string& payload, + ledger::ClaimPromotionCallback callback); + void OnAttestPromotion( + ledger::PromotionPtr promotion, + const std::string& solution, + ledger::AttestPromotionCallback callback); + + void OnAttestedPromotion( const ledger::Result result, const std::string& promotion_id, ledger::AttestPromotionCallback callback); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.cc index 4b8d2b8d24cd..a01f65aa4d7c 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.cc @@ -85,21 +85,23 @@ ledger::ReportType ConvertPromotionTypeToReportType( } } -bool ParseFetchResponse( +ledger::Result ParseFetchResponse( const std::string& response, - ledger::PromotionList* list) { + ledger::PromotionList* list, + std::vector* corrupted_promotions) { + DCHECK(corrupted_promotions); if (!list) { - return false; + return ledger::Result::LEDGER_ERROR; } base::Optional value = base::JSONReader::Read(response); if (!value || !value->is_dict()) { - return false; + return ledger::Result::LEDGER_ERROR; } base::DictionaryValue* dictionary = nullptr; if (!value->GetAsDictionary(&dictionary)) { - return false; + return ledger::Result::LEDGER_ERROR; } auto* promotions = dictionary->FindListKey("promotions"); @@ -116,32 +118,38 @@ bool ParseFetchResponse( const auto version = item.FindIntKey("version"); if (!version) { + corrupted_promotions->push_back(promotion->id); continue; } promotion->version = *version; const auto* type = item.FindStringKey("type"); if (!type) { + corrupted_promotions->push_back(promotion->id); continue; } promotion->type = ConvertStringToPromotionType(*type); const auto suggestions = item.FindIntKey("suggestionsPerGrant"); if (!suggestions) { + corrupted_promotions->push_back(promotion->id); continue; } promotion->suggestions = *suggestions; const auto* approximate_value = item.FindStringKey("approximateValue"); if (!approximate_value) { + corrupted_promotions->push_back(promotion->id); continue; } promotion->approximate_value = std::stod(*approximate_value); const auto available = item.FindBoolKey("available"); if (!available) { + corrupted_promotions->push_back(promotion->id); continue; } + if (*available) { promotion->status = ledger::PromotionStatus::ACTIVE; } else { @@ -150,6 +158,7 @@ bool ParseFetchResponse( auto* expires_at = item.FindStringKey("expiresAt"); if (!expires_at) { + corrupted_promotions->push_back(promotion->id); continue; } @@ -160,7 +169,8 @@ bool ParseFetchResponse( } auto* public_keys = item.FindListKey("publicKeys"); - if (!public_keys) { + if (!public_keys || public_keys->GetList().empty()) { + corrupted_promotions->push_back(promotion->id); continue; } @@ -175,11 +185,11 @@ bool ParseFetchResponse( } if (promotion_size != list->size()) { - return false; + return ledger::Result::CORRUPTED_DATA; } } - return true; + return ledger::Result::LEDGER_OK; } std::vector GetEligiblePromotions() { diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.h index 74500b21ab95..279113d6768b 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util.h @@ -23,9 +23,10 @@ ledger::PromotionType ConvertStringToPromotionType(const std::string& type); ledger::ReportType ConvertPromotionTypeToReportType( const ledger::PromotionType type); -bool ParseFetchResponse( +ledger::Result ParseFetchResponse( const std::string& response, - ledger::PromotionList* list); + ledger::PromotionList* list, + std::vector* corrupted_promotions); std::vector GetEligiblePromotions(); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/wallet/wallet.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/wallet/wallet.cc index 06f90e3aa963..ef006fa29574 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/wallet/wallet.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/wallet/wallet.cc @@ -71,7 +71,7 @@ void Wallet::GetWalletProperties( if (payment_id.empty() || passphrase.empty()) { ledger::WalletProperties properties; - callback(ledger::Result::CORRUPTED_WALLET, + callback(ledger::Result::CORRUPTED_DATA, WalletPropertiesToWalletInfo(properties)); return; } @@ -469,7 +469,7 @@ void Wallet::GetAnonWalletStatus(ledger::ResultCallback callback) { } if (payment_id.empty() || passphrase.empty()) { - callback(ledger::Result::CORRUPTED_WALLET); + callback(ledger::Result::CORRUPTED_DATA); return; } diff --git a/vendor/brave-ios/Ledger/BATBraveLedger.h b/vendor/brave-ios/Ledger/BATBraveLedger.h index 4ea08e314d77..4ed5aaf21b05 100644 --- a/vendor/brave-ios/Ledger/BATBraveLedger.h +++ b/vendor/brave-ios/Ledger/BATBraveLedger.h @@ -215,7 +215,8 @@ NS_SWIFT_NAME(BraveLedger) - (void)fetchPromotions:(nullable void (^)(NSArray *grants))completion; -- (void)claimPromotion:(NSString *)deviceCheckPublicKey +- (void)claimPromotion:(NSString *)promotionId + publicKey:(NSString *)deviceCheckPublicKey completion:(void (^)(BATResult result, NSString * _Nonnull nonce))completion; - (void)attestPromotion:(NSString *)promotionId diff --git a/vendor/brave-ios/Ledger/BATBraveLedger.mm b/vendor/brave-ios/Ledger/BATBraveLedger.mm index 42cc9447ba7c..6e9d30a7754d 100644 --- a/vendor/brave-ios/Ledger/BATBraveLedger.mm +++ b/vendor/brave-ios/Ledger/BATBraveLedger.mm @@ -941,7 +941,7 @@ - (void)fetchPromotions:(nullable void (^)(NSArray *grants))comp }); } -- (void)claimPromotion:(NSString *)deviceCheckPublicKey completion:(void (^)(BATResult result, NSString * _Nonnull nonce))completion +- (void)claimPromotion:(NSString *)promotionId publicKey:(NSString *)deviceCheckPublicKey completion:(void (^)(BATResult result, NSString * _Nonnull nonce))completion { const auto payload = [NSDictionary dictionaryWithObject:deviceCheckPublicKey forKey:@"publicKey"]; const auto jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil]; @@ -950,7 +950,7 @@ - (void)claimPromotion:(NSString *)deviceCheckPublicKey completion:(void (^)(BAT return; } const auto jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - ledger->ClaimPromotion(jsonString.UTF8String, ^(const ledger::Result result, const std::string& json) { + ledger->ClaimPromotion(promotionId.UTF8String, jsonString.UTF8String, ^(const ledger::Result result, const std::string& json) { const auto jsonData = [[NSString stringWithUTF8String:json.c_str()] dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *nonce = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; dispatch_async(dispatch_get_main_queue(), ^{