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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 | 56 |
| 57 // KEY MARKERS | 57 // KEY MARKERS |
| 58 const char kKeyBeginHeaderMarker[] = "-----BEGIN"; | 58 const char kKeyBeginHeaderMarker[] = "-----BEGIN"; |
| 59 const char kKeyBeginFooterMarker[] = "-----END"; | 59 const char kKeyBeginFooterMarker[] = "-----END"; |
| 60 const char kKeyInfoEndMarker[] = "KEY-----"; | 60 const char kKeyInfoEndMarker[] = "KEY-----"; |
| 61 const char kPublic[] = "PUBLIC"; | 61 const char kPublic[] = "PUBLIC"; |
| 62 const char kPrivate[] = "PRIVATE"; | 62 const char kPrivate[] = "PRIVATE"; |
| 63 | 63 |
| 64 const int kRSAKeySize = 1024; | 64 const int kRSAKeySize = 1024; |
| 65 | 65 |
| 66 const char kDefaultContentSecurityPolicy[] = | |
| 67 "script-src 'self'; object-src 'self'"; | |
| 68 | |
| 66 // Converts a normal hexadecimal string into the alphabet used by extensions. | 69 // Converts a normal hexadecimal string into the alphabet used by extensions. |
| 67 // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a | 70 // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a |
| 68 // completely numeric host, since some software interprets that as an IP | 71 // completely numeric host, since some software interprets that as an IP |
| 69 // address. | 72 // address. |
| 70 static void ConvertHexadecimalToIDAlphabet(std::string* id) { | 73 static void ConvertHexadecimalToIDAlphabet(std::string* id) { |
| 71 for (size_t i = 0; i < id->size(); ++i) { | 74 for (size_t i = 0; i < id->size(); ++i) { |
| 72 int val; | 75 int val; |
| 73 if (base::HexStringToInt(id->begin() + i, id->begin() + i + 1, &val)) | 76 if (base::HexStringToInt(id->begin() + i, id->begin() + i + 1, &val)) |
| 74 (*id)[i] = val + 'a'; | 77 (*id)[i] = val + 'a'; |
| 75 else | 78 else |
| (...skipping 1192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1268 return true; | 1271 return true; |
| 1269 } | 1272 } |
| 1270 | 1273 |
| 1271 // static | 1274 // static |
| 1272 bool Extension::IsTrustedId(const std::string& id) { | 1275 bool Extension::IsTrustedId(const std::string& id) { |
| 1273 // See http://b/4946060 for more details. | 1276 // See http://b/4946060 for more details. |
| 1274 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); | 1277 return id == std::string("nckgahadagoaajjgafhacjanaoiihapd"); |
| 1275 } | 1278 } |
| 1276 | 1279 |
| 1277 Extension::Extension(const FilePath& path, Location location) | 1280 Extension::Extension(const FilePath& path, Location location) |
| 1278 : incognito_split_mode_(false), | 1281 : manifest_version_(0), |
| 1282 incognito_split_mode_(false), | |
| 1279 offline_enabled_(false), | 1283 offline_enabled_(false), |
| 1280 location_(location), | 1284 location_(location), |
| 1281 converted_from_user_script_(false), | 1285 converted_from_user_script_(false), |
| 1282 is_theme_(false), | 1286 is_theme_(false), |
| 1283 is_app_(false), | 1287 is_app_(false), |
| 1284 is_platform_app_(false), | 1288 is_platform_app_(false), |
| 1285 is_storage_isolated_(false), | 1289 is_storage_isolated_(false), |
| 1286 launch_container_(extension_misc::LAUNCH_TAB), | 1290 launch_container_(extension_misc::LAUNCH_TAB), |
| 1287 launch_width_(0), | 1291 launch_width_(0), |
| 1288 launch_height_(0), | 1292 launch_height_(0), |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1447 // When strict error checks are enabled, make URL pattern parsing strict. | 1451 // When strict error checks are enabled, make URL pattern parsing strict. |
| 1448 URLPattern::ParseOption parse_strictness = | 1452 URLPattern::ParseOption parse_strictness = |
| 1449 (flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS | 1453 (flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS |
| 1450 : URLPattern::IGNORE_PORTS); | 1454 : URLPattern::IGNORE_PORTS); |
| 1451 | 1455 |
| 1452 // Initialize permissions with an empty, default permission set. | 1456 // Initialize permissions with an empty, default permission set. |
| 1453 runtime_data_.SetActivePermissions(new ExtensionPermissionSet()); | 1457 runtime_data_.SetActivePermissions(new ExtensionPermissionSet()); |
| 1454 optional_permission_set_ = new ExtensionPermissionSet(); | 1458 optional_permission_set_ = new ExtensionPermissionSet(); |
| 1455 required_permission_set_ = new ExtensionPermissionSet(); | 1459 required_permission_set_ = new ExtensionPermissionSet(); |
| 1456 | 1460 |
| 1461 if (source.HasKey(keys::kManifestVersion)) { | |
| 1462 int manifest_version = 0; | |
| 1463 if (!source.GetInteger(keys::kPublicKey, &manifest_version) || | |
| 1464 manifest_version < 1) { | |
| 1465 *error = errors::kInvalidManifestVersion; | |
| 1466 return false; | |
| 1467 } | |
| 1468 manifest_version_ = manifest_version; | |
|
Aaron Boodman
2011/11/17 07:10:15
Should we do something about manifest version > 2
| |
| 1469 } else { | |
| 1470 // Version 1 was the original version, which lacked a version indicator. | |
| 1471 manifest_version_ = 1; | |
| 1472 } | |
| 1473 | |
| 1457 if (source.HasKey(keys::kPublicKey)) { | 1474 if (source.HasKey(keys::kPublicKey)) { |
| 1458 std::string public_key_bytes; | 1475 std::string public_key_bytes; |
| 1459 if (!source.GetString(keys::kPublicKey, | 1476 if (!source.GetString(keys::kPublicKey, |
| 1460 &public_key_) || | 1477 &public_key_) || |
| 1461 !ParsePEMKeyBytes(public_key_, | 1478 !ParsePEMKeyBytes(public_key_, |
| 1462 &public_key_bytes) || | 1479 &public_key_bytes) || |
| 1463 !GenerateId(public_key_bytes, &id_)) { | 1480 !GenerateId(public_key_bytes, &id_)) { |
| 1464 *error = errors::kInvalidKey; | 1481 *error = errors::kInvalidKey; |
| 1465 return false; | 1482 return false; |
| 1466 } | 1483 } |
| (...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2210 // We block these characters to prevent HTTP header injection when | 2227 // We block these characters to prevent HTTP header injection when |
| 2211 // representing the content security policy as an HTTP header. | 2228 // representing the content security policy as an HTTP header. |
| 2212 const char kBadCSPCharacters[] = {'\r', '\n', '\0'}; | 2229 const char kBadCSPCharacters[] = {'\r', '\n', '\0'}; |
| 2213 if (content_security_policy.find_first_of(kBadCSPCharacters, 0, | 2230 if (content_security_policy.find_first_of(kBadCSPCharacters, 0, |
| 2214 arraysize(kBadCSPCharacters)) != | 2231 arraysize(kBadCSPCharacters)) != |
| 2215 std::string::npos) { | 2232 std::string::npos) { |
| 2216 *error = errors::kInvalidContentSecurityPolicy; | 2233 *error = errors::kInvalidContentSecurityPolicy; |
| 2217 return false; | 2234 return false; |
| 2218 } | 2235 } |
| 2219 content_security_policy_ = content_security_policy; | 2236 content_security_policy_ = content_security_policy; |
| 2237 } else if (manifest_version_ >= 2) { | |
| 2238 // Manifest version 2 introduced a default Content-Security-Policy. | |
| 2239 // TODO(abarth): Should we continue to let extensions override the | |
| 2240 // default Content-Security-Policy? | |
| 2241 content_security_policy_ = kDefaultContentSecurityPolicy; | |
| 2220 } | 2242 } |
| 2221 | 2243 |
| 2222 // Initialize devtools page url (optional). | 2244 // Initialize devtools page url (optional). |
| 2223 if (source.HasKey(keys::kDevToolsPage)) { | 2245 if (source.HasKey(keys::kDevToolsPage)) { |
| 2224 std::string devtools_str; | 2246 std::string devtools_str; |
| 2225 if (!source.GetString(keys::kDevToolsPage, &devtools_str)) { | 2247 if (!source.GetString(keys::kDevToolsPage, &devtools_str)) { |
| 2226 *error = errors::kInvalidDevToolsPage; | 2248 *error = errors::kInvalidDevToolsPage; |
| 2227 return false; | 2249 return false; |
| 2228 } | 2250 } |
| 2229 if (!api_permissions.count(ExtensionAPIPermission::kExperimental)) { | 2251 if (!api_permissions.count(ExtensionAPIPermission::kExperimental)) { |
| (...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3030 already_disabled(false), | 3052 already_disabled(false), |
| 3031 extension(extension) {} | 3053 extension(extension) {} |
| 3032 | 3054 |
| 3033 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3055 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 3034 const Extension* extension, | 3056 const Extension* extension, |
| 3035 const ExtensionPermissionSet* permissions, | 3057 const ExtensionPermissionSet* permissions, |
| 3036 Reason reason) | 3058 Reason reason) |
| 3037 : reason(reason), | 3059 : reason(reason), |
| 3038 extension(extension), | 3060 extension(extension), |
| 3039 permissions(permissions) {} | 3061 permissions(permissions) {} |
| OLD | NEW |