Commit e3e610b7 authored by Hidehiko Abe's avatar Hidehiko Abe Committed by Commit Bot

Migrate ArcService to BrowserContextKeyedService part 14.

This CL migrates ArcPolicyBridge.

BUG=672829
TEST=Ran try.

Change-Id: Ie649513dede52ff28c0eb54713b1e29cc2e37857
Reviewed-on: https://chromium-review.googlesource.com/572483
Commit-Queue: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: default avatarLuis Hector Chavez <lhchavez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487146}
parent 4b4a0767
...@@ -96,8 +96,6 @@ void ArcServiceLauncher::Initialize() { ...@@ -96,8 +96,6 @@ void ArcServiceLauncher::Initialize() {
// List in lexicographical order. // List in lexicographical order.
arc_service_manager_->AddService( arc_service_manager_->AddService(
base::MakeUnique<ArcIntentHelperBridge>(arc_bridge_service)); base::MakeUnique<ArcIntentHelperBridge>(arc_bridge_service));
arc_service_manager_->AddService(
base::MakeUnique<ArcPolicyBridge>(arc_bridge_service));
arc_service_manager_->AddService( arc_service_manager_->AddService(
base::MakeUnique<ArcProcessService>(arc_bridge_service)); base::MakeUnique<ArcProcessService>(arc_bridge_service));
arc_service_manager_->AddService( arc_service_manager_->AddService(
...@@ -182,6 +180,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) { ...@@ -182,6 +180,7 @@ void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
ArcMetricsService::GetForBrowserContext(profile); ArcMetricsService::GetForBrowserContext(profile);
ArcNetHostImpl::GetForBrowserContext(profile); ArcNetHostImpl::GetForBrowserContext(profile);
ArcObbMounterBridge::GetForBrowserContext(profile); ArcObbMounterBridge::GetForBrowserContext(profile);
ArcPolicyBridge::GetForBrowserContext(profile);
ArcPowerBridge::GetForBrowserContext(profile); ArcPowerBridge::GetForBrowserContext(profile);
ArcPrintService::GetForBrowserContext(profile); ArcPrintService::GetForBrowserContext(profile);
ArcProvisionNotificationService::GetForBrowserContext(profile); ArcProvisionNotificationService::GetForBrowserContext(profile);
......
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include <vector>
#include "base/bind.h" #include "base/bind.h"
#include "base/json/json_reader.h" #include "base/json/json_reader.h"
#include "base/json/json_string_value_serializer.h" #include "base/json/json_string_value_serializer.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/memory/singleton.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
...@@ -25,14 +27,13 @@ ...@@ -25,14 +27,13 @@
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "chromeos/network/onc/onc_utils.h" #include "chromeos/network/onc/onc_utils.h"
#include "components/arc/arc_bridge_service.h" #include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "components/onc/onc_constants.h" #include "components/onc/onc_constants.h"
#include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_map.h"
#include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_namespace.h"
#include "components/policy/policy_constants.h" #include "components/policy/policy_constants.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "components/safe_json/safe_json_parser.h" #include "components/safe_json/safe_json_parser.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
#include "crypto/sha2.h" #include "crypto/sha2.h"
namespace arc { namespace arc {
...@@ -243,12 +244,6 @@ std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map) { ...@@ -243,12 +244,6 @@ std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map) {
return policy_json; return policy_json;
} }
Profile* GetProfile() {
const user_manager::User* const primary_user =
user_manager::UserManager::Get()->GetPrimaryUser();
return chromeos::ProfileHelper::Get()->GetProfileByUser(primary_user);
}
void OnReportComplianceParseFailure( void OnReportComplianceParseFailure(
const ArcPolicyBridge::ReportComplianceCallback& callback, const ArcPolicyBridge::ReportComplianceCallback& callback,
const std::string& error) { const std::string& error) {
...@@ -288,27 +283,67 @@ std::string GetPoliciesHash(const std::string& json_policies) { ...@@ -288,27 +283,67 @@ std::string GetPoliciesHash(const std::string& json_policies) {
base::HexEncode(hash_bits.c_str(), hash_bits.length())); base::HexEncode(hash_bits.c_str(), hash_bits.length()));
} }
// Singleton factory for ArcPolicyBridge.
class ArcPolicyBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcPolicyBridge,
ArcPolicyBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcPolicyBridgeFactory";
static ArcPolicyBridgeFactory* GetInstance() {
return base::Singleton<ArcPolicyBridgeFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcPolicyBridgeFactory>;
ArcPolicyBridgeFactory() {
DependsOn(policy::ProfilePolicyConnectorFactory::GetInstance());
}
~ArcPolicyBridgeFactory() override = default;
};
} // namespace } // namespace
ArcPolicyBridge::ArcPolicyBridge(ArcBridgeService* bridge_service) // static
: ArcService(bridge_service), binding_(this), weak_ptr_factory_(this) { ArcPolicyBridge* ArcPolicyBridge::GetForBrowserContext(
content::BrowserContext* context) {
return ArcPolicyBridgeFactory::GetForBrowserContext(context);
}
ArcPolicyBridge::ArcPolicyBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: context_(context),
arc_bridge_service_(bridge_service),
binding_(this),
weak_ptr_factory_(this) {
VLOG(2) << "ArcPolicyBridge::ArcPolicyBridge"; VLOG(2) << "ArcPolicyBridge::ArcPolicyBridge";
arc_bridge_service()->policy()->AddObserver(this); arc_bridge_service_->policy()->AddObserver(this);
} }
ArcPolicyBridge::ArcPolicyBridge(ArcBridgeService* bridge_service, ArcPolicyBridge::ArcPolicyBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service,
policy::PolicyService* policy_service) policy::PolicyService* policy_service)
: ArcService(bridge_service), : context_(context),
arc_bridge_service_(bridge_service),
binding_(this), binding_(this),
policy_service_(policy_service), policy_service_(policy_service),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
VLOG(2) << "ArcPolicyBridge::ArcPolicyBridge(bridge_service, policy_service)"; VLOG(2) << "ArcPolicyBridge::ArcPolicyBridge(bridge_service, policy_service)";
arc_bridge_service()->policy()->AddObserver(this); arc_bridge_service_->policy()->AddObserver(this);
} }
ArcPolicyBridge::~ArcPolicyBridge() { ArcPolicyBridge::~ArcPolicyBridge() {
VLOG(2) << "ArcPolicyBridge::~ArcPolicyBridge"; VLOG(2) << "ArcPolicyBridge::~ArcPolicyBridge";
arc_bridge_service()->policy()->RemoveObserver(this);
// TODO(hidehiko): Currently, the lifetime of ArcBridgeService and
// BrowserContextKeyedService is not nested.
// If ArcServiceManager::Get() returns nullptr, it is already destructed,
// so do not touch it.
if (ArcServiceManager::Get())
arc_bridge_service_->policy()->RemoveObserver(this);
} }
// static // static
...@@ -330,7 +365,7 @@ void ArcPolicyBridge::OnInstanceReady() { ...@@ -330,7 +365,7 @@ void ArcPolicyBridge::OnInstanceReady() {
initial_policies_hash_ = GetPoliciesHash(GetCurrentJSONPolicies()); initial_policies_hash_ = GetPoliciesHash(GetCurrentJSONPolicies());
mojom::PolicyInstance* const policy_instance = mojom::PolicyInstance* const policy_instance =
ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->policy(), Init); ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->policy(), Init);
DCHECK(policy_instance); DCHECK(policy_instance);
mojom::PolicyHostPtr host_proxy; mojom::PolicyHostPtr host_proxy;
binding_.Bind(mojo::MakeRequest(&host_proxy)); binding_.Bind(mojo::MakeRequest(&host_proxy));
...@@ -363,7 +398,7 @@ void ArcPolicyBridge::OnPolicyUpdated(const policy::PolicyNamespace& ns, ...@@ -363,7 +398,7 @@ void ArcPolicyBridge::OnPolicyUpdated(const policy::PolicyNamespace& ns,
const policy::PolicyMap& previous, const policy::PolicyMap& previous,
const policy::PolicyMap& current) { const policy::PolicyMap& current) {
VLOG(1) << "ArcPolicyBridge::OnPolicyUpdated"; VLOG(1) << "ArcPolicyBridge::OnPolicyUpdated";
auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service()->policy(), auto* instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->policy(),
OnPolicyUpdated); OnPolicyUpdated);
if (!instance) if (!instance)
return; return;
...@@ -380,7 +415,7 @@ void ArcPolicyBridge::OnPolicyUpdated(const policy::PolicyNamespace& ns, ...@@ -380,7 +415,7 @@ void ArcPolicyBridge::OnPolicyUpdated(const policy::PolicyNamespace& ns,
void ArcPolicyBridge::InitializePolicyService() { void ArcPolicyBridge::InitializePolicyService() {
auto* profile_policy_connector = auto* profile_policy_connector =
policy::ProfilePolicyConnectorFactory::GetForBrowserContext(GetProfile()); policy::ProfilePolicyConnectorFactory::GetForBrowserContext(context_);
policy_service_ = profile_policy_connector->policy_service(); policy_service_ = profile_policy_connector->policy_service();
is_managed_ = profile_policy_connector->IsManaged(); is_managed_ = profile_policy_connector->IsManaged();
} }
...@@ -400,8 +435,8 @@ void ArcPolicyBridge::OnReportComplianceParseSuccess( ...@@ -400,8 +435,8 @@ void ArcPolicyBridge::OnReportComplianceParseSuccess(
std::unique_ptr<base::Value> parsed_json) { std::unique_ptr<base::Value> parsed_json) {
// Always returns "compliant". // Always returns "compliant".
callback.Run(kPolicyCompliantJson); callback.Run(kPolicyCompliantJson);
GetProfile()->GetPrefs()->SetBoolean(prefs::kArcPolicyComplianceReported, Profile::FromBrowserContext(context_)->GetPrefs()->SetBoolean(
true); prefs::kArcPolicyComplianceReported, true);
const base::DictionaryValue* dict = nullptr; const base::DictionaryValue* dict = nullptr;
if (parsed_json->GetAsDictionary(&dict)) if (parsed_json->GetAsDictionary(&dict))
......
...@@ -14,11 +14,16 @@ ...@@ -14,11 +14,16 @@
#include "components/arc/arc_service.h" #include "components/arc/arc_service.h"
#include "components/arc/common/policy.mojom.h" #include "components/arc/common/policy.mojom.h"
#include "components/arc/instance_holder.h" #include "components/arc/instance_holder.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_namespace.h"
#include "components/policy/core/common/policy_service.h" #include "components/policy/core/common/policy_service.h"
#include "components/pref_registry/pref_registry_syncable.h" #include "components/pref_registry/pref_registry_syncable.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
namespace content {
class BrowserContext;
} // namespace content
namespace policy { namespace policy {
class PolicyMap; class PolicyMap;
} // namespace policy } // namespace policy
...@@ -36,13 +41,20 @@ enum ArcCertsSyncMode : int32_t { ...@@ -36,13 +41,20 @@ enum ArcCertsSyncMode : int32_t {
COPY_CA_CERTS = 1 COPY_CA_CERTS = 1
}; };
class ArcPolicyBridge : public ArcService, class ArcPolicyBridge : public KeyedService,
public InstanceHolder<mojom::PolicyInstance>::Observer, public InstanceHolder<mojom::PolicyInstance>::Observer,
public mojom::PolicyHost, public mojom::PolicyHost,
public policy::PolicyService::Observer { public policy::PolicyService::Observer {
public: public:
explicit ArcPolicyBridge(ArcBridgeService* bridge_service); // Returns singleton instance for the given BrowserContext,
ArcPolicyBridge(ArcBridgeService* bridge_service, // or nullptr if the browser |context| is not allowed to use ARC.
static ArcPolicyBridge* GetForBrowserContext(
content::BrowserContext* context);
ArcPolicyBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service);
ArcPolicyBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service,
policy::PolicyService* policy_service); policy::PolicyService* policy_service);
~ArcPolicyBridge() override; ~ArcPolicyBridge() override;
...@@ -77,6 +89,9 @@ class ArcPolicyBridge : public ArcService, ...@@ -77,6 +89,9 @@ class ArcPolicyBridge : public ArcService,
void UpdateComplianceReportMetrics(const base::DictionaryValue* report); void UpdateComplianceReportMetrics(const base::DictionaryValue* report);
content::BrowserContext* const context_;
ArcBridgeService* const arc_bridge_service_; // Owned by ArcServiceManager.
mojo::Binding<PolicyHost> binding_; mojo::Binding<PolicyHost> binding_;
policy::PolicyService* policy_service_ = nullptr; policy::PolicyService* policy_service_ = nullptr;
bool is_managed_ = false; bool is_managed_ = false;
......
...@@ -118,10 +118,6 @@ class ArcPolicyBridgeTest : public testing::Test { ...@@ -118,10 +118,6 @@ class ArcPolicyBridgeTest : public testing::Test {
void SetUp() override { void SetUp() override {
bridge_service_ = base::MakeUnique<ArcBridgeService>(); bridge_service_ = base::MakeUnique<ArcBridgeService>();
policy_bridge_ = base::MakeUnique<ArcPolicyBridge>(bridge_service_.get(),
&policy_service_);
policy_bridge_->OverrideIsManagedForTesting(true);
EXPECT_CALL(policy_service_, EXPECT_CALL(policy_service_,
GetPolicies(policy::PolicyNamespace( GetPolicies(policy::PolicyNamespace(
policy::POLICY_DOMAIN_CHROME, std::string()))) policy::POLICY_DOMAIN_CHROME, std::string())))
...@@ -146,6 +142,11 @@ class ArcPolicyBridgeTest : public testing::Test { ...@@ -146,6 +142,11 @@ class ArcPolicyBridgeTest : public testing::Test {
ASSERT_TRUE(testing_profile_manager_->SetUp()); ASSERT_TRUE(testing_profile_manager_->SetUp());
profile_ = testing_profile_manager_->CreateTestingProfile("user@gmail.com"); profile_ = testing_profile_manager_->CreateTestingProfile("user@gmail.com");
ASSERT_TRUE(profile_); ASSERT_TRUE(profile_);
// TODO(hidehiko): Use Singleton instance tied to BrowserContext.
policy_bridge_ = base::MakeUnique<ArcPolicyBridge>(
profile_, bridge_service_.get(), &policy_service_);
policy_bridge_->OverrideIsManagedForTesting(true);
} }
protected: protected:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment