diff --git a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml index 469048349e33874f573d74e9f8c09d98181eaf8c..56c3e8137f43ea6a6aea60255439e5627800324b 100644 --- a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml +++ b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml @@ -66,6 +66,7 @@ <li>TLS_VERIFY_SERVER</li> <li>TLS_VERIFY_CLIENT</li> <li>TLS_REQUIRE_CLIENT_CERTIFICATE</li> + <li>TLS_DISABLE_SECURE_DLG_CHECK</li> <li>TLS_NEGOTIATION_TIMEOUT_SEC</li> </ul> </tp:docstring> diff --git a/src/account_schema.h b/src/account_schema.h index 3ff6ef0b6044e4c29c67113a59aeda14db9a7013..6491a54c11f881c757219a20e287d582df6bef64 100644 --- a/src/account_schema.h +++ b/src/account_schema.h @@ -101,6 +101,7 @@ static const char* const CONFIG_TLS_SERVER_NAME = "TLS.serverName"; static const char* const CONFIG_TLS_VERIFY_SERVER = "TLS.verifyServer"; static const char* const CONFIG_TLS_VERIFY_CLIENT = "TLS.verifyClient"; static const char* const CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE = "TLS.requireClientCertificate"; +static const char* const CONFIG_TLS_DISABLE_SECURE_DLG_CHECK = "TLS.disableSecureDlgCheck"; static const char* const CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC = "TLS.negotiationTimeoutSec"; // DHT specific parameters diff --git a/src/jami/account_const.h b/src/jami/account_const.h index 756d4874891ebe3f67d89964a9dfa4ba6516339f..08eef98dd4ad98bc360fd9437be9f80d1cc419ff 100644 --- a/src/jami/account_const.h +++ b/src/jami/account_const.h @@ -230,6 +230,7 @@ constexpr static const char SERVER_NAME[] = "TLS.serverName"; constexpr static const char VERIFY_SERVER[] = "TLS.verifyServer"; constexpr static const char VERIFY_CLIENT[] = "TLS.verifyClient"; constexpr static const char REQUIRE_CLIENT_CERTIFICATE[] = "TLS.requireClientCertificate"; +constexpr static const char DISABLE_SECURE_DLG_CHECK[] = "TLS.disableSecureDlgCheck"; constexpr static const char NEGOTIATION_TIMEOUT_SEC[] = "TLS.negotiationTimeoutSec"; } // namespace TLS diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index c98ce1c301126a94bea1f7d9805a44e353ec2ef2..8b65f5059775af728d9fdb2a7e1ca3b10d2e9a72 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -1493,6 +1493,7 @@ JamiAccount::getAccountDetails() const a.emplace(Conf::CONFIG_TLS_VERIFY_SERVER, TRUE_STR); a.emplace(Conf::CONFIG_TLS_VERIFY_CLIENT, TRUE_STR); a.emplace(Conf::CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, TRUE_STR); + a.emplace(Conf::CONFIG_TLS_DISABLE_SECURE_DLG_CHECK, TRUE_STR); a.emplace(DRing::Account::ConfProperties::ALLOW_CERT_FROM_HISTORY, allowPeersFromHistory_ ? TRUE_STR : FALSE_STR); a.emplace(DRing::Account::ConfProperties::ALLOW_CERT_FROM_CONTACT, diff --git a/src/manager.cpp b/src/manager.cpp index c8e894dd5e1d709994fea69ca51e3d9b0ddd77d2..c5b1f8e7050499ffe6f4f4d250909cc5fda9b00f 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -823,12 +823,6 @@ Manager::init(const std::string& config_file) JAMI_ERR("%s", e.what()); no_errors = false; } - // Some VoIP services support SIP/TLS and SRTP, but do not set the - // correct schema in the INVITE request. For more details, see: - // https://trac.pjsip.org/repos/ticket/1735 - if (voipPreferences.getDisableSecureDlgCheck()) { - pjsip_cfg()->endpt.disable_secure_dlg_check = PJ_TRUE; - } // always back up last error-free configuration if (no_errors) { diff --git a/src/preferences.cpp b/src/preferences.cpp index 6e14b7955454899a350a6b584f8a537baefbee3d..86dcea4f6543083fd69ac537a802c7ec0fb2d7a9 100644 --- a/src/preferences.cpp +++ b/src/preferences.cpp @@ -93,7 +93,6 @@ static constexpr const char* MD5_HASH_KEY {"md5Hash"}; // voip preferences constexpr const char* const VoipPreference::CONFIG_LABEL; -static constexpr const char* DISABLE_SECURE_DLG_CHECK_KEY {"disableSecureDlgCheck"}; static constexpr const char* PLAY_DTMF_KEY {"playDtmf"}; static constexpr const char* PLAY_TONES_KEY {"playTones"}; static constexpr const char* PULSE_LENGTH_KEY {"pulseLength"}; @@ -240,8 +239,7 @@ Preferences::unserialize(const YAML::Node& in) } VoipPreference::VoipPreference() - : disableSecureDlgCheck_(false) - , playDtmf_(true) + : playDtmf_(true) , playTones_(true) , pulseLength_(PULSE_LENGTH_DEFAULT) , symmetricRtp_(true) @@ -251,7 +249,6 @@ void VoipPreference::serialize(YAML::Emitter& out) const { out << YAML::Key << CONFIG_LABEL << YAML::Value << YAML::BeginMap; - out << YAML::Key << DISABLE_SECURE_DLG_CHECK_KEY << YAML::Value << disableSecureDlgCheck_; out << YAML::Key << PLAY_DTMF_KEY << YAML::Value << playDtmf_; out << YAML::Key << PLAY_TONES_KEY << YAML::Value << playTones_; out << YAML::Key << PULSE_LENGTH_KEY << YAML::Value << pulseLength_; @@ -264,7 +261,6 @@ void VoipPreference::unserialize(const YAML::Node& in) { const auto& node = in[CONFIG_LABEL]; - parseValue(node, DISABLE_SECURE_DLG_CHECK_KEY, disableSecureDlgCheck_); parseValue(node, PLAY_DTMF_KEY, playDtmf_); parseValue(node, PLAY_TONES_KEY, playTones_); parseValue(node, PULSE_LENGTH_KEY, pulseLength_); diff --git a/src/preferences.h b/src/preferences.h index 2a2985f0ff7d5f51ef839057c8fdc38c47b2ef40..2ab1e581bc3a017a83a91389e6d89c6ab2811796 100644 --- a/src/preferences.h +++ b/src/preferences.h @@ -111,9 +111,6 @@ public: void serialize(YAML::Emitter& out) const override; void unserialize(const YAML::Node& in) override; - bool getDisableSecureDlgCheck() const { return disableSecureDlgCheck_; } - void setDisableSecureDlgCheck(bool disable) { disableSecureDlgCheck_ = disable; } - bool getPlayDtmf() const { return playDtmf_; } void setPlayDtmf(bool dtmf) { playDtmf_ = dtmf; } @@ -133,7 +130,6 @@ public: void setZidFile(const std::string& file) { zidFile_ = file; } private: - bool disableSecureDlgCheck_; bool playDtmf_; bool playTones_; int pulseLength_; diff --git a/src/sip/sipaccount.cpp b/src/sip/sipaccount.cpp index fc8455d4cffafd3da765b1096debf7e8267f795e..0cf2992a783e51d8d56498f6806d904e6090a8af 100644 --- a/src/sip/sipaccount.cpp +++ b/src/sip/sipaccount.cpp @@ -140,6 +140,7 @@ SIPAccount::SIPAccount(const std::string& accountID, bool presenceEnabled) , tlsVerifyServer_(false) , tlsVerifyClient_(true) , tlsRequireClientCertificate_(true) + , tlsDisableSecureDlgCheck_(true) , tlsNegotiationTimeoutSec_("2") , registrationStateDetailed_() , registrationRefreshEnabled_(true) @@ -465,6 +466,7 @@ SIPAccount::serialize(YAML::Emitter& out) const out << YAML::Key << Conf::VERIFY_CLIENT_KEY << YAML::Value << tlsVerifyClient_; out << YAML::Key << Conf::VERIFY_SERVER_KEY << YAML::Value << tlsVerifyServer_; out << YAML::Key << Conf::REQUIRE_CERTIF_KEY << YAML::Value << tlsRequireClientCertificate_; + out << YAML::Key << Conf::DISABLE_SECURE_DLG_CHECK << YAML::Value << tlsDisableSecureDlgCheck_; out << YAML::Key << Conf::TIMEOUT_KEY << YAML::Value << tlsNegotiationTimeoutSec_; out << YAML::Key << Conf::CIPHERS_KEY << YAML::Value << tlsCiphers_; out << YAML::Key << Conf::METHOD_KEY << YAML::Value << tlsMethod_; @@ -581,6 +583,7 @@ SIPAccount::unserialize(const YAML::Node& node) parseValue(tlsMap, Conf::SERVER_KEY, tlsServerName_); parseValue(tlsMap, Conf::REQUIRE_CERTIF_KEY, tlsRequireClientCertificate_); + parseValueOptional(tlsMap, Conf::DISABLE_SECURE_DLG_CHECK, tlsDisableSecureDlgCheck_); parseValue(tlsMap, Conf::VERIFY_CLIENT_KEY, tlsVerifyClient_); parseValue(tlsMap, Conf::VERIFY_SERVER_KEY, tlsVerifyServer_); // FIXME @@ -635,6 +638,7 @@ SIPAccount::setAccountDetails(const std::map<std::string, std::string>& details) parseBool(details, Conf::CONFIG_TLS_VERIFY_SERVER, tlsVerifyServer_); parseBool(details, Conf::CONFIG_TLS_VERIFY_CLIENT, tlsVerifyClient_); parseBool(details, Conf::CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, tlsRequireClientCertificate_); + parseBool(details, Conf::CONFIG_TLS_DISABLE_SECURE_DLG_CHECK, tlsDisableSecureDlgCheck_); parseString(details, Conf::CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, tlsNegotiationTimeoutSec_); parseBool(details, Conf::CONFIG_TLS_VERIFY_SERVER, tlsVerifyServer_); parseBool(details, Conf::CONFIG_TLS_VERIFY_CLIENT, tlsVerifyClient_); @@ -1309,6 +1313,9 @@ SIPAccount::initTlsConfiguration() tlsSetting_.verify_client = tlsVerifyClient_; tlsSetting_.require_client_cert = tlsRequireClientCertificate_; + pjsip_cfg()->endpt.disable_secure_dlg_check = tlsDisableSecureDlgCheck_; + JAMI_DEBUG("Secure check dialog disabled ? {}", tlsDisableSecureDlgCheck_); + tlsSetting_.timeout.sec = atol(tlsNegotiationTimeoutSec_.c_str()); tlsSetting_.qos_type = PJ_QOS_TYPE_BEST_EFFORT; @@ -1794,6 +1801,8 @@ SIPAccount::getTlsSettings() const {Conf::CONFIG_TLS_VERIFY_CLIENT, tlsVerifyClient_ ? TRUE_STR : FALSE_STR}, {Conf::CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, tlsRequireClientCertificate_ ? TRUE_STR : FALSE_STR}, + {Conf::CONFIG_TLS_DISABLE_SECURE_DLG_CHECK, + tlsDisableSecureDlgCheck_ ? TRUE_STR : FALSE_STR}, {Conf::CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, tlsNegotiationTimeoutSec_}}; } diff --git a/src/sip/sipaccount.h b/src/sip/sipaccount.h index 525cda54d9731bf6b165c6b1887028a4e3052b0a..33ff31e6a35cbac9bc072713abc9544895456131 100644 --- a/src/sip/sipaccount.h +++ b/src/sip/sipaccount.h @@ -680,6 +680,7 @@ private: bool tlsVerifyServer_; bool tlsVerifyClient_; bool tlsRequireClientCertificate_; + bool tlsDisableSecureDlgCheck_; std::string tlsNegotiationTimeoutSec_; /** diff --git a/src/sip/sipaccountbase.h b/src/sip/sipaccountbase.h index 0d9c4a459a5e6ac250f75860f2dc2a1d5d17842b..bc9a1521e5cc457ae99c7fc4fdf47a349230cb1c 100644 --- a/src/sip/sipaccountbase.h +++ b/src/sip/sipaccountbase.h @@ -87,6 +87,7 @@ const char* const TIMEOUT_KEY = "timeout"; const char* const TLS_PASSWORD_KEY = "password"; const char* const PRIVATE_KEY_KEY = "privateKey"; const char* const REQUIRE_CERTIF_KEY = "requireCertif"; +const char* const DISABLE_SECURE_DLG_CHECK = "disableSecureDlgCheck"; const char* const SERVER_KEY = "server"; const char* const VERIFY_CLIENT_KEY = "verifyClient"; const char* const VERIFY_SERVER_KEY = "verifyServer"; diff --git a/src/sip/siptransport.cpp b/src/sip/siptransport.cpp index adcf65870205bd376c7d1a536bfd6b5718e17f29..2776331f0d0f5a752ea49969da4cbcf5736540a7 100644 --- a/src/sip/siptransport.cpp +++ b/src/sip/siptransport.cpp @@ -337,7 +337,7 @@ SipTransportBroker::getTlsListener(const IpAddr& ipAddress, const pjsip_tls_sett { RETURN_IF_FAIL(settings, nullptr, "TLS settings not specified"); RETURN_IF_FAIL(ipAddress, nullptr, "Could not determine IP address for this transport"); - JAMI_DBG("Creating TLS listener on %s...", ipAddress.toString(true).c_str()); + JAMI_DEBUG("Creating TLS listener on {:s}...", ipAddress.toString(true)); #if 0 JAMI_DBG(" ca_list_file : %s", settings->ca_list_file.ptr); JAMI_DBG(" cert_file : %s", settings->cert_file.ptr); diff --git a/src/sip/sipvoiplink.cpp b/src/sip/sipvoiplink.cpp index 954009c57aaf727c6005fc4ceefa35d389642d2b..fc89b3e1fa91aa077824274d544b6503026a90eb 100644 --- a/src/sip/sipvoiplink.cpp +++ b/src/sip/sipvoiplink.cpp @@ -376,7 +376,6 @@ transaction_request_cb(pjsip_rx_data* rdata) } pjmedia_sdp_session* r_sdp {nullptr}; - if (body) { if (pjmedia_sdp_parse(rdata->tp_info.pool, (char*) body->data, body->len, &r_sdp) != PJ_SUCCESS) { @@ -387,7 +386,6 @@ transaction_request_cb(pjsip_rx_data* rdata) if (not account->hasActiveCodec(MEDIA_AUDIO)) { try_respond_stateless(endpt_, rdata, PJSIP_SC_NOT_ACCEPTABLE_HERE, NULL, NULL, NULL); - return PJ_FALSE; } @@ -395,6 +393,8 @@ transaction_request_cb(pjsip_rx_data* rdata) unsigned options = 0; if (pjsip_inv_verify_request(rdata, &options, NULL, NULL, endpt_, NULL) != PJ_SUCCESS) { + + JAMI_ERR("Couldn't verify INVITE request in secure dialog."); try_respond_stateless(endpt_, rdata, PJSIP_SC_METHOD_NOT_ALLOWED, NULL, NULL, NULL); return PJ_FALSE; }