Home | History | Annotate | Download | only in sync
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_SYNC_STARTER_H_
      6 #define CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_SYNC_STARTER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback_forward.h"
     11 #include "base/gtest_prod_util.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "chrome/browser/profiles/profile.h"
     15 #include "chrome/browser/ui/browser_list_observer.h"
     16 #include "chrome/browser/ui/host_desktop.h"
     17 #include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
     18 #include "components/signin/core/browser/signin_tracker.h"
     19 #include "content/public/browser/web_contents_observer.h"
     20 
     21 class Browser;
     22 class ProfileSyncService;
     23 
     24 namespace content {
     25 class WebContents;
     26 }  // namespace content
     27 
     28 // Waits for successful sign-in notification from the signin manager and then
     29 // starts the sync machine.  Instances of this class delete themselves once
     30 // the job is done.
     31 class OneClickSigninSyncStarter : public SigninTracker::Observer,
     32                                   public chrome::BrowserListObserver,
     33                                   public content::WebContentsObserver {
     34  public:
     35   enum StartSyncMode {
     36     // Starts the process of signing the user in with the SigninManager, and
     37     // once completed automatically starts sync with all data types enabled.
     38     SYNC_WITH_DEFAULT_SETTINGS,
     39 
     40     // Starts the process of signing the user in with the SigninManager, and
     41     // once completed redirects the user to the settings page to allow them
     42     // to configure which data types to sync before sync is enabled.
     43     CONFIGURE_SYNC_FIRST,
     44 
     45     // Starts the process of re-authenticating the user via SigninManager,
     46     // and once completed, redirects the user to the settings page, but doesn't
     47     // display the configure sync UI.
     48     SHOW_SETTINGS_WITHOUT_CONFIGURE,
     49 
     50     // The process should be aborted because the undo button has been pressed.
     51     UNDO_SYNC
     52   };
     53 
     54   enum ConfirmationRequired {
     55     // No need to display a "post-signin" confirmation bubble (for example, if
     56     // the user was doing a re-auth flow).
     57     NO_CONFIRMATION,
     58 
     59     // Signin flow redirected outside of trusted domains, so ask the user to
     60     // confirm before signing in.
     61     CONFIRM_UNTRUSTED_SIGNIN,
     62 
     63     // Display a confirmation after signing in.
     64     CONFIRM_AFTER_SIGNIN
     65   };
     66 
     67   // Result of the sync setup.
     68   enum SyncSetupResult {
     69     SYNC_SETUP_SUCCESS,
     70     SYNC_SETUP_FAILURE
     71   };
     72 
     73   typedef base::Callback<void(SyncSetupResult)> Callback;
     74 
     75   // |profile| must not be NULL, however |browser| can be. When using the
     76   // OneClickSigninSyncStarter from a browser, provide both.
     77   // If |display_confirmation| is true, the user will be prompted to confirm the
     78   // signin before signin completes.
     79   // |web_contents| is used to show the sync UI if it's showing a blank page
     80   // and not about to be closed. It can be NULL.
     81   // If |web_contents| is non-NULL and the |continue_url| is non-empty, the
     82   // |web_contents| will be navigated to the |continue_url| once both signin and
     83   // Sync setup are complete.
     84   // |callback| is always executed before OneClickSigninSyncStarter is deleted.
     85   // It can be empty.
     86   OneClickSigninSyncStarter(Profile* profile,
     87                             Browser* browser,
     88                             const std::string& email,
     89                             const std::string& password,
     90                             const std::string& refresh_token,
     91                             StartSyncMode start_mode,
     92                             content::WebContents* web_contents,
     93                             ConfirmationRequired display_confirmation,
     94                             const GURL& continue_url,
     95                             Callback callback);
     96 
     97   // chrome::BrowserListObserver override.
     98   virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;
     99 
    100   // If the |browser| argument is non-null, returns the pointer directly.
    101   // Otherwise creates a new browser for the given profile on the given
    102   // desktop, adds an empty tab and makes sure the browser is visible.
    103   static Browser* EnsureBrowser(Browser* browser,
    104                                 Profile* profile,
    105                                 chrome::HostDesktopType desktop_type);
    106 
    107  private:
    108   friend class OneClickSigninSyncStarterTest;
    109   FRIEND_TEST_ALL_PREFIXES(OneClickSigninSyncStarterTest, CallbackSigninFailed);
    110   FRIEND_TEST_ALL_PREFIXES(OneClickSigninSyncStarterTest, CallbackNull);
    111   FRIEND_TEST_ALL_PREFIXES(OneClickSigninSyncStarterTest, LoadContinueUrl);
    112 
    113   virtual ~OneClickSigninSyncStarter();
    114 
    115   // Initializes the internals of the OneClickSigninSyncStarter object. Can also
    116   // be used to re-initialize the object to refer to a newly created profile.
    117   void Initialize(Profile* profile, Browser* browser);
    118 
    119   // SigninTracker::Observer override.
    120   virtual void SigninFailed(const GoogleServiceAuthError& error) OVERRIDE;
    121   virtual void SigninSuccess() OVERRIDE;
    122   virtual void MergeSessionComplete(
    123       const GoogleServiceAuthError& error) OVERRIDE;
    124 
    125 #if defined(ENABLE_CONFIGURATION_POLICY)
    126   // User input handler for the signin confirmation dialog.
    127   class SigninDialogDelegate
    128     : public ui::ProfileSigninConfirmationDelegate {
    129    public:
    130     SigninDialogDelegate(
    131         base::WeakPtr<OneClickSigninSyncStarter> sync_starter);
    132     virtual ~SigninDialogDelegate();
    133     virtual void OnCancelSignin() OVERRIDE;
    134     virtual void OnContinueSignin() OVERRIDE;
    135     virtual void OnSigninWithNewProfile() OVERRIDE;
    136    private:
    137     base::WeakPtr<OneClickSigninSyncStarter> sync_starter_;
    138   };
    139   friend class SigninDialogDelegate;
    140 
    141   // Callback invoked once policy registration is complete. If registration
    142   // fails, |dm_token| and |client_id| will be empty.
    143   void OnRegisteredForPolicy(const std::string& dm_token,
    144                              const std::string& client_id);
    145 
    146   // Callback invoked when a policy fetch request has completed. |success| is
    147   // true if policy was successfully fetched.
    148   void OnPolicyFetchComplete(bool success);
    149 
    150   // Called to create a new profile, which is then signed in with the
    151   // in-progress auth credentials currently stored in this object.
    152   void CreateNewSignedInProfile();
    153 
    154   // Helper function that loads policy with the cached |dm_token_| and
    155   // |client_id|, then completes the signin process.
    156   void LoadPolicyWithCachedCredentials();
    157 
    158   // Callback invoked once a profile is created, so we can complete the
    159   // credentials transfer, load policy, and open the first window.
    160   void CompleteInitForNewProfile(chrome::HostDesktopType desktop_type,
    161                                  Profile* profile,
    162                                  Profile::CreateStatus status);
    163 
    164 #endif  // defined(ENABLE_CONFIGURATION_POLICY)
    165 
    166   // Cancels the in-progress signin for this profile.
    167   void CancelSigninAndDelete();
    168 
    169   // Callback invoked to check whether the user needs policy or if a
    170   // confirmation is required (in which case we have to prompt the user first).
    171   void ConfirmSignin(const std::string& oauth_token);
    172 
    173   // Displays confirmation UI to the user if confirmation_required_ ==
    174   // CONFIRM_UNTRUSTED_SIGNIN, otherwise completes the pending signin process.
    175   void ConfirmAndSignin();
    176 
    177   // Callback invoked once the user has responded to the signin confirmation UI.
    178   // If response == UNDO_SYNC, the signin is cancelled, otherwise the pending
    179   // signin is completed.
    180   void UntrustedSigninConfirmed(StartSyncMode response);
    181 
    182   // GetProfileSyncService returns non-NULL pointer if sync is enabled.
    183   // There is a scenario when when ProfileSyncService discovers that sync is
    184   // disabled during setup. In this case GetProfileSyncService will return NULL,
    185   // but we still need to call PSS::SetSetupInProgress(false). For this purpose
    186   // call FinishProfileSyncServiceSetup() function.
    187   ProfileSyncService* GetProfileSyncService();
    188 
    189   void FinishProfileSyncServiceSetup();
    190 
    191   // Displays the settings UI and brings up the advanced sync settings
    192   // dialog if |configure_sync| is true. The web contents provided to the
    193   // constructor is used if it's showing a blank page and not about to be
    194   // closed. Otherwise, a new tab or an existing settings tab is used.
    195   void ShowSettingsPage(bool configure_sync);
    196 
    197   // Displays a settings page in the provided web contents. |sub_page| can be
    198   // empty to show the main settings page.
    199   void ShowSettingsPageInWebContents(content::WebContents* contents,
    200                                      const std::string& sub_page);
    201 
    202   // Shows the post-signin confirmation bubble. If |custom_message| is empty,
    203   // the default "You are signed in" message is displayed.
    204   void DisplayFinalConfirmationBubble(const base::string16& custom_message);
    205 
    206   // Loads the |continue_url_| in the current tab.
    207   void LoadContinueUrl();
    208 
    209   Profile* profile_;
    210   Browser* browser_;
    211   scoped_ptr<SigninTracker> signin_tracker_;
    212   StartSyncMode start_mode_;
    213   chrome::HostDesktopType desktop_type_;
    214   bool force_same_tab_navigation_;
    215   ConfirmationRequired confirmation_required_;
    216   GURL continue_url_;
    217 
    218   // Callback executed when sync setup succeeds or fails.
    219   Callback sync_setup_completed_callback_;
    220 
    221 #if defined(ENABLE_CONFIGURATION_POLICY)
    222   // Policy credentials we keep while determining whether to create
    223   // a new profile for an enterprise user or not.
    224   std::string dm_token_;
    225   std::string client_id_;
    226 #endif
    227 
    228   base::WeakPtrFactory<OneClickSigninSyncStarter> weak_pointer_factory_;
    229 
    230   DISALLOW_COPY_AND_ASSIGN(OneClickSigninSyncStarter);
    231 };
    232 
    233 
    234 #endif  // CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_SYNC_STARTER_H_
    235