blob: c5a370d822026443604faeca499d552bef73a6dc [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/crosapi/network_settings_service_ash.h"
#include <stdint.h>
#include "ash/constants/ash_pref_names.h"
#include "base/check_is_test.h"
#include "base/logging.h"
#include "base/notreached.h"
#include "chrome/browser/ash/crosapi/browser_util.h"
#include "chrome/browser/ash/crosapi/network_settings_translation.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/proxy_config/proxy_config_pref_names.h"
#include "components/user_manager/user_manager.h"
namespace {
// Returns the extension metadata (as a crosapi object) for the extension which
// is controlling the proxy in the Lacros primary profile. If the proxy is not
// controlled by an extension, returns the null pointer.
crosapi::mojom::ExtensionControllingProxyPtr GetExtensionPtr(
const ash::AshProxyMonitor* ash_proxy_monitor) {
if (!ash_proxy_monitor ||
!ash_proxy_monitor->GetLacrosExtensionControllingTheProxy()) {
return nullptr;
}
std::optional<ash::AshProxyMonitor::ExtensionMetadata> extension_metadata =
ash_proxy_monitor->GetLacrosExtensionControllingTheProxy();
crosapi::mojom::ExtensionControllingProxyPtr extension =
crosapi::mojom::ExtensionControllingProxy::New();
extension->name = extension_metadata->name;
extension->id = extension_metadata->id;
extension->can_be_disabled = extension_metadata->can_be_disabled;
return extension;
}
} // namespace
namespace crosapi {
NetworkSettingsServiceAsh::NetworkSettingsServiceAsh(
ash::AshProxyMonitor* ash_proxy_monitor)
: ash_proxy_monitor_(ash_proxy_monitor) {
// Missing in unit tests.
if (ash_proxy_monitor_) {
ash_proxy_monitor_observation_.Observe(ash_proxy_monitor_);
} else {
CHECK_IS_TEST();
}
observers_.set_disconnect_handler(base::BindRepeating(
&NetworkSettingsServiceAsh::OnDisconnect, base::Unretained(this)));
}
NetworkSettingsServiceAsh::~NetworkSettingsServiceAsh() = default;
void NetworkSettingsServiceAsh::BindReceiver(
mojo::PendingReceiver<mojom::NetworkSettingsService> pending_receiver) {
receivers_.Add(this, std::move(pending_receiver));
}
void NetworkSettingsServiceAsh::SetExtensionProxy(
crosapi::mojom::ProxyConfigPtr proxy_config) {
NOTREACHED()
<< "This version of Ash receives the proxy pref from the Prefs mojo "
"service. Please use SetExtensionControllingProxyMetadata to set the "
"extension metadata.";
}
void NetworkSettingsServiceAsh::ClearExtensionProxy() {
NOTREACHED()
<< "This version of Ash clears the proxy pref from the Prefs mojo "
"service. Please use ClearExtensionControllingProxyMetadata to clear "
"the extension metadata.";
}
void NetworkSettingsServiceAsh::SetExtensionControllingProxyMetadata(
crosapi::mojom::ExtensionControllingProxyPtr extension) {
DCHECK(extension);
ash_proxy_monitor_->SetLacrosExtensionControllingProxyInfo(
extension->name, extension->id, extension->can_be_disabled);
}
void NetworkSettingsServiceAsh::ClearExtensionControllingProxyMetadata() {
ash_proxy_monitor_->ClearLacrosExtensionControllingProxyInfo();
}
void NetworkSettingsServiceAsh::AddNetworkSettingsObserver(
mojo::PendingRemote<mojom::NetworkSettingsObserver> observer) {
mojo::Remote<mojom::NetworkSettingsObserver> remote(std::move(observer));
if (cached_proxy_config_) {
remote->OnProxyChanged(cached_proxy_config_.Clone());
}
observers_.Add(std::move(remote));
}
void NetworkSettingsServiceAsh::IsAlwaysOnVpnPreConnectUrlAllowlistEnforced(
IsAlwaysOnVpnPreConnectUrlAllowlistEnforcedCallback callback) {
std::move(callback).Run(alwayson_vpn_pre_connect_url_allowlist_enforced_);
}
void NetworkSettingsServiceAsh::SetAlwaysOnVpnPreConnectUrlAllowlistEnforced(
bool enforced) {
alwayson_vpn_pre_connect_url_allowlist_enforced_ = enforced;
for (const auto& obs : observers_) {
obs->OnAlwaysOnVpnPreConnectUrlAllowlistEnforcedChanged(
alwayson_vpn_pre_connect_url_allowlist_enforced_);
}
}
void NetworkSettingsServiceAsh::OnProxyChanged() {
crosapi::mojom::ProxyConfigPtr new_proxy_config =
ProxyConfigToCrosapiProxy(ash_proxy_monitor_->GetLatestProxyConfig(),
ash_proxy_monitor_->GetLatestWpadUrl());
new_proxy_config->extension = GetExtensionPtr(ash_proxy_monitor_);
// Proxy config has not changed.
if (cached_proxy_config_ && new_proxy_config->Equals(*cached_proxy_config_)) {
return;
}
cached_proxy_config_ = std::move(new_proxy_config);
for (const auto& obs : observers_) {
obs->OnProxyChanged(cached_proxy_config_.Clone());
}
}
void NetworkSettingsServiceAsh::OnDisconnect(mojo::RemoteSetElementId mojo_id) {
observers_.Remove(mojo_id);
}
} // namespace crosapi