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