// 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 "build/chromeos_buildflags.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 "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 BUILDFLAG(IS_CHROMEOS_ASH)
  filename = "plugins_chromeos.json";
#elif defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
  filename = "plugins_linux.json";
#elif defined(OS_MAC)
  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,
          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);
}
