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/macros.h" | |
9 #include "base/memory/scoped_ptr.h" | |
8 #include "base/thread_task_runner_handle.h" | 10 #include "base/thread_task_runner_handle.h" |
9 #include "content/renderer/media/webrtc_identity_service.h" | 11 #include "content/renderer/media/webrtc_identity_service.h" |
10 #include "content/renderer/render_thread_impl.h" | 12 #include "content/renderer/render_thread_impl.h" |
11 | 13 |
12 namespace content { | 14 namespace content { |
13 namespace { | 15 namespace { |
16 | |
17 const char kIdentityName[] = "WebRTC"; | |
18 | |
14 // Bridges identity requests between the main render thread and libjingle's | 19 // Bridges identity requests between the main render thread and libjingle's |
15 // signaling thread. | 20 // signaling thread. |
16 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { | 21 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { |
17 public: | 22 public: |
18 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) | 23 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) |
19 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), | 24 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), |
20 observer_(observer) {} | 25 observer_(observer) {} |
21 | 26 |
22 void RequestIdentityOnUIThread(const GURL& url, | 27 void RequestIdentityOnUIThread(const GURL& url, |
23 const GURL& first_party_for_cookies) { | 28 const GURL& first_party_for_cookies) { |
24 int request_id = | 29 int request_id = |
25 RenderThreadImpl::current() | 30 RenderThreadImpl::current() |
26 ->get_webrtc_identity_service() | 31 ->get_webrtc_identity_service() |
27 ->RequestIdentity( | 32 ->RequestIdentity( |
28 url, first_party_for_cookies, "WebRTC", "WebRTC", | 33 url, first_party_for_cookies, kIdentityName, kIdentityName, |
29 base::Bind(&RequestHandler::OnIdentityReady, this), | 34 base::Bind(&RequestHandler::OnIdentityReady, this), |
30 base::Bind(&RequestHandler::OnRequestFailed, this)); | 35 base::Bind(&RequestHandler::OnRequestFailed, this)); |
31 DCHECK_NE(request_id, 0); | 36 DCHECK_NE(request_id, 0); |
32 } | 37 } |
33 | 38 |
34 private: | 39 private: |
35 friend class base::RefCountedThreadSafe<RequestHandler>; | 40 friend class base::RefCountedThreadSafe<RequestHandler>; |
36 ~RequestHandler() { | 41 ~RequestHandler() { |
37 DCHECK(!observer_.get()); | 42 DCHECK(!observer_.get()); |
38 } | 43 } |
(...skipping 21 matching lines...) Expand all Loading... | |
60 } | 65 } |
61 | 66 |
62 void EnsureReleaseObserverOnSignalingThread() { | 67 void EnsureReleaseObserverOnSignalingThread() { |
63 DCHECK(signaling_thread_->BelongsToCurrentThread()); | 68 DCHECK(signaling_thread_->BelongsToCurrentThread()); |
64 observer_ = nullptr; | 69 observer_ = nullptr; |
65 } | 70 } |
66 | 71 |
67 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; | 72 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; |
68 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; | 73 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; |
69 }; | 74 }; |
75 | |
76 // Helper function for PeerConnectionIdentityStore::RequestIdentity. | |
77 // Used to invoke |observer|->OnSuccess in a PostTask. | |
78 void ObserverOnSuccess( | |
79 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer, | |
80 scoped_ptr<rtc::SSLIdentity> identity) { | |
81 rtc::scoped_ptr<rtc::SSLIdentity> rtc_scoped_ptr(identity.release()); | |
82 observer->OnSuccess(rtc_scoped_ptr.Pass()); | |
83 } | |
84 | |
70 } // namespace | 85 } // namespace |
71 | 86 |
72 PeerConnectionIdentityStore::PeerConnectionIdentityStore( | 87 PeerConnectionIdentityStore::PeerConnectionIdentityStore( |
73 const GURL& url, | 88 const GURL& url, |
74 const GURL& first_party_for_cookies) | 89 const GURL& first_party_for_cookies) |
75 : main_thread_(base::ThreadTaskRunnerHandle::Get()), | 90 : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
76 url_(url), | 91 url_(url), |
77 first_party_for_cookies_(first_party_for_cookies) { | 92 first_party_for_cookies_(first_party_for_cookies) { |
78 signaling_thread_.DetachFromThread(); | 93 signaling_thread_.DetachFromThread(); |
79 DCHECK(main_thread_.get()); | 94 DCHECK(main_thread_.get()); |
80 } | 95 } |
81 | 96 |
82 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { | 97 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { |
83 // Typically destructed on libjingle's signaling thread. | 98 // Typically destructed on libjingle's signaling thread. |
84 } | 99 } |
85 | 100 |
86 void PeerConnectionIdentityStore::RequestIdentity( | 101 void PeerConnectionIdentityStore::RequestIdentity( |
87 rtc::KeyType key_type, | 102 rtc::KeyType key_type, |
88 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { | 103 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { |
89 DCHECK(signaling_thread_.CalledOnValidThread()); | 104 DCHECK(signaling_thread_.CalledOnValidThread()); |
90 DCHECK(observer); | 105 DCHECK(observer); |
91 // This store only supports RSA. | |
92 DCHECK_EQ(key_type, rtc::KT_RSA); | |
93 | 106 |
94 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); | 107 // TODO(torbjorng): crbug.com/544902. Update store to use rtc::KeyParams. |
95 main_thread_->PostTask( | 108 // With parameters such as modulesize, we cannot just call into the Chromium |
96 FROM_HERE, | 109 // code for some parameters (e.g. modulesize=1024, publicexponent=0x10001) |
97 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, | 110 // with the assumption that those are the parameters being used. I'd prefer to |
98 first_party_for_cookies_)); | 111 // never use Chromium's own code here, or else export its RSA parameters to a |
112 // header file so that we can invoke it only for exactly the parameters | |
113 // requested here. | |
114 if (key_type == rtc::KT_RSA) { | |
115 // Use Chromium identity generation code for RSA. This generation code is | |
116 // preferred over WebRTC RSA generation code for performance reasons. | |
117 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); | |
118 main_thread_->PostTask( | |
119 FROM_HERE, | |
120 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, | |
121 first_party_for_cookies_)); | |
122 } else { | |
123 // Use WebRTC identity generation code for non-RSA. | |
124 scoped_ptr<rtc::SSLIdentity> identity(rtc::SSLIdentity::Generate( | |
125 kIdentityName, key_type)); | |
126 | |
127 scoped_refptr<base::SingleThreadTaskRunner> signaling_thread = | |
128 base::ThreadTaskRunnerHandle::Get(); | |
129 | |
130 // Invoke |observer| callbacks asynchronously. The callbacks of | |
131 // DtlsIdentityStoreInterface implementations have to be async. | |
132 if (identity) { | |
133 // Async call to |observer|->OnSuccess. | |
134 // Helper function necessary because OnSuccess takes an rtc::scoped_ptr | |
135 // argument which has to be Pass()-ed. base::Passed gets around this for | |
136 // scoped_ptr (without rtc namespace), but not for rtc::scoped_ptr. | |
137 signaling_thread->PostTask(FROM_HERE, | |
138 base::Bind(&ObserverOnSuccess, observer, base::Passed(&identity))); | |
jochen (gone - plz use gerrit)
2015/10/20 12:27:35
why not just base::Bind(&webrtc::DtlsIdentityReque
hbos_chromium
2015/10/20 15:42:23
OnSuccess takes rtc::scoped_ptr (not scoped_ptr wi
| |
139 } else { | |
140 // Async call to |observer|->OnFailure. | |
141 signaling_thread->PostTask(FROM_HERE, | |
142 base::Bind(&webrtc::DtlsIdentityRequestObserver::OnFailure, | |
143 observer, 0)); | |
144 } | |
145 } | |
99 } | 146 } |
100 | 147 |
101 } // namespace content | 148 } // namespace content |
OLD | NEW |