Index: chrome/browser/sync/engine/auth_watcher.h |
=================================================================== |
--- chrome/browser/sync/engine/auth_watcher.h (revision 58702) |
+++ chrome/browser/sync/engine/auth_watcher.h (working copy) |
@@ -1,222 +0,0 @@ |
-// Copyright (c) 2010 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. |
-// |
-// AuthWatcher watches authentication events and user open and close |
-// events and accordingly opens and closes shares. |
- |
-#ifndef CHROME_BROWSER_SYNC_ENGINE_AUTH_WATCHER_H_ |
-#define CHROME_BROWSER_SYNC_ENGINE_AUTH_WATCHER_H_ |
-#pragma once |
- |
-#include <string> |
- |
-#include "base/gtest_prod_util.h" |
-#include "base/message_loop_proxy.h" |
-#include "base/ref_counted.h" |
-#include "base/scoped_ptr.h" |
-#include "base/thread.h" |
-#include "chrome/browser/sync/protocol/service_constants.h" |
-#include "chrome/common/deprecated/event_sys.h" |
-#include "chrome/common/net/gaia/gaia_authenticator.h" |
- |
-namespace syncable { |
-struct DirectoryManagerEvent; |
-class DirectoryManager; |
-} |
- |
-namespace browser_sync { |
- |
-class AuthWatcher; |
-class ServerConnectionManager; |
-class URLFactory; |
-class UserSettings; |
-struct ServerConnectionEvent; |
- |
-struct AuthWatcherEvent { |
- enum WhatHappened { |
- AUTHENTICATION_ATTEMPT_START, |
- AUTHWATCHER_DESTROYED, |
- AUTH_RENEWED, // Currently only used in testing. |
- AUTH_SUCCEEDED, |
- GAIA_AUTH_FAILED, |
- SERVICE_USER_NOT_SIGNED_UP, |
- SERVICE_AUTH_FAILED, |
- SERVICE_CONNECTION_FAILED, |
- // Used in a safety check in AuthWatcher::AuthenticateWithToken() |
- ILLEGAL_VALUE, |
- }; |
- WhatHappened what_happened; |
- const gaia::GaiaAuthenticator::AuthResults* auth_results; |
- // use AuthWatcherEvent as its own traits type in hookups. |
- typedef AuthWatcherEvent EventType; |
- static inline bool IsChannelShutdownEvent(const AuthWatcherEvent& event) { |
- return event.what_happened == AUTHWATCHER_DESTROYED; |
- } |
- |
- // Used for AUTH_SUCCEEDED/AUTH_RENEWED notification. |
- std::string user_email; |
- // May be empty if we're only locally authenticated. |
- std::string auth_token; |
- |
- // How was this auth attempt initiated? |
- enum AuthenticationTrigger { |
- USER_INITIATED = 0, // default value. |
- EXPIRED_CREDENTIALS, |
- }; |
- |
- AuthenticationTrigger trigger; |
-}; |
- |
-// The mother-class of Authentication for the sync backend. Handles both gaia |
-// and sync service authentication via asynchronous Authenticate* methods, |
-// raising AuthWatcherEvents on success/failure. The implementation currently |
-// runs its own backend thread for the actual auth processing, which means |
-// the AuthWatcherEvents can be raised on a different thread than the one that |
-// invoked authentication. |
-class AuthWatcher : public base::RefCountedThreadSafe<AuthWatcher> { |
- friend class AuthWatcherTest; |
- FRIEND_TEST_ALL_PREFIXES(AuthWatcherTest, Construction); |
- public: |
- // Normal progression is local -> gaia -> token. |
- enum Status { LOCALLY_AUTHENTICATED, GAIA_AUTHENTICATED, NOT_AUTHENTICATED }; |
- typedef syncable::DirectoryManagerEvent DirectoryManagerEvent; |
- typedef syncable::DirectoryManager DirectoryManager; |
- |
- AuthWatcher(DirectoryManager* dirman, |
- ServerConnectionManager* scm, |
- const std::string& user_agent, |
- const std::string& service_id, |
- const std::string& gaia_url, |
- UserSettings* user_settings, |
- gaia::GaiaAuthenticator* gaia_auth); |
- ~AuthWatcher(); |
- |
- typedef EventChannel<AuthWatcherEvent, Lock> Channel; |
- |
- inline Channel* channel() const { |
- return channel_.get(); |
- } |
- |
- // The following 3 flavors of authentication routines are asynchronous and can |
- // be called from any thread. |
- // If |captcha_value| is specified but |captcha_token| is not, this will |
- // attempt authentication using the last observed captcha token out of |
- // convenience in the common case so the token doesn't have to be plumbed |
- // everywhere. |
- void Authenticate(const std::string& email, const std::string& password, |
- const std::string& captcha_token, const std::string& captcha_value); |
- |
- void Authenticate(const std::string& email, const std::string& password, |
- bool persist_creds_to_disk) { |
- Authenticate(email, password, "", ""); |
- } |
- |
- // Use this to update only the token of the current email address. |
- void RenewAuthToken(const std::string& updated_token); |
- |
- // Use this version when you don't need the gaia authentication step because |
- // you already have a valid LSID cookie for |gaia_email|. |
- void AuthenticateWithLsid(const std::string& lsid); |
- |
- // Use this version when you don't need the gaia authentication step because |
- // you already have a valid token for |gaia_email|. |
- void AuthenticateWithToken(const std::string& gaia_email, |
- const std::string& auth_token); |
- |
- // Joins on the backend thread. The AuthWatcher is useless after this and |
- // should be destroyed. |
- void Shutdown() { auth_backend_thread_.Stop(); } |
- |
- std::string email() const; |
- syncable::DirectoryManager* dirman() const { return dirman_; } |
- ServerConnectionManager* scm() const { return scm_; } |
- UserSettings* settings() const { return user_settings_; } |
- Status status() const { return (Status)status_; } |
- |
- private: |
- void ClearAuthenticationData(); |
- |
- void NotifyAuthChanged(const std::string& email, |
- const std::string& auth_token, |
- bool renewed); |
- void HandleServerConnectionEvent(const ServerConnectionEvent& event); |
- |
- void SaveUserSettings(const std::string& username, |
- const std::string& auth_token); |
- |
- MessageLoop* message_loop() { return auth_backend_thread_.message_loop(); } |
- |
- base::MessageLoopProxy* message_loop_proxy() { |
- return loop_proxy_; |
- } |
- |
- void DoRenewAuthToken(const std::string& updated_token); |
- |
- // These two helpers should only be called from the auth function. |
- // Called when authentication with gaia succeeds, to save credential info. |
- void PersistCredentials(); |
- // Called when authentication with gaia fails. |
- void ProcessGaiaAuthFailure(); |
- |
- // Just checks that the user has at least one local share cache. |
- bool AuthenticateLocally(std::string email); |
- // Also checks the user's password against stored password hash. |
- bool AuthenticateLocally(std::string email, const std::string& password); |
- |
- // Sets the trigger member of the event and sends the event on channel_. |
- void NotifyListeners(AuthWatcherEvent* event); |
- |
- inline std::string FormatAsEmailAddress(const std::string& email) const { |
- std::string mail(email); |
- if (email.find('@') == std::string::npos) { |
- mail.push_back('@'); |
- // TODO(chron): Should this be done only at the UI level? |
- mail.append(DEFAULT_SIGNIN_DOMAIN); |
- } |
- return mail; |
- } |
- |
- // A struct to marshal various data across to the auth_backend_thread_ on |
- // Authenticate() and AuthenticateWithToken calls. |
- struct AuthRequest { |
- std::string email; |
- std::string password; |
- std::string auth_token; |
- std::string captcha_token; |
- std::string captcha_value; |
- bool persist_creds_to_disk; |
- AuthWatcherEvent::AuthenticationTrigger trigger; |
- }; |
- |
- // The public interface Authenticate methods are proxies to these, which |
- // can only be called from |auth_backend_thread_|. |
- void DoAuthenticate(const AuthRequest& request); |
- void DoAuthenticateWithLsid(const std::string& lsid); |
- void DoAuthenticateWithToken(const std::string& email, |
- const std::string& auth_token); |
- |
- // The public HandleServerConnectionEvent method proxies to this method, which |
- // can only be called on |auth_backend_thread_|. |
- void DoHandleServerConnectionEvent( |
- const ServerConnectionEvent& event, |
- const std::string& auth_token_snapshot); |
- |
- scoped_ptr<gaia::GaiaAuthenticator> const gaia_; |
- syncable::DirectoryManager* const dirman_; |
- ServerConnectionManager* const scm_; |
- scoped_ptr<EventListenerHookup> connmgr_hookup_; |
- Status status_; |
- UserSettings* const user_settings_; |
- scoped_ptr<Channel> channel_; |
- |
- base::Thread auth_backend_thread_; |
- scoped_refptr<base::MessageLoopProxy> loop_proxy_; |
- |
- AuthWatcherEvent::AuthenticationTrigger current_attempt_trigger_; |
- DISALLOW_COPY_AND_ASSIGN(AuthWatcher); |
-}; |
- |
-} // namespace browser_sync |
- |
-#endif // CHROME_BROWSER_SYNC_ENGINE_AUTH_WATCHER_H_ |