// Copyright (c) 2011 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.
#include "chrome/browser/webdata/token_service_table.h"
#include <map>
#include <string>
#include "app/sql/statement.h"
#include "base/logging.h"
#include "chrome/browser/password_manager/encryptor.h"
bool TokenServiceTable::Init() {
if (!db_->DoesTableExist("token_service")) {
if (!db_->Execute("CREATE TABLE token_service ("
"service VARCHAR PRIMARY KEY NOT NULL,"
"encrypted_token BLOB)")) {
NOTREACHED();
return false;
}
}
return true;
}
bool TokenServiceTable::IsSyncable() {
return true;
}
bool TokenServiceTable::RemoveAllTokens() {
sql::Statement s(db_->GetUniqueStatement(
"DELETE FROM token_service"));
if (!s) {
NOTREACHED() << "Statement prepare failed";
return false;
}
return s.Run();
}
bool TokenServiceTable::SetTokenForService(const std::string& service,
const std::string& token) {
// Don't bother with a cached statement since this will be a relatively
// infrequent operation.
sql::Statement s(db_->GetUniqueStatement(
"INSERT OR REPLACE INTO token_service "
"(service, encrypted_token) VALUES (?, ?)"));
if (!s) {
NOTREACHED() << "Statement prepare failed";
return false;
}
std::string encrypted_token;
bool encrypted = Encryptor::EncryptString(token, &encrypted_token);
if (!encrypted) {
return false;
}
s.BindString(0, service);
s.BindBlob(1, encrypted_token.data(),
static_cast<int>(encrypted_token.length()));
return s.Run();
}
bool TokenServiceTable::GetAllTokens(
std::map<std::string, std::string>* tokens) {
sql::Statement s(db_->GetUniqueStatement(
"SELECT service, encrypted_token FROM token_service"));
if (!s) {
NOTREACHED() << "Statement prepare failed";
return false;
}
while (s.Step()) {
std::string encrypted_token;
std::string decrypted_token;
std::string service;
service = s.ColumnString(0);
bool entry_ok = !service.empty() &&
s.ColumnBlobAsString(1, &encrypted_token);
if (entry_ok) {
Encryptor::DecryptString(encrypted_token, &decrypted_token);
(*tokens)[service] = decrypted_token;
} else {
NOTREACHED();
return false;
}
}
return true;
}