14311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 24311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 34311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// found in the LICENSE file. 44311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 54311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#ifndef CONTENT_BROWSER_MEDIA_WEBRTC_IDENTITY_STORE_BACKEND_H_ 64311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#define CONTENT_BROWSER_MEDIA_WEBRTC_IDENTITY_STORE_BACKEND_H_ 74311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 84311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include <map> 94311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include <string> 104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/time/time.h" 124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "sql/connection.h" 134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "sql/meta_table.h" 144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass GURL; 164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochnamespace base { 184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass FilePath; 194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} // namespace base 204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochnamespace quota { 224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass SpecialStoragePolicy; 234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} // namespace quota 244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochnamespace content { 264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// This class represents a persistent cache of WebRTC identities. 284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// It can be created/destroyed/Close() on any thread. All other members should 294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// be accessed on the IO thread. 304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass WebRTCIdentityStoreBackend 314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch : public base::RefCountedThreadSafe<WebRTCIdentityStoreBackend> { 324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch public: 334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch typedef base::Callback<void(int error, 344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& certificate, 354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& private_key)> 364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch FindIdentityCallback; 374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // No data is saved on disk if |path| is empty. 394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch WebRTCIdentityStoreBackend(const base::FilePath& path, 404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch quota::SpecialStoragePolicy* policy); 414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Finds the identity with |origin|, |identity_name|, and |common_name| from 434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // the DB. 444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |origin| is the origin of the identity; 454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |identity_name| is used to identify an identity within an origin; 464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |common_name| is the common name used to generate the certificate; 474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |callback| is the callback to return the find result. 484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Returns true if |callback| will be called. 494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Should be called on the IO thread. 504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool FindIdentity(const GURL& origin, 514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& identity_name, 524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& common_name, 534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const FindIdentityCallback& callback); 544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Adds the identity to the DB and overwrites any existing identity having the 564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // same origin and identity_name. 574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |origin| is the origin of the identity; 584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |identity_name| is used to identify an identity within an origin; 594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |common_name| is the common name used to generate the certificate; 604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |certificate| is the DER string of the certificate; 614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // |private_key| is the DER string of the private key. 624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Should be called on the IO thread. 634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch void AddIdentity(const GURL& origin, 644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& identity_name, 654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& common_name, 664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& certificate, 674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& private_key); 684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Commits all pending DB operations and closes the DB connection. Any API 704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // call after this will fail. 714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Can be called on any thread. 724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch void Close(); 734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Delete the data created between |delete_begin| and |delete_end|. 754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Should be called on the IO thread. 764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch void DeleteBetween(base::Time delete_begin, 774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Time delete_end, 784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const base::Closure& callback); 794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch private: 814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch friend class base::RefCountedThreadSafe<WebRTCIdentityStoreBackend>; 824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch class SqlLiteStorage; 834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enum LoadingState { 844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NOT_STARTED, 854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch LOADING, 864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch LOADED, 874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch CLOSED, 884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch }; 894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch struct PendingFindRequest; 904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch struct IdentityKey; 914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch struct Identity; 924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch typedef std::map<IdentityKey, Identity> IdentityMap; 934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ~WebRTCIdentityStoreBackend(); 954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch void OnLoaded(scoped_ptr<IdentityMap> out_map); 974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // In-memory copy of the identities. 994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IdentityMap identities_; 1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // "Find identity" requests waiting for the DB to load. 1014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::vector<PendingFindRequest*> pending_find_requests_; 1024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // The persistent storage loading state. 1034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch LoadingState state_; 1044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // The persistent storage of identities. 1054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_refptr<SqlLiteStorage> sql_lite_storage_; 1064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch DISALLOW_COPY_AND_ASSIGN(WebRTCIdentityStoreBackend); 1084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}; 1094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 1104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#endif // CONTENT_BROWSER_MEDIA_WEBRTC_IDENTITY_STORE_BACKEND_H_ 112