| Index: chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
|
| diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
|
| index 037cbde695a0790c8a4f879e847961cd012ce724..38b928e2caa4931567509f3fefaacf680b849eaf 100644
|
| --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
|
| +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
|
| @@ -23,6 +23,7 @@
|
| #include "chrome/browser/ui/sync/one_click_signin_helper.h"
|
| #include "chrome/browser/ui/sync/one_click_signin_histogram.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/browser/ui/webui/signin/inline_login_ui.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "components/signin/core/browser/about_signin_internals.h"
|
| #include "components/signin/core/browser/profile_oauth2_token_service.h"
|
| @@ -50,7 +51,8 @@ class InlineSigninHelper : public SigninOAuthHelper::Consumer {
|
| const std::string& password,
|
| const std::string& session_index,
|
| const std::string& signin_scoped_device_id,
|
| - bool choose_what_to_sync);
|
| + bool choose_what_to_sync,
|
| + bool confirm_untrusted_signin);
|
|
|
| private:
|
| // Overriden from SigninOAuthHelper::Consumer.
|
| @@ -69,6 +71,7 @@ class InlineSigninHelper : public SigninOAuthHelper::Consumer {
|
| std::string password_;
|
| std::string session_index_;
|
| bool choose_what_to_sync_;
|
| + bool confirm_untrusted_signin_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InlineSigninHelper);
|
| };
|
| @@ -82,7 +85,8 @@ InlineSigninHelper::InlineSigninHelper(
|
| const std::string& password,
|
| const std::string& session_index,
|
| const std::string& signin_scoped_device_id,
|
| - bool choose_what_to_sync)
|
| + bool choose_what_to_sync,
|
| + bool confirm_untrusted_signin)
|
| : signin_oauth_helper_(getter, session_index, signin_scoped_device_id,
|
| this),
|
| handler_(handler),
|
| @@ -90,7 +94,9 @@ InlineSigninHelper::InlineSigninHelper(
|
| current_url_(current_url),
|
| email_(email),
|
| password_(password),
|
| - choose_what_to_sync_(choose_what_to_sync) {
|
| + session_index_(session_index),
|
| + choose_what_to_sync_(choose_what_to_sync),
|
| + confirm_untrusted_signin_(confirm_untrusted_signin) {
|
| DCHECK(profile_);
|
| DCHECK(!email_.empty());
|
| }
|
| @@ -152,13 +158,20 @@ void InlineSigninHelper::OnSigninOAuthInformationAvailable(
|
| OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS;
|
| }
|
|
|
| - OneClickSigninSyncStarter::ConfirmationRequired confirmation_required =
|
| - source == signin::SOURCE_SETTINGS ||
|
| - source == signin::SOURCE_WEBSTORE_INSTALL ||
|
| - choose_what_to_sync_ ||
|
| - show_inline_confirmation_for_sync ?
|
| - OneClickSigninSyncStarter::NO_CONFIRMATION :
|
| - OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN;
|
| + OneClickSigninSyncStarter::ConfirmationRequired confirmation_required;
|
| + if (confirm_untrusted_signin_) {
|
| + confirmation_required =
|
| + OneClickSigninSyncStarter::CONFIRM_UNTRUSTED_SIGNIN;
|
| + } else {
|
| + confirmation_required =
|
| + source == signin::SOURCE_SETTINGS ||
|
| + source == signin::SOURCE_WEBSTORE_INSTALL ||
|
| + choose_what_to_sync_ ||
|
| + show_inline_confirmation_for_sync ?
|
| + OneClickSigninSyncStarter::NO_CONFIRMATION :
|
| + OneClickSigninSyncStarter::CONFIRM_AFTER_SIGNIN;
|
| + }
|
| +
|
| bool start_signin =
|
| !OneClickSigninHelper::HandleCrossAccountError(
|
| profile_, "",
|
| @@ -200,7 +213,7 @@ void InlineSigninHelper::OnSigninOAuthInformationFailure(
|
|
|
| InlineLoginHandlerImpl::InlineLoginHandlerImpl()
|
| : weak_factory_(this),
|
| - choose_what_to_sync_(false) {
|
| + confirm_untrusted_signin_(false) {
|
| }
|
|
|
| InlineLoginHandlerImpl::~InlineLoginHandlerImpl() {}
|
| @@ -214,6 +227,31 @@ bool InlineLoginHandlerImpl::HandleContextMenu(
|
| #endif
|
| }
|
|
|
| +void InlineLoginHandlerImpl::DidCommitProvisionalLoadForFrame(
|
| + content::RenderFrameHost* render_frame_host,
|
| + const GURL& url,
|
| + content::PageTransition transition_type) {
|
| + if (!web_contents())
|
| + return;
|
| +
|
| + // Returns early if this is not a gaia iframe navigation.
|
| + const GURL kGaiaExtOrigin(
|
| + "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/");
|
| + content::RenderFrameHost* gaia_iframe = InlineLoginUI::GetAuthIframe(
|
| + web_contents(), kGaiaExtOrigin, "signin-frame");
|
| + if (render_frame_host != gaia_iframe)
|
| + return;
|
| +
|
| + // Loading any untrusted (e.g., HTTP) URLs in the privileged sign-in process
|
| + // will require confirmation before the sign in takes effect.
|
| + if (!url.is_empty() &&
|
| + url.spec() != url::kAboutBlankURL &&
|
| + !gaia::IsGaiaSignonRealm(url.GetOrigin()) &&
|
| + !signin::IsContinueUrlForWebBasedSigninFlow(url)) {
|
| + confirm_untrusted_signin_ = true;
|
| + }
|
| +}
|
| +
|
| void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) {
|
| params.SetString("service", "chromiumsync");
|
|
|
| @@ -224,6 +262,8 @@ void InlineLoginHandlerImpl::SetExtraInitParams(base::DictionaryValue& params) {
|
| if (is_constrained == "1")
|
| contents->SetDelegate(this);
|
|
|
| + content::WebContentsObserver::Observe(contents);
|
| +
|
| signin::Source source = signin::GetSourceForPromoURL(current_url);
|
| OneClickSigninHelper::LogHistogramValue(
|
| source, one_click_signin::HISTOGRAM_SHOWN);
|
| @@ -244,13 +284,14 @@ void InlineLoginHandlerImpl::CompleteLogin(const base::ListValue* args) {
|
| return;
|
| }
|
|
|
| - base::string16 email;
|
| - dict->GetString("email", &email);
|
| - DCHECK(!email.empty());
|
| - email_ = base::UTF16ToASCII(email);
|
| - base::string16 password;
|
| - dict->GetString("password", &password);
|
| - password_ = base::UTF16ToASCII(password);
|
| + base::string16 email_string16;
|
| + dict->GetString("email", &email_string16);
|
| + DCHECK(!email_string16.empty());
|
| + std::string email(base::UTF16ToASCII(email_string16));
|
| +
|
| + base::string16 password_string16;
|
| + dict->GetString("password", &password_string16);
|
| + std::string password(base::UTF16ToASCII(password_string16));
|
|
|
| // When doing a SAML sign in, this email check may result in a false
|
| // positive. This happens when the user types one email address in the
|
| @@ -262,23 +303,25 @@ void InlineLoginHandlerImpl::CompleteLogin(const base::ListValue* args) {
|
| net::GetValueForKeyInQuery(current_url, "validateEmail",
|
| &validate_email) &&
|
| validate_email == "1") {
|
| - if (!gaia::AreEmailsSame(email_, default_email)) {
|
| + if (!gaia::AreEmailsSame(email, default_email)) {
|
| SyncStarterCallback(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE);
|
| return;
|
| }
|
| }
|
|
|
| - base::string16 session_index;
|
| - dict->GetString("sessionIndex", &session_index);
|
| - session_index_ = base::UTF16ToASCII(session_index);
|
| - DCHECK(!session_index_.empty());
|
| - dict->GetBoolean("chooseWhatToSync", &choose_what_to_sync_);
|
| + base::string16 session_index_string16;
|
| + dict->GetString("sessionIndex", &session_index_string16);
|
| + std::string session_index = base::UTF16ToASCII(session_index_string16);
|
| + DCHECK(!session_index.empty());
|
| +
|
| + bool choose_what_to_sync = false;
|
| + dict->GetBoolean("chooseWhatToSync", &choose_what_to_sync);
|
|
|
| signin::Source source = signin::GetSourceForPromoURL(current_url);
|
| OneClickSigninHelper::LogHistogramValue(
|
| source, one_click_signin::HISTOGRAM_ACCEPTED);
|
| bool switch_to_advanced =
|
| - choose_what_to_sync_ && (source != signin::SOURCE_SETTINGS);
|
| + choose_what_to_sync && (source != signin::SOURCE_SETTINGS);
|
| OneClickSigninHelper::LogHistogramValue(
|
| source,
|
| switch_to_advanced ? one_click_signin::HISTOGRAM_WITH_ADVANCED :
|
| @@ -305,7 +348,7 @@ void InlineLoginHandlerImpl::CompleteLogin(const base::ListValue* args) {
|
|
|
| std::string error_msg;
|
| bool can_offer = OneClickSigninHelper::CanOffer(
|
| - contents, can_offer_for, email_, &error_msg);
|
| + contents, can_offer_for, email, &error_msg);
|
| if (!can_offer) {
|
| HandleLoginError(error_msg);
|
| return;
|
| @@ -328,12 +371,10 @@ void InlineLoginHandlerImpl::CompleteLogin(const base::ListValue* args) {
|
| // InlineSigninHelper will delete itself.
|
| new InlineSigninHelper(GetWeakPtr(), partition->GetURLRequestContext(),
|
| Profile::FromWebUI(web_ui()), current_url,
|
| - email_, password_, session_index_,
|
| - signin_scoped_device_id, choose_what_to_sync_);
|
| + email, password, session_index,
|
| + signin_scoped_device_id, choose_what_to_sync,
|
| + confirm_untrusted_signin_);
|
|
|
| - email_.clear();
|
| - password_.clear();
|
| - session_index_.clear();
|
| web_ui()->CallJavascriptFunction("inline.login.closeDialog");
|
| }
|
|
|
| @@ -346,10 +387,6 @@ void InlineLoginHandlerImpl::HandleLoginError(const std::string& error_msg) {
|
| << error_msg;
|
| OneClickSigninHelper::ShowSigninErrorBubble(browser, error_msg);
|
| }
|
| -
|
| - email_.clear();
|
| - password_.clear();
|
| - session_index_.clear();
|
| }
|
|
|
| Browser* InlineLoginHandlerImpl::GetDesktopBrowser() {
|
|
|