[CP] [4_2_x]fix white_list match error

This commit is contained in:
zhjc1124 2023-11-01 13:09:11 +00:00 committed by ob-robot
parent 910036962d
commit 3f8c7213fb
14 changed files with 498 additions and 436 deletions

View File

@ -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<int32_t>(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<uint32_t>(((static_cast<uint64_t>(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<VER>(version);
if (OB_UNLIKELY(mask_bits < 0)) {
} else if (version_ == IPV4 && mask_bits <= MAX_IPV4_MASK_BITS) {
ip_.v4_ = static_cast<uint32_t>(((static_cast<uint64_t>(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<uint8_t>(((static_cast<uint8_t>(1) << mask) - 1) << (8 - mask));
if (bytes < IPV6_LEN && mask_bits > 0) {
ip_.v6_[bytes] = static_cast<uint8_t>(((static_cast<uint8_t>(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)

View File

@ -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;

View File

@ -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 <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#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

View File

@ -30,6 +30,9 @@
#include <linux/unistd.h>
#include <string>
#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

View File

@ -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)

View File

@ -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;

View File

@ -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 <gtest/gtest.h>
#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();
}

View File

@ -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));
}

View File

@ -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;

View File

@ -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_,

View File

@ -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,

View File

@ -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<int32_t>(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) {

View File

@ -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

View File

@ -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