diff --git a/deps/oblib/src/lib/net/ob_addr.cpp b/deps/oblib/src/lib/net/ob_addr.cpp index 9889718b4..f07bf2485 100644 --- a/deps/oblib/src/lib/net/ob_addr.cpp +++ b/deps/oblib/src/lib/net/ob_addr.cpp @@ -71,8 +71,13 @@ int ObAddr::convert_ipv4_addr(const char *ip) { int ret = OB_SUCCESS; in_addr in; - - if (!OB_ISNULL(ip)) { + if (OB_ISNULL(ip)) { + // null ptr + ret = OB_INVALID_ARGUMENT; + } else if('\0' == *ip) { + // empty ip + ip_.v4_ = 0; + } else { MEMSET(&in, 0, sizeof (in)); int rt = inet_pton(AF_INET, ip, &in); if (rt != 1) { // wrong ip or error @@ -359,12 +364,16 @@ int ObAddr::to_yson(char *buf, const int64_t buf_len, int64_t &pos) const bool ObAddr::set_ip_addr(const char *ip, const int32_t port) { bool ret = false; - // simply distinguish v4 & v6 with colon - const char *colonp = strchr(ip, ':'); - if (nullptr != colonp) { - ret = set_ipv6_addr(ip, port); + if (OB_ISNULL(ip)) { + // null ptr } else { - ret = set_ipv4_addr(ip, port); + // simply distinguish v4 & v6 with colon + const char *colonp = strchr(ip, ':'); + if (nullptr != colonp) { + ret = set_ipv6_addr(ip, port); + } else { + ret = set_ipv4_addr(ip, port); + } } return ret; } @@ -376,8 +385,8 @@ bool ObAddr::set_ipv6_addr(const char *ip, const int32_t port) ret = false; } else { version_ = IPV6; - convert_ipv6_addr(ip); port_ = port; + ret = (OB_SUCCESS == convert_ipv6_addr(ip)); } return ret; } @@ -389,8 +398,8 @@ bool ObAddr::set_ipv4_addr(const char *ip, const int32_t port) ret = false; } else { version_ = IPV4; - convert_ipv4_addr(ip); port_ = port; + ret = (OB_SUCCESS == convert_ipv4_addr(ip)); } return ret; } @@ -429,24 +438,28 @@ void ObAddr::set_ipv4_server_id(const int64_t ipv4_server_id) port_ = static_cast(0x00000000ffffffff & ipv4_server_id); } -ObAddr &ObAddr::as_mask(const int64_t mask_bits) +bool ObAddr::as_mask(int64_t mask_bits, int32_t version) { - int64_t mask = mask_bits > 128 ? 128 : mask_bits; - int bytes = 0; - - reset(); - if (version_ == IPV4) { - ip_.v4_ = static_cast(((static_cast(1) << mask) - 1) << (32 - mask)); - } else { - while (bytes < IPV6_LEN && mask >= 8) { + int ret = false; + const int64_t MAX_IPV4_MASK_BITS = 32; + const int64_t MAX_IPV6_MASK_BITS = 128; + version_ = static_cast(version); + if (OB_UNLIKELY(mask_bits < 0)) { + } else if (version_ == IPV4 && mask_bits <= MAX_IPV4_MASK_BITS) { + ip_.v4_ = static_cast(((static_cast(1) << mask_bits) - 1) << (32 - mask_bits)); + ret = true; + } else if (version_ == IPV6 && mask_bits <= MAX_IPV6_MASK_BITS) { + int bytes = 0; + while (bytes < IPV6_LEN && mask_bits >= 8) { ip_.v6_[bytes++] = 0xff; - mask -= 8; + mask_bits -= 8; } - if (bytes < IPV6_LEN && mask > 0) { - ip_.v6_[bytes] = static_cast(((static_cast(1) << mask) - 1) << (8 - mask)); + if (bytes < IPV6_LEN && mask_bits > 0) { + ip_.v6_[bytes] = static_cast(((static_cast(1) << mask_bits) - 1) << (8 - mask_bits)); } + ret = true; } - return (*this); + return ret; } ObAddr &ObAddr::as_subnet(const ObAddr &mask) @@ -523,7 +536,7 @@ uint64_t ObAddr::get_ipv6_low() const void ObAddr::set_max() { port_ = UINT32_MAX; - memset(&ip_, 1, sizeof (ip_)); + memset(&ip_, 0xff, sizeof (ip_)); } void ObAddr::set_port(int32_t port) diff --git a/deps/oblib/src/lib/net/ob_addr.h b/deps/oblib/src/lib/net/ob_addr.h index 3ab9f81e0..171481f64 100644 --- a/deps/oblib/src/lib/net/ob_addr.h +++ b/deps/oblib/src/lib/net/ob_addr.h @@ -100,7 +100,7 @@ public: int parse_from_cstring(const char *ip_str); int parse_from_string(const ObString &str); - ObAddr &as_mask(const int64_t mask_bits); + bool as_mask(int64_t mask_bits, int32_t version = IPV4); ObAddr &as_subnet(const ObAddr &mask); int64_t hash() const; diff --git a/deps/oblib/src/lib/net/ob_net_util.cpp b/deps/oblib/src/lib/net/ob_net_util.cpp index d2c79cfd3..013970c57 100644 --- a/deps/oblib/src/lib/net/ob_net_util.cpp +++ b/deps/oblib/src/lib/net/ob_net_util.cpp @@ -11,14 +11,16 @@ */ #define USING_LOG_PREFIX LIB -#include "lib/oblog/ob_log.h" -#include "lib/utility/ob_print_utils.h" -#include "lib/net/ob_net_util.h" #include #include #include #include +#include "lib/charset/ob_charset.h" +#include "lib/oblog/ob_log.h" +#include "lib/utility/ob_print_utils.h" +#include "lib/net/ob_net_util.h" + using namespace oceanbase::common; namespace oceanbase { @@ -219,5 +221,119 @@ int ObNetUtil::get_ifname_by_addr(const char *local_ip, char *if_name, uint64_t return ret; } +int ObNetUtil::get_int_value(const ObString &str, int64_t &value) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(str.empty())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("str is empty", K(str), K(ret)); + } else { + static const int32_t MAX_INT64_STORE_LEN = 31; + char int_buf[MAX_INT64_STORE_LEN + 1]; + int64_t len = std::min(str.length(), MAX_INT64_STORE_LEN); + MEMCPY(int_buf, str.ptr(), len); + int_buf[len] = '\0'; + char *end_ptr = NULL; + value = strtoll(int_buf, &end_ptr, 10); + if (('\0' != *int_buf) && ('\0' == *end_ptr)) { + // succ, do nothing + } else { + ret = OB_INVALID_DATA; + LOG_WARN("invalid int value", K(value), K(str), K(ret)); + } + } + return ret; } + +bool ObNetUtil::calc_ip(const ObString &host_ip, ObAddr &addr) +{ + return addr.set_ip_addr(host_ip, FAKE_PORT); } + +bool ObNetUtil::calc_ip_mask(const ObString &host_name, ObAddr &host, ObAddr &mask) +{ + bool ret_bool = false; + int64_t ip_mask_int64 = 0; + ObString host_ip_mask = host_name; + ObString ip = host_ip_mask.split_on('/'); + if (OB_UNLIKELY(host_ip_mask.empty())) { + } else if (calc_ip(ip, host)) { + if (host_ip_mask.find('.') || host_ip_mask.find(':')) { + ret_bool = mask.set_ip_addr(host_ip_mask, FAKE_PORT); + } else { + if (OB_SUCCESS != (get_int_value(host_ip_mask, ip_mask_int64))) { + // break + } else if (mask.as_mask(ip_mask_int64, host.get_version())) { + ret_bool = true; + } + } + } + return ret_bool; +} + +bool ObNetUtil::is_ip_match(const ObString &client_ip, ObString host_name) +{ + bool ret_bool = false; + ObAddr client; + ObAddr host; + if (OB_UNLIKELY(host_name.empty()) || OB_UNLIKELY(client_ip.empty())) { + // not match + } else if (host_name.find('/')) { + ObAddr mask; + if (calc_ip(client_ip, client) && calc_ip_mask(host_name, host, mask) && + client.get_version() == host.get_version()) { + ret_bool = (client.as_subnet(mask) == host.as_subnet(mask)); + } + } else { + if (calc_ip(host_name, host) && calc_ip(client_ip, client)) { + ret_bool = (client == host); + } + } + return ret_bool; +} + +bool ObNetUtil::is_wild_match(const ObString &client_ip, const ObString &host_name) +{ + return ObCharset::wildcmp(CS_TYPE_UTF8MB4_BIN, client_ip, host_name, 0, '_', '%'); +} + +bool ObNetUtil::is_match(const ObString &client_ip, const ObString &host_name) +{ + return ObNetUtil::is_wild_match(client_ip, host_name) || ObNetUtil::is_ip_match(client_ip, host_name); +} + +bool ObNetUtil::is_in_white_list(const ObString &client_ip, ObString &orig_ip_white_list) +{ + bool ret_bool = false; + ObAddr client; + if (orig_ip_white_list.empty() || client_ip.empty()) { + LOG_WARN_RET(OB_SUCCESS, "ip_white_list or client_ip is emtpy, denied any client", K(client_ip), K(orig_ip_white_list)); + } else if (calc_ip(client_ip, client)) { + const char COMMA = ','; + ObString ip_white_list = orig_ip_white_list; + while (NULL != ip_white_list.find(COMMA) && !ret_bool) { + ObString invited_ip = ip_white_list.split_on(COMMA).trim(); + if (!invited_ip.empty()) { + if (ObNetUtil::is_match(client_ip, invited_ip)) { + ret_bool = true; + } + LOG_TRACE("match result", K(ret_bool), K(client_ip), K(invited_ip)); + } + } + if (!ret_bool) { + ip_white_list = ip_white_list.trim(); + if (ip_white_list.empty()) { + LOG_WARN_RET(OB_SUCCESS, "ip_white_list is emtpy, denied any client", K(client_ip), K(orig_ip_white_list)); + } else if (!ObNetUtil::is_match(client_ip, ip_white_list)) { + LOG_WARN_RET(OB_SUCCESS, "client ip is not in ip_white_list", K(client_ip), K(orig_ip_white_list)); + } else { + ret_bool = true; + LOG_TRACE("match result", K(ret_bool), K(client_ip), K(ip_white_list)); + } + } + } + return ret_bool; +} + +} // namespace obsys +} // namespace oceanbase diff --git a/deps/oblib/src/lib/net/ob_net_util.h b/deps/oblib/src/lib/net/ob_net_util.h index a985417e2..33aef9e44 100644 --- a/deps/oblib/src/lib/net/ob_net_util.h +++ b/deps/oblib/src/lib/net/ob_net_util.h @@ -30,6 +30,9 @@ #include #include +#include "lib/string/ob_string.h" +#include "lib/net/ob_addr.h" + namespace oceanbase { namespace obsys @@ -37,6 +40,13 @@ namespace obsys class ObNetUtil { +private: + static const uint32_t FAKE_PORT = 0; + static int get_int_value(const common::ObString &str, int64_t &value); + static bool calc_ip(const common::ObString &host_ip, common::ObAddr &addr); + static bool calc_ip_mask(const common::ObString &host_name, common::ObAddr &host, common::ObAddr &mask); + static bool is_ip_match(const common::ObString &client_ip, common::ObString host_name); + static bool is_wild_match(const common::ObString &client_ip, const common::ObString &host_name); public: static int get_local_addr_ipv6(const char *dev_name, char *ipv6, int len, bool *is_linklocal = nullptr); static uint32_t get_local_addr_ipv4(const char *dev_name); @@ -45,6 +55,9 @@ public: // get ipv4 by hostname, no need free the returned value static char *get_addr_by_hostname(const char *hostname); static int get_ifname_by_addr(const char *local_ip, char *if_name, uint64_t if_name_len); + + static bool is_match(const common::ObString &client_ip, const common::ObString &host_name); + static bool is_in_white_list(const common::ObString &client_ip, common::ObString &orig_ip_white_list); }; } // namespace obsys } // namespace oceanbase diff --git a/deps/oblib/unittest/lib/CMakeLists.txt b/deps/oblib/unittest/lib/CMakeLists.txt index 0bc694d9e..09b7f8c48 100644 --- a/deps/oblib/unittest/lib/CMakeLists.txt +++ b/deps/oblib/unittest/lib/CMakeLists.txt @@ -70,6 +70,7 @@ oblib_addtest(lock/test_qsync_lock.cpp) oblib_addtest(metrics/test_ema_v2.cpp) oblib_addtest(metrics/test_ob_accumulator.cpp) oblib_addtest(net/test_ob_addr.cpp) +oblib_addtest(net/test_ob_net_util.cpp) #oblib_addtest(number/test_number_v2.cpp) #oblib_addtest(oblog/test_base_log_buffer.cpp) oblib_addtest(oblog/test_base_log_writer.cpp) diff --git a/deps/oblib/unittest/lib/net/test_ob_addr.cpp b/deps/oblib/unittest/lib/net/test_ob_addr.cpp index f6885ed13..c5b718dd3 100644 --- a/deps/oblib/unittest/lib/net/test_ob_addr.cpp +++ b/deps/oblib/unittest/lib/net/test_ob_addr.cpp @@ -34,7 +34,7 @@ TEST(OB_ADDR, TEST1) EXPECT_EQ(addr.get_ipv4(), 1U << 24); EXPECT_EQ(addr.get_port(), 1234); - EXPECT_EQ(addr.parse_from_cstring("1.0.0.1234:1234"), OB_SUCCESS); + EXPECT_EQ(addr.parse_from_cstring("1.0.0.1234:1234"), OB_INVALID_ARGUMENT); EXPECT_FALSE(addr.is_valid()); ObAddr addr2; diff --git a/deps/oblib/unittest/lib/net/test_ob_net_util.cpp b/deps/oblib/unittest/lib/net/test_ob_net_util.cpp new file mode 100644 index 000000000..1c0b02afa --- /dev/null +++ b/deps/oblib/unittest/lib/net/test_ob_net_util.cpp @@ -0,0 +1,318 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#include + +#define private public +#include "lib/net/ob_net_util.h" + +namespace oceanbase +{ +namespace obsys +{ + +TEST(TestWhiteList, ObNetUtil) +{ + ObString host_name_0("100.104.127.0/26"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("100.104.127.44", host_name_0)); + + ObString host_name("192.168.0.0/16"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.1", host_name)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.0", host_name)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.255", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.-1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.-1.1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.256.1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.256", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.169.1.1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.0.1.1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name)); + + ObString host_name_ipv6("fe80:90fa:2017:ff00::/56"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:fe00:00e8:0074:0a:02", host_name_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match(":90fa:2017:fe00:00e8:0074:0a:02", host_name_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff:", host_name_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::", host_name_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::1", host_name_ipv6)); + + ObString host_name2("0.0.0.0/0"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.1", host_name2)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.0", host_name2)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.255", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.-1", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.-1.1", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.256.1", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.256", host_name2)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.169.1.1", host_name2)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.0.1.1", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name2)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name2)); + + ObString host_name2_ipv6("::/0"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name2_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::", host_name2_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("::", host_name2_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("::1", host_name2_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.1", host_name2_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match(":2017:ff03::", host_name2_ipv6)); + + ObString host_name3("192.168.1.1/32"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.0", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.255", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.-1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.-1.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.256.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.256", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.169.1.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.0.1.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name3)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name3)); + + ObString host_name4("192.168.11.0/255.255.255.0"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.1", host_name4)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.0", host_name4)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.255", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.-1", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.256", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.1", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.10.1", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.0.1.1", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name4)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name4)); + + ObString host_name4_ipv6("fe80:90fa:2017:ff80::/ffff:ffff:ffff:ffff:0:0:0:0"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff80:00e8:ff74:0a:02", host_name4_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff80::", host_name4_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff80:e8::0a:02", host_name4_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name4_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00::", host_name4_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::", host_name4_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::1", host_name4_ipv6)); + + ObString host_name5("0.0.0.0/0.0.0.0"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.1", host_name5)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.0", host_name5)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.255", host_name5)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.-1", host_name5)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.256", host_name5)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.1.1", host_name5)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.10.1", host_name5)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.0.1.1", host_name5)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name5)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name5)); + + ObString host_name5_ipv6("::/::"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name5_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("::", host_name5_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("::1", host_name5_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("ff:ff:ff:ff:ff:ff:ff:ff", host_name5_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("90fa:2017:ff00:00e8:0074:0a:02", host_name5_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:-1", host_name5_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:g1", host_name5_ipv6)); + + ObString host_name6("192.168.11.1/255.255.255.255"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.0", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.255", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.-1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.256", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.10.1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.0.1.1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name6)); + + ObString host_name7("192.168.11.1/33"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.1", host_name7)); + ObString host_name8("192.168.11.1/-1"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.1", host_name8)); + ObString host_name9("192.168.11.1/"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.1", host_name9)); + + ObString host_name7_ipv6("fe80:90fa:2017:ff00::/129"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name7_ipv6)); + ObString host_name8_ipv6("fe80:90fa:2017:ff00::/-1"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name8_ipv6)); + ObString host_name9_ipv6("fe80:90fa:2017:ff00::/"); + EXPECT_EQ(false, ObNetUtil::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name9_ipv6)); + + ObString host_name10("192.168.11.1"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("192.168.11.1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.0", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.255", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.-1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.11.256", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.1.1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.168.10.1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.0.1.1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("192.1", host_name10)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("hello", host_name10)); + + ObString host_name10_ipv6("2017::a:2"); + EXPECT_EQ(true, ObNetUtil::is_ip_match("2017:0:0:0:0:0:a:2", host_name10_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_ip_match("2017::0a:02", host_name10_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("2017:2::0a:02", host_name10_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::", host_name10_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_ip_match("::1", host_name10_ipv6)); + + ObString host_name11("192.168.11.%"); + EXPECT_EQ(true, ObNetUtil::is_wild_match("192.168.11.0", host_name11)); + EXPECT_EQ(true, ObNetUtil::is_wild_match("192.168.11.255", host_name11)); + EXPECT_EQ(true, ObNetUtil::is_wild_match("192.168.11.-1", host_name11)); + EXPECT_EQ(true, ObNetUtil::is_wild_match("192.168.11.256", host_name11)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.1.1", host_name11)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.10.1", host_name11)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.0.1.1", host_name11)); + + ObString host_name11_ipv6("fe80:fe20:ffff:%"); + EXPECT_EQ(true, ObNetUtil::is_wild_match("fe80:fe20:ffff:2014:0506:02:56:80", host_name11_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_wild_match("fe80:fe20:ffff::", host_name11_ipv6)); + EXPECT_EQ(true, ObNetUtil::is_wild_match("fe80:fe20:ffff:2019::", host_name11_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("fe80:fe20:fffe::", host_name11_ipv6)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("fe80:fe20:8fff::2084:92:23:78:ff30", host_name11_ipv6)); + + ObString host_name12("192.168.11._"); + EXPECT_EQ(true, ObNetUtil::is_wild_match("192.168.11.0", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.11.255", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.11.-1", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.11.256", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.1.1", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.168.10.1", host_name12)); + EXPECT_EQ(false, ObNetUtil::is_wild_match("192.0.1.1", host_name12)); + + int64_t value = 0; + EXPECT_EQ(OB_SUCCESS, ObNetUtil::get_int_value("12", value)); + EXPECT_EQ(12, value); + EXPECT_EQ(OB_SUCCESS, ObNetUtil::get_int_value("-12", value)); + EXPECT_EQ(-12, value); + EXPECT_EQ(OB_SUCCESS, ObNetUtil::get_int_value("0", value)); + EXPECT_EQ(0, value); + EXPECT_EQ(OB_SUCCESS, ObNetUtil::get_int_value("65536", value)); + EXPECT_EQ(65536, value); + EXPECT_EQ(OB_SUCCESS, ObNetUtil::get_int_value("-65536", value)); + EXPECT_EQ(-65536, value); + EXPECT_EQ(OB_INVALID_DATA, ObNetUtil::get_int_value("12sds", value)); + EXPECT_EQ(OB_INVALID_DATA, ObNetUtil::get_int_value("12 sddf", value)); + EXPECT_EQ(OB_INVALID_DATA, ObNetUtil::get_int_value("++12", value)); + EXPECT_EQ(OB_INVALID_DATA, ObNetUtil::get_int_value("--12", value)); + + ObString ip_white_list1(""); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list1)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("%", ip_white_list1)); + + ObString ip_white_list2; + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list2)); + + ObString ip_white_list3("%"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list3)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list3)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("hello", ip_white_list3)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("", ip_white_list3)); + + ObString ip_white_list4("192.0.1.0/24"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list4)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list4)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("hello", ip_white_list4)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("", ip_white_list4)); + + ObString ip_white_list5("192.0.1.0/24, %"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list5)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list5)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("hello", ip_white_list5)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("", ip_white_list5)); + + ObString ip_white_list6("192.0.1.0/24,%"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list6)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list6)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("hello", ip_white_list6)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("", ip_white_list6)); + + ObString ip_white_list7(",192.0.1,192.0.1.0/24"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("192.0.1.1", ip_white_list7)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list7)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("hello", ip_white_list7)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("", ip_white_list7)); + + ObString ip_white_list8("10.125.224.0/255.255.252.0"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("10.125.224.15", ip_white_list8)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("10.125.224.5", ip_white_list8)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list8)); + + ObString ip_white_list9("10.125.224.0/22"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("10.125.224.15", ip_white_list9)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("10.125.224.5", ip_white_list9)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("192.0.1.-1", ip_white_list9)); + + ObString ip_white_list10("255.255.224.0/22"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.15", ip_white_list10)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.5", ip_white_list10)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("255.255.255.15", ip_white_list10)); + + ObString ip_white_list11("255.255.224.14,,255.255.224.15"); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("255.255.224.13", ip_white_list11)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.14", ip_white_list11)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.15", ip_white_list11)); + + ObString ip_white_list12("255.255.224.15,255.255.224.14,255.255.224.13,255.255.224.12,255.255.224.11"); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.11", ip_white_list12)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.11", ip_white_list12)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.12", ip_white_list12)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.13", ip_white_list12)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.14", ip_white_list12)); + ASSERT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.15", ip_white_list12)); + ASSERT_EQ(false, ObNetUtil::is_in_white_list("255.255.224.16", ip_white_list12)); + + ObString ip_white_list13(" 255.255.224.15, 255.255.224.14, 255.255.224.13, 255.255.224.12"); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.15", ip_white_list13)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.14", ip_white_list13)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.13", ip_white_list13)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.12", ip_white_list13)); + + ObString ip_white_list14(" 255.255.224.15/32 , 255.255.224.14/32 , 255.255.224.13/32 , 255.255.224.12/32"); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.15", ip_white_list14)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.14", ip_white_list14)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.13", ip_white_list14)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("255.255.224.12", ip_white_list14)); + + ObString ip_white_list15("10.244.32.%,10.250.37.18,192.168.11._"); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("10.250.37.18", ip_white_list15)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("192.168.11.1", ip_white_list15)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("192.168.12.1", ip_white_list15)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("10.244.32.222", ip_white_list15)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("10.250.49.24", ip_white_list15)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("10.250.49.251", ip_white_list15)); + + ObString ip_white_list_mixed("10.244.32.%,10.250.37.18, 192.0.1.0/24, 192.168.11._, fe80:90fa:2017:ff00::/56, " + "fe80:90fa:2017:ee00:00e8:0074:0a:02"); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("10.250.37.18", ip_white_list_mixed)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("10.244.32.222", ip_white_list_mixed)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("10.250.49.24", ip_white_list_mixed)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("10.250.49.251", ip_white_list_mixed)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("fe80:90fa:2017:ff00:00e8:0074:0a:02", ip_white_list_mixed)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("fe80:90ee:2017:ff00:00e8:0074:0a:02", ip_white_list_mixed)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("fe80:90fa:2017:ee00:00e8:0074:0a:02", ip_white_list_mixed)); + EXPECT_EQ(false, ObNetUtil::is_in_white_list("fe80:90fa:2017:ee00:00e8:0074:0a:03", ip_white_list_mixed)); + EXPECT_EQ(true, ObNetUtil::is_in_white_list("192.168.11.1", ip_white_list_mixed)); +} +} // namespace obsys +} // end of namespace oceanbase + +int main(int argc, char **argv) +{ + oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG"); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/observer/mysql/obmp_connect.cpp b/src/observer/mysql/obmp_connect.cpp index 924f3ce1b..631b8bcbc 100644 --- a/src/observer/mysql/obmp_connect.cpp +++ b/src/observer/mysql/obmp_connect.cpp @@ -16,6 +16,7 @@ #include "util/easy_mod_stat.h" #include "observer/mysql/obmp_connect.h" #include "lib/mysqlclient/ob_mysql_result.h" +#include "lib/net/ob_net_util.h" #include "lib/string/ob_sql_string.h" #include "lib/oblog/ob_log.h" #include "lib/stat/ob_session_stat.h" @@ -1089,8 +1090,7 @@ int ObMPConnect::update_login_stat_mysql(const uint64_t tenant_id, if (OB_ISNULL(user_info)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("user info is null", K(tenant_id), K(user_name_), K(ret)); - } else if (!ObHostnameStuct::is_wild_match(client_ip_, user_info->get_host_name_str()) - && !ObHostnameStuct::is_ip_match(client_ip_, user_info->get_host_name_str())) { + } else if (!obsys::ObNetUtil::is_match(client_ip_, user_info->get_host_name_str())) { LOG_INFO("account not matched, try next", KPC(user_info), K(client_ip_)); } else if (OB_FAIL(update_login_stat_in_trans_mysql(tenant_id, *user_info, is_login_succ, is_locked_tmp))) { @@ -2026,7 +2026,7 @@ int ObMPConnect::verify_ip_white_list(const uint64_t tenant_id) const LOG_WARN("fail to get_sysvar_schema", K(ret)); } else { ObString var_value = sysvar->get_value(); - if (!ObHostnameStuct::is_in_white_list(client_ip_, var_value)) { + if (!obsys::ObNetUtil::is_in_white_list(client_ip_, var_value)) { ret = OB_ERR_NO_PRIVILEGE; LOG_WARN("client is not invited into this tenant", K(ret)); } diff --git a/src/share/schema/ob_schema_getter_guard.cpp b/src/share/schema/ob_schema_getter_guard.cpp index af5ea4abe..f154caae4 100644 --- a/src/share/schema/ob_schema_getter_guard.cpp +++ b/src/share/schema/ob_schema_getter_guard.cpp @@ -20,6 +20,7 @@ #include "lib/container/ob_array_iterator.h" #include "lib/container/ob_se_array.h" #include "lib/container/ob_se_array_iterator.h" +#include "lib/net/ob_net_util.h" #include "share/schema/ob_multi_version_schema_service.h" #include "share/schema/ob_schema_struct.h" #include "share/schema/ob_table_schema.h" @@ -2769,8 +2770,7 @@ int ObSchemaGetterGuard::check_user_access( LOG_INFO("password error", "tenant_name", login_info.tenant_name_, "user_name", login_info.user_name_, "client_ip_", login_info.client_ip_, KR(ret)); - } else if (!ObHostnameStuct::is_wild_match(login_info.client_ip_, user_info->get_host_name_str()) - && !ObHostnameStuct::is_ip_match(login_info.client_ip_, user_info->get_host_name_str())) { + } else if (!obsys::ObNetUtil::is_match(login_info.client_ip_, user_info->get_host_name_str())) { LOG_TRACE("account not matched, try next", KPC(user_info), K(login_info)); } else { matched_user_info = user_info; diff --git a/src/share/schema/ob_schema_struct.cpp b/src/share/schema/ob_schema_struct.cpp index a94231acb..fd7e5efab 100644 --- a/src/share/schema/ob_schema_struct.cpp +++ b/src/share/schema/ob_schema_struct.cpp @@ -10965,122 +10965,6 @@ OB_SERIALIZE_MEMBER(ObRecycleObject, tenant_id_, database_id_, table_id_, tablegroup_id_, object_name_, original_name_, type_, tablegroup_name_, database_name_); //------end of funcs of outlineinfo-----// -int ObHostnameStuct::get_int_value(const common::ObString &str, int64_t &value) -{ - int ret = OB_SUCCESS; - if (OB_UNLIKELY(str.empty())) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("str is empty", K(str), K(ret)); - } else { - static const int32_t MAX_INT64_STORE_LEN = 31; - char int_buf[MAX_INT64_STORE_LEN + 1]; - int64_t len = std::min(str.length(), MAX_INT64_STORE_LEN); - MEMCPY(int_buf, str.ptr(), len); - int_buf[len] = '\0'; - char *end_ptr = NULL; - value = strtoll(int_buf, &end_ptr, 10); - if (('\0' != *int_buf ) && ('\0' == *end_ptr)) { - // succ, do nothing - } else { - ret = OB_INVALID_DATA; - LOG_WARN("invalid int value", K(value), K(str), K(ret)); - } - } - return ret; -} - -bool ObHostnameStuct::calc_ip(const common::ObString &host_ip, common::ObAddr &addr) -{ - return addr.set_ip_addr(host_ip, FAKE_PORT); -} - -bool ObHostnameStuct::calc_ip_mask(const common::ObString &host_ip_mask, common::ObAddr &mask) -{ - bool ret_bool = false; - int64_t ip_mask_int64 = 0; - if (OB_UNLIKELY(host_ip_mask.empty())) { - } else { - if (host_ip_mask.find('.') || host_ip_mask.find(':')) { - ret_bool = mask.set_ip_addr(host_ip_mask, FAKE_PORT); - } else { - if (OB_SUCCESS != (get_int_value(host_ip_mask, ip_mask_int64))) { - // break - } else if (OB_UNLIKELY(ip_mask_int64 > MAX_IP_BITS) || OB_UNLIKELY(ip_mask_int64 < 0)) { - // break - } else { - mask.as_mask(ip_mask_int64); - ret_bool = true; - } - } - } - return ret_bool; -} - -bool ObHostnameStuct::is_ip_match(const common::ObString &client_ip, common::ObString host_name) -{ - bool ret_bool = false; - bool is_ip_valied = false; - common::ObAddr client, host, mask; - if (OB_UNLIKELY(host_name.empty()) || OB_UNLIKELY(client_ip.empty())) { - //not match - } else if (host_name.find('/')) { - common::ObString ip = host_name.split_on('/'); - if (calc_ip(ip, host) - && calc_ip(client_ip, client) - && calc_ip_mask(host_name, mask)) { - is_ip_valied = true; - } - } else { - mask.set_max(); - if (calc_ip(host_name, host) - && calc_ip(client_ip, client)) { - is_ip_valied = true; - } - } - - if (is_ip_valied) { - ret_bool = (client.as_subnet(mask) == host.as_subnet(mask)); - } - return ret_bool; -} - -bool ObHostnameStuct::is_wild_match(const common::ObString &client_ip, const common::ObString &host_name) -{ - return ObCharset::wildcmp(CS_TYPE_UTF8MB4_BIN, client_ip, host_name, 0, '_', '%'); -} - -bool ObHostnameStuct::is_in_white_list(const common::ObString &client_ip, common::ObString &ip_white_list) -{ - bool ret_bool = false; - if (ip_white_list.empty() || client_ip.empty()) { - LOG_WARN_RET(OB_SUCCESS, "ip_white_list or client_ip is emtpy, denied any client", K(client_ip), K(ip_white_list)); - } else { - const char COMMA = ','; - ObString orig_ip_white_list = ip_white_list; - while (NULL != ip_white_list.find(COMMA) && !ret_bool) { - ObString invited_ip = ip_white_list.split_on(COMMA).trim(); - if (!invited_ip.empty()) { - if (ObHostnameStuct::is_wild_match(client_ip, invited_ip) - || ObHostnameStuct::is_ip_match(client_ip, invited_ip)) { - ret_bool = true; - } - LOG_TRACE("match result", K(ret_bool), K(client_ip), K(invited_ip)); - } - } - if (!ret_bool) { - if (ip_white_list.empty()) { - LOG_WARN_RET(OB_SUCCESS, "ip_white_list is emtpy, denied any client", K(client_ip), K(orig_ip_white_list)); - } else if (!ObHostnameStuct::is_wild_match(client_ip, ip_white_list) - && !ObHostnameStuct::is_ip_match(client_ip, ip_white_list)) { - LOG_WARN_RET(OB_SUCCESS, "client ip is not in ip_white_list", K(client_ip), K(orig_ip_white_list)); - } else { - ret_bool = true; - LOG_TRACE("match result", K(ret_bool), K(client_ip), K(ip_white_list)); - } - } - } - return ret_bool; -} // ObKeystoreSchema OB_SERIALIZE_MEMBER(ObKeystoreSchema, tenant_id_, diff --git a/src/share/schema/ob_schema_struct.h b/src/share/schema/ob_schema_struct.h index 3a92193c5..eb447cf3c 100755 --- a/src/share/schema/ob_schema_struct.h +++ b/src/share/schema/ob_schema_struct.h @@ -4930,23 +4930,6 @@ private: uint64_t grantee_id_; }; -int get_int_value(const common::ObString &str, int64_t &value); - -class ObHostnameStuct -{ -public: - ObHostnameStuct() {} - ~ObHostnameStuct() {} - static const uint32_t FAKE_PORT = 0; - static const int MAX_IP_BITS = 128; - static int get_int_value(const common::ObString &str, int64_t &value); - static bool calc_ip(const common::ObString &host_ip, common::ObAddr &addr); - static bool calc_ip_mask(const common::ObString &host_ip_mask, common::ObAddr &mask); - static bool is_ip_match(const common::ObString &client_ip, common::ObString host_name); - static bool is_wild_match(const common::ObString &client_ip, const common::ObString &host_name); - static bool is_in_white_list(const common::ObString &client_ip, common::ObString &ip_white_list); -}; - enum ObHintFormat { HINT_NORMAL, diff --git a/src/sql/engine/expr/ob_expr_is_serving_tenant.cpp b/src/sql/engine/expr/ob_expr_is_serving_tenant.cpp index 3ab91e81d..7d3cec1fe 100644 --- a/src/sql/engine/expr/ob_expr_is_serving_tenant.cpp +++ b/src/sql/engine/expr/ob_expr_is_serving_tenant.cpp @@ -70,8 +70,9 @@ int ObExprIsServingTenant::check_serving_tenant( } else if (OB_FAIL(ui_getter.get_tenant_servers(tenant_id, servers))) { LOG_WARN("fail to get servers of a tenant", K(ret)); } else if (false == svr.set_ip_addr(ip, static_cast(port))) { - ret = OB_ERR_UNEXPECTED; + ret = OB_INVALID_ARGUMENT; LOG_WARN("fail to set ip addr", K(ret), K(ip), K(port)); + LOG_USER_ERROR(OB_INVALID_ARGUMENT, "invalid ip or port"); } else { bool found_server = false; for (int64_t i = 0; OB_SUCC(ret) && false == found_server && i < servers.count(); ++i) { diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_is_serving_tenant.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_is_serving_tenant.result index 556b1f2f1..26754a0e2 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_is_serving_tenant.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_is_serving_tenant.result @@ -23,11 +23,7 @@ select is_serving_tenant(host_ip(), rpc_port(), 888); | 0 | +-----------------------------------------------+ select is_serving_tenant('abc', rpc_port(), effective_tenant_id()); -+-------------------------------------------------------------+ -| is_serving_tenant('abc', rpc_port(), effective_tenant_id()) | -+-------------------------------------------------------------+ -| 0 | -+-------------------------------------------------------------+ +ERROR HY000: Incorrect arguments to invalid ip or port select is_serving_tenant('abc', rpc_port(), 1); +-----------------------------------------+ | is_serving_tenant('abc', rpc_port(), 1) | @@ -35,9 +31,5 @@ select is_serving_tenant('abc', rpc_port(), 1); | 1 | +-----------------------------------------+ select is_serving_tenant('abc', rpc_port(), 888); -+-------------------------------------------+ -| is_serving_tenant('abc', rpc_port(), 888) | -+-------------------------------------------+ -| 0 | -+-------------------------------------------+ +ERROR HY000: Incorrect arguments to invalid ip or port diff --git a/unittest/share/schema/test_schema_struct.cpp b/unittest/share/schema/test_schema_struct.cpp index 69b7af8da..657f646cf 100644 --- a/unittest/share/schema/test_schema_struct.cpp +++ b/unittest/share/schema/test_schema_struct.cpp @@ -60,265 +60,6 @@ TEST(ObSchemaStructTest, hash_map) } } -TEST(ObSchemaStructTest, ObHostnameStuct) -{ - ObString host_name_0("100.104.127.0/26"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("100.104.127.44", host_name_0)); - - ObString host_name("192.168.0.0/16"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.1", host_name)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.0", host_name)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.255", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.-1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.-1.1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.256.1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.256", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.169.1.1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.0.1.1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name)); - - ObString host_name_ipv6("fe80:90fa:2017:ff00::/56"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:fe00:00e8:0074:0a:02", host_name_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match(":90fa:2017:fe00:00e8:0074:0a:02", host_name_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff:", host_name_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::", host_name_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::1", host_name_ipv6)); - - ObString host_name2("0.0.0.0/0"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.1", host_name2)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.0", host_name2)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.255", host_name2)); - //EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.-1", host_name2)); - //EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.-1.1", host_name2)); - //EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.256.1", host_name2)); - // EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.256", host_name2)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.169.1.1", host_name2)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.0.1.1", host_name2)); - // EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name2)); - // EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name2)); - - ObString host_name2_ipv6("::/0"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff03::0a:02", host_name2_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff03::", host_name2_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("::", host_name2_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("::1", host_name2_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.1", host_name2)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match(":2017:ff03::", host_name2_ipv6)); - - ObString host_name3("192.168.1.1/32"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.0", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.255", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.-1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.-1.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.256.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.256", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.169.1.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.0.1.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name3)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name3)); - - - ObString host_name4("192.168.11.0/255.255.255.0"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.1", host_name4)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.0", host_name4)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.255", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.-1", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.256", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.1", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.10.1", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.0.1.1", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name4)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name4)); - - ObString host_name4_ipv6("fe80:90fa:2017:ff80::/ffff:ffff:ffff:ffff:0:0:0:0"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff80:00e8:ff74:0a:02", host_name4_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff80::", host_name4_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff80:e8::0a:02", host_name4_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name4_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00::", host_name4_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::", host_name4_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::1", host_name4_ipv6)); - - ObString host_name5("0.0.0.0/0.0.0.0"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.1", host_name5)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.0", host_name5)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.255", host_name5)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.-1", host_name5)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.256", host_name5)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.1.1", host_name5)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.10.1", host_name5)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.0.1.1", host_name5)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name5)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name5)); - - ObString host_name5_ipv6("::/::"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:02", host_name5_ipv6)); -//EXPECT_EQ(true, ObHostnameStuct::is_ip_match("::" host_name5_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("::1", host_name5_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("ff:ff:ff:ff:ff:ff:ff:ff", host_name5_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("90fa:2017:ff00:00e8:0074:0a:02", host_name5_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:-1", host_name5_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("fe80:90fa:2017:ff00:00e8:0074:0a:g1", host_name5_ipv6)); - - ObString host_name6("192.168.11.1/255.255.255.255"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.0", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.255", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.-1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.256", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.10.1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.0.1.1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name6)); - - ObString host_name10("192.168.11.1"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("192.168.11.1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.0", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.255", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.-1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.256", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.1.1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.10.1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.0.1.1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.1", host_name10)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("hello", host_name10)); - - ObString host_name10_ipv6("2017::a:2"); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("2017:0:0:0:0:0:a:2", host_name10_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_ip_match("2017::0a:02", host_name10_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("2017:2::0a:02", host_name10_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::", host_name10_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("::1", host_name10_ipv6)); - - - ObString host_name7("192.168.11.1/33"); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.1", host_name7)); - ObString host_name8("192.168.11.1/-1"); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.1", host_name8)); - ObString host_name9("192.168.11.1/"); - EXPECT_EQ(false, ObHostnameStuct::is_ip_match("192.168.11.1", host_name9)); - - ObString host_name11("192.168.11.%"); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("192.168.11.0", host_name11)); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("192.168.11.255", host_name11)); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("192.168.11.-1", host_name11)); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("192.168.11.256", host_name11)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.1.1", host_name11)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.10.1", host_name11)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.0.1.1", host_name11)); - - ObString host_name11_ipv6("fe80:fe20:ffff:%"); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("fe80:fe20:ffff:2014:0506:02:56:80", host_name11_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("fe80:fe20:ffff::", host_name11_ipv6)); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("fe80:fe20:ffff:2019::", host_name11_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("fe80:fe20:fffe::", host_name11_ipv6)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("fe80:fe20:8fff::2084:92:23:78:ff30", host_name11_ipv6)); - - - ObString host_name12("192.168.11._"); - EXPECT_EQ(true, ObHostnameStuct::is_wild_match("192.168.11.0", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.11.255", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.11.-1", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.11.256", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.1.1", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.168.10.1", host_name12)); - EXPECT_EQ(false, ObHostnameStuct::is_wild_match("192.0.1.1", host_name12)); - - int64_t value = 0; - EXPECT_EQ(OB_SUCCESS, ObHostnameStuct::get_int_value("12", value)); - EXPECT_EQ(12, value); - EXPECT_EQ(OB_SUCCESS, ObHostnameStuct::get_int_value("-12", value)); - EXPECT_EQ(-12, value); - EXPECT_EQ(OB_SUCCESS, ObHostnameStuct::get_int_value("0", value)); - EXPECT_EQ(0, value); - EXPECT_EQ(OB_SUCCESS, ObHostnameStuct::get_int_value("65536", value)); - EXPECT_EQ(65536, value); - EXPECT_EQ(OB_SUCCESS, ObHostnameStuct::get_int_value("-65536", value)); - EXPECT_EQ(-65536, value); - EXPECT_EQ(OB_INVALID_DATA, ObHostnameStuct::get_int_value("12sds", value)); - EXPECT_EQ(OB_INVALID_DATA, ObHostnameStuct::get_int_value("12 sddf", value)); - EXPECT_EQ(OB_INVALID_DATA, ObHostnameStuct::get_int_value("++12", value)); - EXPECT_EQ(OB_INVALID_DATA, ObHostnameStuct::get_int_value("--12", value)); - - ObString ip_white_list1(""); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list1)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("%", ip_white_list1)); - - ObString ip_white_list2; - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list2)); - - ObString ip_white_list3("%"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list3)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list3)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("hello", ip_white_list3)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("", ip_white_list3)); - - ObString ip_white_list4("192.0.1.0/24"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list4)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list4)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("hello", ip_white_list4)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("", ip_white_list4)); - - ObString ip_white_list5("192.0.1.0/24, %"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list5)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list5)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("hello", ip_white_list5)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("", ip_white_list5)); - - ObString ip_white_list6("192.0.1.0/24,%"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list6)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list6)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("hello", ip_white_list6)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("", ip_white_list6)); - - ObString ip_white_list7(",192.0.1,192.0.1.0/24"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("192.0.1.1", ip_white_list7)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list7)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("hello", ip_white_list7)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("", ip_white_list7)); - - ObString ip_white_list8("10.125.224.0/255.255.252.0"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("10.125.224.15", ip_white_list8)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("10.125.224.5", ip_white_list8)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list8)); - - ObString ip_white_list9("10.125.224.0/22"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("10.125.224.15", ip_white_list9)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("10.125.224.5", ip_white_list9)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("192.0.1.-1", ip_white_list9)); - - ObString ip_white_list10("255.255.224.0/22"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.15", ip_white_list10)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.5", ip_white_list10)); - ASSERT_EQ(false, ObHostnameStuct::is_in_white_list("255.255.255.15", ip_white_list10)); - - ObString ip_white_list11("255.255.224.15"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.15", ip_white_list11)); - - ObString ip_white_list12("255.255.224.15,255.255.224.14,255.255.224.13,255.255.224.12,255.255.224.11"); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.15", ip_white_list12)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.14", ip_white_list12)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.13", ip_white_list12)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.12", ip_white_list12)); - ASSERT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.11", ip_white_list12)); - - ObString ip_white_list13(" 255.255.224.15, 255.255.224.14, 255.255.224.13, 255.255.224.12"); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.15", ip_white_list13)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.14", ip_white_list13)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.13", ip_white_list13)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.12", ip_white_list13)); - - ObString ip_white_list14(" 255.255.224.15/32 , 255.255.224.14/32 , 255.255.224.13/32 , 255.255.224.12/32"); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.15", ip_white_list14)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.14", ip_white_list14)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.13", ip_white_list14)); - EXPECT_EQ(true, ObHostnameStuct::is_in_white_list("255.255.224.12", ip_white_list14)); -} }//end of namespace schema }//end of namespace share }//end of namespace oceanbase