Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2012 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 #ifndef CONTENT_BROWSER_CERT_STORE_IMPL_H_
      6 #define CONTENT_BROWSER_CERT_STORE_IMPL_H_
      7 
      8 #include <map>
      9 
     10 #include "base/memory/singleton.h"
     11 #include "base/synchronization/lock.h"
     12 #include "content/public/browser/cert_store.h"
     13 #include "content/public/browser/notification_observer.h"
     14 #include "content/public/browser/notification_registrar.h"
     15 #include "net/cert/x509_certificate.h"
     16 
     17 namespace content {
     18 
     19 class CertStoreImpl : public CertStore,
     20                       public NotificationObserver {
     21  public:
     22   // Returns the singleton instance of the CertStore.
     23   static CertStoreImpl* GetInstance();
     24 
     25   // CertStore implementation:
     26   virtual int StoreCert(net::X509Certificate* cert,
     27                         int render_process_host_id) OVERRIDE;
     28   virtual bool RetrieveCert(int cert_id,
     29                             scoped_refptr<net::X509Certificate>* cert) OVERRIDE;
     30 
     31   // NotificationObserver implementation.
     32   virtual void Observe(int type,
     33                        const NotificationSource& source,
     34                        const NotificationDetails& details) OVERRIDE;
     35  protected:
     36   CertStoreImpl();
     37   virtual ~CertStoreImpl();
     38 
     39  private:
     40   friend struct DefaultSingletonTraits<CertStoreImpl>;
     41 
     42   void RegisterForNotification();
     43 
     44   // Remove the specified cert from id_to_cert_ and cert_to_id_.
     45   // NOTE: the caller (RemoveCertsForRenderProcesHost) must hold cert_lock_.
     46   void RemoveCertInternal(int cert_id);
     47 
     48   // Removes all the certs associated with the specified process from the store.
     49   void RemoveCertsForRenderProcesHost(int render_process_host_id);
     50 
     51   typedef std::multimap<int, int> IDMap;
     52   typedef std::map<int, scoped_refptr<net::X509Certificate> > CertMap;
     53   typedef std::map<net::X509Certificate*, int, net::X509Certificate::LessThan>
     54       ReverseCertMap;
     55 
     56   // Is only used on the UI Thread.
     57   NotificationRegistrar registrar_;
     58 
     59   IDMap process_id_to_cert_id_;
     60   IDMap cert_id_to_process_id_;
     61 
     62   CertMap id_to_cert_;
     63   ReverseCertMap cert_to_id_;
     64 
     65   int next_cert_id_;
     66 
     67   // This lock protects: process_to_ids_, id_to_processes_, id_to_cert_ and
     68   //                     cert_to_id_.
     69   base::Lock cert_lock_;
     70 
     71   DISALLOW_COPY_AND_ASSIGN(CertStoreImpl);
     72 };
     73 
     74 }  // namespace content
     75 
     76 #endif  // CONTENT_BROWSER_CERT_STORE_IMPL_H_
     77