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/ui/webui/chromeos/login/enrollment_screen_handler.h" | 5 #include "chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ash/common/system/chromeos/devicetype_utils.h" | 9 #include "ash/common/system/chromeos/devicetype_utils.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/files/file_util.h" | |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 13 #include "base/macros.h" | 14 #include "base/macros.h" |
| 14 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 15 #include "base/values.h" | 16 #include "base/values.h" |
| 16 #include "chrome/browser/browser_process.h" | 17 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/browser_process_platform_part.h" | 18 #include "chrome/browser/browser_process_platform_part.h" |
| 18 #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h" | 19 #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h" |
| 19 #include "chrome/browser/chromeos/login/help_app_launcher.h" | 20 #include "chrome/browser/chromeos/login/help_app_launcher.h" |
| 20 #include "chrome/browser/chromeos/login/screens/network_error.h" | 21 #include "chrome/browser/chromeos/login/screens/network_error.h" |
| 21 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" | 22 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
| 22 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" | 23 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" |
| 23 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h" | 24 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h" |
| 24 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" | 25 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" |
| 25 #include "chrome/browser/ui/webui/chromeos/login/oobe_screen.h" | 26 #include "chrome/browser/ui/webui/chromeos/login/oobe_screen.h" |
| 26 #include "chrome/grit/generated_resources.h" | 27 #include "chrome/grit/generated_resources.h" |
| 28 #include "chromeos/dbus/auth_policy_client.h" | |
| 29 #include "chromeos/dbus/dbus_thread_manager.h" | |
| 27 #include "chromeos/network/network_state.h" | 30 #include "chromeos/network/network_state.h" |
| 28 #include "chromeos/network/network_state_handler.h" | 31 #include "chromeos/network/network_state_handler.h" |
| 29 #include "components/login/localized_values_builder.h" | 32 #include "components/login/localized_values_builder.h" |
| 30 #include "components/policy/core/browser/cloud/message_util.h" | 33 #include "components/policy/core/browser/cloud/message_util.h" |
| 34 #include "content/public/browser/browser_thread.h" | |
| 31 #include "google_apis/gaia/gaia_auth_util.h" | 35 #include "google_apis/gaia/gaia_auth_util.h" |
| 32 #include "google_apis/gaia/gaia_urls.h" | 36 #include "google_apis/gaia/gaia_urls.h" |
| 33 #include "google_apis/gaia/google_service_auth_error.h" | 37 #include "google_apis/gaia/google_service_auth_error.h" |
| 34 #include "ui/base/l10n/l10n_util.h" | 38 #include "ui/base/l10n/l10n_util.h" |
| 35 | 39 |
| 36 namespace chromeos { | 40 namespace chromeos { |
| 37 namespace { | 41 namespace { |
| 38 | 42 |
| 39 const char kJsScreenPath[] = "login.OAuthEnrollmentScreen"; | 43 const char kJsScreenPath[] = "login.OAuthEnrollmentScreen"; |
| 40 | 44 |
| 41 // Enrollment step names. | 45 // Enrollment step names. |
| 42 const char kEnrollmentStepSignin[] = "signin"; | 46 const char kEnrollmentStepSignin[] = "signin"; |
| 47 const char kEnrollmentStepADJoin[] = "ad-join"; | |
| 43 const char kEnrollmentStepSuccess[] = "success"; | 48 const char kEnrollmentStepSuccess[] = "success"; |
| 44 const char kEnrollmentStepWorking[] = "working"; | 49 const char kEnrollmentStepWorking[] = "working"; |
| 45 | 50 |
| 46 // Enrollment mode constants used in the UI. This needs to be kept in sync with | 51 // Enrollment mode constants used in the UI. This needs to be kept in sync with |
| 47 // oobe_screen_oauth_enrollment.js. | 52 // oobe_screen_oauth_enrollment.js. |
| 48 const char kEnrollmentModeUIForced[] = "forced"; | 53 const char kEnrollmentModeUIForced[] = "forced"; |
| 49 const char kEnrollmentModeUIManual[] = "manual"; | 54 const char kEnrollmentModeUIManual[] = "manual"; |
| 50 const char kEnrollmentModeUIRecovery[] = "recovery"; | 55 const char kEnrollmentModeUIRecovery[] = "recovery"; |
| 51 | 56 |
| 52 // Converts |mode| to a mode identifier for the UI. | 57 // Converts |mode| to a mode identifier for the UI. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 } | 101 } |
| 97 | 102 |
| 98 | 103 |
| 99 // Returns the enterprise domain after enrollment, or an empty string. | 104 // Returns the enterprise domain after enrollment, or an empty string. |
| 100 std::string GetEnterpriseDomain() { | 105 std::string GetEnterpriseDomain() { |
| 101 policy::BrowserPolicyConnectorChromeOS* connector = | 106 policy::BrowserPolicyConnectorChromeOS* connector = |
| 102 g_browser_process->platform_part()->browser_policy_connector_chromeos(); | 107 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| 103 return connector->GetEnterpriseDomain(); | 108 return connector->GetEnterpriseDomain(); |
| 104 } | 109 } |
| 105 | 110 |
| 111 // Returns file descriptor of a pipe, open for reading. Pipe keeps user | |
| 112 // password, which can be read from the returned descriptor. | |
| 113 base::ScopedFD GetPasswordReadPipe(const std::string& password) { | |
| 114 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); | |
| 115 int pipe_fds[2]; | |
| 116 if (!base::CreateLocalNonBlockingPipe(pipe_fds)) { | |
| 117 LOG(ERROR) << "Failed to create pipe"; | |
| 118 return base::ScopedFD(); | |
| 119 } | |
| 120 base::ScopedFD pipe_read_end(pipe_fds[0]); | |
| 121 base::ScopedFD pipe_write_end(pipe_fds[1]); | |
| 122 | |
| 123 if (!base::WriteFileDescriptor(pipe_write_end.get(), | |
| 124 password.c_str(), | |
| 125 password.size())) { | |
| 126 LOG(ERROR) << "Failed to write to pipe"; | |
|
Dan Beam
2016/10/28 21:13:03
do you want this in release builds? this bloats t
Roman Sorokin (ftl)
2016/10/31 11:37:11
I see there calls in the files. Would that matter
Dan Beam
2016/10/31 23:52:25
yes, more calls = more bloat ;)
Alexander Alekseev
2016/11/01 06:18:32
I'd vote for this error to stay. This may fail if
| |
| 127 return base::ScopedFD(); | |
| 128 } | |
| 129 return pipe_read_end; | |
| 130 } | |
| 131 | |
| 106 } // namespace | 132 } // namespace |
| 107 | 133 |
| 108 // EnrollmentScreenHandler, public ------------------------------ | 134 // EnrollmentScreenHandler, public ------------------------------ |
| 109 | 135 |
| 110 EnrollmentScreenHandler::EnrollmentScreenHandler( | 136 EnrollmentScreenHandler::EnrollmentScreenHandler( |
| 111 const scoped_refptr<NetworkStateInformer>& network_state_informer, | 137 const scoped_refptr<NetworkStateInformer>& network_state_informer, |
| 112 NetworkErrorModel* network_error_model) | 138 NetworkErrorModel* network_error_model) |
| 113 : BaseScreenHandler(kJsScreenPath), | 139 : BaseScreenHandler(kJsScreenPath), |
| 114 controller_(NULL), | 140 controller_(NULL), |
| 115 show_on_init_(false), | 141 show_on_init_(false), |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 132 | 158 |
| 133 // EnrollmentScreenHandler, WebUIMessageHandler implementation -- | 159 // EnrollmentScreenHandler, WebUIMessageHandler implementation -- |
| 134 | 160 |
| 135 void EnrollmentScreenHandler::RegisterMessages() { | 161 void EnrollmentScreenHandler::RegisterMessages() { |
| 136 AddCallback("toggleFakeEnrollment", | 162 AddCallback("toggleFakeEnrollment", |
| 137 &EnrollmentScreenHandler::HandleToggleFakeEnrollment); | 163 &EnrollmentScreenHandler::HandleToggleFakeEnrollment); |
| 138 AddCallback("oauthEnrollClose", | 164 AddCallback("oauthEnrollClose", |
| 139 &EnrollmentScreenHandler::HandleClose); | 165 &EnrollmentScreenHandler::HandleClose); |
| 140 AddCallback("oauthEnrollCompleteLogin", | 166 AddCallback("oauthEnrollCompleteLogin", |
| 141 &EnrollmentScreenHandler::HandleCompleteLogin); | 167 &EnrollmentScreenHandler::HandleCompleteLogin); |
| 168 AddCallback("oauthEnrollADCompleteLogin", | |
| 169 &EnrollmentScreenHandler::HandleADCompleteLogin); | |
| 142 AddCallback("oauthEnrollRetry", | 170 AddCallback("oauthEnrollRetry", |
| 143 &EnrollmentScreenHandler::HandleRetry); | 171 &EnrollmentScreenHandler::HandleRetry); |
| 144 AddCallback("frameLoadingCompleted", | 172 AddCallback("frameLoadingCompleted", |
| 145 &EnrollmentScreenHandler::HandleFrameLoadingCompleted); | 173 &EnrollmentScreenHandler::HandleFrameLoadingCompleted); |
| 146 AddCallback("oauthEnrollAttributes", | 174 AddCallback("oauthEnrollAttributes", |
| 147 &EnrollmentScreenHandler::HandleDeviceAttributesProvided); | 175 &EnrollmentScreenHandler::HandleDeviceAttributesProvided); |
| 148 AddCallback("oauthEnrollOnLearnMore", | 176 AddCallback("oauthEnrollOnLearnMore", |
| 149 &EnrollmentScreenHandler::HandleOnLearnMore); | 177 &EnrollmentScreenHandler::HandleOnLearnMore); |
| 150 } | 178 } |
| 151 | 179 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 171 } | 199 } |
| 172 | 200 |
| 173 void EnrollmentScreenHandler::Hide() { | 201 void EnrollmentScreenHandler::Hide() { |
| 174 } | 202 } |
| 175 | 203 |
| 176 void EnrollmentScreenHandler::ShowSigninScreen() { | 204 void EnrollmentScreenHandler::ShowSigninScreen() { |
| 177 observe_network_failure_ = true; | 205 observe_network_failure_ = true; |
| 178 ShowStep(kEnrollmentStepSignin); | 206 ShowStep(kEnrollmentStepSignin); |
| 179 } | 207 } |
| 180 | 208 |
| 209 void EnrollmentScreenHandler::ShowADJoin() { | |
| 210 observe_network_failure_ = false; | |
| 211 ShowStep(kEnrollmentStepADJoin); | |
| 212 } | |
| 213 | |
| 181 void EnrollmentScreenHandler::ShowAttributePromptScreen( | 214 void EnrollmentScreenHandler::ShowAttributePromptScreen( |
| 182 const std::string& asset_id, | 215 const std::string& asset_id, |
| 183 const std::string& location) { | 216 const std::string& location) { |
| 184 CallJS("showAttributePromptStep", asset_id, location); | 217 CallJS("showAttributePromptStep", asset_id, location); |
| 185 } | 218 } |
| 186 | 219 |
| 187 void EnrollmentScreenHandler::ShowEnrollmentSpinnerScreen() { | 220 void EnrollmentScreenHandler::ShowEnrollmentSpinnerScreen() { |
| 188 ShowStep(kEnrollmentStepWorking); | 221 ShowStep(kEnrollmentStepWorking); |
| 189 } | 222 } |
| 190 | 223 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 379 IDS_ENTERPRISE_ENROLLMENT_EXPLAIN_ATTRIBUTE_LINK); | 412 IDS_ENTERPRISE_ENROLLMENT_EXPLAIN_ATTRIBUTE_LINK); |
| 380 builder->Add("oauthEnrollAttributeExplanation", | 413 builder->Add("oauthEnrollAttributeExplanation", |
| 381 IDS_ENTERPRISE_ENROLLMENT_ATTRIBUTE_EXPLANATION); | 414 IDS_ENTERPRISE_ENROLLMENT_ATTRIBUTE_EXPLANATION); |
| 382 builder->Add("oauthEnrollAssetIdLabel", | 415 builder->Add("oauthEnrollAssetIdLabel", |
| 383 IDS_ENTERPRISE_ENROLLMENT_ASSET_ID_LABEL); | 416 IDS_ENTERPRISE_ENROLLMENT_ASSET_ID_LABEL); |
| 384 builder->Add("oauthEnrollLocationLabel", | 417 builder->Add("oauthEnrollLocationLabel", |
| 385 IDS_ENTERPRISE_ENROLLMENT_LOCATION_LABEL); | 418 IDS_ENTERPRISE_ENROLLMENT_LOCATION_LABEL); |
| 386 builder->Add("oauthEnrollWorking", IDS_ENTERPRISE_ENROLLMENT_WORKING_MESSAGE); | 419 builder->Add("oauthEnrollWorking", IDS_ENTERPRISE_ENROLLMENT_WORKING_MESSAGE); |
| 387 // Do not use AddF for this string as it will be rendered by the JS code. | 420 // Do not use AddF for this string as it will be rendered by the JS code. |
| 388 builder->Add("oauthEnrollAbeSuccess", IDS_ENTERPRISE_ENROLLMENT_ABE_SUCCESS); | 421 builder->Add("oauthEnrollAbeSuccess", IDS_ENTERPRISE_ENROLLMENT_ABE_SUCCESS); |
| 422 builder->Add("oauthEnrollADMachineNameInput", | |
| 423 IDS_AD_MACHINE_NAME_INPUT_LABEL); | |
| 424 builder->Add("oauthEnrollADDomainJoinWelcomeMessage", | |
| 425 IDS_AD_DOMAIN_JOIN_WELCOME_MESSAGE); | |
| 426 builder->Add("adLoginUser", IDS_AD_LOGIN_USER); | |
| 427 builder->Add("adLoginPassword", IDS_AD_LOGIN_PASSWORD); | |
| 389 } | 428 } |
| 390 | 429 |
| 391 bool EnrollmentScreenHandler::IsOnEnrollmentScreen() const { | 430 bool EnrollmentScreenHandler::IsOnEnrollmentScreen() const { |
| 392 return (GetCurrentScreen() == OobeScreen::SCREEN_OOBE_ENROLLMENT); | 431 return (GetCurrentScreen() == OobeScreen::SCREEN_OOBE_ENROLLMENT); |
| 393 } | 432 } |
| 394 | 433 |
| 395 bool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const { | 434 bool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const { |
| 396 return (GetCurrentScreen() == OobeScreen::SCREEN_ERROR_MESSAGE && | 435 return (GetCurrentScreen() == OobeScreen::SCREEN_ERROR_MESSAGE && |
| 397 network_error_model_->GetParentScreen() == | 436 network_error_model_->GetParentScreen() == |
| 398 OobeScreen::SCREEN_OOBE_ENROLLMENT); | 437 OobeScreen::SCREEN_OOBE_ENROLLMENT); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 } | 547 } |
| 509 | 548 |
| 510 void EnrollmentScreenHandler::HandleCompleteLogin( | 549 void EnrollmentScreenHandler::HandleCompleteLogin( |
| 511 const std::string& user, | 550 const std::string& user, |
| 512 const std::string& auth_code) { | 551 const std::string& auth_code) { |
| 513 observe_network_failure_ = false; | 552 observe_network_failure_ = false; |
| 514 DCHECK(controller_); | 553 DCHECK(controller_); |
| 515 controller_->OnLoginDone(gaia::SanitizeEmail(user), auth_code); | 554 controller_->OnLoginDone(gaia::SanitizeEmail(user), auth_code); |
| 516 } | 555 } |
| 517 | 556 |
| 557 void EnrollmentScreenHandler::HandleADCompleteLogin( | |
| 558 const std::string& machine_name, | |
| 559 const std::string& user, | |
| 560 const std::string& password) { | |
| 561 observe_network_failure_ = false; | |
| 562 DCHECK(controller_); | |
| 563 base::PostTaskAndReplyWithResult( | |
| 564 content::BrowserThread::GetBlockingPool(), FROM_HERE, | |
| 565 base::Bind(&GetPasswordReadPipe, password), | |
| 566 base::Bind(&EnrollmentScreenHandler::OnPasswordPipeReady, | |
| 567 weak_ptr_factory_.GetWeakPtr(), machine_name, user)); | |
| 568 } | |
| 569 | |
| 570 void EnrollmentScreenHandler::OnPasswordPipeReady( | |
| 571 const std::string& machine_name, | |
| 572 const std::string& user, | |
| 573 base::ScopedFD password_fd) { | |
| 574 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 575 if (!password_fd.is_valid()) { | |
| 576 LOG(ERROR) << "Got invalid password_fd"; | |
| 577 return; | |
| 578 } | |
| 579 chromeos::AuthPolicyClient* client = | |
| 580 chromeos::DBusThreadManager::Get()->GetAuthPolicyClient(); | |
| 581 | |
| 582 client->JoinADDomain(machine_name, | |
| 583 user, | |
| 584 password_fd.get(), | |
| 585 base::Bind(&EnrollmentScreenHandler::HandleADDomainJoin, | |
| 586 weak_ptr_factory_.GetWeakPtr(), | |
| 587 machine_name, | |
| 588 user)); | |
| 589 } | |
| 590 | |
| 591 void EnrollmentScreenHandler::HandleADDomainJoin( | |
| 592 const std::string& machine_name, | |
| 593 const std::string& user, | |
| 594 int code) { | |
| 595 if (code == 0) { | |
| 596 controller_->OnADJoined(gaia::ExtractDomainName(user)); | |
| 597 return; | |
| 598 } | |
| 599 // TODO(rsorokin): Add passing/displaying error codes. (see crbug.com/659984) | |
| 600 CallJS("invalidateAD", machine_name, user); | |
| 601 } | |
| 602 | |
| 518 void EnrollmentScreenHandler::HandleRetry() { | 603 void EnrollmentScreenHandler::HandleRetry() { |
| 519 DCHECK(controller_); | 604 DCHECK(controller_); |
| 520 controller_->OnRetry(); | 605 controller_->OnRetry(); |
| 521 } | 606 } |
| 522 | 607 |
| 523 void EnrollmentScreenHandler::HandleFrameLoadingCompleted() { | 608 void EnrollmentScreenHandler::HandleFrameLoadingCompleted() { |
| 524 if (network_state_informer_->state() != NetworkStateInformer::ONLINE) | 609 if (network_state_informer_->state() != NetworkStateInformer::ONLINE) |
| 525 return; | 610 return; |
| 526 | 611 |
| 527 UpdateState(NetworkError::ERROR_REASON_UPDATE); | 612 UpdateState(NetworkError::ERROR_REASON_UPDATE); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 | 661 |
| 577 ShowScreenWithData(OobeScreen::SCREEN_OOBE_ENROLLMENT, &screen_data); | 662 ShowScreenWithData(OobeScreen::SCREEN_OOBE_ENROLLMENT, &screen_data); |
| 578 if (first_show_) { | 663 if (first_show_) { |
| 579 first_show_ = false; | 664 first_show_ = false; |
| 580 UpdateStateInternal(NetworkError::ERROR_REASON_UPDATE, true); | 665 UpdateStateInternal(NetworkError::ERROR_REASON_UPDATE, true); |
| 581 } | 666 } |
| 582 histogram_helper_->OnScreenShow(); | 667 histogram_helper_->OnScreenShow(); |
| 583 } | 668 } |
| 584 | 669 |
| 585 } // namespace chromeos | 670 } // namespace chromeos |
| OLD | NEW |