OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_scr
een_handler.h" |
| 6 |
| 7 #include "base/callback.h" |
| 8 #include "base/command_line.h" |
| 9 #include "base/json/json_reader.h" |
| 10 #include "base/json/json_writer.h" |
| 11 #include "base/utf_string_conversions.h" |
| 12 #include "base/values.h" |
| 13 #include "chrome/browser/browsing_data_remover.h" |
| 14 #include "chrome/browser/net/gaia/gaia_oauth_fetcher.h" |
| 15 #include "chrome/browser/profiles/profile.h" |
| 16 #include "chrome/common/chrome_switches.h" |
| 17 #include "chrome/common/net/gaia/gaia_constants.h" |
| 18 #include "chrome/common/net/gaia/google_service_auth_error.h" |
| 19 #include "chrome/common/url_constants.h" |
| 20 #include "content/browser/renderer_host/render_view_host.h" |
| 21 #include "content/browser/tab_contents/tab_contents.h" |
| 22 #include "grit/chromium_strings.h" |
| 23 #include "grit/generated_resources.h" |
| 24 #include "ui/base/l10n/l10n_util.h" |
| 25 |
| 26 namespace { |
| 27 |
| 28 // Start page of GAIA authentication extension. |
| 29 const char kGaiaExtStartPage[] = |
| 30 "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/main.html"; |
| 31 |
| 32 // OAuth V2 service scope for device management. |
| 33 const char kServiceScopeChromeOSDeviceManagement[] = |
| 34 "https://www.googleapis.com/auth/chromeosdevicemanagement"; |
| 35 |
| 36 // Enrollment step names. |
| 37 const char kEnrollmentStepSignin[] = "signin"; |
| 38 const char kEnrollmentStepWorking[] = "working"; |
| 39 const char kEnrollmentStepError[] = "error"; |
| 40 const char kEnrollmentStepSuccess[] = "success"; |
| 41 |
| 42 } // namespace |
| 43 |
| 44 namespace chromeos { |
| 45 |
| 46 // EnterpriseOAuthEnrollmentScreenHandler, public ------------------------------ |
| 47 |
| 48 EnterpriseOAuthEnrollmentScreenHandler::EnterpriseOAuthEnrollmentScreenHandler() |
| 49 : controller_(NULL), editable_user_(true), show_on_init_(false) { |
| 50 } |
| 51 |
| 52 EnterpriseOAuthEnrollmentScreenHandler:: |
| 53 ~EnterpriseOAuthEnrollmentScreenHandler() {} |
| 54 |
| 55 // EnterpriseOAuthEnrollmentScreenHandler, WebUIMessageHandler implementation -- |
| 56 |
| 57 void EnterpriseOAuthEnrollmentScreenHandler::RegisterMessages() { |
| 58 web_ui_->RegisterMessageCallback( |
| 59 "oauthEnrollClose", |
| 60 NewCallback( |
| 61 this, |
| 62 &EnterpriseOAuthEnrollmentScreenHandler::HandleClose)); |
| 63 web_ui_->RegisterMessageCallback( |
| 64 "oauthEnrollCompleteLogin", |
| 65 NewCallback( |
| 66 this, |
| 67 &EnterpriseOAuthEnrollmentScreenHandler::HandleCompleteLogin)); |
| 68 web_ui_->RegisterMessageCallback( |
| 69 "oauthEnrollRetry", |
| 70 NewCallback( |
| 71 this, |
| 72 &EnterpriseOAuthEnrollmentScreenHandler::HandleRetry)); |
| 73 } |
| 74 |
| 75 // EnterpriseOAuthEnrollmentScreenHandler |
| 76 // EnterpriseEnrollmentScreenActor implementation ------------------------- |
| 77 |
| 78 void EnterpriseOAuthEnrollmentScreenHandler::SetController( |
| 79 Controller* controller) { |
| 80 controller_ = controller; |
| 81 } |
| 82 |
| 83 void EnterpriseOAuthEnrollmentScreenHandler::PrepareToShow() { |
| 84 } |
| 85 |
| 86 void EnterpriseOAuthEnrollmentScreenHandler::Show() { |
| 87 if (!page_is_ready()) { |
| 88 show_on_init_ = true; |
| 89 return; |
| 90 } |
| 91 |
| 92 DictionaryValue screen_data; |
| 93 screen_data.SetString("signin_url", kGaiaExtStartPage); |
| 94 ShowScreen("oauth-enrollment", &screen_data); |
| 95 } |
| 96 |
| 97 void EnterpriseOAuthEnrollmentScreenHandler::Hide() { |
| 98 } |
| 99 |
| 100 void EnterpriseOAuthEnrollmentScreenHandler::SetEditableUser(bool editable) { |
| 101 editable_user_ = editable; |
| 102 } |
| 103 |
| 104 void EnterpriseOAuthEnrollmentScreenHandler::ShowConfirmationScreen() { |
| 105 ShowStep(kEnrollmentStepSuccess); |
| 106 NotifyObservers(true); |
| 107 } |
| 108 |
| 109 void EnterpriseOAuthEnrollmentScreenHandler::ShowAuthError( |
| 110 const GoogleServiceAuthError& error) { |
| 111 switch (error.state()) { |
| 112 case GoogleServiceAuthError::NONE: |
| 113 case GoogleServiceAuthError::CAPTCHA_REQUIRED: |
| 114 case GoogleServiceAuthError::TWO_FACTOR: |
| 115 case GoogleServiceAuthError::HOSTED_NOT_ALLOWED: |
| 116 case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: |
| 117 case GoogleServiceAuthError::REQUEST_CANCELED: |
| 118 LOG(ERROR) << "Auth error " << error.state(); |
| 119 ShowFatalAuthError(); |
| 120 break; |
| 121 case GoogleServiceAuthError::USER_NOT_SIGNED_UP: |
| 122 case GoogleServiceAuthError::ACCOUNT_DELETED: |
| 123 case GoogleServiceAuthError::ACCOUNT_DISABLED: |
| 124 LOG(ERROR) << "Account error " << error.state(); |
| 125 ShowAccountError(); |
| 126 break; |
| 127 case GoogleServiceAuthError::CONNECTION_FAILED: |
| 128 case GoogleServiceAuthError::SERVICE_UNAVAILABLE: |
| 129 LOG(WARNING) << "Network error " << error.state(); |
| 130 ShowNetworkEnrollmentError(); |
| 131 break; |
| 132 } |
| 133 NotifyObservers(false); |
| 134 } |
| 135 |
| 136 void EnterpriseOAuthEnrollmentScreenHandler::ShowAccountError() { |
| 137 ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR, true); |
| 138 NotifyObservers(false); |
| 139 } |
| 140 |
| 141 void EnterpriseOAuthEnrollmentScreenHandler::ShowFatalAuthError() { |
| 142 ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_AUTH_ERROR, false); |
| 143 NotifyObservers(false); |
| 144 } |
| 145 |
| 146 void EnterpriseOAuthEnrollmentScreenHandler::ShowFatalEnrollmentError() { |
| 147 ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_ENROLLMENT_ERROR, false); |
| 148 NotifyObservers(false); |
| 149 } |
| 150 |
| 151 void EnterpriseOAuthEnrollmentScreenHandler::ShowNetworkEnrollmentError() { |
| 152 ShowError(IDS_ENTERPRISE_ENROLLMENT_NETWORK_ENROLLMENT_ERROR, true); |
| 153 NotifyObservers(false); |
| 154 } |
| 155 |
| 156 // EnterpriseOAuthEnrollmentScreenHandler BaseScreenHandler implementation ----- |
| 157 |
| 158 void EnterpriseOAuthEnrollmentScreenHandler::GetLocalizedStrings( |
| 159 base::DictionaryValue *localized_strings) { |
| 160 localized_strings->SetString( |
| 161 "oauthEnrollScreenTitle", |
| 162 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE)); |
| 163 localized_strings->SetString( |
| 164 "oauthEnrollRetry", |
| 165 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_RETRY)); |
| 166 localized_strings->SetString( |
| 167 "oauthEnrollCancel", |
| 168 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_CANCEL)); |
| 169 localized_strings->SetString( |
| 170 "oauthEnrollDone", |
| 171 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_DONE)); |
| 172 localized_strings->SetString( |
| 173 "oauthEnrollSuccess", |
| 174 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_SUCCESS)); |
| 175 localized_strings->SetString( |
| 176 "oauthEnrollWorking", |
| 177 l10n_util::GetStringUTF16(IDS_ENTERPRISE_ENROLLMENT_WORKING)); |
| 178 } |
| 179 |
| 180 void EnterpriseOAuthEnrollmentScreenHandler::OnGetOAuthTokenFailure() { |
| 181 ResetAuth(); |
| 182 ShowFatalAuthError(); |
| 183 } |
| 184 |
| 185 void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthGetAccessTokenFailure( |
| 186 const GoogleServiceAuthError& error) { |
| 187 ResetAuth(); |
| 188 ShowAuthError(error); |
| 189 } |
| 190 |
| 191 void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthWrapBridgeSuccess( |
| 192 const std::string& service_scope, |
| 193 const std::string& token, |
| 194 const std::string& expires_in) { |
| 195 DCHECK_EQ(service_scope, GaiaConstants::kDeviceManagementServiceOAuth); |
| 196 ResetAuth(); |
| 197 |
| 198 if (!controller_ || user_.empty()) { |
| 199 NOTREACHED(); |
| 200 return; |
| 201 } |
| 202 |
| 203 controller_->OnOAuthTokenAvailable(user_, token); |
| 204 } |
| 205 |
| 206 void EnterpriseOAuthEnrollmentScreenHandler::OnOAuthWrapBridgeFailure( |
| 207 const std::string& service_scope, |
| 208 const GoogleServiceAuthError& error) { |
| 209 ResetAuth(); |
| 210 ShowAuthError(error); |
| 211 } |
| 212 |
| 213 void EnterpriseOAuthEnrollmentScreenHandler::OnUserInfoSuccess( |
| 214 const std::string& email) { |
| 215 ResetAuth(); |
| 216 NOTREACHED(); |
| 217 } |
| 218 |
| 219 void EnterpriseOAuthEnrollmentScreenHandler::OnUserInfoFailure( |
| 220 const GoogleServiceAuthError& error) { |
| 221 ResetAuth(); |
| 222 NOTREACHED(); |
| 223 } |
| 224 |
| 225 void EnterpriseOAuthEnrollmentScreenHandler::Initialize() { |
| 226 if (show_on_init_) { |
| 227 Show(); |
| 228 show_on_init_ = false; |
| 229 } |
| 230 } |
| 231 |
| 232 // EnterpriseOAuthEnrollmentScreenHandler, private ----------------------------- |
| 233 |
| 234 void EnterpriseOAuthEnrollmentScreenHandler::HandleClose( |
| 235 const base::ListValue* value) { |
| 236 ResetAuth(); |
| 237 |
| 238 if (!controller_) { |
| 239 NOTREACHED(); |
| 240 return; |
| 241 } |
| 242 |
| 243 controller_->OnConfirmationClosed(); |
| 244 } |
| 245 |
| 246 void EnterpriseOAuthEnrollmentScreenHandler::HandleCompleteLogin( |
| 247 const base::ListValue* value) { |
| 248 if (!controller_) { |
| 249 NOTREACHED(); |
| 250 return; |
| 251 } |
| 252 |
| 253 if (!value->GetString(0, &user_)) { |
| 254 NOTREACHED() << "Invalid user parameter from UI."; |
| 255 return; |
| 256 } |
| 257 |
| 258 Profile* profile = |
| 259 Profile::FromBrowserContext(web_ui_->tab_contents()->browser_context()); |
| 260 oauth_fetcher_.reset( |
| 261 new GaiaOAuthFetcher(this, |
| 262 profile->GetRequestContext(), |
| 263 profile, |
| 264 GaiaConstants::kDeviceManagementServiceOAuth)); |
| 265 oauth_fetcher_->SetAutoFetchLimit( |
| 266 GaiaOAuthFetcher::OAUTH2_SERVICE_ACCESS_TOKEN); |
| 267 oauth_fetcher_->StartGetOAuthTokenRequest(); |
| 268 |
| 269 ShowStep(kEnrollmentStepWorking); |
| 270 } |
| 271 |
| 272 void EnterpriseOAuthEnrollmentScreenHandler::HandleRetry( |
| 273 const base::ListValue* value) { |
| 274 Show(); |
| 275 } |
| 276 |
| 277 void EnterpriseOAuthEnrollmentScreenHandler::ShowStep(const char* step) { |
| 278 base::StringValue step_value(step); |
| 279 web_ui_->CallJavascriptFunction("oobe.OAuthEnrollmentScreen.showStep", |
| 280 step_value); |
| 281 } |
| 282 |
| 283 void EnterpriseOAuthEnrollmentScreenHandler::ShowError(int message_id, |
| 284 bool retry) { |
| 285 const std::string message(l10n_util::GetStringUTF8(message_id)); |
| 286 base::StringValue message_value(message); |
| 287 base::FundamentalValue retry_value(retry); |
| 288 web_ui_->CallJavascriptFunction("oobe.OAuthEnrollmentScreen.showError", |
| 289 message_value, |
| 290 retry_value); |
| 291 } |
| 292 |
| 293 void EnterpriseOAuthEnrollmentScreenHandler::ResetAuth() { |
| 294 oauth_fetcher_.reset(); |
| 295 |
| 296 // Clear page state. |
| 297 int remove_mask = |
| 298 BrowsingDataRemover::REMOVE_COOKIES | |
| 299 BrowsingDataRemover::REMOVE_LSO_DATA; |
| 300 (new BrowsingDataRemover( |
| 301 Profile::FromBrowserContext(web_ui_->tab_contents()->browser_context()), |
| 302 BrowsingDataRemover::EVERYTHING, |
| 303 base::Time()))->Remove(remove_mask); |
| 304 } |
| 305 |
| 306 |
| 307 } // namespace chromeos |
OLD | NEW |