1731df977c0511bca2206b5f333555b1205ff1f43Iain 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// Implement the storage of service tokens in memory.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/util/user_settings.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/logging.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/encryptor.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/sqlite_utils.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UserSettings::SetAuthTokenForService(
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& email,
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& service_name,
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& long_lived_service_token) {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Saving auth token " << long_lived_service_token
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          << " for " << email << "for service " << service_name;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string encrypted_service_token;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!Encryptor::EncryptString(long_lived_service_token,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                &encrypted_service_token)) {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(ERROR) << "Encrytion failed: " << long_lived_service_token;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedDBHandle dbhandle(this);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SQLStatement statement;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  statement.prepare(dbhandle.get(),
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    "INSERT INTO cookies "
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    "(email, service_name, service_token) "
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    "values (?, ?, ?)");
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  statement.bind_string(0, email);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  statement.bind_string(1, service_name);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  statement.bind_blob(2, encrypted_service_token.data(),
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         encrypted_service_token.size());
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (SQLITE_DONE != statement.step()) {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(FATAL) << sqlite3_errmsg(dbhandle.get());
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UserSettings::GetLastUserAndServiceToken(const std::string& service_name,
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                              std::string* username,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                              std::string* service_token) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedDBHandle dbhandle(this);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SQLStatement query;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  query.prepare(dbhandle.get(),
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                "SELECT email, service_token FROM cookies"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                " WHERE service_name = ?");
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  query.bind_string(0, service_name.c_str());
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (SQLITE_ROW == query.step()) {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string encrypted_service_token;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    query.column_blob_as_string(1, &encrypted_service_token);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!Encryptor::DecryptString(encrypted_service_token, service_token)) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Decryption failed: " << encrypted_service_token;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *username = query.column_string(0);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Found service token for:" << *username << " @ " << service_name
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            << " returning: " << *service_token;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Couldn't find service token for " << service_name;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser_sync
75