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

Side by Side Diff: chrome/browser/extensions/install_verifier.cc

Issue 133273016: Fix extension install verification for v1 packaged apps (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/install_verifier.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 // the "MAX" item below should always be the last element. 116 // the "MAX" item below should always be the last element.
117 117
118 INIT_RESULT_MAX 118 INIT_RESULT_MAX
119 }; 119 };
120 120
121 void LogInitResultHistogram(InitResult result) { 121 void LogInitResultHistogram(InitResult result) {
122 UMA_HISTOGRAM_ENUMERATION("ExtensionInstallVerifier.InitResult", 122 UMA_HISTOGRAM_ENUMERATION("ExtensionInstallVerifier.InitResult",
123 result, INIT_RESULT_MAX); 123 result, INIT_RESULT_MAX);
124 } 124 }
125 125
126 bool FromStore(const Extension& extension) {
127 bool updates_from_store = ManifestURL::UpdatesFromGallery(&extension);
128 return extension.from_webstore() || updates_from_store;
129 }
130
131 bool CanUseExtensionApis(const Extension& extension) {
132 return extension.is_extension() || extension.is_legacy_packaged_app();
133 }
134
126 } // namespace 135 } // namespace
127 136
137 // static
138 bool InstallVerifier::NeedsVerification(const Extension& extension) {
139 return FromStore(extension) && CanUseExtensionApis(extension);
140 }
141
128 void InstallVerifier::Init() { 142 void InstallVerifier::Init() {
129 const base::DictionaryValue* pref = prefs_->GetInstallSignature(); 143 const base::DictionaryValue* pref = prefs_->GetInstallSignature();
130 if (pref) { 144 if (pref) {
131 scoped_ptr<InstallSignature> signature_from_prefs = 145 scoped_ptr<InstallSignature> signature_from_prefs =
132 InstallSignature::FromValue(*pref); 146 InstallSignature::FromValue(*pref);
133 if (!signature_from_prefs.get()) { 147 if (!signature_from_prefs.get()) {
134 LogInitResultHistogram(INIT_UNPARSEABLE_PREF); 148 LogInitResultHistogram(INIT_UNPARSEABLE_PREF);
135 } else if (!InstallSigner::VerifySignature(*signature_from_prefs.get())) { 149 } else if (!InstallSigner::VerifySignature(*signature_from_prefs.get())) {
136 LogInitResultHistogram(INIT_INVALID_SIGNATURE); 150 LogInitResultHistogram(INIT_INVALID_SIGNATURE);
137 DVLOG(1) << "Init - ignoring invalid signature"; 151 DVLOG(1) << "Init - ignoring invalid signature";
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 235
222 operation_queue_.push(linked_ptr<PendingOperation>(operation)); 236 operation_queue_.push(linked_ptr<PendingOperation>(operation));
223 if (operation_queue_.size() == 1) 237 if (operation_queue_.size() == 1)
224 BeginFetch(); 238 BeginFetch();
225 } 239 }
226 240
227 std::string InstallVerifier::GetDebugPolicyProviderName() const { 241 std::string InstallVerifier::GetDebugPolicyProviderName() const {
228 return std::string("InstallVerifier"); 242 return std::string("InstallVerifier");
229 } 243 }
230 244
231 static bool FromStore(const Extension* extension) {
232 bool updates_from_store = ManifestURL::UpdatesFromGallery(extension);
233 return extension->from_webstore() || updates_from_store;
234 }
235
236 namespace { 245 namespace {
237 246
238 enum MustRemainDisabledOutcome { 247 enum MustRemainDisabledOutcome {
239 VERIFIED = 0, 248 VERIFIED = 0,
240 NOT_EXTENSION, 249 NOT_EXTENSION,
241 UNPACKED, 250 UNPACKED,
242 ENTERPRISE_POLICY_ALLOWED, 251 ENTERPRISE_POLICY_ALLOWED,
243 FORCED_NOT_VERIFIED, 252 FORCED_NOT_VERIFIED,
244 NOT_FROM_STORE, 253 NOT_FROM_STORE,
245 NO_SIGNATURE, 254 NO_SIGNATURE,
246 NOT_VERIFIED_BUT_NOT_ENFORCING, 255 NOT_VERIFIED_BUT_NOT_ENFORCING,
247 NOT_VERIFIED, 256 NOT_VERIFIED,
248 257
249 // This is used in histograms - do not remove or reorder entries above! Also 258 // This is used in histograms - do not remove or reorder entries above! Also
250 // the "MAX" item below should always be the last element. 259 // the "MAX" item below should always be the last element.
251 260
252 MUST_REMAIN_DISABLED_OUTCOME_MAX 261 MUST_REMAIN_DISABLED_OUTCOME_MAX
253 }; 262 };
254 263
255 void MustRemainDisabledHistogram(MustRemainDisabledOutcome outcome) { 264 void MustRemainDisabledHistogram(MustRemainDisabledOutcome outcome) {
256 UMA_HISTOGRAM_ENUMERATION("ExtensionInstallVerifier.MustRemainDisabled", 265 UMA_HISTOGRAM_ENUMERATION("ExtensionInstallVerifier.MustRemainDisabled",
257 outcome, MUST_REMAIN_DISABLED_OUTCOME_MAX); 266 outcome, MUST_REMAIN_DISABLED_OUTCOME_MAX);
258 } 267 }
259 268
260 } // namespace 269 } // namespace
261 270
262 bool InstallVerifier::MustRemainDisabled(const Extension* extension, 271 bool InstallVerifier::MustRemainDisabled(const Extension* extension,
263 Extension::DisableReason* reason, 272 Extension::DisableReason* reason,
264 base::string16* error) const { 273 base::string16* error) const {
265 if (!extension->is_extension()) { 274 CHECK(extension);
275 if (!CanUseExtensionApis(*extension)) {
266 MustRemainDisabledHistogram(NOT_EXTENSION); 276 MustRemainDisabledHistogram(NOT_EXTENSION);
267 return false; 277 return false;
268 } 278 }
269 if (Manifest::IsUnpackedLocation(extension->location())) { 279 if (Manifest::IsUnpackedLocation(extension->location())) {
270 MustRemainDisabledHistogram(UNPACKED); 280 MustRemainDisabledHistogram(UNPACKED);
271 return false; 281 return false;
272 } 282 }
273 if (AllowedByEnterprisePolicy(extension->id())) { 283 if (AllowedByEnterprisePolicy(extension->id())) {
274 MustRemainDisabledHistogram(ENTERPRISE_POLICY_ALLOWED); 284 MustRemainDisabledHistogram(ENTERPRISE_POLICY_ALLOWED);
275 return false; 285 return false;
276 } 286 }
277 287
278 bool verified = true; 288 bool verified = true;
279 MustRemainDisabledOutcome outcome = VERIFIED; 289 MustRemainDisabledOutcome outcome = VERIFIED;
280 if (ContainsKey(InstallSigner::GetForcedNotFromWebstore(), extension->id())) { 290 if (ContainsKey(InstallSigner::GetForcedNotFromWebstore(), extension->id())) {
281 verified = false; 291 verified = false;
282 outcome = FORCED_NOT_VERIFIED; 292 outcome = FORCED_NOT_VERIFIED;
283 } else if (!FromStore(extension)) { 293 } else if (!FromStore(*extension)) {
284 verified = false; 294 verified = false;
285 outcome = NOT_FROM_STORE; 295 outcome = NOT_FROM_STORE;
286 } else if (signature_.get() == NULL) { 296 } else if (signature_.get() == NULL) {
287 // If we don't have a signature yet, we'll temporarily consider every 297 // If we don't have a signature yet, we'll temporarily consider every
288 // extension from the webstore verified to avoid false positives on existing 298 // extension from the webstore verified to avoid false positives on existing
289 // profiles hitting this code for the first time, and rely on consumers of 299 // profiles hitting this code for the first time, and rely on consumers of
290 // this class to check NeedsBootstrap() and schedule a first check so we can 300 // this class to check NeedsBootstrap() and schedule a first check so we can
291 // get a signature. 301 // get a signature.
292 outcome = NO_SIGNATURE; 302 outcome = NO_SIGNATURE;
293 } else if (!IsVerified(extension->id())) { 303 } else if (!IsVerified(extension->id())) {
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 if (!operation->callback.is_null()) 475 if (!operation->callback.is_null())
466 operation->callback.Run(success); 476 operation->callback.Run(success);
467 } 477 }
468 478
469 if (!operation_queue_.empty()) 479 if (!operation_queue_.empty())
470 BeginFetch(); 480 BeginFetch();
471 } 481 }
472 482
473 483
474 } // namespace extensions 484 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/install_verifier.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698