| // Copyright 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/browser/plugins/plugins_resource_service.h" |
| |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/net/system_network_context_manager.h" |
| #include "chrome/browser/plugins/plugin_finder.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| #include "content/public/browser/network_service_instance.h" |
| #include "content/public/common/service_manager_connection.h" |
| #include "services/data_decoder/public/cpp/safe_json_parser.h" |
| #include "services/network/public/cpp/shared_url_loader_factory.h" |
| #include "url/gurl.h" |
| |
| namespace { |
| constexpr net::NetworkTrafficAnnotationTag |
| kPluginResourceServiceTrafficAnnotation = |
| net::DefineNetworkTrafficAnnotation("plugins_resource_service", R"( |
| semantics { |
| sender: "Plugins Resource Service" |
| description: |
| "Fetches updates to the list of plugins known to Chromium. For a " |
| "given plugin, this list contains the minimum version not " |
| "containing known security vulnerabilities, and can be used to " |
| "inform the user that their plugins need to be updated." |
| trigger: "Triggered at regular intervals (once per day)." |
| data: "None" |
| destination: GOOGLE_OWNED_SERVICE |
| } |
| policy { |
| cookies_allowed: NO |
| setting: "This feature cannot be disabled in settings." |
| policy_exception_justification: |
| "Not implemented. AllowOutdatedPlugins policy silences local " |
| "warnings, but network request to update the list of plugins are " |
| "still sent." |
| })"); |
| |
| } // namespace |
| |
| namespace { |
| |
| // Delay on first fetch so we don't interfere with startup. |
| const int kStartResourceFetchDelayMs = 60 * 1000; |
| |
| // Delay between calls to update the cache 1 day and 2 minutes in testing mode. |
| const int kCacheUpdateDelayMs = 24 * 60 * 60 * 1000; |
| |
| const char kPluginsServerUrl[] = |
| "https://www.gstatic.com/chrome/config/plugins_3/"; |
| |
| GURL GetPluginsServerURL() { |
| std::string filename; |
| #if defined(OS_WIN) |
| filename = "plugins_win.json"; |
| #elif defined(OS_CHROMEOS) |
| filename = "plugins_chromeos.json"; |
| #elif defined(OS_LINUX) |
| filename = "plugins_linux.json"; |
| #elif defined(OS_MACOSX) |
| filename = "plugins_mac.json"; |
| #else |
| #error Unknown platform |
| #endif |
| |
| return GURL(kPluginsServerUrl + filename); |
| } |
| |
| } // namespace |
| |
| PluginsResourceService::PluginsResourceService(PrefService* local_state) |
| : web_resource::WebResourceService( |
| local_state, |
| GetPluginsServerURL(), |
| std::string(), |
| prefs::kPluginsResourceCacheUpdate, |
| kStartResourceFetchDelayMs, |
| kCacheUpdateDelayMs, |
| g_browser_process->system_network_context_manager() |
| ->GetSharedURLLoaderFactory(), |
| switches::kDisableBackgroundNetworking, |
| base::Bind(data_decoder::SafeJsonParser::Parse, |
| content::ServiceManagerConnection::GetForProcess() |
| ->GetConnector()), |
| kPluginResourceServiceTrafficAnnotation, |
| base::BindOnce(&content::GetNetworkConnectionTracker)) {} |
| |
| void PluginsResourceService::Init() { |
| const base::DictionaryValue* metadata = |
| prefs_->GetDictionary(prefs::kPluginsMetadata); |
| PluginFinder::GetInstance()->ReinitializePlugins(metadata); |
| StartAfterDelay(); |
| } |
| |
| PluginsResourceService::~PluginsResourceService() { |
| } |
| |
| // static |
| void PluginsResourceService::RegisterPrefs(PrefRegistrySimple* registry) { |
| registry->RegisterDictionaryPref(prefs::kPluginsMetadata); |
| registry->RegisterStringPref(prefs::kPluginsResourceCacheUpdate, "0"); |
| } |
| |
| void PluginsResourceService::Unpack(const base::DictionaryValue& parsed_json) { |
| prefs_->Set(prefs::kPluginsMetadata, parsed_json); |
| PluginFinder::GetInstance()->ReinitializePlugins(&parsed_json); |
| } |