From b98c7054ae232e0e8b46e6f285afa4d86f41b123 Mon Sep 17 00:00:00 2001 From: Peguen <73380451+Peguen@users.noreply.github.com> Date: Tue, 10 Dec 2024 17:10:05 +0100 Subject: [PATCH] [config] Fix for regex in IpV4Adress (#1850) --- .../ecal/types/ecal_custom_data_types.h | 2 +- .../core/src/types/ecal_custom_data_types.cpp | 32 ++++++------------- .../tests/cpp/config_test/src/config_test.cpp | 30 +---------------- 3 files changed, 11 insertions(+), 53 deletions(-) diff --git a/ecal/core/include/ecal/types/ecal_custom_data_types.h b/ecal/core/include/ecal/types/ecal_custom_data_types.h index 6907519f1f..096c15e7ea 100644 --- a/ecal/core/include/ecal/types/ecal_custom_data_types.h +++ b/ecal/core/include/ecal/types/ecal_custom_data_types.h @@ -47,6 +47,7 @@ namespace eCAL { public: ECAL_API IpAddressV4(const std::string& ip_address_); + ECAL_API IpAddressV4(const char* ip_address_); ECAL_API std::string Get() const; @@ -61,7 +62,6 @@ namespace eCAL private: ECAL_API void validateIpString(const std::string& ip_address_); - ECAL_API static void throwException(const std::string& ip_address_ = std::string("")); std::string m_ip_address{}; }; diff --git a/ecal/core/src/types/ecal_custom_data_types.cpp b/ecal/core/src/types/ecal_custom_data_types.cpp index e6fe22c541..03fdcf1e87 100644 --- a/ecal/core/src/types/ecal_custom_data_types.cpp +++ b/ecal/core/src/types/ecal_custom_data_types.cpp @@ -30,13 +30,8 @@ #include namespace{ - const std::array INVALID_IPV4_ADDRESSES = { - std::regex("((255|[fF][fF])\\.){3}(255|[fF][fF])"), // 255.255.255.255 - std::regex("((127|7[fF]).((0|00|000)\\.){2}(1|01|001))"), // 127.0.0.1 - std::regex("((0|00|000)\\.){3}(0|00|000)") // 0.0.0.0 - }; - const std::regex IPV4_DEC_REGEX = std::regex("(([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"); - const std::regex IPV4_HEX_REGEX = std::regex("(([0-9a-fA-F]|[0-9a-fA-F][0-9a-fA-F])\\.){3}([0-9a-fA-F]|[0-9a-fA-F][0-9a-fA-F])"); + const std::regex IPV4_DEC_REGEX = std::regex("^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$"); + const std::regex IPV4_HEX_REGEX = std::regex("^([0-9a-fA-F]{1,2}\\.){3}[0-9a-fA-F]{1,2}$"); } namespace eCAL @@ -48,34 +43,25 @@ namespace eCAL validateIpString(ip_address_); } + IpAddressV4::IpAddressV4(const char* ip_address_) + { + validateIpString(ip_address_); + } + void IpAddressV4::validateIpString(const std::string& ip_address_) { if ( std::regex_match(ip_address_, IPV4_DEC_REGEX) || std::regex_match(ip_address_, IPV4_HEX_REGEX) ) - { - for (const auto& inv_ip_regex : INVALID_IPV4_ADDRESSES) - { - if (std::regex_match(ip_address_, inv_ip_regex)) - { - throwException(ip_address_); - return; - } - } - + { m_ip_address = ip_address_; } else { - throwException(ip_address_); + throw std::invalid_argument("[IpAddressV4] No valid IP address: " + ip_address_); } } - void IpAddressV4::throwException(const std::string& ip_address_ /*std::string("")*/) - { - throw std::invalid_argument("[IpAddressV4] No valid IP address: " + ip_address_); - } - std::string IpAddressV4::Get() const { return m_ip_address; } IpAddressV4& IpAddressV4::operator=(const std::string& ip_string_) { this->validateIpString(ip_string_); return *this; } IpAddressV4& IpAddressV4::operator=(const char* ip_string_) { this->validateIpString(ip_string_); return *this; } diff --git a/ecal/tests/cpp/config_test/src/config_test.cpp b/ecal/tests/cpp/config_test/src/config_test.cpp index ac370babbf..7bada83722 100644 --- a/ecal/tests/cpp/config_test/src/config_test.cpp +++ b/ecal/tests/cpp/config_test/src/config_test.cpp @@ -123,38 +123,10 @@ TEST(core_cpp_config /*unused*/, user_config_death_test /*unused*/) ASSERT_THROW( SetValue(custom_config.transport_layer.udp.network.group, "256.0.0.0"), std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "127.0.0.1"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "255.255.255.255"), - std::invalid_argument); - + ASSERT_THROW( SetValue(custom_config.transport_layer.udp.network.group, "FFF.FF.FF.FF"), std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "FF.FF.FF.FF"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "Ff.fF.ff.Ff"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "7f.0.0.1"), - std::invalid_argument); - - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "0.0.0.0"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "00.00.00.00"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "000.000.000.000"), - std::invalid_argument); - ASSERT_THROW( - SetValue(custom_config.transport_layer.udp.network.group, "0.00.000.0"), - std::invalid_argument); } TEST(core_cpp_config /*unused*/, config_custom_datatypes_tests /*unused*/)