Index: content/browser/media/webrtc/webrtc_identity_store.cc |
diff --git a/content/browser/media/webrtc/webrtc_identity_store.cc b/content/browser/media/webrtc/webrtc_identity_store.cc |
deleted file mode 100644 |
index 0dc62e4ecda6e873a244b02fd5f1804a4c5b2696..0000000000000000000000000000000000000000 |
--- a/content/browser/media/webrtc/webrtc_identity_store.cc |
+++ /dev/null |
@@ -1,325 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/media/webrtc/webrtc_identity_store.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <map> |
- |
-#include "base/bind.h" |
-#include "base/callback_helpers.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/rand_util.h" |
-#include "base/threading/worker_pool.h" |
-#include "content/browser/media/webrtc/webrtc_identity_store_backend.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "crypto/rsa_private_key.h" |
-#include "net/base/net_errors.h" |
-#include "net/cert/x509_util.h" |
-#include "url/gurl.h" |
- |
-namespace content { |
- |
-struct WebRTCIdentityRequestResult { |
- WebRTCIdentityRequestResult(int error, |
- const std::string& certificate, |
- const std::string& private_key) |
- : error(error), certificate(certificate), private_key(private_key) {} |
- |
- int error; |
- std::string certificate; |
- std::string private_key; |
-}; |
- |
-// Generates a new identity using |common_name| which expires after |
-// |validity_period| and returns the result in |result|. |
-static void GenerateIdentityWorker(const std::string& common_name, |
- base::TimeDelta validity_period, |
- WebRTCIdentityRequestResult* result) { |
- result->error = net::OK; |
- int serial_number = base::RandInt(0, std::numeric_limits<int>::max()); |
- |
- std::unique_ptr<crypto::RSAPrivateKey> key; |
- base::Time now = base::Time::Now(); |
- bool success = net::x509_util::CreateKeyAndSelfSignedCert( |
- "CN=" + common_name, |
- serial_number, |
- now, |
- now + validity_period, |
- &key, |
- &result->certificate); |
- |
- if (!success) { |
- DLOG(ERROR) << "Unable to create x509 cert for client"; |
- result->error = net::ERR_SELF_SIGNED_CERT_GENERATION_FAILED; |
- return; |
- } |
- |
- std::vector<uint8_t> private_key_info; |
- if (!key->ExportPrivateKey(&private_key_info)) { |
- DLOG(ERROR) << "Unable to export private key"; |
- result->error = net::ERR_PRIVATE_KEY_EXPORT_FAILED; |
- return; |
- } |
- |
- result->private_key = |
- std::string(private_key_info.begin(), private_key_info.end()); |
-} |
- |
-class WebRTCIdentityRequestHandle; |
- |
-// The class represents an identity request internal to WebRTCIdentityStore. |
-// It has a one-to-many mapping to the external version of the request, |
-// WebRTCIdentityRequestHandle, i.e. multiple identical external requests are |
-// combined into one internal request. |
-// It's deleted automatically when the request is completed. |
-class WebRTCIdentityRequest { |
- public: |
- WebRTCIdentityRequest(const GURL& origin, |
- const std::string& identity_name, |
- const std::string& common_name, |
- bool enable_cache) |
- : origin_(origin), |
- identity_name_(identity_name), |
- common_name_(common_name), |
- enable_cache_(enable_cache) {} |
- |
- void Cancel(WebRTCIdentityRequestHandle* handle) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (callbacks_.find(handle) == callbacks_.end()) |
- return; |
- callbacks_.erase(handle); |
- } |
- |
- bool enable_cache() const { return enable_cache_; } |
- |
- private: |
- friend class WebRTCIdentityStore; |
- |
- void AddCallback(WebRTCIdentityRequestHandle* handle, |
- const WebRTCIdentityStore::CompletionCallback& callback) { |
- DCHECK(callbacks_.find(handle) == callbacks_.end()); |
- callbacks_[handle] = callback; |
- } |
- |
- // This method deletes "this" and no one should access it after the request |
- // completes. |
- // We do not use base::Owned to tie its lifetime to the callback for |
- // WebRTCIdentityStoreBackend::FindIdentity, because it needs to live longer |
- // than that if the identity does not exist in DB. |
- void Post(const WebRTCIdentityRequestResult& result) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- for (CallbackMap::iterator it = callbacks_.begin(); it != callbacks_.end(); |
- ++it) |
- it->second.Run(result.error, result.certificate, result.private_key); |
- delete this; |
- } |
- |
- GURL origin_; |
- std::string identity_name_; |
- std::string common_name_; |
- typedef std::map<WebRTCIdentityRequestHandle*, |
- WebRTCIdentityStore::CompletionCallback> CallbackMap; |
- CallbackMap callbacks_; |
- bool enable_cache_; |
-}; |
- |
-// The class represents an identity request which calls back to the external |
-// client when the request completes. |
-// Its lifetime is tied with the Callback held by the corresponding |
-// WebRTCIdentityRequest. |
-class WebRTCIdentityRequestHandle { |
- public: |
- WebRTCIdentityRequestHandle( |
- WebRTCIdentityStore* store, |
- const WebRTCIdentityStore::CompletionCallback& callback) |
- : request_(NULL), callback_(callback) {} |
- |
- private: |
- friend class WebRTCIdentityStore; |
- |
- // Cancel the request. Does nothing if the request finished or was already |
- // cancelled. |
- void Cancel() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!request_) |
- return; |
- |
- callback_.Reset(); |
- WebRTCIdentityRequest* request = request_; |
- request_ = NULL; |
- // "this" will be deleted after the following call, because "this" is |
- // owned by the Callback held by |request|. |
- request->Cancel(this); |
- } |
- |
- void OnRequestStarted(WebRTCIdentityRequest* request) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(request); |
- request_ = request; |
- } |
- |
- void OnRequestComplete(int error, |
- const std::string& certificate, |
- const std::string& private_key) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(request_); |
- request_ = NULL; |
- base::ResetAndReturn(&callback_).Run(error, certificate, private_key); |
- } |
- |
- WebRTCIdentityRequest* request_; |
- WebRTCIdentityStore::CompletionCallback callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(WebRTCIdentityRequestHandle); |
-}; |
- |
-WebRTCIdentityStore::WebRTCIdentityStore(const base::FilePath& path, |
- storage::SpecialStoragePolicy* policy) |
- : validity_period_(base::TimeDelta::FromDays(30)), |
- task_runner_(base::WorkerPool::GetTaskRunner(true)), |
- backend_(new WebRTCIdentityStoreBackend(path, policy, validity_period_)) { |
- } |
- |
-WebRTCIdentityStore::~WebRTCIdentityStore() { backend_->Close(); } |
- |
-base::Closure WebRTCIdentityStore::RequestIdentity( |
- const GURL& origin, |
- const std::string& identity_name, |
- const std::string& common_name, |
- const CompletionCallback& callback, |
- bool enable_cache) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- WebRTCIdentityRequest* request = |
- FindRequest(origin, identity_name, common_name); |
- // If there is no identical request in flight, create a new one, queue it, |
- // and make the backend request. |
- if (!request) { |
- request = new WebRTCIdentityRequest(origin, identity_name, common_name, |
- enable_cache); |
- // In either case, |request| will delete itself after the result is posted. |
- if (enable_cache) { |
- if (!backend_->FindIdentity( |
- origin, identity_name, common_name, |
- base::Bind(&WebRTCIdentityStore::BackendFindCallback, this, |
- request))) { |
- // Bail out if the backend failed to start the task. |
- delete request; |
- return base::Closure(); |
- } |
- } else { |
- GenerateNewIdentity(request); |
- } |
- in_flight_requests_.push_back(request); |
- } |
- |
- WebRTCIdentityRequestHandle* handle = |
- new WebRTCIdentityRequestHandle(this, callback); |
- |
- request->AddCallback( |
- handle, |
- base::Bind(&WebRTCIdentityRequestHandle::OnRequestComplete, |
- base::Owned(handle))); |
- handle->OnRequestStarted(request); |
- return base::Bind(&WebRTCIdentityRequestHandle::Cancel, |
- base::Unretained(handle)); |
-} |
- |
-void WebRTCIdentityStore::DeleteBetween(base::Time delete_begin, |
- base::Time delete_end, |
- const base::Closure& callback) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- backend_->DeleteBetween(delete_begin, delete_end, callback); |
-} |
- |
-void WebRTCIdentityStore::SetValidityPeriodForTesting( |
- base::TimeDelta validity_period) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- validity_period_ = validity_period; |
- backend_->SetValidityPeriodForTesting(validity_period); |
-} |
- |
-void WebRTCIdentityStore::SetTaskRunnerForTesting( |
- const scoped_refptr<base::TaskRunner>& task_runner) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- task_runner_ = task_runner; |
-} |
- |
-void WebRTCIdentityStore::BackendFindCallback(WebRTCIdentityRequest* request, |
- int error, |
- const std::string& certificate, |
- const std::string& private_key) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (error == net::OK) { |
- DVLOG(2) << "Identity found in DB."; |
- WebRTCIdentityRequestResult result(error, certificate, private_key); |
- PostRequestResult(request, result); |
- return; |
- } |
- GenerateNewIdentity(request); |
-} |
- |
-void WebRTCIdentityStore::GenerateIdentityCallback( |
- WebRTCIdentityRequest* request, |
- WebRTCIdentityRequestResult* result) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (result->error == net::OK && request->enable_cache()) { |
- DVLOG(2) << "New identity generated and added to the backend."; |
- backend_->AddIdentity(request->origin_, |
- request->identity_name_, |
- request->common_name_, |
- result->certificate, |
- result->private_key); |
- } |
- PostRequestResult(request, *result); |
-} |
- |
-void WebRTCIdentityStore::PostRequestResult( |
- WebRTCIdentityRequest* request, |
- const WebRTCIdentityRequestResult& result) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- // Removes the in flight request from the queue. |
- for (size_t i = 0; i < in_flight_requests_.size(); ++i) { |
- if (in_flight_requests_[i] == request) { |
- in_flight_requests_.erase(in_flight_requests_.begin() + i); |
- break; |
- } |
- } |
- // |request| will be deleted after this call. |
- request->Post(result); |
-} |
- |
-// Find an identical request from the in flight requests. |
-WebRTCIdentityRequest* WebRTCIdentityStore::FindRequest( |
- const GURL& origin, |
- const std::string& identity_name, |
- const std::string& common_name) { |
- for (size_t i = 0; i < in_flight_requests_.size(); ++i) { |
- if (in_flight_requests_[i]->origin_ == origin && |
- in_flight_requests_[i]->identity_name_ == identity_name && |
- in_flight_requests_[i]->common_name_ == common_name) { |
- return in_flight_requests_[i]; |
- } |
- } |
- return NULL; |
-} |
- |
-void WebRTCIdentityStore::GenerateNewIdentity(WebRTCIdentityRequest* request) { |
- WebRTCIdentityRequestResult* result = |
- new WebRTCIdentityRequestResult(0, "", ""); |
- if (!task_runner_->PostTaskAndReply( |
- FROM_HERE, base::Bind(&GenerateIdentityWorker, request->common_name_, |
- validity_period_, result), |
- base::Bind(&WebRTCIdentityStore::GenerateIdentityCallback, this, |
- request, base::Owned(result)))) { |
- // Completes the request with error if failed to post the task. |
- WebRTCIdentityRequestResult result(net::ERR_UNEXPECTED, "", ""); |
- PostRequestResult(request, result); |
- } |
-} |
- |
-} // namespace content |