// 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_