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/base/server_bound_cert_service.h" | 5 #include "net/base/server_bound_cert_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 } | 342 } |
343 } | 343 } |
344 | 344 |
345 std::vector<ServerBoundCertServiceRequest*> requests_; | 345 std::vector<ServerBoundCertServiceRequest*> requests_; |
346 SSLClientCertType type_; | 346 SSLClientCertType type_; |
347 }; | 347 }; |
348 | 348 |
349 // static | 349 // static |
350 const char ServerBoundCertService::kEPKIPassword[] = ""; | 350 const char ServerBoundCertService::kEPKIPassword[] = ""; |
351 | 351 |
| 352 ServerBoundCertService::RequestHandle::RequestHandle() |
| 353 : service_(NULL), |
| 354 request_(NULL) {} |
| 355 |
| 356 ServerBoundCertService::RequestHandle::~RequestHandle() { |
| 357 Cancel(); |
| 358 } |
| 359 |
| 360 void ServerBoundCertService::RequestHandle::Cancel() { |
| 361 if (request_) { |
| 362 service_->CancelRequest(request_); |
| 363 request_ = NULL; |
| 364 callback_.Reset(); |
| 365 } |
| 366 } |
| 367 |
| 368 void ServerBoundCertService::RequestHandle::RequestStarted( |
| 369 ServerBoundCertService* service, |
| 370 ServerBoundCertServiceRequest* request, |
| 371 const CompletionCallback& callback) { |
| 372 DCHECK(request_ == NULL); |
| 373 service_ = service; |
| 374 request_ = request; |
| 375 callback_ = callback; |
| 376 } |
| 377 |
| 378 void ServerBoundCertService::RequestHandle::OnRequestComplete(int result) { |
| 379 request_ = NULL; |
| 380 callback_.Run(result); |
| 381 callback_.Reset(); |
| 382 } |
| 383 |
352 ServerBoundCertService::ServerBoundCertService( | 384 ServerBoundCertService::ServerBoundCertService( |
353 ServerBoundCertStore* server_bound_cert_store, | 385 ServerBoundCertStore* server_bound_cert_store, |
354 const scoped_refptr<base::TaskRunner>& task_runner) | 386 const scoped_refptr<base::TaskRunner>& task_runner) |
355 : server_bound_cert_store_(server_bound_cert_store), | 387 : server_bound_cert_store_(server_bound_cert_store), |
356 task_runner_(task_runner), | 388 task_runner_(task_runner), |
357 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), | 389 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), |
358 requests_(0), | 390 requests_(0), |
359 cert_store_hits_(0), | 391 cert_store_hits_(0), |
360 inflight_joins_(0) { | 392 inflight_joins_(0) { |
361 base::Time start = base::Time::Now(); | 393 base::Time start = base::Time::Now(); |
(...skipping 22 matching lines...) Expand all Loading... |
384 std::string* private_key, | 416 std::string* private_key, |
385 std::string* cert, | 417 std::string* cert, |
386 const CompletionCallback& callback, | 418 const CompletionCallback& callback, |
387 RequestHandle* out_req) { | 419 RequestHandle* out_req) { |
388 DVLOG(1) << __FUNCTION__ << " " << origin << " " | 420 DVLOG(1) << __FUNCTION__ << " " << origin << " " |
389 << (requested_types.empty() ? -1 : requested_types[0]) | 421 << (requested_types.empty() ? -1 : requested_types[0]) |
390 << (requested_types.size() > 1 ? "..." : ""); | 422 << (requested_types.size() > 1 ? "..." : ""); |
391 DCHECK(CalledOnValidThread()); | 423 DCHECK(CalledOnValidThread()); |
392 base::TimeTicks request_start = base::TimeTicks::Now(); | 424 base::TimeTicks request_start = base::TimeTicks::Now(); |
393 | 425 |
394 *out_req = NULL; | |
395 | |
396 if (callback.is_null() || !private_key || !cert || origin.empty() || | 426 if (callback.is_null() || !private_key || !cert || origin.empty() || |
397 requested_types.empty()) { | 427 requested_types.empty()) { |
398 RecordGetDomainBoundCertResult(INVALID_ARGUMENT); | 428 RecordGetDomainBoundCertResult(INVALID_ARGUMENT); |
399 return ERR_INVALID_ARGUMENT; | 429 return ERR_INVALID_ARGUMENT; |
400 } | 430 } |
401 | 431 |
402 std::string domain = GetDomainForHost(GURL(origin).host()); | 432 std::string domain = GetDomainForHost(GURL(origin).host()); |
403 if (domain.empty()) { | 433 if (domain.empty()) { |
404 RecordGetDomainBoundCertResult(INVALID_ARGUMENT); | 434 RecordGetDomainBoundCertResult(INVALID_ARGUMENT); |
405 return ERR_INVALID_ARGUMENT; | 435 return ERR_INVALID_ARGUMENT; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 // TODO(rkn): Log to the NetLog. | 514 // TODO(rkn): Log to the NetLog. |
485 LOG(ERROR) << "ServerBoundCertServiceWorker couldn't be started."; | 515 LOG(ERROR) << "ServerBoundCertServiceWorker couldn't be started."; |
486 RecordGetDomainBoundCertResult(WORKER_FAILURE); | 516 RecordGetDomainBoundCertResult(WORKER_FAILURE); |
487 return ERR_INSUFFICIENT_RESOURCES; // Just a guess. | 517 return ERR_INSUFFICIENT_RESOURCES; // Just a guess. |
488 } | 518 } |
489 job = new ServerBoundCertServiceJob(preferred_type); | 519 job = new ServerBoundCertServiceJob(preferred_type); |
490 inflight_[domain] = job; | 520 inflight_[domain] = job; |
491 } | 521 } |
492 | 522 |
493 ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest( | 523 ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest( |
494 request_start, callback, type, private_key, cert); | 524 request_start, |
| 525 base::Bind(&RequestHandle::OnRequestComplete, base::Unretained(out_req)), |
| 526 type, private_key, cert); |
495 job->AddRequest(request); | 527 job->AddRequest(request); |
496 *out_req = request; | 528 out_req->RequestStarted(this, request, callback); |
497 return ERR_IO_PENDING; | 529 return ERR_IO_PENDING; |
498 } | 530 } |
499 | 531 |
500 ServerBoundCertStore* ServerBoundCertService::GetCertStore() { | 532 ServerBoundCertStore* ServerBoundCertService::GetCertStore() { |
501 return server_bound_cert_store_.get(); | 533 return server_bound_cert_store_.get(); |
502 } | 534 } |
503 | 535 |
504 void ServerBoundCertService::CancelRequest(RequestHandle req) { | 536 void ServerBoundCertService::CancelRequest(ServerBoundCertServiceRequest* req) { |
505 DCHECK(CalledOnValidThread()); | 537 DCHECK(CalledOnValidThread()); |
506 ServerBoundCertServiceRequest* request = | 538 req->Cancel(); |
507 reinterpret_cast<ServerBoundCertServiceRequest*>(req); | |
508 request->Cancel(); | |
509 } | 539 } |
510 | 540 |
511 // HandleResult is called by ServerBoundCertServiceWorker on the origin message | 541 // HandleResult is called by ServerBoundCertServiceWorker on the origin message |
512 // loop. It deletes ServerBoundCertServiceJob. | 542 // loop. It deletes ServerBoundCertServiceJob. |
513 void ServerBoundCertService::HandleResult( | 543 void ServerBoundCertService::HandleResult( |
514 const std::string& server_identifier, | 544 const std::string& server_identifier, |
515 int error, | 545 int error, |
516 scoped_ptr<ServerBoundCertStore::ServerBoundCert> cert) { | 546 scoped_ptr<ServerBoundCertStore::ServerBoundCert> cert) { |
517 DCHECK(CalledOnValidThread()); | 547 DCHECK(CalledOnValidThread()); |
518 | 548 |
(...skipping 19 matching lines...) Expand all Loading... |
538 else | 568 else |
539 job->HandleResult(error, CLIENT_CERT_INVALID_TYPE, "", ""); | 569 job->HandleResult(error, CLIENT_CERT_INVALID_TYPE, "", ""); |
540 delete job; | 570 delete job; |
541 } | 571 } |
542 | 572 |
543 int ServerBoundCertService::cert_count() { | 573 int ServerBoundCertService::cert_count() { |
544 return server_bound_cert_store_->GetCertCount(); | 574 return server_bound_cert_store_->GetCertCount(); |
545 } | 575 } |
546 | 576 |
547 } // namespace net | 577 } // namespace net |
OLD | NEW |