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