Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1055)

Unified Diff: chrome/browser/chromeos/login/oauth2_login_manager.h

Issue 23678007: OAuth2LoginManager+MergeSessionThrottle hardening, multi-profle support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/oauth2_login_manager.h
diff --git a/chrome/browser/chromeos/login/oauth2_login_manager.h b/chrome/browser/chromeos/login/oauth2_login_manager.h
index ea7e2c78d818f816a8c82e217cd3c17ec9073b28..d0a4ae3869af2e50f8f7b869e635eae6753ef2fd 100644
--- a/chrome/browser/chromeos/login/oauth2_login_manager.h
+++ b/chrome/browser/chromeos/login/oauth2_login_manager.h
@@ -8,9 +8,11 @@
#include <string>
#include "base/memory/scoped_ptr.h"
+#include "base/observer_list.h"
+#include "base/time/time.h"
#include "chrome/browser/chromeos/login/oauth2_login_verifier.h"
#include "chrome/browser/chromeos/login/oauth2_token_fetcher.h"
-#include "chrome/browser/chromeos/login/oauth_login_manager.h"
+#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
#include "google_apis/gaia/oauth2_token_service.h"
#include "net/url_request/url_request_context_getter.h"
@@ -20,26 +22,89 @@ class TokenService;
namespace chromeos {
-// OAuth2 specialization of OAuthLoginManager.
-class OAuth2LoginManager : public OAuthLoginManager,
+// This class is responsible for restoring authenticated web sessions out of
+// OAuth2 refresh tokens or pre-authenticated cookie jar.
+class OAuth2LoginManager : public BrowserContextKeyedService,
public OAuth2LoginVerifier::Delegate,
public OAuth2TokenFetcher::Delegate,
public OAuth2TokenService::Observer {
public:
- explicit OAuth2LoginManager(OAuthLoginManager::Delegate* delegate);
+ // Session restore states.
+ enum SessionRestoreState {
+ // Session restore is not started.
+ SESSION_RESTORE_NOT_STARTED,
+ // Session restore is being prepared.
+ SESSION_RESTORE_PREPARING,
+ // Session restore is in progress. We are currently issuing calls to verify
+ // stored OAuth tokens and populate cookie jar with GAIA credentials.
+ SESSION_RESTORE_IN_PROGRESS,
+ // Session restore is completed.
+ SESSION_RESTORE_DONE,
+ // Session restore failed.
+ SESSION_RESTORE_FAILED,
+ };
+
+ // Session restore strategy.
+ enum SessionRestoreStrategy {
+ // Generate OAuth2 refresh token from authentication profile's cookie jar.
+ // Restore session from generated OAuth2 refresh token.
+ RESTORE_FROM_COOKIE_JAR,
+ // Restore session from saved OAuth2 refresh token from TokenServices.
+ RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN,
+ // Restore session from OAuth2 refresh token passed via command line.
+ RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN,
+ // Restore session from authentication code passed via command line.
+ RESTORE_FROM_AUTH_CODE,
+ };
+
+ class Observer {
+ public:
+ virtual ~Observer() {}
+
+ // Raised when merge session state changes.
+ virtual void OnSessionRestoreStateChanged(Profile* user_profile,
+ SessionRestoreState state) {}
+ // Raised when session's GAIA credentials (SID+LSID) are available to
+ // other signed in services.
+ virtual void OnSessionAuthenticated(Profile* user_profile) {}
+ };
+
+ explicit OAuth2LoginManager(Profile* user_profile);
virtual ~OAuth2LoginManager();
- // OAuthLoginManager overrides.
- virtual void RestoreSession(
- Profile* user_profile,
+ void AddObserver(OAuth2LoginManager::Observer* observer);
+ void RemoveObserver(OAuth2LoginManager::Observer* observer);
+
+ // Restores and verifies OAuth tokens either following specified
+ // |restore_strategy|. For |restore_strategy| with values
+ // RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN or
+ // RESTORE_FROM_AUTH_CODE, respectively
+ // parameters |oauth2_refresh_token| or |auth_code| need to have non-empty
+ // value.
+ void RestoreSession(
net::URLRequestContextGetter* auth_request_context,
SessionRestoreStrategy restore_strategy,
const std::string& oauth2_refresh_token,
- const std::string& auth_code) OVERRIDE;
- virtual void ContinueSessionRestore() OVERRIDE;
- virtual void Stop() OVERRIDE;
+ const std::string& auth_code);
+
+ // Continues session restore after transient network errors.
+ void ContinueSessionRestore();
+
+ // Stops all background authentication requests.
+ void Stop();
+
+ // Returns session restore state.
+ SessionRestoreState state() { return state_; }
+
+ const base::Time& session_restore_start() { return session_restore_start_; }
+
+ // Returns true if the tab loading should block until session restore
+ // finishes.
+ bool ShouldBlockTabLoading();
private:
+ friend class MergeSessionLoadPageTest;
+
// Session restore outcomes (for UMA).
enum {
SESSION_RESTORE_UNDEFINED = 0,
@@ -51,6 +116,9 @@ class OAuth2LoginManager : public OAuthLoginManager,
SESSION_RESTORE_COUNT = SESSION_RESTORE_MERGE_SESSION_FAILED,
};
+ // BrowserContextKeyedService implementation.
+ virtual void Shutdown() OVERRIDE;
+
// OAuth2LoginVerifier::Delegate overrides.
virtual void OnOAuthLoginSuccess(
const GaiaAuthConsumer::ClientLoginResult& gaia_credentials) OVERRIDE;
@@ -66,6 +134,10 @@ class OAuth2LoginManager : public OAuthLoginManager,
// OAuth2TokenService::Observer implementation:
virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE;
+ // Signals delegate that authentication is completed, kicks off token fetching
+ // process in TokenService.
+ void CompleteAuthentication();
+
// Retrieves TokenService for |user_profile_| and sets up notification
// observer events.
TokenService* SetupTokenService();
@@ -96,19 +168,39 @@ class OAuth2LoginManager : public OAuthLoginManager,
void StartTokenService(
const GaiaAuthConsumer::ClientLoginResult& gaia_credentials);
- // Stops listening for a new login refresh token.
- void StopObservingRefreshToken();
+ // Changes |state_|, if needed fires observers (OnSessionRestoreStateChanged).
+ void SetSessionRestoreState(SessionRestoreState state);
+
+ // Testing helper.
+ void SetSessionRestoreStartForTesting(const base::Time& time);
// Keeps the track if we have already reported OAuth2 token being loaded
// by TokenService.
+ Profile* user_profile_;
+ scoped_refptr<net::URLRequestContextGetter> auth_request_context_;
+ SessionRestoreStrategy restore_strategy_;
+ SessionRestoreState state_;
+
bool loading_reported_;
+
scoped_ptr<OAuth2TokenFetcher> oauth2_token_fetcher_;
scoped_ptr<OAuth2LoginVerifier> login_verifier_;
+
// OAuth2 refresh token.
std::string refresh_token_;
+
// Authorization code for fetching OAuth2 tokens.
std::string auth_code_;
+ // Session restore start time.
+ base::Time session_restore_start_;
+
+ // List of observers to notify when token availability changes.
+ // Makes sure list is empty on destruction.
+ // TODO(zelidrag|gspencer): Figure out how to get rid of ProfileHelper so we
+ // can change the line below to ObserverList<Observer, true>.
+ ObserverList<Observer, false> observer_list_;
+
DISALLOW_COPY_AND_ASSIGN(OAuth2LoginManager);
};
« no previous file with comments | « chrome/browser/chromeos/login/mock_user_manager.h ('k') | chrome/browser/chromeos/login/oauth2_login_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698