1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
10 #include "base/location.h"
11 #include "base/task_runner.h"
12 #include "chromeos/dbus/session_manager_client.h"
18 // Refresh interval for state keys. There's a quantized time component in
19 // state key generation, so they rotate over time. The quantum size is pretty
20 // coarse though (currently 2^23 seconds), so simply polling for a new state
21 // keys once a day is good enough.
22 const int kPollIntervalSeconds = 60 * 60 * 24;
26 ServerBackedStateKeysBroker::ServerBackedStateKeysBroker(
27 chromeos::SessionManagerClient* session_manager_client,
28 scoped_refptr<base::TaskRunner> delayed_task_runner)
29 : session_manager_client_(session_manager_client),
30 delayed_task_runner_(delayed_task_runner),
33 initial_retrieval_completed_(false),
37 ServerBackedStateKeysBroker::~ServerBackedStateKeysBroker() {
40 ServerBackedStateKeysBroker::Subscription
41 ServerBackedStateKeysBroker::RegisterUpdateCallback(
42 const base::Closure& callback) {
45 return update_callbacks_.Add(callback);
48 void ServerBackedStateKeysBroker::RequestStateKeys(
49 const StateKeysCallback& callback) {
51 request_callbacks_.push_back(callback);
56 if (!callback.is_null())
57 callback.Run(state_keys_, first_boot_);
61 void ServerBackedStateKeysBroker::FetchStateKeys() {
64 session_manager_client_->GetServerBackedStateKeys(
65 base::Bind(&ServerBackedStateKeysBroker::StoreStateKeys,
66 weak_factory_.GetWeakPtr()));
70 void ServerBackedStateKeysBroker::StoreStateKeys(
71 const std::vector<std::string>& state_keys, bool first_boot) {
72 bool send_notification = !initial_retrieval_completed_;
75 initial_retrieval_completed_ = true;
76 if (state_keys.empty()) {
77 LOG(WARNING) << "Failed to obtain server-backed state keys.";
78 } else if (state_keys.end() !=
79 std::find(state_keys.begin(), state_keys.end(), std::string())) {
80 LOG(WARNING) << "Bad state keys.";
82 send_notification |= state_keys_ != state_keys;
83 state_keys_ = state_keys;
84 first_boot_ = first_boot;
87 if (send_notification)
88 update_callbacks_.Notify();
90 std::vector<StateKeysCallback> callbacks;
91 request_callbacks_.swap(callbacks);
92 for (std::vector<StateKeysCallback>::const_iterator callback(
94 callback != callbacks.end();
96 if (!callback->is_null())
97 callback->Run(state_keys_, first_boot_);
100 delayed_task_runner_->PostDelayedTask(
102 base::Bind(&ServerBackedStateKeysBroker::FetchStateKeys,
103 weak_factory_.GetWeakPtr()),
104 base::TimeDelta::FromSeconds(kPollIntervalSeconds));
107 } // namespace policy