|  | // 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, | 
|  | std::make_unique<base::DictionaryValue>()); | 
|  | registry->RegisterStringPref(prefs::kPluginsResourceCacheUpdate, "0"); | 
|  | } | 
|  |  | 
|  | void PluginsResourceService::Unpack(const base::DictionaryValue& parsed_json) { | 
|  | prefs_->Set(prefs::kPluginsMetadata, parsed_json); | 
|  | PluginFinder::GetInstance()->ReinitializePlugins(&parsed_json); | 
|  | } |