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