OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/transport_security_persister.h" | 5 #include "net/http/transport_security_persister.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 const char kExpiry[] = "expiry"; | 70 const char kExpiry[] = "expiry"; |
71 const char kDynamicSPKIHashesExpiry[] = "dynamic_spki_hashes_expiry"; | 71 const char kDynamicSPKIHashesExpiry[] = "dynamic_spki_hashes_expiry"; |
72 const char kDynamicSPKIHashes[] = "dynamic_spki_hashes"; | 72 const char kDynamicSPKIHashes[] = "dynamic_spki_hashes"; |
73 const char kForceHTTPS[] = "force-https"; | 73 const char kForceHTTPS[] = "force-https"; |
74 const char kStrict[] = "strict"; | 74 const char kStrict[] = "strict"; |
75 const char kDefault[] = "default"; | 75 const char kDefault[] = "default"; |
76 const char kPinningOnly[] = "pinning-only"; | 76 const char kPinningOnly[] = "pinning-only"; |
77 const char kCreated[] = "created"; | 77 const char kCreated[] = "created"; |
78 const char kStsObserved[] = "sts_observed"; | 78 const char kStsObserved[] = "sts_observed"; |
79 const char kPkpObserved[] = "pkp_observed"; | 79 const char kPkpObserved[] = "pkp_observed"; |
80 const char kReportUri[] = "report-uri"; | |
81 | 80 |
82 std::string LoadState(const base::FilePath& path) { | 81 std::string LoadState(const base::FilePath& path) { |
83 std::string result; | 82 std::string result; |
84 if (!base::ReadFileToString(path, &result)) { | 83 if (!base::ReadFileToString(path, &result)) { |
85 return ""; | 84 return ""; |
86 } | 85 } |
87 return result; | 86 return result; |
88 } | 87 } |
89 | 88 |
90 } // namespace | 89 } // namespace |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 | 185 |
187 serialized->SetBoolean(kPkpIncludeSubdomains, pkp_state.include_subdomains); | 186 serialized->SetBoolean(kPkpIncludeSubdomains, pkp_state.include_subdomains); |
188 serialized->SetDouble(kPkpObserved, pkp_state.last_observed.ToDoubleT()); | 187 serialized->SetDouble(kPkpObserved, pkp_state.last_observed.ToDoubleT()); |
189 serialized->SetDouble(kDynamicSPKIHashesExpiry, | 188 serialized->SetDouble(kDynamicSPKIHashesExpiry, |
190 pkp_state.expiry.ToDoubleT()); | 189 pkp_state.expiry.ToDoubleT()); |
191 | 190 |
192 if (now < pkp_state.expiry) { | 191 if (now < pkp_state.expiry) { |
193 serialized->Set(kDynamicSPKIHashes, | 192 serialized->Set(kDynamicSPKIHashes, |
194 SPKIHashesToListValue(pkp_state.spki_hashes)); | 193 SPKIHashesToListValue(pkp_state.spki_hashes)); |
195 } | 194 } |
196 | |
197 serialized->SetString(kReportUri, pkp_state.report_uri.spec()); | |
198 } | 195 } |
199 | 196 |
200 base::JSONWriter::WriteWithOptions( | 197 base::JSONWriter::WriteWithOptions( |
201 toplevel, base::JSONWriter::OPTIONS_PRETTY_PRINT, output); | 198 toplevel, base::JSONWriter::OPTIONS_PRETTY_PRINT, output); |
202 return true; | 199 return true; |
203 } | 200 } |
204 | 201 |
205 bool TransportSecurityPersister::LoadEntries(const std::string& serialized, | 202 bool TransportSecurityPersister::LoadEntries(const std::string& serialized, |
206 bool* dirty) { | 203 bool* dirty) { |
207 DCHECK(foreground_runner_->RunsTasksOnCurrentThread()); | 204 DCHECK(foreground_runner_->RunsTasksOnCurrentThread()); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 } else { | 275 } else { |
279 LOG(WARNING) << "Unknown TransportSecurityState mode string " | 276 LOG(WARNING) << "Unknown TransportSecurityState mode string " |
280 << mode_string << " found for entry " << i.key() | 277 << mode_string << " found for entry " << i.key() |
281 << "; skipping entry"; | 278 << "; skipping entry"; |
282 continue; | 279 continue; |
283 } | 280 } |
284 | 281 |
285 sts_state.expiry = base::Time::FromDoubleT(expiry); | 282 sts_state.expiry = base::Time::FromDoubleT(expiry); |
286 pkp_state.expiry = base::Time::FromDoubleT(dynamic_spki_hashes_expiry); | 283 pkp_state.expiry = base::Time::FromDoubleT(dynamic_spki_hashes_expiry); |
287 | 284 |
288 // Don't fail if this key is not present. | |
289 std::string report_uri_str; | |
290 parsed->GetString(kReportUri, &report_uri_str); | |
291 GURL report_uri(report_uri_str); | |
292 if (report_uri.is_valid()) | |
293 pkp_state.report_uri = report_uri; | |
294 | |
295 double sts_observed; | 285 double sts_observed; |
296 double pkp_observed; | 286 double pkp_observed; |
297 if (parsed->GetDouble(kStsObserved, &sts_observed)) { | 287 if (parsed->GetDouble(kStsObserved, &sts_observed)) { |
298 sts_state.last_observed = base::Time::FromDoubleT(sts_observed); | 288 sts_state.last_observed = base::Time::FromDoubleT(sts_observed); |
299 } else if (parsed->GetDouble(kCreated, &sts_observed)) { | 289 } else if (parsed->GetDouble(kCreated, &sts_observed)) { |
300 // kCreated is a legacy synonym for both kStsObserved and kPkpObserved. | 290 // kCreated is a legacy synonym for both kStsObserved and kPkpObserved. |
301 sts_state.last_observed = base::Time::FromDoubleT(sts_observed); | 291 sts_state.last_observed = base::Time::FromDoubleT(sts_observed); |
302 } else { | 292 } else { |
303 // We're migrating an old entry with no observation date. Make sure we | 293 // We're migrating an old entry with no observation date. Make sure we |
304 // write the new date back in a reasonable time frame. | 294 // write the new date back in a reasonable time frame. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 bool dirty = false; | 358 bool dirty = false; |
369 if (!LoadEntries(state, &dirty)) { | 359 if (!LoadEntries(state, &dirty)) { |
370 LOG(ERROR) << "Failed to deserialize state: " << state; | 360 LOG(ERROR) << "Failed to deserialize state: " << state; |
371 return; | 361 return; |
372 } | 362 } |
373 if (dirty) | 363 if (dirty) |
374 StateIsDirty(transport_security_state_); | 364 StateIsDirty(transport_security_state_); |
375 } | 365 } |
376 | 366 |
377 } // namespace net | 367 } // namespace net |
OLD | NEW |