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