1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/webdata/token_service_table.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/encryptor.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TokenServiceTable::Init() { 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("token_service")) { 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE token_service (" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "service VARCHAR PRIMARY KEY NOT NULL," 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "encrypted_token BLOB)")) { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TokenServiceTable::IsSyncable() { 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TokenServiceTable::RemoveAllTokens() { 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM token_service")); 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Run(); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TokenServiceTable::SetTokenForService(const std::string& service, 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& token) { 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't bother with a cached statement since this will be a relatively 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // infrequent operation. 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT OR REPLACE INTO token_service " 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "(service, encrypted_token) VALUES (?, ?)")); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string encrypted_token; 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool encrypted = Encryptor::EncryptString(token, &encrypted_token); 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!encrypted) { 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, service); 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindBlob(1, encrypted_token.data(), 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(encrypted_token.length())); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Run(); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool TokenServiceTable::GetAllTokens( 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::map<std::string, std::string>* tokens) { 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT service, encrypted_token FROM token_service")); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string encrypted_token; 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string decrypted_token; 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string service; 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service = s.ColumnString(0); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool entry_ok = !service.empty() && 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.ColumnBlobAsString(1, &encrypted_token); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (entry_ok) { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Encryptor::DecryptString(encrypted_token, &decrypted_token); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (*tokens)[service] = decrypted_token; 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93