// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_ #pragma once #include <string> #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "base/task.h" #include "base/timer.h" #include "chrome/browser/chromeos/login/captcha_view.h" #include "chrome/browser/chromeos/login/login_display.h" #include "chrome/browser/chromeos/login/login_performer.h" #include "chrome/browser/chromeos/login/login_utils.h" #include "chrome/browser/chromeos/login/ownership_status_checker.h" #include "chrome/browser/chromeos/login/password_changed_view.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/wm_message_listener.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "googleurl/src/gurl.h" #include "testing/gtest/include/gtest/gtest_prod.h" #include "ui/gfx/rect.h" namespace chromeos { class LoginDisplayHost; class UserCrosSettingsProvider; // ExistingUserController is used to handle login when someone has // already logged into the machine. // To use ExistingUserController create an instance of it and invoke Init. // When Init is called it creates LoginDisplay instance which encapsulates // all login UI implementation. // ExistingUserController maintains it's own life cycle and deletes itself when // the user logs in (or chooses to see other settings). class ExistingUserController : public LoginDisplay::Delegate, public NotificationObserver, public LoginPerformer::Delegate, public LoginUtils::Delegate, public CaptchaView::Delegate, public PasswordChangedView::Delegate { public: // All UI initialization is deferred till Init() call. explicit ExistingUserController(LoginDisplayHost* host); ~ExistingUserController(); // Returns the current existing user controller if it has been created. static ExistingUserController* current_controller() { return current_controller_; } // Creates and shows login UI for known users. void Init(const UserVector& users); // LoginDisplay::Delegate: implementation virtual void CreateAccount() OVERRIDE; virtual string16 GetConnectedNetworkName() OVERRIDE; virtual void FixCaptivePortal() OVERRIDE; virtual void Login(const std::string& username, const std::string& password) OVERRIDE; virtual void LoginAsGuest() OVERRIDE; virtual void OnUserSelected(const std::string& username) OVERRIDE; virtual void OnStartEnterpriseEnrollment() OVERRIDE; // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: friend class ExistingUserControllerTest; friend class MockLoginPerformerDelegate; // LoginPerformer::Delegate implementation: virtual void OnLoginFailure(const LoginFailure& error); virtual void OnLoginSuccess( const std::string& username, const std::string& password, const GaiaAuthConsumer::ClientLoginResult& credentials, bool pending_requests); virtual void OnOffTheRecordLoginSuccess(); virtual void OnPasswordChangeDetected( const GaiaAuthConsumer::ClientLoginResult& credentials); virtual void WhiteListCheckFailed(const std::string& email); // LoginUtils::Delegate implementation: virtual void OnProfilePrepared(Profile* profile); // CaptchaView::Delegate: virtual void OnCaptchaEntered(const std::string& captcha); // PasswordChangedView::Delegate: virtual void RecoverEncryptedData(const std::string& old_password); virtual void ResyncEncryptedData(); // Starts WizardController with the specified screen. void ActivateWizard(const std::string& screen_name); // Returns corresponding native window. gfx::NativeWindow GetNativeWindow() const; // Changes state of the status area. During login operation it's disabled. void SetStatusAreaEnabled(bool enable); // Show error message. |error_id| error message ID in resources. // If |details| string is not empty, it specify additional error text // provided by authenticator, it is not localized. void ShowError(int error_id, const std::string& details); // Handles result of ownership check and starts enterprise enrollment if // applicable. void OnEnrollmentOwnershipCheckCompleted(OwnershipService::Status status); void set_login_performer_delegate(LoginPerformer::Delegate* d) { login_performer_delegate_.reset(d); } // Used to execute login operations. scoped_ptr<LoginPerformer> login_performer_; // Login UI implementation instance. LoginDisplay* login_display_; // Delegate for login performer to be overridden by tests. // |this| is used if |login_performer_delegate_| is NULL. scoped_ptr<LoginPerformer::Delegate> login_performer_delegate_; // Username of the last login attempt. std::string last_login_attempt_username_; // OOBE/login display host. LoginDisplayHost* host_; // Number of login attempts. Used to show help link when > 1 unsuccessful // logins for the same user. size_t num_login_attempts_; // Pointer to the current instance of the controller to be used by // automation tests. static ExistingUserController* current_controller_; // Triggers prefetching of user settings. scoped_ptr<UserCrosSettingsProvider> user_settings_; // URL to append to start Guest mode with. GURL guest_mode_url_; // Used for user image changed notifications. NotificationRegistrar registrar_; // Factory of callbacks. ScopedRunnableMethodFactory<ExistingUserController> method_factory_; // Whether everything is ready to launch the browser. bool ready_for_browser_launch_; // Whether two factor credentials were used. bool two_factor_credentials_; // Used to verify ownership before starting enterprise enrollment. scoped_ptr<OwnershipStatusChecker> ownership_checker_; FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, NewUserLogin); DISALLOW_COPY_AND_ASSIGN(ExistingUserController); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_