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

Side by Side Diff: talk/app/webrtc/webrtcsessiondescriptionfactory.cc

Issue 1176383004: DtlsIdentityStore[Interface/Impl] updated, DtlsIdentityService to be removed (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressed rest of tommi's comments: Removed need for lock Created 5 years, 5 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 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2013 Google Inc. 3 * Copyright 2013 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 15 matching lines...) Expand all
26 */ 26 */
27 27
28 #include "talk/app/webrtc/webrtcsessiondescriptionfactory.h" 28 #include "talk/app/webrtc/webrtcsessiondescriptionfactory.h"
29 29
30 #include "talk/app/webrtc/dtlsidentitystore.h" 30 #include "talk/app/webrtc/dtlsidentitystore.h"
31 #include "talk/app/webrtc/jsep.h" 31 #include "talk/app/webrtc/jsep.h"
32 #include "talk/app/webrtc/jsepsessiondescription.h" 32 #include "talk/app/webrtc/jsepsessiondescription.h"
33 #include "talk/app/webrtc/mediaconstraintsinterface.h" 33 #include "talk/app/webrtc/mediaconstraintsinterface.h"
34 #include "talk/app/webrtc/mediastreamsignaling.h" 34 #include "talk/app/webrtc/mediastreamsignaling.h"
35 #include "talk/app/webrtc/webrtcsession.h" 35 #include "talk/app/webrtc/webrtcsession.h"
36 #include "webrtc/base/sslidentity.h"
36 37
37 using cricket::MediaSessionOptions; 38 using cricket::MediaSessionOptions;
38 39
39 namespace webrtc { 40 namespace webrtc {
40 namespace { 41 namespace {
41 static const char kFailedDueToIdentityFailed[] = 42 static const char kFailedDueToIdentityFailed[] =
42 " failed because DTLS identity request failed"; 43 " failed because DTLS identity request failed";
43 44
44 static const uint64 kInitSessionVersion = 2; 45 static const uint64 kInitSessionVersion = 2;
45 46
(...skipping 12 matching lines...) Expand all
58 MediaSessionOptions::Streams sorted_streams = streams; 59 MediaSessionOptions::Streams sorted_streams = streams;
59 std::sort(sorted_streams.begin(), sorted_streams.end(), CompareStream); 60 std::sort(sorted_streams.begin(), sorted_streams.end(), CompareStream);
60 MediaSessionOptions::Streams::iterator it = 61 MediaSessionOptions::Streams::iterator it =
61 std::adjacent_find(sorted_streams.begin(), sorted_streams.end(), 62 std::adjacent_find(sorted_streams.begin(), sorted_streams.end(),
62 SameId); 63 SameId);
63 return it == sorted_streams.end(); 64 return it == sorted_streams.end();
64 } 65 }
65 66
66 enum { 67 enum {
67 MSG_CREATE_SESSIONDESCRIPTION_SUCCESS, 68 MSG_CREATE_SESSIONDESCRIPTION_SUCCESS,
68 MSG_CREATE_SESSIONDESCRIPTION_FAILED, 69 MSG_CREATE_SESSIONDESCRIPTION_FAILED
69 MSG_GENERATE_IDENTITY,
70 }; 70 };
71 71
72 struct CreateSessionDescriptionMsg : public rtc::MessageData { 72 struct CreateSessionDescriptionMsg : public rtc::MessageData {
73 explicit CreateSessionDescriptionMsg( 73 explicit CreateSessionDescriptionMsg(
74 webrtc::CreateSessionDescriptionObserver* observer) 74 webrtc::CreateSessionDescriptionObserver* observer)
75 : observer(observer) { 75 : observer(observer) {
76 } 76 }
77 77
78 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer; 78 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer;
79 std::string error; 79 std::string error;
(...skipping 13 matching lines...) Expand all
93 der_cert.length()); 93 der_cert.length());
94 std::string pem_key = rtc::SSLIdentity::DerToPem( 94 std::string pem_key = rtc::SSLIdentity::DerToPem(
95 rtc::kPemTypeRsaPrivateKey, 95 rtc::kPemTypeRsaPrivateKey,
96 reinterpret_cast<const unsigned char*>(der_private_key.data()), 96 reinterpret_cast<const unsigned char*>(der_private_key.data()),
97 der_private_key.length()); 97 der_private_key.length());
98 rtc::SSLIdentity* identity = 98 rtc::SSLIdentity* identity =
99 rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert); 99 rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert);
100 SignalIdentityReady(identity); 100 SignalIdentityReady(identity);
101 } 101 }
102 102
103 void WebRtcIdentityRequestObserver::OnSuccessWithIdentityObj( 103 void WebRtcIdentityRequestObserver::OnSuccess(
104 rtc::scoped_ptr<rtc::SSLIdentity> identity) { 104 rtc::scoped_ptr<rtc::SSLIdentity> identity) {
105 SignalIdentityReady(identity.release()); 105 SignalIdentityReady(identity.release());
106 } 106 }
107 107
108 // static 108 // static
109 void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription( 109 void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
110 const SessionDescriptionInterface* source_desc, 110 const SessionDescriptionInterface* source_desc,
111 SessionDescriptionInterface* dest_desc) { 111 SessionDescriptionInterface* dest_desc) {
112 if (!source_desc) 112 if (!source_desc)
113 return; 113 return;
114 for (size_t m = 0; m < source_desc->number_of_mediasections() && 114 for (size_t m = 0; m < source_desc->number_of_mediasections() &&
115 m < dest_desc->number_of_mediasections(); ++m) { 115 m < dest_desc->number_of_mediasections(); ++m) {
116 const IceCandidateCollection* source_candidates = 116 const IceCandidateCollection* source_candidates =
117 source_desc->candidates(m); 117 source_desc->candidates(m);
118 const IceCandidateCollection* dest_candidates = dest_desc->candidates(m); 118 const IceCandidateCollection* dest_candidates = dest_desc->candidates(m);
119 for (size_t n = 0; n < source_candidates->count(); ++n) { 119 for (size_t n = 0; n < source_candidates->count(); ++n) {
120 const IceCandidateInterface* new_candidate = source_candidates->at(n); 120 const IceCandidateInterface* new_candidate = source_candidates->at(n);
121 if (!dest_candidates->HasCandidate(new_candidate)) 121 if (!dest_candidates->HasCandidate(new_candidate))
122 dest_desc->AddCandidate(source_candidates->at(n)); 122 dest_desc->AddCandidate(source_candidates->at(n));
123 } 123 }
124 } 124 }
125 } 125 }
126 126
127 WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory( 127 WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
128 rtc::Thread* signaling_thread, 128 rtc::Thread* signaling_thread,
129 cricket::ChannelManager* channel_manager, 129 cricket::ChannelManager* channel_manager,
130 MediaStreamSignaling* mediastream_signaling, 130 MediaStreamSignaling* mediastream_signaling,
131 DTLSIdentityServiceInterface* dtls_identity_service, 131 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
132 WebRtcSession* session, 132 WebRtcSession* session,
133 const std::string& session_id, 133 const std::string& session_id,
134 cricket::DataChannelType dct, 134 cricket::DataChannelType dct,
135 bool dtls_enabled) 135 bool dtls_enabled)
136 : signaling_thread_(signaling_thread), 136 : signaling_thread_(signaling_thread),
137 mediastream_signaling_(mediastream_signaling), 137 mediastream_signaling_(mediastream_signaling),
138 session_desc_factory_(channel_manager, &transport_desc_factory_), 138 session_desc_factory_(channel_manager, &transport_desc_factory_),
139 // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp 139 // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp
140 // as the session id and session version. To simplify, it should be fine 140 // as the session id and session version. To simplify, it should be fine
141 // to just use a random number as session id and start version from 141 // to just use a random number as session id and start version from
142 // |kInitSessionVersion|. 142 // |kInitSessionVersion|.
143 session_version_(kInitSessionVersion), 143 session_version_(kInitSessionVersion),
144 identity_service_(dtls_identity_service), 144 dtls_identity_store_(dtls_identity_store.Pass()),
145 session_(session), 145 session_(session),
146 session_id_(session_id), 146 session_id_(session_id),
147 data_channel_type_(dct), 147 data_channel_type_(dct),
148 identity_request_state_(IDENTITY_NOT_NEEDED) { 148 identity_request_state_(IDENTITY_NOT_NEEDED) {
149 transport_desc_factory_.set_protocol(cricket::ICEPROTO_RFC5245); 149 transport_desc_factory_.set_protocol(cricket::ICEPROTO_RFC5245);
150 session_desc_factory_.set_add_legacy_streams(false); 150 session_desc_factory_.set_add_legacy_streams(false);
151 // SRTP-SDES is disabled if DTLS is on. 151 // SRTP-SDES is disabled if DTLS is on.
152 SetSdesPolicy(dtls_enabled ? cricket::SEC_DISABLED : cricket::SEC_REQUIRED); 152 SetSdesPolicy(dtls_enabled ? cricket::SEC_DISABLED : cricket::SEC_REQUIRED);
153 153
154 if (!dtls_enabled) { 154 // If |dtls_enabled| we must have a |dtls_identity_store_|.
155 return; 155 DCHECK(!dtls_enabled || dtls_identity_store_);
156 }
157 156
158 if (identity_service_.get()) { 157 if (dtls_enabled && dtls_identity_store_) {
159 identity_request_observer_ = 158 identity_request_observer_ =
160 new rtc::RefCountedObject<WebRtcIdentityRequestObserver>(); 159 new rtc::RefCountedObject<WebRtcIdentityRequestObserver>();
161 160
162 identity_request_observer_->SignalRequestFailed.connect( 161 identity_request_observer_->SignalRequestFailed.connect(
163 this, &WebRtcSessionDescriptionFactory::OnIdentityRequestFailed); 162 this, &WebRtcSessionDescriptionFactory::OnIdentityRequestFailed);
164 identity_request_observer_->SignalIdentityReady.connect( 163 identity_request_observer_->SignalIdentityReady.connect(
165 this, &WebRtcSessionDescriptionFactory::SetIdentity); 164 this, &WebRtcSessionDescriptionFactory::SetIdentity);
166 165
167 if (identity_service_->RequestIdentity( 166 LOG(LS_VERBOSE) << "DTLS-SRTP enabled; sending DTLS identity request.";
168 DtlsIdentityStore::kIdentityName,
169 DtlsIdentityStore::kIdentityName,
170 identity_request_observer_)) {
171 LOG(LS_VERBOSE) << "DTLS-SRTP enabled; sent DTLS identity request.";
172 identity_request_state_ = IDENTITY_WAITING;
173 } else {
174 LOG(LS_ERROR) << "Failed to send DTLS identity request.";
175 identity_request_state_ = IDENTITY_FAILED;
176 }
177 } else {
178 identity_request_state_ = IDENTITY_WAITING; 167 identity_request_state_ = IDENTITY_WAITING;
179 // Do not generate the identity in the constructor since the caller has 168 dtls_identity_store_->RequestIdentity(rtc::KT_DEFAULT,
180 // not got a chance to connect to SignalIdentityReady. 169 identity_request_observer_);
181 signaling_thread_->Post(this, MSG_GENERATE_IDENTITY, NULL);
182 } 170 }
183 } 171 }
184 172
185 WebRtcSessionDescriptionFactory::~WebRtcSessionDescriptionFactory() { 173 WebRtcSessionDescriptionFactory::~WebRtcSessionDescriptionFactory() {
186 transport_desc_factory_.set_identity(NULL); 174 transport_desc_factory_.set_identity(NULL);
187 } 175 }
188 176
189 void WebRtcSessionDescriptionFactory::CreateOffer( 177 void WebRtcSessionDescriptionFactory::CreateOffer(
190 CreateSessionDescriptionObserver* observer, 178 CreateSessionDescriptionObserver* observer,
191 const PeerConnectionInterface::RTCOfferAnswerOptions& options) { 179 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 delete param; 291 delete param;
304 break; 292 break;
305 } 293 }
306 case MSG_CREATE_SESSIONDESCRIPTION_FAILED: { 294 case MSG_CREATE_SESSIONDESCRIPTION_FAILED: {
307 CreateSessionDescriptionMsg* param = 295 CreateSessionDescriptionMsg* param =
308 static_cast<CreateSessionDescriptionMsg*>(msg->pdata); 296 static_cast<CreateSessionDescriptionMsg*>(msg->pdata);
309 param->observer->OnFailure(param->error); 297 param->observer->OnFailure(param->error);
310 delete param; 298 delete param;
311 break; 299 break;
312 } 300 }
313 case MSG_GENERATE_IDENTITY: {
314 LOG(LS_INFO) << "Generating identity.";
315 SetIdentity(rtc::SSLIdentity::Generate(DtlsIdentityStore::kIdentityName));
316 break;
317 }
318 default: 301 default:
319 ASSERT(false); 302 ASSERT(false);
320 break; 303 break;
321 } 304 }
322 } 305 }
323 306
324 void WebRtcSessionDescriptionFactory::InternalCreateOffer( 307 void WebRtcSessionDescriptionFactory::InternalCreateOffer(
325 CreateSessionDescriptionRequest request) { 308 CreateSessionDescriptionRequest request) {
326 cricket::SessionDescription* desc( 309 cricket::SessionDescription* desc(
327 session_desc_factory_.CreateOffer( 310 session_desc_factory_.CreateOffer(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 if (create_session_description_requests_.front().type == 431 if (create_session_description_requests_.front().type ==
449 CreateSessionDescriptionRequest::kOffer) { 432 CreateSessionDescriptionRequest::kOffer) {
450 InternalCreateOffer(create_session_description_requests_.front()); 433 InternalCreateOffer(create_session_description_requests_.front());
451 } else { 434 } else {
452 InternalCreateAnswer(create_session_description_requests_.front()); 435 InternalCreateAnswer(create_session_description_requests_.front());
453 } 436 }
454 create_session_description_requests_.pop(); 437 create_session_description_requests_.pop();
455 } 438 }
456 } 439 }
457 } // namespace webrtc 440 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698