From ec3d36de39e195d7ef1bacbbc9b1a42672b27bbe Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sun, 5 May 2024 14:10:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A0=B9=E6=8D=AEIP=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E4=BB=A3=E5=8F=B7=E6=9F=A5=E6=89=BEIP=E5=90=8D?= =?UTF-8?q?=E5=8D=95ID=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/models/ip_list_dao.go | 20 +++++++ internal/rpc/services/service_ip_list.go | 70 +++++++++++++++++++++++- internal/setup/sql.json | 6 +- 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/internal/db/models/ip_list_dao.go b/internal/db/models/ip_list_dao.go index 82d42b2e..990b8546 100644 --- a/internal/db/models/ip_list_dao.go +++ b/internal/db/models/ip_list_dao.go @@ -13,6 +13,7 @@ import ( "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/types" + "regexp" ) const ( @@ -31,6 +32,8 @@ var DefaultGlobalIPList = &IPList{ IsOn: true, } +var ipListCodeRegexp = regexp.MustCompile(`^[a-zA-Z0-9_-]+$`) + type IPListDAO dbs.DAO func NewIPListDAO() *IPListDAO { @@ -352,3 +355,20 @@ func (this *IPListDAO) FindServerIdWithListId(tx *dbs.Tx, listId int64) (serverI FindInt64Col(0) return } + +// FindIPListIdWithCode 根据IP名单代号查找名单ID +func (this *IPListDAO) FindIPListIdWithCode(tx *dbs.Tx, listCode string) (int64, error) { + if len(listCode) == 0 { + return 0, nil + } + return this.Query(tx). + ResultPk(). + State(IPListStateEnabled). + Attr("code", listCode). + FindInt64Col(0) +} + +// ValidateIPListCode 校验IP名单代号格式 +func (this *IPListDAO) ValidateIPListCode(code string) bool { + return ipListCodeRegexp.MatchString(code) +} diff --git a/internal/rpc/services/service_ip_list.go b/internal/rpc/services/service_ip_list.go index 7f5d2283..6f7fda8a 100644 --- a/internal/rpc/services/service_ip_list.go +++ b/internal/rpc/services/service_ip_list.go @@ -3,10 +3,12 @@ package services import ( "context" "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/iwind/TeaGo/lists" + "github.com/iwind/TeaGo/rands" ) // IPListService IP名单相关服务 @@ -24,9 +26,14 @@ func (this *IPListService) CreateIPList(ctx context.Context, req *pb.CreateIPLis var tx = this.NullTx() + // 修正默认的代号 + if req.Code == "white" || req.Code == "black" { + req.Code = req.Code + "-" + rands.HexString(8) + } + // 检查用户相关信息 if userId > 0 { - // 检查服务ID + // 检查网站ID if req.ServerId > 0 { err = models.SharedServerDAO.CheckUserServer(tx, userId, req.ServerId) if err != nil { @@ -35,6 +42,21 @@ func (this *IPListService) CreateIPList(ctx context.Context, req *pb.CreateIPLis } } + // 检查代号 + if len(req.Code) > 0 { + if !models.SharedIPListDAO.ValidateIPListCode(req.Code) { + return nil, errors.New("invalid 'code' format") + } + + oldListId, findErr := models.SharedIPListDAO.FindIPListIdWithCode(tx, req.Code) + if findErr != nil { + return nil, findErr + } + if oldListId > 0 { + return nil, errors.New("the code '" + req.Code + "' has been used") + } + } + listId, err := models.SharedIPListDAO.CreateIPList(tx, userId, req.ServerId, req.Type, req.Name, req.Code, req.TimeoutJSON, req.Description, req.IsPublic, req.IsGlobal) if err != nil { return nil, err @@ -52,6 +74,21 @@ func (this *IPListService) UpdateIPList(ctx context.Context, req *pb.UpdateIPLis var tx = this.NullTx() + // 检查代号 + if len(req.Code) > 0 { + if !models.SharedIPListDAO.ValidateIPListCode(req.Code) { + return nil, errors.New("invalid 'code' format") + } + + oldListId, findErr := models.SharedIPListDAO.FindIPListIdWithCode(tx, req.Code) + if findErr != nil { + return nil, findErr + } + if oldListId > 0 && oldListId != req.IpListId { + return nil, errors.New("the code '" + req.Code + "' has been used") + } + } + err = models.SharedIPListDAO.UpdateIPList(tx, req.IpListId, req.Name, req.Code, req.TimeoutJSON, req.Description) if err != nil { return nil, err @@ -250,3 +287,34 @@ func (this *IPListService) FindServerIdWithIPListId(ctx context.Context, req *pb ServerId: serverId, }, nil } + +// FindIPListIdWithCode 根据IP名单代号获取IP名单ID +func (this *IPListService) FindIPListIdWithCode(ctx context.Context, req *pb.FindIPListIdWithCodeRequest) (*pb.FindIPListIdWithCodeResponse, error) { + _, userId, err := this.ValidateAdminAndUser(ctx, true) + if err != nil { + return nil, err + } + + if len(req.Code) == 0 { + return nil, errors.New("require 'code'") + } + + var tx = this.NullTx() + listId, err := models.SharedIPListDAO.FindIPListIdWithCode(tx, req.Code) + if err != nil { + return nil, err + } + + if listId > 0 { + if userId > 0 { + err = models.SharedIPListDAO.CheckUserIPList(tx, userId, listId) + if err != nil { + return nil, err + } + } + } + + return &pb.FindIPListIdWithCodeResponse{ + IpListId: listId, + }, nil +} diff --git a/internal/setup/sql.json b/internal/setup/sql.json index 187ad537..7777f8d1 100644 --- a/internal/setup/sql.json +++ b/internal/setup/sql.json @@ -104082,7 +104082,7 @@ "name": "edgeIPLists", "engine": "InnoDB", "charset": "utf8mb4_general_ci", - "definition": "CREATE TABLE `edgeIPLists` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `type` varchar(255) DEFAULT NULL COMMENT '类型',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `serverId` bigint(11) unsigned DEFAULT '0' COMMENT '服务ID',\n `name` varchar(255) DEFAULT NULL COMMENT '列表名',\n `code` varchar(255) DEFAULT NULL COMMENT '代号',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `timeout` json DEFAULT NULL COMMENT '默认超时时间',\n `actions` json DEFAULT NULL COMMENT 'IP触发的动作',\n `description` varchar(512) DEFAULT NULL COMMENT '描述',\n `isPublic` tinyint(1) unsigned DEFAULT '0' COMMENT '是否公用',\n `isGlobal` tinyint(1) unsigned DEFAULT '0' COMMENT '是否全局',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`),\n KEY `type` (`type`),\n KEY `serverId` (`serverId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP名单'", + "definition": "CREATE TABLE `edgeIPLists` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `type` varchar(255) DEFAULT NULL COMMENT '类型',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `serverId` bigint(11) unsigned DEFAULT '0' COMMENT '服务ID',\n `name` varchar(255) DEFAULT NULL COMMENT '列表名',\n `code` varchar(255) DEFAULT NULL COMMENT '代号',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `timeout` json DEFAULT NULL COMMENT '默认超时时间',\n `actions` json DEFAULT NULL COMMENT 'IP触发的动作',\n `description` varchar(512) DEFAULT NULL COMMENT '描述',\n `isPublic` tinyint(1) unsigned DEFAULT '0' COMMENT '是否公用',\n `isGlobal` tinyint(1) unsigned DEFAULT '0' COMMENT '是否全局',\n PRIMARY KEY (`id`),\n KEY `userId` (`userId`),\n KEY `type` (`type`),\n KEY `serverId` (`serverId`),\n KEY `code` (`code`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IP名单'", "fields": [ { "name": "id", @@ -104161,6 +104161,10 @@ { "name": "serverId", "definition": "KEY `serverId` (`serverId`) USING BTREE" + }, + { + "name": "code", + "definition": "KEY `code` (`code`) USING BTREE" } ], "records": []