// 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/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) {}

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);
}
