Selaa lähdekoodia

Support for setting the cert and key on new PeerConnection.

xicilion 1 vuosi sitten
vanhempi
commit
c30c4e93ba
3 muutettua tiedostoa jossa 18 lisäystä ja 7 poistoa
  1. 3 2
      include/rtc/configuration.hpp
  2. 13 3
      src/impl/peerconnection.cpp
  3. 2 2
      test/connectivity.cpp

+ 3 - 2
include/rtc/configuration.hpp

@@ -89,8 +89,9 @@ struct RTC_CPP_EXPORT Configuration {
 	optional<size_t> maxMessageSize;
 	optional<size_t> maxMessageSize;
 
 
 	// Certificates and private keys
 	// Certificates and private keys
-	optional<string> certPem;
-	optional<string> keyPem;
+	optional<string> certificatePemFile;
+	optional<string> keyPemFile;
+	optional<string> keyPemPass;
 };
 };
 
 
 #ifdef RTC_ENABLE_WEBSOCKET
 #ifdef RTC_ENABLE_WEBSOCKET

+ 13 - 3
src/impl/peerconnection.cpp

@@ -44,16 +44,26 @@ static LogCounter
     COUNTER_UNKNOWN_PACKET_TYPE(plog::warning,
     COUNTER_UNKNOWN_PACKET_TYPE(plog::warning,
                                 "Number of unknown RTCP packet types over past second");
                                 "Number of unknown RTCP packet types over past second");
 
 
+const string PemBeginCertificateTag = "-----BEGIN CERTIFICATE-----";
+
 PeerConnection::PeerConnection(Configuration config_)
 PeerConnection::PeerConnection(Configuration config_)
     : config(std::move(config_)) {
     : config(std::move(config_)) {
 	PLOG_VERBOSE << "Creating PeerConnection";
 	PLOG_VERBOSE << "Creating PeerConnection";
 
 
-	if( config.certPem.has_value() && config.keyPem.has_value() ) {
+
+	if (config.certificatePemFile && config.keyPemFile) {
 		std::promise<certificate_ptr> cert;
 		std::promise<certificate_ptr> cert;
-		cert.set_value(std::make_shared<Certificate>(Certificate::FromString(config.certPem.value(), config.keyPem.value())));
+		cert.set_value(std::make_shared<Certificate>(
+			config.certificatePemFile->find(PemBeginCertificateTag) != string::npos
+				? Certificate::FromString(*config.certificatePemFile, *config.keyPemFile)
+				: Certificate::FromFile(*config.certificatePemFile, *config.keyPemFile,
+										config.keyPemPass.value_or(""))));
 		mCertificate = cert.get_future();
 		mCertificate = cert.get_future();
-	} else {
+	} else if (!config.certificatePemFile && !config.keyPemFile) {
 		mCertificate = make_certificate(config.certificateType);
 		mCertificate = make_certificate(config.certificateType);
+	} else {
+		throw std::invalid_argument(
+			"Either none or both certificate and key PEM files must be specified");
 	}
 	}
 
 
 	if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)
 	if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)

+ 2 - 2
test/connectivity.cpp

@@ -289,8 +289,8 @@ void test_pem() {
 
 
 	Configuration config1;
 	Configuration config1;
 
 
-	config1.certPem = cert_pem;
-	config1.keyPem = key_pem;
+	config1.certificatePemFile = cert_pem;
+	config1.keyPemFile = key_pem;
 
 
 	PeerConnection pc1(config1);
 	PeerConnection pc1(config1);
 	atomic_bool done;
 	atomic_bool done;