| 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 |