1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/webdata/token_service_table.h"
10 #include "base/logging.h"
11 #include "components/webdata/common/web_database.h"
12 #include "components/webdata/encryptor/encryptor.h"
13 #include "sql/statement.h"
17 WebDatabaseTable::TypeKey GetKey() {
18 // We just need a unique constant. Use the address of a static that
19 // COMDAT folding won't touch in an optimizing linker.
20 static int table_key = 0;
21 return reinterpret_cast<void*>(&table_key);
26 TokenServiceTable* TokenServiceTable::FromWebDatabase(WebDatabase* db) {
27 return static_cast<TokenServiceTable*>(db->GetTable(GetKey()));
31 WebDatabaseTable::TypeKey TokenServiceTable::GetTypeKey() const {
35 bool TokenServiceTable::Init(sql::Connection* db, sql::MetaTable* meta_table) {
36 WebDatabaseTable::Init(db, meta_table);
37 if (!db_->DoesTableExist("token_service")) {
38 if (!db_->Execute("CREATE TABLE token_service ("
39 "service VARCHAR PRIMARY KEY NOT NULL,"
40 "encrypted_token BLOB)")) {
48 bool TokenServiceTable::IsSyncable() {
52 bool TokenServiceTable::MigrateToVersion(int version,
53 bool* update_compatible_version) {
57 bool TokenServiceTable::RemoveAllTokens() {
58 sql::Statement s(db_->GetUniqueStatement(
59 "DELETE FROM token_service"));
64 bool TokenServiceTable::RemoveTokenForService(const std::string& service) {
65 sql::Statement s(db_->GetUniqueStatement(
66 "DELETE FROM token_service WHERE service = ?"));
67 s.BindString(0, service);
72 bool TokenServiceTable::SetTokenForService(const std::string& service,
73 const std::string& token) {
74 std::string encrypted_token;
75 bool encrypted = Encryptor::EncryptString(token, &encrypted_token);
80 // Don't bother with a cached statement since this will be a relatively
81 // infrequent operation.
82 sql::Statement s(db_->GetUniqueStatement(
83 "INSERT OR REPLACE INTO token_service "
84 "(service, encrypted_token) VALUES (?, ?)"));
85 s.BindString(0, service);
86 s.BindBlob(1, encrypted_token.data(),
87 static_cast<int>(encrypted_token.length()));
92 bool TokenServiceTable::GetAllTokens(
93 std::map<std::string, std::string>* tokens) {
94 sql::Statement s(db_->GetUniqueStatement(
95 "SELECT service, encrypted_token FROM token_service"));
101 std::string encrypted_token;
102 std::string decrypted_token;
104 service = s.ColumnString(0);
105 bool entry_ok = !service.empty() &&
106 s.ColumnBlobAsString(1, &encrypted_token);
108 Encryptor::DecryptString(encrypted_token, &decrypted_token);
109 (*tokens)[service] = decrypted_token;