Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10988)

Unified Diff: chrome/browser/extensions/install_signer.cc

Issue 189003004: Fix install verification for sideloaded extensions without update urls (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added comment Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/install_signer.h ('k') | chrome/browser/extensions/install_verifier.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/install_signer.cc
diff --git a/chrome/browser/extensions/install_signer.cc b/chrome/browser/extensions/install_signer.cc
index d7f74c01740528db33f354c3a8a52c21ca2c53e4..8a80bfcf229b4667b70caab66a9dc1ebfbf47236 100644
--- a/chrome/browser/extensions/install_signer.cc
+++ b/chrome/browser/extensions/install_signer.cc
@@ -48,8 +48,14 @@ const char kInvalidIdsKey[] = "invalid_ids";
const char kProtocolVersionKey[] = "protocol_version";
const char kSaltKey[] = "salt";
const char kSignatureKey[] = "signature";
+const char kSignatureFormatVersionKey[] = "signature_format_version";
const char kTimestampKey[] = "timestamp";
+// This allows us to version the format of what we write into the prefs,
+// allowing for forward migration, as well as detecting forwards/backwards
+// incompatabilities, etc.
+const int kSignatureFormatVersion = 2;
+
const size_t kSaltBytes = 32;
const char kBackendUrl[] =
@@ -109,6 +115,39 @@ bool ValidateExpireDateFormat(const std::string& input) {
return true;
}
+// Sets the value of |key| in |dictionary| to be a list with the contents of
+// |ids|.
+void SetExtensionIdSet(base::DictionaryValue* dictionary,
+ const char* key,
+ const ExtensionIdSet& ids) {
+ base::ListValue* id_list = new base::ListValue();
+ for (ExtensionIdSet::const_iterator i = ids.begin(); i != ids.end(); ++i)
+ id_list->AppendString(*i);
+ dictionary->Set(key, id_list);
+}
+
+// Tries to fetch a list of strings from |dictionay| for |key|, and inserts
+// them into |ids|. The return value indicates success/failure. Note: on
+// failure, |ids| might contain partial results, for instance if some of the
+// members of the list were not strings.
+bool GetExtensionIdSet(const base::DictionaryValue& dictionary,
+ const char* key,
+ ExtensionIdSet* ids) {
+ const base::ListValue* id_list = NULL;
+ if (!dictionary.GetList(key, &id_list))
+ return false;
+ for (base::ListValue::const_iterator i = id_list->begin();
+ i != id_list->end();
+ ++i) {
+ std::string id;
+ if (!(*i)->GetAsString(&id)) {
+ return false;
+ }
+ ids->insert(id);
+ }
+ return true;
+}
+
} // namespace
namespace extensions {
@@ -121,12 +160,9 @@ InstallSignature::~InstallSignature() {
void InstallSignature::ToValue(base::DictionaryValue* value) const {
CHECK(value);
- base::ListValue* id_list = new base::ListValue();
- for (ExtensionIdSet::const_iterator i = ids.begin(); i != ids.end();
- ++i)
- id_list->AppendString(*i);
-
- value->Set(kIdsKey, id_list);
+ value->SetInteger(kSignatureFormatVersionKey, kSignatureFormatVersion);
+ SetExtensionIdSet(value, kIdsKey, ids);
+ SetExtensionIdSet(value, kInvalidIdsKey, invalid_ids);
value->SetString(kExpireDateKey, expire_date);
std::string salt_base64;
std::string signature_base64;
@@ -144,6 +180,15 @@ scoped_ptr<InstallSignature> InstallSignature::FromValue(
scoped_ptr<InstallSignature> result(new InstallSignature);
+ // For now we don't want to support any backwards compability, but in the
+ // future if we do, we would want to put the migration code here.
+ int format_version = 0;
+ if (!value.GetInteger(kSignatureFormatVersionKey, &format_version) ||
+ format_version != kSignatureFormatVersion) {
+ result.reset();
+ return result.Pass();
+ }
+
std::string salt_base64;
std::string signature_base64;
if (!value.GetString(kExpireDateKey, &result->expire_date) ||
@@ -168,21 +213,12 @@ scoped_ptr<InstallSignature> InstallSignature::FromValue(
result->timestamp = base::Time::FromInternalValue(timestamp_value);
}
- const base::ListValue* ids = NULL;
- if (!value.GetList(kIdsKey, &ids)) {
+ if (!GetExtensionIdSet(value, kIdsKey, &result->ids) ||
+ !GetExtensionIdSet(value, kInvalidIdsKey, &result->invalid_ids)) {
result.reset();
return result.Pass();
}
- for (base::ListValue::const_iterator i = ids->begin(); i != ids->end(); ++i) {
- std::string id;
- if (!(*i)->GetAsString(&id)) {
- result.reset();
- return result.Pass();
- }
- result->ids.insert(id);
- }
-
return result.Pass();
}
@@ -360,6 +396,7 @@ void InstallSigner::GetSignature(const SignatureCallback& callback) {
url_fetcher_->SetUploadData("application/json", json);
LogRequestStartHistograms();
request_start_time_ = base::Time::Now();
+ VLOG(1) << "Sending request: " << json;
url_fetcher_->Start();
}
@@ -384,6 +421,7 @@ void InstallSigner::ParseFetchResponse() {
ReportErrorViaCallback();
return;
}
+ VLOG(1) << "Got response: " << response;
// The response is JSON of the form:
// {
@@ -451,6 +489,7 @@ void InstallSigner::HandleSignatureResult(const std::string& signature,
if (!signature.empty()) {
result.reset(new InstallSignature);
result->ids = valid_ids;
+ result->invalid_ids = invalid_ids;
result->salt = salt_;
result->signature = signature;
result->expire_date = expire_date;
« no previous file with comments | « chrome/browser/extensions/install_signer.h ('k') | chrome/browser/extensions/install_verifier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698