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

Unified Diff: chrome/browser/net/gaia/authentication_service.h

Issue 6894027: Initial refactoring complete Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed some tests that were broken by previous refactoring Created 9 years, 8 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
« no previous file with comments | « no previous file | chrome/browser/net/gaia/authentication_service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/net/gaia/authentication_service.h
diff --git a/chrome/browser/net/gaia/authentication_service.h b/chrome/browser/net/gaia/authentication_service.h
new file mode 100644
index 0000000000000000000000000000000000000000..6e565fed13e741434f48df5bb0e40cc321a0006e
--- /dev/null
+++ b/chrome/browser/net/gaia/authentication_service.h
@@ -0,0 +1,202 @@
+// 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.
+//
+// The AuthenticationService will supply authentication tokens for any service
+// that needs it, such as sync. Whenever the user logs in, a controller
+// watching the token service is expected to call OAuth to derive a new SID
+// and LSID. Whenever such credentials are available, the
+// AuthenticationService should be updated with new credentials. The
+// controller should then start fetching tokens, which will be written to the
+// database after retrieval, as well as provided to listeners.
+
+//
+// A token service controller like the ChromiumOS login is expected to:
+//
+// Initialize() // Soon as you can
+// LoadTokensFromDB() // When it's OK to talk to the database
+// UpdateCredentials() // When user logs in
+// StartFetchingTokens() // When it's safe to start fetching
+//
+// Typically a user of the AuthenticationService is expected just to call:
+//
+// if (token_service.HasTokenForService(servicename)) {
+// SetMyToken(token_service.GetTokenForService(servicename));
+// }
+// RegisterSomeObserver(token_service);
+//
+// Whenever a token update occurs:
+// OnTokenAvailable(...) {
+// if (IsServiceICareAbout(notification.service())) {
+// SetMyToken(notification.token())
+// }
+// }
+
+#ifndef CHROME_BROWSER_NET_GAIA_AUTHENTICATION_SERVICE_H_
+#define CHROME_BROWSER_NET_GAIA_AUTHENTICATION_SERVICE_H_
+#pragma once
+
+#include <map>
+#include <string>
+
+#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/webdata/web_data_service.h"
+#include "chrome/common/net/gaia/authentication_consumer.h"
+#include "chrome/common/net/gaia/authentication_fetcher.h"
+#include "chrome/common/net/gaia/google_service_auth_error.h"
+#include "content/common/notification_observer.h"
+#include "content/common/notification_registrar.h"
+
+class Profile;
+
+namespace net {
+class URLRequestContextGetter;
+}
+
+// The AuthenticationService is a Profile member, so all calls are expected
+// from the UI thread.
+class AuthenticationService : public AuthenticationConsumer,
+ public WebDataServiceConsumer,
+ public NotificationObserver {
+ public:
+ static const char kClientLoginVariant[];
+ static const char kOAuthVariant[];
+
+ AuthenticationService();
+ virtual ~AuthenticationService();
+
+ // Notification classes
+ class TokenAvailableDetails {
+ public:
+ TokenAvailableDetails() {}
+ TokenAvailableDetails(const std::string& service,
+ const std::string& token)
+ : service_(service), token_(token) {}
+ const std::string& service() const { return service_; }
+ const std::string& token() const { return token_; }
+ private:
+ std::string service_;
+ std::string token_;
+ };
+
+ class TokenRequestFailedDetails {
+ public:
+ TokenRequestFailedDetails()
+ : error_(GoogleServiceAuthError::NONE) {}
+ TokenRequestFailedDetails(const std::string& service,
+ const GoogleServiceAuthError& error)
+ : service_(service), error_(error) {}
+ const std::string& service() const { return service_; }
+ const GoogleServiceAuthError& error() const { return error_; }
+ private:
+ std::string service_;
+ GoogleServiceAuthError error_;
+ };
+
+ // Initialize this token service with a request source
+ // (usually from a AuthenticationConsumer constant), and the profile.
+ // Typically you'd then update the credentials.
+ void Initialize(const char* const source, Profile* profile);
+
+ // Update the credentials in the token service.
+ // Afterwards you can StartFetchingTokens.
+ void UpdateCredentials(
+ AuthenticationConsumer::AuthenticationResult* credentials);
+
+ // Terminate any running requests and reset the AuthenticationService to a
+ // clean slate. Resets in memory structures. Does not modify the DB.
+ // When this is done, no tokens will be left in memory and no
+ // user credentials will be left. Useful if a user is logging out.
+ // Initialize doesn't need to be called again but UpdateCredentials does.
+ void ResetCredentialsInMemory();
+
+ // Async load all tokens for services we know of from the DB.
+ // You should do this at startup. Optionally you can do it again
+ // after you reset in memory credentials.
+ void LoadTokensFromDB();
+
+ // Clear all DB stored tokens for the current profile. Tokens may still be
+ // available in memory. If a DB load is pending it may still be serviced.
+ void EraseTokensFromDB();
+
+ // For legacy services with their own auth routines, they can just read
+ // the LSID out directly. Deprecated.
+ bool HasLsid() const;
+ const std::string& GetLsid() const;
+ // Did we get a proper LSID?
+ bool AreCredentialsValid() const;
+
+ // Tokens will be fetched for all services(sync, talk) in the background.
+ // Results come back via event channel. Services can also poll before events
+ // are issued.
+ void StartFetchingTokens();
+ bool HasTokenForService(const char* const service) const;
+ const std::string& GetTokenForService(const char* const service) const;
+
+ // For tests only. Doesn't save to the WebDB.
+ void IssueAuthTokenForTest(const std::string& service,
+ const std::string& auth_token);
+
+ // AuthenticationConsumer implementation.
+ virtual void OnIssueAuthTokenSuccess(const std::string& service,
+ const std::string& auth_token);
+ virtual void OnIssueAuthTokenFailure(const std::string& service,
+ const GoogleServiceAuthError& error);
+
+ // WebDataServiceConsumer implementation.
+ virtual void OnWebDataServiceRequestDone(WebDataService::Handle h,
+ const WDTypedResult* result);
+
+ // NotificationObserver implementation.
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ private:
+
+ void FireTokenAvailableNotification(const std::string& service,
+ const std::string& auth_token);
+
+ void FireTokenRequestFailedNotification(const std::string& service,
+ const GoogleServiceAuthError& error);
+
+ void LoadTokensIntoMemory(const std::map<std::string, std::string>& in_toks,
+ std::map<std::string, std::string>* out_toks);
+
+ void SaveAuthTokenToDB(const std::string& service,
+ const std::string& auth_token);
+
+ // Web data service to access tokens from.
+ scoped_refptr<WebDataService> web_data_service_;
+ // Getter to use for fetchers.
+ scoped_refptr<net::URLRequestContextGetter> getter_;
+ // Request handle to load Gaia tokens from DB.
+ WebDataService::Handle token_loading_query_;
+
+ // Gaia request source for Gaia accounting.
+ std::string source_;
+ // Credentials from authentication for Issuing auth tokens.
+ scoped_ptr<AuthenticationConsumer::AuthenticationResult> credentials_;
+
+ // Size of array of services (must be defined here).
+ static const int kNumServices = 4;
+ // List of services that we're performing operations for.
+ static const char* kServices[kNumServices];
+ // A bunch of fetchers suitable for token issuing. We don't care about
+ // the ordering, nor do we care which is for which service.
+ scoped_ptr<AuthenticationFetcher> fetchers_[kNumServices];
+ // Map from service to token.
+ std::map<std::string, std::string> token_map_;
+
+ NotificationRegistrar registrar_;
+
+ FRIEND_TEST_ALL_PREFIXES(AuthenticationServiceTest,
+ LoadTokensIntoMemoryBasic);
+ FRIEND_TEST_ALL_PREFIXES(AuthenticationServiceTest,
+ LoadTokensIntoMemoryAdvanced);
+
+ DISALLOW_COPY_AND_ASSIGN(AuthenticationService);
+};
+
+#endif // CHROME_BROWSER_NET_GAIA_AUTHENTICATION_SERVICE_H_
« no previous file with comments | « no previous file | chrome/browser/net/gaia/authentication_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698