| 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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 PersistentStore* store) | 220 PersistentStore* store) |
| 221 : initialized_(false), | 221 : initialized_(false), |
| 222 loaded_(false), | 222 loaded_(false), |
| 223 store_(store), | 223 store_(store), |
| 224 weak_ptr_factory_(this) {} | 224 weak_ptr_factory_(this) {} |
| 225 | 225 |
| 226 int DefaultChannelIDStore::GetChannelID( | 226 int DefaultChannelIDStore::GetChannelID( |
| 227 const std::string& server_identifier, | 227 const std::string& server_identifier, |
| 228 std::unique_ptr<crypto::ECPrivateKey>* key_result, | 228 std::unique_ptr<crypto::ECPrivateKey>* key_result, |
| 229 const GetChannelIDCallback& callback) { | 229 const GetChannelIDCallback& callback) { |
| 230 DCHECK(CalledOnValidThread()); | 230 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 231 InitIfNecessary(); | 231 InitIfNecessary(); |
| 232 | 232 |
| 233 if (!loaded_) { | 233 if (!loaded_) { |
| 234 EnqueueTask(std::unique_ptr<Task>( | 234 EnqueueTask(std::unique_ptr<Task>( |
| 235 new GetChannelIDTask(server_identifier, callback))); | 235 new GetChannelIDTask(server_identifier, callback))); |
| 236 return ERR_IO_PENDING; | 236 return ERR_IO_PENDING; |
| 237 } | 237 } |
| 238 | 238 |
| 239 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); | 239 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); |
| 240 | 240 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 void DefaultChannelIDStore::GetAllChannelIDs( | 278 void DefaultChannelIDStore::GetAllChannelIDs( |
| 279 const GetChannelIDListCallback& callback) { | 279 const GetChannelIDListCallback& callback) { |
| 280 RunOrEnqueueTask(std::unique_ptr<Task>(new GetAllChannelIDsTask(callback))); | 280 RunOrEnqueueTask(std::unique_ptr<Task>(new GetAllChannelIDsTask(callback))); |
| 281 } | 281 } |
| 282 | 282 |
| 283 void DefaultChannelIDStore::Flush() { | 283 void DefaultChannelIDStore::Flush() { |
| 284 store_->Flush(); | 284 store_->Flush(); |
| 285 } | 285 } |
| 286 | 286 |
| 287 int DefaultChannelIDStore::GetChannelIDCount() { | 287 int DefaultChannelIDStore::GetChannelIDCount() { |
| 288 DCHECK(CalledOnValidThread()); | 288 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 289 | 289 |
| 290 return channel_ids_.size(); | 290 return channel_ids_.size(); |
| 291 } | 291 } |
| 292 | 292 |
| 293 void DefaultChannelIDStore::SetForceKeepSessionState() { | 293 void DefaultChannelIDStore::SetForceKeepSessionState() { |
| 294 DCHECK(CalledOnValidThread()); | 294 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 295 InitIfNecessary(); | 295 InitIfNecessary(); |
| 296 | 296 |
| 297 if (store_) | 297 if (store_) |
| 298 store_->SetForceKeepSessionState(); | 298 store_->SetForceKeepSessionState(); |
| 299 } | 299 } |
| 300 | 300 |
| 301 DefaultChannelIDStore::~DefaultChannelIDStore() { | 301 DefaultChannelIDStore::~DefaultChannelIDStore() { |
| 302 DeleteAllInMemory(); | 302 DeleteAllInMemory(); |
| 303 } | 303 } |
| 304 | 304 |
| 305 void DefaultChannelIDStore::DeleteAllInMemory() { | 305 void DefaultChannelIDStore::DeleteAllInMemory() { |
| 306 DCHECK(CalledOnValidThread()); | 306 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 307 | 307 |
| 308 for (ChannelIDMap::iterator it = channel_ids_.begin(); | 308 for (ChannelIDMap::iterator it = channel_ids_.begin(); |
| 309 it != channel_ids_.end(); ++it) { | 309 it != channel_ids_.end(); ++it) { |
| 310 delete it->second; | 310 delete it->second; |
| 311 } | 311 } |
| 312 channel_ids_.clear(); | 312 channel_ids_.clear(); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void DefaultChannelIDStore::InitStore() { | 315 void DefaultChannelIDStore::InitStore() { |
| 316 DCHECK(CalledOnValidThread()); | 316 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 317 DCHECK(store_) << "Store must exist to initialize"; | 317 DCHECK(store_) << "Store must exist to initialize"; |
| 318 DCHECK(!loaded_); | 318 DCHECK(!loaded_); |
| 319 | 319 |
| 320 store_->Load(base::Bind(&DefaultChannelIDStore::OnLoaded, | 320 store_->Load(base::Bind(&DefaultChannelIDStore::OnLoaded, |
| 321 weak_ptr_factory_.GetWeakPtr())); | 321 weak_ptr_factory_.GetWeakPtr())); |
| 322 } | 322 } |
| 323 | 323 |
| 324 void DefaultChannelIDStore::OnLoaded( | 324 void DefaultChannelIDStore::OnLoaded( |
| 325 std::unique_ptr<std::vector<std::unique_ptr<ChannelID>>> channel_ids) { | 325 std::unique_ptr<std::vector<std::unique_ptr<ChannelID>>> channel_ids) { |
| 326 DCHECK(CalledOnValidThread()); | 326 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 327 for (std::vector<std::unique_ptr<ChannelID>>::iterator it = | 327 for (std::vector<std::unique_ptr<ChannelID>>::iterator it = |
| 328 channel_ids->begin(); | 328 channel_ids->begin(); |
| 329 it != channel_ids->end(); ++it) { | 329 it != channel_ids->end(); ++it) { |
| 330 DCHECK(channel_ids_.find((*it)->server_identifier()) == | 330 DCHECK(channel_ids_.find((*it)->server_identifier()) == |
| 331 channel_ids_.end()); | 331 channel_ids_.end()); |
| 332 std::string ident = (*it)->server_identifier(); | 332 std::string ident = (*it)->server_identifier(); |
| 333 channel_ids_[ident] = it->release(); | 333 channel_ids_[ident] = it->release(); |
| 334 } | 334 } |
| 335 channel_ids->clear(); | 335 channel_ids->clear(); |
| 336 | 336 |
| 337 loaded_ = true; | 337 loaded_ = true; |
| 338 | 338 |
| 339 for (std::unique_ptr<Task>& i : waiting_tasks_) | 339 for (std::unique_ptr<Task>& i : waiting_tasks_) |
| 340 i->Run(this); | 340 i->Run(this); |
| 341 waiting_tasks_.clear(); | 341 waiting_tasks_.clear(); |
| 342 } | 342 } |
| 343 | 343 |
| 344 void DefaultChannelIDStore::SyncSetChannelID( | 344 void DefaultChannelIDStore::SyncSetChannelID( |
| 345 std::unique_ptr<ChannelID> channel_id) { | 345 std::unique_ptr<ChannelID> channel_id) { |
| 346 DCHECK(CalledOnValidThread()); | 346 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 347 DCHECK(loaded_); | 347 DCHECK(loaded_); |
| 348 | 348 |
| 349 InternalDeleteChannelID(channel_id->server_identifier()); | 349 InternalDeleteChannelID(channel_id->server_identifier()); |
| 350 InternalInsertChannelID(std::move(channel_id)); | 350 InternalInsertChannelID(std::move(channel_id)); |
| 351 } | 351 } |
| 352 | 352 |
| 353 void DefaultChannelIDStore::SyncDeleteChannelID( | 353 void DefaultChannelIDStore::SyncDeleteChannelID( |
| 354 const std::string& server_identifier) { | 354 const std::string& server_identifier) { |
| 355 DCHECK(CalledOnValidThread()); | 355 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 356 DCHECK(loaded_); | 356 DCHECK(loaded_); |
| 357 InternalDeleteChannelID(server_identifier); | 357 InternalDeleteChannelID(server_identifier); |
| 358 } | 358 } |
| 359 | 359 |
| 360 void DefaultChannelIDStore::SyncDeleteForDomainsCreatedBetween( | 360 void DefaultChannelIDStore::SyncDeleteForDomainsCreatedBetween( |
| 361 const base::Callback<bool(const std::string&)>& domain_predicate, | 361 const base::Callback<bool(const std::string&)>& domain_predicate, |
| 362 base::Time delete_begin, | 362 base::Time delete_begin, |
| 363 base::Time delete_end) { | 363 base::Time delete_end) { |
| 364 DCHECK(CalledOnValidThread()); | 364 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 365 DCHECK(loaded_); | 365 DCHECK(loaded_); |
| 366 for (ChannelIDMap::iterator it = channel_ids_.begin(); | 366 for (ChannelIDMap::iterator it = channel_ids_.begin(); |
| 367 it != channel_ids_.end();) { | 367 it != channel_ids_.end();) { |
| 368 ChannelIDMap::iterator cur = it; | 368 ChannelIDMap::iterator cur = it; |
| 369 ++it; | 369 ++it; |
| 370 ChannelID* channel_id = cur->second; | 370 ChannelID* channel_id = cur->second; |
| 371 | 371 |
| 372 if ((delete_begin.is_null() || | 372 if ((delete_begin.is_null() || |
| 373 channel_id->creation_time() >= delete_begin) && | 373 channel_id->creation_time() >= delete_begin) && |
| 374 (delete_end.is_null() || channel_id->creation_time() < delete_end) && | 374 (delete_end.is_null() || channel_id->creation_time() < delete_end) && |
| 375 domain_predicate.Run(channel_id->server_identifier())) { | 375 domain_predicate.Run(channel_id->server_identifier())) { |
| 376 if (store_) | 376 if (store_) |
| 377 store_->DeleteChannelID(*channel_id); | 377 store_->DeleteChannelID(*channel_id); |
| 378 delete channel_id; | 378 delete channel_id; |
| 379 channel_ids_.erase(cur); | 379 channel_ids_.erase(cur); |
| 380 } | 380 } |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 | 383 |
| 384 void DefaultChannelIDStore::SyncGetAllChannelIDs( | 384 void DefaultChannelIDStore::SyncGetAllChannelIDs( |
| 385 ChannelIDList* channel_id_list) { | 385 ChannelIDList* channel_id_list) { |
| 386 DCHECK(CalledOnValidThread()); | 386 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 387 DCHECK(loaded_); | 387 DCHECK(loaded_); |
| 388 for (ChannelIDMap::iterator it = channel_ids_.begin(); | 388 for (ChannelIDMap::iterator it = channel_ids_.begin(); |
| 389 it != channel_ids_.end(); ++it) | 389 it != channel_ids_.end(); ++it) |
| 390 channel_id_list->push_back(*it->second); | 390 channel_id_list->push_back(*it->second); |
| 391 } | 391 } |
| 392 | 392 |
| 393 void DefaultChannelIDStore::EnqueueTask(std::unique_ptr<Task> task) { | 393 void DefaultChannelIDStore::EnqueueTask(std::unique_ptr<Task> task) { |
| 394 DCHECK(CalledOnValidThread()); | 394 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 395 DCHECK(!loaded_); | 395 DCHECK(!loaded_); |
| 396 waiting_tasks_.push_back(std::move(task)); | 396 waiting_tasks_.push_back(std::move(task)); |
| 397 } | 397 } |
| 398 | 398 |
| 399 void DefaultChannelIDStore::RunOrEnqueueTask(std::unique_ptr<Task> task) { | 399 void DefaultChannelIDStore::RunOrEnqueueTask(std::unique_ptr<Task> task) { |
| 400 DCHECK(CalledOnValidThread()); | 400 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 401 InitIfNecessary(); | 401 InitIfNecessary(); |
| 402 | 402 |
| 403 if (!loaded_) { | 403 if (!loaded_) { |
| 404 EnqueueTask(std::move(task)); | 404 EnqueueTask(std::move(task)); |
| 405 return; | 405 return; |
| 406 } | 406 } |
| 407 | 407 |
| 408 task->Run(this); | 408 task->Run(this); |
| 409 } | 409 } |
| 410 | 410 |
| 411 void DefaultChannelIDStore::InternalDeleteChannelID( | 411 void DefaultChannelIDStore::InternalDeleteChannelID( |
| 412 const std::string& server_identifier) { | 412 const std::string& server_identifier) { |
| 413 DCHECK(CalledOnValidThread()); | 413 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 414 DCHECK(loaded_); | 414 DCHECK(loaded_); |
| 415 | 415 |
| 416 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); | 416 ChannelIDMap::iterator it = channel_ids_.find(server_identifier); |
| 417 if (it == channel_ids_.end()) | 417 if (it == channel_ids_.end()) |
| 418 return; // There is nothing to delete. | 418 return; // There is nothing to delete. |
| 419 | 419 |
| 420 ChannelID* channel_id = it->second; | 420 ChannelID* channel_id = it->second; |
| 421 if (store_) | 421 if (store_) |
| 422 store_->DeleteChannelID(*channel_id); | 422 store_->DeleteChannelID(*channel_id); |
| 423 channel_ids_.erase(it); | 423 channel_ids_.erase(it); |
| 424 delete channel_id; | 424 delete channel_id; |
| 425 } | 425 } |
| 426 | 426 |
| 427 void DefaultChannelIDStore::InternalInsertChannelID( | 427 void DefaultChannelIDStore::InternalInsertChannelID( |
| 428 std::unique_ptr<ChannelID> channel_id) { | 428 std::unique_ptr<ChannelID> channel_id) { |
| 429 DCHECK(CalledOnValidThread()); | 429 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 430 DCHECK(loaded_); | 430 DCHECK(loaded_); |
| 431 | 431 |
| 432 if (store_) | 432 if (store_) |
| 433 store_->AddChannelID(*channel_id); | 433 store_->AddChannelID(*channel_id); |
| 434 const std::string& server_identifier = channel_id->server_identifier(); | 434 const std::string& server_identifier = channel_id->server_identifier(); |
| 435 channel_ids_[server_identifier] = channel_id.release(); | 435 channel_ids_[server_identifier] = channel_id.release(); |
| 436 } | 436 } |
| 437 | 437 |
| 438 bool DefaultChannelIDStore::IsEphemeral() { | 438 bool DefaultChannelIDStore::IsEphemeral() { |
| 439 return !store_; | 439 return !store_; |
| 440 } | 440 } |
| 441 | 441 |
| 442 DefaultChannelIDStore::PersistentStore::PersistentStore() {} | 442 DefaultChannelIDStore::PersistentStore::PersistentStore() {} |
| 443 | 443 |
| 444 DefaultChannelIDStore::PersistentStore::~PersistentStore() {} | 444 DefaultChannelIDStore::PersistentStore::~PersistentStore() {} |
| 445 | 445 |
| 446 } // namespace net | 446 } // namespace net |
| OLD | NEW |