Commit 8d2266c6 authored by pavely@chromium.org's avatar pavely@chromium.org

Revert 275549 "Revert 275154 "ChromeOS login webui refactoring :..."

Tree doesn't compile, returning to original state.
> Revert 275154 "ChromeOS login webui refactoring : Move GAIA-rela..."
> 
> This change preventing me from reverting r275046 which seems to be causing
> failures in KioskTest
> http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20%28dbg%29%283%29/builds/35748
> 
> > ChromeOS login webui refactoring : Move GAIA-related code to gaia_screen_handler
> > 
> > BUG=373314
> > R=nkostylev@chromium.org
> > 
> > Review URL: https://codereview.chromium.org/304303005
> 
> TBR=antrim@chromium.org
> 
> Review URL: https://codereview.chromium.org/310313006

TBR=pavely@chromium.org

Review URL: https://codereview.chromium.org/321633002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275556 0039d316-1c4b-4281-b951-d872f2087c98
parent 9c486559
...@@ -5,20 +5,31 @@ ...@@ -5,20 +5,31 @@
#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
#include "chrome/browser/chromeos/login/users/user_manager.h" #include "chrome/browser/chromeos/login/users/user_manager.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/io_thread.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chromeos/chromeos_switches.h" #include "chromeos/chromeos_switches.h"
#include "chromeos/settings/cros_settings_names.h" #include "chromeos/settings/cros_settings_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "google_apis/gaia/gaia_switches.h" #include "google_apis/gaia/gaia_switches.h"
#include "google_apis/gaia/gaia_urls.h" #include "google_apis/gaia/gaia_urls.h"
#include "grit/chromium_strings.h" #include "grit/chromium_strings.h"
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
using content::BrowserThread;
namespace chromeos { namespace chromeos {
namespace { namespace {
...@@ -69,6 +80,20 @@ void UpdateAuthParams(base::DictionaryValue* params, bool has_users) { ...@@ -69,6 +80,20 @@ void UpdateAuthParams(base::DictionaryValue* params, bool has_users) {
} }
} }
void RecordSAMLScrapingVerificationResultInHistogram(bool success) {
UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.Scraping.VerificationResult", success);
}
// The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO
// thread.
void ClearDnsCache(IOThread* io_thread) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (browser_shutdown::IsTryingToQuit())
return;
io_thread->ClearHostCache();
}
} // namespace } // namespace
GaiaContext::GaiaContext() GaiaContext::GaiaContext()
...@@ -85,15 +110,22 @@ GaiaScreenHandler::GaiaScreenHandler( ...@@ -85,15 +110,22 @@ GaiaScreenHandler::GaiaScreenHandler(
frame_state_(FRAME_STATE_UNKNOWN), frame_state_(FRAME_STATE_UNKNOWN),
frame_error_(net::OK), frame_error_(net::OK),
network_state_informer_(network_state_informer), network_state_informer_(network_state_informer),
signin_screen_handler_(NULL) { dns_cleared_(false),
dns_clear_task_running_(false),
cookies_cleared_(false),
focus_stolen_(false),
gaia_silent_load_(false),
using_saml_api_(false),
test_expects_complete_login_(false),
signin_screen_handler_(NULL),
weak_factory_(this) {
DCHECK(network_state_informer_.get()); DCHECK(network_state_informer_.get());
} }
GaiaScreenHandler::~GaiaScreenHandler() {} GaiaScreenHandler::~GaiaScreenHandler() {
}
void GaiaScreenHandler::LoadGaia(const GaiaContext& context) { void GaiaScreenHandler::LoadGaia(const GaiaContext& context) {
LOG(WARNING) << "LoadGaia() call.";
base::DictionaryValue params; base::DictionaryValue params;
params.SetBoolean("forceReload", context.force_reload); params.SetBoolean("forceReload", context.force_reload);
...@@ -177,7 +209,7 @@ void GaiaScreenHandler::DeclareLocalizedValues( ...@@ -177,7 +209,7 @@ void GaiaScreenHandler::DeclareLocalizedValues(
builder->Add("createManagedUserFeatureName", builder->Add("createManagedUserFeatureName",
IDS_CREATE_LOCALLY_MANAGED_USER_FEATURE_NAME); IDS_CREATE_LOCALLY_MANAGED_USER_FEATURE_NAME);
// Strings used by the fatal error dialog. // Strings used by the SAML fatal error dialog.
builder->Add("fatalErrorMessageNoEmail", IDS_LOGIN_FATAL_ERROR_NO_EMAIL); builder->Add("fatalErrorMessageNoEmail", IDS_LOGIN_FATAL_ERROR_NO_EMAIL);
builder->Add("fatalErrorMessageNoPassword", builder->Add("fatalErrorMessageNoPassword",
IDS_LOGIN_FATAL_ERROR_NO_PASSWORD); IDS_LOGIN_FATAL_ERROR_NO_PASSWORD);
...@@ -189,11 +221,21 @@ void GaiaScreenHandler::DeclareLocalizedValues( ...@@ -189,11 +221,21 @@ void GaiaScreenHandler::DeclareLocalizedValues(
builder->Add("fatalErrorDismissButton", IDS_OK); builder->Add("fatalErrorDismissButton", IDS_OK);
} }
void GaiaScreenHandler::Initialize() {} void GaiaScreenHandler::Initialize() {
}
void GaiaScreenHandler::RegisterMessages() { void GaiaScreenHandler::RegisterMessages() {
AddCallback("frameLoadingCompleted", AddCallback("frameLoadingCompleted",
&GaiaScreenHandler::HandleFrameLoadingCompleted); &GaiaScreenHandler::HandleFrameLoadingCompleted);
AddCallback("completeLogin", &GaiaScreenHandler::HandleCompleteLogin);
AddCallback("completeAuthentication",
&GaiaScreenHandler::HandleCompleteAuthentication);
AddCallback("usingSAMLAPI", &GaiaScreenHandler::HandleUsingSAMLAPI);
AddCallback("scrapedPasswordCount",
&GaiaScreenHandler::HandleScrapedPasswordCount);
AddCallback("scrapedPasswordVerificationFailed",
&GaiaScreenHandler::HandleScrapedPasswordVerificationFailed);
AddCallback("loginWebuiReady", &GaiaScreenHandler::HandleGaiaUIReady);
} }
void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) { void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) {
...@@ -219,13 +261,289 @@ void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) { ...@@ -219,13 +261,289 @@ void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) {
UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR); UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
} }
void GaiaScreenHandler::HandleCompleteAuthentication(
const std::string& email,
const std::string& password,
const std::string& auth_code) {
if (!Delegate())
return;
Delegate()->SetDisplayEmail(gaia::SanitizeEmail(email));
UserContext user_context(email);
user_context.SetKey(Key(password));
user_context.SetAuthCode(auth_code);
Delegate()->CompleteLogin(user_context);
}
void GaiaScreenHandler::HandleCompleteLogin(const std::string& typed_email,
const std::string& password,
bool using_saml) {
if (!Delegate())
return;
if (using_saml && !using_saml_api_)
RecordSAMLScrapingVerificationResultInHistogram(true);
const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
Delegate()->SetDisplayEmail(sanitized_email);
UserContext user_context(sanitized_email);
user_context.SetKey(Key(password));
user_context.SetAuthFlow(using_saml
? UserContext::AUTH_FLOW_GAIA_WITH_SAML
: UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML);
Delegate()->CompleteLogin(user_context);
if (test_expects_complete_login_) {
VLOG(2) << "Complete test login for " << typed_email
<< ", requested=" << test_user_;
test_expects_complete_login_ = false;
test_user_.clear();
test_pass_.clear();
}
}
void GaiaScreenHandler::HandleUsingSAMLAPI() {
SetSAMLPrincipalsAPIUsed(true);
}
void GaiaScreenHandler::HandleScrapedPasswordCount(int password_count) {
SetSAMLPrincipalsAPIUsed(false);
// Use a histogram that has 11 buckets, one for each of the values in [0, 9]
// and an overflow bucket at the end.
UMA_HISTOGRAM_ENUMERATION(
"ChromeOS.SAML.Scraping.PasswordCount", std::min(password_count, 10), 11);
if (password_count == 0)
HandleScrapedPasswordVerificationFailed();
}
void GaiaScreenHandler::HandleScrapedPasswordVerificationFailed() {
RecordSAMLScrapingVerificationResultInHistogram(false);
}
void GaiaScreenHandler::HandleGaiaUIReady() {
if (focus_stolen_) {
// Set focus to the Gaia page.
// TODO(altimofeev): temporary solution, until focus parameters are
// implemented on the Gaia side.
// Do this only once. Any subsequent call would relod GAIA frame.
focus_stolen_ = false;
const char code[] =
"if (typeof gWindowOnLoad != 'undefined') gWindowOnLoad();";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
}
if (gaia_silent_load_) {
focus_stolen_ = true;
// Prevent focus stealing by the Gaia page.
// TODO(altimofeev): temporary solution, until focus parameters are
// implemented on the Gaia side.
const char code[] =
"var gWindowOnLoad = window.onload; "
"window.onload=function() {};";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
// As we could miss and window.onload could already be called, restore
// focus to current pod (see crbug/175243).
DCHECK(signin_screen_handler_);
signin_screen_handler_->RefocusCurrentPod();
}
HandleFrameLoadingCompleted(0);
if (test_expects_complete_login_)
SubmitLoginFormForTest();
}
void GaiaScreenHandler::PopulateEmail(const std::string& user_id) {
populated_email_ = user_id;
}
void GaiaScreenHandler::PasswordChangedFor(const std::string& user_id) {
password_changed_for_.insert(user_id);
}
void GaiaScreenHandler::StartClearingDnsCache() {
if (dns_clear_task_running_ || !g_browser_process->io_thread())
return;
dns_cleared_ = false;
BrowserThread::PostTaskAndReply(
BrowserThread::IO,
FROM_HERE,
base::Bind(&ClearDnsCache, g_browser_process->io_thread()),
base::Bind(&GaiaScreenHandler::OnDnsCleared, weak_factory_.GetWeakPtr()));
dns_clear_task_running_ = true;
}
void GaiaScreenHandler::OnDnsCleared() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
dns_clear_task_running_ = false;
dns_cleared_ = true;
ShowGaiaScreenIfReady();
}
void GaiaScreenHandler::StartClearingCookies(
const base::Closure& on_clear_callback) {
cookies_cleared_ = false;
ProfileHelper* profile_helper =
g_browser_process->platform_part()->profile_helper();
LOG_ASSERT(Profile::FromWebUI(web_ui()) ==
profile_helper->GetSigninProfile());
profile_helper->ClearSigninProfile(
base::Bind(&GaiaScreenHandler::OnCookiesCleared,
weak_factory_.GetWeakPtr(),
on_clear_callback));
}
void GaiaScreenHandler::OnCookiesCleared(
const base::Closure& on_clear_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
cookies_cleared_ = true;
on_clear_callback.Run();
}
void GaiaScreenHandler::ShowSigninScreenForCreds(const std::string& username,
const std::string& password) {
VLOG(2) << "ShowSigninScreenForCreds for user " << username
<< ", frame_state=" << FrameState();
test_user_ = username;
test_pass_ = password;
test_expects_complete_login_ = true;
// Submit login form for test if gaia is ready. If gaia is loading, login
// will be attempted in HandleLoginWebuiReady after gaia is ready. Otherwise,
// reload gaia then follow the loading case.
if (FrameState() == GaiaScreenHandler::FRAME_STATE_LOADED)
SubmitLoginFormForTest();
else if (FrameState() != GaiaScreenHandler::FRAME_STATE_LOADING) {
DCHECK(signin_screen_handler_);
signin_screen_handler_->OnShowAddUser();
}
}
void GaiaScreenHandler::SubmitLoginFormForTest() {
VLOG(2) << "Submit login form for test, user=" << test_user_;
std::string code;
code += "document.getElementById('Email').value = '" + test_user_ + "';";
code += "document.getElementById('Passwd').value = '" + test_pass_ + "';";
code += "document.getElementById('signIn').click();";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
// Test properties are cleared in HandleCompleteLogin because the form
// submission might fail and login will not be attempted after reloading
// if they are cleared here.
}
void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool api_used) {
using_saml_api_ = api_used;
UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used);
}
void GaiaScreenHandler::ShowGaia() {
if (gaia_silent_load_ && populated_email_.empty()) {
dns_cleared_ = true;
cookies_cleared_ = true;
ShowGaiaScreenIfReady();
} else {
StartClearingDnsCache();
StartClearingCookies(base::Bind(&GaiaScreenHandler::ShowGaiaScreenIfReady,
weak_factory_.GetWeakPtr()));
}
}
void GaiaScreenHandler::ShowGaiaScreenIfReady() {
if (!dns_cleared_ || !cookies_cleared_ || !Delegate())
return;
std::string active_network_path = network_state_informer_->network_path();
if (gaia_silent_load_ &&
(network_state_informer_->state() != NetworkStateInformer::ONLINE ||
gaia_silent_load_network_ != active_network_path)) {
// Network has changed. Force Gaia reload.
gaia_silent_load_ = false;
// Gaia page will be realoded, so focus isn't stolen anymore.
focus_stolen_ = false;
}
// Note that LoadAuthExtension clears |populated_email_|.
if (populated_email_.empty())
Delegate()->LoadSigninWallpaper();
else
Delegate()->LoadWallpaper(populated_email_);
// Set Least Recently Used input method for the user.
if (!populated_email_.empty())
signin_screen_handler_->SetUserInputMethod(populated_email_);
LoadAuthExtension(!gaia_silent_load_, false, false);
signin_screen_handler_->UpdateUIState(
SigninScreenHandler::UI_STATE_GAIA_SIGNIN, NULL);
if (gaia_silent_load_) {
// The variable is assigned to false because silently loaded Gaia page was
// used.
gaia_silent_load_ = false;
if (focus_stolen_)
HandleGaiaUIReady();
}
signin_screen_handler_->UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
}
void GaiaScreenHandler::MaybePreloadAuthExtension() {
LOG(WARNING) << "MaybePreloadAuthExtension() call.";
// If cookies clearing was initiated or |dns_clear_task_running_| then auth
// extension showing has already been initiated and preloading is senseless.
if (signin_screen_handler_->ShouldLoadGaia() &&
!gaia_silent_load_ &&
!cookies_cleared_ &&
!dns_clear_task_running_ &&
network_state_informer_->state() == NetworkStateInformer::ONLINE) {
gaia_silent_load_ = true;
gaia_silent_load_network_ = network_state_informer_->network_path();
LoadAuthExtension(true, true, false);
}
}
void GaiaScreenHandler::LoadAuthExtension(bool force,
bool silent_load,
bool offline) {
GaiaContext context;
context.force_reload = force;
context.is_local = offline;
context.password_changed = !populated_email_.empty() &&
password_changed_for_.count(populated_email_);
context.use_offline = offline;
context.email = populated_email_;
if (Delegate()) {
context.show_users = Delegate()->IsShowUsers();
context.has_users = !Delegate()->GetUsers().empty();
}
populated_email_.clear();
LoadGaia(context);
}
void GaiaScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { void GaiaScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
if (signin_screen_handler_) if (signin_screen_handler_)
signin_screen_handler_->UpdateState(reason); signin_screen_handler_->UpdateState(reason);
} }
SigninScreenHandlerDelegate* GaiaScreenHandler::Delegate() {
DCHECK(signin_screen_handler_);
return signin_screen_handler_->delegate_;
}
void GaiaScreenHandler::SetSigninScreenHandler(SigninScreenHandler* handler) { void GaiaScreenHandler::SetSigninScreenHandler(SigninScreenHandler* handler) {
signin_screen_handler_ = handler; signin_screen_handler_ = handler;
} }
} // namespace chromeos } // namespace chromeos
...@@ -75,6 +75,58 @@ class GaiaScreenHandler : public BaseScreenHandler { ...@@ -75,6 +75,58 @@ class GaiaScreenHandler : public BaseScreenHandler {
// WebUI message handlers. // WebUI message handlers.
void HandleFrameLoadingCompleted(int status); void HandleFrameLoadingCompleted(int status);
void HandleCompleteAuthentication(const std::string& email,
const std::string& password,
const std::string& auth_code);
void HandleCompleteLogin(const std::string& typed_email,
const std::string& password,
bool using_saml);
void HandleUsingSAMLAPI();
void HandleScrapedPasswordCount(int password_count);
void HandleScrapedPasswordVerificationFailed();
void HandleGaiaUIReady();
// Fill GAIA user name.
void PopulateEmail(const std::string& user_id);
// Mark user as having password changed:
void PasswordChangedFor(const std::string& user_id);
// Kick off cookie / local storage cleanup.
void StartClearingCookies(const base::Closure& on_clear_callback);
void OnCookiesCleared(const base::Closure& on_clear_callback);
// Kick off DNS cache flushing.
void StartClearingDnsCache();
void OnDnsCleared();
// Show sign-in screen for the given credentials.
virtual void ShowSigninScreenForCreds(const std::string& username,
const std::string& password);
// Attempts login for test.
void SubmitLoginFormForTest();
// Updates the member variable and UMA histogram indicating whether the
// principals API was used during SAML login.
void SetSAMLPrincipalsAPIUsed(bool api_used);
void ShowGaia();
// Shows signin screen after dns cache and cookie cleanup operations finish.
void ShowGaiaScreenIfReady();
// Decides whether an auth extension should be pre-loaded. If it should,
// pre-loads it.
void MaybePreloadAuthExtension();
// Tells webui to load authentication extension. |force| is used to force the
// extension reloading, if it has already been loaded. |silent_load| is true
// for cases when extension should be loaded in the background and it
// shouldn't grab the focus. |offline| is true when offline version of the
// extension should be used.
void LoadAuthExtension(bool force, bool silent_load, bool offline);
// TODO (ygorshenin@): GaiaScreenHandler should implement // TODO (ygorshenin@): GaiaScreenHandler should implement
// NetworkStateInformer::Observer. // NetworkStateInformer::Observer.
...@@ -83,6 +135,8 @@ class GaiaScreenHandler : public BaseScreenHandler { ...@@ -83,6 +135,8 @@ class GaiaScreenHandler : public BaseScreenHandler {
// TODO (ygorshenin@): remove this dependency. // TODO (ygorshenin@): remove this dependency.
void SetSigninScreenHandler(SigninScreenHandler* handler); void SetSigninScreenHandler(SigninScreenHandler* handler);
SigninScreenHandlerDelegate* Delegate();
// Current state of Gaia frame. // Current state of Gaia frame.
FrameState frame_state_; FrameState frame_state_;
...@@ -92,12 +146,47 @@ class GaiaScreenHandler : public BaseScreenHandler { ...@@ -92,12 +146,47 @@ class GaiaScreenHandler : public BaseScreenHandler {
// Network state informer used to keep signin screen up. // Network state informer used to keep signin screen up.
scoped_refptr<NetworkStateInformer> network_state_informer_; scoped_refptr<NetworkStateInformer> network_state_informer_;
// Email to pre-populate with.
std::string populated_email_;
// Emails of the users, whose passwords have recently been changed.
std::set<std::string> password_changed_for_;
// True if dns cache cleanup is done.
bool dns_cleared_;
// True if DNS cache task is already running.
bool dns_clear_task_running_;
// True if cookie jar cleanup is done.
bool cookies_cleared_;
// Is focus still stolen from Gaia page?
bool focus_stolen_;
// Has Gaia page silent load been started for the current sign-in attempt?
bool gaia_silent_load_;
// The active network at the moment when Gaia page was preloaded.
std::string gaia_silent_load_network_;
// If the user authenticated via SAML, this indicates whether the principals
// API was used.
bool using_saml_api_;
// Test credentials.
std::string test_user_;
std::string test_pass_;
bool test_expects_complete_login_;
// Non-owning ptr to SigninScreenHandler instance. Should not be used // Non-owning ptr to SigninScreenHandler instance. Should not be used
// in dtor. // in dtor.
// TODO (ygorshenin@): GaiaScreenHandler shouldn't communicate with // TODO (ygorshenin@): GaiaScreenHandler shouldn't communicate with
// signin_screen_handler directly. // signin_screen_handler directly.
SigninScreenHandler* signin_screen_handler_; SigninScreenHandler* signin_screen_handler_;
base::WeakPtrFactory<GaiaScreenHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(GaiaScreenHandler); DISALLOW_COPY_AND_ASSIGN(GaiaScreenHandler);
}; };
......
...@@ -63,7 +63,6 @@ ...@@ -63,7 +63,6 @@
#include "chromeos/ime/input_method_manager.h" #include "chromeos/ime/input_method_manager.h"
#include "chromeos/network/network_state.h" #include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_handler.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_auth_util.h"
...@@ -96,16 +95,6 @@ const int kConnectingTimeoutSec = 60; ...@@ -96,16 +95,6 @@ const int kConnectingTimeoutSec = 60;
const char kSourceGaiaSignin[] = "gaia-signin"; const char kSourceGaiaSignin[] = "gaia-signin";
const char kSourceAccountPicker[] = "account-picker"; const char kSourceAccountPicker[] = "account-picker";
// The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO
// thread.
void ClearDnsCache(IOThread* io_thread) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (browser_shutdown::IsTryingToQuit())
return;
io_thread->ClearHostCache();
}
static bool Contains(const std::vector<std::string>& container, static bool Contains(const std::vector<std::string>& container,
const std::string& value) { const std::string& value) {
return std::find(container.begin(), container.end(), value) != return std::find(container.begin(), container.end(), value) !=
...@@ -216,10 +205,6 @@ static bool SetUserInputMethodImpl( ...@@ -216,10 +205,6 @@ static bool SetUserInputMethodImpl(
return true; return true;
} }
void RecordSAMLScrapingVerificationResultInHistogram(bool success) {
UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.Scraping.VerificationResult", success);
}
} // namespace } // namespace
// LoginScreenContext implementation ------------------------------------------ // LoginScreenContext implementation ------------------------------------------
...@@ -254,16 +239,8 @@ SigninScreenHandler::SigninScreenHandler( ...@@ -254,16 +239,8 @@ SigninScreenHandler::SigninScreenHandler(
native_window_delegate_(NULL), native_window_delegate_(NULL),
show_on_init_(false), show_on_init_(false),
oobe_ui_(false), oobe_ui_(false),
focus_stolen_(false),
gaia_silent_load_(false),
is_account_picker_showing_first_time_(false), is_account_picker_showing_first_time_(false),
dns_cleared_(false),
dns_clear_task_running_(false),
cookies_cleared_(false),
network_state_informer_(network_state_informer), network_state_informer_(network_state_informer),
using_saml_api_(false),
test_expects_complete_login_(false),
weak_factory_(this),
webui_visible_(false), webui_visible_(false),
preferences_changed_delayed_(false), preferences_changed_delayed_(false),
error_screen_actor_(error_screen_actor), error_screen_actor_(error_screen_actor),
...@@ -275,7 +252,8 @@ SigninScreenHandler::SigninScreenHandler( ...@@ -275,7 +252,8 @@ SigninScreenHandler::SigninScreenHandler(
caps_lock_enabled_(chromeos::input_method::InputMethodManager::Get() caps_lock_enabled_(chromeos::input_method::InputMethodManager::Get()
->GetImeKeyboard() ->GetImeKeyboard()
->CapsLockIsEnabled()), ->CapsLockIsEnabled()),
gaia_screen_handler_(gaia_screen_handler) { gaia_screen_handler_(gaia_screen_handler),
weak_factory_(this) {
DCHECK(network_state_informer_.get()); DCHECK(network_state_informer_.get());
DCHECK(error_screen_actor_); DCHECK(error_screen_actor_);
DCHECK(core_oobe_actor_); DCHECK(core_oobe_actor_);
...@@ -426,10 +404,7 @@ void SigninScreenHandler::Show(const LoginScreenContext& context) { ...@@ -426,10 +404,7 @@ void SigninScreenHandler::Show(const LoginScreenContext& context) {
// Just initialize internal fields from context and call ShowImpl(). // Just initialize internal fields from context and call ShowImpl().
oobe_ui_ = context.oobe_ui(); oobe_ui_ = context.oobe_ui();
if (!context.email().empty()) gaia_screen_handler_->PopulateEmail(context.email());
email_ = context.email();
else
email_.clear();
ShowImpl(); ShowImpl();
} }
...@@ -452,7 +427,8 @@ void SigninScreenHandler::SetNativeWindowDelegate( ...@@ -452,7 +427,8 @@ void SigninScreenHandler::SetNativeWindowDelegate(
void SigninScreenHandler::OnNetworkReady() { void SigninScreenHandler::OnNetworkReady() {
LOG(WARNING) << "OnNetworkReady() call."; LOG(WARNING) << "OnNetworkReady() call.";
MaybePreloadAuthExtension(); DCHECK(gaia_screen_handler_);
gaia_screen_handler_->MaybePreloadAuthExtension();
} }
void SigninScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { void SigninScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
...@@ -469,7 +445,7 @@ void SigninScreenHandler::ShowImpl() { ...@@ -469,7 +445,7 @@ void SigninScreenHandler::ShowImpl() {
if (oobe_ui_) { if (oobe_ui_) {
// Shows new user sign-in for OOBE. // Shows new user sign-in for OOBE.
OnShowAddUser(email_); OnShowAddUser();
} else { } else {
// Populates account picker. Animation is turned off for now until we // Populates account picker. Animation is turned off for now until we
// figure out how to make it fast enough. // figure out how to make it fast enough.
...@@ -712,16 +688,8 @@ gfx::NativeWindow SigninScreenHandler::GetNativeWindow() { ...@@ -712,16 +688,8 @@ gfx::NativeWindow SigninScreenHandler::GetNativeWindow() {
} }
void SigninScreenHandler::RegisterMessages() { void SigninScreenHandler::RegisterMessages() {
AddCallback("usingSAMLAPI", &SigninScreenHandler::HandleUsingSAMLAPI);
AddCallback("scrapedPasswordCount",
&SigninScreenHandler::HandleScrapedPasswordCount);
AddCallback("scrapedPasswordVerificationFailed",
&SigninScreenHandler::HandleScrapedPasswordVerificationFailed);
AddCallback("authenticateUser", &SigninScreenHandler::HandleAuthenticateUser); AddCallback("authenticateUser", &SigninScreenHandler::HandleAuthenticateUser);
AddCallback("attemptUnlock", &SigninScreenHandler::HandleAttemptUnlock); AddCallback("attemptUnlock", &SigninScreenHandler::HandleAttemptUnlock);
AddCallback("completeLogin", &SigninScreenHandler::HandleCompleteLogin);
AddCallback("completeAuthentication",
&SigninScreenHandler::HandleCompleteAuthentication);
AddCallback("getUsers", &SigninScreenHandler::HandleGetUsers); AddCallback("getUsers", &SigninScreenHandler::HandleGetUsers);
AddCallback("launchDemoUser", &SigninScreenHandler::HandleLaunchDemoUser); AddCallback("launchDemoUser", &SigninScreenHandler::HandleLaunchDemoUser);
AddCallback("launchIncognito", &SigninScreenHandler::HandleLaunchIncognito); AddCallback("launchIncognito", &SigninScreenHandler::HandleLaunchIncognito);
...@@ -743,7 +711,6 @@ void SigninScreenHandler::RegisterMessages() { ...@@ -743,7 +711,6 @@ void SigninScreenHandler::RegisterMessages() {
AddCallback("accountPickerReady", AddCallback("accountPickerReady",
&SigninScreenHandler::HandleAccountPickerReady); &SigninScreenHandler::HandleAccountPickerReady);
AddCallback("wallpaperReady", &SigninScreenHandler::HandleWallpaperReady); AddCallback("wallpaperReady", &SigninScreenHandler::HandleWallpaperReady);
AddCallback("loginWebuiReady", &SigninScreenHandler::HandleLoginWebuiReady);
AddCallback("signOutUser", &SigninScreenHandler::HandleSignOutUser); AddCallback("signOutUser", &SigninScreenHandler::HandleSignOutUser);
AddCallback("openProxySettings", AddCallback("openProxySettings",
&SigninScreenHandler::HandleOpenProxySettings); &SigninScreenHandler::HandleOpenProxySettings);
...@@ -795,7 +762,7 @@ void SigninScreenHandler::RefocusCurrentPod() { ...@@ -795,7 +762,7 @@ void SigninScreenHandler::RefocusCurrentPod() {
void SigninScreenHandler::OnUserRemoved(const std::string& username) { void SigninScreenHandler::OnUserRemoved(const std::string& username) {
CallJS("login.AccountPickerScreen.removeUser", username); CallJS("login.AccountPickerScreen.removeUser", username);
if (delegate_->GetUsers().empty()) if (delegate_->GetUsers().empty())
OnShowAddUser(""); OnShowAddUser();
} }
void SigninScreenHandler::OnUserImageChanged(const User& user) { void SigninScreenHandler::OnUserImageChanged(const User& user) {
...@@ -850,9 +817,9 @@ void SigninScreenHandler::ShowSigninUI(const std::string& email) { ...@@ -850,9 +817,9 @@ void SigninScreenHandler::ShowSigninUI(const std::string& email) {
} }
void SigninScreenHandler::ShowGaiaPasswordChanged(const std::string& username) { void SigninScreenHandler::ShowGaiaPasswordChanged(const std::string& username) {
email_ = username; gaia_screen_handler_->PasswordChangedFor(username);
password_changed_for_.insert(email_); gaia_screen_handler_->PopulateEmail(username);
core_oobe_actor_->ShowSignInUI(email_); core_oobe_actor_->ShowSignInUI(username);
CallJS("login.setAuthType", CallJS("login.setAuthType",
username, username,
static_cast<int>(ONLINE_SIGN_IN), static_cast<int>(ONLINE_SIGN_IN),
...@@ -866,26 +833,8 @@ void SigninScreenHandler::ShowPasswordChangedDialog(bool show_password_error) { ...@@ -866,26 +833,8 @@ void SigninScreenHandler::ShowPasswordChangedDialog(bool show_password_error) {
void SigninScreenHandler::ShowSigninScreenForCreds( void SigninScreenHandler::ShowSigninScreenForCreds(
const std::string& username, const std::string& username,
const std::string& password) { const std::string& password) {
VLOG(2) << "ShowSigninScreenForCreds for user " << username DCHECK(gaia_screen_handler_);
<< ", frame_state=" << FrameState(); gaia_screen_handler_->ShowSigninScreenForCreds(username, password);
test_user_ = username;
test_pass_ = password;
test_expects_complete_login_ = true;
// Submit login form for test if gaia is ready. If gaia is loading, login
// will be attempted in HandleLoginWebuiReady after gaia is ready. Otherwise,
// reload gaia then follow the loading case.
if (FrameState() == GaiaScreenHandler::FRAME_STATE_LOADED)
SubmitLoginFormForTest();
else if (FrameState() != GaiaScreenHandler::FRAME_STATE_LOADING)
HandleShowAddUser(NULL);
}
void SigninScreenHandler::OnCookiesCleared(base::Closure on_clear_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
cookies_cleared_ = true;
on_clear_callback.Run();
} }
void SigninScreenHandler::OnKeyEvent(ui::KeyEvent* key) { void SigninScreenHandler::OnKeyEvent(ui::KeyEvent* key) {
...@@ -976,11 +925,12 @@ void SigninScreenHandler::Unlock(const std::string& user_email) { ...@@ -976,11 +925,12 @@ void SigninScreenHandler::Unlock(const std::string& user_email) {
ScreenLocker::Hide(); ScreenLocker::Hide();
} }
void SigninScreenHandler::OnDnsCleared() { bool SigninScreenHandler::ShouldLoadGaia() const {
DCHECK_CURRENTLY_ON(BrowserThread::UI); // Fetching of the extension is not started before account picker page is
dns_clear_task_running_ = false; // loaded because it can affect the loading speed.
dns_cleared_ = true; // Do not load the extension for the screen locker, see crosbug.com/25018.
ShowSigninScreenIfReady(); return !ScreenLocker::default_screen_locker() &&
is_account_picker_showing_first_time_;
} }
// Update keyboard layout to least recently used by the user. // Update keyboard layout to least recently used by the user.
...@@ -1010,65 +960,6 @@ void SigninScreenHandler::SetUserInputMethod(const std::string& username) { ...@@ -1010,65 +960,6 @@ void SigninScreenHandler::SetUserInputMethod(const std::string& username) {
} }
} }
void SigninScreenHandler::ShowSigninScreenIfReady() {
LOG(WARNING) << "ShowSigninScreenIfReady() call.";
if (!dns_cleared_ || !cookies_cleared_ || !delegate_)
return;
std::string active_network_path = network_state_informer_->network_path();
if (gaia_silent_load_ &&
(network_state_informer_->state() != NetworkStateInformer::ONLINE ||
gaia_silent_load_network_ != active_network_path)) {
// Network has changed. Force Gaia reload.
gaia_silent_load_ = false;
// Gaia page will be realoded, so focus isn't stolen anymore.
focus_stolen_ = false;
}
// Note that LoadAuthExtension clears |email_|.
if (email_.empty())
delegate_->LoadSigninWallpaper();
else
delegate_->LoadWallpaper(email_);
// Set Least Recently Used input method for the user.
if (!email_.empty())
SetUserInputMethod(email_);
LoadAuthExtension(!gaia_silent_load_, false, false);
UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
if (gaia_silent_load_) {
// The variable is assigned to false because silently loaded Gaia page was
// used.
gaia_silent_load_ = false;
if (focus_stolen_)
HandleLoginWebuiReady();
}
UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
}
void SigninScreenHandler::LoadAuthExtension(
bool force, bool silent_load, bool offline) {
GaiaContext context;
context.force_reload = force;
context.is_local = offline;
context.password_changed =
!email_.empty() && password_changed_for_.count(email_);
if (delegate_)
context.show_users = delegate_->IsShowUsers();
context.use_offline = offline;
if (delegate_)
context.has_users = !delegate_->GetUsers().empty();
context.email = email_;
email_.clear();
DCHECK(gaia_screen_handler_);
gaia_screen_handler_->LoadGaia(context);
}
void SigninScreenHandler::UserSettingsChanged() { void SigninScreenHandler::UserSettingsChanged() {
DCHECK(gaia_screen_handler_); DCHECK(gaia_screen_handler_);
...@@ -1084,65 +975,6 @@ void SigninScreenHandler::UpdateAddButtonStatus() { ...@@ -1084,65 +975,6 @@ void SigninScreenHandler::UpdateAddButtonStatus() {
AllWhitelistedUsersPresent()); AllWhitelistedUsersPresent());
} }
void SigninScreenHandler::HandleUsingSAMLAPI() {
SetSAMLPrincipalsAPIUsed(true);
}
void SigninScreenHandler::HandleScrapedPasswordCount(int password_count) {
SetSAMLPrincipalsAPIUsed(false);
// Use a histogram that has 11 buckets, one for each of the values in [0, 9]
// and an overflow bucket at the end.
UMA_HISTOGRAM_ENUMERATION(
"ChromeOS.SAML.Scraping.PasswordCount", std::min(password_count, 10), 11);
if (password_count == 0)
HandleScrapedPasswordVerificationFailed();
}
void SigninScreenHandler::HandleScrapedPasswordVerificationFailed() {
RecordSAMLScrapingVerificationResultInHistogram(false);
}
void SigninScreenHandler::HandleCompleteLogin(const std::string& typed_email,
const std::string& password,
bool using_saml) {
if (!delegate_)
return;
if (using_saml && !using_saml_api_)
RecordSAMLScrapingVerificationResultInHistogram(true);
const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
delegate_->SetDisplayEmail(sanitized_email);
UserContext user_context(sanitized_email);
user_context.SetKey(Key(password));
user_context.SetAuthFlow(using_saml ?
UserContext::AUTH_FLOW_GAIA_WITH_SAML :
UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML);
delegate_->CompleteLogin(user_context);
if (test_expects_complete_login_) {
VLOG(2) << "Complete test login for " << typed_email
<< ", requested=" << test_user_;
test_expects_complete_login_ = false;
test_user_.clear();
test_pass_.clear();
}
}
void SigninScreenHandler::HandleCompleteAuthentication(
const std::string& email,
const std::string& password,
const std::string& auth_code) {
if (!delegate_)
return;
delegate_->SetDisplayEmail(gaia::SanitizeEmail(email));
UserContext user_context(email);
user_context.SetKey(Key(password));
user_context.SetAuthCode(auth_code);
delegate_->CompleteLogin(user_context);
}
void SigninScreenHandler::HandleAuthenticateUser(const std::string& username, void SigninScreenHandler::HandleAuthenticateUser(const std::string& username,
const std::string& password) { const std::string& password) {
if (!delegate_) if (!delegate_)
...@@ -1205,11 +1037,13 @@ void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) { ...@@ -1205,11 +1037,13 @@ void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) {
NOTREACHED(); NOTREACHED();
return; return;
} }
if (!args->GetString(0, &email_)) std::string email;
email_.clear(); args->GetString(0, &email);
gaia_screen_handler_->PopulateEmail(email);
// Load auth extension. Parameters are: force reload, do not load extension in // Load auth extension. Parameters are: force reload, do not load extension in
// background, use offline version. // background, use offline version.
LoadAuthExtension(true, false, true); gaia_screen_handler_->LoadAuthExtension(true, false, true);
UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL); UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
} }
...@@ -1242,7 +1076,8 @@ void SigninScreenHandler::HandleShowAddUser(const base::ListValue* args) { ...@@ -1242,7 +1076,8 @@ void SigninScreenHandler::HandleShowAddUser(const base::ListValue* args) {
// |args| can be null if it's OOBE. // |args| can be null if it's OOBE.
if (args) if (args)
args->GetString(0, &email); args->GetString(0, &email);
OnShowAddUser(email); gaia_screen_handler_->PopulateEmail(email);
OnShowAddUser();
} }
void SigninScreenHandler::HandleToggleEnrollmentScreen() { void SigninScreenHandler::HandleToggleEnrollmentScreen() {
...@@ -1301,7 +1136,7 @@ void SigninScreenHandler::HandleAccountPickerReady() { ...@@ -1301,7 +1136,7 @@ void SigninScreenHandler::HandleAccountPickerReady() {
} }
is_account_picker_showing_first_time_ = true; is_account_picker_showing_first_time_ = true;
MaybePreloadAuthExtension(); gaia_screen_handler_->MaybePreloadAuthExtension();
if (ScreenLocker::default_screen_locker()) { if (ScreenLocker::default_screen_locker()) {
ScreenLocker::default_screen_locker()->delegate()->OnLockWebUIReady(); ScreenLocker::default_screen_locker()->delegate()->OnLockWebUIReady();
...@@ -1319,40 +1154,6 @@ void SigninScreenHandler::HandleWallpaperReady() { ...@@ -1319,40 +1154,6 @@ void SigninScreenHandler::HandleWallpaperReady() {
} }
} }
void SigninScreenHandler::HandleLoginWebuiReady() {
if (focus_stolen_) {
// Set focus to the Gaia page.
// TODO(altimofeev): temporary solution, until focus parameters are
// implemented on the Gaia side.
// Do this only once. Any subsequent call would relod GAIA frame.
focus_stolen_ = false;
const char code[] =
"if (typeof gWindowOnLoad != 'undefined') gWindowOnLoad();";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
}
if (gaia_silent_load_) {
focus_stolen_ = true;
// Prevent focus stealing by the Gaia page.
// TODO(altimofeev): temporary solution, until focus parameters are
// implemented on the Gaia side.
const char code[] = "var gWindowOnLoad = window.onload; "
"window.onload=function() {};";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
// As we could miss and window.onload could already be called, restore
// focus to current pod (see crbug/175243).
RefocusCurrentPod();
}
DCHECK(gaia_screen_handler_);
gaia_screen_handler_->HandleFrameLoadingCompleted(0);
if (test_expects_complete_login_)
SubmitLoginFormForTest();
}
void SigninScreenHandler::HandleSignOutUser() { void SigninScreenHandler::HandleSignOutUser() {
if (delegate_) if (delegate_)
delegate_->Signout(); delegate_->Signout();
...@@ -1386,8 +1187,8 @@ void SigninScreenHandler::HandleLoginVisible(const std::string& source) { ...@@ -1386,8 +1187,8 @@ void SigninScreenHandler::HandleLoginVisible(const std::string& source) {
} }
void SigninScreenHandler::HandleCancelPasswordChangedFlow() { void SigninScreenHandler::HandleCancelPasswordChangedFlow() {
StartClearingCookies(base::Bind( gaia_screen_handler_->StartClearingCookies(
&SigninScreenHandler::CancelPasswordChangedFlowInternal, base::Bind(&SigninScreenHandler::CancelPasswordChangedFlowInternal,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
...@@ -1467,51 +1268,6 @@ void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id, ...@@ -1467,51 +1268,6 @@ void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id,
delegate_->LoginAsKioskApp(app_id, diagnostic_mode); delegate_->LoginAsKioskApp(app_id, diagnostic_mode);
} }
void SigninScreenHandler::StartClearingDnsCache() {
if (dns_clear_task_running_ || !g_browser_process->io_thread())
return;
dns_cleared_ = false;
BrowserThread::PostTaskAndReply(
BrowserThread::IO, FROM_HERE,
base::Bind(&ClearDnsCache, g_browser_process->io_thread()),
base::Bind(&SigninScreenHandler::OnDnsCleared,
weak_factory_.GetWeakPtr()));
dns_clear_task_running_ = true;
}
void SigninScreenHandler::StartClearingCookies(
const base::Closure& on_clear_callback) {
cookies_cleared_ = false;
ProfileHelper* profile_helper =
g_browser_process->platform_part()->profile_helper();
LOG_ASSERT(
Profile::FromWebUI(web_ui()) == profile_helper->GetSigninProfile());
profile_helper->ClearSigninProfile(base::Bind(
&SigninScreenHandler::OnCookiesCleared,
weak_factory_.GetWeakPtr(), on_clear_callback));
}
void SigninScreenHandler::MaybePreloadAuthExtension() {
LOG(WARNING) << "MaybePreloadAuthExtension() call.";
// Fetching of the extension is not started before account picker page is
// loaded because it can affect the loading speed. Also if cookies clearing
// was initiated or |dns_clear_task_running_| then auth extension showing has
// already been initiated and preloading is senseless.
// Do not load the extension for the screen locker, see crosbug.com/25018.
if (is_account_picker_showing_first_time_ &&
!gaia_silent_load_ &&
!ScreenLocker::default_screen_locker() &&
!cookies_cleared_ &&
!dns_clear_task_running_ &&
network_state_informer_->state() == NetworkStateInformer::ONLINE) {
gaia_silent_load_ = true;
gaia_silent_load_network_ = network_state_informer_->network_path();
LoadAuthExtension(true, true, false);
}
}
bool SigninScreenHandler::AllWhitelistedUsersPresent() { bool SigninScreenHandler::AllWhitelistedUsersPresent() {
CrosSettings* cros_settings = CrosSettings::Get(); CrosSettings* cros_settings = CrosSettings::Get();
bool allow_new_user = false; bool allow_new_user = false;
...@@ -1587,23 +1343,6 @@ bool SigninScreenHandler::IsOfflineLoginAllowed() const { ...@@ -1587,23 +1343,6 @@ bool SigninScreenHandler::IsOfflineLoginAllowed() const {
return !show_pods; return !show_pods;
} }
void SigninScreenHandler::SubmitLoginFormForTest() {
VLOG(2) << "Submit login form for test, user=" << test_user_;
std::string code;
code += "document.getElementById('Email').value = '" + test_user_ + "';";
code += "document.getElementById('Passwd').value = '" + test_pass_ + "';";
code += "document.getElementById('signIn').click();";
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(web_ui()->GetWebContents());
frame->ExecuteJavaScript(base::ASCIIToUTF16(code));
// Test properties are cleared in HandleCompleteLogin because the form
// submission might fail and login will not be attempted after reloading
// if they are cleared here.
}
void SigninScreenHandler::ContinueKioskEnableFlow( void SigninScreenHandler::ContinueKioskEnableFlow(
policy::AutoEnrollmentState state) { policy::AutoEnrollmentState state) {
// Do not proceed with kiosk enable when auto enroll will be enforced. // Do not proceed with kiosk enable when auto enroll will be enforced.
...@@ -1631,25 +1370,10 @@ void SigninScreenHandler::ContinueKioskEnableFlow( ...@@ -1631,25 +1370,10 @@ void SigninScreenHandler::ContinueKioskEnableFlow(
auto_enrollment_progress_subscription_.reset(); auto_enrollment_progress_subscription_.reset();
} }
void SigninScreenHandler::OnShowAddUser(const std::string& email) { void SigninScreenHandler::OnShowAddUser() {
email_ = email;
is_account_picker_showing_first_time_ = false; is_account_picker_showing_first_time_ = false;
DCHECK(gaia_screen_handler_);
if (gaia_silent_load_ && email_.empty()) { gaia_screen_handler_->ShowGaia();
dns_cleared_ = true;
cookies_cleared_ = true;
ShowSigninScreenIfReady();
} else {
StartClearingDnsCache();
StartClearingCookies(base::Bind(
&SigninScreenHandler::ShowSigninScreenIfReady,
weak_factory_.GetWeakPtr()));
}
}
void SigninScreenHandler::SetSAMLPrincipalsAPIUsed(bool api_used) {
using_saml_api_ = api_used;
UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used);
} }
GaiaScreenHandler::FrameState SigninScreenHandler::FrameState() const { GaiaScreenHandler::FrameState SigninScreenHandler::FrameState() const {
......
...@@ -44,6 +44,7 @@ namespace chromeos { ...@@ -44,6 +44,7 @@ namespace chromeos {
class AuthenticatedUserEmailRetriever; class AuthenticatedUserEmailRetriever;
class CaptivePortalWindowProxy; class CaptivePortalWindowProxy;
class CoreOobeActor; class CoreOobeActor;
class GaiaScreenHandler;
class LocallyManagedUserCreationScreenHandler; class LocallyManagedUserCreationScreenHandler;
class NativeWindowDelegate; class NativeWindowDelegate;
class User; class User;
...@@ -252,8 +253,9 @@ class SigninScreenHandler ...@@ -252,8 +253,9 @@ class SigninScreenHandler
UI_STATE_ACCOUNT_PICKER, UI_STATE_ACCOUNT_PICKER,
}; };
friend class ReportDnsCacheClearedOnUIThread; friend class GaiaScreenHandler;
friend class LocallyManagedUserCreationScreenHandler; friend class LocallyManagedUserCreationScreenHandler;
friend class ReportDnsCacheClearedOnUIThread;
void ShowImpl(); void ShowImpl();
...@@ -320,16 +322,6 @@ class SigninScreenHandler ...@@ -320,16 +322,6 @@ class SigninScreenHandler
const std::string& username) const OVERRIDE; const std::string& username) const OVERRIDE;
virtual void Unlock(const std::string& user_email) OVERRIDE; virtual void Unlock(const std::string& user_email) OVERRIDE;
// Shows signin screen after dns cache and cookie cleanup operations finish.
void ShowSigninScreenIfReady();
// Tells webui to load authentication extension. |force| is used to force the
// extension reloading, if it has already been loaded. |silent_load| is true
// for cases when extension should be loaded in the background and it
// shouldn't grab the focus. |offline| is true when offline version of the
// extension should be used.
void LoadAuthExtension(bool force, bool silent_load, bool offline);
// Updates authentication extension. Called when device settings that affect // Updates authentication extension. Called when device settings that affect
// sign-in (allow BWSI and allow whitelist) are changed. // sign-in (allow BWSI and allow whitelist) are changed.
void UserSettingsChanged(); void UserSettingsChanged();
...@@ -339,16 +331,7 @@ class SigninScreenHandler ...@@ -339,16 +331,7 @@ class SigninScreenHandler
void RefocusCurrentPod(); void RefocusCurrentPod();
// WebUI message handlers. // WebUI message handlers.
void HandleCompleteAuthentication(const std::string& email,
const std::string& password,
const std::string& auth_code);
void HandleCompleteLogin(const std::string& typed_email,
const std::string& password,
bool using_saml);
void HandleGetUsers(); void HandleGetUsers();
void HandleUsingSAMLAPI();
void HandleScrapedPasswordCount(int password_count);
void HandleScrapedPasswordVerificationFailed();
void HandleAuthenticateUser(const std::string& username, void HandleAuthenticateUser(const std::string& username,
const std::string& password); const std::string& password);
void HandleAttemptUnlock(const std::string& username); void HandleAttemptUnlock(const std::string& username);
...@@ -368,7 +351,6 @@ class SigninScreenHandler ...@@ -368,7 +351,6 @@ class SigninScreenHandler
void HandleCreateAccount(); void HandleCreateAccount();
void HandleAccountPickerReady(); void HandleAccountPickerReady();
void HandleWallpaperReady(); void HandleWallpaperReady();
void HandleLoginWebuiReady();
void HandleSignOutUser(); void HandleSignOutUser();
void HandleOpenProxySettings(); void HandleOpenProxySettings();
void HandleLoginVisible(const std::string& source); void HandleLoginVisible(const std::string& source);
...@@ -386,17 +368,6 @@ class SigninScreenHandler ...@@ -386,17 +368,6 @@ class SigninScreenHandler
void HandleLaunchKioskApp(const std::string& app_id, bool diagnostic_mode); void HandleLaunchKioskApp(const std::string& app_id, bool diagnostic_mode);
void HandleRetrieveAuthenticatedUserEmail(double attempt_token); void HandleRetrieveAuthenticatedUserEmail(double attempt_token);
// Kick off cookie / local storage cleanup.
void StartClearingCookies(const base::Closure& on_clear_callback);
void OnCookiesCleared(base::Closure on_clear_callback);
// Kick off DNS cache flushing.
void StartClearingDnsCache();
void OnDnsCleared();
// Decides whether an auth extension should be pre-loaded. If it should,
// pre-loads it.
void MaybePreloadAuthExtension();
// Returns true iff // Returns true iff
// (i) log in is restricted to some user list, // (i) log in is restricted to some user list,
...@@ -427,8 +398,7 @@ class SigninScreenHandler ...@@ -427,8 +398,7 @@ class SigninScreenHandler
// Returns true if offline login is allowed. // Returns true if offline login is allowed.
bool IsOfflineLoginAllowed() const; bool IsOfflineLoginAllowed() const;
// Attempts login for test. bool ShouldLoadGaia() const;
void SubmitLoginFormForTest();
// Update current input method (namely keyboard layout) to LRU by this user. // Update current input method (namely keyboard layout) to LRU by this user.
void SetUserInputMethod(const std::string& username); void SetUserInputMethod(const std::string& username);
...@@ -438,12 +408,8 @@ class SigninScreenHandler ...@@ -438,12 +408,8 @@ class SigninScreenHandler
// |state| indicates that enrollment is not applicable. // |state| indicates that enrollment is not applicable.
void ContinueKioskEnableFlow(policy::AutoEnrollmentState state); void ContinueKioskEnableFlow(policy::AutoEnrollmentState state);
// Shows signin screen for |email|. // Shows signin.
void OnShowAddUser(const std::string& email); void OnShowAddUser();
// Updates the member variable and UMA histogram indicating whether the
// principals API was used during SAML login.
void SetSAMLPrincipalsAPIUsed(bool api_used);
GaiaScreenHandler::FrameState FrameState() const; GaiaScreenHandler::FrameState FrameState() const;
net::Error FrameError() const; net::Error FrameError() const;
...@@ -466,46 +432,12 @@ class SigninScreenHandler ...@@ -466,46 +432,12 @@ class SigninScreenHandler
// Keeps whether screen should be shown for OOBE. // Keeps whether screen should be shown for OOBE.
bool oobe_ui_; bool oobe_ui_;
// Is focus still stolen from Gaia page?
bool focus_stolen_;
// Has Gaia page silent load been started for the current sign-in attempt?
bool gaia_silent_load_;
// The active network at the moment when Gaia page was preloaded.
std::string gaia_silent_load_network_;
// Is account picker being shown for the first time. // Is account picker being shown for the first time.
bool is_account_picker_showing_first_time_; bool is_account_picker_showing_first_time_;
// True if dns cache cleanup is done.
bool dns_cleared_;
// True if DNS cache task is already running.
bool dns_clear_task_running_;
// True if cookie jar cleanup is done.
bool cookies_cleared_;
// Network state informer used to keep signin screen up. // Network state informer used to keep signin screen up.
scoped_refptr<NetworkStateInformer> network_state_informer_; scoped_refptr<NetworkStateInformer> network_state_informer_;
// Email to pre-populate with.
std::string email_;
// Emails of the users, whose passwords have recently been changed.
std::set<std::string> password_changed_for_;
// If the user authenticated via SAML, this indicates whether the principals
// API was used.
bool using_saml_api_;
// Test credentials.
std::string test_user_;
std::string test_pass_;
bool test_expects_complete_login_;
base::WeakPtrFactory<SigninScreenHandler> weak_factory_;
// Set to true once |LOGIN_WEBUI_VISIBLE| notification is observed. // Set to true once |LOGIN_WEBUI_VISIBLE| notification is observed.
bool webui_visible_; bool webui_visible_;
bool preferences_changed_delayed_; bool preferences_changed_delayed_;
...@@ -541,6 +473,8 @@ class SigninScreenHandler ...@@ -541,6 +473,8 @@ class SigninScreenHandler
// Helper that retrieves the authenticated user's e-mail address. // Helper that retrieves the authenticated user's e-mail address.
scoped_ptr<AuthenticatedUserEmailRetriever> email_retriever_; scoped_ptr<AuthenticatedUserEmailRetriever> email_retriever_;
base::WeakPtrFactory<SigninScreenHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler); DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment