From 6da3a6383095064d43be80dd73fc5d766c5664b6 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sat, 6 Apr 2024 14:55:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=90=9C=E7=B4=A2IPv6?= =?UTF-8?q?=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/ip_item_dao.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/internal/db/models/ip_item_dao.go b/internal/db/models/ip_item_dao.go index 66a412a5..f149e3af 100644 --- a/internal/db/models/ip_item_dao.go +++ b/internal/db/models/ip_item_dao.go @@ -514,17 +514,19 @@ func (this *IPItemDAO) CountAllEnabledIPItems(tx *dbs.Tx, sourceUserId int64, ke } if len(keyword) > 0 { if net.ParseIP(keyword) != nil { // 是一个IP地址 - // TODO 支持IPv6 - query.Where("(ipFrom =:ipKeyword OR INET_ATON(:ipKeyword) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). - Param("ipKeyword", keyword) + if iputils.IsIPv4(keyword) { + query.Where("(ipFrom =:ipKeyword OR INET_ATON(:ipKeyword) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). + Param("ipKeyword", keyword) + } else if iputils.IsIPv6(keyword) { + query.Where("(ipFrom =:ipKeyword OR HEX(INET6_ATON(:ipKeyword)) BETWEEN HEX(INET6_ATON(ipFrom)) AND HEX(INET6_ATON(ipTo)))"). + Param("ipKeyword", keyword) + } } else { query.Like("ipFrom", dbutils.QuoteLike(keyword)) } } if len(ip) > 0 { - // TODO 支持IPv6 - query.Where("(ipFrom =:ip OR INET_ATON(:ip) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). - Param("ip", ip) + query.Attr("ipFrom", ip) } if listId > 0 { query.Attr("listId", listId) @@ -564,17 +566,19 @@ func (this *IPItemDAO) ListAllEnabledIPItems(tx *dbs.Tx, sourceUserId int64, key } if len(keyword) > 0 { if net.ParseIP(keyword) != nil { // 是一个IP地址 - // TODO 支持IPv6 - query.Where("(ipFrom =:ipKeyword OR INET_ATON(:ipKeyword) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). - Param("ipKeyword", keyword) + if iputils.IsIPv4(keyword) { + query.Where("(ipFrom =:ipKeyword OR INET_ATON(:ipKeyword) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). + Param("ipKeyword", keyword) + } else if iputils.IsIPv6(keyword) { + query.Where("(ipFrom =:ipKeyword OR HEX(INET6_ATON(:ipKeyword)) BETWEEN HEX(INET6_ATON(ipFrom)) AND HEX(INET6_ATON(ipTo)))"). + Param("ipKeyword", keyword) + } } else { query.Like("ipFrom", dbutils.QuoteLike(keyword)) } } if len(ip) > 0 { - // TODO 支持IPv6 - query.Where("(ipFrom =:ip OR INET_ATON(:ip) BETWEEN INET_ATON(ipFrom) AND INET_ATON(ipTo))"). - Param("ip", ip) + query.Attr("ipFrom", ip) } if listId > 0 { query.Attr("listId", listId)