Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: content/renderer/media/peer_connection_identity_store.cc

Issue 1373023002: RTCCertificate, RTCPeerConnection.generateCertificate (WebRTC JavaScript) added. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolve WebRTCKeyParams->KeyParams TODOs Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
Guido Urdaneta 2015/10/19 10:41:17 micro-nit: put blank line before namespace closing
hbos_chromium 2015/10/19 15:21:35 Done.
70 } // namespace 84 } // namespace
71 85
72 PeerConnectionIdentityStore::PeerConnectionIdentityStore( 86 PeerConnectionIdentityStore::PeerConnectionIdentityStore(
73 const GURL& url, 87 const GURL& url,
74 const GURL& first_party_for_cookies) 88 const GURL& first_party_for_cookies)
75 : main_thread_(base::ThreadTaskRunnerHandle::Get()), 89 : main_thread_(base::ThreadTaskRunnerHandle::Get()),
76 url_(url), 90 url_(url),
77 first_party_for_cookies_(first_party_for_cookies) { 91 first_party_for_cookies_(first_party_for_cookies) {
78 signaling_thread_.DetachFromThread(); 92 signaling_thread_.DetachFromThread();
79 DCHECK(main_thread_.get()); 93 DCHECK(main_thread_.get());
80 } 94 }
81 95
82 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { 96 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() {
83 // Typically destructed on libjingle's signaling thread. 97 // Typically destructed on libjingle's signaling thread.
84 } 98 }
85 99
86 void PeerConnectionIdentityStore::RequestIdentity( 100 void PeerConnectionIdentityStore::RequestIdentity(
87 rtc::KeyType key_type, 101 rtc::KeyType key_type,
88 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { 102 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) {
89 DCHECK(signaling_thread_.CalledOnValidThread()); 103 DCHECK(signaling_thread_.CalledOnValidThread());
90 DCHECK(observer); 104 DCHECK(observer);
91 // This store only supports RSA.
92 DCHECK_EQ(key_type, rtc::KT_RSA);
93 105
94 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); 106 // TODO(torbjorng): With parameters such as modulesize, we cannot just call
95 main_thread_->PostTask( 107 // into the Chrome code for some parameters (e.g. modulesize=1024,
96 FROM_HERE, 108 // publicexponent=0x10001) with the assumption that those are the parameters
97 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, 109 // being used. I'd prefer to never use Chrome's own code here, or else export
98 first_party_for_cookies_)); 110 // its RSA parameters to a header file so that we can invoke it only for
111 // exactly the parameters requested here.
112 // TODO(torbjorng): Update store to use rtc::KeyParams.
Guido Urdaneta 2015/10/19 10:41:17 put crbugs in these TODOs
hbos_chromium 2015/10/19 15:21:35 Done.
113 if (key_type == rtc::KT_RSA) {
114 // Use Chromium identity generation code for RSA. This generation code is
115 // preferred over WebRTC RSA generation code for performance reasons.
116 scoped_refptr<RequestHandler> handler(new RequestHandler(observer));
117 main_thread_->PostTask(
118 FROM_HERE,
119 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_,
120 first_party_for_cookies_));
121 } else {
122 // Use WebRTC identity generation code for non-RSA.
123 scoped_ptr<rtc::SSLIdentity> identity(rtc::SSLIdentity::Generate(
124 kIdentityName, key_type));
125
126 scoped_refptr<base::SingleThreadTaskRunner> signaling_thread =
127 base::ThreadTaskRunnerHandle::Get();
128
129 // Invoke |observer| callbacks asynchronously. The callbacks of
130 // DtlsIdentityStoreInterface implementations have to be async.
Guido Urdaneta 2015/10/19 10:41:17 if you can find a reference for why this is the ca
hbos_chromium 2015/10/19 15:21:35 This is an implementation requirement and should b
131 if (identity) {
132 // Async call to |observer|->OnSuccess.
133 // Helper function necessary because OnSuccess takes an rtc::scoped_ptr
134 // argument which has to be Pass()-ed. base::Passed gets around this for
135 // scoped_ptr (without rtc namespace), but not for rtc::scoped_ptr.
136 signaling_thread->PostTask(FROM_HERE,
137 base::Bind(&ObserverOnSuccess, observer, base::Passed(&identity)));
138 } else {
139 // Async call to |observer|->OnFailure.
140 signaling_thread->PostTask(FROM_HERE,
141 base::Bind(&webrtc::DtlsIdentityRequestObserver::OnFailure,
142 observer, 0));
143 }
144 }
99 } 145 }
100 146
101 } // namespace content 147 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698