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

Side by Side Diff: chrome/browser/chromeos/policy/device_local_account_policy_service.cc

Issue 14927015: Translate device-local account IDs to user IDs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 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 | Annotate | Revision Log
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 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" 5 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
6 6
7 #include <vector>
8
9 #include "base/bind.h"
7 #include "base/logging.h" 10 #include "base/logging.h"
8 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "chrome/browser/chromeos/policy/device_local_account.h"
9 #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" 13 #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h"
14 #include "chrome/browser/chromeos/settings/cros_settings.h"
15 #include "chrome/browser/chromeos/settings/cros_settings_names.h"
16 #include "chrome/browser/chromeos/settings/cros_settings_provider.h"
17 #include "chrome/browser/chromeos/settings/device_settings_service.h"
10 #include "chrome/browser/policy/cloud/cloud_policy_client.h" 18 #include "chrome/browser/policy/cloud/cloud_policy_client.h"
11 #include "chrome/browser/policy/cloud/cloud_policy_constants.h" 19 #include "chrome/browser/policy/cloud/cloud_policy_constants.h"
12 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" 20 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h"
13 #include "chrome/browser/policy/cloud/device_management_service.h" 21 #include "chrome/browser/policy/cloud/device_management_service.h"
14 #include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h"
15 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h" 22 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
23 #include "chrome/common/chrome_notification_types.h"
16 #include "chromeos/dbus/session_manager_client.h" 24 #include "chromeos/dbus/session_manager_client.h"
25 #include "content/public/browser/notification_details.h"
17 #include "policy/policy_constants.h" 26 #include "policy/policy_constants.h"
18 27
19 namespace em = enterprise_management; 28 namespace em = enterprise_management;
20 29
21 namespace policy { 30 namespace policy {
22 31
23 DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker( 32 DeviceLocalAccountPolicyBroker::DeviceLocalAccountPolicyBroker(
33 const std::string& user_id,
24 scoped_ptr<DeviceLocalAccountPolicyStore> store) 34 scoped_ptr<DeviceLocalAccountPolicyStore> store)
25 : store_(store.Pass()), 35 : user_id_(user_id),
36 store_(store.Pass()),
26 core_(PolicyNamespaceKey(dm_protocol::kChromePublicAccountPolicyType, 37 core_(PolicyNamespaceKey(dm_protocol::kChromePublicAccountPolicyType,
27 store_->account_id()), 38 store_->account_id()),
28 store_.get()) {} 39 store_.get()) {}
29 40
30 DeviceLocalAccountPolicyBroker::~DeviceLocalAccountPolicyBroker() {} 41 DeviceLocalAccountPolicyBroker::~DeviceLocalAccountPolicyBroker() {}
31 42
32 const std::string& DeviceLocalAccountPolicyBroker::account_id() const {
33 return store_->account_id();
34 }
35
36 void DeviceLocalAccountPolicyBroker::Connect( 43 void DeviceLocalAccountPolicyBroker::Connect(
37 scoped_ptr<CloudPolicyClient> client) { 44 scoped_ptr<CloudPolicyClient> client) {
38 core_.Connect(client.Pass()); 45 core_.Connect(client.Pass());
39 core_.StartRefreshScheduler(); 46 core_.StartRefreshScheduler();
40 UpdateRefreshDelay(); 47 UpdateRefreshDelay();
41 } 48 }
42 49
43 void DeviceLocalAccountPolicyBroker::Disconnect() { 50 void DeviceLocalAccountPolicyBroker::Disconnect() {
44 core_.Disconnect(); 51 core_.Disconnect();
45 } 52 }
(...skipping 10 matching lines...) Expand all
56 63
57 std::string DeviceLocalAccountPolicyBroker::GetDisplayName() const { 64 std::string DeviceLocalAccountPolicyBroker::GetDisplayName() const {
58 std::string display_name; 65 std::string display_name;
59 const base::Value* display_name_value = 66 const base::Value* display_name_value =
60 store_->policy_map().GetValue(policy::key::kUserDisplayName); 67 store_->policy_map().GetValue(policy::key::kUserDisplayName);
61 if (display_name_value) 68 if (display_name_value)
62 display_name_value->GetAsString(&display_name); 69 display_name_value->GetAsString(&display_name);
63 return display_name; 70 return display_name;
64 } 71 }
65 72
73 DeviceLocalAccountPolicyService::PolicyBrokerWrapper::PolicyBrokerWrapper()
74 : broker(NULL) {
Mattias Nissler (ping if slow) 2013/05/15 08:46:40 nit: this file doesn't put newlines for empty func
bartfab (slow) 2013/05/17 11:14:28 Done.
75 }
76
66 DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService( 77 DeviceLocalAccountPolicyService::DeviceLocalAccountPolicyService(
67 chromeos::SessionManagerClient* session_manager_client, 78 chromeos::SessionManagerClient* session_manager_client,
68 chromeos::DeviceSettingsService* device_settings_service) 79 chromeos::DeviceSettingsService* device_settings_service,
80 chromeos::CrosSettings* cros_settings)
69 : session_manager_client_(session_manager_client), 81 : session_manager_client_(session_manager_client),
70 device_settings_service_(device_settings_service), 82 device_settings_service_(device_settings_service),
71 device_management_service_(NULL) { 83 cros_settings_(cros_settings),
72 device_settings_service_->AddObserver(this); 84 device_management_service_(NULL),
73 DeviceSettingsUpdated(); 85 cros_settings_callback_factory_(this) {
86 cros_settings_->AddSettingsObserver(
87 chromeos::kAccountsPrefDeviceLocalAccounts, this);
88 UpdateAccountList();
74 } 89 }
75 90
76 DeviceLocalAccountPolicyService::~DeviceLocalAccountPolicyService() { 91 DeviceLocalAccountPolicyService::~DeviceLocalAccountPolicyService() {
77 device_settings_service_->RemoveObserver(this); 92 cros_settings_->RemoveSettingsObserver(
93 chromeos::kAccountsPrefDeviceLocalAccounts, this);
78 DeleteBrokers(&policy_brokers_); 94 DeleteBrokers(&policy_brokers_);
79 } 95 }
80 96
81 void DeviceLocalAccountPolicyService::Connect( 97 void DeviceLocalAccountPolicyService::Connect(
82 DeviceManagementService* device_management_service) { 98 DeviceManagementService* device_management_service) {
83 DCHECK(!device_management_service_); 99 DCHECK(!device_management_service_);
84 device_management_service_ = device_management_service; 100 device_management_service_ = device_management_service;
85 101
86 // Connect the brokers. 102 // Connect the brokers.
87 for (PolicyBrokerMap::iterator broker(policy_brokers_.begin()); 103 for (PolicyBrokerMap::iterator it(policy_brokers_.begin());
88 broker != policy_brokers_.end(); ++broker) { 104 it != policy_brokers_.end(); ++it) {
89 DCHECK(!broker->second->core()->client()); 105 DCHECK(!it->second.broker->core()->client());
90 broker->second->Connect( 106 it->second.broker->Connect(CreateClient().Pass());
91 CreateClientForAccount(broker->second->account_id()).Pass());
92 } 107 }
93 } 108 }
94 109
95 void DeviceLocalAccountPolicyService::Disconnect() { 110 void DeviceLocalAccountPolicyService::Disconnect() {
96 DCHECK(device_management_service_); 111 DCHECK(device_management_service_);
97 device_management_service_ = NULL; 112 device_management_service_ = NULL;
98 113
99 // Disconnect the brokers. 114 // Disconnect the brokers.
100 for (PolicyBrokerMap::iterator broker(policy_brokers_.begin()); 115 for (PolicyBrokerMap::iterator it(policy_brokers_.begin());
101 broker != policy_brokers_.end(); ++broker) { 116 it != policy_brokers_.end(); ++it) {
102 broker->second->Disconnect(); 117 it->second.broker->Disconnect();
103 } 118 }
104 } 119 }
105 120
106 DeviceLocalAccountPolicyBroker* 121 DeviceLocalAccountPolicyBroker*
107 DeviceLocalAccountPolicyService::GetBrokerForAccount( 122 DeviceLocalAccountPolicyService::GetBrokerForUser(
108 const std::string& account_id) { 123 const std::string& user_id) {
109 PolicyBrokerMap::iterator entry = policy_brokers_.find(account_id); 124 PolicyBrokerMap::iterator entry = policy_brokers_.find(user_id);
110 if (entry == policy_brokers_.end()) 125 if (entry == policy_brokers_.end())
111 return NULL; 126 return NULL;
112 127
113 if (!entry->second) 128 if (!entry->second.broker) {
114 entry->second = CreateBroker(account_id).release(); 129 entry->second.broker =
130 CreateBroker(user_id, entry->second.account_id).release();
131 }
115 132
116 return entry->second; 133 return entry->second.broker;
117 } 134 }
118 135
119 bool DeviceLocalAccountPolicyService::IsPolicyAvailableForAccount( 136 bool DeviceLocalAccountPolicyService::IsPolicyAvailableForUser(
120 const std::string& account_id) { 137 const std::string& user_id) {
121 DeviceLocalAccountPolicyBroker* broker = GetBrokerForAccount(account_id); 138 DeviceLocalAccountPolicyBroker* broker = GetBrokerForUser(user_id);
122 return broker && broker->core()->store()->is_managed(); 139 return broker && broker->core()->store()->is_managed();
123 } 140 }
124 141
125 void DeviceLocalAccountPolicyService::AddObserver(Observer* observer) { 142 void DeviceLocalAccountPolicyService::AddObserver(Observer* observer) {
126 observers_.AddObserver(observer); 143 observers_.AddObserver(observer);
127 } 144 }
128 145
129 void DeviceLocalAccountPolicyService::RemoveObserver(Observer* observer) { 146 void DeviceLocalAccountPolicyService::RemoveObserver(Observer* observer) {
130 observers_.RemoveObserver(observer); 147 observers_.RemoveObserver(observer);
131 } 148 }
132 149
133 void DeviceLocalAccountPolicyService::OwnershipStatusChanged() { 150 void DeviceLocalAccountPolicyService::Observe(
134 // TODO(mnissler): The policy key has changed, re-fetch policy. For 151 int type,
135 // consumer devices, re-sign the current settings and send updates to 152 const content::NotificationSource& source,
136 // session_manager. 153 const content::NotificationDetails& details) {
137 } 154 if (type != chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED ||
155 *content::Details<const std::string>(details).ptr() !=
156 chromeos::kAccountsPrefDeviceLocalAccounts) {
157 NOTREACHED();
158 return;
159 }
138 160
139 void DeviceLocalAccountPolicyService::DeviceSettingsUpdated() { 161 // Avoid unnecessary calls to UpdateAccountList(): If an earlier call is still
140 const em::ChromeDeviceSettingsProto* device_settings = 162 // pending (because the |cros_settings_| are not trusted yet), the updated
141 device_settings_service_->device_settings(); 163 // account list will be processed by that call when it eventually runs.
142 if (device_settings) 164 if (!cros_settings_callback_factory_.HasWeakPtrs())
143 UpdateAccountList(*device_settings); 165 UpdateAccountList();
144 } 166 }
145 167
146 void DeviceLocalAccountPolicyService::OnStoreLoaded(CloudPolicyStore* store) { 168 void DeviceLocalAccountPolicyService::OnStoreLoaded(CloudPolicyStore* store) {
147 DeviceLocalAccountPolicyBroker* broker = GetBrokerForStore(store); 169 DeviceLocalAccountPolicyBroker* broker = GetBrokerForStore(store);
148 broker->UpdateRefreshDelay(); 170 broker->UpdateRefreshDelay();
149 FOR_EACH_OBSERVER(Observer, observers_, 171 FOR_EACH_OBSERVER(Observer, observers_, OnPolicyUpdated(broker->user_id()));
150 OnPolicyUpdated(broker->account_id()));
151 } 172 }
152 173
153 void DeviceLocalAccountPolicyService::OnStoreError(CloudPolicyStore* store) { 174 void DeviceLocalAccountPolicyService::OnStoreError(CloudPolicyStore* store) {
154 DeviceLocalAccountPolicyBroker* broker = GetBrokerForStore(store); 175 DeviceLocalAccountPolicyBroker* broker = GetBrokerForStore(store);
155 FOR_EACH_OBSERVER(Observer, observers_, 176 FOR_EACH_OBSERVER(Observer, observers_, OnPolicyUpdated(broker->user_id()));
156 OnPolicyUpdated(broker->account_id()));
157 } 177 }
158 178
159 void DeviceLocalAccountPolicyService::UpdateAccountList( 179 void DeviceLocalAccountPolicyService::UpdateAccountList() {
160 const em::ChromeDeviceSettingsProto& device_settings) { 180 if (chromeos::CrosSettingsProvider::TRUSTED !=
161 using google::protobuf::RepeatedPtrField; 181 cros_settings_->PrepareTrustedValues(
182 base::Bind(&DeviceLocalAccountPolicyService::UpdateAccountList,
183 cros_settings_callback_factory_.GetWeakPtr()))) {
184 return;
185 }
162 186
163 // Update |policy_brokers_|, keeping existing entries. 187 // Update |policy_brokers_|, keeping existing entries.
164 PolicyBrokerMap new_policy_brokers; 188 PolicyBrokerMap new_policy_brokers;
165 const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts = 189 const base::ListValue* device_local_account_list;
166 device_settings.device_local_accounts().account(); 190 cros_settings_->GetList(chromeos::kAccountsPrefDeviceLocalAccounts,
167 RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry; 191 &device_local_account_list);
168 for (entry = accounts.begin(); entry != accounts.end(); ++entry) { 192 const std::vector<DeviceLocalAccount> device_local_accounts =
169 std::string account_id; 193 DecodeDeviceLocalAccountsList(device_local_account_list);
170 if (entry->has_type() && 194 for (std::vector<DeviceLocalAccount>::const_iterator it =
171 entry->type() == 195 device_local_accounts.begin();
172 em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION) { 196 it != device_local_accounts.end(); ++it) {
173 account_id = entry->account_id(); 197 PolicyBrokerWrapper& wrapper = new_policy_brokers[it->user_id];
174 } else if (entry->has_deprecated_public_session_id()) { 198 wrapper.account_id = it->account_id;
175 account_id = entry->deprecated_public_session_id();
176 }
177
178 if (account_id.empty())
179 continue;
180
181 // Sanity check for whether this account ID has already been processed.
182 DeviceLocalAccountPolicyBroker*& new_broker =
183 new_policy_brokers[account_id];
184 if (new_broker) {
185 LOG(WARNING) << "Duplicate public account " << account_id;
186 continue;
187 }
188 199
189 // Reuse the existing broker if present. 200 // Reuse the existing broker if present.
190 DeviceLocalAccountPolicyBroker*& existing_broker = 201 PolicyBrokerWrapper& existing_wrapper = policy_brokers_[it->user_id];
191 policy_brokers_[account_id]; 202 wrapper.broker = existing_wrapper.broker;
192 new_broker = existing_broker; 203 existing_wrapper.broker = NULL;
193 existing_broker = NULL;
194 204
195 // Fire up the cloud connection for fetching policy for the account from 205 // Fire up the cloud connection for fetching policy for the account from
196 // the cloud if this is an enterprise-managed device. 206 // the cloud if this is an enterprise-managed device.
197 if (!new_broker || !new_broker->core()->client()) { 207 if (!wrapper.broker || !wrapper.broker->core()->client()) {
198 scoped_ptr<CloudPolicyClient> client( 208 scoped_ptr<CloudPolicyClient> client(CreateClient());
199 CreateClientForAccount(account_id)); 209 if (client) {
200 if (client.get()) { 210 if (!wrapper.broker)
201 if (!new_broker) 211 wrapper.broker = CreateBroker(it->user_id, it->account_id).release();
202 new_broker = CreateBroker(account_id).release(); 212 wrapper.broker->Connect(client.Pass());
203 new_broker->Connect(client.Pass());
204 } 213 }
205 } 214 }
206 } 215 }
207 policy_brokers_.swap(new_policy_brokers); 216 policy_brokers_.swap(new_policy_brokers);
208 DeleteBrokers(&new_policy_brokers); 217 DeleteBrokers(&new_policy_brokers);
209 218
210 FOR_EACH_OBSERVER(Observer, observers_, OnDeviceLocalAccountsChanged()); 219 FOR_EACH_OBSERVER(Observer, observers_, OnDeviceLocalAccountsChanged());
211 } 220 }
212 221
213 scoped_ptr<DeviceLocalAccountPolicyBroker> 222 scoped_ptr<DeviceLocalAccountPolicyBroker>
214 DeviceLocalAccountPolicyService::CreateBroker( 223 DeviceLocalAccountPolicyService::CreateBroker(
224 const std::string& user_id,
215 const std::string& account_id) { 225 const std::string& account_id) {
216 scoped_ptr<DeviceLocalAccountPolicyStore> store( 226 scoped_ptr<DeviceLocalAccountPolicyStore> store(
217 new DeviceLocalAccountPolicyStore(account_id, session_manager_client_, 227 new DeviceLocalAccountPolicyStore(account_id, session_manager_client_,
218 device_settings_service_)); 228 device_settings_service_));
219 scoped_ptr<DeviceLocalAccountPolicyBroker> broker( 229 scoped_ptr<DeviceLocalAccountPolicyBroker> broker(
220 new DeviceLocalAccountPolicyBroker(store.Pass())); 230 new DeviceLocalAccountPolicyBroker(user_id, store.Pass()));
221 broker->core()->store()->AddObserver(this); 231 broker->core()->store()->AddObserver(this);
222 broker->core()->store()->Load(); 232 broker->core()->store()->Load();
223 return broker.Pass(); 233 return broker.Pass();
224 } 234 }
225 235
226 void DeviceLocalAccountPolicyService::DeleteBrokers(PolicyBrokerMap* map) { 236 void DeviceLocalAccountPolicyService::DeleteBrokers(PolicyBrokerMap* map) {
227 for (PolicyBrokerMap::iterator broker = map->begin(); broker != map->end(); 237 for (PolicyBrokerMap::iterator it = map->begin(); it != map->end(); ++it) {
228 ++broker) { 238 if (it->second.broker) {
229 if (broker->second) { 239 it->second.broker->core()->store()->RemoveObserver(this);
230 broker->second->core()->store()->RemoveObserver(this); 240 delete it->second.broker;
231 delete broker->second;
232 } 241 }
233 } 242 }
234 map->clear(); 243 map->clear();
235 } 244 }
236 245
237 DeviceLocalAccountPolicyBroker* 246 DeviceLocalAccountPolicyBroker*
238 DeviceLocalAccountPolicyService::GetBrokerForStore( 247 DeviceLocalAccountPolicyService::GetBrokerForStore(
239 CloudPolicyStore* store) { 248 CloudPolicyStore* store) {
240 for (PolicyBrokerMap::iterator broker(policy_brokers_.begin()); 249 for (PolicyBrokerMap::iterator it(policy_brokers_.begin());
241 broker != policy_brokers_.end(); ++broker) { 250 it != policy_brokers_.end(); ++it) {
242 if (broker->second->core()->store() == store) 251 if (it->second.broker->core()->store() == store)
243 return broker->second; 252 return it->second.broker;
244 } 253 }
245 return NULL; 254 return NULL;
246 } 255 }
247 256
248 scoped_ptr<CloudPolicyClient> 257 scoped_ptr<CloudPolicyClient> DeviceLocalAccountPolicyService::CreateClient() {
249 DeviceLocalAccountPolicyService::CreateClientForAccount(
250 const std::string& account_id) {
251 const em::PolicyData* policy_data = device_settings_service_->policy_data(); 258 const em::PolicyData* policy_data = device_settings_service_->policy_data();
252 if (!policy_data || 259 if (!policy_data ||
253 !policy_data->has_request_token() || 260 !policy_data->has_request_token() ||
254 !policy_data->has_device_id() || 261 !policy_data->has_device_id() ||
255 !device_management_service_) { 262 !device_management_service_) {
256 return scoped_ptr<CloudPolicyClient>(); 263 return scoped_ptr<CloudPolicyClient>();
257 } 264 }
258 265
259 scoped_ptr<CloudPolicyClient> client( 266 scoped_ptr<CloudPolicyClient> client(
260 new CloudPolicyClient(std::string(), std::string(), 267 new CloudPolicyClient(std::string(), std::string(),
261 USER_AFFILIATION_MANAGED, 268 USER_AFFILIATION_MANAGED,
262 NULL, device_management_service_)); 269 NULL, device_management_service_));
263 client->SetupRegistration(policy_data->request_token(), 270 client->SetupRegistration(policy_data->request_token(),
264 policy_data->device_id()); 271 policy_data->device_id());
265 return client.Pass(); 272 return client.Pass();
266 } 273 }
267 274
268 } // namespace policy 275 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698