| Index: webrtc/api/webrtcsessiondescriptionfactory.cc
|
| diff --git a/webrtc/api/webrtcsessiondescriptionfactory.cc b/webrtc/api/webrtcsessiondescriptionfactory.cc
|
| index e88262fbdc5a1921e7e407b70b85f07d2bd98835..08392e5ff365fbfc15256ecd218520f41650b4da 100644
|
| --- a/webrtc/api/webrtcsessiondescriptionfactory.cc
|
| +++ b/webrtc/api/webrtcsessiondescriptionfactory.cc
|
| @@ -12,7 +12,6 @@
|
|
|
| #include <utility>
|
|
|
| -#include "webrtc/api/dtlsidentitystore.h"
|
| #include "webrtc/api/jsep.h"
|
| #include "webrtc/api/jsepsessiondescription.h"
|
| #include "webrtc/api/mediaconstraintsinterface.h"
|
| @@ -68,28 +67,13 @@ struct CreateSessionDescriptionMsg : public rtc::MessageData {
|
| };
|
| } // namespace
|
|
|
| -void WebRtcIdentityRequestObserver::OnFailure(int error) {
|
| - SignalRequestFailed(error);
|
| +void WebRtcCertificateGeneratorCallback::OnFailure() {
|
| + SignalRequestFailed();
|
| }
|
|
|
| -void WebRtcIdentityRequestObserver::OnSuccess(
|
| - const std::string& der_cert, const std::string& der_private_key) {
|
| - std::string pem_cert = rtc::SSLIdentity::DerToPem(
|
| - rtc::kPemTypeCertificate,
|
| - reinterpret_cast<const unsigned char*>(der_cert.data()),
|
| - der_cert.length());
|
| - std::string pem_key = rtc::SSLIdentity::DerToPem(
|
| - rtc::kPemTypeRsaPrivateKey,
|
| - reinterpret_cast<const unsigned char*>(der_private_key.data()),
|
| - der_private_key.length());
|
| - std::unique_ptr<rtc::SSLIdentity> identity(
|
| - rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert));
|
| - SignalCertificateReady(rtc::RTCCertificate::Create(std::move(identity)));
|
| -}
|
| -
|
| -void WebRtcIdentityRequestObserver::OnSuccess(
|
| - std::unique_ptr<rtc::SSLIdentity> identity) {
|
| - SignalCertificateReady(rtc::RTCCertificate::Create(std::move(identity)));
|
| +void WebRtcCertificateGeneratorCallback::OnSuccess(
|
| + const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
|
| + SignalCertificateReady(certificate);
|
| }
|
|
|
| // static
|
| @@ -127,12 +111,10 @@ void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| - std::unique_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
|
| - const rtc::scoped_refptr<WebRtcIdentityRequestObserver>&
|
| - identity_request_observer,
|
| WebRtcSession* session,
|
| const std::string& session_id,
|
| - bool dtls_enabled)
|
| + std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
|
| + const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
|
| : signaling_thread_(signaling_thread),
|
| session_desc_factory_(channel_manager, &transport_desc_factory_),
|
| // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp
|
| @@ -140,89 +122,81 @@ WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| // to just use a random number as session id and start version from
|
| // |kInitSessionVersion|.
|
| session_version_(kInitSessionVersion),
|
| - dtls_identity_store_(std::move(dtls_identity_store)),
|
| - identity_request_observer_(identity_request_observer),
|
| + cert_generator_(std::move(cert_generator)),
|
| session_(session),
|
| session_id_(session_id),
|
| certificate_request_state_(CERTIFICATE_NOT_NEEDED) {
|
| + RTC_DCHECK(signaling_thread_);
|
| session_desc_factory_.set_add_legacy_streams(false);
|
| + bool dtls_enabled = cert_generator_ || certificate;
|
| // SRTP-SDES is disabled if DTLS is on.
|
| SetSdesPolicy(dtls_enabled ? cricket::SEC_DISABLED : cricket::SEC_REQUIRED);
|
| -}
|
| + if (!dtls_enabled) {
|
| + LOG(LS_VERBOSE) << "DTLS-SRTP disabled.";
|
| + return;
|
| + }
|
|
|
| -WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| - rtc::Thread* signaling_thread,
|
| - cricket::ChannelManager* channel_manager,
|
| - WebRtcSession* session,
|
| - const std::string& session_id)
|
| - : WebRtcSessionDescriptionFactory(signaling_thread,
|
| - channel_manager,
|
| - nullptr,
|
| - nullptr,
|
| - session,
|
| - session_id,
|
| - false) {
|
| - LOG(LS_VERBOSE) << "DTLS-SRTP disabled.";
|
| + if (certificate) {
|
| + // Use |certificate|.
|
| + certificate_request_state_ = CERTIFICATE_WAITING;
|
| +
|
| + LOG(LS_VERBOSE) << "DTLS-SRTP enabled; has certificate parameter.";
|
| + // We already have a certificate but we wait to do |SetIdentity|; if we do
|
| + // it in the constructor then the caller has not had a chance to connect to
|
| + // |SignalCertificateReady|.
|
| + signaling_thread_->Post(
|
| + this, MSG_USE_CONSTRUCTOR_CERTIFICATE,
|
| + new rtc::ScopedRefMessageData<rtc::RTCCertificate>(certificate));
|
| + } else {
|
| + // Generate certificate.
|
| + certificate_request_state_ = CERTIFICATE_WAITING;
|
| +
|
| + rtc::scoped_refptr<WebRtcCertificateGeneratorCallback> callback(
|
| + new rtc::RefCountedObject<WebRtcCertificateGeneratorCallback>());
|
| + callback->SignalRequestFailed.connect(
|
| + this, &WebRtcSessionDescriptionFactory::OnCertificateRequestFailed);
|
| + callback->SignalCertificateReady.connect(
|
| + this, &WebRtcSessionDescriptionFactory::SetCertificate);
|
| +
|
| + rtc::KeyParams key_params = rtc::KeyParams();
|
| + LOG(LS_VERBOSE) << "DTLS-SRTP enabled; sending DTLS identity request (key "
|
| + << "type: " << key_params.type() << ").";
|
| +
|
| + // Request certificate. This happens asynchronously, so that the caller gets
|
| + // a chance to connect to |SignalCertificateReady|.
|
| + cert_generator_->GenerateCertificateAsync(
|
| + key_params, rtc::Optional<uint64_t>(), callback);
|
| + }
|
| }
|
|
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| - std::unique_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
|
| WebRtcSession* session,
|
| - const std::string& session_id)
|
| + const std::string& session_id,
|
| + std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator)
|
| : WebRtcSessionDescriptionFactory(
|
| signaling_thread,
|
| channel_manager,
|
| - std::move(dtls_identity_store),
|
| - new rtc::RefCountedObject<WebRtcIdentityRequestObserver>(),
|
| session,
|
| session_id,
|
| - true) {
|
| - RTC_DCHECK(dtls_identity_store_);
|
| -
|
| - certificate_request_state_ = CERTIFICATE_WAITING;
|
| -
|
| - identity_request_observer_->SignalRequestFailed.connect(
|
| - this, &WebRtcSessionDescriptionFactory::OnIdentityRequestFailed);
|
| - identity_request_observer_->SignalCertificateReady.connect(
|
| - this, &WebRtcSessionDescriptionFactory::SetCertificate);
|
| -
|
| - rtc::KeyParams key_params = rtc::KeyParams();
|
| - LOG(LS_VERBOSE) << "DTLS-SRTP enabled; sending DTLS identity request (key "
|
| - << "type: " << key_params.type() << ").";
|
| -
|
| - // Request identity. This happens asynchronously, so the caller will have a
|
| - // chance to connect to SignalIdentityReady.
|
| - dtls_identity_store_->RequestIdentity(key_params,
|
| - rtc::Optional<uint64_t>(),
|
| - identity_request_observer_);
|
| + std::move(cert_generator),
|
| + nullptr) {
|
| }
|
|
|
| WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
|
| rtc::Thread* signaling_thread,
|
| cricket::ChannelManager* channel_manager,
|
| - const rtc::scoped_refptr<rtc::RTCCertificate>& certificate,
|
| WebRtcSession* session,
|
| - const std::string& session_id)
|
| + const std::string& session_id,
|
| + const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
|
| : WebRtcSessionDescriptionFactory(signaling_thread,
|
| channel_manager,
|
| - nullptr,
|
| - nullptr,
|
| session,
|
| session_id,
|
| - true) {
|
| + nullptr,
|
| + certificate) {
|
| RTC_DCHECK(certificate);
|
| -
|
| - certificate_request_state_ = CERTIFICATE_WAITING;
|
| -
|
| - LOG(LS_VERBOSE) << "DTLS-SRTP enabled; has certificate parameter.";
|
| - // We already have a certificate but we wait to do SetIdentity; if we do
|
| - // it in the constructor then the caller has not had a chance to connect to
|
| - // SignalIdentityReady.
|
| - signaling_thread_->Post(
|
| - this, MSG_USE_CONSTRUCTOR_CERTIFICATE,
|
| - new rtc::ScopedRefMessageData<rtc::RTCCertificate>(certificate));
|
| }
|
|
|
| WebRtcSessionDescriptionFactory::~WebRtcSessionDescriptionFactory() {
|
| @@ -488,10 +462,10 @@ void WebRtcSessionDescriptionFactory::PostCreateSessionDescriptionSucceeded(
|
| signaling_thread_->Post(this, MSG_CREATE_SESSIONDESCRIPTION_SUCCESS, msg);
|
| }
|
|
|
| -void WebRtcSessionDescriptionFactory::OnIdentityRequestFailed(int error) {
|
| +void WebRtcSessionDescriptionFactory::OnCertificateRequestFailed() {
|
| ASSERT(signaling_thread_->IsCurrent());
|
|
|
| - LOG(LS_ERROR) << "Async identity request failed: error = " << error;
|
| + LOG(LS_ERROR) << "Asynchronous certificate generation request failed.";
|
| certificate_request_state_ = CERTIFICATE_FAILED;
|
|
|
| FailPendingRequests(kFailedDueToIdentityFailed);
|
| @@ -500,7 +474,7 @@ void WebRtcSessionDescriptionFactory::OnIdentityRequestFailed(int error) {
|
| void WebRtcSessionDescriptionFactory::SetCertificate(
|
| const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
|
| RTC_DCHECK(certificate);
|
| - LOG(LS_VERBOSE) << "Setting new certificate";
|
| + LOG(LS_VERBOSE) << "Setting new certificate.";
|
|
|
| certificate_request_state_ = CERTIFICATE_SUCCEEDED;
|
| SignalCertificateReady(certificate);
|
|
|