OLD | NEW |
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 // Most of this code is copied from: | 5 // Most of this code is copied from: |
6 // src/chrome/browser/policy/asynchronous_policy_loader.{h,cc} | 6 // src/chrome/browser/policy/asynchronous_policy_loader.{h,cc} |
7 | 7 |
8 #include "remoting/host/policy_hack/policy_watcher.h" | 8 #include "remoting/host/policy_hack/policy_watcher.h" |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 111 |
112 const char PolicyWatcher::kUdpPortRangePolicyName[] = | 112 const char PolicyWatcher::kUdpPortRangePolicyName[] = |
113 "RemoteAccessHostUdpPortRange"; | 113 "RemoteAccessHostUdpPortRange"; |
114 | 114 |
115 const char PolicyWatcher::kHostDebugOverridePoliciesName[] = | 115 const char PolicyWatcher::kHostDebugOverridePoliciesName[] = |
116 "RemoteAccessHostDebugOverridePolicies"; | 116 "RemoteAccessHostDebugOverridePolicies"; |
117 | 117 |
118 PolicyWatcher::PolicyWatcher( | 118 PolicyWatcher::PolicyWatcher( |
119 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | 119 scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
120 : task_runner_(task_runner), | 120 : task_runner_(task_runner), |
| 121 transient_policy_error_retry_counter_(0), |
121 old_policies_(new base::DictionaryValue()), | 122 old_policies_(new base::DictionaryValue()), |
122 default_values_(new base::DictionaryValue()), | 123 default_values_(new base::DictionaryValue()), |
123 weak_factory_(this) { | 124 weak_factory_(this) { |
124 // Initialize the default values for each policy. | 125 // Initialize the default values for each policy. |
125 default_values_->SetBoolean(kNatPolicyName, true); | 126 default_values_->SetBoolean(kNatPolicyName, true); |
126 default_values_->SetBoolean(kHostRequireTwoFactorPolicyName, false); | 127 default_values_->SetBoolean(kHostRequireTwoFactorPolicyName, false); |
127 default_values_->SetBoolean(kHostRequireCurtainPolicyName, false); | 128 default_values_->SetBoolean(kHostRequireCurtainPolicyName, false); |
128 default_values_->SetBoolean(kHostMatchUsernamePolicyName, false); | 129 default_values_->SetBoolean(kHostMatchUsernamePolicyName, false); |
129 default_values_->SetString(kHostDomainPolicyName, std::string()); | 130 default_values_->SetString(kHostDomainPolicyName, std::string()); |
130 default_values_->SetString(kHostTalkGadgetPrefixPolicyName, | 131 default_values_->SetString(kHostTalkGadgetPrefixPolicyName, |
(...skipping 13 matching lines...) Expand all Loading... |
144 // Initialize the fall-back values to use for unreadable policies. | 145 // Initialize the fall-back values to use for unreadable policies. |
145 // For most policies these match the defaults. | 146 // For most policies these match the defaults. |
146 bad_type_values_.reset(default_values_->DeepCopy()); | 147 bad_type_values_.reset(default_values_->DeepCopy()); |
147 bad_type_values_->SetBoolean(kNatPolicyName, false); | 148 bad_type_values_->SetBoolean(kNatPolicyName, false); |
148 bad_type_values_->SetBoolean(kRelayPolicyName, false); | 149 bad_type_values_->SetBoolean(kRelayPolicyName, false); |
149 } | 150 } |
150 | 151 |
151 PolicyWatcher::~PolicyWatcher() { | 152 PolicyWatcher::~PolicyWatcher() { |
152 } | 153 } |
153 | 154 |
154 void PolicyWatcher::StartWatching(const PolicyCallback& policy_callback) { | 155 void PolicyWatcher::StartWatching( |
| 156 const PolicyUpdatedCallback& policy_updated_callback, |
| 157 const PolicyErrorCallback& policy_error_callback) { |
155 if (!OnPolicyWatcherThread()) { | 158 if (!OnPolicyWatcherThread()) { |
156 task_runner_->PostTask(FROM_HERE, | 159 task_runner_->PostTask(FROM_HERE, |
157 base::Bind(&PolicyWatcher::StartWatching, | 160 base::Bind(&PolicyWatcher::StartWatching, |
158 base::Unretained(this), | 161 base::Unretained(this), |
159 policy_callback)); | 162 policy_updated_callback, |
| 163 policy_error_callback)); |
160 return; | 164 return; |
161 } | 165 } |
162 | 166 |
163 policy_callback_ = policy_callback; | 167 policy_updated_callback_ = policy_updated_callback; |
| 168 policy_error_callback_ = policy_error_callback; |
164 StartWatchingInternal(); | 169 StartWatchingInternal(); |
165 } | 170 } |
166 | 171 |
167 void PolicyWatcher::StopWatching(const base::Closure& stopped_callback) { | 172 void PolicyWatcher::StopWatching(const base::Closure& stopped_callback) { |
168 task_runner_->PostTaskAndReply( | 173 task_runner_->PostTaskAndReply( |
169 FROM_HERE, base::Bind(&PolicyWatcher::StopWatchingOnPolicyWatcherThread, | 174 FROM_HERE, base::Bind(&PolicyWatcher::StopWatchingOnPolicyWatcherThread, |
170 base::Unretained(this)), | 175 base::Unretained(this)), |
171 stopped_callback); | 176 stopped_callback); |
172 } | 177 } |
173 | 178 |
174 void PolicyWatcher::StopWatchingOnPolicyWatcherThread() { | 179 void PolicyWatcher::StopWatchingOnPolicyWatcherThread() { |
175 StopWatchingInternal(); | 180 StopWatchingInternal(); |
176 weak_factory_.InvalidateWeakPtrs(); | 181 weak_factory_.InvalidateWeakPtrs(); |
177 policy_callback_.Reset(); | 182 policy_updated_callback_.Reset(); |
| 183 policy_error_callback_.Reset(); |
178 } | 184 } |
179 | 185 |
180 void PolicyWatcher::ScheduleFallbackReloadTask() { | 186 void PolicyWatcher::ScheduleFallbackReloadTask() { |
181 DCHECK(OnPolicyWatcherThread()); | 187 DCHECK(OnPolicyWatcherThread()); |
182 ScheduleReloadTask( | 188 ScheduleReloadTask( |
183 base::TimeDelta::FromMinutes(kFallbackReloadDelayMinutes)); | 189 base::TimeDelta::FromMinutes(kFallbackReloadDelayMinutes)); |
184 } | 190 } |
185 | 191 |
186 void PolicyWatcher::ScheduleReloadTask(const base::TimeDelta& delay) { | 192 void PolicyWatcher::ScheduleReloadTask(const base::TimeDelta& delay) { |
187 DCHECK(OnPolicyWatcherThread()); | 193 DCHECK(OnPolicyWatcherThread()); |
188 task_runner_->PostDelayedTask( | 194 task_runner_->PostDelayedTask( |
189 FROM_HERE, | 195 FROM_HERE, |
190 base::Bind(&PolicyWatcher::Reload, weak_factory_.GetWeakPtr()), | 196 base::Bind(&PolicyWatcher::Reload, weak_factory_.GetWeakPtr()), |
191 delay); | 197 delay); |
192 } | 198 } |
193 | 199 |
194 const base::DictionaryValue& PolicyWatcher::Defaults() const { | 200 const base::DictionaryValue& PolicyWatcher::Defaults() const { |
195 return *default_values_; | 201 return *default_values_; |
196 } | 202 } |
197 | 203 |
198 bool PolicyWatcher::OnPolicyWatcherThread() const { | 204 bool PolicyWatcher::OnPolicyWatcherThread() const { |
199 return task_runner_->BelongsToCurrentThread(); | 205 return task_runner_->BelongsToCurrentThread(); |
200 } | 206 } |
201 | 207 |
202 void PolicyWatcher::UpdatePolicies( | 208 void PolicyWatcher::UpdatePolicies( |
203 const base::DictionaryValue* new_policies_raw) { | 209 const base::DictionaryValue* new_policies_raw) { |
204 DCHECK(OnPolicyWatcherThread()); | 210 DCHECK(OnPolicyWatcherThread()); |
205 | 211 |
| 212 transient_policy_error_retry_counter_ = 0; |
| 213 |
206 // Use default values for any missing policies. | 214 // Use default values for any missing policies. |
207 scoped_ptr<base::DictionaryValue> new_policies = | 215 scoped_ptr<base::DictionaryValue> new_policies = |
208 CopyGoodValuesAndAddDefaults( | 216 CopyGoodValuesAndAddDefaults( |
209 new_policies_raw, default_values_.get(), bad_type_values_.get()); | 217 new_policies_raw, default_values_.get(), bad_type_values_.get()); |
210 | 218 |
211 // Find the changed policies. | 219 // Find the changed policies. |
212 scoped_ptr<base::DictionaryValue> changed_policies( | 220 scoped_ptr<base::DictionaryValue> changed_policies( |
213 new base::DictionaryValue()); | 221 new base::DictionaryValue()); |
214 base::DictionaryValue::Iterator iter(*new_policies); | 222 base::DictionaryValue::Iterator iter(*new_policies); |
215 while (!iter.IsAtEnd()) { | 223 while (!iter.IsAtEnd()) { |
216 base::Value* old_policy; | 224 base::Value* old_policy; |
217 if (!(old_policies_->Get(iter.key(), &old_policy) && | 225 if (!(old_policies_->Get(iter.key(), &old_policy) && |
218 old_policy->Equals(&iter.value()))) { | 226 old_policy->Equals(&iter.value()))) { |
219 changed_policies->Set(iter.key(), iter.value().DeepCopy()); | 227 changed_policies->Set(iter.key(), iter.value().DeepCopy()); |
220 } | 228 } |
221 iter.Advance(); | 229 iter.Advance(); |
222 } | 230 } |
223 | 231 |
224 // Save the new policies. | 232 // Save the new policies. |
225 old_policies_.swap(new_policies); | 233 old_policies_.swap(new_policies); |
226 | 234 |
227 // Notify our client of the changed policies. | 235 // Notify our client of the changed policies. |
228 if (!changed_policies->empty()) { | 236 if (!changed_policies->empty()) { |
229 policy_callback_.Run(changed_policies.Pass()); | 237 policy_updated_callback_.Run(changed_policies.Pass()); |
230 } | 238 } |
231 } | 239 } |
232 | 240 |
| 241 void PolicyWatcher::SignalPolicyError() { |
| 242 transient_policy_error_retry_counter_ = 0; |
| 243 policy_error_callback_.Run(); |
| 244 } |
| 245 |
| 246 void PolicyWatcher::SignalTransientPolicyError() { |
| 247 const int kMaxRetryCount = 5; |
| 248 transient_policy_error_retry_counter_ += 1; |
| 249 if (transient_policy_error_retry_counter_ >= kMaxRetryCount) { |
| 250 SignalPolicyError(); |
| 251 } |
| 252 } |
| 253 |
233 } // namespace policy_hack | 254 } // namespace policy_hack |
234 } // namespace remoting | 255 } // namespace remoting |
OLD | NEW |