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

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

Issue 10399069: Reland 137540 - Disable off-store extension installs by default. Also get rid of ExtensionService::… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/extension_service.h" 5 #include "chrome/browser/extensions/extension_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 // source. In this case, signal that this extension will not be 250 // source. In this case, signal that this extension will not be
251 // installed by returning false. 251 // installed by returning false.
252 if (!pending_extension_manager()->AddFromExternalUpdateUrl( 252 if (!pending_extension_manager()->AddFromExternalUpdateUrl(
253 id, update_url, location)) 253 id, update_url, location))
254 return false; 254 return false;
255 255
256 update_once_all_providers_are_ready_ = true; 256 update_once_all_providers_are_ready_ = true;
257 return true; 257 return true;
258 } 258 }
259 259
260 // If a download url matches one of these patterns and has a referrer of the
261 // webstore, then we're willing to treat that as a gallery download.
262 static const char* kAllowedDownloadURLPatterns[] = {
263 "https://clients2.google.com/service/update2*",
264 "https://clients2.googleusercontent.com/crx/*"
265 };
266
267 bool ExtensionService::IsDownloadFromGallery(const GURL& download_url,
268 const GURL& referrer_url) {
269 const Extension* download_extension =
270 extensions_.GetHostedAppByURL(ExtensionURLInfo(download_url));
271 const Extension* referrer_extension =
272 extensions_.GetHostedAppByURL(ExtensionURLInfo(referrer_url));
273 const Extension* webstore_app = GetWebStoreApp();
274
275 bool referrer_valid = (referrer_extension == webstore_app);
276 bool download_valid = (download_extension == webstore_app);
277
278 // We also allow the download to be from a small set of trusted paths.
279 if (!download_valid) {
280 for (size_t i = 0; i < arraysize(kAllowedDownloadURLPatterns); i++) {
281 URLPattern pattern(URLPattern::SCHEME_HTTPS,
282 kAllowedDownloadURLPatterns[i]);
283 if (pattern.MatchesURL(download_url)) {
284 download_valid = true;
285 break;
286 }
287 }
288 }
289
290 // If the command-line gallery URL is set, then be a bit more lenient.
291 GURL store_url =
292 GURL(CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
293 switches::kAppsGalleryURL));
294 if (!store_url.is_empty()) {
295 std::string store_tld =
296 net::RegistryControlledDomainService::GetDomainAndRegistry(store_url);
297 if (!referrer_valid) {
298 std::string referrer_tld =
299 net::RegistryControlledDomainService::GetDomainAndRegistry(
300 referrer_url);
301 // The referrer gets stripped when transitioning from https to http,
302 // or when hitting an unknown test cert and that commonly happens in
303 // testing environments. Given this, we allow an empty referrer when
304 // the command-line flag is set.
305 // Otherwise, the TLD must match the TLD of the command-line url.
306 referrer_valid = referrer_url.is_empty() || (referrer_tld == store_tld);
307 }
308
309 if (!download_valid) {
310 std::string download_tld =
311 net::RegistryControlledDomainService::GetDomainAndRegistry(
312 download_url);
313
314 // Otherwise, the TLD must match the TLD of the command-line url.
315 download_valid = (download_tld == store_tld);
316 }
317 }
318
319 return (referrer_valid && download_valid);
320 }
321
322 const Extension* ExtensionService::GetInstalledApp(const GURL& url) { 260 const Extension* ExtensionService::GetInstalledApp(const GURL& url) {
323 const Extension* extension = extensions_.GetExtensionOrAppByURL( 261 const Extension* extension = extensions_.GetExtensionOrAppByURL(
324 ExtensionURLInfo(url)); 262 ExtensionURLInfo(url));
325 if (extension && extension->is_app()) 263 if (extension && extension->is_app())
326 return extension; 264 return extension;
327 265
328 return NULL; 266 return NULL;
329 } 267 }
330 268
331 bool ExtensionService::IsInstalledApp(const GURL& url) { 269 bool ExtensionService::IsInstalledApp(const GURL& url) {
(...skipping 1963 matching lines...) Expand 10 before | Expand all | Expand 10 after
2295 const Extension* ExtensionService::GetTerminatedExtension( 2233 const Extension* ExtensionService::GetTerminatedExtension(
2296 const std::string& id) const { 2234 const std::string& id) const {
2297 return GetExtensionByIdInternal(id, false, false, true); 2235 return GetExtensionByIdInternal(id, false, false, true);
2298 } 2236 }
2299 2237
2300 const Extension* ExtensionService::GetInstalledExtension( 2238 const Extension* ExtensionService::GetInstalledExtension(
2301 const std::string& id) const { 2239 const std::string& id) const {
2302 return GetExtensionByIdInternal(id, true, true, true); 2240 return GetExtensionByIdInternal(id, true, true, true);
2303 } 2241 }
2304 2242
2305 const Extension* ExtensionService::GetWebStoreApp() {
2306 return GetExtensionById(extension_misc::kWebStoreAppId, false);
2307 }
2308
2309 bool ExtensionService::ExtensionBindingsAllowed(const GURL& url) { 2243 bool ExtensionService::ExtensionBindingsAllowed(const GURL& url) {
2310 // Allow bindings for all packaged extensions and component hosted apps. 2244 // Allow bindings for all packaged extensions and component hosted apps.
2311 const Extension* extension = extensions_.GetExtensionOrAppByURL( 2245 const Extension* extension = extensions_.GetExtensionOrAppByURL(
2312 ExtensionURLInfo(url)); 2246 ExtensionURLInfo(url));
2313 return extension && (!extension->is_hosted_app() || 2247 return extension && (!extension->is_hosted_app() ||
2314 extension->location() == Extension::COMPONENT); 2248 extension->location() == Extension::COMPONENT);
2315 } 2249 }
2316 2250
2317 const SkBitmap& ExtensionService::GetOmniboxIcon( 2251 const SkBitmap& ExtensionService::GetOmniboxIcon(
2318 const std::string& extension_id) { 2252 const std::string& extension_id) {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
2642 // To coexist with certain unit tests that don't have an IO thread message 2576 // To coexist with certain unit tests that don't have an IO thread message
2643 // loop available at ExtensionService shutdown, we lazy-initialize this 2577 // loop available at ExtensionService shutdown, we lazy-initialize this
2644 // object so that those cases neither create nor destroy an 2578 // object so that those cases neither create nor destroy an
2645 // APIResourceController. 2579 // APIResourceController.
2646 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 2580 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2647 if (!api_resource_controller_) { 2581 if (!api_resource_controller_) {
2648 api_resource_controller_ = new extensions::APIResourceController(); 2582 api_resource_controller_ = new extensions::APIResourceController();
2649 } 2583 }
2650 return api_resource_controller_; 2584 return api_resource_controller_;
2651 } 2585 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_service.h ('k') | chrome/browser/extensions/extension_webstore_private_api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698