Chromium Code Reviews| 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 #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 Loading... | |
| 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 |
| OLD | NEW |