// Copyright 2018 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/chrome_cleaner/scanner/force_installed_extension_scanner_impl.h"

#include <memory>
#include <set>
#include <utility>

#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "chrome/chrome_cleaner/chrome_utils/extensions_util.h"
#include "chrome/chrome_cleaner/chrome_utils/force_installed_extension.h"
#include "chrome/chrome_cleaner/os/resource_util.h"

namespace chrome_cleaner {

using base::WaitableEvent;

ForceInstalledExtensionScannerImpl::ForceInstalledExtensionScannerImpl() =
    default;
ForceInstalledExtensionScannerImpl::~ForceInstalledExtensionScannerImpl() =
    default;

std::unique_ptr<UwEMatchers>
ForceInstalledExtensionScannerImpl::CreateUwEMatchersFromResource(
    int resource_id) {
  base::StringPiece serialized_matcher_pb;
  if (!chrome_cleaner::LoadResourceOfKind(resource_id, L"TEXT",
                                          &serialized_matcher_pb)) {
    LOG(DFATAL) << "Failed to load expected UwE matchers from resource id "
                << resource_id;
    return nullptr;
  }
  chrome_cleaner::UwEMatchers matcher;
  matcher.ParseFromString(serialized_matcher_pb.as_string());
  return std::make_unique<chrome_cleaner::UwEMatchers>(matcher);
}

std::vector<ForceInstalledExtension>
ForceInstalledExtensionScannerImpl::GetForceInstalledExtensions(
    JsonParserAPI* json_parser) {
  const base::TimeTicks end_time =
      base::TimeTicks::Now() +
      base::TimeDelta::FromMilliseconds(kParseAttemptTimeoutMilliseconds);

  std::vector<ExtensionPolicyRegistryEntry> policy_registry_entries_force_list;
  GetExtensionForcelistRegistryPolicies(&policy_registry_entries_force_list);

  std::vector<ExtensionPolicyFile> policy_files_default_extensions;
  WaitableEvent non_whitelist_default_extensions_done{
      WaitableEvent::ResetPolicy::MANUAL,
      WaitableEvent::InitialState::NOT_SIGNALED};
  GetNonWhitelistedDefaultExtensions(json_parser,
                                     &policy_files_default_extensions,
                                     &non_whitelist_default_extensions_done);

  std::vector<ExtensionPolicyRegistryEntry>
      policy_registry_entries_force_installed;
  WaitableEvent settings_force_installed_done{
      WaitableEvent::ResetPolicy::MANUAL,
      WaitableEvent::InitialState::NOT_SIGNALED};
  GetExtensionSettingsForceInstalledExtensions(
      json_parser, &policy_registry_entries_force_installed,
      &settings_force_installed_done);

  std::vector<ExtensionPolicyFile> policy_files_master_preferences;
  WaitableEvent master_preferences_done{
      WaitableEvent::ResetPolicy::MANUAL,
      WaitableEvent::InitialState::NOT_SIGNALED};
  GetMasterPreferencesExtensions(json_parser, &policy_files_master_preferences,
                                 &master_preferences_done);

  std::set<ForceInstalledExtension> result;
  while (policy_registry_entries_force_list.size() > 0) {
    ExtensionPolicyRegistryEntry entry =
        std::move(policy_registry_entries_force_list.back());
    policy_registry_entries_force_list.pop_back();
    base::Optional<ExtensionID> extension_id =
        ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
    if (!extension_id.has_value()) {
      continue;
    }
    ForceInstalledExtension extension(extension_id.value(),
                                      POLICY_EXTENSION_FORCELIST);
    result.emplace(std::move(extension));
  }

  non_whitelist_default_extensions_done.TimedWaitUntil(end_time);
  while (policy_files_default_extensions.size() > 0) {
    ExtensionPolicyFile file =
        std::move(policy_files_default_extensions.back());
    policy_files_default_extensions.pop_back();
    base::Optional<ExtensionID> extension_id =
        ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
    if (!extension_id.has_value()) {
      continue;
    }
    ForceInstalledExtension extension(extension_id.value(),
                                      DEFAULT_APPS_EXTENSION);
    extension.policy_file =
        std::make_shared<ExtensionPolicyFile>(std::move(file));
    result.emplace(std::move(extension));
  }

  settings_force_installed_done.TimedWaitUntil(end_time);
  while (policy_registry_entries_force_installed.size() > 0) {
    ExtensionPolicyRegistryEntry entry =
        std::move(policy_registry_entries_force_installed.back());
    policy_registry_entries_force_installed.pop_back();
    base::Optional<ExtensionID> extension_id =
        ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
    if (!extension_id.has_value()) {
      continue;
    }
    ForceInstalledExtension extension(extension_id.value(),
                                      POLICY_EXTENSION_SETTINGS);
    extension.policy_registry_entry =
        std::make_shared<ExtensionPolicyRegistryEntry>(std::move(entry));
    result.emplace(std::move(extension));
  }

  master_preferences_done.TimedWaitUntil(end_time);
  while (policy_files_master_preferences.size() > 0) {
    ExtensionPolicyFile file =
        std::move(policy_files_master_preferences.back());
    policy_files_master_preferences.pop_back();
    base::Optional<ExtensionID> extension_id =
        ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
    if (!extension_id.has_value()) {
      continue;
    }
    ForceInstalledExtension extension(extension_id.value(),
                                      POLICY_MASTER_PREFERENCES);
    extension.policy_file =
        std::make_shared<ExtensionPolicyFile>(std::move(file));
    result.emplace(std::move(extension));
  }

  return std::vector<ForceInstalledExtension>(result.begin(), result.end());
}

}  // namespace chrome_cleaner
