Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 279 int loc2_rank = GetLocationRank(loc2); | 279 int loc2_rank = GetLocationRank(loc2); |
| 280 | 280 |
| 281 // If two different locations have the same rank, then we can not | 281 // If two different locations have the same rank, then we can not |
| 282 // deterministicly choose a location. | 282 // deterministicly choose a location. |
| 283 CHECK(loc1_rank != loc2_rank); | 283 CHECK(loc1_rank != loc2_rank); |
| 284 | 284 |
| 285 // Lowest rank has highest priority. | 285 // Lowest rank has highest priority. |
| 286 return (loc1_rank > loc2_rank ? loc1 : loc2 ); | 286 return (loc1_rank > loc2_rank ? loc1 : loc2 ); |
| 287 } | 287 } |
| 288 | 288 |
| 289 ExtensionPermissionMessages Extension::GetPermissionMessages() const { | |
| 290 if (IsTrustedId(id_)) | |
| 291 return ExtensionPermissionMessages(); | |
| 292 else | |
| 293 return permission_set_->GetPermissionMessages(); | |
| 294 } | |
| 295 | |
| 296 std::vector<string16> Extension::GetPermissionMessageStrings() const { | |
| 297 if (IsTrustedId(id_)) | |
| 298 return std::vector<string16>(); | |
| 299 else | |
| 300 return permission_set_->GetWarningMessages(); | |
| 301 } | |
| 302 | |
| 303 void Extension::OverrideLaunchUrl(const GURL& override_url) { | 289 void Extension::OverrideLaunchUrl(const GURL& override_url) { |
| 304 GURL new_url(override_url); | 290 GURL new_url(override_url); |
| 305 if (!new_url.is_valid()) { | 291 if (!new_url.is_valid()) { |
| 306 LOG(WARNING) << "Invalid override url given for " << name(); | 292 LOG(WARNING) << "Invalid override url given for " << name(); |
| 307 } else { | 293 } else { |
| 308 if (new_url.has_port()) { | 294 if (new_url.has_port()) { |
| 309 LOG(WARNING) << "Override URL passed for " << name() | 295 LOG(WARNING) << "Override URL passed for " << name() |
| 310 << " should not contain a port. Removing it."; | 296 << " should not contain a port. Removing it."; |
| 311 | 297 |
| 312 GURL::Replacements remove_port; | 298 GURL::Replacements remove_port; |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1190 bool Extension::EnsureNotHybridApp(const DictionaryValue* manifest, | 1176 bool Extension::EnsureNotHybridApp(const DictionaryValue* manifest, |
| 1191 std::string* error) { | 1177 std::string* error) { |
| 1192 if (web_extent().is_empty()) | 1178 if (web_extent().is_empty()) |
| 1193 return true; | 1179 return true; |
| 1194 | 1180 |
| 1195 for (DictionaryValue::key_iterator key = manifest->begin_keys(); | 1181 for (DictionaryValue::key_iterator key = manifest->begin_keys(); |
| 1196 key != manifest->end_keys(); ++key) { | 1182 key != manifest->end_keys(); ++key) { |
| 1197 if (!IsBaseCrxKey(*key) && | 1183 if (!IsBaseCrxKey(*key) && |
| 1198 *key != keys::kApp && | 1184 *key != keys::kApp && |
| 1199 *key != keys::kPermissions && | 1185 *key != keys::kPermissions && |
| 1186 *key != keys::kOptionalPermissions && | |
| 1200 *key != keys::kOptionsPage && | 1187 *key != keys::kOptionsPage && |
| 1201 *key != keys::kBackground) { | 1188 *key != keys::kBackground) { |
| 1202 *error = ExtensionErrorUtils::FormatErrorMessage( | 1189 *error = ExtensionErrorUtils::FormatErrorMessage( |
| 1203 errors::kHostedAppsCannotIncludeExtensionFeatures, *key); | 1190 errors::kHostedAppsCannotIncludeExtensionFeatures, *key); |
| 1204 return false; | 1191 return false; |
| 1205 } | 1192 } |
| 1206 } | 1193 } |
| 1207 | 1194 |
| 1208 return true; | 1195 return true; |
| 1209 } | 1196 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1373 } | 1360 } |
| 1374 } | 1361 } |
| 1375 | 1362 |
| 1376 GURL Extension::GetBaseURLFromExtensionId(const std::string& extension_id) { | 1363 GURL Extension::GetBaseURLFromExtensionId(const std::string& extension_id) { |
| 1377 return GURL(std::string(chrome::kExtensionScheme) + | 1364 return GURL(std::string(chrome::kExtensionScheme) + |
| 1378 chrome::kStandardSchemeSeparator + extension_id + "/"); | 1365 chrome::kStandardSchemeSeparator + extension_id + "/"); |
| 1379 } | 1366 } |
| 1380 | 1367 |
| 1381 bool Extension::InitFromValue(const DictionaryValue& source, int flags, | 1368 bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
| 1382 std::string* error) { | 1369 std::string* error) { |
| 1370 base::AutoLock auto_lock(runtime_data_lock_); | |
| 1383 // When strict error checks are enabled, make URL pattern parsing strict. | 1371 // When strict error checks are enabled, make URL pattern parsing strict. |
| 1384 URLPattern::ParseOption parse_strictness = | 1372 URLPattern::ParseOption parse_strictness = |
| 1385 (flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS | 1373 (flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS |
| 1386 : URLPattern::IGNORE_PORTS); | 1374 : URLPattern::IGNORE_PORTS); |
| 1387 | 1375 |
| 1388 // Initialize permissions with an empty, default permission set. | 1376 // Initialize permissions with an empty, default permission set. |
| 1389 permission_set_.reset(new ExtensionPermissionSet()); | 1377 runtime_data_.SetActivePermissions(new ExtensionPermissionSet()); |
| 1378 optional_permission_set_.reset(new ExtensionPermissionSet()); | |
| 1379 required_permission_set_.reset(new ExtensionPermissionSet()); | |
| 1390 | 1380 |
| 1391 if (source.HasKey(keys::kPublicKey)) { | 1381 if (source.HasKey(keys::kPublicKey)) { |
| 1392 std::string public_key_bytes; | 1382 std::string public_key_bytes; |
| 1393 if (!source.GetString(keys::kPublicKey, | 1383 if (!source.GetString(keys::kPublicKey, |
| 1394 &public_key_) || | 1384 &public_key_) || |
| 1395 !ParsePEMKeyBytes(public_key_, | 1385 !ParsePEMKeyBytes(public_key_, |
| 1396 &public_key_bytes) || | 1386 &public_key_bytes) || |
| 1397 !GenerateId(public_key_bytes, &id_)) { | 1387 !GenerateId(public_key_bytes, &id_)) { |
| 1398 *error = errors::kInvalidKey; | 1388 *error = errors::kInvalidKey; |
| 1399 return false; | 1389 return false; |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1901 return false; | 1891 return false; |
| 1902 } | 1892 } |
| 1903 options_url_ = GetResourceURL(options_str); | 1893 options_url_ = GetResourceURL(options_str); |
| 1904 if (!options_url_.is_valid()) { | 1894 if (!options_url_.is_valid()) { |
| 1905 *error = errors::kInvalidOptionsPage; | 1895 *error = errors::kInvalidOptionsPage; |
| 1906 return false; | 1896 return false; |
| 1907 } | 1897 } |
| 1908 } | 1898 } |
| 1909 } | 1899 } |
| 1910 | 1900 |
| 1901 // Initialize the permissions (optional). | |
| 1911 ExtensionAPIPermissionSet api_permissions; | 1902 ExtensionAPIPermissionSet api_permissions; |
| 1912 URLPatternSet host_permissions; | 1903 URLPatternSet host_permissions; |
| 1904 if (!ParsePermissions(&source, | |
| 1905 keys::kPermissions, | |
| 1906 flags, | |
| 1907 error, | |
| 1908 &api_permissions, | |
| 1909 &host_permissions)) { | |
| 1910 return false; | |
| 1911 } | |
| 1913 | 1912 |
| 1914 // Initialize the permissions (optional). | 1913 // Initialize the optional permissions (optional). |
| 1915 if (source.HasKey(keys::kPermissions)) { | 1914 ExtensionAPIPermissionSet optional_api_permissions; |
| 1916 ListValue* permissions = NULL; | 1915 URLPatternSet optional_host_permissions; |
| 1917 if (!source.GetList(keys::kPermissions, &permissions)) { | 1916 if (!ParsePermissions(&source, |
| 1918 *error = ExtensionErrorUtils::FormatErrorMessage( | 1917 keys::kOptionalPermissions, |
| 1919 errors::kInvalidPermissions, ""); | 1918 flags, |
| 1920 return false; | 1919 error, |
| 1921 } | 1920 &optional_api_permissions, |
| 1922 | 1921 &optional_host_permissions)) { |
| 1923 for (size_t i = 0; i < permissions->GetSize(); ++i) { | 1922 return false; |
| 1924 std::string permission_str; | |
| 1925 if (!permissions->GetString(i, &permission_str)) { | |
| 1926 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 1927 errors::kInvalidPermission, base::IntToString(i)); | |
| 1928 return false; | |
| 1929 } | |
| 1930 | |
| 1931 ExtensionAPIPermission* permission = | |
| 1932 ExtensionPermissionsInfo::GetInstance()->GetByName(permission_str); | |
| 1933 | |
| 1934 // Only COMPONENT extensions can use private APIs. | |
| 1935 // TODO(asargent) - We want a more general purpose mechanism for this, | |
| 1936 // and better error messages. (http://crbug.com/54013) | |
| 1937 if (!IsComponentOnlyPermission(permission) | |
| 1938 #ifndef NDEBUG | |
| 1939 && !CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1940 switches::kExposePrivateExtensionApi) | |
| 1941 #endif | |
| 1942 ) { | |
| 1943 continue; | |
| 1944 } | |
| 1945 | |
| 1946 if (web_extent().is_empty() || location() == Extension::COMPONENT) { | |
| 1947 // Check if it's a module permission. If so, enable that permission. | |
| 1948 if (permission != NULL) { | |
| 1949 // Only allow the experimental API permission if the command line | |
| 1950 // flag is present, or if the extension is a component of Chrome. | |
| 1951 if (IsDisallowedExperimentalPermission(permission->id()) && | |
| 1952 location() != Extension::COMPONENT) { | |
| 1953 *error = errors::kExperimentalFlagRequired; | |
| 1954 return false; | |
| 1955 } | |
| 1956 api_permissions.insert(permission->id()); | |
| 1957 continue; | |
| 1958 } | |
| 1959 } else { | |
| 1960 // Hosted apps only get access to a subset of the valid permissions. | |
| 1961 if (permission != NULL && permission->is_hosted_app()) { | |
| 1962 if (IsDisallowedExperimentalPermission(permission->id())) { | |
| 1963 *error = errors::kExperimentalFlagRequired; | |
| 1964 return false; | |
| 1965 } | |
| 1966 api_permissions.insert(permission->id()); | |
| 1967 continue; | |
| 1968 } | |
| 1969 } | |
| 1970 | |
| 1971 // Check if it's a host pattern permission. | |
| 1972 URLPattern pattern = URLPattern(CanExecuteScriptEverywhere() ? | |
| 1973 URLPattern::SCHEME_ALL : kValidHostPermissionSchemes); | |
| 1974 | |
| 1975 URLPattern::ParseResult parse_result = pattern.Parse(permission_str, | |
| 1976 parse_strictness); | |
| 1977 if (parse_result == URLPattern::PARSE_SUCCESS) { | |
| 1978 if (!CanSpecifyHostPermission(pattern)) { | |
| 1979 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 1980 errors::kInvalidPermissionScheme, base::IntToString(i)); | |
| 1981 return false; | |
| 1982 } | |
| 1983 | |
| 1984 // The path component is not used for host permissions, so we force it | |
| 1985 // to match all paths. | |
| 1986 pattern.SetPath("/*"); | |
| 1987 | |
| 1988 if (pattern.MatchesScheme(chrome::kFileScheme) && | |
| 1989 !CanExecuteScriptEverywhere()) { | |
| 1990 wants_file_access_ = true; | |
| 1991 if (!(flags & ALLOW_FILE_ACCESS)) | |
| 1992 pattern.SetValidSchemes( | |
| 1993 pattern.valid_schemes() & ~URLPattern::SCHEME_FILE); | |
| 1994 } | |
| 1995 | |
| 1996 host_permissions.AddPattern(pattern); | |
| 1997 } | |
| 1998 | |
| 1999 // If it's not a host permission, then it's probably an unknown API | |
| 2000 // permission. Do not throw an error so extensions can retain | |
| 2001 // backwards compatability (http://crbug.com/42742). | |
| 2002 // TODO(jstritar): We can improve error messages by adding better | |
| 2003 // validation of API permissions here. | |
| 2004 // TODO(skerner): Consider showing the reason |permission_str| is not | |
| 2005 // a valid URL pattern if it is almost valid. For example, if it has | |
| 2006 // a valid scheme, and failed to parse because it has a port, show an | |
| 2007 // error. | |
| 2008 } | |
| 2009 } | 1923 } |
| 2010 | 1924 |
| 2011 // Initialize background url (optional). | 1925 // Initialize background url (optional). |
| 2012 if (source.HasKey(keys::kBackground)) { | 1926 if (source.HasKey(keys::kBackground)) { |
| 2013 std::string background_str; | 1927 std::string background_str; |
| 2014 if (!source.GetString(keys::kBackground, &background_str)) { | 1928 if (!source.GetString(keys::kBackground, &background_str)) { |
| 2015 *error = errors::kInvalidBackground; | 1929 *error = errors::kInvalidBackground; |
| 2016 return false; | 1930 return false; |
| 2017 } | 1931 } |
| 2018 | 1932 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2384 *error = errors::kInvalidIncognitoBehavior; | 2298 *error = errors::kInvalidIncognitoBehavior; |
| 2385 return false; | 2299 return false; |
| 2386 } | 2300 } |
| 2387 } | 2301 } |
| 2388 | 2302 |
| 2389 if (HasMultipleUISurfaces()) { | 2303 if (HasMultipleUISurfaces()) { |
| 2390 *error = errors::kOneUISurfaceOnly; | 2304 *error = errors::kOneUISurfaceOnly; |
| 2391 return false; | 2305 return false; |
| 2392 } | 2306 } |
| 2393 | 2307 |
| 2394 permission_set_.reset( | 2308 runtime_data_.SetActivePermissions(new ExtensionPermissionSet( |
| 2309 this, api_permissions, host_permissions)); | |
| 2310 required_permission_set_.reset( | |
| 2395 new ExtensionPermissionSet(this, api_permissions, host_permissions)); | 2311 new ExtensionPermissionSet(this, api_permissions, host_permissions)); |
| 2312 optional_permission_set_.reset( | |
| 2313 new ExtensionPermissionSet(optional_api_permissions, | |
| 2314 optional_host_permissions, | |
| 2315 URLPatternSet())); | |
| 2396 | 2316 |
| 2397 // Although |source| is passed in as a const, it's still possible to modify | 2317 // Although |source| is passed in as a const, it's still possible to modify |
| 2398 // it. This is dangerous since the utility process re-uses |source| after | 2318 // it. This is dangerous since the utility process re-uses |source| after |
| 2399 // it calls InitFromValue, passing it up to the browser process which calls | 2319 // it calls InitFromValue, passing it up to the browser process which calls |
| 2400 // InitFromValue again. As a result, we need to make sure that nobody | 2320 // InitFromValue again. As a result, we need to make sure that nobody |
| 2401 // accidentally modifies it. | 2321 // accidentally modifies it. |
| 2402 DCHECK(source.Equals(manifest_value_.get())); | 2322 DCHECK(source.Equals(manifest_value_.get())); |
| 2403 | 2323 |
| 2404 return true; | 2324 return true; |
| 2405 } | 2325 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2563 | 2483 |
| 2564 GURL Extension::GetIconURL(int size, | 2484 GURL Extension::GetIconURL(int size, |
| 2565 ExtensionIconSet::MatchType match_type) const { | 2485 ExtensionIconSet::MatchType match_type) const { |
| 2566 std::string path = icons().Get(size, match_type); | 2486 std::string path = icons().Get(size, match_type); |
| 2567 if (path.empty()) | 2487 if (path.empty()) |
| 2568 return GURL(); | 2488 return GURL(); |
| 2569 else | 2489 else |
| 2570 return GetResourceURL(path); | 2490 return GetResourceURL(path); |
| 2571 } | 2491 } |
| 2572 | 2492 |
| 2493 bool Extension::ParsePermissions(const DictionaryValue* source, | |
| 2494 const char* key, | |
| 2495 int flags, | |
| 2496 std::string* error, | |
| 2497 ExtensionAPIPermissionSet* api_permissions, | |
| 2498 URLPatternSet* host_permissions) { | |
| 2499 if (source->HasKey(key)) { | |
| 2500 // When strict error checks are enabled, make URL pattern parsing strict. | |
| 2501 URLPattern::ParseOption parse_strictness = | |
| 2502 (flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS | |
| 2503 : URLPattern::IGNORE_PORTS); | |
| 2504 ListValue* permissions = NULL; | |
| 2505 if (!source->GetList(key, &permissions)) { | |
| 2506 LOG(INFO) << "BLAH1: " << key; | |
|
Mihai Parparita -not on Chrome
2011/07/21 21:18:13
Did you want to keep this logging statement?
jstritar
2011/07/22 19:21:55
Done.
| |
| 2507 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 2508 errors::kInvalidPermissions, ""); | |
| 2509 return false; | |
| 2510 } | |
| 2511 | |
| 2512 for (size_t i = 0; i < permissions->GetSize(); ++i) { | |
| 2513 std::string permission_str; | |
| 2514 if (!permissions->GetString(i, &permission_str)) { | |
| 2515 LOG(INFO) << "BLAH2: " << key; | |
|
Mihai Parparita -not on Chrome
2011/07/21 21:18:13
Ditto.
jstritar
2011/07/22 19:21:55
Done.
| |
| 2516 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 2517 errors::kInvalidPermission, base::IntToString(i)); | |
| 2518 return false; | |
| 2519 } | |
| 2520 | |
| 2521 ExtensionAPIPermission* permission = | |
| 2522 ExtensionPermissionsInfo::GetInstance()->GetByName(permission_str); | |
| 2523 | |
| 2524 // Only COMPONENT extensions can use private APIs. | |
| 2525 // TODO(asargent) - We want a more general purpose mechanism for this, | |
| 2526 // and better error messages. (http://crbug.com/54013) | |
| 2527 if (!IsComponentOnlyPermission(permission) | |
| 2528 #ifndef NDEBUG | |
| 2529 && !CommandLine::ForCurrentProcess()->HasSwitch( | |
| 2530 switches::kExposePrivateExtensionApi) | |
| 2531 #endif | |
| 2532 ) { | |
| 2533 continue; | |
| 2534 } | |
| 2535 | |
| 2536 if (web_extent().is_empty() || location() == Extension::COMPONENT) { | |
| 2537 // Check if it's a module permission. If so, enable that permission. | |
| 2538 if (permission != NULL) { | |
| 2539 // Only allow the experimental API permission if the command line | |
| 2540 // flag is present, or if the extension is a component of Chrome. | |
| 2541 if (IsDisallowedExperimentalPermission(permission->id()) && | |
| 2542 location() != Extension::COMPONENT) { | |
| 2543 *error = errors::kExperimentalFlagRequired; | |
| 2544 return false; | |
| 2545 } | |
| 2546 api_permissions->insert(permission->id()); | |
| 2547 continue; | |
| 2548 } | |
| 2549 } else { | |
| 2550 // Hosted apps only get access to a subset of the valid permissions. | |
| 2551 if (permission != NULL && permission->is_hosted_app()) { | |
| 2552 if (IsDisallowedExperimentalPermission(permission->id())) { | |
| 2553 *error = errors::kExperimentalFlagRequired; | |
| 2554 return false; | |
| 2555 } | |
| 2556 api_permissions->insert(permission->id()); | |
| 2557 continue; | |
| 2558 } | |
| 2559 } | |
| 2560 | |
| 2561 // Check if it's a host pattern permission. | |
| 2562 URLPattern pattern = URLPattern(CanExecuteScriptEverywhere() ? | |
| 2563 URLPattern::SCHEME_ALL : kValidHostPermissionSchemes); | |
| 2564 | |
| 2565 URLPattern::ParseResult parse_result = pattern.Parse(permission_str, | |
| 2566 parse_strictness); | |
| 2567 if (parse_result == URLPattern::PARSE_SUCCESS) { | |
| 2568 if (!CanSpecifyHostPermission(pattern)) { | |
| 2569 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 2570 errors::kInvalidPermissionScheme, base::IntToString(i)); | |
| 2571 return false; | |
| 2572 } | |
| 2573 | |
| 2574 // The path component is not used for host permissions, so we force it | |
| 2575 // to match all paths. | |
| 2576 pattern.SetPath("/*"); | |
| 2577 | |
| 2578 if (pattern.MatchesScheme(chrome::kFileScheme) && | |
| 2579 !CanExecuteScriptEverywhere()) { | |
| 2580 wants_file_access_ = true; | |
| 2581 if (!(flags & ALLOW_FILE_ACCESS)) | |
| 2582 pattern.SetValidSchemes( | |
| 2583 pattern.valid_schemes() & ~URLPattern::SCHEME_FILE); | |
| 2584 } | |
| 2585 | |
| 2586 host_permissions->AddPattern(pattern); | |
| 2587 } | |
| 2588 | |
| 2589 // If it's not a host permission, then it's probably an unknown API | |
| 2590 // permission. Do not throw an error so extensions can retain | |
| 2591 // backwards compatability (http://crbug.com/42742). | |
| 2592 // TODO(jstritar): We can improve error messages by adding better | |
| 2593 // validation of API permissions here. | |
| 2594 // TODO(skerner): Consider showing the reason |permission_str| is not | |
| 2595 // a valid URL pattern if it is almost valid. For example, if it has | |
| 2596 // a valid scheme, and failed to parse because it has a port, show an | |
| 2597 // error. | |
| 2598 } | |
| 2599 } | |
| 2600 return true; | |
| 2601 } | |
| 2602 | |
| 2573 bool Extension::CanSpecifyHostPermission(const URLPattern& pattern) const { | 2603 bool Extension::CanSpecifyHostPermission(const URLPattern& pattern) const { |
| 2574 if (!pattern.match_all_urls() && | 2604 if (!pattern.match_all_urls() && |
| 2575 pattern.MatchesScheme(chrome::kChromeUIScheme)) { | 2605 pattern.MatchesScheme(chrome::kChromeUIScheme)) { |
| 2576 // Only allow access to chrome://favicon to regular extensions. Component | 2606 // Only allow access to chrome://favicon to regular extensions. Component |
| 2577 // extensions can have access to all of chrome://*. | 2607 // extensions can have access to all of chrome://*. |
| 2578 return (pattern.host() == chrome::kChromeUIFaviconHost || | 2608 return (pattern.host() == chrome::kChromeUIFaviconHost || |
| 2579 CanExecuteScriptEverywhere()); | 2609 CanExecuteScriptEverywhere()); |
| 2580 } | 2610 } |
| 2581 | 2611 |
| 2582 // Otherwise, the valid schemes were handled by URLPattern. | 2612 // Otherwise, the valid schemes were handled by URLPattern. |
| 2583 return true; | 2613 return true; |
| 2584 } | 2614 } |
| 2585 | 2615 |
| 2586 bool Extension::HasAPIPermission( | 2616 bool Extension::HasAPIPermission( |
| 2587 ExtensionAPIPermission::ID permission) const { | 2617 ExtensionAPIPermission::ID permission) const { |
| 2588 return permission_set()->HasAPIPermission(permission); | 2618 base::AutoLock auto_lock(runtime_data_lock_); |
| 2619 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); | |
| 2589 } | 2620 } |
| 2590 | 2621 |
| 2591 bool Extension::HasAPIPermission( | 2622 bool Extension::HasAPIPermission( |
| 2592 const std::string& function_name) const { | 2623 const std::string& function_name) const { |
| 2593 return permission_set()->HasAccessToFunction(function_name); | 2624 base::AutoLock auto_lock(runtime_data_lock_); |
| 2625 return runtime_data_.GetActivePermissions()-> | |
| 2626 HasAccessToFunction(function_name); | |
| 2594 } | 2627 } |
| 2595 | 2628 |
| 2596 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { | 2629 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { |
| 2597 return permission_set()->effective_hosts(); | 2630 base::AutoLock auto_lock(runtime_data_lock_); |
| 2631 return runtime_data_.GetActivePermissions()->effective_hosts(); | |
| 2598 } | 2632 } |
| 2599 | 2633 |
| 2600 bool Extension::HasHostPermission(const GURL& url) const { | 2634 bool Extension::HasHostPermission(const GURL& url) const { |
| 2635 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2601 if (url.SchemeIs(chrome::kChromeUIScheme) && | 2636 if (url.SchemeIs(chrome::kChromeUIScheme) && |
| 2602 url.host() != chrome::kChromeUIFaviconHost && | 2637 url.host() != chrome::kChromeUIFaviconHost && |
| 2603 location() != Extension::COMPONENT) | 2638 location() != Extension::COMPONENT) |
| 2604 return false; | 2639 return false; |
| 2605 return permission_set()->HasExplicitAccessToOrigin(url); | 2640 return runtime_data_.GetActivePermissions()-> |
| 2641 HasExplicitAccessToOrigin(url); | |
| 2642 } | |
| 2643 | |
| 2644 bool Extension::HasEffectiveAccessToAllHosts() const { | |
| 2645 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2646 return runtime_data_.GetActivePermissions()->HasEffectiveAccessToAllHosts(); | |
| 2647 } | |
| 2648 | |
| 2649 bool Extension::HasFullPermissions() const { | |
| 2650 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2651 return runtime_data_.GetActivePermissions()->HasEffectiveFullAccess(); | |
| 2652 } | |
| 2653 | |
| 2654 ExtensionPermissionMessages Extension::GetPermissionMessages() const { | |
| 2655 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2656 if (IsTrustedId(id_)) | |
| 2657 return ExtensionPermissionMessages(); | |
| 2658 else | |
| 2659 return runtime_data_.GetActivePermissions()->GetPermissionMessages(); | |
| 2660 } | |
| 2661 | |
| 2662 std::vector<string16> Extension::GetPermissionMessageStrings() const { | |
| 2663 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2664 if (IsTrustedId(id_)) | |
| 2665 return std::vector<string16>(); | |
| 2666 else | |
| 2667 return runtime_data_.GetActivePermissions()->GetWarningMessages(); | |
| 2668 } | |
| 2669 | |
| 2670 void Extension::SetActivePermissions( | |
| 2671 const ExtensionPermissionSet* permissions) const { | |
| 2672 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2673 runtime_data_.SetActivePermissions(permissions); | |
| 2674 } | |
| 2675 | |
| 2676 scoped_refptr<const ExtensionPermissionSet> | |
| 2677 Extension::GetActivePermissions() const { | |
| 2678 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2679 return runtime_data_.GetActivePermissions(); | |
| 2606 } | 2680 } |
| 2607 | 2681 |
| 2608 bool Extension::IsComponentOnlyPermission( | 2682 bool Extension::IsComponentOnlyPermission( |
| 2609 const ExtensionAPIPermission* api) const { | 2683 const ExtensionAPIPermission* api) const { |
| 2610 if (location() == Extension::COMPONENT) | 2684 if (location() == Extension::COMPONENT) |
| 2611 return true; | 2685 return true; |
| 2612 | 2686 |
| 2613 if (api == NULL) | 2687 if (api == NULL) |
| 2614 return true; | 2688 return true; |
| 2615 | 2689 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 2627 | 2701 |
| 2628 if (is_app()) | 2702 if (is_app()) |
| 2629 ++num_surfaces; | 2703 ++num_surfaces; |
| 2630 | 2704 |
| 2631 return num_surfaces > 1; | 2705 return num_surfaces > 1; |
| 2632 } | 2706 } |
| 2633 | 2707 |
| 2634 bool Extension::CanExecuteScriptOnPage(const GURL& page_url, | 2708 bool Extension::CanExecuteScriptOnPage(const GURL& page_url, |
| 2635 const UserScript* script, | 2709 const UserScript* script, |
| 2636 std::string* error) const { | 2710 std::string* error) const { |
| 2711 base::AutoLock auto_lock(runtime_data_lock_); | |
| 2637 // The gallery is special-cased as a restricted URL for scripting to prevent | 2712 // The gallery is special-cased as a restricted URL for scripting to prevent |
| 2638 // access to special JS bindings we expose to the gallery (and avoid things | 2713 // access to special JS bindings we expose to the gallery (and avoid things |
| 2639 // like extensions removing the "report abuse" link). | 2714 // like extensions removing the "report abuse" link). |
| 2640 // TODO(erikkay): This seems like the wrong test. Shouldn't we we testing | 2715 // TODO(erikkay): This seems like the wrong test. Shouldn't we we testing |
| 2641 // against the store app extent? | 2716 // against the store app extent? |
| 2642 if ((page_url.host() == GURL(Extension::ChromeStoreLaunchURL()).host()) && | 2717 if ((page_url.host() == GURL(Extension::ChromeStoreLaunchURL()).host()) && |
| 2643 !CanExecuteScriptEverywhere() && | 2718 !CanExecuteScriptEverywhere() && |
| 2644 !CommandLine::ForCurrentProcess()->HasSwitch( | 2719 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 2645 switches::kAllowScriptingGallery)) { | 2720 switches::kAllowScriptingGallery)) { |
| 2646 if (error) | 2721 if (error) |
| 2647 *error = errors::kCannotScriptGallery; | 2722 *error = errors::kCannotScriptGallery; |
| 2648 return false; | 2723 return false; |
| 2649 } | 2724 } |
| 2650 | 2725 |
| 2651 if (page_url.SchemeIs(chrome::kChromeUIScheme) && | 2726 if (page_url.SchemeIs(chrome::kChromeUIScheme) && |
| 2652 !CanExecuteScriptEverywhere()) | 2727 !CanExecuteScriptEverywhere()) |
| 2653 return false; | 2728 return false; |
| 2654 | 2729 |
| 2655 // If a script is specified, use its matches. | 2730 // If a script is specified, use its matches. |
| 2656 if (script) | 2731 if (script) |
| 2657 return script->MatchesURL(page_url); | 2732 return script->MatchesURL(page_url); |
| 2658 | 2733 |
| 2659 // Otherwise, see if this extension has permission to execute script | 2734 // Otherwise, see if this extension has permission to execute script |
| 2660 // programmatically on pages. | 2735 // programmatically on pages. |
| 2661 if (permission_set()->HasExplicitAccessToOrigin(page_url)) | 2736 if (runtime_data_.GetActivePermissions()->HasExplicitAccessToOrigin( |
| 2737 page_url)) | |
| 2662 return true; | 2738 return true; |
| 2663 | 2739 |
| 2664 if (error) { | 2740 if (error) { |
| 2665 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, | 2741 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, |
| 2666 page_url.spec()); | 2742 page_url.spec()); |
| 2667 } | 2743 } |
| 2668 | 2744 |
| 2669 return false; | 2745 return false; |
| 2670 } | 2746 } |
| 2671 | 2747 |
| 2672 bool Extension::HasEffectiveAccessToAllHosts() const { | |
| 2673 return permission_set_->HasEffectiveAccessToAllHosts(); | |
| 2674 } | |
| 2675 | |
| 2676 bool Extension::HasFullPermissions() const { | |
| 2677 return permission_set_->HasEffectiveFullAccess(); | |
| 2678 } | |
| 2679 | |
| 2680 bool Extension::ShowConfigureContextMenus() const { | 2748 bool Extension::ShowConfigureContextMenus() const { |
| 2681 // Don't show context menu for component extensions. We might want to show | 2749 // Don't show context menu for component extensions. We might want to show |
| 2682 // options for component extension button but now there is no component | 2750 // options for component extension button but now there is no component |
| 2683 // extension with options. All other menu items like uninstall have | 2751 // extension with options. All other menu items like uninstall have |
| 2684 // no sense for component extensions. | 2752 // no sense for component extensions. |
| 2685 return location() != Extension::COMPONENT; | 2753 return location() != Extension::COMPONENT; |
| 2686 } | 2754 } |
| 2687 | 2755 |
| 2688 bool Extension::IsDisallowedExperimentalPermission( | 2756 bool Extension::IsDisallowedExperimentalPermission( |
| 2689 ExtensionAPIPermission::ID permission) const { | 2757 ExtensionAPIPermission::ID permission) const { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2757 Extension::Location location) | 2825 Extension::Location location) |
| 2758 : extension_id(id), | 2826 : extension_id(id), |
| 2759 extension_path(path), | 2827 extension_path(path), |
| 2760 extension_location(location) { | 2828 extension_location(location) { |
| 2761 if (manifest) | 2829 if (manifest) |
| 2762 extension_manifest.reset(manifest->DeepCopy()); | 2830 extension_manifest.reset(manifest->DeepCopy()); |
| 2763 } | 2831 } |
| 2764 | 2832 |
| 2765 ExtensionInfo::~ExtensionInfo() {} | 2833 ExtensionInfo::~ExtensionInfo() {} |
| 2766 | 2834 |
| 2835 Extension::RuntimeData::RuntimeData() {} | |
| 2836 Extension::RuntimeData::RuntimeData(const ExtensionPermissionSet* active) | |
| 2837 : active_permissions_(active) {} | |
| 2838 Extension::RuntimeData::~RuntimeData() {} | |
| 2839 | |
| 2840 scoped_refptr<const ExtensionPermissionSet> | |
| 2841 Extension::RuntimeData::GetActivePermissions() const { | |
| 2842 return active_permissions_; | |
| 2843 } | |
| 2844 | |
| 2845 void Extension::RuntimeData::SetActivePermissions( | |
| 2846 const ExtensionPermissionSet* active) { | |
| 2847 active_permissions_ = active; | |
| 2848 } | |
| 2849 | |
| 2767 UninstalledExtensionInfo::UninstalledExtensionInfo( | 2850 UninstalledExtensionInfo::UninstalledExtensionInfo( |
| 2768 const Extension& extension) | 2851 const Extension& extension) |
| 2769 : extension_id(extension.id()), | 2852 : extension_id(extension.id()), |
| 2770 extension_api_permissions( | 2853 extension_api_permissions( |
| 2771 extension.permission_set()->GetAPIsAsStrings()), | 2854 extension.GetActivePermissions()->GetAPIsAsStrings()), |
| 2772 extension_type(extension.GetType()), | 2855 extension_type(extension.GetType()), |
| 2773 update_url(extension.update_url()) {} | 2856 update_url(extension.update_url()) {} |
| 2774 | 2857 |
| 2775 UninstalledExtensionInfo::~UninstalledExtensionInfo() {} | 2858 UninstalledExtensionInfo::~UninstalledExtensionInfo() {} |
| 2776 | 2859 |
| 2777 | 2860 |
| 2778 UnloadedExtensionInfo::UnloadedExtensionInfo( | 2861 UnloadedExtensionInfo::UnloadedExtensionInfo( |
| 2779 const Extension* extension, | 2862 const Extension* extension, |
| 2780 Reason reason) | 2863 Reason reason) |
| 2781 : reason(reason), | 2864 : reason(reason), |
| 2782 already_disabled(false), | 2865 already_disabled(false), |
| 2783 extension(extension) {} | 2866 extension(extension) {} |
| 2867 | |
| 2868 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | |
| 2869 const Extension* extension, | |
| 2870 const ExtensionPermissionSet* permissions, | |
| 2871 Reason reason) | |
| 2872 : reason(reason), | |
| 2873 extension(extension), | |
| 2874 permissions(permissions) {} | |
| OLD | NEW |