OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_system_impl.h" | 5 #include "chrome/browser/extensions/extension_system_impl.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/memory/weak_ptr.h" |
11 #include "base/strings/string_tokenizer.h" | 12 #include "base/strings/string_tokenizer.h" |
12 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
13 #include "chrome/browser/content_settings/cookie_settings.h" | 14 #include "chrome/browser/content_settings/cookie_settings.h" |
14 #include "chrome/browser/extensions/blacklist.h" | 15 #include "chrome/browser/extensions/blacklist.h" |
15 #include "chrome/browser/extensions/component_loader.h" | 16 #include "chrome/browser/extensions/component_loader.h" |
16 #include "chrome/browser/extensions/error_console/error_console.h" | 17 #include "chrome/browser/extensions/error_console/error_console.h" |
17 #include "chrome/browser/extensions/extension_error_reporter.h" | 18 #include "chrome/browser/extensions/extension_error_reporter.h" |
18 #include "chrome/browser/extensions/extension_service.h" | 19 #include "chrome/browser/extensions/extension_service.h" |
19 #include "chrome/browser/extensions/extension_system_factory.h" | 20 #include "chrome/browser/extensions/extension_system_factory.h" |
20 #include "chrome/browser/extensions/extension_util.h" | 21 #include "chrome/browser/extensions/extension_util.h" |
21 #include "chrome/browser/extensions/extension_warning_badge_service.h" | 22 #include "chrome/browser/extensions/extension_warning_badge_service.h" |
22 #include "chrome/browser/extensions/extension_warning_set.h" | 23 #include "chrome/browser/extensions/extension_warning_set.h" |
23 #include "chrome/browser/extensions/install_verifier.h" | 24 #include "chrome/browser/extensions/install_verifier.h" |
24 #include "chrome/browser/extensions/navigation_observer.h" | 25 #include "chrome/browser/extensions/navigation_observer.h" |
25 #include "chrome/browser/extensions/standard_management_policy_provider.h" | 26 #include "chrome/browser/extensions/standard_management_policy_provider.h" |
26 #include "chrome/browser/extensions/state_store.h" | 27 #include "chrome/browser/extensions/state_store.h" |
27 #include "chrome/browser/extensions/unpacked_installer.h" | 28 #include "chrome/browser/extensions/unpacked_installer.h" |
28 #include "chrome/browser/extensions/user_script_master.h" | 29 #include "chrome/browser/extensions/user_script_master.h" |
29 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
30 #include "chrome/browser/profiles/profile_manager.h" | 31 #include "chrome/browser/profiles/profile_manager.h" |
31 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | 32 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" |
32 #include "chrome/common/chrome_switches.h" | 33 #include "chrome/common/chrome_switches.h" |
33 #include "chrome/common/chrome_version_info.h" | 34 #include "chrome/common/chrome_version_info.h" |
34 #include "chrome/common/extensions/features/feature_channel.h" | 35 #include "chrome/common/extensions/features/feature_channel.h" |
35 #include "chrome/common/extensions/manifest_url_handler.h" | 36 #include "chrome/common/extensions/manifest_url_handler.h" |
36 #include "content/public/browser/browser_thread.h" | 37 #include "content/public/browser/browser_thread.h" |
37 #include "content/public/browser/url_data_source.h" | 38 #include "content/public/browser/url_data_source.h" |
38 #include "extensions/browser/content_verifier.h" | 39 #include "extensions/browser/content_verifier.h" |
| 40 #include "extensions/browser/content_verifier_delegate.h" |
39 #include "extensions/browser/event_router.h" | 41 #include "extensions/browser/event_router.h" |
40 #include "extensions/browser/extension_pref_store.h" | 42 #include "extensions/browser/extension_pref_store.h" |
41 #include "extensions/browser/extension_pref_value_map.h" | 43 #include "extensions/browser/extension_pref_value_map.h" |
42 #include "extensions/browser/extension_pref_value_map_factory.h" | 44 #include "extensions/browser/extension_pref_value_map_factory.h" |
43 #include "extensions/browser/extension_prefs.h" | 45 #include "extensions/browser/extension_prefs.h" |
44 #include "extensions/browser/extension_registry.h" | 46 #include "extensions/browser/extension_registry.h" |
45 #include "extensions/browser/info_map.h" | 47 #include "extensions/browser/info_map.h" |
46 #include "extensions/browser/lazy_background_task_queue.h" | 48 #include "extensions/browser/lazy_background_task_queue.h" |
47 #include "extensions/browser/management_policy.h" | 49 #include "extensions/browser/management_policy.h" |
48 #include "extensions/browser/process_manager.h" | 50 #include "extensions/browser/process_manager.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 management_policy_->RegisterProvider( | 134 management_policy_->RegisterProvider( |
133 device_local_account_management_policy_provider_.get()); | 135 device_local_account_management_policy_provider_.get()); |
134 } | 136 } |
135 #endif // defined (OS_CHROMEOS) | 137 #endif // defined (OS_CHROMEOS) |
136 | 138 |
137 management_policy_->RegisterProvider(install_verifier_.get()); | 139 management_policy_->RegisterProvider(install_verifier_.get()); |
138 | 140 |
139 #endif // defined(ENABLE_EXTENSIONS) | 141 #endif // defined(ENABLE_EXTENSIONS) |
140 } | 142 } |
141 | 143 |
142 static bool ShouldVerifyExtensionContent(const Extension* extension) { | 144 namespace { |
143 return ((extension->is_extension() || extension->is_legacy_packaged_app()) && | 145 |
144 ManifestURL::UpdatesFromGallery(extension) && | 146 class ContentVerifierDelegateImpl : public ContentVerifierDelegate { |
145 Manifest::IsAutoUpdateableLocation(extension->location())); | 147 public: |
146 } | 148 explicit ContentVerifierDelegateImpl(ExtensionService* service) |
| 149 : service_(service->AsWeakPtr()) {} |
| 150 |
| 151 virtual ~ContentVerifierDelegateImpl() {} |
| 152 |
| 153 virtual bool ShouldBeVerified(const Extension& extension) OVERRIDE { |
| 154 return ((extension.is_extension() || extension.is_legacy_packaged_app()) && |
| 155 ManifestURL::UpdatesFromGallery(&extension) && |
| 156 Manifest::IsAutoUpdateableLocation(extension.location())); |
| 157 } |
| 158 |
| 159 virtual const ContentVerifierKey& PublicKey() OVERRIDE { |
| 160 static ContentVerifierKey key( |
| 161 extension_misc::kWebstoreSignaturesPublicKey, |
| 162 extension_misc::kWebstoreSignaturesPublicKeySize); |
| 163 return key; |
| 164 } |
| 165 |
| 166 virtual GURL GetSignatureFetchUrl(const std::string& extension_id, |
| 167 const base::Version& version) OVERRIDE { |
| 168 return GURL(); |
| 169 } |
| 170 |
| 171 virtual void VerifyFailed(const std::string& extension_id) OVERRIDE { |
| 172 if (service_) |
| 173 service_->DisableExtension(extension_id, Extension::DISABLE_CORRUPTED); |
| 174 } |
| 175 |
| 176 private: |
| 177 base::WeakPtr<ExtensionService> service_; |
| 178 DISALLOW_COPY_AND_ASSIGN(ContentVerifierDelegateImpl); |
| 179 }; |
| 180 |
| 181 } // namespace |
147 | 182 |
148 void ExtensionSystemImpl::Shared::Init(bool extensions_enabled) { | 183 void ExtensionSystemImpl::Shared::Init(bool extensions_enabled) { |
149 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | 184 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
150 | 185 |
151 navigation_observer_.reset(new NavigationObserver(profile_)); | 186 navigation_observer_.reset(new NavigationObserver(profile_)); |
152 | 187 |
153 bool allow_noisy_errors = !command_line->HasSwitch(switches::kNoErrorDialogs); | 188 bool allow_noisy_errors = !command_line->HasSwitch(switches::kNoErrorDialogs); |
154 ExtensionErrorReporter::Init(allow_noisy_errors); | 189 ExtensionErrorReporter::Init(allow_noisy_errors); |
155 | 190 |
156 user_script_master_ = new UserScriptMaster(profile_); | 191 user_script_master_ = new UserScriptMaster(profile_); |
(...skipping 15 matching lines...) Expand all Loading... |
172 autoupdate_enabled, | 207 autoupdate_enabled, |
173 extensions_enabled, | 208 extensions_enabled, |
174 &ready_)); | 209 &ready_)); |
175 | 210 |
176 // These services must be registered before the ExtensionService tries to | 211 // These services must be registered before the ExtensionService tries to |
177 // load any extensions. | 212 // load any extensions. |
178 { | 213 { |
179 install_verifier_.reset( | 214 install_verifier_.reset( |
180 new InstallVerifier(ExtensionPrefs::Get(profile_), profile_)); | 215 new InstallVerifier(ExtensionPrefs::Get(profile_), profile_)); |
181 install_verifier_->Init(); | 216 install_verifier_->Init(); |
182 ContentVerifierFilter filter = base::Bind(&ShouldVerifyExtensionContent); | 217 content_verifier_ = new ContentVerifier( |
183 content_verifier_ = new ContentVerifier(profile_, filter); | 218 profile_, new ContentVerifierDelegateImpl(extension_service_.get())); |
184 content_verifier_->AddObserver(extension_service_.get()); | |
185 content_verifier_->Start(); | 219 content_verifier_->Start(); |
186 info_map()->SetContentVerifier(content_verifier_.get()); | 220 info_map()->SetContentVerifier(content_verifier_.get()); |
187 | 221 |
188 management_policy_.reset(new ManagementPolicy); | 222 management_policy_.reset(new ManagementPolicy); |
189 RegisterManagementPolicyProviders(); | 223 RegisterManagementPolicyProviders(); |
190 } | 224 } |
191 | 225 |
192 bool skip_session_extensions = false; | 226 bool skip_session_extensions = false; |
193 #if defined(OS_CHROMEOS) | 227 #if defined(OS_CHROMEOS) |
194 // Skip loading session extensions if we are not in a user session. | 228 // Skip loading session extensions if we are not in a user session. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 } | 283 } |
250 } | 284 } |
251 } | 285 } |
252 } | 286 } |
253 | 287 |
254 void ExtensionSystemImpl::Shared::Shutdown() { | 288 void ExtensionSystemImpl::Shared::Shutdown() { |
255 if (extension_warning_service_) { | 289 if (extension_warning_service_) { |
256 extension_warning_service_->RemoveObserver( | 290 extension_warning_service_->RemoveObserver( |
257 extension_warning_badge_service_.get()); | 291 extension_warning_badge_service_.get()); |
258 } | 292 } |
259 if (content_verifier_) { | 293 if (content_verifier_) |
260 if (extension_service_) | |
261 content_verifier_->RemoveObserver(extension_service_.get()); | |
262 content_verifier_->Shutdown(); | 294 content_verifier_->Shutdown(); |
263 } | |
264 | |
265 if (extension_service_) | 295 if (extension_service_) |
266 extension_service_->Shutdown(); | 296 extension_service_->Shutdown(); |
267 } | 297 } |
268 | 298 |
269 StateStore* ExtensionSystemImpl::Shared::state_store() { | 299 StateStore* ExtensionSystemImpl::Shared::state_store() { |
270 return state_store_.get(); | 300 return state_store_.get(); |
271 } | 301 } |
272 | 302 |
273 StateStore* ExtensionSystemImpl::Shared::rules_store() { | 303 StateStore* ExtensionSystemImpl::Shared::rules_store() { |
274 return rules_store_.get(); | 304 return rules_store_.get(); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 void ExtensionSystemImpl::UnregisterExtensionWithRequestContexts( | 491 void ExtensionSystemImpl::UnregisterExtensionWithRequestContexts( |
462 const std::string& extension_id, | 492 const std::string& extension_id, |
463 const UnloadedExtensionInfo::Reason reason) { | 493 const UnloadedExtensionInfo::Reason reason) { |
464 BrowserThread::PostTask( | 494 BrowserThread::PostTask( |
465 BrowserThread::IO, | 495 BrowserThread::IO, |
466 FROM_HERE, | 496 FROM_HERE, |
467 base::Bind(&InfoMap::RemoveExtension, info_map(), extension_id, reason)); | 497 base::Bind(&InfoMap::RemoveExtension, info_map(), extension_id, reason)); |
468 } | 498 } |
469 | 499 |
470 } // namespace extensions | 500 } // namespace extensions |
OLD | NEW |