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

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: Addressed jochen's comments 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 }
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)));
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698