// 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. #ifndef CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_ #define CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_ #pragma once #include <map> #include <string> #include "base/synchronization/lock.h" #include "build/build_config.h" extern "C" struct sqlite3; class FilePath; namespace browser_sync { void ExecOrDie(sqlite3* dbhandle, const char *query); std::string APEncode(const std::string& in); std::string APDecode(const std::string& in); class URLFactory; class UserSettings { public: // db_path is used for the main user settings. // passwords_file contains hashes of passwords. UserSettings(); ~UserSettings(); // Returns false (failure) if the db is a newer version. bool Init(const FilePath& settings_path); void StoreHashedPassword(const std::string& email, const std::string& password); bool VerifyAgainstStoredHash(const std::string& email, const std::string& password); // Set the username. void SwitchUser(const std::string& email); // Saves the email address and the named service token for the given user. // Call this multiple times with the same email parameter to save multiple // service tokens. void SetAuthTokenForService(const std::string& email, const std::string& service_name, const std::string& long_lived_service_token); // Erases all saved service tokens. void ClearAllServiceTokens(); // Returns the user name whose credentials have been persisted. bool GetLastUser(std::string* username); // Returns the user name whose credentials have been persisted as well as a // service token for the named service bool GetLastUserAndServiceToken(const std::string& service_name, std::string* username, std::string* service_token); void RemoveAllGuestSettings(); void StoreEmailForSignin(const std::string& signin, const std::string& primary_email); // Multiple email addresses can map to the same Google Account. This method // returns the primary Google Account email associated with |signin|, which // is used as both input and output. bool GetEmailForSignin(std::string* signin); std::string email() const; // Get a unique ID suitable for use as the client ID. This ID has the // lifetime of the user settings database. You may use this ID if your // operating environment does not provide its own unique client ID. std::string GetClientId(); protected: struct ScopedDBHandle { explicit ScopedDBHandle(UserSettings* settings); inline sqlite3* get() const { return *handle_; } base::AutoLock mutex_lock_; sqlite3** const handle_; }; friend struct ScopedDBHandle; friend class URLFactory; void MigrateOldVersionsAsNeeded(sqlite3* const handle, int current_version); private: std::string email_; mutable base::Lock mutex_; // protects email_. // We keep a single dbhandle. sqlite3* dbhandle_; base::Lock dbhandle_mutex_; // TODO(sync): Use in-memory cache for service auth tokens on posix. // Have someone competent in Windows switch it over to not use Sqlite in the // future. #ifndef OS_WIN typedef std::map<std::string, std::string> ServiceTokenMap; ServiceTokenMap service_tokens_; #endif // OS_WIN DISALLOW_COPY_AND_ASSIGN(UserSettings); }; } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_