| 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/channel_id_service.h" | 5 #include "net/ssl/channel_id_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 ChannelIDService::ChannelIDService(ChannelIDStore* channel_id_store) | 254 ChannelIDService::ChannelIDService(ChannelIDStore* channel_id_store) |
| 255 : channel_id_store_(channel_id_store), | 255 : channel_id_store_(channel_id_store), |
| 256 id_(g_next_id.GetNext()), | 256 id_(g_next_id.GetNext()), |
| 257 requests_(0), | 257 requests_(0), |
| 258 key_store_hits_(0), | 258 key_store_hits_(0), |
| 259 inflight_joins_(0), | 259 inflight_joins_(0), |
| 260 workers_created_(0), | 260 workers_created_(0), |
| 261 weak_ptr_factory_(this) {} | 261 weak_ptr_factory_(this) {} |
| 262 | 262 |
| 263 ChannelIDService::~ChannelIDService() { | 263 ChannelIDService::~ChannelIDService() { |
| 264 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 264 } | 265 } |
| 265 | 266 |
| 266 // static | 267 // static |
| 267 std::string ChannelIDService::GetDomainForHost(const std::string& host) { | 268 std::string ChannelIDService::GetDomainForHost(const std::string& host) { |
| 268 std::string domain = | 269 std::string domain = |
| 269 registry_controlled_domains::GetDomainAndRegistry( | 270 registry_controlled_domains::GetDomainAndRegistry( |
| 270 host, registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); | 271 host, registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); |
| 271 if (domain.empty()) | 272 if (domain.empty()) |
| 272 return host; | 273 return host; |
| 273 return domain; | 274 return domain; |
| 274 } | 275 } |
| 275 | 276 |
| 276 int ChannelIDService::GetOrCreateChannelID( | 277 int ChannelIDService::GetOrCreateChannelID( |
| 277 const std::string& host, | 278 const std::string& host, |
| 278 std::unique_ptr<crypto::ECPrivateKey>* key, | 279 std::unique_ptr<crypto::ECPrivateKey>* key, |
| 279 const CompletionCallback& callback, | 280 const CompletionCallback& callback, |
| 280 Request* out_req) { | 281 Request* out_req) { |
| 281 DVLOG(1) << __func__ << " " << host; | 282 DVLOG(1) << __func__ << " " << host; |
| 282 DCHECK(CalledOnValidThread()); | 283 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 283 | 284 |
| 284 if (callback.is_null() || !key || host.empty()) { | 285 if (callback.is_null() || !key || host.empty()) { |
| 285 RecordGetChannelIDResult(INVALID_ARGUMENT); | 286 RecordGetChannelIDResult(INVALID_ARGUMENT); |
| 286 return ERR_INVALID_ARGUMENT; | 287 return ERR_INVALID_ARGUMENT; |
| 287 } | 288 } |
| 288 | 289 |
| 289 std::string domain = GetDomainForHost(host); | 290 std::string domain = GetDomainForHost(host); |
| 290 if (domain.empty()) { | 291 if (domain.empty()) { |
| 291 RecordGetChannelIDResult(INVALID_ARGUMENT); | 292 RecordGetChannelIDResult(INVALID_ARGUMENT); |
| 292 return ERR_INVALID_ARGUMENT; | 293 return ERR_INVALID_ARGUMENT; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 321 } | 322 } |
| 322 | 323 |
| 323 return err; | 324 return err; |
| 324 } | 325 } |
| 325 | 326 |
| 326 int ChannelIDService::GetChannelID(const std::string& host, | 327 int ChannelIDService::GetChannelID(const std::string& host, |
| 327 std::unique_ptr<crypto::ECPrivateKey>* key, | 328 std::unique_ptr<crypto::ECPrivateKey>* key, |
| 328 const CompletionCallback& callback, | 329 const CompletionCallback& callback, |
| 329 Request* out_req) { | 330 Request* out_req) { |
| 330 DVLOG(1) << __func__ << " " << host; | 331 DVLOG(1) << __func__ << " " << host; |
| 331 DCHECK(CalledOnValidThread()); | 332 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 332 | 333 |
| 333 if (callback.is_null() || !key || host.empty()) { | 334 if (callback.is_null() || !key || host.empty()) { |
| 334 RecordGetChannelIDResult(INVALID_ARGUMENT); | 335 RecordGetChannelIDResult(INVALID_ARGUMENT); |
| 335 return ERR_INVALID_ARGUMENT; | 336 return ERR_INVALID_ARGUMENT; |
| 336 } | 337 } |
| 337 | 338 |
| 338 std::string domain = GetDomainForHost(host); | 339 std::string domain = GetDomainForHost(host); |
| 339 if (domain.empty()) { | 340 if (domain.empty()) { |
| 340 RecordGetChannelIDResult(INVALID_ARGUMENT); | 341 RecordGetChannelIDResult(INVALID_ARGUMENT); |
| 341 return ERR_INVALID_ARGUMENT; | 342 return ERR_INVALID_ARGUMENT; |
| 342 } | 343 } |
| 343 | 344 |
| 344 requests_++; | 345 requests_++; |
| 345 | 346 |
| 346 // See if a request for the same domain currently in flight. | 347 // See if a request for the same domain currently in flight. |
| 347 bool create_if_missing = false; | 348 bool create_if_missing = false; |
| 348 if (JoinToInFlightRequest(domain, key, create_if_missing, callback, | 349 if (JoinToInFlightRequest(domain, key, create_if_missing, callback, |
| 349 out_req)) { | 350 out_req)) { |
| 350 return ERR_IO_PENDING; | 351 return ERR_IO_PENDING; |
| 351 } | 352 } |
| 352 | 353 |
| 353 int err = LookupChannelID(domain, key, create_if_missing, callback, out_req); | 354 int err = LookupChannelID(domain, key, create_if_missing, callback, out_req); |
| 354 return err; | 355 return err; |
| 355 } | 356 } |
| 356 | 357 |
| 357 void ChannelIDService::GotChannelID(int err, | 358 void ChannelIDService::GotChannelID(int err, |
| 358 const std::string& server_identifier, | 359 const std::string& server_identifier, |
| 359 std::unique_ptr<crypto::ECPrivateKey> key) { | 360 std::unique_ptr<crypto::ECPrivateKey> key) { |
| 360 DCHECK(CalledOnValidThread()); | 361 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 361 | 362 |
| 362 auto j = inflight_.find(server_identifier); | 363 auto j = inflight_.find(server_identifier); |
| 363 if (j == inflight_.end()) { | 364 if (j == inflight_.end()) { |
| 364 NOTREACHED(); | 365 NOTREACHED(); |
| 365 return; | 366 return; |
| 366 } | 367 } |
| 367 | 368 |
| 368 if (err == OK) { | 369 if (err == OK) { |
| 369 // Async DB lookup found a valid channel ID. | 370 // Async DB lookup found a valid channel ID. |
| 370 key_store_hits_++; | 371 key_store_hits_++; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 390 } | 391 } |
| 391 | 392 |
| 392 ChannelIDStore* ChannelIDService::GetChannelIDStore() { | 393 ChannelIDStore* ChannelIDService::GetChannelIDStore() { |
| 393 return channel_id_store_.get(); | 394 return channel_id_store_.get(); |
| 394 } | 395 } |
| 395 | 396 |
| 396 void ChannelIDService::GeneratedChannelID( | 397 void ChannelIDService::GeneratedChannelID( |
| 397 const std::string& server_identifier, | 398 const std::string& server_identifier, |
| 398 int error, | 399 int error, |
| 399 std::unique_ptr<ChannelIDStore::ChannelID> channel_id) { | 400 std::unique_ptr<ChannelIDStore::ChannelID> channel_id) { |
| 400 DCHECK(CalledOnValidThread()); | 401 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 401 | 402 |
| 402 std::unique_ptr<crypto::ECPrivateKey> key; | 403 std::unique_ptr<crypto::ECPrivateKey> key; |
| 403 if (error == OK) { | 404 if (error == OK) { |
| 404 key = channel_id->key()->Copy(); | 405 key = channel_id->key()->Copy(); |
| 405 channel_id_store_->SetChannelID(std::move(channel_id)); | 406 channel_id_store_->SetChannelID(std::move(channel_id)); |
| 406 } | 407 } |
| 407 HandleResult(error, server_identifier, std::move(key)); | 408 HandleResult(error, server_identifier, std::move(key)); |
| 408 } | 409 } |
| 409 | 410 |
| 410 void ChannelIDService::HandleResult(int error, | 411 void ChannelIDService::HandleResult(int error, |
| 411 const std::string& server_identifier, | 412 const std::string& server_identifier, |
| 412 std::unique_ptr<crypto::ECPrivateKey> key) { | 413 std::unique_ptr<crypto::ECPrivateKey> key) { |
| 413 DCHECK(CalledOnValidThread()); | 414 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| 414 | 415 |
| 415 auto j = inflight_.find(server_identifier); | 416 auto j = inflight_.find(server_identifier); |
| 416 if (j == inflight_.end()) { | 417 if (j == inflight_.end()) { |
| 417 NOTREACHED(); | 418 NOTREACHED(); |
| 418 return; | 419 return; |
| 419 } | 420 } |
| 420 std::unique_ptr<ChannelIDServiceJob> job = std::move(j->second); | 421 std::unique_ptr<ChannelIDServiceJob> job = std::move(j->second); |
| 421 inflight_.erase(j); | 422 inflight_.erase(j); |
| 422 | 423 |
| 423 job->HandleResult(error, std::move(key)); | 424 job->HandleResult(error, std::move(key)); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 } | 476 } |
| 476 | 477 |
| 477 return err; | 478 return err; |
| 478 } | 479 } |
| 479 | 480 |
| 480 int ChannelIDService::channel_id_count() { | 481 int ChannelIDService::channel_id_count() { |
| 481 return channel_id_store_->GetChannelIDCount(); | 482 return channel_id_store_->GetChannelIDCount(); |
| 482 } | 483 } |
| 483 | 484 |
| 484 } // namespace net | 485 } // namespace net |
| OLD | NEW |