Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(700)

Side by Side Diff: remoting/host/policy_hack/policy_watcher.h

Issue 830193002: Using PolicyServiceWatcher instead of PolicyWatcherLinux/Win/Mac. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed code review feedback from Mattias. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_ 5 #ifndef REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_
6 #define REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_ 6 #define REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_
7 7
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
10 #include "base/values.h" 10 #include "base/values.h"
11 #include "components/policy/core/common/policy_service.h"
12 11
13 namespace base { 12 namespace base {
14 class SingleThreadTaskRunner; 13 class SingleThreadTaskRunner;
15 class TimeDelta; 14 class TimeDelta;
16 class WaitableEvent; 15 class WaitableEvent;
17 } // namespace base 16 } // namespace base
18 17
18 namespace policy {
19 class PolicyService;
20 } // namespace policy
21
19 namespace remoting { 22 namespace remoting {
20 namespace policy_hack { 23 namespace policy_hack {
21 24
22 // Watches for changes to the managed remote access host policies. 25 // Watches for changes to the managed remote access host policies.
23 // If StartWatching() has been called, then before this object can be deleted, 26 // If StartWatching() has been called, then before this object can be deleted,
24 // StopWatching() have completed (the provided |done| event must be signaled). 27 // StopWatching() have completed (the provided |done| event must be signaled).
25 class PolicyWatcher { 28 class PolicyWatcher {
26 public: 29 public:
27 // Called first with all policies, and subsequently with any changed policies. 30 // Called first with all policies, and subsequently with any changed policies.
28 typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)> 31 typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)>
29 PolicyUpdatedCallback; 32 PolicyUpdatedCallback;
30 33
34 // TODO(lukasza): PolicyErrorCallback never gets called by
35 // PolicyServiceWatcher. Need to either 1) remove error-handling from
36 // PolicyWatcher or 2) add error-handling around PolicyService
37 // 2a) Add policy name/type validation via policy::Schema::Normalize.
38 // 2b) Consider exposing parsing errors from policy::ConfigDirPolicyLoader.
39
31 // Called after detecting malformed policies. 40 // Called after detecting malformed policies.
32 typedef base::Callback<void()> PolicyErrorCallback; 41 typedef base::Callback<void()> PolicyErrorCallback;
33 42
43 // Derived classes specify which |task_runner| should be used for calling
44 // their StartWatchingInternal and StopWatchingInternal methods.
45 // Derived classes promise back to call UpdatePolicies and other instance
46 // methods on the same |task_runner|.
34 explicit PolicyWatcher( 47 explicit PolicyWatcher(
35 scoped_refptr<base::SingleThreadTaskRunner> task_runner); 48 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
49
36 virtual ~PolicyWatcher(); 50 virtual ~PolicyWatcher();
37 51
38 // This guarantees that the |policy_updated_callback| is called at least once 52 // This guarantees that the |policy_updated_callback| is called at least once
39 // with the current policies. After that, |policy_updated_callback| will be 53 // with the current policies. After that, |policy_updated_callback| will be
40 // called whenever a change to any policy is detected. It will then be called 54 // called whenever a change to any policy is detected. It will then be called
41 // only with the changed policies. 55 // only with the changed policies.
42 // 56 //
43 // |policy_error_callback| will be called when malformed policies are detected 57 // |policy_error_callback| will be called when malformed policies are detected
44 // (i.e. wrong type of policy value, or unparseable files under 58 // (i.e. wrong type of policy value, or unparseable files under
45 // /etc/opt/chrome/policies/managed). 59 // /etc/opt/chrome/policies/managed).
46 // When called, the |policy_error_callback| is responsible for mitigating the 60 // When called, the |policy_error_callback| is responsible for mitigating the
47 // security risk of running with incorrectly formulated policies (by either 61 // security risk of running with incorrectly formulated policies (by either
48 // shutting down or locking down the host). 62 // shutting down or locking down the host).
49 // After calling |policy_error_callback| PolicyWatcher will continue watching 63 // After calling |policy_error_callback| PolicyWatcher will continue watching
50 // for policy changes and will call |policy_updated_callback| when the error 64 // for policy changes and will call |policy_updated_callback| when the error
51 // is recovered from and may call |policy_error_callback| when new errors are 65 // is recovered from and may call |policy_error_callback| when new errors are
52 // found. 66 // found.
67 //
68 // See |Create| method's description for comments about which thread will
69 // be used to run the callbacks.
53 virtual void StartWatching( 70 virtual void StartWatching(
54 const PolicyUpdatedCallback& policy_updated_callback, 71 const PolicyUpdatedCallback& policy_updated_callback,
55 const PolicyErrorCallback& policy_error_callback); 72 const PolicyErrorCallback& policy_error_callback);
56 73
57 // Should be called after StartWatching() before the object is deleted. Calls 74 // Should be called after StartWatching() before the object is deleted. Calls
58 // should wait for |stopped_callback| to be called before deleting it. 75 // should wait for |stopped_callback| to be called before deleting it.
59 virtual void StopWatching(const base::Closure& stopped_callback); 76 virtual void StopWatching(const base::Closure& stopped_callback);
60 77
61 // Implemented by each platform. |task_runner| should be an IO message loop. 78 // Specify a |policy_service| to borrow (on Chrome OS, from the browser
62 // |policy_service| is currently only used on ChromeOS. The caller must 79 // process) or specify nullptr to internally construct and use a new
63 // ensure that |policy_service| remains valid for the lifetime of 80 // PolicyService (on other OS-es).
64 // PolicyWatcher. 81 //
82 // When |policy_service| is null, then |task_runner| is used for reading the
83 // policy from files / registry / preferences. PolicyUpdatedCallback and
84 // PolicyErrorCallback will be called on the same |task_runner|.
85 // |task_runner| should be of TYPE_IO type.
86 //
87 // When |policy_service| is specified then |task_runner| argument is ignored
88 // and 1) browser's UI thread is used for PolicyUpdatedCallback and
89 // PolicyErrorCallback and 2) browser's IO thread is used for reading the
Mattias Nissler (ping if slow) 2015/01/08 09:58:37 nit: Infamous Chrome trivia bit: What is referred
Łukasz Anforowicz 2015/01/08 23:09:27 Errr... I changed IO to FILE in the comment above
90 // policy from files / registry / preferences.
65 static scoped_ptr<PolicyWatcher> Create( 91 static scoped_ptr<PolicyWatcher> Create(
66 policy::PolicyService* policy_service, 92 policy::PolicyService* policy_service,
67 scoped_refptr<base::SingleThreadTaskRunner> task_runner); 93 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
68 94
69 // The name of the NAT traversal policy. 95 // The name of the NAT traversal policy.
70 static const char kNatPolicyName[]; 96 static const char kNatPolicyName[];
71 97
72 // The name of the policy for requiring 2-factor authentication. 98 // The name of the policy for requiring 2-factor authentication.
73 static const char kHostRequireTwoFactorPolicyName[]; 99 static const char kHostRequireTwoFactorPolicyName[];
74 100
75 // The name of the host domain policy. 101 // The name of the host domain policy.
76 static const char kHostDomainPolicyName[]; 102 static const char kHostDomainPolicyName[];
77 103
(...skipping 24 matching lines...) Expand all
102 128
103 // The name of the policy that restricts the range of host UDP ports. 129 // The name of the policy that restricts the range of host UDP ports.
104 static const char kUdpPortRangePolicyName[]; 130 static const char kUdpPortRangePolicyName[];
105 131
106 // The name of the policy for overriding policies, for use in testing. 132 // The name of the policy for overriding policies, for use in testing.
107 static const char kHostDebugOverridePoliciesName[]; 133 static const char kHostDebugOverridePoliciesName[];
108 134
109 protected: 135 protected:
110 virtual void StartWatchingInternal() = 0; 136 virtual void StartWatchingInternal() = 0;
111 virtual void StopWatchingInternal() = 0; 137 virtual void StopWatchingInternal() = 0;
112 virtual void Reload() = 0;
113 138
114 // Used to check if the class is on the right thread. 139 // Used to check if the class is on the right thread.
115 bool OnPolicyWatcherThread() const; 140 bool OnPolicyWatcherThread() const;
116 141
117 // Takes the policy dictionary from the OS specific store and extracts the 142 // Takes the policy dictionary from the OS specific store and extracts the
118 // relevant policies. 143 // relevant policies.
119 void UpdatePolicies(const base::DictionaryValue* new_policy); 144 void UpdatePolicies(const base::DictionaryValue* new_policy);
120 145
121 // Signals policy error to the registered |PolicyErrorCallback|. 146 // Signals policy error to the registered |PolicyErrorCallback|.
122 void SignalPolicyError(); 147 void SignalPolicyError();
123 148
124 // Called whenever a transient error occurs during reading of policy files. 149 // Called whenever a transient error occurs during reading of policy files.
125 // This will increment a counter, and will trigger a call to 150 // This will increment a counter, and will trigger a call to
126 // SignalPolicyError() only after a threshold count is reached. 151 // SignalPolicyError() only after a threshold count is reached.
127 // The counter is reset whenever policy has been successfully read. 152 // The counter is reset whenever policy has been successfully read.
128 void SignalTransientPolicyError(); 153 void SignalTransientPolicyError();
129 154
130 // Used for time-based reloads in case something goes wrong with the
131 // notification system.
132 void ScheduleFallbackReloadTask();
133 void ScheduleReloadTask(const base::TimeDelta& delay);
134
135 // Returns a DictionaryValue containing the default values for each policy. 155 // Returns a DictionaryValue containing the default values for each policy.
136 const base::DictionaryValue& Defaults() const; 156 const base::DictionaryValue& Defaults() const;
137 157
138 private: 158 private:
139 void StopWatchingOnPolicyWatcherThread(); 159 void StopWatchingOnPolicyWatcherThread();
140 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 160 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
141 161
142 PolicyUpdatedCallback policy_updated_callback_; 162 PolicyUpdatedCallback policy_updated_callback_;
143 PolicyErrorCallback policy_error_callback_; 163 PolicyErrorCallback policy_error_callback_;
144 int transient_policy_error_retry_counter_; 164 int transient_policy_error_retry_counter_;
145 165
146 scoped_ptr<base::DictionaryValue> old_policies_; 166 scoped_ptr<base::DictionaryValue> old_policies_;
147 scoped_ptr<base::DictionaryValue> default_values_; 167 scoped_ptr<base::DictionaryValue> default_values_;
148 scoped_ptr<base::DictionaryValue> bad_type_values_; 168 scoped_ptr<base::DictionaryValue> bad_type_values_;
149 169
150 // Allows us to cancel any inflight FileWatcher events or scheduled reloads. 170 // Allows us to cancel any inflight FileWatcher events or scheduled reloads.
151 base::WeakPtrFactory<PolicyWatcher> weak_factory_; 171 base::WeakPtrFactory<PolicyWatcher> weak_factory_;
152 }; 172 };
153 173
154 } // namespace policy_hack 174 } // namespace policy_hack
155 } // namespace remoting 175 } // namespace remoting
156 176
157 #endif // REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_ 177 #endif // REMOTING_HOST_POLICY_HACK_POLICY_WATCHER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698