// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
#define CHROME_BROWSER_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "base/values.h"
#include "chromeos/ash/components/network/policy_certificate_provider.h"
#include "chromeos/components/onc/certificate_scope.h"
#include "chromeos/components/onc/onc_parsed_certificates.h"
#include "components/onc/onc_constants.h"
#include "components/policy/core/common/policy_service.h"
namespace policy {
class PolicyMap;
// Implements the common part of tracking the OpenNetworkConfiguration device
// and user policy. Implements the handling of server and authority certificates
// (that will be propagated to the network service). Provides entry points for
// handling client certificates and network configurations in subclasses.
// Does not handle proxy settings.
class NetworkConfigurationUpdater : public ash::PolicyCertificateProvider,
public PolicyService::Observer {
public:
NetworkConfigurationUpdater(const NetworkConfigurationUpdater&) = delete;
NetworkConfigurationUpdater& operator=(const NetworkConfigurationUpdater&) =
delete;
~NetworkConfigurationUpdater() override;
// PolicyService::Observer overrides
void OnPolicyUpdated(const PolicyNamespace& ns,
const PolicyMap& previous,
const PolicyMap& current) override;
void OnPolicyServiceInitialized(PolicyDomain domain) override;
// The observer interface sends notifications about changes in server and
// authority certificates.
// ash::PolicyCertificateProvider:
void AddPolicyProvidedCertsObserver(
ash::PolicyCertificateProvider::Observer* observer) override;
void RemovePolicyProvidedCertsObserver(
ash::PolicyCertificateProvider::Observer* observer) override;
net::CertificateList GetAllServerAndAuthorityCertificates(
const chromeos::onc::CertificateScope& scope) const override;
net::CertificateList GetAllAuthorityCertificates(
const chromeos::onc::CertificateScope& scope) const override;
net::CertificateList GetWebTrustedCertificates(
const chromeos::onc::CertificateScope& scope) const override;
net::CertificateList GetCertificatesWithoutWebTrust(
const chromeos::onc::CertificateScope& scope) const override;
const std::set<std::string>& GetExtensionIdsWithPolicyCertificates()
const override;
protected:
NetworkConfigurationUpdater(onc::ONCSource onc_source,
std::string policy_key,
PolicyService* policy_service);
virtual void Init();
// Called in the subclass to import client certificates provided by the ONC
// policy. The client certificates to be imported can be obtained using
// |GetClientcertificates()|.
virtual void ImportClientCertificates() = 0;
// Parses the incoming policy, applies server and authority certificates.
// Calls the specialized methods from subclasses to handle client certificates
// and network configs.
virtual void ApplyNetworkPolicy(
const base::Value::List& network_configs_onc,
const base::Value::Dict& global_network_config) = 0;
// Parses the current value of the ONC policy. Clears |network_configs|,
// |global_network_config| and |certificates| and fills them with the
// validated NetworkConfigurations, GlobalNetworkConfiguration and
// Certificates of the current policy. Callers can pass nullptr to any of
// |network_configs|, |global_network_config|, |certificates| if they don't
// need that specific part of the ONC policy.
void ParseCurrentPolicy(base::Value::List* network_configs,
base::Value::Dict* global_network_config,
base::Value::List* certificates);
const std::vector<chromeos::onc::OncParsedCertificates::ClientCertificate>&
GetClientCertificates() const;
onc::ONCSource onc_source_;
SEQUENCE_CHECKER(sequence_checker_);
private:
// Called if the ONC policy changed.
void OnPolicyChanged(const base::Value* previous, const base::Value* current);
// Apply the observed policy, i.e. both networks and certificates.
void ApplyPolicy();
std::string LogHeader() const;
// Imports the certificates part of the policy.
void ImportCertificates(base::Value::List certificates_onc);
void NotifyPolicyProvidedCertsChanged();
std::string policy_key_;
// Used to register for notifications from the |policy_service_|.
PolicyChangeRegistrar policy_change_registrar_;
// Used to retrieve the policies.
raw_ptr<PolicyService> policy_service_;
// Holds certificates from the last parsed ONC policy.
std::unique_ptr<chromeos::onc::OncParsedCertificates> certs_;
std::set<std::string> extension_ids_with_policy_certificates_;
// Observer list for notifying about ONC-provided server and CA certificate
// changes.
base::ObserverList<ash::PolicyCertificateProvider::Observer, true>::Unchecked
observer_list_;
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_NETWORKING_NETWORK_CONFIGURATION_UPDATER_H_