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

Side by Side Diff: chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc

Issue 332243002: Network connectivity errors handling (incl. CP) for enrollment flow (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed nits Created 6 years, 5 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
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/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 "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/strings/string_util.h"
13 #include "base/values.h" 14 #include "base/values.h"
14 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/browsing_data/browsing_data_helper.h" 16 #include "chrome/browser/browsing_data/browsing_data_helper.h"
16 #include "chrome/browser/browsing_data/browsing_data_remover.h" 17 #include "chrome/browser/browsing_data/browsing_data_remover.h"
18 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
17 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" 19 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
18 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retrie ver.h" 21 #include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retrie ver.h"
20 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 22 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
23 #include "chromeos/network/network_state.h"
24 #include "chromeos/network/network_state_handler.h"
21 #include "components/policy/core/browser/cloud/message_util.h" 25 #include "components/policy/core/browser/cloud/message_util.h"
22 #include "content/public/browser/web_contents.h" 26 #include "content/public/browser/web_contents.h"
23 #include "google_apis/gaia/gaia_auth_fetcher.h" 27 #include "google_apis/gaia/gaia_auth_fetcher.h"
24 #include "google_apis/gaia/gaia_auth_util.h" 28 #include "google_apis/gaia/gaia_auth_util.h"
25 #include "google_apis/gaia/gaia_constants.h" 29 #include "google_apis/gaia/gaia_constants.h"
26 #include "google_apis/gaia/gaia_urls.h" 30 #include "google_apis/gaia/gaia_urls.h"
27 #include "google_apis/gaia/google_service_auth_error.h" 31 #include "google_apis/gaia/google_service_auth_error.h"
28 #include "grit/chromium_strings.h" 32 #include "grit/chromium_strings.h"
29 #include "grit/generated_resources.h" 33 #include "grit/generated_resources.h"
30 #include "net/url_request/url_request_context_getter.h" 34 #include "net/url_request/url_request_context_getter.h"
(...skipping 18 matching lines...) Expand all
49 const char kEnrollmentModeAuto[] = "auto"; 53 const char kEnrollmentModeAuto[] = "auto";
50 54
51 std::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) { 55 std::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) {
52 switch (mode) { 56 switch (mode) {
53 case EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL: 57 case EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL:
54 return kEnrollmentModeManual; 58 return kEnrollmentModeManual;
55 case EnrollmentScreenActor::ENROLLMENT_MODE_FORCED: 59 case EnrollmentScreenActor::ENROLLMENT_MODE_FORCED:
56 return kEnrollmentModeForced; 60 return kEnrollmentModeForced;
57 case EnrollmentScreenActor::ENROLLMENT_MODE_AUTO: 61 case EnrollmentScreenActor::ENROLLMENT_MODE_AUTO:
58 return kEnrollmentModeAuto; 62 return kEnrollmentModeAuto;
63 default:
64 NOTREACHED() << "Bad enrollment mode " << mode;
59 } 65 }
60 66
61 NOTREACHED() << "Bad enrollment mode " << mode;
62 return kEnrollmentModeManual; 67 return kEnrollmentModeManual;
63 } 68 }
64 69
65 // A helper class that takes care of asynchronously revoking a given token. 70 // A helper class that takes care of asynchronously revoking a given token.
66 class TokenRevoker : public GaiaAuthConsumer { 71 class TokenRevoker : public GaiaAuthConsumer {
67 public: 72 public:
68 TokenRevoker() 73 TokenRevoker()
69 : gaia_fetcher_(this, 74 : gaia_fetcher_(this,
70 GaiaConstants::kChromeOSSource, 75 GaiaConstants::kChromeOSSource,
71 g_browser_process->system_request_context()) {} 76 g_browser_process->system_request_context()) {}
72 virtual ~TokenRevoker() {} 77 virtual ~TokenRevoker() {}
73 78
74 void Start(const std::string& token) { 79 void Start(const std::string& token) {
75 gaia_fetcher_.StartRevokeOAuth2Token(token); 80 gaia_fetcher_.StartRevokeOAuth2Token(token);
76 } 81 }
77 82
78 // GaiaAuthConsumer: 83 // GaiaAuthConsumer:
79 virtual void OnOAuth2RevokeTokenCompleted() OVERRIDE { 84 virtual void OnOAuth2RevokeTokenCompleted() OVERRIDE {
80 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 85 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
81 } 86 }
82 87
83 private: 88 private:
84 GaiaAuthFetcher gaia_fetcher_; 89 GaiaAuthFetcher gaia_fetcher_;
85 90
86 DISALLOW_COPY_AND_ASSIGN(TokenRevoker); 91 DISALLOW_COPY_AND_ASSIGN(TokenRevoker);
87 }; 92 };
88 93
94 // Returns network name by service path.
95 std::string GetNetworkName(const std::string& service_path) {
96 const NetworkState* network =
97 NetworkHandler::Get()->network_state_handler()->GetNetworkState(
98 service_path);
99 if (!network)
100 return std::string();
101 return network->name();
102 }
103
104 bool IsBehindCaptivePortal(NetworkStateInformer::State state,
105 ErrorScreenActor::ErrorReason reason) {
106 return state == NetworkStateInformer::CAPTIVE_PORTAL ||
107 reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED;
108 }
109
110 bool IsProxyError(NetworkStateInformer::State state,
111 ErrorScreenActor::ErrorReason reason) {
112 return state == NetworkStateInformer::PROXY_AUTH_REQUIRED ||
113 reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED ||
114 reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED;
115 }
116
89 } // namespace 117 } // namespace
90 118
91 // EnrollmentScreenHandler, public ------------------------------ 119 // EnrollmentScreenHandler, public ------------------------------
92 120
93 EnrollmentScreenHandler::EnrollmentScreenHandler() 121 EnrollmentScreenHandler::EnrollmentScreenHandler(
122 const scoped_refptr<NetworkStateInformer>& network_state_informer,
123 ErrorScreenActor* error_screen_actor)
94 : BaseScreenHandler(kJsScreenPath), 124 : BaseScreenHandler(kJsScreenPath),
95 controller_(NULL), 125 controller_(NULL),
96 show_on_init_(false), 126 show_on_init_(false),
97 enrollment_mode_(ENROLLMENT_MODE_MANUAL), 127 enrollment_mode_(ENROLLMENT_MODE_MANUAL),
98 browsing_data_remover_(NULL) { 128 browsing_data_remover_(NULL),
129 frame_error_(net::OK),
130 network_state_informer_(network_state_informer),
131 error_screen_actor_(error_screen_actor),
132 weak_ptr_factory_(this) {
99 set_async_assets_load_id(OobeUI::kScreenOobeEnrollment); 133 set_async_assets_load_id(OobeUI::kScreenOobeEnrollment);
134 DCHECK(network_state_informer_.get());
135 DCHECK(error_screen_actor_);
136 network_state_informer_->AddObserver(this);
137
138 if (chromeos::LoginDisplayHostImpl::default_host()) {
139 chromeos::WebUILoginView* login_view =
140 chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
141 if (login_view)
142 login_view->AddFrameObserver(this);
143 }
100 } 144 }
101 145
102 EnrollmentScreenHandler::~EnrollmentScreenHandler() { 146 EnrollmentScreenHandler::~EnrollmentScreenHandler() {
103 if (browsing_data_remover_) 147 if (browsing_data_remover_)
104 browsing_data_remover_->RemoveObserver(this); 148 browsing_data_remover_->RemoveObserver(this);
149 network_state_informer_->RemoveObserver(this);
150
151 if (chromeos::LoginDisplayHostImpl::default_host()) {
152 chromeos::WebUILoginView* login_view =
153 chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
154 if (login_view)
155 login_view->RemoveFrameObserver(this);
156 }
105 } 157 }
106 158
107 // EnrollmentScreenHandler, WebUIMessageHandler implementation -- 159 // EnrollmentScreenHandler, WebUIMessageHandler implementation --
108 160
109 void EnrollmentScreenHandler::RegisterMessages() { 161 void EnrollmentScreenHandler::RegisterMessages() {
110 AddCallback("oauthEnrollRetrieveAuthenticatedUserEmail", 162 AddCallback("oauthEnrollRetrieveAuthenticatedUserEmail",
111 &EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail); 163 &EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail);
112 AddCallback("oauthEnrollClose", 164 AddCallback("oauthEnrollClose",
113 &EnrollmentScreenHandler::HandleClose); 165 &EnrollmentScreenHandler::HandleClose);
114 AddCallback("oauthEnrollCompleteLogin", 166 AddCallback("oauthEnrollCompleteLogin",
115 &EnrollmentScreenHandler::HandleCompleteLogin); 167 &EnrollmentScreenHandler::HandleCompleteLogin);
116 AddCallback("oauthEnrollRetry", 168 AddCallback("oauthEnrollRetry",
117 &EnrollmentScreenHandler::HandleRetry); 169 &EnrollmentScreenHandler::HandleRetry);
170 AddCallback("frameLoadingCompleted",
171 &EnrollmentScreenHandler::HandleFrameLoadingCompleted);
118 } 172 }
119 173
120 // EnrollmentScreenHandler 174 // EnrollmentScreenHandler
121 // EnrollmentScreenActor implementation ----------------------------------- 175 // EnrollmentScreenActor implementation -----------------------------------
122 176
123 void EnrollmentScreenHandler::SetParameters( 177 void EnrollmentScreenHandler::SetParameters(
124 Controller* controller, 178 Controller* controller,
125 EnrollmentMode enrollment_mode, 179 EnrollmentMode enrollment_mode,
126 const std::string& management_domain) { 180 const std::string& management_domain) {
127 controller_ = controller; 181 controller_ = controller;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 browsing_data_remover_ = NULL; 401 browsing_data_remover_ = NULL;
348 402
349 std::vector<base::Closure> callbacks_to_run; 403 std::vector<base::Closure> callbacks_to_run;
350 callbacks_to_run.swap(auth_reset_callbacks_); 404 callbacks_to_run.swap(auth_reset_callbacks_);
351 for (std::vector<base::Closure>::iterator callback(callbacks_to_run.begin()); 405 for (std::vector<base::Closure>::iterator callback(callbacks_to_run.begin());
352 callback != callbacks_to_run.end(); ++callback) { 406 callback != callbacks_to_run.end(); ++callback) {
353 callback->Run(); 407 callback->Run();
354 } 408 }
355 } 409 }
356 410
411 OobeUI::Screen EnrollmentScreenHandler::GetCurrentScreen() const {
412 OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN;
413 OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
414 if (oobe_ui)
415 screen = oobe_ui->current_screen();
416 return screen;
417 }
418
419 bool EnrollmentScreenHandler::IsOnEnrollmentScreen() const {
420 return (GetCurrentScreen() == OobeUI::SCREEN_OOBE_ENROLLMENT);
421 }
422
423 bool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const {
424 return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE &&
425 error_screen_actor_->parent_screen() ==
426 OobeUI::SCREEN_OOBE_ENROLLMENT);
427 }
428
429 // TODO(rsorokin): This function is mostly copied from SigninScreenHandler and
430 // should be refactored in the future.
431 void EnrollmentScreenHandler::UpdateState(
432 ErrorScreenActor::ErrorReason reason) {
433 if (!IsOnEnrollmentScreen() && !IsEnrollmentScreenHiddenByError())
434 return;
435
436 NetworkStateInformer::State state = network_state_informer_->state();
437 const std::string network_path = network_state_informer_->network_path();
438 const bool is_online = (state == NetworkStateInformer::ONLINE);
439 const bool is_behind_captive_portal =
440 (state == NetworkStateInformer::CAPTIVE_PORTAL);
441 const bool is_frame_error =
442 (frame_error() != net::OK) ||
443 (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
444
445 LOG(WARNING) << "EnrollmentScreenHandler::UpdateState(): "
446 << "state=" << NetworkStateInformer::StatusString(state) << ", "
447 << "reason=" << ErrorScreenActor::ErrorReasonString(reason);
448
449 if (is_online || !is_behind_captive_portal)
450 error_screen_actor_->HideCaptivePortal();
451
452 if (is_frame_error) {
453 LOG(WARNING) << "Retry page load";
454 // TODO(rsorokin): Too many consecutive reloads.
455 CallJS("doReload");
456 }
457
458 if (!is_online || is_frame_error)
459 SetupAndShowOfflineMessage(state, reason);
460 else
461 HideOfflineMessage(state, reason);
462 }
463
464 void EnrollmentScreenHandler::SetupAndShowOfflineMessage(
465 NetworkStateInformer::State state,
466 ErrorScreenActor::ErrorReason reason) {
467 const std::string network_path = network_state_informer_->network_path();
468 const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
469 const bool is_proxy_error = IsProxyError(state, reason);
470 const bool is_frame_error =
471 (frame_error() != net::OK) ||
472 (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
473
474 if (is_proxy_error) {
475 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY,
476 std::string());
477 } else if (is_behind_captive_portal) {
478 // Do not bother a user with obsessive captive portal showing. This
479 // check makes captive portal being shown only once: either when error
480 // screen is shown for the first time or when switching from another
481 // error screen (offline, proxy).
482 if (IsOnEnrollmentScreen() || (error_screen_actor_->error_state() !=
483 ErrorScreen::ERROR_STATE_PORTAL)) {
484 error_screen_actor_->FixCaptivePortal();
485 }
486 const std::string network_name = GetNetworkName(network_path);
487 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL,
488 network_name);
489 } else if (is_frame_error) {
490 error_screen_actor_->SetErrorState(
491 ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string());
492 } else {
493 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE,
494 std::string());
495 }
496
497 if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) {
498 base::DictionaryValue params;
499 const std::string network_type = network_state_informer_->network_type();
500 params.SetString("lastNetworkType", network_type);
501 error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN);
502 error_screen_actor_->Show(OobeUI::SCREEN_OOBE_ENROLLMENT,
503 &params,
504 base::Bind(&EnrollmentScreenHandler::DoShow,
505 weak_ptr_factory_.GetWeakPtr()));
506 }
507 }
508
509 void EnrollmentScreenHandler::HideOfflineMessage(
510 NetworkStateInformer::State state,
511 ErrorScreenActor::ErrorReason reason) {
512 if (IsEnrollmentScreenHiddenByError())
513 error_screen_actor_->Hide();
514 }
515
516 void EnrollmentScreenHandler::OnFrameError(
517 const std::string& frame_unique_name) {
518 if (frame_unique_name == "oauth-enroll-signin-frame") {
519 HandleFrameLoadingCompleted(net::ERR_FAILED);
520 }
521 }
357 // EnrollmentScreenHandler, private ----------------------------- 522 // EnrollmentScreenHandler, private -----------------------------
358 523
359 void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail( 524 void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail(
360 double attempt_token) { 525 double attempt_token) {
361 email_retriever_.reset(new AuthenticatedUserEmailRetriever( 526 email_retriever_.reset(new AuthenticatedUserEmailRetriever(
362 base::Bind(&EnrollmentScreenHandler::CallJS<double, std::string>, 527 base::Bind(&EnrollmentScreenHandler::CallJS<double, std::string>,
363 base::Unretained(this), 528 base::Unretained(this),
364 "setAuthenticatedUserEmail", 529 "setAuthenticatedUserEmail",
365 attempt_token), 530 attempt_token),
366 Profile::FromWebUI(web_ui())->GetRequestContext())); 531 Profile::FromWebUI(web_ui())->GetRequestContext()));
367 } 532 }
368 533
369 void EnrollmentScreenHandler::HandleClose(const std::string& reason) { 534 void EnrollmentScreenHandler::HandleClose(const std::string& reason) {
370 if (!controller_) { 535 DCHECK(controller_);
371 NOTREACHED();
372 return;
373 }
374 536
375 if (reason == "cancel" || reason == "autocancel") 537 if (reason == "cancel" || reason == "autocancel")
376 controller_->OnCancel(); 538 controller_->OnCancel();
377 else if (reason == "done") 539 else if (reason == "done")
378 controller_->OnConfirmationClosed(); 540 controller_->OnConfirmationClosed();
379 else 541 else
380 NOTREACHED(); 542 NOTREACHED();
381 } 543 }
382 544
383 void EnrollmentScreenHandler::HandleCompleteLogin(const std::string& user) { 545 void EnrollmentScreenHandler::HandleCompleteLogin(const std::string& user) {
384 if (!controller_) { 546 DCHECK(controller_);
385 NOTREACHED();
386 return;
387 }
388 controller_->OnLoginDone(gaia::SanitizeEmail(user)); 547 controller_->OnLoginDone(gaia::SanitizeEmail(user));
389 } 548 }
390 549
391 void EnrollmentScreenHandler::HandleRetry() { 550 void EnrollmentScreenHandler::HandleRetry() {
392 if (!controller_) { 551 DCHECK(controller_);
393 NOTREACHED(); 552 controller_->OnRetry();
553 }
554
555 void EnrollmentScreenHandler::HandleFrameLoadingCompleted(int status) {
556 const net::Error frame_error = static_cast<net::Error>(status);
557 frame_error_ = frame_error;
558
559 if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
394 return; 560 return;
395 } 561 if (frame_error_)
396 controller_->OnRetry(); 562 UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
563 else
564 UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
397 } 565 }
398 566
399 void EnrollmentScreenHandler::ShowStep(const char* step) { 567 void EnrollmentScreenHandler::ShowStep(const char* step) {
400 CallJS("showStep", std::string(step)); 568 CallJS("showStep", std::string(step));
401 } 569 }
402 570
403 void EnrollmentScreenHandler::ShowError(int message_id, bool retry) { 571 void EnrollmentScreenHandler::ShowError(int message_id, bool retry) {
404 ShowErrorMessage(l10n_util::GetStringUTF8(message_id), retry); 572 ShowErrorMessage(l10n_util::GetStringUTF8(message_id), retry);
405 } 573 }
406 574
(...skipping 23 matching lines...) Expand all
430 screen_data.SetString("signin_url", kGaiaExtStartPage); 598 screen_data.SetString("signin_url", kGaiaExtStartPage);
431 screen_data.SetString("gaiaUrl", GaiaUrls::GetInstance()->gaia_url().spec()); 599 screen_data.SetString("gaiaUrl", GaiaUrls::GetInstance()->gaia_url().spec());
432 screen_data.SetString("enrollment_mode", 600 screen_data.SetString("enrollment_mode",
433 EnrollmentModeToString(enrollment_mode_)); 601 EnrollmentModeToString(enrollment_mode_));
434 screen_data.SetString("management_domain", management_domain_); 602 screen_data.SetString("management_domain", management_domain_);
435 603
436 ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data); 604 ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data);
437 } 605 }
438 606
439 } // namespace chromeos 607 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698