#include "components/policy/content/policy_blocklist_service.h"
#include <utility>
#include "base/functional/bind.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/policy/core/common/policy_pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/user_prefs/user_prefs.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "base/functional/callback_forward.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
constexpr char kAllTrafficWildcard[] = "*";
base::Value::List GetAllTrafficFilter() {
base::Value::List all_traffic;
all_traffic.Append(kAllTrafficWildcard);
return all_traffic;
}
class AlwaysOnVpnPreConnectBlocklistSource : public policy::BlocklistSource {
public:
AlwaysOnVpnPreConnectBlocklistSource(PrefService* pref_service)
: blocklist_(GetAllTrafficFilter()) {
pref_change_registrar_.Init(pref_service);
}
AlwaysOnVpnPreConnectBlocklistSource(
const AlwaysOnVpnPreConnectBlocklistSource&) = delete;
AlwaysOnVpnPreConnectBlocklistSource& operator=(
const AlwaysOnVpnPreConnectBlocklistSource&) = delete;
~AlwaysOnVpnPreConnectBlocklistSource() override = default;
const base::Value::List* GetBlocklistSpec() const override {
return &blocklist_;
}
const base::Value::List* GetAllowlistSpec() const override {
return &pref_change_registrar_.prefs()->GetList(
policy::policy_prefs::kAlwaysOnVpnPreConnectUrlAllowlist);
}
void SetBlocklistObserver(base::RepeatingClosure observer) override {
pref_change_registrar_.RemoveAll();
pref_change_registrar_.Add(
policy::policy_prefs::kAlwaysOnVpnPreConnectUrlAllowlist, observer);
}
private:
const base::Value::List blocklist_;
PrefChangeRegistrar pref_change_registrar_;
};
#endif
PolicyBlocklistService::PolicyBlocklistService(
std::unique_ptr<policy::URLBlocklistManager> url_blocklist_manager,
PrefService* user_prefs)
: … { … }
PolicyBlocklistService::~PolicyBlocklistService() = default;
policy::URLBlocklist::URLBlocklistState
PolicyBlocklistService::GetURLBlocklistState(const GURL& url) const { … }
#if BUILDFLAG(IS_CHROMEOS)
void PolicyBlocklistService::SetAlwaysOnVpnPreConnectUrlAllowlistEnforced(
bool enforced) {
if (enforced) {
url_blocklist_manager_->SetOverrideBlockListSource(
std::make_unique<AlwaysOnVpnPreConnectBlocklistSource>(user_prefs_));
return;
}
url_blocklist_manager_->SetOverrideBlockListSource(nullptr);
}
#endif
PolicyBlocklistFactory* PolicyBlocklistFactory::GetInstance() { … }
PolicyBlocklistService* PolicyBlocklistFactory::GetForBrowserContext(
content::BrowserContext* context) { … }
PolicyBlocklistFactory::PolicyBlocklistFactory()
: … { … }
PolicyBlocklistFactory::~PolicyBlocklistFactory() = default;
std::unique_ptr<KeyedService>
PolicyBlocklistFactory::BuildServiceInstanceForBrowserContext(
content::BrowserContext* context) const { … }
content::BrowserContext* PolicyBlocklistFactory::GetBrowserContextToUse(
content::BrowserContext* context) const { … }