// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/common/extensions/extension.h" #include "base/base64.h" #include "base/basictypes.h" #include "base/command_line.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/i18n/rtl.h" #include "base/logging.h" #include "base/memory/singleton.h" #include "base/stl_util.h" #include "base/string16.h" #include "base/string_number_conversions.h" #include "base/string_piece.h" #include "base/string_split.h" #include "base/string_util.h" #include "base/stringprintf.h" #include "base/utf_string_conversions.h" #include "base/values.h" #include "base/version.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_version_info.h" #include "chrome/common/extensions/csp_validator.h" #include "chrome/common/extensions/extension_action.h" #include "chrome/common/extensions/extension_error_utils.h" #include "chrome/common/extensions/extension_manifest_constants.h" #include "chrome/common/extensions/extension_resource.h" #include "chrome/common/extensions/extension_switch_utils.h" #include "chrome/common/extensions/features/feature.h" #include "chrome/common/extensions/features/simple_feature_provider.h" #include "chrome/common/extensions/file_browser_handler.h" #include "chrome/common/extensions/manifest.h" #include "chrome/common/extensions/user_script.h" #include "chrome/common/url_constants.h" #include "crypto/sha2.h" #include "googleurl/src/url_util.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "net/base/registry_controlled_domain.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/keycodes/keyboard_codes.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "webkit/glue/image_decoder.h" #include "webkit/glue/web_intent_service_data.h" #if defined(OS_WIN) #include "base/win/metro.h" #endif namespace keys = extension_manifest_keys; namespace values = extension_manifest_values; namespace errors = extension_manifest_errors; namespace info_keys = extension_info_keys; namespace switch_utils = extensions::switch_utils; using extensions::csp_validator::ContentSecurityPolicyIsLegal; using extensions::csp_validator::ContentSecurityPolicyIsSandboxed; using extensions::csp_validator::ContentSecurityPolicyIsSecure; namespace extensions { namespace { const int kModernManifestVersion = 1; const int kPEMOutputColumns = 65; const char kOverrideExtentUrlPatternFormat[] = "chrome://%s/*"; // The maximum number of commands (including page action/browser actions) an // extension can have. const size_t kMaxCommandsPerExtension = 4; // KEY MARKERS const char kKeyBeginHeaderMarker[] = "-----BEGIN"; const char kKeyBeginFooterMarker[] = "-----END"; const char kKeyInfoEndMarker[] = "KEY-----"; const char kPublic[] = "PUBLIC"; const char kPrivate[] = "PRIVATE"; const int kRSAKeySize = 1024; const char kDefaultContentSecurityPolicy[] = "script-src 'self' chrome-extension-resource:; object-src 'self'"; #define PLATFORM_APP_LOCAL_CSP_SOURCES \ "'self' blob: data: filesystem: chrome-extension-resource:" const char kDefaultPlatformAppContentSecurityPolicy[] = // Platform apps can only use local resources by default. "default-src 'self' chrome-extension-resource:;" // For remote resources, they can fetch them via XMLHttpRequest. "connect-src *;" // And serve them via blob:, data: or filesystem: URLs "style-src " PLATFORM_APP_LOCAL_CSP_SOURCES " 'unsafe-inline';" "img-src " PLATFORM_APP_LOCAL_CSP_SOURCES ";" "frame-src " PLATFORM_APP_LOCAL_CSP_SOURCES ";" "font-src " PLATFORM_APP_LOCAL_CSP_SOURCES ";" // Media can be loaded from remote resources since: // 1.