| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/renderer/media/peer_connection_identity_store.h" | 5 #include "content/renderer/media/peer_connection_identity_store.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/thread_task_runner_handle.h" | 8 #include "base/thread_task_runner_handle.h" |
| 9 #include "content/renderer/media/webrtc_identity_service.h" | 9 #include "content/renderer/media/webrtc_identity_service.h" |
| 10 #include "content/renderer/render_thread_impl.h" | 10 #include "content/renderer/render_thread_impl.h" |
| 11 | 11 |
| 12 namespace content { | 12 namespace content { |
| 13 namespace { | 13 namespace { |
| 14 const char kIdentityName[] = "WebRTC"; |
| 15 |
| 14 // Bridges identity requests between the main render thread and libjingle's | 16 // Bridges identity requests between the main render thread and libjingle's |
| 15 // signaling thread. | 17 // signaling thread. |
| 16 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { | 18 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { |
| 17 public: | 19 public: |
| 18 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) | 20 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) |
| 19 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), | 21 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), |
| 20 observer_(observer) {} | 22 observer_(observer) {} |
| 21 | 23 |
| 22 void RequestIdentityOnUIThread(const GURL& url, | 24 void RequestIdentityOnUIThread(const GURL& url, |
| 23 const GURL& first_party_for_cookies) { | 25 const GURL& first_party_for_cookies) { |
| 24 int request_id = | 26 int request_id = |
| 25 RenderThreadImpl::current() | 27 RenderThreadImpl::current() |
| 26 ->get_webrtc_identity_service() | 28 ->get_webrtc_identity_service() |
| 27 ->RequestIdentity( | 29 ->RequestIdentity( |
| 28 url, first_party_for_cookies, "WebRTC", "WebRTC", | 30 url, first_party_for_cookies, kIdentityName, kIdentityName, |
| 29 base::Bind(&RequestHandler::OnIdentityReady, this), | 31 base::Bind(&RequestHandler::OnIdentityReady, this), |
| 30 base::Bind(&RequestHandler::OnRequestFailed, this)); | 32 base::Bind(&RequestHandler::OnRequestFailed, this)); |
| 31 DCHECK_NE(request_id, 0); | 33 DCHECK_NE(request_id, 0); |
| 32 } | 34 } |
| 33 | 35 |
| 34 private: | 36 private: |
| 35 friend class base::RefCountedThreadSafe<RequestHandler>; | 37 friend class base::RefCountedThreadSafe<RequestHandler>; |
| 36 ~RequestHandler() { | 38 ~RequestHandler() { |
| 37 DCHECK(!observer_.get()); | 39 DCHECK(!observer_.get()); |
| 38 } | 40 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 60 } | 62 } |
| 61 | 63 |
| 62 void EnsureReleaseObserverOnSignalingThread() { | 64 void EnsureReleaseObserverOnSignalingThread() { |
| 63 DCHECK(signaling_thread_->BelongsToCurrentThread()); | 65 DCHECK(signaling_thread_->BelongsToCurrentThread()); |
| 64 observer_ = nullptr; | 66 observer_ = nullptr; |
| 65 } | 67 } |
| 66 | 68 |
| 67 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; | 69 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; |
| 68 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; | 70 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; |
| 69 }; | 71 }; |
| 72 |
| 73 // PeerConnectionIdentityStore::RequestIdentity helper class. |
| 74 // Used to invokes |observer|->OnSuccess in a PostTask. |
| 75 class ObserverOnSuccessCaller |
| 76 : public base::RefCountedThreadSafe<ObserverOnSuccessCaller> { |
| 77 public: |
| 78 void CallObserverOnSuccess( |
| 79 rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer, |
| 80 rtc::SSLIdentity* identity) { |
| 81 observer->OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity>(identity).Pass()); |
| 82 } |
| 83 private: |
| 84 friend class base::RefCountedThreadSafe<ObserverOnSuccessCaller>; |
| 85 ~ObserverOnSuccessCaller() {} |
| 86 }; |
| 70 } // namespace | 87 } // namespace |
| 71 | 88 |
| 72 PeerConnectionIdentityStore::PeerConnectionIdentityStore( | 89 PeerConnectionIdentityStore::PeerConnectionIdentityStore( |
| 73 const GURL& url, | 90 const GURL& url, |
| 74 const GURL& first_party_for_cookies) | 91 const GURL& first_party_for_cookies) |
| 75 : main_thread_(base::ThreadTaskRunnerHandle::Get()), | 92 : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
| 76 url_(url), | 93 url_(url), |
| 77 first_party_for_cookies_(first_party_for_cookies) { | 94 first_party_for_cookies_(first_party_for_cookies) { |
| 78 signaling_thread_.DetachFromThread(); | 95 signaling_thread_.DetachFromThread(); |
| 79 DCHECK(main_thread_.get()); | 96 DCHECK(main_thread_.get()); |
| 80 } | 97 } |
| 81 | 98 |
| 82 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { | 99 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { |
| 83 // Typically destructed on libjingle's signaling thread. | 100 // Typically destructed on libjingle's signaling thread. |
| 84 } | 101 } |
| 85 | 102 |
| 86 void PeerConnectionIdentityStore::RequestIdentity( | 103 void PeerConnectionIdentityStore::RequestIdentity( |
| 87 rtc::KeyType key_type, | 104 rtc::KeyType key_type, |
| 88 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { | 105 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { |
| 89 DCHECK(signaling_thread_.CalledOnValidThread()); | 106 DCHECK(signaling_thread_.CalledOnValidThread()); |
| 90 DCHECK(observer); | 107 DCHECK(observer); |
| 91 // This store only supports RSA. | |
| 92 DCHECK_EQ(key_type, rtc::KT_RSA); | |
| 93 | 108 |
| 94 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); | 109 // TODO(hbos): Use modulus length parameter when KeyType is parameterized. |
| 95 main_thread_->PostTask( | 110 if (key_type == rtc::KT_RSA) { |
| 96 FROM_HERE, | 111 // Use Chromium identity generation code for RSA. |
| 97 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, | 112 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); |
| 98 first_party_for_cookies_)); | 113 main_thread_->PostTask( |
| 114 FROM_HERE, |
| 115 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, |
| 116 first_party_for_cookies_)); |
| 117 } else { |
| 118 // Use WebRTC identity generation code for non-RSA. |
| 119 rtc::SSLIdentity* identity = rtc::SSLIdentity::Generate(kIdentityName, |
| 120 key_type); |
| 121 |
| 122 scoped_refptr<base::SingleThreadTaskRunner> signaling_thread = |
| 123 base::ThreadTaskRunnerHandle::Get(); |
| 124 |
| 125 // Invoke |observer| callbacks asynchronously. The callbacks of |
| 126 // DtlsIdentityStoreInterface implementations have to be async. |
| 127 if (identity) { |
| 128 // Async call to observer->OnSuccess. |
| 129 // Helper class necessary because OnSuccess takes a scoped_ptr argument |
| 130 // and scoped_ptrs can't be passed with = operator, have to use .Pass(). |
| 131 signaling_thread->PostTask(FROM_HERE, |
| 132 base::Bind(&ObserverOnSuccessCaller::CallObserverOnSuccess, |
| 133 new ObserverOnSuccessCaller(), observer, identity)); |
| 134 } else { |
| 135 // Async call to observer->OnFailure. |
| 136 signaling_thread->PostTask(FROM_HERE, |
| 137 base::Bind(&webrtc::DtlsIdentityRequestObserver::OnFailure, |
| 138 observer, 0)); |
| 139 } |
| 140 } |
| 99 } | 141 } |
| 100 | 142 |
| 101 } // namespace content | 143 } // namespace content |
| OLD | NEW |