Index: chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc |
diff --git a/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cda117c7640fe743ecdc4195f2797e92457b53e7 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc |
@@ -0,0 +1,307 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.h" |
+ |
+#include "base/callback.h" |
+#include "base/command_line.h" |
+#include "base/json/json_reader.h" |
+#include "base/json/json_writer.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
+#include "chrome/browser/browsing_data_remover.h" |
+#include "chrome/browser/net/gaia/gaia_oauth_fetcher.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/net/gaia/gaia_constants.h" |
+#include "chrome/common/net/gaia/google_service_auth_error.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/tab_contents/tab_contents.h" |
+#include "grit/chromium_strings.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace { |
+ |
+// Start page of GAIA authentication extension. |
+const char kGaiaExtStartPage[] = |
+ "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/main.html"; |
+ |
+// OAuth V2 service scope for device management. |
+const char kServiceScopeChromeOSDeviceManagement[] = |
+ "https://www.googleapis.com/auth/chromeosdevicemanagement"; |
+ |
+// Enrollment step names. |
+const char kEnrollmentStepSignin[] = "signin"; |
+const char kEnrollmentStepWorking[] = "working"; |
+const char kEnrollmentStepError[] = "error"; |
+const char kEnrollmentStepSuccess[] = "success"; |
+ |
+} // namespace |
+ |
+namespace chromeos { |
+ |
+// EnterpriseOAuthEnrollmentScreenHandler, public ------------------------------ |
+ |
+EnterpriseOAuthEnrollmentScreenHandler::EnterpriseOAuthEnrollmentScreenHandler() |
+ : controller_(NULL), editable_user_(true), show_on_init_(false) { |
+} |
+ |
+EnterpriseOAuthEnrollmentScreenHandler:: |
+ ~EnterpriseOAuthEnrollmentScreenHandler() {} |
+ |
+// EnterpriseOAuthEnrollmentScreenHandler, WebUIMessageHandler implementation -- |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::RegisterMessages() { |
+ web_ui_->RegisterMessageCallback( |
+ "oauthEnrollClose", |
+ NewCallback( |
+ this, |
+ &EnterpriseOAuthEnrollmentScreenHandler::HandleClose)); |
+ web_ui_->RegisterMessageCallback( |
+ "oauthEnrollCompleteLogin", |
+ NewCallback( |
+ this, |
+ &EnterpriseOAuthEnrollmentScreenHandler::HandleCompleteLogin)); |
+ web_ui_->RegisterMessageCallback( |
+ "oauthEnrollRetry", |
+ NewCallback( |
+ this, |
+ &EnterpriseOAuthEnrollmentScreenHandler::HandleRetry)); |
+} |
+ |
+// EnterpriseOAuthEnrollmentScreenHandler |
+// EnterpriseEnrollmentScreenActor implementation ------------------------- |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::SetController( |
+ Controller* controller) { |
+ controller_ = controller; |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::PrepareToShow() { |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::Show() { |
+ if (!page_is_ready()) { |
+ show_on_init_ = true; |
+ return; |
+ } |
+ |
+ DictionaryValue screen_data; |
+ screen_data.SetString("signin_url", kGaiaExtStartPage); |
+ ShowScreen("oauth-enrollment", &screen_data); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::Hide() { |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::SetEditableUser(bool editable) { |
+ editable_user_ = editable; |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowConfirmationScreen() { |
+ ShowStep(kEnrollmentStepSuccess); |
+ NotifyObservers(true); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowAuthError( |
+ const GoogleServiceAuthError& error) { |
+ switch (error.state()) { |
+ case GoogleServiceAuthError::NONE: |
+ case GoogleServiceAuthError::CAPTCHA_REQUIRED: |
+ case GoogleServiceAuthError::TWO_FACTOR: |
+ case GoogleServiceAuthError::HOSTED_NOT_ALLOWED: |
+ case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: |
+ case GoogleServiceAuthError::REQUEST_CANCELED: |
+ LOG(ERROR) << "Auth error " << error.state(); |
+ ShowFatalAuthError(); |
+ break; |
+ case GoogleServiceAuthError::USER_NOT_SIGNED_UP: |
+ case GoogleServiceAuthError::ACCOUNT_DELETED: |
+ case GoogleServiceAuthError::ACCOUNT_DISABLED: |
+ LOG(ERROR) << "Account error " << error.state(); |
+ ShowAccountError(); |
+ break; |
+ case GoogleServiceAuthError::CONNECTION_FAILED: |
+ case GoogleServiceAuthError::SERVICE_UNAVAILABLE: |
+ LOG(WARNING) << "Network error " << error.state(); |
+ ShowNetworkEnrollmentError(); |
+ break; |
+ } |
+ NotifyObservers(false); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowAccountError() { |
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR, true); |
+ NotifyObservers(false); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowFatalAuthError() { |
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_AUTH_ERROR, false); |
+ NotifyObservers(false); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowFatalEnrollmentError() { |
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_ENROLLMENT_ERROR, false); |
+ NotifyObservers(false); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowNetworkEnrollmentError() { |
+ ShowError(IDS_ENTERPRISE_ENROLLMENT_NETWORK_ENROLLMENT_ERROR, true); |
+ NotifyObservers(false); |
+} |
+ |
+// EnterpriseOAuthEnrollmentScreenHandler BaseScreenHandler implementation ----- |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::GetLocalizedStrings( |
+ base::DictionaryValue *localized_strings) { |
+ localized_strings->SetString( |
+ "oauthEnrollScreenTitle", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE)); |
+ localized_strings->SetString( |
+ "oauthEnrollRetry", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_RETRY)); |
+ localized_strings->SetString( |
+ "oauthEnrollCancel", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_CANCEL)); |
+ localized_strings->SetString( |
+ "oauthEnrollDone", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_DONE)); |
+ localized_strings->SetString( |
+ "oauthEnrollSuccess", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_SUCCESS)); |
+ localized_strings->SetString( |
+ "oauthEnrollWorking", |
+ l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_WORKING)); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnGetOAuthTokenFailure() { |
+ ResetAuth(); |
+ ShowFatalAuthError(); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthGetAccessTokenFailure( |
+ const GoogleServiceAuthError& error) { |
+ ResetAuth(); |
+ ShowAuthError(error); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthWrapBridgeSuccess( |
+ const std::string& service_scope, |
+ const std::string& token, |
+ const std::string& expires_in) { |
+ DCHECK_EQ(service_scope, GaiaConstants::kDeviceManagementServiceOAuth); |
+ ResetAuth(); |
+ |
+ if (!controller_ || user_.empty()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ controller_->OnOAuthTokenAvailable(user_, token); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthWrapBridgeFailure( |
+ const std::string& service_scope, |
+ const GoogleServiceAuthError& error) { |
+ ResetAuth(); |
+ ShowAuthError(error); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnUserInfoSuccess( |
+ const std::string& email) { |
+ ResetAuth(); |
+ NOTREACHED(); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::OnUserInfoFailure( |
+ const GoogleServiceAuthError& error) { |
+ ResetAuth(); |
+ NOTREACHED(); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::Initialize() { |
+ if (show_on_init_) { |
+ Show(); |
+ show_on_init_ = false; |
+ } |
+} |
+ |
+// EnterpriseOAuthEnrollmentScreenHandler, private ----------------------------- |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::HandleClose( |
+ const base::ListValue* value) { |
+ ResetAuth(); |
+ |
+ if (!controller_) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ controller_->OnConfirmationClosed(); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::HandleCompleteLogin( |
+ const base::ListValue* value) { |
+ if (!controller_) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ if (!value->GetString(0, &user_)) { |
+ NOTREACHED() << "Invalid user parameter from UI."; |
+ return; |
+ } |
+ |
+ Profile* profile = |
+ Profile::FromBrowserContext(web_ui_->tab_contents()->browser_context()); |
+ oauth_fetcher_.reset( |
+ new GaiaOAuthFetcher(this, |
+ profile->GetRequestContext(), |
+ profile, |
+ GaiaConstants::kDeviceManagementServiceOAuth)); |
+ oauth_fetcher_->SetAutoFetchLimit( |
+ GaiaOAuthFetcher::OAUTH2_SERVICE_ACCESS_TOKEN); |
+ oauth_fetcher_->StartGetOAuthTokenRequest(); |
+ |
+ ShowStep(kEnrollmentStepWorking); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::HandleRetry( |
+ const base::ListValue* value) { |
+ Show(); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowStep(const char* step) { |
+ base::StringValue step_value(step); |
+ web_ui_->CallJavascriptFunction("oobe.OAuthEnrollmentScreen.showStep", |
+ step_value); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ShowError(int message_id, |
+ bool retry) { |
+ const std::string message(l10n_util::GetStringUTF8(message_id)); |
+ base::StringValue message_value(message); |
+ base::FundamentalValue retry_value(retry); |
+ web_ui_->CallJavascriptFunction("oobe.OAuthEnrollmentScreen.showError", |
+ message_value, |
+ retry_value); |
+} |
+ |
+void EnterpriseOAuthEnrollmentScreenHandler::ResetAuth() { |
+ oauth_fetcher_.reset(); |
+ |
+ // Clear page state. |
+ int remove_mask = |
+ BrowsingDataRemover::REMOVE_COOKIES | |
+ BrowsingDataRemover::REMOVE_LSO_DATA; |
+ (new BrowsingDataRemover( |
+ Profile::FromBrowserContext(web_ui_->tab_contents()->browser_context()), |
+ BrowsingDataRemover::EVERYTHING, |
+ base::Time()))->Remove(remove_mask); |
+} |
+ |
+ |
+} // namespace chromeos |