Index: chrome/browser/sync/engine/auth_watcher.h |
=================================================================== |
--- chrome/browser/sync/engine/auth_watcher.h (revision 0) |
+++ chrome/browser/sync/engine/auth_watcher.h (revision 0) |
@@ -0,0 +1,204 @@ |
+// Copyright (c) 2006-2009 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_ |
+ |
+#include <map> |
+#include <string> |
+ |
+#include "base/atomicops.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/browser/sync/engine/net/gaia_authenticator.h" |
+#include "chrome/browser/sync/util/event_sys.h" |
+#include "chrome/browser/sync/util/pthread_helpers.h" |
+#include "chrome/browser/sync/util/sync_types.h" |
+ |
+namespace syncable { |
+struct DirectoryManagerEvent; |
+class DirectoryManager; |
+} |
+ |
+namespace browser_sync { |
+class AllStatus; |
+class AuthWatcher; |
+class ServerConnectionManager; |
+class TalkMediator; |
+class URLFactory; |
+class UserSettings; |
+struct ServerConnectionEvent; |
+ |
+struct AuthWatcherEvent { |
+ enum WhatHappened { |
+ AUTHENTICATION_ATTEMPT_START, |
+ AUTHWATCHER_DESTROYED, |
+ 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 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 notification |
+ std::string user_email; |
+ |
+ // How was this auth attempt initiated? |
+ enum AuthenticationTrigger { |
+ USER_INITIATED = 0, // default value. |
+ EXPIRED_CREDENTIALS, |
+ }; |
+ |
+ AuthenticationTrigger trigger; |
+}; |
+ |
+class AuthWatcher { |
+ public: |
+ // Normal progression is local -> gaia -> token |
+ enum Status { LOCALLY_AUTHENTICATED, GAIA_AUTHENTICATED, NOT_AUTHENTICATED }; |
+ typedef syncable::DirectoryManagerEvent DirectoryManagerEvent; |
+ typedef syncable::DirectoryManager DirectoryManager; |
+ typedef TalkMediator TalkMediator; |
+ |
+ AuthWatcher(DirectoryManager* dirman, |
+ ServerConnectionManager* scm, |
+ AllStatus* allstatus, |
+ const std::string& user_agent, |
+ const std::string& service_id, |
+ const std::string& gaia_url, |
+ UserSettings* user_settings, |
+ GaiaAuthenticator* gaia_auth, |
+ TalkMediator* talk_mediator); |
+ ~AuthWatcher(); |
+ |
+ // Returns true if the open share has gotten zero |
+ // updates from the sync server (initial sync complete.) |
+ bool LoadDirectoryListAndOpen(const PathString& login); |
+ |
+ typedef EventChannel<AuthWatcherEvent, PThreadMutex> Channel; |
+ |
+ inline Channel* channel() const { |
+ return channel_.get(); |
+ } |
+ |
+ void Authenticate(const std::string& email, const std::string& password, |
+ const std::string& captcha_token, const std::string& captcha_value, |
+ bool persist_creds_to_disk); |
+ |
+ void Authenticate(const std::string& email, const std::string& password, |
+ bool persist_creds_to_disk) { |
+ Authenticate(email, password, "", "", persist_creds_to_disk); |
+ } |
+ |
+ // Retrieves an auth token for a named service for which a long-lived token |
+ // was obtained at login time. Returns true if a long-lived token can be |
+ // found, false otherwise. |
+ bool GetAuthTokenForService(const std::string& service_name, |
+ std::string* service_token); |
+ |
+ std::string email() const; |
+ syncable::DirectoryManager* dirman() const { return dirman_; } |
+ ServerConnectionManager* scm() const { return scm_; } |
+ AllStatus* allstatus() const { return allstatus_; } |
+ UserSettings* settings() const { return user_settings_; } |
+ Status status() const { return (Status)status_; } |
+ |
+ void Logout(); |
+ |
+ // For synchronizing other destructors. |
+ void WaitForAuthThreadFinish(); |
+ |
+ protected: |
+ void Reset(); |
+ void ClearAuthenticationData(); |
+ |
+ void NotifyAuthSucceeded(const std::string& email); |
+ bool StartNewAuthAttempt(const std::string& email, |
+ const std::string& password, |
+ const std::string& auth_token, const std::string& captcha_token, |
+ const std::string& captcha_value, bool persist_creds_to_disk, |
+ AuthWatcherEvent::AuthenticationTrigger trigger); |
+ void HandleServerConnectionEvent(const ServerConnectionEvent& event); |
+ |
+ void SaveUserSettings(const std::string& username, |
+ const std::string& auth_token, |
+ const bool save_credentials); |
+ |
+ // These two helpers should only be called from the auth function. |
+ // returns false iff we had problems and should try GAIA_AUTH again. |
+ bool ProcessGaiaAuthSuccess(); |
+ 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); |
+ |
+ const std::string& sync_service_token() const { return sync_service_token_; } |
+ |
+ public: |
+ bool AuthenticateWithToken(const std::string& email, |
+ const std::string& auth_token); |
+ |
+ protected: |
+ typedef PThreadScopedLock<PThreadMutex> MutexLock; |
+ |
+ // Passed to newly created threads. |
+ struct ThreadParams { |
+ AuthWatcher* self; |
+ 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; |
+ }; |
+ |
+ // Initial function passed to pthread_create. |
+ static void* AuthenticationThreadStartRoutine(void* arg); |
+ // Member function called by AuthenticationThreadStartRoutine. |
+ void* AuthenticationThreadMain(struct ThreadParams* arg); |
+ |
+ scoped_ptr<GaiaAuthenticator> const gaia_; |
+ syncable::DirectoryManager* const dirman_; |
+ ServerConnectionManager* const scm_; |
+ scoped_ptr<EventListenerHookup> connmgr_hookup_; |
+ AllStatus* const allstatus_; |
+ // TODO(chron): It is incorrect to make assignments to AtomicWord. |
+ volatile base::subtle::AtomicWord status_; |
+ UserSettings* user_settings_; |
+ TalkMediator* talk_mediator_; // Interface to the notifications engine. |
+ scoped_ptr<Channel> channel_; |
+ |
+ // We store our service token in memory as a workaround to the fact that we |
+ // don't persist it when the user unchecks "remember me". |
+ // We also include it on outgoing requests. |
+ std::string sync_service_token_; |
+ |
+ PThreadMutex mutex_; |
+ // All members below are protected by the above mutex |
+ pthread_t thread_; |
+ bool thread_handle_valid_; |
+ bool authenticating_now_; |
+ AuthWatcherEvent::AuthenticationTrigger current_attempt_trigger_; |
+}; |
+ |
+} // namespace browser_sync |
+ |
+#endif // CHROME_BROWSER_SYNC_ENGINE_AUTH_WATCHER_H_ |
Property changes on: chrome\browser\sync\engine\auth_watcher.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |