Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014 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 #include "net/cert_cache/disk_based_cert_cache.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "base/callback.h" | |
| 11 #include "base/memory/ref_counted.h" | |
| 12 #include "base/memory/weak_ptr.h" | |
| 13 #include "base/pickle.h" | |
| 14 #include "base/strings/string_number_conversions.h" | |
| 15 #include "net/base/io_buffer.h" | |
| 16 #include "net/base/net_errors.h" | |
| 17 #include "net/cert/x509_certificate.h" | |
| 18 #include "net/disk_cache/disk_cache.h" | |
| 19 | |
| 20 namespace net { | |
| 21 | |
| 22 DiskBasedCertCache::DiskBasedCertCache(disk_cache::Backend* backend) | |
| 23 : backend_(backend), | |
| 24 active_entry_(NULL), | |
| 25 weak_factory_(this), | |
| 26 io_callback_(base::Bind(&DiskBasedCertCache::OnIOComplete, | |
| 27 weak_factory_.GetWeakPtr())), | |
| 28 state_(NONE) { | |
| 29 DCHECK(backend_); | |
| 30 } | |
| 31 | |
| 32 DiskBasedCertCache::~DiskBasedCertCache() { | |
| 33 weak_factory_.InvalidateWeakPtrs(); | |
| 34 } | |
| 35 | |
| 36 void DiskBasedCertCache::Get( | |
| 37 std::string& key, | |
| 38 base::Callback<void(X509Certificate::OSCertHandle cert_handle)> cb) { | |
| 39 user_read_callback_ = cb; | |
| 40 | |
| 41 state_ = START_READ; | |
| 42 | |
| 43 int rv = backend_->OpenEntry(key, &active_entry_, io_callback_); | |
| 44 | |
| 45 // todo: implement other error codes. | |
| 46 if (rv >= 0) { | |
| 47 DoStartRead(); | |
| 48 } else if (rv == ERR_IO_PENDING) { | |
| 49 } else { | |
| 50 } | |
|
Ryan Sleevi
2014/06/11 22:00:08
A couple common coding conventions:
Handle errors
| |
| 51 } | |
| 52 | |
| 53 void DiskBasedCertCache::DoStartRead() { | |
| 54 active_entry_size_ = active_entry_->GetDataSize(0 /* index */); | |
| 55 buffer = (new IOBuffer(active_entry_size_)); | |
|
Ryan Sleevi
2014/06/11 22:00:08
No need for the extra () around new.
| |
| 56 | |
| 57 state_ = FINISH_READ; | |
| 58 | |
| 59 int rv = active_entry_->ReadData( | |
| 60 0 /* index */, 0 /* offset */, buffer, active_entry_size_, io_callback_); | |
| 61 | |
| 62 // todo: implement other error codes. | |
| 63 if (rv >= 0) { | |
| 64 DoFinishRead(); | |
| 65 } else if (rv == ERR_IO_PENDING) { | |
| 66 } else { | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 void DiskBasedCertCache::DoFinishRead() { | |
| 71 if (!user_read_callback_.is_null()) { | |
|
Ryan Sleevi
2014/06/11 22:00:08
if (user_read_callback_.is_null())
return;
acti
| |
| 72 active_cert_handle_ = X509Certificate::CreateOSCertHandleFromBytes( | |
| 73 buffer->data(), active_entry_size_); | |
| 74 | |
| 75 CHECK(active_cert_handle_ != NULL); | |
|
Ryan Sleevi
2014/06/11 22:00:08
CHECK(active_cert_handle_);
| |
| 76 | |
| 77 base::Callback<void(X509Certificate::OSCertHandle cert_handle)> callback = | |
| 78 user_read_callback_; | |
| 79 callback.Run(active_cert_handle_); | |
|
Ryan Sleevi
2014/06/11 22:00:08
base::ResetAndReturn(&user_read_callback_).Run(act
| |
| 80 reset_state(); | |
|
Ryan Sleevi
2014/06/11 22:00:08
It looks like your state machine breaks if user_re
| |
| 81 } | |
| 82 } | |
| 83 | |
| 84 void DiskBasedCertCache::Set(const X509Certificate::OSCertHandle cert_handle, | |
| 85 base::Callback<void(const std::string&)> cb) { | |
| 86 DCHECK(!cb.is_null()); | |
| 87 CHECK(active_entry_ == NULL); | |
|
Ryan Sleevi
2014/06/11 22:00:08
CHECK(active_entry_)
| |
| 88 | |
| 89 active_cert_handle_ = cert_handle; | |
| 90 | |
| 91 state_ = START_WRITE; | |
| 92 user_write_callback_ = cb; | |
| 93 | |
| 94 if (backend_->CreateEntry(Key(), &active_entry_, io_callback_) != | |
| 95 ERR_IO_PENDING) { | |
| 96 DoStartWrite(); | |
|
Ryan Sleevi
2014/06/11 22:00:08
what about errors?
| |
| 97 } | |
| 98 } | |
| 99 | |
| 100 std::string DiskBasedCertCache::Key() { | |
| 101 CHECK(active_cert_handle_ != NULL); | |
|
Ryan Sleevi
2014/06/11 22:00:08
CHECK(active_cert_handle_);
| |
| 102 | |
| 103 SHA1HashValue fingerprint = | |
| 104 X509Certificate::CalculateFingerprint(active_cert_handle_); | |
| 105 | |
| 106 // should update to store the key so the data doesn't have to be encoded | |
| 107 // multiple times. | |
| 108 | |
| 109 return "cert:" + base::HexEncode(fingerprint.data, 20); | |
| 110 } | |
| 111 | |
| 112 void DiskBasedCertCache::OnIOComplete(int rv) { | |
| 113 switch (state_) { | |
| 114 case START_WRITE: | |
| 115 DoStartWrite(); | |
| 116 break; | |
| 117 case FINISH_WRITE: | |
| 118 DoFinishWrite(); | |
| 119 break; | |
| 120 case START_READ: | |
| 121 DoStartRead(); | |
| 122 break; | |
| 123 case FINISH_READ: | |
| 124 break; | |
| 125 DoFinishRead(); | |
| 126 case NONE: | |
| 127 break; | |
| 128 } | |
| 129 | |
| 130 state_ = NONE; | |
| 131 } | |
| 132 | |
| 133 void DiskBasedCertCache::DoStartWrite() { | |
| 134 std::string write_data; | |
| 135 | |
| 136 // encode data | |
| 137 CHECK(X509Certificate::GetDEREncoded(active_cert_handle_, &write_data)); | |
|
Ryan Sleevi
2014/06/11 22:00:08
DANGER: You never want to put function calls in CH
| |
| 138 | |
| 139 buffer = new IOBuffer(write_data.size()); | |
| 140 memcpy(buffer->data(), write_data.data(), write_data.size()); | |
| 141 | |
| 142 state_ = FINISH_WRITE; | |
| 143 | |
| 144 if (active_entry_->WriteData(0 /* index */, | |
| 145 0 /* offset */, | |
| 146 buffer, | |
| 147 write_data.size(), | |
| 148 io_callback_, | |
| 149 true /* truncate */) != ERR_IO_PENDING) | |
| 150 DoFinishWrite(); | |
| 151 } | |
| 152 | |
| 153 void DiskBasedCertCache::DoFinishWrite() { | |
| 154 if (!user_write_callback_.is_null()) { | |
|
Ryan Sleevi
2014/06/11 22:00:08
if (user_write_callback_.is_null())
return;
...
| |
| 155 base::Callback<void(const std::string&)> callback = user_write_callback_; | |
| 156 callback.Run(Key()); | |
| 157 reset_state(); | |
| 158 } | |
| 159 } | |
| 160 | |
| 161 void DiskBasedCertCache::reset_state() { | |
|
Ryan Sleevi
2014/06/11 22:00:08
Naming: This would be ResetState(), not reset_stat
| |
| 162 state_ = NONE; | |
| 163 active_entry_->Close(); | |
| 164 active_entry_ = NULL; | |
| 165 active_cert_handle_ = NULL; | |
| 166 user_write_callback_.Reset(); | |
| 167 user_read_callback_.Reset(); | |
| 168 } | |
| 169 | |
| 170 } // namespace net | |
| OLD | NEW |