Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/install_verifier.h" | 5 #include "chrome/browser/extensions/install_verifier.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 DVLOG(1) << "Init - ignoring invalid signature"; | 75 DVLOG(1) << "Init - ignoring invalid signature"; |
| 76 } else { | 76 } else { |
| 77 signature_ = signature_from_prefs.Pass(); | 77 signature_ = signature_from_prefs.Pass(); |
| 78 UMA_HISTOGRAM_COUNTS("InstallVerifier.InitGoodSignature", | 78 UMA_HISTOGRAM_COUNTS("InstallVerifier.InitGoodSignature", |
| 79 signature_->ids.size()); | 79 signature_->ids.size()); |
| 80 GarbageCollect(); | 80 GarbageCollect(); |
| 81 } | 81 } |
| 82 } else { | 82 } else { |
| 83 UMA_HISTOGRAM_BOOLEAN("InstallVerifier.InitNoSignature", true); | 83 UMA_HISTOGRAM_BOOLEAN("InstallVerifier.InitNoSignature", true); |
| 84 } | 84 } |
| 85 } | |
| 85 | 86 |
| 86 if (!signature_.get() && ShouldFetchSignature()) { | 87 bool InstallVerifier::NeedsBootstrap() { |
| 87 // We didn't have any signature but are in fetch mode, so do a request for | 88 return signature_.get() == NULL && ShouldFetchSignature(); |
| 88 // a signature if needed. | |
| 89 scoped_ptr<ExtensionPrefs::ExtensionsInfo> all_info = | |
| 90 prefs_->GetInstalledExtensionsInfo(); | |
| 91 ExtensionIdSet to_add; | |
| 92 if (all_info.get()) { | |
| 93 for (ExtensionPrefs::ExtensionsInfo::const_iterator i = all_info->begin(); | |
| 94 i != all_info->end(); ++i) { | |
| 95 const ExtensionInfo& info = **i; | |
| 96 const base::DictionaryValue* dictionary = info.extension_manifest.get(); | |
| 97 if (dictionary && ManifestURL::UpdatesFromGallery(dictionary)) { | |
| 98 Manifest manifest(info.extension_location, | |
| 99 scoped_ptr<DictionaryValue>( | |
| 100 dictionary->DeepCopy())); | |
| 101 if (manifest.is_extension()) | |
| 102 to_add.insert(info.extension_id); | |
| 103 } | |
| 104 } | |
| 105 } | |
| 106 if (to_add.empty()) { | |
| 107 // Write an empty signature so we don't have to redo this at next Init. | |
| 108 signature_.reset(new InstallSignature()); | |
| 109 SaveToPrefs(); | |
| 110 } else { | |
| 111 AddMany(to_add, AddResultCallback()); | |
| 112 } | |
| 113 } | |
| 114 } | 89 } |
| 115 | 90 |
| 116 void InstallVerifier::Add(const std::string& id, | 91 void InstallVerifier::Add(const std::string& id, |
| 117 const AddResultCallback& callback) { | 92 const AddResultCallback& callback) { |
| 118 ExtensionIdSet ids; | 93 ExtensionIdSet ids; |
| 119 ids.insert(id); | 94 ids.insert(id); |
| 120 AddMany(ids, callback); | 95 AddMany(ids, callback); |
| 121 } | 96 } |
| 122 | 97 |
| 123 void InstallVerifier::AddMany(const ExtensionIdSet& ids, | 98 void InstallVerifier::AddMany(const ExtensionIdSet& ids, |
| 124 const AddResultCallback& callback) { | 99 const AddResultCallback& callback) { |
| 125 if (!ShouldFetchSignature()) | 100 if (!ShouldFetchSignature()) { |
| 101 if (!callback.is_null()) | |
| 102 callback.Run(true); | |
| 126 return; | 103 return; |
| 104 } | |
| 127 | 105 |
| 128 if (signature_.get()) { | 106 if (signature_.get()) { |
| 129 ExtensionIdSet not_allowed_yet = | 107 ExtensionIdSet not_allowed_yet = |
| 130 base::STLSetDifference<ExtensionIdSet>(ids, signature_->ids); | 108 base::STLSetDifference<ExtensionIdSet>(ids, signature_->ids); |
| 131 if (not_allowed_yet.empty()) { | 109 if (not_allowed_yet.empty()) { |
| 132 if (!callback.is_null()) | 110 if (!callback.is_null()) |
| 133 callback.Run(true); | 111 callback.Run(true); |
| 134 return; | 112 return; |
| 135 } | 113 } |
| 136 } | 114 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 bool InstallVerifier::MustRemainDisabled(const Extension* extension, | 173 bool InstallVerifier::MustRemainDisabled(const Extension* extension, |
| 196 Extension::DisableReason* reason, | 174 Extension::DisableReason* reason, |
| 197 base::string16* error) const { | 175 base::string16* error) const { |
| 198 if (!ShouldEnforce() || !extension->is_extension() || | 176 if (!ShouldEnforce() || !extension->is_extension() || |
| 199 Manifest::IsUnpackedLocation(extension->location()) || | 177 Manifest::IsUnpackedLocation(extension->location()) || |
| 200 AllowedByEnterprisePolicy(extension->id())) | 178 AllowedByEnterprisePolicy(extension->id())) |
| 201 return false; | 179 return false; |
| 202 | 180 |
| 203 bool verified = | 181 bool verified = |
| 204 FromStore(extension) && | 182 FromStore(extension) && |
| 205 IsVerified(extension->id()) && | 183 (signature_.get() == NULL || IsVerified(extension->id())) && |
|
Finnur
2013/12/16 14:21:51
Wait... it is verified if there's no signature? Wh
asargent_no_longer_on_chrome
2013/12/16 18:47:10
It's temporarily allowed - the idea is that if som
| |
| 206 !ContainsKey(InstallSigner::GetForcedNotFromWebstore(), extension->id()); | 184 !ContainsKey(InstallSigner::GetForcedNotFromWebstore(), extension->id()); |
| 207 | 185 |
| 208 if (!verified) { | 186 if (!verified) { |
| 209 if (reason) | 187 if (reason) |
| 210 *reason = Extension::DISABLE_NOT_VERIFIED; | 188 *reason = Extension::DISABLE_NOT_VERIFIED; |
| 211 if (error) | 189 if (error) |
| 212 *error = l10n_util::GetStringFUTF16( | 190 *error = l10n_util::GetStringFUTF16( |
| 213 IDS_EXTENSIONS_ADDED_WITHOUT_KNOWLEDGE, | 191 IDS_EXTENSIONS_ADDED_WITHOUT_KNOWLEDGE, |
| 214 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE)); | 192 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE)); |
| 215 } | 193 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 340 } else { | 318 } else { |
| 341 signature_ = signature.Pass(); | 319 signature_ = signature.Pass(); |
| 342 SaveToPrefs(); | 320 SaveToPrefs(); |
| 343 | 321 |
| 344 if (!provisional_.empty()) { | 322 if (!provisional_.empty()) { |
| 345 // Update |provisional_| to remove ids that were successfully signed. | 323 // Update |provisional_| to remove ids that were successfully signed. |
| 346 provisional_ = base::STLSetDifference<ExtensionIdSet>( | 324 provisional_ = base::STLSetDifference<ExtensionIdSet>( |
| 347 provisional_, signature_->ids); | 325 provisional_, signature_->ids); |
| 348 } | 326 } |
| 349 | 327 |
| 350 // See if we were able to sign all of |ids|. | |
| 351 ExtensionIdSet not_allowed = | |
| 352 base::STLSetDifference<ExtensionIdSet>(operation->ids, | |
| 353 signature_->ids); | |
| 354 | |
| 355 UMA_HISTOGRAM_COUNTS_100("InstallVerifier.CallbackNotAllowed", | |
| 356 not_allowed.size()); | |
|
asargent_no_longer_on_chrome
2013/12/14 00:42:39
note: I removed this block of code because it was
| |
| 357 | |
| 358 if (!operation->callback.is_null()) | 328 if (!operation->callback.is_null()) |
| 359 operation->callback.Run(not_allowed.empty()); | 329 operation->callback.Run(success); |
|
asargent_no_longer_on_chrome
2013/12/14 00:42:39
This got updated to return the success of the netw
| |
| 360 } | 330 } |
| 361 | 331 |
| 362 if (!operation_queue_.empty()) | 332 if (!operation_queue_.empty()) |
| 363 BeginFetch(); | 333 BeginFetch(); |
| 364 } | 334 } |
| 365 | 335 |
| 366 | 336 |
| 367 } // namespace extensions | 337 } // namespace extensions |
| OLD | NEW |