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

Unified Diff: chrome/browser/sync/engine/auth_watcher.h

Issue 194065: Initial commit of sync engine code to browser/sync.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fixes to gtest include path, reverted syncapi. Created 11 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/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

Powered by Google App Engine
This is Rietveld 408576698