diff --git a/components/brave_rewards/browser/rewards_database_browsertest.cc b/components/brave_rewards/browser/rewards_database_browsertest.cc index c2d85c08ed73..0d2f94651a7d 100644 --- a/components/brave_rewards/browser/rewards_database_browsertest.cc +++ b/components/brave_rewards/browser/rewards_database_browsertest.cc @@ -3,6 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + #include #include @@ -608,3 +610,114 @@ IN_PROC_BROWSER_TEST_F( EXPECT_EQ(list.at(4), 1583310925); } } + +IN_PROC_BROWSER_TEST_F( + RewardsDatabaseBrowserTest, + Migration_18_Promotion) { + { + base::ScopedAllowBlockingForTesting allow_blocking; + InitDB(); + + EXPECT_EQ(CountTableRows("promotion"), 2); + + std::vector promotion_id; + std::vector claim_id; + std::vector status; + std::string query = "SELECT promotion_id, claim_id, status FROM promotion"; + sql::Statement sql(db_.GetUniqueStatement(query.c_str())); + while (sql.Step()) { + promotion_id.push_back(sql.ColumnString(0)); + claim_id.push_back(sql.ColumnString(1)); + status.push_back(sql.ColumnInt(2)); + } + + EXPECT_EQ(promotion_id.at(0), "36baa4c3-f92d-4121-b6d9-db44cb273a02"); + EXPECT_EQ(claim_id.at(0), "402afe8d-a643-4b8c-aa1e-596e3bcc6c8a"); + EXPECT_EQ(status.at(0), 1); + + EXPECT_EQ(promotion_id.at(1), "89c95d7b-f177-4b29-aed8-109a831f3588"); + EXPECT_EQ(claim_id.at(1), "4d8ddcdc-e69f-4c11-bba5-b2c6ca67e00b"); + EXPECT_EQ(status.at(1), 4); + } +} + +IN_PROC_BROWSER_TEST_F( + RewardsDatabaseBrowserTest, + Migration_18_CredsBatch) { + { + base::ScopedAllowBlockingForTesting allow_blocking; + InitDB(); + + EXPECT_EQ(CountTableRows("creds_batch"), 2); + + ledger::CredsBatch creds_database; + std::string query = + "SELECT creds_id, trigger_id, trigger_type, creds, blinded_creds, " + "signed_creds, public_key, batch_proof, status FROM creds_batch " + "LIMIT 1"; + sql::Statement sql(db_.GetUniqueStatement(query.c_str())); + while (sql.Step()) { + creds_database.trigger_id = sql.ColumnString(1); + creds_database.trigger_type = + static_cast(sql.ColumnInt(2)); + creds_database.creds = sql.ColumnString(3); + creds_database.blinded_creds = sql.ColumnString(4); + creds_database.signed_creds = sql.ColumnString(5); + creds_database.public_key = sql.ColumnString(6); + creds_database.batch_proof = sql.ColumnString(7); + creds_database.status = + static_cast(sql.ColumnInt(8)); + } + + ledger::CredsBatch creds_expected; + creds_expected.trigger_id = "36baa4c3-f92d-4121-b6d9-db44cb273a02"; + creds_expected.trigger_type = ledger::CredsBatchType::PROMOTION; + creds_expected.creds = + R"(["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"])"; + creds_expected.blinded_creds = + R"(["vrfDbBobhDwOcZ2/Nx2ztoGsx9ckVNiopL86R3BcSmc=","DjrkCHP+SUY0UNbIyGYPSgqliqpq4WxnCZ14R/ac13I=","Fv9omflWv3/L9oaL7QukGCwDxX0A/BTdgBaGnHGp7w0=","CgHvD0NBc08t9TnGRs45vJMxXH5GdkZknrs73etEbwc=","lux8l5DEll+kAOEF+HlwugDUm4nvn67+hXK4PCDnuhs=","bGZpbmisvqNdmJSpjgtopXmuTDPgTR9+JS8C/LLO6g8=","Wke8ZQM4+IP5YGf3qNZciwqt9xoTDjTIPcxrcNKwYn4=","/tiSGFiUCJA54Np1OUlxzK2Wcg4N1DRnYpYjGWxydkk=","qr06N/k1M70w85c+LOsZten+ejl2d4xnL6v7VxYzzFc=","5qegZeIPi23PpLHgzuXIR3Y60uMG9BJSIbbSC83sdXI=","kgHgPzuiHgSF1c8cSvAEQPuE8SBMAX9SdLR3CfW0SCI=","1IYdzLGgUlB3n2Ey4I1S0va9SK3j6P0kXRNZ62Tzl0A=","5ABHsBTb4qJkfqpxmlX52oXdpekigKy2L64SH/bmSmU=","bKgdDFqNNN2kBW0U45yqaFzZSWsxfpH97KNIK/Ip9m4=","4j4ZzgjYL0lnOrc/RdW9HS2dSj9FPf5uL+1gkbryLng=","KiqV5eIGClNTUbm0sqWEgbpKAa0S+e/+AdYg2YmoEVI=","NAOlqkhGEBnkQTt697PB4/geG+HUigb9DFNrFh+0JQ0=","sr453WWH2Og0SpYKkraMC+OIDT8fV+uFhuKWRpyC8w0=","PBnYdn0WgqaY4PNhlsNJzfbSrP2kYuvQLdaakKDeT0A=","VI/jnDqYMnebjTn0ACxYu9ImLpbFg725uIIF6bHMFm0=","6nTKfh1Fscumem0n+E12heNmDNEOxb3LHdm9T33arE4=","rLLelR1yW7sm21B4t4PQ+SCx/qg5T1xt5VJ308udol8=","IknFgUd+YFGaD7dJkdnIttS/KY8KUR8vKbXhmIdzD0o=","0iZTRcEqL7js+Ph1zrr7JrRA2DL0IpKGNDRFPdpakhs=","PPxvn8q8rVh0zgCwSdyCq1oINlunQWzwwA+WJhvKxig=","SuaNyI8grQXCW+TfgPgnXdx44K8SsTo3Br6z582OBW0=","oLDxobyhoonM9eZAvzB4hjyS63rgqssEZu0Z/vRiaSc=","kAXPSnDihSRnLbSA9dDBBDfBCo8AZOExAqjaXP8U8j0=","wm+SXRBo14oJmFJrXPy/0YMCI0wOYPyQTwZDWdbssiU=","Lqm4czy2VWs6MwkB6/G/0wOmKSiyjfshn8/C8gqaWnc=","0Gx/QpdZop1xLgKWMzMvR2+Pr+7zTMD5Pe6AGXotsUw=","ulcfEUVZa5Usx0sQqiAIEgDGnV4w3sK4ZS1Rw5IpukY=","Dk8NCtaKx0JbBgAuCWSeTg/SjzlIlK/Z9b2yoyvubDY=","Tm4qfoM3qvZYzRBY9Mnh9ROUEhP6AD1CkoubLD43Elk=","3g4+E4pj0nC9lKkgcWyPdAY+jLxedRf/e58uKzInRX0=","JvUPFNvTkVFcvgYHd20kFKudfBVS+jWvV8Du8/7CAGs=","hLhwvbIivqgtC5ySL/HojJ2se8IpjIiG/1V8IaerSFs=","9Ix9+dLKkQJjQeHmm71vfhGBXLBa2IGIRv5ydFveZVc=","nApXcgqbdn/BCbO5WbWVNeupBgVaXKBHhx5W+KF+9wM=","SiBMA5zawHt30EzJwYsw4bk8+ehbXddgbHIQcUPUM0Y=","tGB4YOgnVIjAlm2Bcz+AdbH/ARTdwScEMMLY6zAkyB8=","tmbfyV+krAkopoNQSzIesOVgLLJCkhkrMZD3WIRP3HA=","GKB4eW75T1KRfTIaO0unlRD3FKrSsCn8CT3lyhjM/jU=","UvO20+5KVr2ogiP/iVOvrjqsKP4ONEl5RWjATbzlPyQ=","xBVQvVJRnQC5TUT7D5bA1MJmCYYb78vQsf+DlMdBnWo=","LgygTb2Z/SwKqnPPeE/R9uGgOxtdczquEAnVsWw5liY=","1kAM7fLlUwIrMiWJDkxomvqW8CvfReyxU/AVs2Zfe38=","+JRtyEMe6BqRc8Ob33EMMN+EpBXPS/3C12wBm8QZ6W4=","OmdpqGjv/LdlASnobc6E8aTBDCvGtcrIAxCjRck1VBo=","Xl+gr9k56SY0oA+b6hcbchUunofkuWsEivc+9GBioVM=","opyzcAyI06U5E4dykvbPrTCcgVACGx7/z+ojAqZtemw=","0Gw8GTg4KlElWKKPWkgX3EDcOOLOnN/x7dM4g9x9QDc=","Zu0Y1hw+Tn194J6iTMaltcgzxXA2IAq0ZIkOqDo+izc=","dKiQd3YlEt6Bwp/inl8JfyIulagKhEGjUOumra9tl1U=","nEM6S30GASi/mc4VZA0wx9rO543QWGtwDGS17a4Lf24=","cKoG3A8m6QcT5x9NocyR57pA/OZVJVLSoi7qnKwUH0o=","DPiNgEh59JSQGqdiVAM4WA+YUr2OvoceEoXqXMitZgk=","zhc9Wx9NARSK0KQktAYPx9MdS2gTByh0TawRvC0ZnWM=","RrkpJMCBIdr8qLVs+R0/vBCv2P3wYUw1mcKrXpTOhiw=","FmbSQw0Nh57LNLFiftVPK8gUegLUOBbwIvNwLVW/R3A=","9EDCqyjUv9MN65iIRji8C3KOgNttqZFB4OnuHzzV5DA=","CPKmIaIpmSTxtAOm5XxmrC+pAWaDhBnW2EuzzLQv+m8=","fix6+LdF78YzxDWcQ1W6gz2h3VwhxfUx5cN8nuX8Uyk=","pOAw0z1F0z3u2qz4pz0cQbvriuTw3zTUHmW7IivdJC4=","rvFvp4zrjdi/zz4s3kCItCctBxmwja7eY/jQ3e9+t1o=","2JWoAGOJbsYLdQZF7ucz5wvwxAkSCi6a6YPHrya5NXE=","Bvhe8NpVSBMgt1yJNg2s1JqXmTdTmCRtF/VGBry/x0M=","MrwOGyjHkLTVWVTNhDmrtox08uP9tSfP/f86RFPIRSE=","+pG/rUjvzP0sMPQP8y7PFbU0ppfgOb5eddWzI0hs7Qw=","UE+IuosO3M+wY2r4GyxvXbxk5zWkLxe3G9MMU7q61zA="])"; + creds_expected.signed_creds = + R"(["MLAWD7pHCvqZ8xAhI8tJPTaF0bnQQZGQIpQqurfQxyw=","bGNqxekOve+/1NjeI0+JKWj9yyQbooRGMXNYgZwPVyA=","HhFjt2tRmAc6Nrz29wiM6ezCMqYpF7PEu0QX05zTu3c=","xgzxHA1MJHiamYcFym7LqBwJyBeB5/9DvsLnOdhXMB0=","huckW7ArzdO6ngdEgwVl6GOgIgdhn2ja8zefq1PGGgs=","RF4ld73JOjBoYkNa8EbNOHEsaKPycHts3Pne4JOb1BU=","DPAqmPk68YLBVFHvakZrDzttDzdRgWlxfFOw33m6WDk=","Zobrardi0Fbfqsb6T/px4zr33wDG/7jX2aRJWErT41c=","hstQg+9YxmVmKllZ+e9Wh2lf1SmhbfKD+PkCnnGgI1o=","lLGiZpikURlYvpK4P2GFErW51RJ9jN5q8BV3Vay5vVY=","3Anqu6ith0oNhB24rNwkNRTgBAsrQh4K3bxsefNOUjo=","3OOvvqX7TlB5663LCD3dbp01VVIKpc7fHea0vfZBmn4=","VDnKNKg+YGGMIr6RxBFs7S+1oIwirl1DUsktmFf2bmA=","SN5Q/6w66T5+8ghygHNi97uJluEc6WO3ZZKmz95DaG0=","OBv3pmjf8nR4xXsSv72JCOr0+EPqoI9SzPhIirAk0CA=","0g+6SNYI9/6GNfB6otm2YzXGTm/N7QnjSRKtRD8jhyc=","hNIiaWpclvCIH8FJtNQyejxfdiSW2w1JzAgoAFMgczk=","wPzLrCOCkEddfUSgBs31keZmvZkRkHER7CwFU4G53Ww=","Zmlfz5JBXCE7O4JNJtVnW4rEAxXOO9NwoePVru16ox0=","krkMqzuoYBe5LIYox6MxnKHD/yyLLxkUsJS4CbC6+Fs=","2EHaWCdKWzQblxERq9S7rEt8WJeaJuQkTFXx0oLakQg=","nlSH15EXjA/8YcNcG+bRhWSsZiRG/VWQBRJu2V1+YCY=","YmodnmSNMP8zco/SAnMkLW67Jid8Vhcn9bdyzFg55nY=","KD9EmkMuOL2thoZF/nX+J4QQCTcm2z6owAY6hjUwwiI=","2p96+kVyoFDlR9RMzAJUP5O9wxl+4yXJGXgwTRINnjM=","QK5kFJqfLS8a+qszqKDMIQO/Oad+Mqs9VEB2OgMj2Wk=","Tj3u8HcLD/oVdIJYHaw5AsO4zuYrAtCg24IkWYA3aHQ=","Zuev1fd7795gaTljw4kAjkfQhFTG/tSdsbLmeXvBih4=","uAFNHvS1cYQjq7dIh/6//uzqOSJ8I1qjwZN+WeqjUi0=","DoEkz11GxHSU5bVGct1xkAWyBSJrHfmYIFlK4cRk3wo=","5EbwREm41ENuu1wAULHHQwmKnCUUCxTLC3stsM5KbkU=","5iwHHPTZ6d1ol/6jd0b/4DqWKuFs/jd+jJUbslm0vDM=","Uu1lD0Wdmszb86JPLMSokRchg2JHUyfVT9aQGsDbdSI=","Ik1iQJhN4Cl1GwWOBeo9t0Uf9heskqkftodhY2+fZwU=","CA5eQ4zZGaY9qLyQu7vzHjJ0i+LY9xx4GzURBc7N2Qc=","UIwcxDn7Po4TBfwIx6sEDspyVSPVya7aoYEbrBX4F1s=","Xk25hpiBzV9FL6HBxTBupnAakTSR+2605OmV5MOMQTs=","zo8pjmv6PkA4/QmAuDLM2o45iGdsoINeLAPepMvX21A=","2vNlsWHD2AmdrXpSHg3uqOTKlzGY4gH/oxcO4Sg9FD4=","QocZDYOYQI9PuaCCMK2oF1tMzGtAB2pB9eoE4WTlNzg=","AIu+UDWJUsouqNOcNHlGea5wv/Zh3AiBfKT+bL8CICc=","1notbleNVYlcZl/NPTLYqgwbzqb7uR1yLsAij/mV8gA=","pO4IpFhinV/HELE6rZAyDQg9RUtgdG5CasFYO0753Uo=","eueyVEfXB6jHi5U2RH72Uqf7nPI7VgeoxL/N1he5Tk4=","KDcpGAPZb5CpWvpaTzRYLOVwqltI0JtulG3RF981rkk=","RpTbThDE7KRdiGEMH0chB98Xnh/U5eP9aUgHfXD5Hlg=","FP2sYPHGmgHd9HPAuPgw0z1Il5GhW7vRVzF5wHLLyRg=","EHeII/bPRI0xfQdKyTNXEXpKytcCpumyucpGEuuXcnM=","ci026FdZaEqKyjIW8rCD/URSVph00o6iDIOKGgCfVDw=","jpiz9qPrWZDfe/3sD3NAG32fhT/AOOOmFpxksBMHqQc=","KrLPDxgdW0qHDJgRUiyb/qP38PPP1Gsh/MKX1P9jpSM=","hHhGBecXeWkafuXJAij08MtrNviOgMf+s++h+73Eyws=","pBU9B9yDLO8nzj6Z1M9T0Csz6ntqqQ9rcyRQdJWosFE=","Khoj1Ula8Sq/f7OzQUZyXBOfNaGnaODbOamL/HlNSEE=","DofbZQBZcCJEI+nLmDg4nIjZdLZs5GuRLSQAsV3Q9Bs=","Xo5AJ20Q0SMyF+hJbIc//ui/XVXcgCzH9NDRAg7jtVg=","Tjx5y0RpbOLNrEOonTEahjJKbQzJHyFS12t6xDUSvA4=","lKJSXjcNb0TZmjt40YhFG6VIisjiebjt7LniTIKaE08=","SPu3bK4/HlvtIWuqvaDPSNBSd+tWnDOicmQB/F+U9mQ=","+B/qshgV/5tblPIpGVLG/trPF/0jYNmEkreUQvPcaT8=","qAJXyg5FZvZ3pDFa4ugDSYOnqgSs6H04ctigmvLt7A0=","KL7on7rJIu0zetbSqf8J1qxFLo+sqoIZFPNhyfYtAFg=","nO7MKDXmlU6cKQFp0OqAudxeVIHbf01JwAX1sSTsYGY=","aF8J/ttmIfLKb7htl+9SgACtDvmDCbnwXQJXzqsaBxs=","HCQp07l5y/fHZ084hI7EjJDW4dVkTpzwxarCPkfQzGY=","SCJj2lkKG2KdX1thO86Fx64X4hGv9jn+aGbcH/Z0jB8=","zug4T7e8FqYJ3oGRkorMe0moV40WxOU/dtZ52qqPXk8=","UHO4NmSJBVPEjTzGR+nmt9JBLr6TbN20latCxipjuDU=","2MiQn7Mx45RKFUQnsxiOPsrlREMioGTSlBwI6s5rfis=","/AG8yD40x3H1T4nPUAsu/UbmEJrXg+LBdnIrmyq903Y="])"; + creds_expected.public_key = "vNnt88kCh650dFFHt+48SS4d4skQ2FYSxmmlzmKDgkE="; + creds_expected.batch_proof = + "9ueOTju3OLogE0EBhiVzVlwrySNj3bQGXOba8LLfTwCufZHFfaduvkQ" + "1Ng4StLt2NK1RXY36wfC2OIGtRU6UDQ=="; + + EXPECT_EQ(creds_database.trigger_id, creds_expected.trigger_id); + EXPECT_EQ(creds_database.trigger_type, creds_expected.trigger_type); + EXPECT_EQ(creds_database.creds, creds_expected.creds); + EXPECT_EQ(creds_database.blinded_creds, creds_expected.blinded_creds); + EXPECT_EQ(creds_database.signed_creds, creds_expected.signed_creds); + EXPECT_EQ(creds_database.public_key, creds_expected.public_key); + EXPECT_EQ(creds_database.batch_proof, creds_expected.batch_proof); + EXPECT_EQ(static_cast(creds_database.status), 2); + } +} + +IN_PROC_BROWSER_TEST_F( + RewardsDatabaseBrowserTest, + Migration_18_UnblindedToken) { + { + base::ScopedAllowBlockingForTesting allow_blocking; + InitDB(); + + EXPECT_EQ(CountTableRows("unblinded_tokens"), 80); + + std::string token_id; + std::string creds_id; + uint64_t expires_at; + std::string query = + "SELECT token_id, creds_id, expires_at FROM unblinded_tokens LIMIT 1"; + sql::Statement sql(db_.GetUniqueStatement(query.c_str())); + while (sql.Step()) { + token_id = sql.ColumnString(0); + creds_id = sql.ColumnString(1); + expires_at = sql.ColumnInt64(2); + } + + EXPECT_EQ(token_id, "1"); + EXPECT_EQ(creds_id.size(), 32ul); + EXPECT_NE(creds_id, "89c95d7b-f177-4b29-aed8-109a831f3588"); + EXPECT_EQ(expires_at, 1640995200ul); + } +} diff --git a/components/definitions/rewards.d.ts b/components/definitions/rewards.d.ts index b81207e9276c..bb9fbf8fbaf4 100644 --- a/components/definitions/rewards.d.ts +++ b/components/definitions/rewards.d.ts @@ -128,8 +128,6 @@ declare namespace Rewards { export enum PromotionStatus { ACTIVE = 0, ATTESTED = 1, - CLAIMED = 2, - SIGNED_TOKENS = 3, FINISHED = 4, OVER = 5 } diff --git a/components/definitions/rewardsExtensions.d.ts b/components/definitions/rewardsExtensions.d.ts index 332d365e4729..b6fff3915b1b 100644 --- a/components/definitions/rewardsExtensions.d.ts +++ b/components/definitions/rewardsExtensions.d.ts @@ -57,8 +57,6 @@ declare namespace RewardsExtension { export enum PromotionStatus { ACTIVE = 0, ATTESTED = 1, - CLAIMED = 2, - SIGNED_TOKENS = 3, FINISHED = 4, OVER = 5 } diff --git a/test/BUILD.gn b/test/BUILD.gn index cfa9bb866910..78aabc9a8291 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -345,7 +345,7 @@ test("brave_unit_tests") { "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/test/niceware_partial_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_util_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_unittest.cc", - "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util_unittest.cc", + "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util_unittest.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.cc", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h", "//brave/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.cc", diff --git a/test/data/rewards-data/migration/publisher_info_db_v15 b/test/data/rewards-data/migration/publisher_info_db_v15 index 0e254328c7b9..fbb1c36dc072 100644 Binary files a/test/data/rewards-data/migration/publisher_info_db_v15 and b/test/data/rewards-data/migration/publisher_info_db_v15 differ diff --git a/test/data/rewards-data/migration/publisher_info_db_v16 b/test/data/rewards-data/migration/publisher_info_db_v16 index 0e254328c7b9..7244692265ff 100644 Binary files a/test/data/rewards-data/migration/publisher_info_db_v16 and b/test/data/rewards-data/migration/publisher_info_db_v16 differ diff --git a/test/data/rewards-data/migration/publisher_info_db_v17 b/test/data/rewards-data/migration/publisher_info_db_v17 new file mode 100644 index 000000000000..626957fb30a4 Binary files /dev/null and b/test/data/rewards-data/migration/publisher_info_db_v17 differ diff --git a/test/data/rewards-data/migration/publisher_info_schema_current.txt b/test/data/rewards-data/migration/publisher_info_schema_current.txt index 7cd95eedcd5d..0c0e4cd804b9 100644 --- a/test/data/rewards-data/migration/publisher_info_schema_current.txt +++ b/test/data/rewards-data/migration/publisher_info_schema_current.txt @@ -3,10 +3,11 @@ index|contribution_info_publishers_contribution_id_index|contribution_info_publi index|contribution_info_publishers_publisher_key_index|contribution_info_publishers|CREATE INDEX contribution_info_publishers_publisher_key_index ON contribution_info_publishers (publisher_key) index|contribution_queue_publishers_contribution_queue_id_index|contribution_queue_publishers|CREATE INDEX contribution_queue_publishers_contribution_queue_id_index ON contribution_queue_publishers (contribution_queue_id) index|contribution_queue_publishers_publisher_key_index|contribution_queue_publishers|CREATE INDEX contribution_queue_publishers_publisher_key_index ON contribution_queue_publishers (publisher_key) +index|creds_batch_trigger_id_index|creds_batch|CREATE INDEX creds_batch_trigger_id_index ON creds_batch (trigger_id) +index|creds_batch_trigger_type_index|creds_batch|CREATE INDEX creds_batch_trigger_type_index ON creds_batch (trigger_type) index|media_publisher_info_media_key_index|media_publisher_info|CREATE INDEX media_publisher_info_media_key_index ON media_publisher_info (media_key) index|media_publisher_info_publisher_id_index|media_publisher_info|CREATE INDEX media_publisher_info_publisher_id_index ON media_publisher_info (publisher_id) index|pending_contribution_publisher_id_index|pending_contribution|CREATE INDEX pending_contribution_publisher_id_index ON pending_contribution (publisher_id) -index|promotion_creds_promotion_id_index|promotion_creds|CREATE INDEX promotion_creds_promotion_id_index ON promotion_creds (promotion_id) index|promotion_promotion_id_index|promotion|CREATE INDEX promotion_promotion_id_index ON promotion (promotion_id) index|recurring_donation_publisher_id_index|recurring_donation|CREATE INDEX recurring_donation_publisher_id_index ON recurring_donation (publisher_id) index|server_publisher_amounts_publisher_key_index|server_publisher_amounts|CREATE INDEX server_publisher_amounts_publisher_key_index ON server_publisher_amounts (publisher_key) @@ -15,27 +16,28 @@ index|server_publisher_info_publisher_key_index|server_publisher_info|CREATE IND index|server_publisher_links_publisher_key_index|server_publisher_links|CREATE INDEX server_publisher_links_publisher_key_index ON server_publisher_links (publisher_key) index|sqlite_autoindex_activity_info_1|activity_info| index|sqlite_autoindex_contribution_info_1|contribution_info| +index|sqlite_autoindex_creds_batch_1|creds_batch| +index|sqlite_autoindex_creds_batch_2|creds_batch| index|sqlite_autoindex_media_publisher_info_1|media_publisher_info| index|sqlite_autoindex_meta_1|meta| index|sqlite_autoindex_promotion_1|promotion| -index|sqlite_autoindex_promotion_creds_1|promotion_creds| index|sqlite_autoindex_publisher_info_1|publisher_info| index|sqlite_autoindex_recurring_donation_1|recurring_donation| index|sqlite_autoindex_server_publisher_amounts_1|server_publisher_amounts| index|sqlite_autoindex_server_publisher_banner_1|server_publisher_banner| index|sqlite_autoindex_server_publisher_info_1|server_publisher_info| index|sqlite_autoindex_server_publisher_links_1|server_publisher_links| -index|unblinded_tokens_promotion_id_index|unblinded_tokens|CREATE INDEX unblinded_tokens_promotion_id_index ON unblinded_tokens (promotion_id) +index|unblinded_tokens_creds_id_index|unblinded_tokens|CREATE INDEX unblinded_tokens_creds_id_index ON unblinded_tokens (creds_id) table|activity_info|activity_info|CREATE TABLE activity_info (publisher_id LONGVARCHAR NOT NULL,duration INTEGER DEFAULT 0 NOT NULL,visits INTEGER DEFAULT 0 NOT NULL,score DOUBLE DEFAULT 0 NOT NULL,percent INTEGER DEFAULT 0 NOT NULL,weight DOUBLE DEFAULT 0 NOT NULL,reconcile_stamp INTEGER DEFAULT 0 NOT NULL,CONSTRAINT activity_unique UNIQUE (publisher_id, reconcile_stamp)) table|contribution_info|contribution_info|CREATE TABLE contribution_info (contribution_id TEXT NOT NULL,amount DOUBLE NOT NULL,type INTEGER NOT NULL,step INTEGER NOT NULL DEFAULT -1,retry_count INTEGER NOT NULL DEFAULT -1,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, processor INTEGER NOT NULL DEFAULT 1,PRIMARY KEY (contribution_id)) table|contribution_info_publishers|contribution_info_publishers|CREATE TABLE contribution_info_publishers (contribution_id TEXT NOT NULL,publisher_key TEXT NOT NULL,total_amount DOUBLE NOT NULL,contributed_amount DOUBLE) table|contribution_queue|contribution_queue|CREATE TABLE contribution_queue (contribution_queue_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,type INTEGER NOT NULL,amount DOUBLE NOT NULL,partial INTEGER NOT NULL DEFAULT 0,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL) table|contribution_queue_publishers|contribution_queue_publishers|CREATE TABLE contribution_queue_publishers (contribution_queue_id INTEGER NOT NULL,publisher_key TEXT NOT NULL,amount_percent DOUBLE NOT NULL) +table|creds_batch|creds_batch|CREATE TABLE creds_batch (creds_id TEXT PRIMARY KEY NOT NULL,trigger_id TEXT NOT NULL,trigger_type INT NOT NULL,creds TEXT NOT NULL,blinded_creds TEXT NOT NULL,signed_creds TEXT,public_key TEXT,batch_proof TEXT,status INT NOT NULL DEFAULT 0,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,CONSTRAINT creds_batch_unique UNIQUE (trigger_id, trigger_type)) table|media_publisher_info|media_publisher_info|CREATE TABLE media_publisher_info (media_key TEXT NOT NULL PRIMARY KEY UNIQUE,publisher_id LONGVARCHAR NOT NULL) table|meta|meta|CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR) table|pending_contribution|pending_contribution|CREATE TABLE pending_contribution (pending_contribution_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,publisher_id LONGVARCHAR NOT NULL,amount DOUBLE DEFAULT 0 NOT NULL,added_date INTEGER DEFAULT 0 NOT NULL,viewing_id LONGVARCHAR NOT NULL,type INTEGER NOT NULL) -table|promotion|promotion|CREATE TABLE promotion (promotion_id TEXT NOT NULL,version INTEGER NOT NULL,type INTEGER NOT NULL,public_keys TEXT NOT NULL,suggestions INTEGER NOT NULL DEFAULT 0,approximate_value DOUBLE NOT NULL DEFAULT 0,status INTEGER NOT NULL DEFAULT 0,expires_at TIMESTAMP NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, claimed_at TIMESTAMP,PRIMARY KEY (promotion_id)) -table|promotion_creds|promotion_creds|CREATE TABLE promotion_creds (promotion_id TEXT UNIQUE NOT NULL,tokens TEXT NOT NULL,blinded_creds TEXT NOT NULL,signed_creds TEXT,public_key TEXT,batch_proof TEXT,claim_id TEXT) +table|promotion|promotion|CREATE TABLE promotion (promotion_id TEXT NOT NULL,version INTEGER NOT NULL,type INTEGER NOT NULL,public_keys TEXT NOT NULL,suggestions INTEGER NOT NULL DEFAULT 0,approximate_value DOUBLE NOT NULL DEFAULT 0,status INTEGER NOT NULL DEFAULT 0,expires_at TIMESTAMP NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, claimed_at TIMESTAMP, claim_id TEXT,PRIMARY KEY (promotion_id)) table|publisher_info|publisher_info|CREATE TABLE publisher_info(publisher_id LONGVARCHAR PRIMARY KEY NOT NULL UNIQUE,excluded INTEGER DEFAULT 0 NOT NULL,name TEXT NOT NULL,favIcon TEXT NOT NULL,url TEXT NOT NULL,provider TEXT NOT NULL) table|recurring_donation|recurring_donation|CREATE TABLE recurring_donation (publisher_id LONGVARCHAR NOT NULL PRIMARY KEY UNIQUE,amount DOUBLE DEFAULT 0 NOT NULL,added_date INTEGER DEFAULT 0 NOT NULL) table|server_publisher_amounts|server_publisher_amounts|CREATE TABLE server_publisher_amounts (publisher_key LONGVARCHAR NOT NULL,amount DOUBLE DEFAULT 0 NOT NULL,CONSTRAINT server_publisher_amounts_unique UNIQUE (publisher_key, amount)) @@ -43,4 +45,4 @@ table|server_publisher_banner|server_publisher_banner|CREATE TABLE server_publis table|server_publisher_info|server_publisher_info|CREATE TABLE server_publisher_info (publisher_key LONGVARCHAR PRIMARY KEY NOT NULL UNIQUE,status INTEGER DEFAULT 0 NOT NULL,excluded INTEGER DEFAULT 0 NOT NULL,address TEXT NOT NULL) table|server_publisher_links|server_publisher_links|CREATE TABLE server_publisher_links (publisher_key LONGVARCHAR NOT NULL,provider TEXT,link TEXT,CONSTRAINT server_publisher_links_unique UNIQUE (publisher_key, provider)) table|sqlite_sequence|sqlite_sequence|CREATE TABLE sqlite_sequence(name,seq) -table|unblinded_tokens|unblinded_tokens|CREATE TABLE unblinded_tokens (token_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,token_value TEXT,public_key TEXT,value DOUBLE NOT NULL DEFAULT 0,promotion_id TEXT,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) +table|unblinded_tokens|unblinded_tokens|CREATE TABLE unblinded_tokens (token_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,token_value TEXT,public_key TEXT,value DOUBLE NOT NULL DEFAULT 0,creds_id TEXT,expires_at TIMESTAMP NOT NULL DEFAULT 0,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) diff --git a/vendor/bat-native-ledger/BUILD.gn b/vendor/bat-native-ledger/BUILD.gn index 06e60d4b95d9..7175e6b02cd1 100644 --- a/vendor/bat-native-ledger/BUILD.gn +++ b/vendor/bat-native-ledger/BUILD.gn @@ -121,6 +121,15 @@ source_set("ledger") { "src/bat/ledger/internal/contribution/phase_two.h", "src/bat/ledger/internal/contribution/unverified.cc", "src/bat/ledger/internal/contribution/unverified.h", + "src/bat/ledger/internal/credentials/credentials.h", + "src/bat/ledger/internal/credentials/credentials_common.cc", + "src/bat/ledger/internal/credentials/credentials_common.h", + "src/bat/ledger/internal/credentials/credentials_factory.cc", + "src/bat/ledger/internal/credentials/credentials_factory.h", + "src/bat/ledger/internal/credentials/credentials_promotion.cc", + "src/bat/ledger/internal/credentials/credentials_promotion.h", + "src/bat/ledger/internal/credentials/credentials_util.cc", + "src/bat/ledger/internal/credentials/credentials_util.h", "src/bat/ledger/internal/database/database.cc", "src/bat/ledger/internal/database/database.h", "src/bat/ledger/internal/database/database_activity_info.cc", @@ -133,6 +142,8 @@ source_set("ledger") { "src/bat/ledger/internal/database/database_contribution_queue.h", "src/bat/ledger/internal/database/database_contribution_queue_publishers.cc", "src/bat/ledger/internal/database/database_contribution_queue_publishers.h", + "src/bat/ledger/internal/database/database_creds_batch.cc", + "src/bat/ledger/internal/database/database_creds_batch.h", "src/bat/ledger/internal/database/database_initialize.cc", "src/bat/ledger/internal/database/database_initialize.h", "src/bat/ledger/internal/database/database_media_publisher_info.cc", diff --git a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h index 5999aa7e49e0..55dd12b6e887 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h +++ b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h @@ -81,6 +81,10 @@ using RunDBTransactionCallback = std::function; using GetCreateScriptCallback = std::function; +using GetCredsBatchCallback = std::function; +using GetAllCredsBatchCallback = std::function; +using GetPromotionListCallback = std::function; + class LEDGER_EXPORT LedgerClient { public: virtual ~LedgerClient() = default; diff --git a/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h b/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h index 6fff251969f7..65f5b7b13a59 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h +++ b/vendor/bat-native-ledger/include/bat/ledger/mojom_structs.h @@ -66,6 +66,14 @@ using ContributionRetry = mojom::ContributionRetry; using ContributionStep = mojom::ContributionStep; +using CredsBatch = mojom::CredsBatch; +using CredsBatchPtr = mojom::CredsBatchPtr; +using CredsBatchList = std::vector; + +using CredsBatchType = mojom::CredsBatchType; + +using CredsBatchStatus = mojom::CredsBatchStatus; + using Environment = ledger::mojom::Environment; using ExcludeFilter = mojom::ExcludeFilter; @@ -98,9 +106,6 @@ using PromotionMap = std::map; using PromotionType = mojom::PromotionType; -using PromotionCreds = mojom::PromotionCreds; -using PromotionCredsPtr = mojom::PromotionCredsPtr; - using PromotionStatus = mojom::PromotionStatus; using PublisherBanner = mojom::PublisherBanner; 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 b184232d0543..225d548dc55d 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 @@ -240,7 +240,8 @@ enum Result { BAT_NOT_ALLOWED = 25, ALREADY_EXISTS = 26, SAFETYNET_ATTESTATION_FAILED = 27, - DATABASE_INIT_FAILED = 28 + DATABASE_INIT_FAILED = 28, + RETRY = 29 }; enum PublisherStatus { @@ -355,8 +356,6 @@ enum PromotionType { enum PromotionStatus { ACTIVE = 0, ATTESTED = 1, - CLAIMED = 2, - SIGNED_TOKENS = 3, FINISHED = 4, OVER = 5 }; @@ -372,15 +371,6 @@ struct Promotion { uint64 expires_at; uint64 claimed_at; bool legacy_claimed; - PromotionCreds? credentials; -}; - -struct PromotionCreds { - string tokens; // JSONStringArray - string blinded_creds; // JSONStringArray - string signed_creds; // JSONStringArray - string public_key; - string batch_proof; string claim_id; }; @@ -389,7 +379,7 @@ struct UnblindedToken { string token_value; string public_key; double value; - string promotion_id; + string creds_id; uint64 expires_at; }; @@ -436,3 +426,30 @@ struct MonthlyReportInfo { array transactions; array contributions; }; + +enum CredsBatchType { + NONE = 0, + PROMOTION = 1 +}; + +enum CredsBatchStatus { + NONE = 0, + BLINDED = 1, + CLAIMED = 2, + SIGNED = 3, + FINISHED = 4 +}; + +struct CredsBatch { + string creds_id; + int32 size; + string creds; // JSONStringArray + string blinded_creds; // JSONStringArray + string signed_creds; // JSONStringArray + string public_key; + string batch_proof; + string trigger_id; + CredsBatchType trigger_type; + CredsBatchStatus status; +}; + diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/common/bind_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/common/bind_util.cc index 8506196aa100..7ca1b27f3fc4 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/common/bind_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/common/bind_util.cc @@ -93,16 +93,6 @@ ledger::ContributionQueuePtr FromStringToContributionQueue( } std::string FromPromotionToString(const ledger::PromotionPtr info) { - base::Value credentials(base::Value::Type::DICTIONARY); - if (info->credentials) { - credentials.SetStringKey("tokens", info->credentials->tokens); - credentials.SetStringKey("blinded_creds", info->credentials->blinded_creds); - credentials.SetStringKey("signed_creds", info->credentials->signed_creds); - credentials.SetStringKey("public_key", info->credentials->public_key); - credentials.SetStringKey("batch_proof", info->credentials->batch_proof); - credentials.SetStringKey("claim_id", info->credentials->claim_id); - } - base::Value promotion(base::Value::Type::DICTIONARY); promotion.SetStringKey("id", info->id); promotion.SetStringKey("public_keys", info->public_keys); @@ -114,7 +104,6 @@ std::string FromPromotionToString(const ledger::PromotionPtr info) { promotion.SetIntKey("type", static_cast(info->type)); promotion.SetIntKey("suggestions", info->suggestions); promotion.SetIntKey("status", static_cast(info->status)); - promotion.SetKey("credentials", std::move(credentials)); promotion.SetBoolKey("legacy_claimed", info->legacy_claimed); std::string json; @@ -186,43 +175,6 @@ ledger::PromotionPtr FromStringToPromotion(const std::string& data) { promotion->legacy_claimed = *legacy_claimed; } - auto* credentials = dictionary->FindDictKey("credentials"); - if (credentials) { - auto creds = ledger::PromotionCreds::New(); - - auto* tokens = credentials->FindStringKey("tokens"); - if (tokens) { - creds->tokens = *tokens; - } - - auto* blinded_creds = credentials->FindStringKey("blinded_creds"); - if (blinded_creds) { - creds->blinded_creds = *blinded_creds; - } - - auto* signed_creds = credentials->FindStringKey("signed_creds"); - if (signed_creds) { - creds->signed_creds = *signed_creds; - } - - auto* public_key = credentials->FindStringKey("public_key"); - if (public_key) { - creds->public_key = *public_key; - } - - auto* batch_proof = credentials->FindStringKey("batch_proof"); - if (batch_proof) { - creds->batch_proof = *batch_proof; - } - - auto* claim_id = credentials->FindStringKey("claim_id"); - if (claim_id) { - creds->claim_id = *claim_id; - } - - promotion->credentials = std::move(creds); - } - return promotion; } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.cc index d4b51e109f8b..3bbe60116111 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.cc @@ -14,33 +14,6 @@ namespace braveledger_helper { -std::vector Security::GenerateTokens(const int count) { - DCHECK_GT(count, 0); - std::vector tokens; - - for (auto i = 0; i < count; i++) { - auto token = Token::random(); - tokens.push_back(token); - } - - return tokens; -} - -std::vector Security::BlindTokens( - const std::vector& tokens) { - DCHECK_NE(tokens.size(), 0UL); - - std::vector blinded_tokens; - for (unsigned int i = 0; i < tokens.size(); i++) { - auto token = tokens.at(i); - auto blinded_token = token.blind(); - - blinded_tokens.push_back(blinded_token); - } - - return blinded_tokens; -} - std::string Security::GetBase64(const std::vector& data) { DCHECK_NE(data.size(), 0UL); size_t size = 0; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.h b/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.h index 25c3efd69691..d4aa269f180b 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/common/security_helper.h @@ -10,20 +10,10 @@ #include #include -#include "wrapper.hpp" - -using challenge_bypass_ristretto::Token; -using challenge_bypass_ristretto::BlindedToken; - namespace braveledger_helper { class Security { public: - static std::vector GenerateTokens(const int count); - - static std::vector BlindTokens( - const std::vector& tokens); - static std::vector GetSHA256(const std::string& string); static std::string GetBase64(const std::vector& data); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc index 26f949bf3a5c..8d063429114f 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc @@ -225,7 +225,7 @@ void Unblinded::OnUnblindedTokens( new_item.token_value = item->token_value; new_item.public_key = item->public_key; new_item.value = item->value; - new_item.promotion_id = item->promotion_id; + new_item.creds_id = item->creds_id; new_item.expires_at = item->expires_at; converted_list.push_back(new_item); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials.h new file mode 100644 index 000000000000..45c8c30bdec4 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials.h @@ -0,0 +1,53 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_CREDENTIALS_H_ +#define BRAVELEDGER_CREDENTIALS_H_ + +#include +#include + +#include "bat/ledger/ledger.h" + +namespace braveledger_credentials { + +struct CredentialsTrigger { + std::string id; + ledger::CredsBatchType type; + int size; +}; + +class Credentials { + public: + virtual ~Credentials() = default; + + virtual void Start( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + virtual void Blind( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + virtual void Claim( + const ledger::Result result, + const std::string& blinded_creds_json, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + virtual void Unblind( + ledger::CredsBatchPtr creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + virtual void Completed( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); +}; + +} // namespace braveledger_credentials + +#endif // BRAVELEDGER_CREDENTIALS_H_ 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 new file mode 100644 index 000000000000..961dec85c9bd --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.cc @@ -0,0 +1,183 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include + +#include "base/values.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "bat/ledger/internal/credentials/credentials_common.h" +#include "bat/ledger/internal/credentials/credentials_util.h" +#include "bat/ledger/internal/ledger_impl.h" + +#include "wrapper.hpp" // NOLINT + +using std::placeholders::_1; + +using challenge_bypass_ristretto::BatchDLEQProof; +using challenge_bypass_ristretto::BlindedToken; +using challenge_bypass_ristretto::PublicKey; +using challenge_bypass_ristretto::SignedToken; +using challenge_bypass_ristretto::UnblindedToken; + +namespace { + +void ParseSignedCredsResponse( + const std::string& response, + base::Value* result) { + DCHECK(result); + base::Optional value = base::JSONReader::Read(response); + if (!value || !value->is_dict()) { + return; + } + + base::DictionaryValue* dictionary = nullptr; + if (!value->GetAsDictionary(&dictionary)) { + return; + } + + auto* batch_proof = dictionary->FindStringKey("batchProof"); + if (!batch_proof) { + return; + } + + auto* signed_creds = dictionary->FindListKey("signedCreds"); + if (!signed_creds) { + return; + } + + auto* public_key = dictionary->FindStringKey("publicKey"); + if (!public_key) { + return; + } + + result->SetStringKey("batch_proof", *batch_proof); + result->SetStringKey("public_key", *public_key); + result->SetKey("signed_creds", base::Value(signed_creds->GetList())); +} + +} // namespace + +namespace braveledger_credentials { + +CredentialsCommon::CredentialsCommon(bat_ledger::LedgerImpl *ledger) : + ledger_(ledger) { + DCHECK(ledger_); +} + +CredentialsCommon::~CredentialsCommon() = default; + +void CredentialsCommon::GetBlindedCreds( + const CredentialsTrigger& trigger, + BlindedCredsCallback callback) { + const auto creds = GenerateCreds(trigger.size); + + if (creds.empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Creds are empty"; + callback(ledger::Result::LEDGER_ERROR, ""); + return; + } + + const std::string creds_json = GetCredsJSON(creds); + const auto blinded_creds = GenerateBlindCreds(creds); + + if (blinded_creds.empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Blinded creds are empty"; + callback(ledger::Result::LEDGER_ERROR, ""); + return; + } + + const std::string blinded_creds_json = GetBlindedCredsJSON(blinded_creds); + + auto creds_batch = ledger::CredsBatch::New(); + creds_batch->creds_id = ledger_->GenerateGUID(); + creds_batch->size = trigger.size; + creds_batch->creds = creds_json; + creds_batch->blinded_creds = blinded_creds_json; + creds_batch->trigger_id = trigger.id; + creds_batch->trigger_type = trigger.type; + creds_batch->status = ledger::CredsBatchStatus::BLINDED; + + auto save_callback = std::bind(&CredentialsCommon::BlindedCredsSaved, + this, + _1, + blinded_creds_json, + callback); + + ledger_->SaveCredsBatch(std::move(creds_batch), save_callback); +} + +void CredentialsCommon::BlindedCredsSaved( + const ledger::Result result, + const std::string& blinded_creds_json, + BlindedCredsCallback callback) { + callback(result, blinded_creds_json); +} + +void CredentialsCommon::GetSignedCredsFromResponse( + const CredentialsTrigger& trigger, + const std::string& response, + ledger::ResultCallback callback) { + base::Value parsed_response(base::Value::Type::DICTIONARY); + ParseSignedCredsResponse(response, &parsed_response); + + if (parsed_response.DictSize() != 3) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Parsing failed"; + callback(ledger::Result::LEDGER_ERROR); + 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"); + + ledger_->SaveSignedCreds(std::move(creds_batch), callback); +} + +void CredentialsCommon::SaveUnblindedCreds( + const uint64_t expires_at, + const double token_value, + const ledger::CredsBatch& creds, + const std::vector& unblinded_encoded_creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + ledger::UnblindedTokenList list; + ledger::UnblindedTokenPtr unblinded; + for (auto & cred : unblinded_encoded_creds) { + unblinded = ledger::UnblindedToken::New(); + unblinded->token_value = cred; + unblinded->public_key = creds.public_key; + unblinded->value = token_value; + unblinded->creds_id = creds.creds_id; + unblinded->expires_at = expires_at; + list.push_back(std::move(unblinded)); + } + + auto save_callback = std::bind(&CredentialsCommon::OnSaveUnblindedCreds, + this, + _1, + trigger, + callback); + + ledger_->SaveUnblindedTokenList(std::move(list), save_callback); +} + +void CredentialsCommon::OnSaveUnblindedCreds( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + ledger_->UpdateCredsBatchStatus( + trigger.id, + trigger.type, + ledger::CredsBatchStatus::FINISHED, + callback); +} + +} // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h new file mode 100644 index 000000000000..b92da30c6401 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_common.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_CREDENTIALS_COMMON_H_ +#define BRAVELEDGER_CREDENTIALS_COMMON_H_ + +#include + +#include +#include + +#include "bat/ledger/internal/credentials/credentials.h" +#include "bat/ledger/ledger.h" + +namespace bat_ledger { +class LedgerImpl; +} + +namespace braveledger_credentials { + +using BlindedCredsCallback = + std::function; + +class CredentialsCommon { + public: + explicit CredentialsCommon(bat_ledger::LedgerImpl* ledger); + ~CredentialsCommon(); + + void GetBlindedCreds( + const CredentialsTrigger& trigger, + BlindedCredsCallback callback); + + void GetSignedCredsFromResponse( + const CredentialsTrigger& trigger, + const std::string& response, + ledger::ResultCallback callback); + + void SaveUnblindedCreds( + const uint64_t expires_at, + const double token_value, + const ledger::CredsBatch& creds, + const std::vector& unblinded_encoded_creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + private: + void BlindedCredsSaved( + const ledger::Result result, + const std::string& blinded_creds_json, + BlindedCredsCallback callback); + + void OnSaveUnblindedCreds( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED +}; + +} // namespace braveledger_credentials + +#endif // BRAVELEDGER_CREDENTIALS_COMMON_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.cc new file mode 100644 index 000000000000..05afb1fa0190 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.cc @@ -0,0 +1,28 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "bat/ledger/internal/credentials/credentials_factory.h" +#include "bat/ledger/internal/credentials/credentials_promotion.h" +#include "bat/ledger/internal/ledger_impl.h" + +namespace braveledger_credentials { + +std::unique_ptr CredentialsFactory::Create( + bat_ledger::LedgerImpl* ledger, + const ledger::CredsBatchType trigger_type) { + DCHECK(ledger); + + switch (trigger_type) { + case ledger::CredsBatchType::NONE: { + return nullptr; + } + + case ledger::CredsBatchType::PROMOTION: { + return std::make_unique(ledger); + } + } +} + +} // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.h new file mode 100644 index 000000000000..514a463dc194 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_factory.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_CREDENTIALS_FACTORY_H_ +#define BRAVELEDGER_CREDENTIALS_FACTORY_H_ + +#include + +#include "bat/ledger/internal/credentials/credentials.h" +#include "bat/ledger/ledger.h" + +namespace bat_ledger { +class LedgerImpl; +} + +namespace braveledger_credentials { + +class CredentialsFactory { + public: + static std::unique_ptr Create( + bat_ledger::LedgerImpl* ledger, + const ledger::CredsBatchType trigger_type); +}; + +} // namespace braveledger_credentials + +#endif // BRAVELEDGER_CREDENTIALS_FACTORY_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.cc new file mode 100644 index 000000000000..9ec99c7710bf --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.cc @@ -0,0 +1,421 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include + +#include + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "bat/ledger/internal/credentials/credentials_promotion.h" +#include "bat/ledger/internal/credentials/credentials_util.h" +#include "bat/ledger/internal/ledger_impl.h" +#include "bat/ledger/internal/request/promotion_requests.h" +#include "bat/ledger/internal/request/request_util.h" +#include "net/http/http_status_code.h" + +using std::placeholders::_1; +using std::placeholders::_2; +using std::placeholders::_3; + +namespace { + +std::string ParseClaimCredsResponse(const std::string& response) { + base::Optional value = base::JSONReader::Read(response); + if (!value || !value->is_dict()) { + return ""; + } + + base::DictionaryValue* dictionary = nullptr; + if (!value->GetAsDictionary(&dictionary)) { + return ""; + } + + auto* id = dictionary->FindStringKey("claimId"); + if (!id) { + return ""; + } + + return *id; +} + +} // namespace + +namespace braveledger_credentials { + +CredentialsPromotion::CredentialsPromotion(bat_ledger::LedgerImpl* ledger) : + ledger_(ledger), + common_(std::make_unique(ledger)) { + DCHECK(ledger_ && common_); +} + +CredentialsPromotion::~CredentialsPromotion() = default; + +void CredentialsPromotion::Start( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + auto get_callback = std::bind(&CredentialsPromotion::OnStart, + this, + _1, + trigger, + callback); + + ledger_->GetCredsBatchByTrigger(trigger.id, trigger.type, get_callback); +} + +void CredentialsPromotion::OnStart( + ledger::CredsBatchPtr creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + ledger::CredsBatchStatus status = ledger::CredsBatchStatus::NONE; + if (creds) { + status = creds->status; + } + + switch (status) { + case ledger::CredsBatchStatus::NONE: + case ledger::CredsBatchStatus::BLINDED: { + Blind(trigger, callback); + break; + } + case ledger::CredsBatchStatus::CLAIMED: { + auto get_callback = std::bind(&CredentialsPromotion::FetchSignedCreds, + this, + _1, + trigger, + callback); + ledger_->GetPromotion(trigger.id, get_callback); + break; + } + case ledger::CredsBatchStatus::SIGNED: { + auto get_callback = std::bind(&CredentialsPromotion::Unblind, + this, + _1, + trigger, + callback); + ledger_->GetCredsBatchByTrigger(trigger.id, trigger.type, get_callback); + break; + } + case ledger::CredsBatchStatus::FINISHED: { + callback(ledger::Result::LEDGER_OK); + break; + } + } +} + +void CredentialsPromotion::Blind( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + auto blinded_callback = std::bind(&CredentialsPromotion::Claim, + this, + _1, + _2, + trigger, + callback); + common_->GetBlindedCreds(trigger, blinded_callback); +} + +void CredentialsPromotion::Claim( + const ledger::Result result, + const std::string& blinded_creds_json, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (result != ledger::Result::LEDGER_OK) { + callback(result); + return; + } + + auto blinded_creds = ParseStringToBaseList(blinded_creds_json); + + if (!blinded_creds || blinded_creds->empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) + << "Blinded creds are corrupted"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const std::string payment_id = ledger_->GetPaymentId(); + base::Value body(base::Value::Type::DICTIONARY); + body.SetStringKey("paymentId", payment_id); + body.SetKey("blindedCreds", base::Value(std::move(*blinded_creds))); + + std::string json; + base::JSONWriter::Write(body, &json); + + ledger::WalletInfoProperties wallet_info = ledger_->GetWalletInfo(); + + const auto headers = braveledger_request_util::BuildSignHeaders( + "post /v1/promotions/" + trigger.id, + json, + payment_id, + wallet_info.key_info_seed); + + const std::string url = braveledger_request_util::ClaimCredsUrl(trigger.id); + auto url_callback = std::bind(&CredentialsPromotion::OnClaim, + this, + _1, + _2, + _3, + trigger, + callback); + + ledger_->LoadURL( + url, + headers, + json, + "application/json; charset=utf-8", + ledger::UrlMethod::POST, + url_callback); +} + +void CredentialsPromotion::OnClaim( + const int response_status_code, + const std::string& response, + const std::map& headers, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + ledger_->LogResponse(__func__, response_status_code, response, headers); + + if (response_status_code != net::HTTP_OK) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const auto claim_id = ParseClaimCredsResponse(response); + + if (claim_id.empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Claim id is missing"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto save_callback = std::bind(&CredentialsPromotion::ClaimedSaved, + this, + _1, + trigger, + callback); + + ledger_->SavePromotionClaimId(trigger.id, claim_id, save_callback); +} + +void CredentialsPromotion::ClaimedSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (result != ledger::Result::LEDGER_OK) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Claim id was not saved"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto save_callback = std::bind(&CredentialsPromotion::ClaimStatusSaved, + this, + _1, + trigger, + callback); + + ledger_->UpdateCredsBatchStatus( + trigger.id, + trigger.type, + ledger::CredsBatchStatus::CLAIMED, + save_callback); +} + +void CredentialsPromotion::ClaimStatusSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (result != ledger::Result::LEDGER_OK) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Claim status not saved"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto get_callback = std::bind(&CredentialsPromotion::FetchSignedCreds, + this, + _1, + trigger, + callback); + ledger_->GetPromotion(trigger.id, get_callback); +} + +void CredentialsPromotion::FetchSignedCreds( + ledger::PromotionPtr promotion, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (!promotion) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const std::string url = braveledger_request_util::FetchSignedCredsUrl( + trigger.id, + promotion->claim_id); + auto url_callback = std::bind(&CredentialsPromotion::OnFetchSignedCreds, + this, + _1, + _2, + _3, + trigger, + callback); + + ledger_->LoadURL( + url, + std::vector(), + "", + "", + ledger::UrlMethod::GET, + url_callback); +} + +void CredentialsPromotion::OnFetchSignedCreds( + const int response_status_code, + const std::string& response, + const std::map& headers, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + ledger_->LogResponse(__func__, response_status_code, response, headers); + + if (response_status_code == net::HTTP_ACCEPTED) { + callback(ledger::Result::RETRY); + return; + } + + if (response_status_code != net::HTTP_OK) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto get_callback = std::bind(&CredentialsPromotion::SignedCredsSaved, + this, + _1, + trigger, + callback); + common_->GetSignedCredsFromResponse(trigger, response, get_callback); +} + +void CredentialsPromotion::SignedCredsSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (result != ledger::Result::LEDGER_OK) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Signed creds were not saved"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto get_callback = std::bind(&CredentialsPromotion::Unblind, + this, + _1, + trigger, + callback); + ledger_->GetCredsBatchByTrigger(trigger.id, trigger.type, get_callback); +} + +void CredentialsPromotion::Unblind( + ledger::CredsBatchPtr creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (!creds) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto get_callback = std::bind(&CredentialsPromotion::VerifyPublicKey, + this, + _1, + trigger, + *creds, + callback); + ledger_->GetPromotion(trigger.id, get_callback); +} + +void CredentialsPromotion::VerifyPublicKey( + ledger::PromotionPtr promotion, + const CredentialsTrigger& trigger, + const ledger::CredsBatch& creds, + ledger::ResultCallback callback) { + if (!promotion) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto promotion_keys = ParseStringToBaseList(promotion->public_keys); + + if (!promotion_keys || promotion_keys->empty()) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Public key is missing"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + bool valid = false; + for (auto& item : *promotion_keys) { + if (item.GetString() == creds.public_key) { + valid = true; + } + } + + if (!valid) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Public key is not valid"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + std::vector unblinded_encoded_creds; + std::string error; + bool result; + if (ledger::is_testing) { + result = UnBlindCredsMock(creds, &unblinded_encoded_creds); + } else { + result = UnBlindCreds(creds, &unblinded_encoded_creds, &error); + } + + if (!result) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "UnBlindTokens: " << error; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const double cred_value = + promotion->approximate_value / promotion->suggestions; + + auto save_callback = std::bind(&CredentialsPromotion::Completed, + this, + _1, + trigger, + callback); + + uint64_t expires_at = 0ul; + if (promotion->type != ledger::PromotionType::ADS) { + expires_at = promotion->expires_at; + } + + common_->SaveUnblindedCreds( + expires_at, + cred_value, + creds, + unblinded_encoded_creds, + trigger, + save_callback); +} + +void CredentialsPromotion::Completed( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) { + if (result != ledger::Result::LEDGER_OK) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Unblinded token save failed"; + callback(result); + return; + } + + ledger_->PromotionCredentialCompleted(trigger.id, callback); + ledger_->UnblindedTokensReady(); +} + +} // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.h new file mode 100644 index 000000000000..f1c9713ed074 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion.h @@ -0,0 +1,106 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_CREDENTIALS_PROMOTION_H_ +#define BRAVELEDGER_CREDENTIALS_PROMOTION_H_ + +#include +#include +#include +#include + +#include "bat/ledger/internal/credentials/credentials_common.h" + +namespace braveledger_credentials { + +class CredentialsPromotion : public Credentials { + public: + explicit CredentialsPromotion(bat_ledger::LedgerImpl* ledger); + ~CredentialsPromotion() override; + + void Start( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) override; + + private: + void OnStart( + ledger::CredsBatchPtr creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void Blind( + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) override; + + void Claim( + const ledger::Result result, + const std::string& blinded_creds_json, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) override; + + void OnClaim( + const int response_status_code, + const std::string& response, + const std::map& headers, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void ClaimedSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void ClaimStatusSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void FetchSignedCreds( + ledger::PromotionPtr promotion, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void OnFetchSignedCreds( + const int response_status_code, + const std::string& response, + const std::map& headers, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void SignedCredsSaved( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void Unblind( + ledger::CredsBatchPtr creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) override; + + void VerifyPublicKey( + ledger::PromotionPtr promotion, + const CredentialsTrigger& trigger, + const ledger::CredsBatch& creds, + ledger::ResultCallback callback); + + void SaveUnblindedCreds( + ledger::PromotionPtr promotion, + const ledger::CredsBatch& creds, + const std::vector& unblinded_encoded_creds, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback); + + void Completed( + const ledger::Result result, + const CredentialsTrigger& trigger, + ledger::ResultCallback callback) override; + + bat_ledger::LedgerImpl* ledger_; // NOT OWNED + std::unique_ptr common_; +}; + +} // namespace braveledger_credentials + +#endif // BRAVELEDGER_CREDENTIALS_PROMOTION_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc new file mode 100644 index 000000000000..88dc01301230 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.cc @@ -0,0 +1,189 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "bat/ledger/internal/credentials/credentials_util.h" + +#include "wrapper.hpp" // NOLINT + +using challenge_bypass_ristretto::BatchDLEQProof; +using challenge_bypass_ristretto::BlindedToken; +using challenge_bypass_ristretto::PublicKey; +using challenge_bypass_ristretto::SignedToken; +using challenge_bypass_ristretto::Token; +using challenge_bypass_ristretto::UnblindedToken; + +namespace braveledger_credentials { + +std::vector GenerateCreds(const int count) { + DCHECK_GT(count, 0); + std::vector creds; + + for (auto i = 0; i < count; i++) { + auto cred = Token::random(); + creds.push_back(cred); + } + + return creds; +} + +std::string GetCredsJSON(const std::vector& creds) { + base::Value creds_list(base::Value::Type::LIST); + for (auto & cred : creds) { + auto cred_base64 = cred.encode_base64(); + auto cred_value = base::Value(cred_base64); + creds_list.Append(std::move(cred_value)); + } + std::string json; + base::JSONWriter::Write(creds_list, &json); + + return json; +} + +std::vector GenerateBlindCreds(const std::vector& creds) { + DCHECK_NE(creds.size(), 0UL); + + std::vector blinded_creds; + for (unsigned int i = 0; i < creds.size(); i++) { + auto cred = creds.at(i); + auto blinded_cred = cred.blind(); + + blinded_creds.push_back(blinded_cred); + } + + return blinded_creds; +} + +std::string GetBlindedCredsJSON( + const std::vector& blinded_creds) { + base::Value blinded_list(base::Value::Type::LIST); + for (auto & cred : blinded_creds) { + auto cred_base64 = cred.encode_base64(); + auto cred_value = base::Value(cred_base64); + blinded_list.Append(std::move(cred_value)); + } + std::string json; + base::JSONWriter::Write(blinded_list, &json); + + return json; +} + +std::unique_ptr ParseStringToBaseList( + const std::string& string_list) { + base::Optional value = base::JSONReader::Read(string_list); + if (!value || !value->is_list()) { + return std::make_unique(); + } + + return std::make_unique(value->GetList()); +} + +bool UnBlindCreds( + const ledger::CredsBatch& creds_batch, + std::vector* unblinded_encoded_creds, + std::string* error) { + DCHECK(error); + if (!unblinded_encoded_creds) { + return false; + } + + auto batch_proof = BatchDLEQProof::decode_base64(creds_batch.batch_proof); + + if (challenge_bypass_ristretto::exception_occurred()) { + challenge_bypass_ristretto::TokenException e = + challenge_bypass_ristretto::get_last_exception(); + *error = std::string(e.what()); + return false; + } + + auto creds_base64 = ParseStringToBaseList(creds_batch.creds); + std::vector creds; + for (auto& item : *creds_base64) { + const auto cred = Token::decode_base64(item.GetString()); + creds.push_back(cred); + } + + if (challenge_bypass_ristretto::exception_occurred()) { + challenge_bypass_ristretto::TokenException e = + challenge_bypass_ristretto::get_last_exception(); + *error = std::string(e.what()); + return false; + } + + auto blinded_creds_base64 = ParseStringToBaseList(creds_batch.blinded_creds); + std::vector blinded_creds; + for (auto& item : *blinded_creds_base64) { + const auto blinded_cred = BlindedToken::decode_base64(item.GetString()); + blinded_creds.push_back(blinded_cred); + } + + if (challenge_bypass_ristretto::exception_occurred()) { + challenge_bypass_ristretto::TokenException e = + challenge_bypass_ristretto::get_last_exception(); + *error = std::string(e.what()); + return false; + } + + auto signed_creds_base64 = ParseStringToBaseList(creds_batch.signed_creds); + std::vector signed_creds; + for (auto& item : *signed_creds_base64) { + const auto signed_cred = SignedToken::decode_base64(item.GetString()); + signed_creds.push_back(signed_cred); + } + + if (challenge_bypass_ristretto::exception_occurred()) { + challenge_bypass_ristretto::TokenException e = + challenge_bypass_ristretto::get_last_exception(); + *error = std::string(e.what()); + return false; + } + + const auto public_key = PublicKey::decode_base64(creds_batch.public_key); + + auto unblinded_cred = batch_proof.verify_and_unblind( + creds, + blinded_creds, + signed_creds, + public_key); + + if (challenge_bypass_ristretto::exception_occurred()) { + challenge_bypass_ristretto::TokenException e = + challenge_bypass_ristretto::get_last_exception(); + *error = std::string(e.what()); + return false; + } + + for (auto& cred : unblinded_cred) { + unblinded_encoded_creds->push_back(cred.encode_base64()); + } + + if (signed_creds.size() != unblinded_encoded_creds->size()) { + *error = "Unblinded creds size does not match signed creds sent in!"; + return false; + } + + return true; +} + +bool UnBlindCredsMock( + const ledger::CredsBatch& creds, + std::vector* unblinded_encoded_creds) { + if (!unblinded_encoded_creds) { + return false; + } + + auto signed_creds_base64 = ParseStringToBaseList(creds.signed_creds); + + for (auto& item : *signed_creds_base64) { + unblinded_encoded_creds->push_back(item.GetString()); + } + + return true; +} + +} // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h new file mode 100644 index 000000000000..bcaa10445daa --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_CREDENTIALS_CREDENTIALS_HELPER_H_ +#define BRAVELEDGER_CREDENTIALS_CREDENTIALS_HELPER_H_ + +#include +#include +#include + +#include "base/values.h" +#include "bat/ledger/mojom_structs.h" + +#include "wrapper.hpp" + +using challenge_bypass_ristretto::Token; +using challenge_bypass_ristretto::BlindedToken; + +namespace braveledger_credentials { + std::vector GenerateCreds(const int count); + + std::string GetCredsJSON(const std::vector& creds); + + std::vector GenerateBlindCreds( + const std::vector& tokens); + + std::string GetBlindedCredsJSON(const std::vector& blinded); + + std::unique_ptr ParseStringToBaseList( + const std::string& string_list); + + bool UnBlindCreds( + const ledger::CredsBatch& creds, + std::vector* unblinded_encoded_creds, + std::string* error); + + bool UnBlindCredsMock( + const ledger::CredsBatch& creds, + std::vector* unblinded_encoded_creds); + +} // namespace braveledger_credentials + +#endif // BRAVELEDGER_CREDENTIALS_CREDENTIALS_HELPER_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util_unittest.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util_unittest.cc similarity index 73% rename from vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util_unittest.cc rename to vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util_unittest.cc index 3cd1c6cdef18..9a8e51cfe26a 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_util_unittest.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_util_unittest.cc @@ -8,21 +8,20 @@ #include #include -#include "bat/ledger/internal/promotion/promotion_util.h" +#include "bat/ledger/internal/credentials/credentials_util.h" #include "bat/ledger/ledger.h" #include "testing/gtest/include/gtest/gtest.h" // npm run test -- brave_unit_tests --filter=PromotionUtilTest.* -namespace braveledger_promotion { +namespace braveledger_credentials { class PromotionUtilTest : public testing::Test { public: - ledger::PromotionPtr GetPromotion() { - auto promotion = ledger::Promotion::New(); - auto credentials = ledger::PromotionCreds::New(); + ledger::CredsBatch GetCredsBatch() { + ledger::CredsBatch creds; - credentials->tokens = R"([ + creds.creds = R"([ "CeP4v0VvyP92xaaVz7SU5eUpFZvEyWYyTJvxep12aXH3uPhgovM81vtyi+ryoJeXDaUOJtxz1irzCp81Z0KAUqQSfv5CwjaK4mkrILvOEvD/Wfx6KjZvT+sYmlmlEJEM", "65AcELwGHdOKJr4TilUq2Aux7AHNLdjuPDrs470OLhgUKfocaQ7QLxJL/1NTCHSOmFUKxAos1rB1yHDTIDczkKNZob9SAC7MQSVdaFtBFppD7cGWJXwEFT/NJn36fcMB", "mlohXPxndvl7jdCTeV5LqjzRq+RsW401dAnHRRkWJ1bum/zXu6VAIx2qfFuwFBWuCEF7K60WE/xxev4DF7LU04Yuog3JZK+Ra8EpKB556NEr1j/gnVk31M91K3vztOMC", @@ -45,7 +44,7 @@ class PromotionUtilTest : public testing::Test { "cRwjj0UtvV5IFIfWB2bFCXehyvUGKjwQibagde2Vm6e4Un609n+x9CZI1l6XlZ7QNBK740hAaowS0HYQAc8goEConDH1ptE5qeBlnrx3XP64vZ/ejWum2w+SEnp6FEIC" ])"; - credentials->blinded_creds = R"([ + creds.blinded_creds = R"([ "Gggq6QFD8GszbAO2Lsjms9QtaIUGWyfcAeeXmTN0Jw0=", "gLmphI+RsPU5yz+q2XYENT7/Uaff+XiycP2EVVBfigY=", "jlc4M10scQHkUGwOVHMgbwA8RYvX9AO0rmH4aMB3RF0=", @@ -68,7 +67,7 @@ class PromotionUtilTest : public testing::Test { "NKIlnAJowWE/a/yeJsHHQDPy3I0qF2A5eTfshgOKHAQ=" ])"; - credentials->signed_creds = R"([ + creds.signed_creds = R"([ "whyLpcq84WBfWSvRevORFeyhfdqLQnINPMpbtt8kJUM=", "1qgtLfj8MJihUhYRl5rE0TJZcTEAIwjxVc4QxpGlzRA=", "WJ3VUVIFLP3s5l4+gmEg8CeSiZ/jcAyx5mnHwZ96L30=", @@ -91,70 +90,35 @@ class PromotionUtilTest : public testing::Test { "6KoAiaSu8fCBaywEayQYOQASELa9yqL245GVMbBlmWc=" ])"; - credentials->public_key = "rqQ1Tz26C4mv33ld7xpcLhuX1sWaD+s7VMnuX6cokT4="; - credentials->batch_proof = "xdWq0jwSs2Z9lhfpEUR1nYX/f3Q4LUa9Y1kmhGMD1At/tqGTJ0ogFREiBwhCflUl2AoQmAUSsELbHrFtC/dgAQ=="; // NOLINT + creds.public_key = "rqQ1Tz26C4mv33ld7xpcLhuX1sWaD+s7VMnuX6cokT4="; + creds.batch_proof = "xdWq0jwSs2Z9lhfpEUR1nYX/f3Q4LUa9Y1kmhGMD1At/tqGTJ0ogFREiBwhCflUl2AoQmAUSsELbHrFtC/dgAQ=="; // NOLINT - promotion->id = "36baa4c3-f92d-4121-b6d9-db44cb273a02"; - promotion->credentials = std::move(credentials); - - return promotion; + return creds; } }; -TEST_F(PromotionUtilTest, VerifyPublicKey) { - auto promotion = ledger::Promotion::New(); - auto credentials = ledger::PromotionCreds::New(); - - // null pointer - bool result = VerifyPublicKey(nullptr); - EXPECT_EQ(result, false); - - // credentials are not set - result = VerifyPublicKey(promotion->Clone()); - EXPECT_EQ(result, false); - - // keys are not formatted correctly - promotion->credentials = std::move(credentials); - promotion->public_keys = "fdsfsdds"; - result = VerifyPublicKey(promotion->Clone()); - EXPECT_EQ(result, false); - - // keys doesn't match - promotion->public_keys = "[\"orBZ6dkSFLwBtQgI+5qXFb0dzDSm4uf+Km6AhytgUT8=\"]"; - promotion->credentials->public_key = "dfsdfsdf"; - result = VerifyPublicKey(promotion->Clone()); - EXPECT_EQ(result, false); - - // keys match - promotion->public_keys = "[\"orBZ6dkSFLwBtQgI+5qXFb0dzDSm4uf+Km6AhytgUT8=\"]"; - promotion->credentials->public_key = - "orBZ6dkSFLwBtQgI+5qXFb0dzDSm4uf+Km6AhytgUT8="; - result = VerifyPublicKey(promotion->Clone()); - EXPECT_EQ(result, true); -} - -TEST_F(PromotionUtilTest, UnBlindTokensWorksCorrectly) { +TEST_F(PromotionUtilTest, UnBlindCredsWorksCorrectly) { std::vector unblinded_encoded_tokens; std::string error; - UnBlindTokens(GetPromotion(), &unblinded_encoded_tokens, &error); + UnBlindCreds(GetCredsBatch(), &unblinded_encoded_tokens, &error); EXPECT_EQ(error, ""); EXPECT_EQ(unblinded_encoded_tokens.size(), 20u); } -TEST_F(PromotionUtilTest, UnBlindTokensCredsNotCorrect) { +TEST_F(PromotionUtilTest, UnBlindCredsCredsNotCorrect) { std::vector unblinded_encoded_tokens; std::string error; - auto promotion = GetPromotion(); - promotion->credentials->blinded_creds = promotion->credentials->signed_creds; + auto creds = GetCredsBatch(); + creds.blinded_creds = creds.signed_creds; - UnBlindTokens(std::move(promotion), &unblinded_encoded_tokens, &error); + UnBlindCreds(std::move(creds), &unblinded_encoded_tokens, &error); EXPECT_EQ(error, - "Unblinded tokens size does not match signed tokens sent in!"); + "Unblinded creds size does not match signed creds sent in!"); EXPECT_EQ(unblinded_encoded_tokens.size(), 0u); } -} // namespace braveledger_promotion +} // namespace braveledger_credentials diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.cc index 545235196fe8..b2c295bd8eaf 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.cc @@ -7,6 +7,7 @@ #include "bat/ledger/internal/database/database.h" #include "bat/ledger/internal/database/database_activity_info.h" +#include "bat/ledger/internal/database/database_creds_batch.h" #include "bat/ledger/internal/database/database_contribution_info.h" #include "bat/ledger/internal/database/database_contribution_queue.h" #include "bat/ledger/internal/database/database_initialize.h" @@ -30,6 +31,7 @@ Database::Database(bat_ledger::LedgerImpl* ledger) : activity_info_ = std::make_unique(ledger_); contribution_queue_ = std::make_unique(ledger_); contribution_info_ = std::make_unique(ledger_); + creds_batch_ = std::make_unique(ledger_); media_publisher_info_ = std::make_unique(ledger_); multi_tables_ = std::make_unique(ledger_); @@ -83,7 +85,6 @@ void Database::DeleteActivityInfo( activity_info_->DeleteRecord(publisher_key, callback); } - /** * CONTRIBUTION INFO */ @@ -166,6 +167,40 @@ void Database::DeleteContributionQueue( return contribution_queue_->DeleteRecord(id, callback); } +/** + * CREDS BATCH + */ +void Database::SaveCredsBatch( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback) { + creds_batch_->InsertOrUpdate(std::move(info), callback); +} + +void Database::GetCredsBatchByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback) { + creds_batch_->GetRecordByTrigger(trigger_id, trigger_type, callback); +} + +void Database::SaveSignedCreds( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback) { + creds_batch_->SaveSignedCreds(std::move(info), callback); +} + +void Database::GetAllCredsBatches(ledger::GetAllCredsBatchCallback callback) { + creds_batch_->GetAllRecords(callback); +} + +void Database::UpdateCredsBatchStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback) { + creds_batch_->UpdateStatus(trigger_id, trigger_type, status, callback); +} + /** * MEDIA PUBLISHER INFO */ @@ -247,6 +282,38 @@ void Database::DeletePromotionList( promotion_->DeleteRecordList(ids, callback); } +void Database::SavePromotionClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback) { + promotion_->SaveClaimId(promotion_id, claim_id, callback); +} + +void Database::UpdatePromotionStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback) { + promotion_->UpdateStatus(promotion_id, status, callback); +} + +void Database::PromotionCredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback) { + promotion_->CredentialCompleted(promotion_id, callback); +} + +void Database::GetPromotionList( + const std::vector& ids, + ledger::GetPromotionListCallback callback) { + promotion_->GetRecords(ids, callback); +} + +void Database::GetPromotionListByType( + const std::vector& types, + ledger::GetPromotionListCallback callback) { + promotion_->GetRecordsByType(types, callback); +} + /** * PUBLISHER INFO */ @@ -340,16 +407,15 @@ void Database::DeleteUnblindedTokens( unblinded_token_->DeleteRecordList(ids, callback); } -void Database::DeleteUnblindedTokensForPromotion( - const std::string& promotion_id, - ledger::ResultCallback callback) { - unblinded_token_->DeleteRecordsForPromotion(promotion_id, callback); +void Database::GetUnblindedTokensByTriggerIds( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback callback) { + unblinded_token_->GetRecordsByTriggerIds(trigger_ids, callback); } -void Database::GetUnblindedTokensByPromotionType( - const std::vector& promotion_types, - ledger::GetUnblindedTokenListCallback callback) { - unblinded_token_->GetRecordsByPromotionType(promotion_types, callback); +void Database::CheckUnblindedTokensExpiration( + ledger::ResultCallback callback) { + unblinded_token_->CheckRecordsExpiration(callback); } } // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.h index 25cf52ebe306..19e47d09d3b7 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database.h @@ -6,6 +6,8 @@ #ifndef BRAVELEDGER_DATABASE_DATABASE_H_ #define BRAVELEDGER_DATABASE_DATABASE_H_ +#include + #include #include #include @@ -20,6 +22,7 @@ namespace braveledger_database { class DatabaseInitialize; class DatabaseActivityInfo; +class DatabaseCredsBatch; class DatabaseContributionInfo; class DatabaseContributionQueue; class DatabaseMediaPublisherInfo; @@ -113,6 +116,30 @@ class Database { const uint64_t id, ledger::ResultCallback callback); + /** + * CREDS BATCH + */ + void SaveCredsBatch( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback); + + void GetCredsBatchByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback); + + void SaveSignedCreds( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback); + + void GetAllCredsBatches(ledger::GetAllCredsBatchCallback callback); + + void UpdateCredsBatchStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback); + /** * MEDIA PUBLISHER INFO */ @@ -170,6 +197,28 @@ class Database { const std::vector& ids, ledger::ResultCallback callback); + void SavePromotionClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback); + + void UpdatePromotionStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback); + + void PromotionCredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback); + + void GetPromotionList( + const std::vector& ids, + ledger::GetPromotionListCallback callback); + + void GetPromotionListByType( + const std::vector& types, + ledger::GetPromotionListCallback callback); + /** * PUBLISHER INFO */ @@ -233,19 +282,18 @@ class Database { const std::vector& ids, ledger::ResultCallback callback); - void DeleteUnblindedTokensForPromotion( - const std::string& promotion_id, - ledger::ResultCallback callback); - - void GetUnblindedTokensByPromotionType( - const std::vector& promotion_types, + void GetUnblindedTokensByTriggerIds( + const std::vector& trigger_ids, ledger::GetUnblindedTokenListCallback callback); + void CheckUnblindedTokensExpiration(ledger::ResultCallback callback); + private: std::unique_ptr initialize_; std::unique_ptr activity_info_; std::unique_ptr contribution_info_; std::unique_ptr contribution_queue_; + std::unique_ptr creds_batch_; std::unique_ptr pending_contribution_; std::unique_ptr promotion_; std::unique_ptr media_publisher_info_; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.cc new file mode 100644 index 000000000000..b1c1f1257d26 --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.cc @@ -0,0 +1,382 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include + +#include "base/strings/stringprintf.h" +#include "bat/ledger/internal/database/database_creds_batch.h" +#include "bat/ledger/internal/database/database_util.h" +#include "bat/ledger/internal/ledger_impl.h" + +using std::placeholders::_1; + +namespace braveledger_database { + +namespace { + +const char table_name_[] = "creds_batch"; + +} // namespace + +DatabaseCredsBatch::DatabaseCredsBatch( + bat_ledger::LedgerImpl* ledger) : + DatabaseTable(ledger) { +} + +DatabaseCredsBatch::~DatabaseCredsBatch() = default; + +bool DatabaseCredsBatch::CreateTableV18(ledger::DBTransaction* transaction) { + DCHECK(transaction); + + const std::string query = base::StringPrintf( + "CREATE TABLE %s (" + "creds_id TEXT PRIMARY KEY NOT NULL," + "trigger_id TEXT NOT NULL," + "trigger_type INT NOT NULL," + "creds TEXT NOT NULL," + "blinded_creds TEXT NOT NULL," + "signed_creds TEXT," + "public_key TEXT," + "batch_proof TEXT," + "status INT NOT NULL DEFAULT 0," + "created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," + "CONSTRAINT %s_unique " + "UNIQUE (trigger_id, trigger_type)" + ")", + table_name_, + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + transaction->commands.push_back(std::move(command)); + + return true; +} + +bool DatabaseCredsBatch::CreateIndexV18(ledger::DBTransaction* transaction) { + DCHECK(transaction); + + bool success = this->InsertIndex(transaction, table_name_, "trigger_id"); + + if (!success) { + return false; + } + + return this->InsertIndex(transaction, table_name_, "trigger_type"); +} + +bool DatabaseCredsBatch::Migrate( + ledger::DBTransaction* transaction, + const int target) { + DCHECK(transaction); + + switch (target) { + case 18: { + return MigrateToV18(transaction); + } + default: { + return true; + } + } +} + +bool DatabaseCredsBatch::MigrateToV18(ledger::DBTransaction* transaction) { + DCHECK(transaction); + + if (!DropTable(transaction, table_name_)) { + return false; + } + + if (!CreateTableV18(transaction)) { + return false; + } + + if (!CreateIndexV18(transaction)) { + return false; + } + + std::string query = base::StringPrintf( + "INSERT INTO %s " + "(creds_id, trigger_id, trigger_type, creds, blinded_creds, " + "signed_creds, public_key, batch_proof) " + "SELECT hex(randomblob(16)), promotion_id, 1, tokens, blinded_creds, " + "signed_creds, public_key, batch_proof FROM promotion_creds", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + transaction->commands.push_back(std::move(command)); + + query = base::StringPrintf( + "UPDATE %s SET " + "status = (SELECT p.status FROM %s as cb " + "INNER JOIN promotion as p ON cb.trigger_id = p.promotion_id)", + table_name_, + table_name_); + + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + return true; +} + +void DatabaseCredsBatch::InsertOrUpdate( + ledger::CredsBatchPtr creds, + ledger::ResultCallback callback) { + if (!creds) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "INSERT OR REPLACE INTO %s " + "(creds_id, trigger_id, trigger_type, creds, blinded_creds, " + "signed_creds, public_key, batch_proof, status) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + BindString(command.get(), 0, creds->creds_id); + BindString(command.get(), 1, creds->trigger_id); + BindInt(command.get(), 2, static_cast(creds->trigger_type)); + BindString(command.get(), 3, creds->creds); + BindString(command.get(), 4, creds->blinded_creds); + BindString(command.get(), 5, creds->signed_creds); + BindString(command.get(), 6, creds->public_key); + BindString(command.get(), 7, creds->batch_proof); + BindInt(command.get(), 8, static_cast(creds->status)); + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabaseCredsBatch::GetRecordByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback) { + DCHECK(!trigger_id.empty()); + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "SELECT creds_id, trigger_id, trigger_type, creds, blinded_creds, " + "signed_creds, public_key, batch_proof, status FROM %s " + "WHERE trigger_id = ? AND trigger_type = ?", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::READ; + command->command = query; + + BindString(command.get(), 0, trigger_id); + BindInt(command.get(), 1, static_cast(trigger_type)); + + command->record_bindings = { + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE + }; + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = + std::bind(&DatabaseCredsBatch::OnGetRecordByTrigger, + this, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabaseCredsBatch::OnGetRecordByTrigger( + ledger::DBCommandResponsePtr response, + ledger::GetCredsBatchCallback callback) { + if (!response || + response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { + callback(nullptr); + return; + } + + if (response->result->get_records().size() != 1) { + callback(nullptr); + return; + } + + auto* record = response->result->get_records()[0].get(); + + auto info = ledger::CredsBatch::New(); + info->creds_id = GetStringColumn(record, 0); + info->trigger_id = GetStringColumn(record, 1); + info->trigger_type = + static_cast(GetIntColumn(record, 2)); + info->creds = GetStringColumn(record, 3); + info->blinded_creds = GetStringColumn(record, 4); + info->signed_creds = GetStringColumn(record, 5); + info->public_key = GetStringColumn(record, 6); + info->batch_proof = GetStringColumn(record, 7); + info->status = + static_cast(GetIntColumn(record, 8)); + + callback(std::move(info)); +} + +void DatabaseCredsBatch::SaveSignedCreds( + ledger::CredsBatchPtr creds, + ledger::ResultCallback callback) { + if (!creds) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "UPDATE %s SET signed_creds = ?, public_key = ?, batch_proof = ?, " + "status = ? WHERE trigger_id = ? AND trigger_type = ?", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + BindString(command.get(), 0, creds->signed_creds); + BindString(command.get(), 1, creds->public_key); + BindString(command.get(), 2, creds->batch_proof); + BindInt(command.get(), 3, + static_cast(ledger::CredsBatchStatus::SIGNED)); + BindString(command.get(), 4, creds->trigger_id); + BindInt(command.get(), 5, static_cast(creds->trigger_type)); + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabaseCredsBatch::GetAllRecords( + ledger::GetAllCredsBatchCallback callback) { + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "SELECT creds_id, trigger_id, trigger_type, creds, blinded_creds, " + "signed_creds, public_key, batch_proof, status FROM %s", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::READ; + command->command = query; + + command->record_bindings = { + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE + }; + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = + std::bind(&DatabaseCredsBatch::OnGetAllRecords, + this, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabaseCredsBatch::OnGetAllRecords( + ledger::DBCommandResponsePtr response, + ledger::GetAllCredsBatchCallback callback) { + if (!response || + response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { + callback({}); + return; + } + + ledger::CredsBatchList list; + ledger::CredsBatchPtr info; + for (auto const& record : response->result->get_records()) { + auto* record_pointer = record.get(); + info = ledger::CredsBatch::New(); + + info->creds_id = GetStringColumn(record_pointer, 0); + info->trigger_id = GetStringColumn(record_pointer, 1); + info->trigger_type = + static_cast(GetIntColumn(record_pointer, 2)); + info->creds = GetStringColumn(record_pointer, 3); + info->blinded_creds = GetStringColumn(record_pointer, 4); + info->signed_creds = GetStringColumn(record_pointer, 5); + info->public_key = GetStringColumn(record_pointer, 6); + info->batch_proof = GetStringColumn(record_pointer, 7); + info->status = + static_cast(GetIntColumn(record_pointer, 8)); + list.push_back(std::move(info)); + } + + callback(std::move(list)); +} + +void DatabaseCredsBatch::UpdateStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback) { + if (trigger_id.empty()) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "UPDATE %s SET status = ? WHERE trigger_id = ? AND trigger_type = ?", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + BindInt(command.get(), 0, static_cast(status)); + BindString(command.get(), 1, trigger_id); + BindInt(command.get(), 2, static_cast(trigger_type)); + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +} // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.h new file mode 100644 index 000000000000..3fd5dc6be9dd --- /dev/null +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch.h @@ -0,0 +1,62 @@ +/* Copyright (c) 2020 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVELEDGER_DATABASE_DATABASE_CREDS_BATCH_H_ +#define BRAVELEDGER_DATABASE_DATABASE_CREDS_BATCH_H_ + +#include +#include + +#include "bat/ledger/internal/database/database_table.h" + +namespace braveledger_database { + +class DatabaseCredsBatch: public DatabaseTable { + public: + explicit DatabaseCredsBatch(bat_ledger::LedgerImpl* ledger); + ~DatabaseCredsBatch() override; + + bool Migrate(ledger::DBTransaction* transaction, const int target) override; + + void InsertOrUpdate( + ledger::CredsBatchPtr creds, + ledger::ResultCallback callback); + + void GetRecordByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback); + + void SaveSignedCreds( + ledger::CredsBatchPtr creds, + ledger::ResultCallback callback); + + void GetAllRecords(ledger::GetAllCredsBatchCallback callback); + + void UpdateStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback); + + private: + bool CreateTableV18(ledger::DBTransaction* transaction); + + bool CreateIndexV18(ledger::DBTransaction* transaction); + + bool MigrateToV18(ledger::DBTransaction* transaction); + + void OnGetRecordByTrigger( + ledger::DBCommandResponsePtr response, + ledger::GetCredsBatchCallback callback); + + void OnGetAllRecords( + ledger::DBCommandResponsePtr response, + ledger::GetAllCredsBatchCallback callback); +}; + +} // namespace braveledger_database + +#endif // BRAVELEDGER_DATABASE_DATABASE_CREDS_BATCH_H_ diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.cc index f3f95c274978..30d89f0df84c 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.cc @@ -9,6 +9,7 @@ #include "bat/ledger/internal/database/database_activity_info.h" #include "bat/ledger/internal/database/database_contribution_info.h" #include "bat/ledger/internal/database/database_contribution_queue.h" +#include "bat/ledger/internal/database/database_creds_batch.h" #include "bat/ledger/internal/database/database_media_publisher_info.h" #include "bat/ledger/internal/database/database_migration.h" #include "bat/ledger/internal/database/database_pending_contribution.h" @@ -30,6 +31,7 @@ DatabaseMigration::DatabaseMigration(bat_ledger::LedgerImpl* ledger) : activity_info_ = std::make_unique(ledger_); contribution_queue_ = std::make_unique(ledger_); contribution_info_ = std::make_unique(ledger_); + creds_batch_ = std::make_unique(ledger_); media_publisher_info_ = std::make_unique(ledger_); pending_contribution_ = std::make_unique(ledger_); @@ -99,6 +101,10 @@ bool DatabaseMigration::Migrate( return false; } + if (!creds_batch_->Migrate(transaction, target)) { + return false; + } + if (!media_publisher_info_->Migrate(transaction, target)) { return false; } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.h index c449f1e12689..4090ab2ae43a 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_migration.h @@ -19,6 +19,7 @@ namespace braveledger_database { class DatabaseActivityInfo; class DatabaseContributionInfo; class DatabaseContributionQueue; +class DatabaseCredsBatch; class DatabaseMediaPublisherInfo; class DatabasePendingContribution; class DatabasePromotion; @@ -42,6 +43,7 @@ class DatabaseMigration { std::unique_ptr activity_info_; std::unique_ptr contribution_info_; std::unique_ptr contribution_queue_; + std::unique_ptr creds_batch_; std::unique_ptr media_publisher_info_; std::unique_ptr pending_contribution_; std::unique_ptr promotion_; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.cc index e2c851614bbd..a28052a72d80 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.cc @@ -3,10 +3,13 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + #include #include #include "base/strings/stringprintf.h" +#include "base/strings/string_util.h" #include "bat/ledger/internal/database/database_promotion.h" #include "bat/ledger/internal/database/database_util.h" #include "bat/ledger/internal/ledger_impl.h" @@ -18,7 +21,6 @@ namespace braveledger_database { namespace { const char table_name_[] = "promotion"; -const char creds_table_name_[] = "promotion_creds"; } // namespace @@ -80,6 +82,9 @@ bool DatabasePromotion::Migrate( case 15: { return MigrateToV15(transaction); } + case 18: { + return MigrateToV18(transaction); + } default: { return true; } @@ -150,6 +155,47 @@ bool DatabasePromotion::MigrateToV15(ledger::DBTransaction* transaction) { return creds_->Migrate(transaction, 15); } +bool DatabasePromotion::MigrateToV18(ledger::DBTransaction* transaction) { + DCHECK(transaction); + + const char column[] = "claim_id"; + std::string query = base::StringPrintf( + "ALTER TABLE %s ADD %s TEXT", + table_name_, + column); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + query = base::StringPrintf( + "UPDATE %s SET claim_id = " + "(SELECT claim_id FROM promotion_creds as pc " + "WHERE pc.promotion_id = %s.promotion_id)", + table_name_, + table_name_); + + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + query = base::StringPrintf( + "UPDATE %s SET status = 1 WHERE status = 2 OR status = 3", + table_name_); + + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + return creds_->Migrate(transaction, 18); +} + void DatabasePromotion::InsertOrUpdate( ledger::PromotionPtr info, ledger::ResultCallback callback) { @@ -183,13 +229,6 @@ void DatabasePromotion::InsertOrUpdate( transaction->commands.push_back(std::move(command)); - if (info->credentials) { - creds_->InsertOrUpdate( - transaction.get(), - info->credentials->Clone(), - info->id); - } - auto transaction_callback = std::bind(&OnResultCallback, _1, callback); @@ -207,15 +246,10 @@ void DatabasePromotion::GetRecord( auto transaction = ledger::DBTransaction::New(); const std::string query = base::StringPrintf( - "SELECT " - "p.promotion_id, p.version, p.type, p.public_keys, p.suggestions, " - "p.approximate_value, p.status, p.expires_at, p.claimed_at," - "c.tokens, c.blinded_creds, c.signed_creds, c.public_key, c.batch_proof," - "c.claim_id " - "FROM %s as p LEFT JOIN %s as c ON p.promotion_id = c.promotion_id " - "WHERE p.promotion_id=?", - table_name_, - creds_table_name_); + "SELECT promotion_id, version, type, public_keys, suggestions, " + "approximate_value, status, expires_at, claimed_at, claim_id " + "FROM %s WHERE promotion_id=?", + table_name_); auto command = ledger::DBCommand::New(); command->type = ledger::DBCommand::Type::READ; @@ -233,11 +267,6 @@ void DatabasePromotion::GetRecord( ledger::DBCommand::RecordBindingType::INT_TYPE, ledger::DBCommand::RecordBindingType::INT64_TYPE, ledger::DBCommand::RecordBindingType::INT64_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, ledger::DBCommand::RecordBindingType::STRING_TYPE }; @@ -277,18 +306,7 @@ void DatabasePromotion::OnGetRecord( info->status = static_cast(GetIntColumn(record, 6)); info->expires_at = GetInt64Column(record, 7); info->claimed_at = GetInt64Column(record, 8); - - const std::string tokens = GetStringColumn(record, 9); - if (!tokens.empty()) { - auto creds = ledger::PromotionCreds::New(); - creds->tokens = tokens; - creds->blinded_creds = GetStringColumn(record, 10); - creds->signed_creds = GetStringColumn(record, 11); - creds->public_key = GetStringColumn(record, 12); - creds->batch_proof = GetStringColumn(record, 13); - creds->claim_id = GetStringColumn(record, 14); - info->credentials = std::move(creds); - } + info->claim_id = GetStringColumn(record, 9); callback(std::move(info)); } @@ -299,13 +317,10 @@ void DatabasePromotion::GetAllRecords( const std::string query = base::StringPrintf( "SELECT " - "p.promotion_id, p.version, p.type, p.public_keys, p.suggestions, " - "p.approximate_value, p.status, p.expires_at, p.claimed_at," - "c.tokens, c.blinded_creds, c.signed_creds, c.public_key, c.batch_proof," - "c.claim_id " - "FROM %s as p LEFT JOIN %s as c ON p.promotion_id = c.promotion_id", - table_name_, - creds_table_name_); + "promotion_id, version, type, public_keys, suggestions, " + "approximate_value, status, expires_at, claimed_at, claim_id " + "FROM %s", + table_name_); auto command = ledger::DBCommand::New(); command->type = ledger::DBCommand::Type::READ; @@ -321,11 +336,6 @@ void DatabasePromotion::GetAllRecords( ledger::DBCommand::RecordBindingType::INT_TYPE, ledger::DBCommand::RecordBindingType::INT64_TYPE, ledger::DBCommand::RecordBindingType::INT64_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, ledger::DBCommand::RecordBindingType::STRING_TYPE }; @@ -365,18 +375,7 @@ void DatabasePromotion::OnGetAllRecords( static_cast(GetIntColumn(record_pointer, 6)); info->expires_at = GetInt64Column(record_pointer, 7); info->claimed_at = GetInt64Column(record_pointer, 8); - - const std::string tokens = GetStringColumn(record_pointer, 9); - if (!tokens.empty()) { - auto creds = ledger::PromotionCreds::New(); - creds->tokens = tokens; - creds->blinded_creds = GetStringColumn(record_pointer, 10); - creds->signed_creds = GetStringColumn(record_pointer, 11); - creds->public_key = GetStringColumn(record_pointer, 12); - creds->batch_proof = GetStringColumn(record_pointer, 13); - creds->claim_id = GetStringColumn(record_pointer, 14); - info->credentials = std::move(creds); - } + info->claim_id = GetStringColumn(record_pointer, 9); map.insert(std::make_pair(info->id, std::move(info))); } @@ -403,7 +402,99 @@ void DatabasePromotion::DeleteRecordList( command->command = query; transaction->commands.push_back(std::move(command)); - creds_->DeleteRecordListByPromotion(transaction.get(), ids); + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabasePromotion::SaveClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback) { + if (promotion_id.empty() || claim_id.empty()) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const std::string query = base::StringPrintf( + "UPDATE %s SET claim_id = ? WHERE promotion_id = ?", + table_name_); + + auto transaction = ledger::DBTransaction::New(); + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + BindString(command.get(), 0, claim_id); + BindString(command.get(), 1, promotion_id); + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabasePromotion::UpdateStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback) { + if (promotion_id.empty()) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const std::string query = base::StringPrintf( + "UPDATE %s SET status = ? WHERE promotion_id = ?", + table_name_); + + auto transaction = ledger::DBTransaction::New(); + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + BindInt(command.get(), 0, static_cast(status)); + BindString(command.get(), 1, promotion_id); + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabasePromotion::CredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback) { + if (promotion_id.empty()) { + callback(ledger::Result::LEDGER_ERROR); + return; + } + + const std::string query = base::StringPrintf( + "UPDATE %s SET status = ?, claimed_at = ? WHERE promotion_id = ?", + table_name_); + + auto transaction = ledger::DBTransaction::New(); + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::RUN; + command->command = query; + + const uint64_t current_time = + static_cast(base::Time::Now().ToDoubleT()); + + BindInt(command.get(), 0, + static_cast(ledger::PromotionStatus::FINISHED)); + BindInt64(command.get(), 1, current_time); + BindString(command.get(), 2, promotion_id); + + transaction->commands.push_back(std::move(command)); auto transaction_callback = std::bind(&OnResultCallback, _1, @@ -412,4 +503,125 @@ void DatabasePromotion::DeleteRecordList( ledger_->RunDBTransaction(std::move(transaction), transaction_callback); } +void DatabasePromotion::GetRecords( + const std::vector& ids, + ledger::GetPromotionListCallback callback) { + auto transaction = ledger::DBTransaction::New(); + + const std::string query = base::StringPrintf( + "SELECT " + "promotion_id, version, type, public_keys, suggestions, " + "approximate_value, status, expires_at, claimed_at, claim_id " + "FROM %s WHERE promotion_id IN (%s)", + table_name_, + GenerateStringInCase(ids).c_str()); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::READ; + command->command = query; + + command->record_bindings = { + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::DOUBLE_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE + }; + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = + std::bind(&DatabasePromotion::OnGetRecords, + this, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + +void DatabasePromotion::OnGetRecords( + ledger::DBCommandResponsePtr response, + ledger::GetPromotionListCallback callback) { + if (!response || + response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { + callback({}); + return; + } + + ledger::PromotionList list; + ledger::PromotionPtr info; + for (auto const& record : response->result->get_records()) { + info = ledger::Promotion::New(); + auto* record_pointer = record.get(); + + info->id = GetStringColumn(record_pointer, 0); + info->version = GetIntColumn(record_pointer, 1); + info->type = + static_cast(GetIntColumn(record_pointer, 2)); + info->public_keys = GetStringColumn(record_pointer, 3); + info->suggestions = GetInt64Column(record_pointer, 4); + info->approximate_value = GetDoubleColumn(record_pointer, 5); + info->status = + static_cast(GetIntColumn(record_pointer, 6)); + info->expires_at = GetInt64Column(record_pointer, 7); + info->claimed_at = GetInt64Column(record_pointer, 8); + info->claim_id = GetStringColumn(record_pointer, 9); + + list.push_back(std::move(info)); + } + + callback(std::move(list)); +} + +void DatabasePromotion::GetRecordsByType( + const std::vector& types, + ledger::GetPromotionListCallback callback) { + auto transaction = ledger::DBTransaction::New(); + + std::vector in_case; + + for (const auto& type : types) { + in_case.push_back(std::to_string(static_cast(type))); + } + + const std::string query = base::StringPrintf( + "SELECT promotion_id, version, type, public_keys, suggestions, " + "approximate_value, status, expires_at, claimed_at, claim_id " + "FROM %s WHERE type IN (%s)", + table_name_, + base::JoinString(in_case, ",").c_str()); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::READ; + command->command = query; + + command->record_bindings = { + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::DOUBLE_TYPE, + ledger::DBCommand::RecordBindingType::INT_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::INT64_TYPE, + ledger::DBCommand::RecordBindingType::STRING_TYPE + }; + + transaction->commands.push_back(std::move(command)); + + auto transaction_callback = + std::bind(&DatabasePromotion::OnGetRecords, + this, + _1, + callback); + + ledger_->RunDBTransaction(std::move(transaction), transaction_callback); +} + } // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.h index 33f70520bdc1..04f446e7f97f 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion.h @@ -30,6 +30,10 @@ class DatabasePromotion: public DatabaseTable { const std::string& id, ledger::GetPromotionCallback callback); + void GetRecords( + const std::vector& ids, + ledger::GetPromotionListCallback callback); + void GetAllRecords( ledger::GetAllPromotionsCallback callback); @@ -37,6 +41,24 @@ class DatabasePromotion: public DatabaseTable { const std::vector& ids, ledger::ResultCallback callback); + void SaveClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback); + + void UpdateStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback); + + void CredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback); + + void GetRecordsByType( + const std::vector& types, + ledger::GetPromotionListCallback callback); + private: bool CreateTableV10(ledger::DBTransaction* transaction); @@ -50,6 +72,8 @@ class DatabasePromotion: public DatabaseTable { bool MigrateToV15(ledger::DBTransaction* transaction); + bool MigrateToV18(ledger::DBTransaction* transaction); + void OnGetRecord( ledger::DBCommandResponsePtr response, ledger::GetPromotionCallback callback); @@ -58,6 +82,10 @@ class DatabasePromotion: public DatabaseTable { ledger::DBCommandResponsePtr response, ledger::GetAllPromotionsCallback callback); + void OnGetRecords( + ledger::DBCommandResponsePtr response, + ledger::GetPromotionListCallback callback); + std::unique_ptr creds_; }; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.cc index f00a022232ad..c777dccf943e 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.cc @@ -108,6 +108,9 @@ bool DatabasePromotionCreds::Migrate( case 15: { return MigrateToV15(transaction); } + case 18: { + return MigrateToV18(transaction); + } default: { return true; } @@ -179,56 +182,10 @@ bool DatabasePromotionCreds::MigrateToV15(ledger::DBTransaction* transaction) { return true; } -void DatabasePromotionCreds::InsertOrUpdate( - ledger::DBTransaction* transaction, - ledger::PromotionCredsPtr info, - const std::string& promotion_id) { - DCHECK(transaction); - - if (!info || promotion_id.empty()) { - return; - } - - const std::string query = base::StringPrintf( - "INSERT OR REPLACE INTO %s " - "(promotion_id, tokens, blinded_creds, signed_creds, " - "public_key, batch_proof, claim_id) " - "VALUES (?, ?, ?, ?, ?, ?, ?)", - table_name_); - - auto command = ledger::DBCommand::New(); - command->type = ledger::DBCommand::Type::RUN; - command->command = query; - - BindString(command.get(), 0, promotion_id); - BindString(command.get(), 1, info->tokens); - BindString(command.get(), 2, info->blinded_creds); - BindString(command.get(), 3, info->signed_creds); - BindString(command.get(), 4, info->public_key); - BindString(command.get(), 5, info->batch_proof); - BindString(command.get(), 6, info->claim_id); - - transaction->commands.push_back(std::move(command)); -} - -void DatabasePromotionCreds::DeleteRecordListByPromotion( - ledger::DBTransaction* transaction, - const std::vector& ids) { +bool DatabasePromotionCreds::MigrateToV18(ledger::DBTransaction* transaction) { DCHECK(transaction); - if (ids.empty()) { - return; - } - - const std::string query = base::StringPrintf( - "DELETE FROM %s WHERE promotion_id IN (%s)", - table_name_, - GenerateStringInCase(ids).c_str()); - - auto command = ledger::DBCommand::New(); - command->type = ledger::DBCommand::Type::EXECUTE; - command->command = query; - transaction->commands.push_back(std::move(command)); + return DropTable(transaction, table_name_); } } // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.h index c36caa96b3a2..4cb1612aa71d 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion_creds.h @@ -11,6 +11,11 @@ #include "bat/ledger/internal/database/database_table.h" +// DEPRECATED +// THIS TABLE IS NOT USED ANYMORE!! +// we only kept this file for migration purposes +// we have creds_batch now + namespace braveledger_database { class DatabasePromotionCreds: public DatabaseTable { @@ -20,16 +25,6 @@ class DatabasePromotionCreds: public DatabaseTable { bool Migrate(ledger::DBTransaction* transaction, const int target) override; - void InsertOrUpdate( - ledger::DBTransaction* transaction, - ledger::PromotionCredsPtr info, - const std::string& promotion_id); - - - void DeleteRecordListByPromotion( - ledger::DBTransaction* transaction, - const std::vector& ids); - private: bool CreateTableV10(ledger::DBTransaction* transaction); @@ -42,6 +37,8 @@ class DatabasePromotionCreds: public DatabaseTable { bool MigrateToV10(ledger::DBTransaction* transaction); bool MigrateToV15(ledger::DBTransaction* transaction); + + bool MigrateToV18(ledger::DBTransaction* transaction); }; } // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.cc index 2c707283447d..29bce6caf574 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.cc @@ -3,11 +3,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + #include #include #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/time/time.h" #include "bat/ledger/internal/database/database_unblinded_token.h" #include "bat/ledger/internal/database/database_util.h" #include "bat/ledger/internal/ledger_impl.h" @@ -20,15 +23,6 @@ namespace { const char table_name_[] = "unblinded_tokens"; -int64_t GetExpirationDate(const int32_t type, const int64_t stamp) { - const auto promotion_type = static_cast(type); - if (promotion_type == ledger::PromotionType::ADS) { - return 0; - } - - return stamp; -} - } // namespace DatabaseUnblindedToken::DatabaseUnblindedToken( @@ -88,6 +82,30 @@ bool DatabaseUnblindedToken::CreateTableV15( return true; } +bool DatabaseUnblindedToken::CreateTableV18( + ledger::DBTransaction* transaction) { + DCHECK(transaction); + + const std::string query = base::StringPrintf( + "CREATE TABLE %s (" + "token_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "token_value TEXT," + "public_key TEXT," + "value DOUBLE NOT NULL DEFAULT 0," + "creds_id TEXT," + "expires_at TIMESTAMP NOT NULL DEFAULT 0," + "created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" + ")", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + transaction->commands.push_back(std::move(command)); + + return true; +} + bool DatabaseUnblindedToken::CreateIndexV10( ledger::DBTransaction* transaction) { DCHECK(transaction); @@ -102,6 +120,13 @@ bool DatabaseUnblindedToken::CreateIndexV15( return this->InsertIndex(transaction, table_name_, "promotion_id"); } +bool DatabaseUnblindedToken::CreateIndexV18( + ledger::DBTransaction* transaction) { + DCHECK(transaction); + + return this->InsertIndex(transaction, table_name_, "creds_id"); +} + bool DatabaseUnblindedToken::Migrate( ledger::DBTransaction* transaction, const int target) { @@ -117,6 +142,9 @@ bool DatabaseUnblindedToken::Migrate( case 15: { return MigrateToV15(transaction); } + case 18: { + return MigrateToV18(transaction); + } default: { return true; } @@ -202,6 +230,90 @@ bool DatabaseUnblindedToken::MigrateToV15(ledger::DBTransaction* transaction) { return true; } +bool DatabaseUnblindedToken::MigrateToV18(ledger::DBTransaction* transaction) { + DCHECK(transaction); + + std::string query = base::StringPrintf( + "ALTER TABLE %s ADD creds_id TEXT", + table_name_); + + auto command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + query = base::StringPrintf( + "ALTER TABLE %s ADD expires_at TIMESTAMP NOT NULL DEFAULT 0", + table_name_); + + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + query = base::StringPrintf( + "UPDATE %s SET " + "creds_id = (SELECT cb.creds_id FROM %s as ut " + "INNER JOIN creds_batch as cb ON cb.trigger_id = ut.promotion_id), " + "expires_at = (SELECT p.expires_at FROM %s as ut " + "INNER JOIN promotion as p ON p.promotion_id = ut.promotion_id " + "WHERE p.type = 0)", + table_name_, + table_name_, + table_name_); + + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + + transaction->commands.push_back(std::move(command)); + + const std::string temp_table_name = base::StringPrintf( + "%s_temp", + table_name_); + + if (!RenameDBTable(transaction, table_name_, temp_table_name)) { + return false; + } + + query = + "DROP INDEX IF EXISTS unblinded_tokens_promotion_id_index;"; + command = ledger::DBCommand::New(); + command->type = ledger::DBCommand::Type::EXECUTE; + command->command = query; + transaction->commands.push_back(std::move(command)); + + if (!CreateTableV18(transaction)) { + return false; + } + + if (!CreateIndexV18(transaction)) { + return false; + } + + const std::map columns = { + { "token_id", "token_id" }, + { "token_value", "token_value" }, + { "public_key", "public_key" }, + { "value", "value" }, + { "creds_id", "creds_id" }, + { "expires_at", "expires_at" }, + { "created_at", "created_at" } + }; + + if (!MigrateDBTable( + transaction, + temp_table_name, + table_name_, + columns, + true)) { + return false; + } + return true; +} + void DatabaseUnblindedToken::InsertOrUpdateList( ledger::UnblindedTokenList list, ledger::ResultCallback callback) { @@ -214,8 +326,8 @@ void DatabaseUnblindedToken::InsertOrUpdateList( const std::string query = base::StringPrintf( "INSERT OR REPLACE INTO %s " - "(token_id, token_value, public_key, value, promotion_id) " - "VALUES (?, ?, ?, ?, ?)", + "(token_id, token_value, public_key, value, creds_id, expires_at) " + "VALUES (?, ?, ?, ?, ?, ?)", table_name_); for (const auto& info : list) { @@ -232,7 +344,8 @@ void DatabaseUnblindedToken::InsertOrUpdateList( BindString(command.get(), 1, info->token_value); BindString(command.get(), 2, info->public_key); BindDouble(command.get(), 3, info->value); - BindString(command.get(), 4, info->promotion_id); + BindString(command.get(), 4, info->creds_id); + BindInt64(command.get(), 5, info->expires_at); transaction->commands.push_back(std::move(command)); } @@ -249,9 +362,8 @@ void DatabaseUnblindedToken::GetAllRecords( auto transaction = ledger::DBTransaction::New(); const std::string query = base::StringPrintf( - "SELECT u.token_id, u.token_value, u.public_key, u.value, " - "u.promotion_id, p.expires_at, p.type FROM %s as u " - "LEFT JOIN promotion as p ON p.promotion_id = u.promotion_id", + "SELECT token_id, token_value, public_key, value, creds_id, " + "expires_at FROM %s", table_name_); auto command = ledger::DBCommand::New(); @@ -264,26 +376,24 @@ void DatabaseUnblindedToken::GetAllRecords( ledger::DBCommand::RecordBindingType::STRING_TYPE, ledger::DBCommand::RecordBindingType::DOUBLE_TYPE, ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::INT64_TYPE, - ledger::DBCommand::RecordBindingType::INT_TYPE + ledger::DBCommand::RecordBindingType::INT64_TYPE }; transaction->commands.push_back(std::move(command)); - auto transaction_callback = - std::bind(&DatabaseUnblindedToken::OnGetAllRecords, - this, - _1, - callback); + auto transaction_callback = std::bind(&DatabaseUnblindedToken::OnGetRecords, + this, + _1, + callback); ledger_->RunDBTransaction(std::move(transaction), transaction_callback); } -void DatabaseUnblindedToken::OnGetAllRecords( +void DatabaseUnblindedToken::OnGetRecords( ledger::DBCommandResponsePtr response, ledger::GetUnblindedTokenListCallback callback) { - if (!response - || response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { + if (!response || + response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { callback({}); return; } @@ -297,10 +407,8 @@ void DatabaseUnblindedToken::OnGetAllRecords( info->token_value = GetStringColumn(record_pointer, 1); info->public_key = GetStringColumn(record_pointer, 2); info->value = GetDoubleColumn(record_pointer, 3); - info->promotion_id = GetStringColumn(record_pointer, 4); - info->expires_at = GetExpirationDate( - GetIntColumn(record_pointer, 6), - GetInt64Column(record_pointer, 5)); + info->creds_id = GetStringColumn(record_pointer, 4); + info->expires_at = GetInt64Column(record_pointer, 5); list.push_back(std::move(info)); } @@ -308,38 +416,42 @@ void DatabaseUnblindedToken::OnGetAllRecords( callback(std::move(list)); } -void DatabaseUnblindedToken::DeleteRecordList( - const std::vector& ids, - ledger::ResultCallback callback) { - if (ids.empty()) { - callback(ledger::Result::LEDGER_ERROR); +void DatabaseUnblindedToken::GetRecordsByTriggerIds( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback callback) { + if (trigger_ids.empty()) { + callback({}); return; } auto transaction = ledger::DBTransaction::New(); const std::string query = base::StringPrintf( - "DELETE FROM %s WHERE token_id IN (%s)", + "SELECT token_id, token_value, public_key, value, creds_id, " + "expires_at FROM %s as ut" + "INNER JOIN creds_batch as cb ON cb.creds_id = ut.creds_id " + "WHERE cb.trigger_id IN (%s)", table_name_, - GenerateStringInCase(ids).c_str()); + GenerateStringInCase(trigger_ids).c_str()); auto command = ledger::DBCommand::New(); - command->type = ledger::DBCommand::Type::EXECUTE; + command->type = ledger::DBCommand::Type::RUN; command->command = query; transaction->commands.push_back(std::move(command)); - auto transaction_callback = std::bind(&OnResultCallback, + auto transaction_callback = std::bind(&DatabaseUnblindedToken::OnGetRecords, + this, _1, callback); ledger_->RunDBTransaction(std::move(transaction), transaction_callback); } -void DatabaseUnblindedToken::DeleteRecordsForPromotion( - const std::string& promotion_id, +void DatabaseUnblindedToken::DeleteRecordList( + const std::vector& ids, ledger::ResultCallback callback) { - if (promotion_id.empty()) { + if (ids.empty()) { callback(ledger::Result::LEDGER_ERROR); return; } @@ -347,15 +459,14 @@ void DatabaseUnblindedToken::DeleteRecordsForPromotion( auto transaction = ledger::DBTransaction::New(); const std::string query = base::StringPrintf( - "DELETE FROM %s WHERE promotion_id = ?", - table_name_); + "DELETE FROM %s WHERE token_id IN (%s)", + table_name_, + GenerateStringInCase(ids).c_str()); auto command = ledger::DBCommand::New(); - command->type = ledger::DBCommand::Type::RUN; + command->type = ledger::DBCommand::Type::EXECUTE; command->command = query; - BindString(command.get(), 0, promotion_id); - transaction->commands.push_back(std::move(command)); auto transaction_callback = std::bind(&OnResultCallback, @@ -365,69 +476,30 @@ void DatabaseUnblindedToken::DeleteRecordsForPromotion( ledger_->RunDBTransaction(std::move(transaction), transaction_callback); } -void DatabaseUnblindedToken::GetRecordsByPromotionType( - const std::vector& promotion_types, - ledger::GetUnblindedTokenListCallback callback) { - DCHECK(!promotion_types.empty()); - auto transaction = ledger::DBTransaction::New(); - std::vector in_case; +void DatabaseUnblindedToken::CheckRecordsExpiration( + ledger::ResultCallback callback) { + const uint64_t current_time = + static_cast(base::Time::Now().ToDoubleT()); - for (const auto& type : promotion_types) { - in_case.push_back(std::to_string(static_cast(type))); - } + auto transaction = ledger::DBTransaction::New(); const std::string query = base::StringPrintf( - "SELECT u.token_id, u.token_value, u.public_key, u.value FROM %s as u " - "INNER JOIN promotion as p ON p.promotion_id = u.promotion_id " - "WHERE p.type IN (%s)", - table_name_, - base::JoinString(in_case, ",").c_str()); + "DELETE FROM %s WHERE expires_at < ?", + table_name_); auto command = ledger::DBCommand::New(); - command->type = ledger::DBCommand::Type::READ; + command->type = ledger::DBCommand::Type::RUN; command->command = query; - command->record_bindings = { - ledger::DBCommand::RecordBindingType::INT64_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::STRING_TYPE, - ledger::DBCommand::RecordBindingType::DOUBLE_TYPE - }; + BindInt64(command.get(), 0, current_time); transaction->commands.push_back(std::move(command)); - auto transaction_callback = - std::bind(&DatabaseUnblindedToken::OnGetRecordsByPromotionType, - this, - _1, - callback); + auto transaction_callback = std::bind(&OnResultCallback, + _1, + callback); ledger_->RunDBTransaction(std::move(transaction), transaction_callback); } -void DatabaseUnblindedToken::OnGetRecordsByPromotionType( - ledger::DBCommandResponsePtr response, - ledger::GetUnblindedTokenListCallback callback) { - if (!response - || response->status != ledger::DBCommandResponse::Status::RESPONSE_OK) { - callback({}); - return; - } - - ledger::UnblindedTokenList list; - for (auto const& record : response->result->get_records()) { - auto info = ledger::UnblindedToken::New(); - auto* record_pointer = record.get(); - - info->id = GetInt64Column(record_pointer, 0); - info->token_value = GetStringColumn(record_pointer, 1); - info->public_key = GetStringColumn(record_pointer, 2); - info->value = GetDoubleColumn(record_pointer, 3); - - list.push_back(std::move(info)); - } - - callback(std::move(list)); -} - } // namespace braveledger_database diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.h b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.h index 5bada264c9ff..b4a35ba552ea 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token.h @@ -26,38 +26,38 @@ class DatabaseUnblindedToken: public DatabaseTable { void GetAllRecords(ledger::GetUnblindedTokenListCallback callback); + void GetRecordsByTriggerIds( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback callback); + void DeleteRecordList( const std::vector& ids, ledger::ResultCallback callback); - void DeleteRecordsForPromotion( - const std::string& promotion_id, - ledger::ResultCallback callback); - - void GetRecordsByPromotionType( - const std::vector& promotion_types, - ledger::GetUnblindedTokenListCallback callback); + void CheckRecordsExpiration(ledger::ResultCallback callback); private: bool CreateTableV10(ledger::DBTransaction* transaction); bool CreateTableV15(ledger::DBTransaction* transaction); + bool CreateTableV18(ledger::DBTransaction* transaction); + bool CreateIndexV10(ledger::DBTransaction* transaction); bool CreateIndexV15(ledger::DBTransaction* transaction); + bool CreateIndexV18(ledger::DBTransaction* transaction); + bool MigrateToV10(ledger::DBTransaction* transaction); bool MigrateToV14(ledger::DBTransaction* transaction); bool MigrateToV15(ledger::DBTransaction* transaction); - void OnGetAllRecords( - ledger::DBCommandResponsePtr response, - ledger::GetUnblindedTokenListCallback callback); + bool MigrateToV18(ledger::DBTransaction* transaction); - void OnGetRecordsByPromotionType( + void OnGetRecords( ledger::DBCommandResponsePtr response, ledger::GetUnblindedTokenListCallback callback); }; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_util.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_util.cc index 74b011dabbc1..06ac45e57859 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_util.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/database/database_util.cc @@ -11,7 +11,7 @@ namespace { -const int kCurrentVersionNumber = 17; +const int kCurrentVersionNumber = 18; const int kCompatibleVersionNumber = 1; } // namespace 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 48fdfd899f69..f79664fd1927 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 @@ -1583,10 +1583,10 @@ void LedgerImpl::DeleteUnblindedTokens( bat_database_->DeleteUnblindedTokens(id_list, callback); } -void LedgerImpl::DeleteUnblindedTokensForPromotion( - const std::string& promotion_id, - ledger::ResultCallback callback) { - bat_database_->DeleteUnblindedTokensForPromotion(promotion_id, callback); +void LedgerImpl::GetUnblindedTokensByTriggerIds( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback callback) { + bat_database_->GetUnblindedTokensByTriggerIds(trigger_ids, callback); } ledger::ClientInfoPtr LedgerImpl::GetClientInfo() { @@ -1683,10 +1683,76 @@ void LedgerImpl::TransferTokens( bat_promotion_->TransferTokens(std::move(wallet), callback); } -void LedgerImpl::GetUnblindedTokensByPromotionType( - const std::vector& promotion_types, - ledger::GetUnblindedTokenListCallback callback) { - bat_database_->GetUnblindedTokensByPromotionType(promotion_types, callback); +void LedgerImpl::SaveCredsBatch( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback) { + bat_database_->SaveCredsBatch(std::move(info), callback); +} + +void LedgerImpl::SavePromotionClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback) { + bat_database_->SavePromotionClaimId(promotion_id, claim_id, callback); +} + +void LedgerImpl::GetCredsBatchByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback) { + bat_database_->GetCredsBatchByTrigger(trigger_id, trigger_type, callback); +} + +void LedgerImpl::SaveSignedCreds( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback) { + bat_database_->SaveSignedCreds(std::move(info), callback); +} + +void LedgerImpl::UpdatePromotionStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback) { + bat_database_->UpdatePromotionStatus(promotion_id, status, callback); +} + +void LedgerImpl::PromotionCredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback) { + bat_database_->PromotionCredentialCompleted(promotion_id, callback); +} + +void LedgerImpl::GetAllCredsBatches(ledger::GetAllCredsBatchCallback callback) { + bat_database_->GetAllCredsBatches(callback); +} + +void LedgerImpl::GetPromotionList( + const std::vector& ids, + ledger::GetPromotionListCallback callback) { + bat_database_->GetPromotionList(ids, callback); +} + +void LedgerImpl::GetPromotionListByType( + const std::vector& types, + ledger::GetPromotionListCallback callback) { + bat_database_->GetPromotionListByType(types, callback); +} + +void LedgerImpl::CheckUnblindedTokensExpiration( + ledger::ResultCallback callback) { + bat_database_->CheckUnblindedTokensExpiration(callback); +} + +void LedgerImpl::UpdateCredsBatchStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback) { + bat_database_->UpdateCredsBatchStatus( + trigger_id, + trigger_type, + status, + callback); } } // namespace bat_ledger 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 33bd791f69a3..729001602a28 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 @@ -631,9 +631,9 @@ class LedgerImpl : public ledger::Ledger, const std::vector& id_list, ledger::ResultCallback callback); - void DeleteUnblindedTokensForPromotion( - const std::string& promotion_id, - ledger::ResultCallback callback); + void GetUnblindedTokensByTriggerIds( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback callback); ledger::ClientInfoPtr GetClientInfo(); @@ -691,9 +691,50 @@ class LedgerImpl : public ledger::Ledger, ledger::ExternalWalletPtr wallet, ledger::ResultCallback callback); - void GetUnblindedTokensByPromotionType( - const std::vector& promotion_types, - ledger::GetUnblindedTokenListCallback callback); + void SaveCredsBatch( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback); + + void SavePromotionClaimId( + const std::string& promotion_id, + const std::string& claim_id, + ledger::ResultCallback callback); + + void GetCredsBatchByTrigger( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + ledger::GetCredsBatchCallback callback); + + void SaveSignedCreds( + ledger::CredsBatchPtr info, + ledger::ResultCallback callback); + + void UpdatePromotionStatus( + const std::string& promotion_id, + const ledger::PromotionStatus status, + ledger::ResultCallback callback); + + void PromotionCredentialCompleted( + const std::string& promotion_id, + ledger::ResultCallback callback); + + void GetAllCredsBatches(ledger::GetAllCredsBatchCallback callback); + + void GetPromotionList( + const std::vector& ids, + ledger::GetPromotionListCallback callback); + + void GetPromotionListByType( + const std::vector& types, + ledger::GetPromotionListCallback callback); + + void CheckUnblindedTokensExpiration(ledger::ResultCallback callback); + + void UpdateCredsBatchStatus( + const std::string& trigger_id, + const ledger::CredsBatchType trigger_type, + const ledger::CredsBatchStatus status, + ledger::ResultCallback callback); private: void InitializeConfirmations( 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 0a99c05e94d6..c857333657fe 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 @@ -590,8 +590,9 @@ class MockLedgerImpl : public LedgerImpl { MOCK_METHOD1(GetAnonWalletStatus, void(ledger::ResultCallback)); - MOCK_METHOD2(DeleteUnblindedTokensForPromotion, - void(const std::string& promotion_id, ledger::ResultCallback)); + MOCK_METHOD2(GetUnblindedTokensByTriggerIds, void( + const std::vector& trigger_ids, + ledger::GetUnblindedTokenListCallback)); MOCK_METHOD2(GetContributionInfo, void( const std::string& contribution_id, 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 f89c474224c3..728d8f945551 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 @@ -22,8 +22,8 @@ #include "bat/ledger/internal/request/promotion_requests.h" #include "bat/ledger/internal/request/request_util.h" #include "bat/ledger/internal/common/bind_util.h" -#include "bat/ledger/internal/common/security_helper.h" #include "bat/ledger/internal/common/time_util.h" +#include "bat/ledger/internal/credentials/credentials_util.h" #include "bat/ledger/internal/promotion/promotion_util.h" #include "bat/ledger/internal/promotion/promotion_transfer.h" #include "brave_base/random.h" @@ -46,7 +46,7 @@ namespace braveledger_promotion { namespace { void HandleExpiredPromotions( - bat_ledger::LedgerImpl* ledger, + bat_ledger::LedgerImpl* ledger_impl, ledger::PromotionMap* promotions) { DCHECK(promotions); if (!promotions) { @@ -56,8 +56,9 @@ void HandleExpiredPromotions( const uint64_t current_time = static_cast(base::Time::Now().ToDoubleT()); + bool check = false; for (auto& item : *promotions) { - if (!item.second) { + if (!item.second || item.second->status == ledger::PromotionStatus::OVER) { continue; } @@ -68,12 +69,17 @@ void HandleExpiredPromotions( if (item.second->expires_at > 0 && item.second->expires_at <= current_time) { - item.second->status = ledger::PromotionStatus::OVER; - - ledger->DeleteUnblindedTokensForPromotion(item.second->id, + check = true; + ledger_impl->UpdatePromotionStatus( + item.second->id, + ledger::PromotionStatus::OVER, [](const ledger::Result _){}); } } + + if (check) { + ledger_impl->CheckUnblindedTokensExpiration([](const ledger::Result _){}); + } } } // namespace @@ -83,6 +89,11 @@ Promotion::Promotion(bat_ledger::LedgerImpl* ledger) : (ledger)), transfer_(std::make_unique(ledger)), ledger_(ledger) { + DCHECK(ledger_); + credentials_ = braveledger_credentials::CredentialsFactory::Create( + ledger_, + ledger::CredsBatchType::PROMOTION); + DCHECK(credentials_); } Promotion::~Promotion() = default; @@ -93,7 +104,7 @@ void Promotion::Initialize() { this, _1); - ledger_->GetAllPromotions(check_callback); + ledger_->GetAllCredsBatches(check_callback); } auto retry_callback = std::bind(&Promotion::Retry, @@ -244,7 +255,7 @@ void Promotion::LegacyClaimedSaved( auto promotion_ptr = braveledger_bind_util::FromStringToPromotion(promotion_string); - ClaimTokens(std::move(promotion_ptr), [](const ledger::Result _){}); + GetCredentials(std::move(promotion_ptr), [](const ledger::Result _){}); } void Promotion::Claim( @@ -294,7 +305,7 @@ void Promotion::OnCompletedAttestation( return; } - if (promotion->status == ledger::PromotionStatus::CLAIMED) { + if (promotion->status == ledger::PromotionStatus::FINISHED) { BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Promotions already claimed"; callback(ledger::Result::GRANT_ALREADY_CLAIMED, nullptr); return; @@ -335,7 +346,7 @@ void Promotion::AttestedSaved( promotion_ptr->id, callback); - ClaimTokens(std::move(promotion_ptr), claim_callback); + GetCredentials(std::move(promotion_ptr), claim_callback); } void Promotion::Complete( @@ -393,6 +404,50 @@ void Promotion::OnTimer(const uint32_t timer_id) { } } +void Promotion::GetCredentials( + ledger::PromotionPtr promotion, + ledger::ResultCallback callback) { + if (!promotion) { + BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Promotion is null"; + callback(ledger::Result::LEDGER_ERROR); + return; + } + + braveledger_credentials::CredentialsTrigger trigger; + trigger.id = promotion->id; + trigger.size = promotion->suggestions; + trigger.type = ledger::CredsBatchType::PROMOTION; + + auto creds_callback = std::bind(&Promotion::CredentialsProcessed, + this, + _1, + promotion->id, + callback); + + credentials_->Start(trigger, creds_callback); +} + +void Promotion::CredentialsProcessed( + const ledger::Result result, + const std::string& promotion_id, + ledger::ResultCallback callback) { + if (result == ledger::Result::RETRY) { + ledger_->SetTimer(5, &retry_timer_id_); + callback(ledger::Result::LEDGER_OK); + return; + } + + if (result != ledger::Result::LEDGER_OK) { + callback(result); + return; + } + + ledger_->UpdatePromotionStatus( + promotion_id, + ledger::PromotionStatus::FINISHED, + callback); +} + void Promotion::Retry(ledger::PromotionMap promotions) { HandleExpiredPromotions(ledger_, &promotions); @@ -403,19 +458,9 @@ void Promotion::Retry(ledger::PromotionMap promotions) { switch (promotion.second->status) { case ledger::PromotionStatus::ATTESTED: { - ClaimTokens(promotion.second->Clone(), [](const ledger::Result _){}); - break; - } - case ledger::PromotionStatus::CLAIMED: { - FetchSignedTokens( - promotion.second->Clone(), - [](const ledger::Result _){}); - break; - } - case ledger::PromotionStatus::SIGNED_TOKENS: { - OnProcessSignedCredentials( - promotion.second->Clone(), - [](const ledger::Result _){}); + GetCredentials( + std::move(promotion.second), + [](const ledger::Result _){}); break; } case ledger::PromotionStatus::ACTIVE: @@ -461,403 +506,61 @@ void Promotion::Refresh(const bool retry_after_error) { ledger_->SetTimer(start_timer_in, &last_check_timer_id_); } -void Promotion::ClaimTokens( - ledger::PromotionPtr promotion, - ledger::ResultCallback callback) { - if (!promotion) { - callback(ledger::Result::LEDGER_ERROR); +void Promotion::CheckForCorrupted(ledger::CredsBatchList list) { + if (list.empty()) { return; } - if (!promotion->credentials) { - promotion->credentials = ledger::PromotionCreds::New(); - } - - const auto tokens = - braveledger_helper::Security::GenerateTokens(promotion->suggestions); - - base::Value tokens_list(base::Value::Type::LIST); - for (auto & token : tokens) { - auto token_base64 = token.encode_base64(); - auto token_value = base::Value(token_base64); - tokens_list.GetList().push_back(std::move(token_value)); - } - std::string json_tokens; - base::JSONWriter::Write(tokens_list, &json_tokens); - - const auto blinded_tokens = - braveledger_helper::Security::BlindTokens(tokens); - - if (blinded_tokens.empty()) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Blinded tokens are empty"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - const std::string payment_id = ledger_->GetPaymentId(); - - base::Value blinded_list(base::Value::Type::LIST); - for (auto & token : blinded_tokens) { - auto token_base64 = token.encode_base64(); - auto token_value = base::Value(token_base64); - blinded_list.GetList().push_back(std::move(token_value)); - } - std::string json_blinded; - base::JSONWriter::Write(blinded_list, &json_blinded); - - promotion->credentials->tokens = json_tokens; - promotion->credentials->blinded_creds = json_blinded; - - auto save_callback = std::bind(&Promotion::ClaimTokensSaved, - this, - _1, - braveledger_bind_util::FromPromotionToString(promotion->Clone()), - callback); - - ledger_->SavePromotion(promotion->Clone(), save_callback); -} - -void Promotion::ClaimTokensSaved( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback) { - if (result != ledger::Result::LEDGER_OK) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Save failed"; - callback(result); - return; - } - - auto promotion = - braveledger_bind_util::FromStringToPromotion(promotion_string); - - if (!promotion) { - callback(ledger::Result::LEDGER_ERROR); - return; - } - - auto blinded_tokens = ParseStringToBaseList( - promotion->credentials->blinded_creds); - - if (!blinded_tokens) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) - << "Blinded tokens are corrupted"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - base::Value body(base::Value::Type::DICTIONARY); - body.SetStringKey("paymentId", ledger_->GetPaymentId()); - body.SetKey("blindedCreds", base::Value(std::move(*blinded_tokens))); - - std::string json; - base::JSONWriter::Write(body, &json); - - ledger::WalletInfoProperties wallet_info = ledger_->GetWalletInfo(); - - const auto headers = braveledger_request_util::BuildSignHeaders( - "post /v1/promotions/" + promotion->id, - json, - ledger_->GetPaymentId(), - wallet_info.key_info_seed); - - const std::string url = - braveledger_request_util::ClaimTokensUrl(promotion->id); - auto url_callback = std::bind(&Promotion::OnClaimTokens, - this, - _1, - _2, - _3, - braveledger_bind_util::FromPromotionToString(std::move(promotion)), - callback); - - ledger_->LoadURL( - url, - headers, - json, - "application/json; charset=utf-8", - ledger::UrlMethod::POST, - url_callback); -} - -void Promotion::OnClaimTokens( - const int response_status_code, - const std::string& response, - const std::map& headers, - const std::string& promotion_string, - ledger::ResultCallback callback) { - ledger_->LogResponse(__func__, response_status_code, response, headers); - auto promotion = - braveledger_bind_util::FromStringToPromotion(promotion_string); - - if (response_status_code != net::HTTP_OK || !promotion) { - callback(ledger::Result::LEDGER_ERROR); - return; - } - - const auto claim_id = ParseClaimTokenResponse(response); - - if (claim_id.empty() || !promotion->credentials) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - promotion->status = ledger::PromotionStatus::CLAIMED; - promotion->credentials->claim_id = claim_id; - - auto save_callback = std::bind(&Promotion::ClaimedTokensSaved, - this, - _1, - braveledger_bind_util::FromPromotionToString(promotion->Clone()), - callback); - - ledger_->SavePromotion(promotion->Clone(), save_callback); -} - -void Promotion::ClaimedTokensSaved( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback) { - if (result != ledger::Result::LEDGER_OK) { - ledger_->SetTimer(brave_base::random::Geometric(60), &retry_timer_id_); - return; - } - - auto promotion = - braveledger_bind_util::FromStringToPromotion(promotion_string); - - FetchSignedTokens(std::move(promotion), callback); -} - -void Promotion::FetchSignedTokens( - ledger::PromotionPtr promotion, - ledger::ResultCallback callback) { - if (!promotion || !promotion->credentials) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - const std::string url = braveledger_request_util::FetchSignedTokensUrl( - promotion->id, - promotion->credentials->claim_id); - auto url_callback = std::bind(&Promotion::OnFetchSignedTokens, - this, - _1, - _2, - _3, - braveledger_bind_util::FromPromotionToString(std::move(promotion)), - callback); - - ledger_->LoadURL( - url, - std::vector(), - "", - "", - ledger::UrlMethod::GET, - url_callback); -} - -void Promotion::OnFetchSignedTokens( - const int response_status_code, - const std::string& response, - const std::map& headers, - const std::string& promotion_string, - ledger::ResultCallback callback) { - ledger_->LogResponse(__func__, response_status_code, response, headers); - auto promotion = - braveledger_bind_util::FromStringToPromotion(promotion_string); - - if (response_status_code == net::HTTP_ACCEPTED) { - callback(ledger::Result::LEDGER_OK); - ledger_->SetTimer(5, &retry_timer_id_); - return; - } - - if (!promotion || - !promotion->credentials || - response_status_code != net::HTTP_OK) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Corrupted data"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - base::Value parsed_response(base::Value::Type::DICTIONARY); - ParseSignedTokensResponse(response, &parsed_response); - - if (parsed_response.DictSize() != 3) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Parsing failed"; - callback(ledger::Result::LEDGER_ERROR); - return; - } - - std::string json_creds; - base::JSONWriter::Write( - *parsed_response.FindListKey("signed_creds"), - &json_creds); - promotion->credentials->signed_creds = json_creds; - promotion->credentials->public_key = - *parsed_response.FindStringKey("public_key"); - promotion->credentials->batch_proof = - *parsed_response.FindStringKey("batch_proof"); - - promotion->status = ledger::PromotionStatus::SIGNED_TOKENS; - - auto process_callback = - std::bind(&Promotion::ProcessSignedCredentials, - this, - _1, - promotion->id, - callback); - - ledger_->SavePromotion( - promotion->Clone(), - process_callback); -} - -void Promotion::ProcessSignedCredentials( - const ledger::Result result, - const std::string& promotion_id, - ledger::ResultCallback callback) { - if (result != ledger::Result::LEDGER_OK) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Save failed"; - callback(result); - return; - } - - auto promotion_callback = std::bind(&Promotion::OnProcessSignedCredentials, - this, - _1, - callback); - - ledger_->GetPromotion(promotion_id, promotion_callback); -} - -void Promotion::OnProcessSignedCredentials( - ledger::PromotionPtr promotion, - ledger::ResultCallback callback) { - if (!promotion) { - callback(ledger::Result::LEDGER_ERROR); - return; - } - - bool result = VerifyPublicKey(promotion->Clone()); + std::vector corrupted_promotions; - if (!result) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) - << "Public key verification failed"; - callback(ledger::Result::LEDGER_ERROR); - return; - } + for (auto& item : list) { + if (!item || + (item->status != ledger::CredsBatchStatus::SIGNED && + item->status != ledger::CredsBatchStatus::FINISHED)) { + continue; + } - std::vector unblinded_encoded_tokens; - std::string error; - if (ledger::is_testing) { - result = UnBlindTokensMock(promotion->Clone(), &unblinded_encoded_tokens); - } else { - result = UnBlindTokens( - promotion->Clone(), + std::vector unblinded_encoded_tokens; + std::string error; + bool result = braveledger_credentials::UnBlindCreds( + *item, &unblinded_encoded_tokens, &error); - } - - const auto signed_creds = ParseStringToBaseList( - promotion->credentials->signed_creds); - if (!result) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "UnBlindTokens: " << error; - callback(ledger::Result::LEDGER_ERROR); - return; + if (!result) { + BLOG(ledger_, ledger::LogLevel::LOG_INFO) + << "Promotion corrupted " << item->trigger_id; + corrupted_promotions.push_back(item->trigger_id); + } } - SaveUnblindedTokens(std::move(promotion), unblinded_encoded_tokens, callback); -} - -void Promotion::SaveUnblindedTokens( - ledger::PromotionPtr promotion, - const std::vector& unblinded_encoded_tokens, - ledger::ResultCallback callback) { - if (!promotion) { - callback(ledger::Result::LEDGER_ERROR); + if (corrupted_promotions.empty()) { + ledger_->SetBooleanState(ledger::kStatePromotionCorruptedMigrated, true); return; } - const double value = promotion->approximate_value / promotion->suggestions; - ledger::UnblindedTokenList list; - for (auto & token : unblinded_encoded_tokens) { - auto token_info = ledger::UnblindedToken::New(); - token_info->token_value = token; - token_info->public_key = promotion->credentials->public_key; - token_info->value = value; - token_info->promotion_id = promotion->id; - list.push_back(std::move(token_info)); - } - - auto save_callback = std::bind(&Promotion::FinishPromotion, + auto get_callback = std::bind(&Promotion::CorruptedPromotions, this, _1, - braveledger_bind_util::FromPromotionToString(std::move(promotion)), - callback); - - ledger_->SaveUnblindedTokenList(std::move(list), save_callback); -} - -void Promotion::FinishPromotion( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback) { - if (result != ledger::Result::LEDGER_OK) { - BLOG(ledger_, ledger::LogLevel::LOG_ERROR) << "Save failed"; - callback(result); - return; - } - - auto promotion = - braveledger_bind_util::FromStringToPromotion(promotion_string); - - if (!promotion) { - callback(ledger::Result::LEDGER_ERROR); - return; - } + corrupted_promotions); - const uint64_t current_time = - static_cast(base::Time::Now().ToDoubleT()); - promotion->status = ledger::PromotionStatus::FINISHED; - promotion->claimed_at = current_time; - ledger_->SavePromotion( - std::move(promotion), - [](const ledger::Result _){}); - callback(ledger::Result::LEDGER_OK); - ledger_->UnblindedTokensReady(); + ledger_->GetPromotionList(corrupted_promotions, get_callback); } -void Promotion::CheckForCorrupted(const ledger::PromotionMap& promotions) { +void Promotion::CorruptedPromotions( + ledger::PromotionList promotions, + const std::vector& ids) { base::Value corrupted_claims(base::Value::Type::LIST); - std::vector corrupted_promotions; - for (auto & item : promotions) { - if (!item.second || !item.second->credentials) { + for (auto& item : promotions) { + if (!item) { continue; } - const auto signed_creds = ParseStringToBaseList( - item.second->credentials->signed_creds); - - std::vector unblinded_encoded_tokens; - std::string error; - bool result = - UnBlindTokens(item.second->Clone(), &unblinded_encoded_tokens, &error); - if (!result) { - BLOG(ledger_, ledger::LogLevel::LOG_INFO) - << "Promotion corrupted " << item.second->id; - corrupted_claims.GetList().push_back( - base::Value(item.second->credentials->claim_id)); - corrupted_promotions.push_back(item.second->id); - } + corrupted_claims.Append(base::Value(item->claim_id)); } if (corrupted_claims.GetList().empty()) { - ledger_->SetBooleanState(ledger::kStatePromotionCorruptedMigrated, true); return; } @@ -874,7 +577,7 @@ void Promotion::CheckForCorrupted(const ledger::PromotionMap& promotions) { _1, _2, _3, - corrupted_promotions); + ids); ledger_->LoadURL( url, 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 5caf960a4c2e..b964018e3aae 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 @@ -14,6 +14,7 @@ #include "bat/ledger/ledger.h" #include "bat/ledger/mojom_structs.h" #include "bat/ledger/internal/attestation/attestation_impl.h" +#include "bat/ledger/internal/credentials/credentials_factory.h" namespace bat_ledger { class LedgerImpl; @@ -45,10 +46,6 @@ class Promotion { void OnTimer(const uint32_t timer_id); - void ClaimTokens( - ledger::PromotionPtr promotion, - ledger::ResultCallback callback); - void TransferTokens( ledger::ExternalWalletPtr wallet, ledger::ResultCallback callback); @@ -98,56 +95,22 @@ class Promotion { ledger::PromotionList promotions, ledger::FetchPromotionCallback callback); - void Retry(ledger::PromotionMap promotions); - - void OnClaimTokens( - const int response_status_code, - const std::string& response, - const std::map& headers, - const std::string& promotion_string, - ledger::ResultCallback callback); - - void ClaimedTokensSaved( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback); - - void ClaimTokensSaved( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback); - - void FetchSignedTokens( + void GetCredentials( ledger::PromotionPtr promotion, ledger::ResultCallback callback); - void OnFetchSignedTokens( - const int response_status_code, - const std::string& response, - const std::map& headers, - const std::string& promotion_string, - ledger::ResultCallback callback); - - void ProcessSignedCredentials( + void CredentialsProcessed( const ledger::Result result, const std::string& promotion_id, ledger::ResultCallback callback); - void OnProcessSignedCredentials( - ledger::PromotionPtr promotion, - ledger::ResultCallback callback); - - void SaveUnblindedTokens( - ledger::PromotionPtr promotion, - const std::vector& unblinded_encoded_tokens, - ledger::ResultCallback callback); + void Retry(ledger::PromotionMap promotions); - void FinishPromotion( - const ledger::Result result, - const std::string& promotion_string, - ledger::ResultCallback callback); + void CheckForCorrupted(ledger::CredsBatchList list); - void CheckForCorrupted(const ledger::PromotionMap& promotions); + void CorruptedPromotions( + ledger::PromotionList promotions, + const std::vector& ids); void OnCheckForCorrupted( const int response_status_code, @@ -159,6 +122,7 @@ class Promotion { std::unique_ptr attestation_; std::unique_ptr transfer_; + std::unique_ptr credentials_; bat_ledger::LedgerImpl* ledger_; // NOT OWNED uint32_t last_check_timer_id_; uint32_t retry_timer_id_; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.cc index 5177d9145d21..d344aa8221f1 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.cc @@ -34,7 +34,7 @@ void PromotionTransfer::Start( ledger::ResultCallback callback) { // we only need to call old anon api once if (ledger_->GetBooleanState(ledger::kStateAnonTransferChecked)) { - GetEligibleTokens(callback); + GetEligiblePromotion(callback); return; } @@ -65,19 +65,40 @@ void PromotionTransfer::OnAnonExternalWallet( } ledger_->SetBooleanState(ledger::kStateAnonTransferChecked, true); - GetEligibleTokens(callback); + GetEligiblePromotion(callback); } -void PromotionTransfer::GetEligibleTokens(ledger::ResultCallback callback) { - auto tokens_callback = std::bind(&PromotionTransfer::SendTokens, +void PromotionTransfer::GetEligiblePromotion(ledger::ResultCallback callback) { + auto tokens_callback = std::bind(&PromotionTransfer::GetEligibleTokens, this, _1, callback); - ledger_->GetUnblindedTokensByPromotionType( + ledger_->GetPromotionListByType( GetEligiblePromotions(), tokens_callback); } +void PromotionTransfer::GetEligibleTokens( + ledger::PromotionList promotions, + ledger::ResultCallback callback) { + auto tokens_callback = std::bind(&PromotionTransfer::SendTokens, + this, + _1, + callback); + + std::vector ids; + for (auto& promotion : promotions) { + if (!promotion) { + continue; + } + + ids.push_back(promotion->id); + } + + ledger_->GetUnblindedTokensByTriggerIds( + ids, + tokens_callback); +} void PromotionTransfer::SendTokens( ledger::UnblindedTokenList list, diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.h b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.h index 00b9c70e50a8..bf8459e9ce24 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion_transfer.h @@ -30,7 +30,11 @@ class PromotionTransfer { const ledger::Result result, ledger::ResultCallback callback); - void GetEligibleTokens(ledger::ResultCallback callback); + void GetEligiblePromotion(ledger::ResultCallback callback); + + void GetEligibleTokens( + ledger::PromotionList promotions, + ledger::ResultCallback callback); void SendTokens( ledger::UnblindedTokenList list, 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 063274b7c35f..c7bca5edc0b2 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 @@ -10,15 +10,6 @@ #include "base/json/json_writer.h" #include "base/time/time.h" -#include "wrapper.hpp" // NOLINT - -using challenge_bypass_ristretto::BatchDLEQProof; -using challenge_bypass_ristretto::BlindedToken; -using challenge_bypass_ristretto::PublicKey; -using challenge_bypass_ristretto::SignedToken; -using challenge_bypass_ristretto::Token; -using challenge_bypass_ristretto::UnblindedToken; - namespace braveledger_promotion { std::string ParseOSToString(ledger::OperatingSystem os) { @@ -192,201 +183,6 @@ bool ParseFetchResponse( return true; } -std::string ParseClaimTokenResponse( - const std::string& response) { - base::Optional value = base::JSONReader::Read(response); - if (!value || !value->is_dict()) { - return ""; - } - - base::DictionaryValue* dictionary = nullptr; - if (!value->GetAsDictionary(&dictionary)) { - return ""; - } - - auto* id = dictionary->FindStringKey("claimId"); - if (!id) { - return ""; - } - - return *id; -} - -void ParseSignedTokensResponse( - const std::string& response, - base::Value* result) { - base::Optional value = base::JSONReader::Read(response); - if (!value || !value->is_dict()) { - return; - } - - base::DictionaryValue* dictionary = nullptr; - if (!value->GetAsDictionary(&dictionary)) { - return; - } - - auto* batch_proof = dictionary->FindStringKey("batchProof"); - if (!batch_proof) { - return; - } - - auto* signed_creds = dictionary->FindListKey("signedCreds"); - if (!signed_creds) { - return; - } - - auto* public_key = dictionary->FindStringKey("publicKey"); - if (!public_key) { - return; - } - - result->SetStringKey("batch_proof", *batch_proof); - result->SetStringKey("public_key", *public_key); - result->SetKey("signed_creds", base::Value(signed_creds->GetList())); -} - -std::unique_ptr ParseStringToBaseList( - const std::string& string_list) { - base::Optional value = base::JSONReader::Read(string_list); - if (!value || !value->is_list()) { - return std::make_unique(); - } - - return std::make_unique(value->GetList()); -} - -bool UnBlindTokens( - ledger::PromotionPtr promotion, - std::vector* unblinded_encoded_tokens, - std::string* error) { - DCHECK(error); - if ( - !promotion || - !promotion->credentials || - !unblinded_encoded_tokens) { - return false; - } - - auto batch_proof = - BatchDLEQProof::decode_base64(promotion->credentials->batch_proof); - - if (challenge_bypass_ristretto::exception_occurred()) { - challenge_bypass_ristretto::TokenException e = - challenge_bypass_ristretto::get_last_exception(); - *error = std::string(e.what()); - return false; - } - - auto tokens_base64 = ParseStringToBaseList(promotion->credentials->tokens); - std::vector tokens; - for (auto& item : *tokens_base64) { - const auto token = Token::decode_base64(item.GetString()); - tokens.push_back(token); - } - - if (challenge_bypass_ristretto::exception_occurred()) { - challenge_bypass_ristretto::TokenException e = - challenge_bypass_ristretto::get_last_exception(); - *error = std::string(e.what()); - return false; - } - - auto blinded_tokens_base64 = ParseStringToBaseList( - promotion->credentials->blinded_creds); - std::vector blinded_tokens; - for (auto& item : *blinded_tokens_base64) { - const auto blinded_token = BlindedToken::decode_base64(item.GetString()); - blinded_tokens.push_back(blinded_token); - } - - if (challenge_bypass_ristretto::exception_occurred()) { - challenge_bypass_ristretto::TokenException e = - challenge_bypass_ristretto::get_last_exception(); - *error = std::string(e.what()); - return false; - } - - auto signed_tokens_base64 = ParseStringToBaseList( - promotion->credentials->signed_creds); - std::vector signed_tokens; - for (auto& item : *signed_tokens_base64) { - const auto signed_token = SignedToken::decode_base64(item.GetString()); - signed_tokens.push_back(signed_token); - } - - if (challenge_bypass_ristretto::exception_occurred()) { - challenge_bypass_ristretto::TokenException e = - challenge_bypass_ristretto::get_last_exception(); - *error = std::string(e.what()); - return false; - } - - const auto public_key = PublicKey::decode_base64( - promotion->credentials->public_key); - - auto unblinded_tokens = batch_proof.verify_and_unblind( - tokens, - blinded_tokens, - signed_tokens, - public_key); - - if (challenge_bypass_ristretto::exception_occurred()) { - challenge_bypass_ristretto::TokenException e = - challenge_bypass_ristretto::get_last_exception(); - *error = std::string(e.what()); - return false; - } - - for (auto& token : unblinded_tokens) { - unblinded_encoded_tokens->push_back(token.encode_base64()); - } - - if (signed_tokens.size() != unblinded_encoded_tokens->size()) { - *error = "Unblinded tokens size does not match signed tokens sent in!"; - return false; - } - - return true; -} - -bool UnBlindTokensMock( - ledger::PromotionPtr promotion, - std::vector* unblinded_encoded_tokens) { - if (!promotion || !promotion->credentials || !unblinded_encoded_tokens) { - return false; - } - - auto signed_tokens_base64 = ParseStringToBaseList( - promotion->credentials->signed_creds); - - for (auto& item : *signed_tokens_base64) { - unblinded_encoded_tokens->push_back(item.GetString()); - } - - return true; -} - -bool VerifyPublicKey(const ledger::PromotionPtr promotion) { - if (!promotion || !promotion->credentials) { - return false; - } - - auto promotion_keys = ParseStringToBaseList(promotion->public_keys); - - if (!promotion_keys) { - return false; - } - - - for (auto& item : *promotion_keys) { - if (item.GetString() == promotion->credentials->public_key) { - return true; - } - } - - return false; -} - std::vector GetEligiblePromotions() { return { ledger::PromotionType::ADS 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 33e4f8f80c86..74500b21ab95 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 @@ -11,7 +11,6 @@ #include #include "bat/ledger/mojom_structs.h" -#include "base/values.h" namespace braveledger_promotion { @@ -28,27 +27,6 @@ bool ParseFetchResponse( const std::string& response, ledger::PromotionList* list); -std::string ParseClaimTokenResponse( - const std::string& response); - -void ParseSignedTokensResponse( - const std::string& response, - base::Value* result); - -std::unique_ptr ParseStringToBaseList( - const std::string& string_list); - -bool UnBlindTokens( - ledger::PromotionPtr promotion, - std::vector* unblinded_encoded_tokens, - std::string* error); - -bool UnBlindTokensMock( - ledger::PromotionPtr promotion, - std::vector* unblinded_encoded_tokens); - -bool VerifyPublicKey(const ledger::PromotionPtr promotion); - std::vector GetEligiblePromotions(); } // namespace braveledger_promotion diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.cc index 06e184d7deb5..98f130a900d6 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.cc @@ -27,14 +27,14 @@ std::string GetFetchPromotionUrl( return BuildUrl(path, PREFIX_V1, ServerTypes::kPromotion); } -std::string ClaimTokensUrl(const std::string& promotion_id) { +std::string ClaimCredsUrl(const std::string& promotion_id) { const std::string& path = base::StringPrintf( "/promotions/%s", promotion_id.c_str()); return BuildUrl(path, PREFIX_V1, ServerTypes::kPromotion); } -std::string FetchSignedTokensUrl( +std::string FetchSignedCredsUrl( const std::string& promotion_id, const std::string& claim_id) { const std::string& path = base::StringPrintf( diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.h b/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.h index d60ab4e80234..9c31802db99f 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/request/promotion_requests.h @@ -14,9 +14,9 @@ std::string GetFetchPromotionUrl( const std::string& payment_id, const std::string& platform); -std::string ClaimTokensUrl(const std::string& promotion_id); +std::string ClaimCredsUrl(const std::string& promotion_id); -std::string FetchSignedTokensUrl( +std::string FetchSignedCredsUrl( const std::string& promotion_id, const std::string& claim_id);