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/enrollment_handler_chromeos.h" | 5 #include "chrome/browser/chromeos/policy/enrollment_handler_chromeos.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
14 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
15 #include "chrome/browser/chromeos/attestation/attestation_ca_client.h" | |
16 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h" | 15 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h" |
17 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" | 16 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
18 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" | 17 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" |
19 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h" | 18 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h" |
20 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" | 19 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" |
21 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h" | 20 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h" |
22 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 21 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
23 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" | 22 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" |
24 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h
" | 23 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h
" |
25 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 NOTREACHED() << "Bad enrollment mode: " << mode; | 65 NOTREACHED() << "Bad enrollment mode: " << mode; |
67 return em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_MANUAL; | 66 return em::DeviceRegisterRequest::FLAVOR_ENROLLMENT_MANUAL; |
68 } | 67 } |
69 | 68 |
70 } // namespace | 69 } // namespace |
71 | 70 |
72 EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( | 71 EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( |
73 DeviceCloudPolicyStoreChromeOS* store, | 72 DeviceCloudPolicyStoreChromeOS* store, |
74 EnterpriseInstallAttributes* install_attributes, | 73 EnterpriseInstallAttributes* install_attributes, |
75 ServerBackedStateKeysBroker* state_keys_broker, | 74 ServerBackedStateKeysBroker* state_keys_broker, |
76 cryptohome::AsyncMethodCaller* async_method_caller, | 75 chromeos::attestation::AttestationFlow* attestation_flow, |
77 chromeos::CryptohomeClient* cryptohome_client, | |
78 std::unique_ptr<CloudPolicyClient> client, | 76 std::unique_ptr<CloudPolicyClient> client, |
79 scoped_refptr<base::SequencedTaskRunner> background_task_runner, | 77 scoped_refptr<base::SequencedTaskRunner> background_task_runner, |
80 const EnrollmentConfig& enrollment_config, | 78 const EnrollmentConfig& enrollment_config, |
81 const std::string& auth_token, | 79 const std::string& auth_token, |
82 const std::string& client_id, | 80 const std::string& client_id, |
83 const std::string& requisition, | 81 const std::string& requisition, |
84 const AllowedDeviceModes& allowed_device_modes, | 82 const AllowedDeviceModes& allowed_device_modes, |
85 const EnrollmentCallback& completion_callback) | 83 const EnrollmentCallback& completion_callback) |
86 : store_(store), | 84 : store_(store), |
87 install_attributes_(install_attributes), | 85 install_attributes_(install_attributes), |
88 state_keys_broker_(state_keys_broker), | 86 state_keys_broker_(state_keys_broker), |
89 async_method_caller_(async_method_caller), | 87 attestation_flow_(attestation_flow), |
90 cryptohome_client_(cryptohome_client), | |
91 client_(std::move(client)), | 88 client_(std::move(client)), |
92 background_task_runner_(background_task_runner), | 89 background_task_runner_(background_task_runner), |
93 enrollment_config_(enrollment_config), | 90 enrollment_config_(enrollment_config), |
94 auth_token_(auth_token), | 91 auth_token_(auth_token), |
95 client_id_(client_id), | 92 client_id_(client_id), |
96 requisition_(requisition), | 93 requisition_(requisition), |
97 allowed_device_modes_(allowed_device_modes), | 94 allowed_device_modes_(allowed_device_modes), |
98 completion_callback_(completion_callback), | 95 completion_callback_(completion_callback), |
99 device_mode_(DEVICE_MODE_NOT_SET), | 96 device_mode_(DEVICE_MODE_NOT_SET), |
100 skip_robot_auth_(false), | 97 skip_robot_auth_(false), |
101 enrollment_step_(STEP_PENDING), | 98 enrollment_step_(STEP_PENDING), |
102 lockbox_init_duration_(0), | 99 lockbox_init_duration_(0), |
103 weak_ptr_factory_(this) { | 100 weak_ptr_factory_(this) { |
104 CHECK(!client_->is_registered()); | 101 CHECK(!client_->is_registered()); |
105 CHECK_EQ(DM_STATUS_SUCCESS, client_->status()); | 102 CHECK_EQ(DM_STATUS_SUCCESS, client_->status()); |
106 CHECK((enrollment_config_.mode == EnrollmentConfig::MODE_ATTESTATION || | 103 CHECK((enrollment_config_.mode == EnrollmentConfig::MODE_ATTESTATION || |
107 enrollment_config_.mode == | 104 enrollment_config_.mode == |
108 EnrollmentConfig::MODE_ATTESTATION_FORCED) == auth_token_.empty()); | 105 EnrollmentConfig::MODE_ATTESTATION_FORCED) == auth_token_.empty()); |
109 CHECK(enrollment_config_.auth_mechanism != | 106 CHECK(enrollment_config_.auth_mechanism != |
110 EnrollmentConfig::AUTH_MECHANISM_ATTESTATION || | 107 EnrollmentConfig::AUTH_MECHANISM_ATTESTATION || |
111 (async_method_caller_ != nullptr && cryptohome_client_ != nullptr)); | 108 attestation_flow_); |
112 store_->AddObserver(this); | 109 store_->AddObserver(this); |
113 client_->AddObserver(this); | 110 client_->AddObserver(this); |
114 client_->AddPolicyTypeToFetch(dm_protocol::kChromeDevicePolicyType, | 111 client_->AddPolicyTypeToFetch(dm_protocol::kChromeDevicePolicyType, |
115 std::string()); | 112 std::string()); |
116 } | 113 } |
117 | 114 |
118 EnrollmentHandlerChromeOS::~EnrollmentHandlerChromeOS() { | 115 EnrollmentHandlerChromeOS::~EnrollmentHandlerChromeOS() { |
119 Stop(); | 116 Stop(); |
120 store_->RemoveObserver(this); | 117 store_->RemoveObserver(this); |
121 } | 118 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 } | 261 } |
265 | 262 |
266 void EnrollmentHandlerChromeOS::StartRegistration() { | 263 void EnrollmentHandlerChromeOS::StartRegistration() { |
267 CHECK_EQ(STEP_LOADING_STORE, enrollment_step_); | 264 CHECK_EQ(STEP_LOADING_STORE, enrollment_step_); |
268 if (!store_->is_initialized()) { | 265 if (!store_->is_initialized()) { |
269 // Do nothing. StartRegistration() will be called again from OnStoreLoaded() | 266 // Do nothing. StartRegistration() will be called again from OnStoreLoaded() |
270 // after the CloudPolicyStore has initialized. | 267 // after the CloudPolicyStore has initialized. |
271 return; | 268 return; |
272 } | 269 } |
273 enrollment_step_ = STEP_REGISTRATION; | 270 enrollment_step_ = STEP_REGISTRATION; |
274 if (enrollment_config_.should_enroll_with_attestation()) { | 271 if (enrollment_config_.is_mode_attestation()) { |
275 StartAttestationBasedEnrollmentFlow(); | 272 StartAttestationBasedEnrollmentFlow(); |
276 } else { | 273 } else { |
277 client_->Register( | 274 client_->Register( |
278 em::DeviceRegisterRequest::DEVICE, | 275 em::DeviceRegisterRequest::DEVICE, |
279 EnrollmentModeToRegistrationFlavor(enrollment_config_.mode), | 276 EnrollmentModeToRegistrationFlavor(enrollment_config_.mode), |
280 auth_token_, client_id_, requisition_, current_state_key_); | 277 auth_token_, client_id_, requisition_, current_state_key_); |
281 } | 278 } |
282 } | 279 } |
283 | 280 |
284 void EnrollmentHandlerChromeOS::StartAttestationBasedEnrollmentFlow() { | 281 void EnrollmentHandlerChromeOS::StartAttestationBasedEnrollmentFlow() { |
285 if (!attestation_flow_) { | |
286 std::unique_ptr<chromeos::attestation::ServerProxy> attestation_ca_client( | |
287 new chromeos::attestation::AttestationCAClient()); | |
288 attestation_flow_.reset(new chromeos::attestation::AttestationFlow( | |
289 async_method_caller_, cryptohome_client_, | |
290 std::move(attestation_ca_client))); | |
291 } | |
292 const chromeos::attestation::AttestationFlow::CertificateCallback callback = | 282 const chromeos::attestation::AttestationFlow::CertificateCallback callback = |
293 base::Bind( | 283 base::Bind( |
294 &EnrollmentHandlerChromeOS::HandleRegistrationCertificateResult, | 284 &EnrollmentHandlerChromeOS::HandleRegistrationCertificateResult, |
295 weak_ptr_factory_.GetWeakPtr()); | 285 weak_ptr_factory_.GetWeakPtr()); |
296 attestation_flow_->GetCertificate( | 286 attestation_flow_->GetCertificate( |
297 chromeos::attestation::PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, | 287 chromeos::attestation::PROFILE_ENTERPRISE_ENROLLMENT_CERTIFICATE, |
298 EmptyAccountId(), "" /* request_origin */, false /* force_new_key */, | 288 EmptyAccountId(), "" /* request_origin */, false /* force_new_key */, |
299 callback); | 289 callback); |
300 } | 290 } |
301 | 291 |
302 void EnrollmentHandlerChromeOS::HandleRegistrationCertificateResult( | 292 void EnrollmentHandlerChromeOS::HandleRegistrationCertificateResult( |
303 bool success, | 293 bool success, |
304 const std::string& pem_certificate_chain) { | 294 const std::string& pem_certificate_chain) { |
305 LOG(WARNING) << "Enrolling with a registration certificate" | 295 if (success) |
306 " is not supported yet."; | 296 client_->RegisterWithCertificate( |
307 // TODO(drcrash): Invert success/fail tests, mocking as always failed now. | 297 em::DeviceRegisterRequest::DEVICE, |
308 if (success) { | 298 EnrollmentModeToRegistrationFlavor(enrollment_config_.mode), |
309 // TODO(drcrash): Implement new call in client_ to register with cert. | 299 pem_certificate_chain, client_id_, requisition_, current_state_key_); |
310 } | 300 else |
311 ReportResult(EnrollmentStatus::ForStatus( | 301 ReportResult(EnrollmentStatus::ForStatus( |
312 EnrollmentStatus::STATUS_REGISTRATION_CERTIFICATE_FETCH_FAILED)); | 302 EnrollmentStatus::STATUS_REGISTRATION_CERTIFICATE_FETCH_FAILED)); |
313 } | 303 } |
314 | 304 |
315 void EnrollmentHandlerChromeOS::HandlePolicyValidationResult( | 305 void EnrollmentHandlerChromeOS::HandlePolicyValidationResult( |
316 DeviceCloudPolicyValidator* validator) { | 306 DeviceCloudPolicyValidator* validator) { |
317 CHECK_EQ(STEP_VALIDATION, enrollment_step_); | 307 CHECK_EQ(STEP_VALIDATION, enrollment_step_); |
318 if (validator->success()) { | 308 if (validator->success()) { |
319 policy_ = std::move(validator->policy()); | 309 policy_ = std::move(validator->policy()); |
320 username_ = validator->policy_data()->username(); | 310 username_ = validator->policy_data()->username(); |
321 device_id_ = validator->policy_data()->device_id(); | 311 device_id_ = validator->policy_data()->device_id(); |
322 request_token_ = validator->policy_data()->request_token(); | 312 request_token_ = validator->policy_data()->request_token(); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 << ", validation: " << status.validation_status() | 494 << ", validation: " << status.validation_status() |
505 << ", store: " << status.store_status() | 495 << ", store: " << status.store_status() |
506 << ", lock: " << status.lock_status(); | 496 << ", lock: " << status.lock_status(); |
507 } | 497 } |
508 | 498 |
509 if (!callback.is_null()) | 499 if (!callback.is_null()) |
510 callback.Run(status); | 500 callback.Run(status); |
511 } | 501 } |
512 | 502 |
513 } // namespace policy | 503 } // namespace policy |
OLD | NEW |