Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: chrome/browser/net/transport_security_persister.h

Issue 59693008: Give mojo_shell a TransportSecurityPersister (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sprinkle some NET_EXPORT Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/net/transport_security_persister.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 // 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 file_task_runner, which
17 // deserializes 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 task runner after some small amount of time
26 //
27 // ...
28 //
29 // TransportSecurityPersister::SerializeState
30 // copies the current state of the TransportSecurityState, serializes
31 // and writes to disk.
32
33 #ifndef CHROME_BROWSER_NET_TRANSPORT_SECURITY_PERSISTER_H_
34 #define CHROME_BROWSER_NET_TRANSPORT_SECURITY_PERSISTER_H_
35
36 #include <string>
37
38 #include "base/files/file_path.h"
39 #include "base/files/important_file_writer.h"
40 #include "base/memory/ref_counted.h"
41 #include "base/memory/weak_ptr.h"
42 #include "net/http/transport_security_state.h"
43
44 namespace base {
45 class SequencedTaskRunner;
46 }
47
48 // Reads and updates on-disk TransportSecurity state. Clients of this class
49 // should create, destroy, and call into it from one thread.
50 //
51 // file_task_runner is the task runner this class should use internally to
52 // perform file IO, and can optionally be associated with a different thread.
53 class TransportSecurityPersister
54 : public net::TransportSecurityState::Delegate,
55 public base::ImportantFileWriter::DataSerializer {
56 public:
57 TransportSecurityPersister(net::TransportSecurityState* state,
58 const base::FilePath& profile_path,
59 base::SequencedTaskRunner* file_task_runner,
60 bool readonly);
61 virtual ~TransportSecurityPersister();
62
63 // Called by the TransportSecurityState when it changes its state.
64 virtual void StateIsDirty(net::TransportSecurityState*) OVERRIDE;
65
66 // ImportantFileWriter::DataSerializer:
67 //
68 // Serializes |transport_security_state_| into |*output|. Returns true if
69 // all DomainStates were serialized correctly.
70 //
71 // The serialization format is JSON; the JSON represents a dictionary of
72 // host:DomainState pairs (host is a string). The DomainState is
73 // represented as a dictionary containing the following keys and value
74 // types (not all keys will always be present):
75 //
76 // "sts_include_subdomains": true|false
77 // "pkp_include_subdomains": true|false
78 // "created": double
79 // "expiry": double
80 // "dynamic_spki_hashes_expiry": double
81 // "mode": "default"|"force-https"
82 // legacy value synonyms "strict" = "force-https"
83 // "pinning-only" = "default"
84 // legacy value "spdy-only" is unused and ignored
85 // "static_spki_hashes": list of strings
86 // legacy key synonym "preloaded_spki_hashes"
87 // "bad_static_spki_hashes": list of strings
88 // legacy key synonym "bad_preloaded_spki_hashes"
89 // "dynamic_spki_hashes": list of strings
90 //
91 // The JSON dictionary keys are strings containing
92 // Base64(SHA256(net::TransportSecurityState::CanonicalizeHost(domain))).
93 // The reason for hashing them is so that the stored state does not
94 // trivially reveal a user's browsing history to an attacker reading the
95 // serialized state on disk.
96 virtual bool SerializeData(std::string* data) OVERRIDE;
97
98 // Clears any existing non-static entries, and then re-populates
99 // |transport_security_state_|.
100 //
101 // Sets |*dirty| to true if the new state differs from the persisted
102 // state; false otherwise.
103 bool LoadEntries(const std::string& serialized, bool* dirty);
104
105 private:
106 // Populates |state| from the JSON string |serialized|. Returns true if
107 // all entries were parsed and deserialized correctly.
108 //
109 // Sets |*dirty| to true if the new state differs from the persisted
110 // state; false otherwise.
111 static bool Deserialize(const std::string& serialized,
112 bool* dirty,
113 net::TransportSecurityState* state);
114
115 void CompleteLoad(const std::string& state);
116
117 net::TransportSecurityState* transport_security_state_;
118
119 // Helper for safely writing the data.
120 base::ImportantFileWriter writer_;
121
122 scoped_refptr<base::SequencedTaskRunner> foreground_runner_;
123 scoped_refptr<base::SequencedTaskRunner> background_runner_;
124
125 // Whether or not we're in read-only mode.
126 const bool readonly_;
127
128 base::WeakPtrFactory<TransportSecurityPersister> weak_ptr_factory_;
129
130 DISALLOW_COPY_AND_ASSIGN(TransportSecurityPersister);
131 };
132
133 #endif // CHROME_BROWSER_NET_TRANSPORT_SECURITY_PERSISTER_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/net/transport_security_persister.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698