13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochextern "C" struct sqlite3; 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass FilePath; 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExecOrDie(sqlite3* dbhandle, const char *query); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string APEncode(const std::string& in); 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string APDecode(const std::string& in); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLFactory; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserSettings { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // db_path is used for the main user settings. 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passwords_file contains hashes of passwords. 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserSettings(); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~UserSettings(); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns false (failure) if the db is a newer version. 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool Init(const FilePath& settings_path); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StoreHashedPassword(const std::string& email, 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& password); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool VerifyAgainstStoredHash(const std::string& email, 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& password); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the username. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SwitchUser(const std::string& email); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Saves the email address and the named service token for the given user. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Call this multiple times with the same email parameter to save multiple 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // service tokens. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetAuthTokenForService(const std::string& email, 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& service_name, 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& long_lived_service_token); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Erases all saved service tokens. 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ClearAllServiceTokens(); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the user name whose credentials have been persisted. 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetLastUser(std::string* username); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the user name whose credentials have been persisted as well as a 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // service token for the named service 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetLastUserAndServiceToken(const std::string& service_name, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* username, 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* service_token); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveAllGuestSettings(); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StoreEmailForSignin(const std::string& signin, 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& primary_email); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Multiple email addresses can map to the same Google Account. This method 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns the primary Google Account email associated with |signin|, which 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is used as both input and output. 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetEmailForSignin(std::string* signin); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string email() const; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get a unique ID suitable for use as the client ID. This ID has the 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // lifetime of the user settings database. You may use this ID if your 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operating environment does not provide its own unique client ID. 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string GetClientId(); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct ScopedDBHandle { 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ScopedDBHandle(UserSettings* settings); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch inline sqlite3* get() const { return *handle_; } 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock mutex_lock_; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sqlite3** const handle_; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend struct ScopedDBHandle; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class URLFactory; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MigrateOldVersionsAsNeeded(sqlite3* const handle, int current_version); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string email_; 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mutable base::Lock mutex_; // protects email_. 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We keep a single dbhandle. 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sqlite3* dbhandle_; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Lock dbhandle_mutex_; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(sync): Use in-memory cache for service auth tokens on posix. 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Have someone competent in Windows switch it over to not use Sqlite in the 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // future. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef OS_WIN 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<std::string, std::string> ServiceTokenMap; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ServiceTokenMap service_tokens_; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // OS_WIN 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(UserSettings); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_UTIL_USER_SETTINGS_H_ 113