| Index: remoting/host/policy_watcher.cc
|
| diff --git a/remoting/host/policy_watcher.cc b/remoting/host/policy_watcher.cc
|
| index b21da1bac6a43659e31ebaa26eb0564c17c72f15..da7a16334128103bee2e236540bd4180bd1626e4 100644
|
| --- a/remoting/host/policy_watcher.cc
|
| +++ b/remoting/host/policy_watcher.cc
|
| @@ -47,6 +47,70 @@ namespace key = ::policy::key;
|
|
|
| namespace {
|
|
|
| +// Watches for changes to the managed remote access host policies.
|
| +class PolicyWatcherImpl : public PolicyWatcher,
|
| + private policy::PolicyService::Observer {
|
| + public:
|
| + // |policy_service_task_runner| is the task runner where it is safe
|
| + // to call |policy_service_| methods and where we expect to get callbacks
|
| + // from |policy_service_|.
|
| + PolicyWatcherImpl(
|
| + policy::PolicyService* policy_service,
|
| + std::unique_ptr<policy::PolicyService> owned_policy_service,
|
| + std::unique_ptr<policy::ConfigurationPolicyProvider>
|
| + owned_policy_provider,
|
| + std::unique_ptr<policy::SchemaRegistry> owned_schema_registry);
|
| +
|
| + ~PolicyWatcherImpl() override;
|
| +
|
| + void StartWatching(const PolicyUpdatedCallback& policy_updated_callback,
|
| + const PolicyErrorCallback& policy_error_callback) override;
|
| +
|
| + private:
|
| + friend class PolicyWatcherTest;
|
| +
|
| + const policy::Schema* GetPolicySchema() const override;
|
| + const base::DictionaryValue* GetDefaultValues() const override;
|
| +
|
| + // Simplifying wrapper around Schema::Normalize.
|
| + // - Returns false if |dict| is invalid (i.e. contains mistyped policy
|
| + // values).
|
| + // - Returns true if |dict| was valid or got normalized.
|
| + bool NormalizePolicies(base::DictionaryValue* dict);
|
| +
|
| + // Stores |new_policies| into |old_policies_|. Returns dictionary with items
|
| + // from |new_policies| that are different from the old |old_policies_|.
|
| + std::unique_ptr<base::DictionaryValue> StoreNewAndReturnChangedPolicies(
|
| + std::unique_ptr<base::DictionaryValue> new_policies);
|
| +
|
| + // Signals policy error to the registered |PolicyErrorCallback|.
|
| + void SignalPolicyError();
|
| +
|
| + // PolicyService::Observer interface.
|
| + void OnPolicyUpdated(const policy::PolicyNamespace& ns,
|
| + const policy::PolicyMap& previous,
|
| + const policy::PolicyMap& current) override;
|
| + void OnPolicyServiceInitialized(policy::PolicyDomain domain) override;
|
| +
|
| + PolicyUpdatedCallback policy_updated_callback_;
|
| + PolicyErrorCallback policy_error_callback_;
|
| +
|
| + std::unique_ptr<base::DictionaryValue> old_policies_;
|
| + std::unique_ptr<base::DictionaryValue> default_values_;
|
| +
|
| + policy::PolicyService* policy_service_;
|
| +
|
| + // Order of fields below is important to ensure destruction takes object
|
| + // dependencies into account:
|
| + // - |owned_policy_service_| uses |owned_policy_provider_|
|
| + // - |owned_policy_provider_| uses |owned_schema_registry_|
|
| + std::unique_ptr<policy::SchemaRegistry> owned_schema_registry_;
|
| + std::unique_ptr<policy::ConfigurationPolicyProvider> owned_policy_provider_;
|
| + std::unique_ptr<policy::PolicyService> owned_policy_service_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PolicyWatcherImpl);
|
| +};
|
| +
|
| // Copies all policy values from one dictionary to another, using values from
|
| // |default_values| if they are not set in |from|.
|
| std::unique_ptr<base::DictionaryValue> CopyValuesAndAddDefaults(
|
| @@ -136,9 +200,16 @@ bool VerifyWellformedness(const base::DictionaryValue& changed_policies) {
|
| return true;
|
| }
|
|
|
| -} // namespace
|
| +void CopyDictionaryValue(const base::DictionaryValue& from,
|
| + base::DictionaryValue& to,
|
| + std::string key) {
|
| + const base::Value* value;
|
| + if (from.Get(key, &value)) {
|
| + to.Set(key, value->CreateDeepCopy());
|
| + }
|
| +}
|
|
|
| -void PolicyWatcher::StartWatching(
|
| +void PolicyWatcherImpl::StartWatching(
|
| const PolicyUpdatedCallback& policy_updated_callback,
|
| const PolicyErrorCallback& policy_error_callback) {
|
| DCHECK(CalledOnValidThread());
|
| @@ -158,12 +229,12 @@ void PolicyWatcher::StartWatching(
|
| }
|
| }
|
|
|
| -void PolicyWatcher::SignalPolicyError() {
|
| +void PolicyWatcherImpl::SignalPolicyError() {
|
| old_policies_->Clear();
|
| policy_error_callback_.Run();
|
| }
|
|
|
| -PolicyWatcher::PolicyWatcher(
|
| +PolicyWatcherImpl::PolicyWatcherImpl(
|
| policy::PolicyService* policy_service,
|
| std::unique_ptr<policy::PolicyService> owned_policy_service,
|
| std::unique_ptr<policy::ConfigurationPolicyProvider> owned_policy_provider,
|
| @@ -199,7 +270,7 @@ PolicyWatcher::PolicyWatcher(
|
| key::kRemoteAccessHostAllowUiAccessForRemoteAssistance, false);
|
| }
|
|
|
| -PolicyWatcher::~PolicyWatcher() {
|
| +PolicyWatcherImpl::~PolicyWatcherImpl() {
|
| // Stop observing |policy_service_| if StartWatching() has been called.
|
| if (!policy_updated_callback_.is_null()) {
|
| policy_service_->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this);
|
| @@ -210,11 +281,15 @@ PolicyWatcher::~PolicyWatcher() {
|
| }
|
| }
|
|
|
| -const policy::Schema* PolicyWatcher::GetPolicySchema() const {
|
| +const policy::Schema* PolicyWatcherImpl::GetPolicySchema() const {
|
| return owned_schema_registry_->schema_map()->GetSchema(GetPolicyNamespace());
|
| }
|
|
|
| -bool PolicyWatcher::NormalizePolicies(base::DictionaryValue* policy_dict) {
|
| +const base::DictionaryValue* PolicyWatcherImpl::GetDefaultValues() const {
|
| + return default_values_.get();
|
| +}
|
| +
|
| +bool PolicyWatcherImpl::NormalizePolicies(base::DictionaryValue* policy_dict) {
|
| // Allowing unrecognized policy names allows presence of
|
| // 1) comments (i.e. JSON of the form: { "_comment": "blah", ... }),
|
| // 2) policies intended for future/newer versions of the host,
|
| @@ -239,19 +314,8 @@ bool PolicyWatcher::NormalizePolicies(base::DictionaryValue* policy_dict) {
|
| }
|
| }
|
|
|
| -namespace {
|
| -void CopyDictionaryValue(const base::DictionaryValue& from,
|
| - base::DictionaryValue& to,
|
| - std::string key) {
|
| - const base::Value* value;
|
| - if (from.Get(key, &value)) {
|
| - to.Set(key, value->CreateDeepCopy());
|
| - }
|
| -}
|
| -} // namespace
|
| -
|
| std::unique_ptr<base::DictionaryValue>
|
| -PolicyWatcher::StoreNewAndReturnChangedPolicies(
|
| +PolicyWatcherImpl::StoreNewAndReturnChangedPolicies(
|
| std::unique_ptr<base::DictionaryValue> new_policies) {
|
| // Find the changed policies.
|
| std::unique_ptr<base::DictionaryValue> changed_policies(
|
| @@ -285,9 +349,9 @@ PolicyWatcher::StoreNewAndReturnChangedPolicies(
|
| return changed_policies;
|
| }
|
|
|
| -void PolicyWatcher::OnPolicyUpdated(const policy::PolicyNamespace& ns,
|
| - const policy::PolicyMap& previous,
|
| - const policy::PolicyMap& current) {
|
| +void PolicyWatcherImpl::OnPolicyUpdated(const policy::PolicyNamespace& ns,
|
| + const policy::PolicyMap& previous,
|
| + const policy::PolicyMap& current) {
|
| std::unique_ptr<base::DictionaryValue> new_policies =
|
| CopyChromotingPoliciesIntoDictionary(current);
|
|
|
| @@ -318,12 +382,18 @@ void PolicyWatcher::OnPolicyUpdated(const policy::PolicyNamespace& ns,
|
| policy_updated_callback_.Run(std::move(changed_policies));
|
| }
|
|
|
| -void PolicyWatcher::OnPolicyServiceInitialized(policy::PolicyDomain domain) {
|
| +void PolicyWatcherImpl::OnPolicyServiceInitialized(
|
| + policy::PolicyDomain domain) {
|
| policy::PolicyNamespace ns = GetPolicyNamespace();
|
| const policy::PolicyMap& current = policy_service_->GetPolicies(ns);
|
| OnPolicyUpdated(ns, current, current);
|
| }
|
|
|
| +} // namespace
|
| +
|
| +PolicyWatcher::PolicyWatcher() {}
|
| +PolicyWatcher::~PolicyWatcher() {}
|
| +
|
| std::unique_ptr<PolicyWatcher> PolicyWatcher::CreateFromPolicyLoader(
|
| std::unique_ptr<policy::AsyncPolicyLoader> async_policy_loader) {
|
| std::unique_ptr<policy::SchemaRegistry> schema_registry =
|
| @@ -339,7 +409,7 @@ std::unique_ptr<PolicyWatcher> PolicyWatcher::CreateFromPolicyLoader(
|
| new policy::PolicyServiceImpl(providers));
|
|
|
| policy::PolicyService* borrowed_policy_service = policy_service.get();
|
| - return base::WrapUnique(new PolicyWatcher(
|
| + return base::WrapUnique(new PolicyWatcherImpl(
|
| borrowed_policy_service, std::move(policy_service),
|
| std::move(policy_provider), std::move(schema_registry)));
|
| }
|
|
|