OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/ssl/default_channel_id_store.h" | 5 #include "net/ssl/default_channel_id_store.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 const GetChannelIDCallback& callback) | 57 const GetChannelIDCallback& callback) |
58 : server_identifier_(server_identifier), | 58 : server_identifier_(server_identifier), |
59 callback_(callback) { | 59 callback_(callback) { |
60 } | 60 } |
61 | 61 |
62 DefaultChannelIDStore::GetChannelIDTask::~GetChannelIDTask() { | 62 DefaultChannelIDStore::GetChannelIDTask::~GetChannelIDTask() { |
63 } | 63 } |
64 | 64 |
65 void DefaultChannelIDStore::GetChannelIDTask::Run( | 65 void DefaultChannelIDStore::GetChannelIDTask::Run( |
66 DefaultChannelIDStore* store) { | 66 DefaultChannelIDStore* store) { |
67 scoped_ptr<crypto::ECPrivateKey> key_result; | 67 std::unique_ptr<crypto::ECPrivateKey> key_result; |
68 int err = store->GetChannelID(server_identifier_, &key_result, | 68 int err = store->GetChannelID(server_identifier_, &key_result, |
69 GetChannelIDCallback()); | 69 GetChannelIDCallback()); |
70 DCHECK(err != ERR_IO_PENDING); | 70 DCHECK(err != ERR_IO_PENDING); |
71 | 71 |
72 InvokeCallback(base::Bind(callback_, err, server_identifier_, | 72 InvokeCallback(base::Bind(callback_, err, server_identifier_, |
73 base::Passed(std::move(key_result)))); | 73 base::Passed(std::move(key_result)))); |
74 } | 74 } |
75 | 75 |
76 // -------------------------------------------------------------------------- | 76 // -------------------------------------------------------------------------- |
77 // SetChannelIDTask | 77 // SetChannelIDTask |
78 class DefaultChannelIDStore::SetChannelIDTask | 78 class DefaultChannelIDStore::SetChannelIDTask |
79 : public DefaultChannelIDStore::Task { | 79 : public DefaultChannelIDStore::Task { |
80 public: | 80 public: |
81 SetChannelIDTask(scoped_ptr<ChannelID> channel_id); | 81 SetChannelIDTask(std::unique_ptr<ChannelID> channel_id); |
82 ~SetChannelIDTask() override; | 82 ~SetChannelIDTask() override; |
83 void Run(DefaultChannelIDStore* store) override; | 83 void Run(DefaultChannelIDStore* store) override; |
84 | 84 |
85 private: | 85 private: |
86 scoped_ptr<ChannelID> channel_id_; | 86 std::unique_ptr<ChannelID> channel_id_; |
87 }; | 87 }; |
88 | 88 |
89 DefaultChannelIDStore::SetChannelIDTask::SetChannelIDTask( | 89 DefaultChannelIDStore::SetChannelIDTask::SetChannelIDTask( |
90 scoped_ptr<ChannelID> channel_id) | 90 std::unique_ptr<ChannelID> channel_id) |
91 : channel_id_(std::move(channel_id)) {} | 91 : channel_id_(std::move(channel_id)) {} |
92 | 92 |
93 DefaultChannelIDStore::SetChannelIDTask::~SetChannelIDTask() { | 93 DefaultChannelIDStore::SetChannelIDTask::~SetChannelIDTask() { |
94 } | 94 } |
95 | 95 |
96 void DefaultChannelIDStore::SetChannelIDTask::Run( | 96 void DefaultChannelIDStore::SetChannelIDTask::Run( |
97 DefaultChannelIDStore* store) { | 97 DefaultChannelIDStore* store) { |
98 store->SyncSetChannelID(std::move(channel_id_)); | 98 store->SyncSetChannelID(std::move(channel_id_)); |
99 } | 99 } |
100 | 100 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 | 206 |
207 DefaultChannelIDStore::DefaultChannelIDStore( | 207 DefaultChannelIDStore::DefaultChannelIDStore( |
208 PersistentStore* store) | 208 PersistentStore* store) |
209 : initialized_(false), | 209 : initialized_(false), |
210 loaded_(false), | 210 loaded_(false), |
211 store_(store), | 211 store_(store), |
212 weak_ptr_factory_(this) {} | 212 weak_ptr_factory_(this) {} |
213 | 213 |
214 int DefaultChannelIDStore::GetChannelID( | 214 int DefaultChannelIDStore::GetChannelID( |
215 const std::string& server_identifier, | 215 const std::string& server_identifier, |
216 scoped_ptr<crypto::ECPrivateKey>* key_result, | 216 std::unique_ptr<crypto::ECPrivateKey>* key_result, |
217 const GetChannelIDCallback& callback) { | 217 const GetChannelIDCallback& callback) { |
218 DCHECK(CalledOnValidThread()); | 218 DCHECK(CalledOnValidThread()); |
219 InitIfNecessary(); | 219 InitIfNecessary(); |
220 | 220 |
221 if (!loaded_) { | 221 if (!loaded_) { |
222 EnqueueTask(scoped_ptr<Task>( | 222 EnqueueTask(std::unique_ptr<Task>( |
223 new GetChannelIDTask(server_identifier, callback))); | 223 new GetChannelIDTask(server_identifier, callback))); |
224 return ERR_IO_PENDING; | 224 return ERR_IO_PENDING; |
225 } | 225 } |
226 | 226 |
227 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); | 227 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); |
228 | 228 |
229 if (it == channel_ids_.end()) | 229 if (it == channel_ids_.end()) |
230 return ERR_FILE_NOT_FOUND; | 230 return ERR_FILE_NOT_FOUND; |
231 | 231 |
232 ChannelID* channel_id = it->second; | 232 ChannelID* channel_id = it->second; |
233 key_result->reset(channel_id->key()->Copy()); | 233 key_result->reset(channel_id->key()->Copy()); |
234 | 234 |
235 return OK; | 235 return OK; |
236 } | 236 } |
237 | 237 |
238 void DefaultChannelIDStore::SetChannelID(scoped_ptr<ChannelID> channel_id) { | 238 void DefaultChannelIDStore::SetChannelID( |
| 239 std::unique_ptr<ChannelID> channel_id) { |
239 auto task = new SetChannelIDTask(std::move(channel_id)); | 240 auto task = new SetChannelIDTask(std::move(channel_id)); |
240 RunOrEnqueueTask(scoped_ptr<Task>(task)); | 241 RunOrEnqueueTask(std::unique_ptr<Task>(task)); |
241 } | 242 } |
242 | 243 |
243 void DefaultChannelIDStore::DeleteChannelID( | 244 void DefaultChannelIDStore::DeleteChannelID( |
244 const std::string& server_identifier, | 245 const std::string& server_identifier, |
245 const base::Closure& callback) { | 246 const base::Closure& callback) { |
246 RunOrEnqueueTask(scoped_ptr<Task>( | 247 RunOrEnqueueTask(std::unique_ptr<Task>( |
247 new DeleteChannelIDTask(server_identifier, callback))); | 248 new DeleteChannelIDTask(server_identifier, callback))); |
248 } | 249 } |
249 | 250 |
250 void DefaultChannelIDStore::DeleteAllCreatedBetween( | 251 void DefaultChannelIDStore::DeleteAllCreatedBetween( |
251 base::Time delete_begin, | 252 base::Time delete_begin, |
252 base::Time delete_end, | 253 base::Time delete_end, |
253 const base::Closure& callback) { | 254 const base::Closure& callback) { |
254 RunOrEnqueueTask(scoped_ptr<Task>( | 255 RunOrEnqueueTask(std::unique_ptr<Task>( |
255 new DeleteAllCreatedBetweenTask(delete_begin, delete_end, callback))); | 256 new DeleteAllCreatedBetweenTask(delete_begin, delete_end, callback))); |
256 } | 257 } |
257 | 258 |
258 void DefaultChannelIDStore::DeleteAll( | 259 void DefaultChannelIDStore::DeleteAll( |
259 const base::Closure& callback) { | 260 const base::Closure& callback) { |
260 DeleteAllCreatedBetween(base::Time(), base::Time(), callback); | 261 DeleteAllCreatedBetween(base::Time(), base::Time(), callback); |
261 } | 262 } |
262 | 263 |
263 void DefaultChannelIDStore::GetAllChannelIDs( | 264 void DefaultChannelIDStore::GetAllChannelIDs( |
264 const GetChannelIDListCallback& callback) { | 265 const GetChannelIDListCallback& callback) { |
265 RunOrEnqueueTask(scoped_ptr<Task>(new GetAllChannelIDsTask(callback))); | 266 RunOrEnqueueTask(std::unique_ptr<Task>(new GetAllChannelIDsTask(callback))); |
266 } | 267 } |
267 | 268 |
268 int DefaultChannelIDStore::GetChannelIDCount() { | 269 int DefaultChannelIDStore::GetChannelIDCount() { |
269 DCHECK(CalledOnValidThread()); | 270 DCHECK(CalledOnValidThread()); |
270 | 271 |
271 return channel_ids_.size(); | 272 return channel_ids_.size(); |
272 } | 273 } |
273 | 274 |
274 void DefaultChannelIDStore::SetForceKeepSessionState() { | 275 void DefaultChannelIDStore::SetForceKeepSessionState() { |
275 DCHECK(CalledOnValidThread()); | 276 DCHECK(CalledOnValidThread()); |
(...skipping 20 matching lines...) Expand all Loading... |
296 void DefaultChannelIDStore::InitStore() { | 297 void DefaultChannelIDStore::InitStore() { |
297 DCHECK(CalledOnValidThread()); | 298 DCHECK(CalledOnValidThread()); |
298 DCHECK(store_.get()) << "Store must exist to initialize"; | 299 DCHECK(store_.get()) << "Store must exist to initialize"; |
299 DCHECK(!loaded_); | 300 DCHECK(!loaded_); |
300 | 301 |
301 store_->Load(base::Bind(&DefaultChannelIDStore::OnLoaded, | 302 store_->Load(base::Bind(&DefaultChannelIDStore::OnLoaded, |
302 weak_ptr_factory_.GetWeakPtr())); | 303 weak_ptr_factory_.GetWeakPtr())); |
303 } | 304 } |
304 | 305 |
305 void DefaultChannelIDStore::OnLoaded( | 306 void DefaultChannelIDStore::OnLoaded( |
306 scoped_ptr<std::vector<scoped_ptr<ChannelID>>> channel_ids) { | 307 std::unique_ptr<std::vector<std::unique_ptr<ChannelID>>> channel_ids) { |
307 DCHECK(CalledOnValidThread()); | 308 DCHECK(CalledOnValidThread()); |
308 for (std::vector<scoped_ptr<ChannelID>>::iterator it = channel_ids->begin(); | 309 for (std::vector<std::unique_ptr<ChannelID>>::iterator it = |
| 310 channel_ids->begin(); |
309 it != channel_ids->end(); ++it) { | 311 it != channel_ids->end(); ++it) { |
310 DCHECK(channel_ids_.find((*it)->server_identifier()) == | 312 DCHECK(channel_ids_.find((*it)->server_identifier()) == |
311 channel_ids_.end()); | 313 channel_ids_.end()); |
312 std::string ident = (*it)->server_identifier(); | 314 std::string ident = (*it)->server_identifier(); |
313 channel_ids_[ident] = it->release(); | 315 channel_ids_[ident] = it->release(); |
314 } | 316 } |
315 channel_ids->clear(); | 317 channel_ids->clear(); |
316 | 318 |
317 loaded_ = true; | 319 loaded_ = true; |
318 | 320 |
319 base::TimeDelta wait_time; | 321 base::TimeDelta wait_time; |
320 if (!waiting_tasks_.empty()) | 322 if (!waiting_tasks_.empty()) |
321 wait_time = base::TimeTicks::Now() - waiting_tasks_start_time_; | 323 wait_time = base::TimeTicks::Now() - waiting_tasks_start_time_; |
322 DVLOG(1) << "Task delay " << wait_time.InMilliseconds(); | 324 DVLOG(1) << "Task delay " << wait_time.InMilliseconds(); |
323 UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.TaskMaxWaitTime", | 325 UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.TaskMaxWaitTime", |
324 wait_time, | 326 wait_time, |
325 base::TimeDelta::FromMilliseconds(1), | 327 base::TimeDelta::FromMilliseconds(1), |
326 base::TimeDelta::FromMinutes(1), | 328 base::TimeDelta::FromMinutes(1), |
327 50); | 329 50); |
328 UMA_HISTOGRAM_COUNTS_100("DomainBoundCerts.TaskWaitCount", | 330 UMA_HISTOGRAM_COUNTS_100("DomainBoundCerts.TaskWaitCount", |
329 waiting_tasks_.size()); | 331 waiting_tasks_.size()); |
330 | 332 |
331 for (scoped_ptr<Task>& i : waiting_tasks_) | 333 for (std::unique_ptr<Task>& i : waiting_tasks_) |
332 i->Run(this); | 334 i->Run(this); |
333 waiting_tasks_.clear(); | 335 waiting_tasks_.clear(); |
334 } | 336 } |
335 | 337 |
336 void DefaultChannelIDStore::SyncSetChannelID(scoped_ptr<ChannelID> channel_id) { | 338 void DefaultChannelIDStore::SyncSetChannelID( |
| 339 std::unique_ptr<ChannelID> channel_id) { |
337 DCHECK(CalledOnValidThread()); | 340 DCHECK(CalledOnValidThread()); |
338 DCHECK(loaded_); | 341 DCHECK(loaded_); |
339 | 342 |
340 InternalDeleteChannelID(channel_id->server_identifier()); | 343 InternalDeleteChannelID(channel_id->server_identifier()); |
341 InternalInsertChannelID(std::move(channel_id)); | 344 InternalInsertChannelID(std::move(channel_id)); |
342 } | 345 } |
343 | 346 |
344 void DefaultChannelIDStore::SyncDeleteChannelID( | 347 void DefaultChannelIDStore::SyncDeleteChannelID( |
345 const std::string& server_identifier) { | 348 const std::string& server_identifier) { |
346 DCHECK(CalledOnValidThread()); | 349 DCHECK(CalledOnValidThread()); |
(...skipping 24 matching lines...) Expand all Loading... |
371 | 374 |
372 void DefaultChannelIDStore::SyncGetAllChannelIDs( | 375 void DefaultChannelIDStore::SyncGetAllChannelIDs( |
373 ChannelIDList* channel_id_list) { | 376 ChannelIDList* channel_id_list) { |
374 DCHECK(CalledOnValidThread()); | 377 DCHECK(CalledOnValidThread()); |
375 DCHECK(loaded_); | 378 DCHECK(loaded_); |
376 for (ChannelIDMap::iterator it = channel_ids_.begin(); | 379 for (ChannelIDMap::iterator it = channel_ids_.begin(); |
377 it != channel_ids_.end(); ++it) | 380 it != channel_ids_.end(); ++it) |
378 channel_id_list->push_back(*it->second); | 381 channel_id_list->push_back(*it->second); |
379 } | 382 } |
380 | 383 |
381 void DefaultChannelIDStore::EnqueueTask(scoped_ptr<Task> task) { | 384 void DefaultChannelIDStore::EnqueueTask(std::unique_ptr<Task> task) { |
382 DCHECK(CalledOnValidThread()); | 385 DCHECK(CalledOnValidThread()); |
383 DCHECK(!loaded_); | 386 DCHECK(!loaded_); |
384 if (waiting_tasks_.empty()) | 387 if (waiting_tasks_.empty()) |
385 waiting_tasks_start_time_ = base::TimeTicks::Now(); | 388 waiting_tasks_start_time_ = base::TimeTicks::Now(); |
386 waiting_tasks_.push_back(std::move(task)); | 389 waiting_tasks_.push_back(std::move(task)); |
387 } | 390 } |
388 | 391 |
389 void DefaultChannelIDStore::RunOrEnqueueTask(scoped_ptr<Task> task) { | 392 void DefaultChannelIDStore::RunOrEnqueueTask(std::unique_ptr<Task> task) { |
390 DCHECK(CalledOnValidThread()); | 393 DCHECK(CalledOnValidThread()); |
391 InitIfNecessary(); | 394 InitIfNecessary(); |
392 | 395 |
393 if (!loaded_) { | 396 if (!loaded_) { |
394 EnqueueTask(std::move(task)); | 397 EnqueueTask(std::move(task)); |
395 return; | 398 return; |
396 } | 399 } |
397 | 400 |
398 task->Run(this); | 401 task->Run(this); |
399 } | 402 } |
400 | 403 |
401 void DefaultChannelIDStore::InternalDeleteChannelID( | 404 void DefaultChannelIDStore::InternalDeleteChannelID( |
402 const std::string& server_identifier) { | 405 const std::string& server_identifier) { |
403 DCHECK(CalledOnValidThread()); | 406 DCHECK(CalledOnValidThread()); |
404 DCHECK(loaded_); | 407 DCHECK(loaded_); |
405 | 408 |
406 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); | 409 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); |
407 if (it == channel_ids_.end()) | 410 if (it == channel_ids_.end()) |
408 return; // There is nothing to delete. | 411 return; // There is nothing to delete. |
409 | 412 |
410 ChannelID* channel_id = it->second; | 413 ChannelID* channel_id = it->second; |
411 if (store_.get()) | 414 if (store_.get()) |
412 store_->DeleteChannelID(*channel_id); | 415 store_->DeleteChannelID(*channel_id); |
413 channel_ids_.erase(it); | 416 channel_ids_.erase(it); |
414 delete channel_id; | 417 delete channel_id; |
415 } | 418 } |
416 | 419 |
417 void DefaultChannelIDStore::InternalInsertChannelID( | 420 void DefaultChannelIDStore::InternalInsertChannelID( |
418 scoped_ptr<ChannelID> channel_id) { | 421 std::unique_ptr<ChannelID> channel_id) { |
419 DCHECK(CalledOnValidThread()); | 422 DCHECK(CalledOnValidThread()); |
420 DCHECK(loaded_); | 423 DCHECK(loaded_); |
421 | 424 |
422 if (store_.get()) | 425 if (store_.get()) |
423 store_->AddChannelID(*(channel_id.get())); | 426 store_->AddChannelID(*(channel_id.get())); |
424 const std::string& server_identifier = channel_id->server_identifier(); | 427 const std::string& server_identifier = channel_id->server_identifier(); |
425 channel_ids_[server_identifier] = channel_id.release(); | 428 channel_ids_[server_identifier] = channel_id.release(); |
426 } | 429 } |
427 | 430 |
428 bool DefaultChannelIDStore::IsEphemeral() { | 431 bool DefaultChannelIDStore::IsEphemeral() { |
429 return store_.get() == nullptr; | 432 return store_.get() == nullptr; |
430 } | 433 } |
431 | 434 |
432 DefaultChannelIDStore::PersistentStore::PersistentStore() {} | 435 DefaultChannelIDStore::PersistentStore::PersistentStore() {} |
433 | 436 |
434 DefaultChannelIDStore::PersistentStore::~PersistentStore() {} | 437 DefaultChannelIDStore::PersistentStore::~PersistentStore() {} |
435 | 438 |
436 } // namespace net | 439 } // namespace net |
OLD | NEW |