190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/webdata/token_web_data.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/stl_util.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/webdata/token_service_table.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/webdata/common/web_database_service.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using base::Bind;
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using base::Time;
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using content::BrowserThread;
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TokenWebDataBackend
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : public base::RefCountedThreadSafe<TokenWebDataBackend,
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        BrowserThread::DeleteOnDBThread> {
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TokenWebDataBackend() {
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebDatabase::State RemoveAllTokens(WebDatabase* db) {
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (TokenServiceTable::FromWebDatabase(db)->RemoveAllTokens()) {
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return WebDatabase::COMMIT_NEEDED;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return WebDatabase::COMMIT_NOT_NEEDED;
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  WebDatabase::State RemoveTokenForService(
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& service, WebDatabase* db) {
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (TokenServiceTable::FromWebDatabase(db)
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            ->RemoveTokenForService(service)) {
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return WebDatabase::COMMIT_NEEDED;
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return WebDatabase::COMMIT_NOT_NEEDED;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebDatabase::State SetTokenForService(
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const std::string& service, const std::string& token, WebDatabase* db) {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (TokenServiceTable::FromWebDatabase(db)->SetTokenForService(service,
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                                   token)) {
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return WebDatabase::COMMIT_NEEDED;
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return WebDatabase::COMMIT_NOT_NEEDED;
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<WDTypedResult> GetAllTokens(WebDatabase* db) {
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::map<std::string, std::string> map;
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TokenServiceTable::FromWebDatabase(db)->GetAllTokens(&map);
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return scoped_ptr<WDTypedResult>(
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        new WDResult<std::map<std::string, std::string> >(TOKEN_RESULT, map));
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~TokenWebDataBackend() {
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend struct BrowserThread::DeleteOnThread<BrowserThread::DB>;
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::DeleteHelper<TokenWebDataBackend>;
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // We have to friend RCTS<> so WIN shared-lib build is happy
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // (http://crbug/112250).
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::RefCountedThreadSafe<TokenWebDataBackend,
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          BrowserThread::DeleteOnDBThread>;
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TokenWebData::TokenWebData(scoped_refptr<WebDatabaseService> wdbs,
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               const ProfileErrorCallback& callback)
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebDataServiceBase(wdbs, callback,
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      token_backend_(new TokenWebDataBackend()) {
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TokenWebData::SetTokenForService(const std::string& service,
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      const std::string& token) {
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Bind(&TokenWebDataBackend::SetTokenForService, token_backend_,
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           service, token));
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TokenWebData::RemoveAllTokens() {
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Bind(&TokenWebDataBackend::RemoveAllTokens, token_backend_));
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TokenWebData::RemoveTokenForService(const std::string& service) {
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      Bind(&TokenWebDataBackend::RemoveTokenForService, token_backend_,
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)           service));
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Null on failure. Success is WDResult<std::string>
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WebDataServiceBase::Handle TokenWebData::GetAllTokens(
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Bind(&TokenWebDataBackend::GetAllTokens, token_backend_), consumer);
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TokenWebData::TokenWebData()
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebDataServiceBase(NULL, ProfileErrorCallback(),
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      token_backend_(new TokenWebDataBackend()) {
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TokenWebData::~TokenWebData() {
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
111