// 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; }