Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/signin/inline_login_handler_impl.h" | 5 #include "chrome/browser/ui/webui/signin/inline_login_handler_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/signin/about_signin_internals_factory.h" | 15 #include "chrome/browser/signin/about_signin_internals_factory.h" |
| 16 #include "chrome/browser/signin/account_tracker_service_factory.h" | |
| 16 #include "chrome/browser/signin/chrome_signin_client_factory.h" | 17 #include "chrome/browser/signin/chrome_signin_client_factory.h" |
| 17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 18 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
| 18 #include "chrome/browser/signin/signin_manager_factory.h" | 19 #include "chrome/browser/signin/signin_manager_factory.h" |
| 19 #include "chrome/browser/sync/profile_sync_service.h" | 20 #include "chrome/browser/sync/profile_sync_service.h" |
| 20 #include "chrome/browser/sync/profile_sync_service_factory.h" | 21 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 21 #include "chrome/browser/ui/browser_finder.h" | 22 #include "chrome/browser/ui/browser_finder.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 23 #include "chrome/browser/ui/browser_window.h" |
| 23 #include "chrome/browser/ui/sync/one_click_signin_helper.h" | 24 #include "chrome/browser/ui/sync/one_click_signin_helper.h" |
| 24 #include "chrome/browser/ui/sync/one_click_signin_histogram.h" | 25 #include "chrome/browser/ui/sync/one_click_signin_histogram.h" |
| 25 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 26 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 26 #include "chrome/browser/ui/webui/signin/inline_login_ui.h" | 27 #include "chrome/browser/ui/webui/signin/inline_login_ui.h" |
| 27 #include "chrome/browser/ui/webui/signin/login_ui_service.h" | 28 #include "chrome/browser/ui/webui/signin/login_ui_service.h" |
| 28 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" | 29 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" |
| 29 #include "chrome/common/url_constants.h" | 30 #include "chrome/common/url_constants.h" |
| 30 #include "components/signin/core/browser/about_signin_internals.h" | 31 #include "components/signin/core/browser/about_signin_internals.h" |
| 32 #include "components/signin/core/browser/account_tracker_service.h" | |
| 31 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 33 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
| 32 #include "components/signin/core/browser/signin_error_controller.h" | 34 #include "components/signin/core/browser/signin_error_controller.h" |
| 33 #include "components/signin/core/browser/signin_oauth_helper.h" | 35 #include "components/signin/core/browser/signin_oauth_helper.h" |
| 34 #include "components/signin/core/common/profile_management_switches.h" | 36 #include "components/signin/core/common/profile_management_switches.h" |
| 35 #include "content/public/browser/storage_partition.h" | 37 #include "content/public/browser/storage_partition.h" |
| 36 #include "content/public/browser/web_ui.h" | 38 #include "content/public/browser/web_ui.h" |
| 37 #include "google_apis/gaia/gaia_auth_fetcher.h" | 39 #include "google_apis/gaia/gaia_auth_fetcher.h" |
| 38 #include "google_apis/gaia/gaia_auth_util.h" | 40 #include "google_apis/gaia/gaia_auth_util.h" |
| 39 #include "google_apis/gaia/gaia_constants.h" | 41 #include "google_apis/gaia/gaia_constants.h" |
| 40 #include "google_apis/gaia/gaia_urls.h" | 42 #include "google_apis/gaia/gaia_urls.h" |
| 41 #include "net/base/url_util.h" | 43 #include "net/base/url_util.h" |
| 42 | 44 |
| 43 namespace { | 45 namespace { |
| 44 | 46 |
| 45 class InlineSigninHelper : public SigninOAuthHelper::Consumer { | 47 class InlineSigninHelper : public SigninOAuthHelper::Consumer { |
| 46 public: | 48 public: |
| 47 InlineSigninHelper( | 49 InlineSigninHelper( |
| 48 base::WeakPtr<InlineLoginHandlerImpl> handler, | 50 base::WeakPtr<InlineLoginHandlerImpl> handler, |
| 49 net::URLRequestContextGetter* getter, | 51 net::URLRequestContextGetter* getter, |
| 50 Profile* profile, | 52 Profile* profile, |
| 51 const GURL& current_url, | 53 const GURL& current_url, |
| 52 const std::string& email, | 54 const std::string& email, |
| 55 const std::string& gaia_id, | |
| 53 const std::string& password, | 56 const std::string& password, |
| 54 const std::string& session_index, | 57 const std::string& session_index, |
| 55 const std::string& signin_scoped_device_id, | 58 const std::string& signin_scoped_device_id, |
| 56 bool choose_what_to_sync, | 59 bool choose_what_to_sync, |
| 57 bool confirm_untrusted_signin); | 60 bool confirm_untrusted_signin); |
| 58 | 61 |
| 59 private: | 62 private: |
| 60 // Overriden from SigninOAuthHelper::Consumer. | 63 // Overriden from SigninOAuthHelper::Consumer. |
| 61 virtual void OnSigninOAuthInformationAvailable( | 64 virtual void OnSigninOAuthInformationAvailable( |
| 62 const std::string& email, | 65 const std::string& email, |
| 63 const std::string& display_email, | 66 const std::string& display_email, |
| 64 const std::string& refresh_token) OVERRIDE; | 67 const std::string& refresh_token) OVERRIDE; |
| 65 virtual void OnSigninOAuthInformationFailure( | 68 virtual void OnSigninOAuthInformationFailure( |
| 66 const GoogleServiceAuthError& error) OVERRIDE; | 69 const GoogleServiceAuthError& error) OVERRIDE; |
| 67 | 70 |
| 68 SigninOAuthHelper signin_oauth_helper_; | 71 SigninOAuthHelper signin_oauth_helper_; |
| 69 base::WeakPtr<InlineLoginHandlerImpl> handler_; | 72 base::WeakPtr<InlineLoginHandlerImpl> handler_; |
| 70 Profile* profile_; | 73 Profile* profile_; |
| 71 GURL current_url_; | 74 GURL current_url_; |
| 72 std::string email_; | 75 std::string email_; |
| 76 std::string gaia_id_; | |
| 73 std::string password_; | 77 std::string password_; |
| 74 std::string session_index_; | 78 std::string session_index_; |
| 75 bool choose_what_to_sync_; | 79 bool choose_what_to_sync_; |
| 76 bool confirm_untrusted_signin_; | 80 bool confirm_untrusted_signin_; |
| 77 | 81 |
| 78 DISALLOW_COPY_AND_ASSIGN(InlineSigninHelper); | 82 DISALLOW_COPY_AND_ASSIGN(InlineSigninHelper); |
| 79 }; | 83 }; |
| 80 | 84 |
| 81 InlineSigninHelper::InlineSigninHelper( | 85 InlineSigninHelper::InlineSigninHelper( |
| 82 base::WeakPtr<InlineLoginHandlerImpl> handler, | 86 base::WeakPtr<InlineLoginHandlerImpl> handler, |
| 83 net::URLRequestContextGetter* getter, | 87 net::URLRequestContextGetter* getter, |
| 84 Profile* profile, | 88 Profile* profile, |
| 85 const GURL& current_url, | 89 const GURL& current_url, |
| 86 const std::string& email, | 90 const std::string& email, |
| 91 const std::string& gaia_id, | |
| 87 const std::string& password, | 92 const std::string& password, |
| 88 const std::string& session_index, | 93 const std::string& session_index, |
| 89 const std::string& signin_scoped_device_id, | 94 const std::string& signin_scoped_device_id, |
| 90 bool choose_what_to_sync, | 95 bool choose_what_to_sync, |
| 91 bool confirm_untrusted_signin) | 96 bool confirm_untrusted_signin) |
| 92 : signin_oauth_helper_(getter, session_index, signin_scoped_device_id, | 97 : signin_oauth_helper_(getter, session_index, signin_scoped_device_id, |
| 93 this), | 98 this), |
| 94 handler_(handler), | 99 handler_(handler), |
| 95 profile_(profile), | 100 profile_(profile), |
| 96 current_url_(current_url), | 101 current_url_(current_url), |
| 97 email_(email), | 102 email_(email), |
| 103 gaia_id_(gaia_id), | |
| 98 password_(password), | 104 password_(password), |
| 99 session_index_(session_index), | 105 session_index_(session_index), |
| 100 choose_what_to_sync_(choose_what_to_sync), | 106 choose_what_to_sync_(choose_what_to_sync), |
| 101 confirm_untrusted_signin_(confirm_untrusted_signin) { | 107 confirm_untrusted_signin_(confirm_untrusted_signin) { |
| 102 DCHECK(profile_); | 108 DCHECK(profile_); |
| 103 DCHECK(!email_.empty()); | 109 DCHECK(!email_.empty()); |
| 104 } | 110 } |
| 105 | 111 |
| 106 void InlineSigninHelper::OnSigninOAuthInformationAvailable( | 112 void InlineSigninHelper::OnSigninOAuthInformationAvailable( |
| 107 const std::string& email, | 113 const std::string& email, |
| 108 const std::string& display_email, | 114 const std::string& display_email, |
| 109 const std::string& refresh_token) { | 115 const std::string& refresh_token) { |
| 110 content::WebContents* contents = NULL; | 116 content::WebContents* contents = NULL; |
| 111 Browser* browser = NULL; | 117 Browser* browser = NULL; |
| 112 if (handler_) { | 118 if (handler_) { |
| 113 contents = handler_->web_ui()->GetWebContents(); | 119 contents = handler_->web_ui()->GetWebContents(); |
| 114 browser = handler_->GetDesktopBrowser(); | 120 browser = handler_->GetDesktopBrowser(); |
| 115 } | 121 } |
| 116 | 122 |
| 117 AboutSigninInternals* about_signin_internals = | 123 AboutSigninInternals* about_signin_internals = |
| 118 AboutSigninInternalsFactory::GetForProfile(profile_); | 124 AboutSigninInternalsFactory::GetForProfile(profile_); |
| 119 about_signin_internals->OnRefreshTokenReceived("Successful"); | 125 about_signin_internals->OnRefreshTokenReceived("Successful"); |
| 120 | 126 |
| 127 AccountTrackerService* account_tracker = | |
| 128 AccountTrackerServiceFactory::GetForProfile(profile_); | |
| 129 std::string account_id = | |
| 130 account_tracker->PickAccountIdForAccount(gaia_id_, email); | |
| 131 | |
| 132 // Prime the account tracker with this combination of gaia id/display email. | |
| 133 account_tracker->SeedAccountInfo(account_id, gaia_id_, email_); | |
|
guohui
2014/08/21 18:39:43
why do we use email_ here and email at line 130? A
Roger Tawa OOO till Jul 10th
2014/08/21 20:33:18
|email| and |email_| are not guaranteed to be the
| |
| 134 | |
| 121 signin::Source source = signin::GetSourceForPromoURL(current_url_); | 135 signin::Source source = signin::GetSourceForPromoURL(current_url_); |
| 122 if (source == signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT || | 136 if (source == signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT || |
| 123 source == signin::SOURCE_REAUTH) { | 137 source == signin::SOURCE_REAUTH) { |
| 124 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)-> | 138 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)-> |
| 125 UpdateCredentials(email, refresh_token); | 139 UpdateCredentials(account_id, refresh_token); |
| 126 | 140 |
| 127 if (signin::IsAutoCloseEnabledInURL(current_url_)) { | 141 if (signin::IsAutoCloseEnabledInURL(current_url_)) { |
| 128 // Close the gaia sign in tab via a task to make sure we aren't in the | 142 // Close the gaia sign in tab via a task to make sure we aren't in the |
| 129 // middle of any webui handler code. | 143 // middle of any webui handler code. |
| 130 base::MessageLoop::current()->PostTask( | 144 base::MessageLoop::current()->PostTask( |
| 131 FROM_HERE, | 145 FROM_HERE, |
| 132 base::Bind(&InlineLoginHandlerImpl::CloseTab, | 146 base::Bind(&InlineLoginHandlerImpl::CloseTab, |
| 133 handler_, | 147 handler_, |
| 134 signin::ShouldShowAccountManagement(current_url_))); | 148 signin::ShouldShowAccountManagement(current_url_))); |
| 135 } | 149 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 email, password_, refresh_token, | 192 email, password_, refresh_token, |
| 179 OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT, | 193 OneClickSigninHelper::AUTO_ACCEPT_EXPLICIT, |
| 180 source, start_mode, | 194 source, start_mode, |
| 181 base::Bind(&InlineLoginHandlerImpl::SyncStarterCallback, | 195 base::Bind(&InlineLoginHandlerImpl::SyncStarterCallback, |
| 182 handler_)); | 196 handler_)); |
| 183 if (start_signin) { | 197 if (start_signin) { |
| 184 // Call OneClickSigninSyncStarter to exchange oauth code for tokens. | 198 // Call OneClickSigninSyncStarter to exchange oauth code for tokens. |
| 185 // OneClickSigninSyncStarter will delete itself once the job is done. | 199 // OneClickSigninSyncStarter will delete itself once the job is done. |
| 186 new OneClickSigninSyncStarter( | 200 new OneClickSigninSyncStarter( |
| 187 profile_, browser, | 201 profile_, browser, |
| 188 email, password_, refresh_token, | 202 account_id, password_, refresh_token, |
| 189 start_mode, | 203 start_mode, |
| 190 contents, | 204 contents, |
| 191 confirmation_required, | 205 confirmation_required, |
| 192 signin::GetNextPageURLForPromoURL(current_url_), | 206 signin::GetNextPageURLForPromoURL(current_url_), |
| 193 base::Bind(&InlineLoginHandlerImpl::SyncStarterCallback, handler_)); | 207 base::Bind(&InlineLoginHandlerImpl::SyncStarterCallback, handler_)); |
| 194 } | 208 } |
| 195 } | 209 } |
| 196 | 210 |
| 197 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 211 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 198 } | 212 } |
| 199 | 213 |
| 200 void InlineSigninHelper::OnSigninOAuthInformationFailure( | 214 void InlineSigninHelper::OnSigninOAuthInformationFailure( |
| 201 const GoogleServiceAuthError& error) { | 215 const GoogleServiceAuthError& error) { |
| 202 if (handler_) | 216 if (handler_) |
| 203 handler_->HandleLoginError(error.ToString()); | 217 handler_->HandleLoginError(error.ToString()); |
| 204 | 218 |
| 205 AboutSigninInternals* about_signin_internals = | 219 AboutSigninInternals* about_signin_internals = |
| 206 AboutSigninInternalsFactory::GetForProfile(profile_); | 220 AboutSigninInternalsFactory::GetForProfile(profile_); |
| 207 about_signin_internals->OnRefreshTokenReceived("Failure"); | 221 about_signin_internals->OnRefreshTokenReceived("Failure"); |
| 208 | 222 |
| 209 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 223 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
| 210 } | 224 } |
| 211 | 225 |
| 212 } // namespace | 226 } // namespace |
| 213 | 227 |
| 214 InlineLoginHandlerImpl::InlineLoginHandlerImpl() | 228 InlineLoginHandlerImpl::InlineLoginHandlerImpl() |
| 215 : weak_factory_(this), | 229 : weak_factory_(this), confirm_untrusted_signin_(false) { |
| 216 confirm_untrusted_signin_(false) { | |
| 217 } | 230 } |
| 218 | 231 |
| 219 InlineLoginHandlerImpl::~InlineLoginHandlerImpl() {} | 232 InlineLoginHandlerImpl::~InlineLoginHandlerImpl() {} |
| 220 | 233 |
| 221 bool InlineLoginHandlerImpl::HandleContextMenu( | 234 bool InlineLoginHandlerImpl::HandleContextMenu( |
| 222 const content::ContextMenuParams& params) { | 235 const content::ContextMenuParams& params) { |
| 223 #ifndef NDEBUG | 236 #ifndef NDEBUG |
| 224 return false; | 237 return false; |
| 225 #else | 238 #else |
| 226 return true; | 239 return true; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 | 299 |
| 287 base::string16 email_string16; | 300 base::string16 email_string16; |
| 288 dict->GetString("email", &email_string16); | 301 dict->GetString("email", &email_string16); |
| 289 DCHECK(!email_string16.empty()); | 302 DCHECK(!email_string16.empty()); |
| 290 std::string email(base::UTF16ToASCII(email_string16)); | 303 std::string email(base::UTF16ToASCII(email_string16)); |
| 291 | 304 |
| 292 base::string16 password_string16; | 305 base::string16 password_string16; |
| 293 dict->GetString("password", &password_string16); | 306 dict->GetString("password", &password_string16); |
| 294 std::string password(base::UTF16ToASCII(password_string16)); | 307 std::string password(base::UTF16ToASCII(password_string16)); |
| 295 | 308 |
| 309 base::string16 gaia_id_string16; | |
| 310 dict->GetString("gaiaId", &gaia_id_string16); | |
| 311 DCHECK(!gaia_id_string16.empty()); | |
| 312 std::string gaia_id = base::UTF16ToASCII(gaia_id_string16); | |
| 313 | |
| 296 // When doing a SAML sign in, this email check may result in a false | 314 // When doing a SAML sign in, this email check may result in a false |
| 297 // positive. This happens when the user types one email address in the | 315 // positive. This happens when the user types one email address in the |
| 298 // gaia sign in page, but signs in to a different account in the SAML sign in | 316 // gaia sign in page, but signs in to a different account in the SAML sign in |
| 299 // page. | 317 // page. |
| 300 std::string default_email; | 318 std::string default_email; |
| 301 std::string validate_email; | 319 std::string validate_email; |
| 302 if (net::GetValueForKeyInQuery(current_url, "email", &default_email) && | 320 if (net::GetValueForKeyInQuery(current_url, "email", &default_email) && |
| 303 net::GetValueForKeyInQuery(current_url, "validateEmail", | 321 net::GetValueForKeyInQuery(current_url, "validateEmail", |
| 304 &validate_email) && | 322 &validate_email) && |
| 305 validate_email == "1") { | 323 validate_email == "1") { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 contents->GetBrowserContext(), | 382 contents->GetBrowserContext(), |
| 365 GURL(chrome::kChromeUIChromeSigninURL)); | 383 GURL(chrome::kChromeUIChromeSigninURL)); |
| 366 | 384 |
| 367 SigninClient* signin_client = | 385 SigninClient* signin_client = |
| 368 ChromeSigninClientFactory::GetForProfile(Profile::FromWebUI(web_ui())); | 386 ChromeSigninClientFactory::GetForProfile(Profile::FromWebUI(web_ui())); |
| 369 std::string signin_scoped_device_id = | 387 std::string signin_scoped_device_id = |
| 370 signin_client->GetSigninScopedDeviceId(); | 388 signin_client->GetSigninScopedDeviceId(); |
| 371 // InlineSigninHelper will delete itself. | 389 // InlineSigninHelper will delete itself. |
| 372 new InlineSigninHelper(GetWeakPtr(), partition->GetURLRequestContext(), | 390 new InlineSigninHelper(GetWeakPtr(), partition->GetURLRequestContext(), |
| 373 Profile::FromWebUI(web_ui()), current_url, | 391 Profile::FromWebUI(web_ui()), current_url, |
| 374 email, password, session_index, | 392 email, gaia_id, password, session_index, |
| 375 signin_scoped_device_id, choose_what_to_sync, | 393 signin_scoped_device_id, choose_what_to_sync, |
| 376 confirm_untrusted_signin_); | 394 confirm_untrusted_signin_); |
| 377 | 395 |
| 378 web_ui()->CallJavascriptFunction("inline.login.closeDialog"); | 396 web_ui()->CallJavascriptFunction("inline.login.closeDialog"); |
| 379 } | 397 } |
| 380 | 398 |
| 381 void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg) { | 399 void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg) { |
| 382 SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); | 400 SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); |
| 383 | 401 |
| 384 Browser* browser = GetDesktopBrowser(); | 402 Browser* browser = GetDesktopBrowser(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 } | 457 } |
| 440 } | 458 } |
| 441 | 459 |
| 442 if (show_account_management) { | 460 if (show_account_management) { |
| 443 browser->window()->ShowAvatarBubbleFromAvatarButton( | 461 browser->window()->ShowAvatarBubbleFromAvatarButton( |
| 444 BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, | 462 BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT, |
| 445 signin::ManageAccountsParams()); | 463 signin::ManageAccountsParams()); |
| 446 } | 464 } |
| 447 } | 465 } |
| 448 } | 466 } |
| OLD | NEW |