Chromium Code Reviews| Index: components/payments/content/payment_manifest_section_table.cc |
| diff --git a/components/payments/content/payment_manifest_section_table.cc b/components/payments/content/payment_manifest_section_table.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ccd901d302dc69d3499172d294cbbd27bd42e225 |
| --- /dev/null |
| +++ b/components/payments/content/payment_manifest_section_table.cc |
| @@ -0,0 +1,162 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/payments/content/payment_manifest_section_table.h" |
| + |
| +#include "base/logging.h" |
| +#include "sql/statement.h" |
| + |
| +namespace payments { |
| +namespace { |
|
please use gerrit instead
2017/04/05 20:33:30
Newline after "namespace {".
gogerald1
2017/04/05 23:38:48
Done.
|
| +// Note that the finger print is calculated with SHA-256. |
| +const uint32_t kFingerPrintLength = 32; |
|
please use gerrit instead
2017/04/05 20:33:30
size_t
gogerald1
2017/04/05 23:38:48
Done.
|
| + |
| +WebDatabaseTable::TypeKey GetKey() { |
| + // We just need a unique constant. Use the address of a static that |
| + // COMDAT folding won't touch in an optimizing linker. |
| + static int table_key = 0; |
| + return reinterpret_cast<void*>(&table_key); |
|
please use gerrit instead
2017/04/05 20:33:31
Shouldn't you cast to WebDatabaseTable::TypeKey?
gogerald1
2017/04/05 23:38:48
WebDatabaseTable::TypeKey is a void pointer in ess
|
| +} |
| +} |
|
please use gerrit instead
2017/04/05 20:33:31
Newline before "}" and add a comment " // namespa
gogerald1
2017/04/05 23:38:48
Done.
|
| + |
| +PaymentManifestSectionTable::PaymentManifestSectionTable() {} |
| + |
| +PaymentManifestSectionTable::~PaymentManifestSectionTable() {} |
| + |
| +PaymentManifestSectionTable* PaymentManifestSectionTable::FromWebDatabase( |
| + WebDatabase* db) { |
| + return static_cast<PaymentManifestSectionTable*>(db->GetTable(GetKey())); |
| +} |
| + |
| +WebDatabaseTable::TypeKey PaymentManifestSectionTable::GetTypeKey() const { |
| + return GetKey(); |
| +} |
| + |
| +bool PaymentManifestSectionTable::CreateTablesIfNecessary() { |
| + if (!db_->DoesTableExist("payment_manifest_section")) { |
| + if (!db_->Execute("CREATE TABLE payment_manifest_section ( " |
| + "method_name VARCHAR, " |
| + "package_name VARCHAR, " |
| + "version INTEGER NOT NULL DEFAULT 0, " |
| + "finger_prints BLOB) ")) { |
| + NOTREACHED(); |
| + return false; |
| + } |
| + } |
| + |
| + return true; |
| +} |
| + |
| +bool PaymentManifestSectionTable::IsSyncable() { |
| + return false; |
| +} |
| + |
| +bool PaymentManifestSectionTable::MigrateToVersion( |
| + int version, |
| + bool* update_compatible_version) { |
| + return true; |
| +} |
| + |
| +bool PaymentManifestSectionTable::AddPaymentManifestSections( |
| + std::string& method_name, |
| + std::vector<mojom::PaymentManifestSectionPtr>& manifest) { |
| + sql::Statement s1(db_->GetUniqueStatement( |
|
please use gerrit instead
2017/04/05 20:33:30
Use a transaction to group these statements togeth
gogerald1
2017/04/05 23:38:48
Done.
|
| + "DELETE FROM payment_manifest_section WHERE method_name=?")); |
| + s1.BindString(0, method_name); |
| + |
| + if (!s1.Run()) { |
|
please use gerrit instead
2017/04/05 20:33:31
No need for {} on a single-line body of an if-stat
gogerald1
2017/04/05 23:38:48
It's this true? long time ago (> 1 year) when I am
|
| + return false; |
| + } |
| + |
| + sql::Statement s2(db_->GetUniqueStatement( |
| + "INSERT INTO payment_manifest_section " |
| + "(method_name, package_name, version, finger_prints) " |
| + "VALUES (?, ?, ?, ?)")); |
| + for (size_t i = 0; i < manifest.size(); i++) { |
| + int index = 0; |
| + s2.BindString(index++, method_name); |
| + s2.BindString(index++, manifest[i]->package_name); |
| + s2.BindInt64(index++, manifest[i]->version); |
| + |
| + std::unique_ptr<std::vector<uint8_t>> serialized_finger_prints = |
| + SerializeFingerPrints(manifest[i]->sha256_cert_fingerprints); |
| + s2.BindBlob(index, serialized_finger_prints->data(), |
| + serialized_finger_prints->size()); |
| + |
| + s2.Run(); |
|
please use gerrit instead
2017/04/05 20:33:30
Check for error.
gogerald1
2017/04/05 23:38:48
Done.
|
| + s2.Reset(true); |
| + } |
| + |
| + return true; |
| +} |
| + |
| +std::vector<mojom::PaymentManifestSectionPtr> |
| +PaymentManifestSectionTable::GetPaymentManifestSections( |
| + std::string& method_name) { |
| + std::vector<mojom::PaymentManifestSectionPtr> manifest; |
| + sql::Statement s( |
| + db_->GetUniqueStatement("SELECT package_name, version, finger_prints " |
| + "FROM payment_manifest_section " |
| + "WHERE method_name=?")); |
| + s.BindString(0, method_name); |
| + |
| + if (!s.is_valid()) { |
|
please use gerrit instead
2017/04/05 20:33:30
No {}.
gogerald1
2017/04/05 23:38:48
Done.
please use gerrit instead
2017/04/06 14:35:28
Not yet.
gogerald1
2017/04/06 16:42:09
Done.
|
| + return manifest; |
| + } |
| + |
| + while (s.Step()) { |
| + mojom::PaymentManifestSectionPtr section = |
| + mojom::PaymentManifestSection::New(); |
| + |
| + int index = 0; |
| + section->package_name = s.ColumnString(index++); |
| + section->version = s.ColumnInt64(index++); |
| + |
| + std::vector<uint8_t> finger_prints; |
| + if (!s.ColumnBlobAsVector(index, &finger_prints)) { |
| + NOTREACHED(); |
| + continue; |
| + } |
| + DeserializeFingerPrints(finger_prints, section->sha256_cert_fingerprints); |
| + |
| + manifest.push_back(std::move(section)); |
| + } |
| + |
| + return manifest; |
| +} |
| + |
| +std::unique_ptr<std::vector<uint8_t>> |
| +PaymentManifestSectionTable::SerializeFingerPrints( |
| + const std::vector<std::vector<uint8_t>>& finger_prints) { |
| + std::unique_ptr<std::vector<uint8_t>> serialized_finger_prints( |
| + new std::vector<uint8_t>()); |
|
please use gerrit instead
2017/04/05 20:33:30
base::MakeUnique.
gogerald1
2017/04/05 23:38:49
Done.
|
| + |
| + if (finger_prints.empty()) { |
| + return serialized_finger_prints; |
| + } |
|
please use gerrit instead
2017/04/05 20:33:30
This if statement is not useful, because the for l
gogerald1
2017/04/05 23:38:48
Done.
|
| + |
| + for (auto finger_print : finger_prints) { |
|
please use gerrit instead
2017/04/05 20:33:30
const auto&
gogerald1
2017/04/05 23:38:49
Done.
|
| + DCHECK(finger_print.size() == kFingerPrintLength); |
| + for (auto value : finger_print) { |
| + serialized_finger_prints->push_back(value); |
| + } |
|
please use gerrit instead
2017/04/05 20:33:30
Replace this for loop with:
serialized_finger_pri
gogerald1
2017/04/05 23:38:48
Done.
|
| + } |
| + |
| + return serialized_finger_prints; |
| +} |
| + |
| +void PaymentManifestSectionTable::DeserializeFingerPrints( |
| + const std::vector<uint8_t>& finger_prints, |
| + std::vector<std::vector<uint8_t>>& deserialized_finger_prints) { |
| + DCHECK(finger_prints.size() % kFingerPrintLength == 0); |
|
please use gerrit instead
2017/04/05 20:33:30
Don't trust anything that comes from disk. If this
gogerald1
2017/04/05 23:38:48
Done.
|
| + for (size_t i = 0; i < finger_prints.size();) { |
| + std::vector<uint8_t> finger_print; |
| + for (uint32_t j = 0; j < kFingerPrintLength; j++) { |
| + finger_print.push_back(finger_prints[i + j]); |
| + } |
| + deserialized_finger_prints.push_back(finger_print); |
| + i += kFingerPrintLength; |
| + } |
|
please use gerrit instead
2017/04/05 20:33:31
You can do this loop easier:
for (size_t i = 0; i
gogerald1
2017/04/05 23:38:48
Done.
|
| +} |
|
please use gerrit instead
2017/04/05 20:33:30
Newline below.
gogerald1
2017/04/05 23:38:49
Done.
|
| +} // payments |