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 // TransportSecurityState maintains an in memory database containing the 6 // list of hosts that currently have transport security enabled. This 7 // singleton object deals with writing that data out to disk as needed and 8 // loading it at startup. 9 10 // At startup we need to load the transport security state from the 11 // disk. For the moment, we don't want to delay startup for this load, so we 12 // let the TransportSecurityState run for a while without being loaded. 13 // This means that it's possible for pages opened very quickly not to get the 14 // correct transport security information. 15 // 16 // To load the state, we schedule a Task on the file thread which loads, 17 // deserialises and configures the TransportSecurityState. 18 // 19 // The TransportSecurityState object supports running a callback function 20 // when it changes. This object registers the callback, pointing at itself. 21 // 22 // TransportSecurityState calls... 23 // TransportSecurityPersister::StateIsDirty 24 // since the callback isn't allowed to block or reenter, we schedule a Task 25 // on the file thread after some small amount of time 26 // 27 // ... 28 // 29 // TransportSecurityPersister::SerialiseState 30 // copies the current state of the TransportSecurityState, serialises 31 // and writes to disk. 32 33 #ifndef CHROME_BROWSER_TRANSPORT_SECURITY_PERSISTER_H_ 34 #define CHROME_BROWSER_TRANSPORT_SECURITY_PERSISTER_H_ 35 #pragma once 36 37 #include "base/file_path.h" 38 #include "base/memory/ref_counted.h" 39 #include "base/task.h" 40 #include "net/base/transport_security_state.h" 41 42 class TransportSecurityPersister 43 : public base::RefCountedThreadSafe<TransportSecurityPersister>, 44 public net::TransportSecurityState::Delegate { 45 public: 46 explicit TransportSecurityPersister(bool readonly); 47 void Initialize(net::TransportSecurityState* state, 48 const FilePath& profile_path); 49 50 // Called by the TransportSecurityState when it changes its state. 51 virtual void StateIsDirty(net::TransportSecurityState*); 52 53 private: 54 friend class base::RefCountedThreadSafe<TransportSecurityPersister>; 55 56 ~TransportSecurityPersister(); 57 58 void Load(); 59 void CompleteLoad(const std::string& state); 60 61 void Save(); 62 void CompleteSave(const std::string& state); 63 64 // Used on the IO thread to coalesce writes to disk. 65 ScopedRunnableMethodFactory<TransportSecurityPersister> save_coalescer_; 66 67 scoped_refptr<net::TransportSecurityState> 68 transport_security_state_; // IO thread only. 69 70 // The path to the file in which we store the serialised state. 71 FilePath state_file_; 72 73 // Whether or not we're in read-only mode. 74 bool readonly_; 75 }; 76 77 #endif // CHROME_BROWSER_TRANSPORT_SECURITY_PERSISTER_H_ 78