UNPKG

tencentcloud-edgeone-migration-nodejs-v2

Version:

tencentcloud cdn config copy to edgeone

269 lines (254 loc) 8.44 kB
const { t } = require("../../i18n/trans") const _ = require('lodash') const { ZONE_GLOBAL_ENTITY, USE_DEFAULT } = require("../const"); const { checkIsCIDR, TEO } = require('../utils'); const genLog = require("../../logGenerator"); const capi = require("../api") async function IpFilterRefererUserAgentFilter(zoneId, domain, domainConfig, report) { const ipFilter = domainConfig?.IpFilter; const referer = domainConfig.Referer; const userAgentFilter = domainConfig.UserAgentFilter; let ipFilterFlag = true; let refererFlag = true; let userAgentFilterFlag = true; if ( !ipFilter || !ipFilter.FilterRules || (ipFilter.FilterRules.length === 0 && ipFilter.Filters.length === 0) ) { ipFilterFlag = false; } if ( !referer || !referer.RefererRules || referer.RefererRules.length === 0 ) { refererFlag = false; } if ( !userAgentFilter || !userAgentFilter.FilterRules || userAgentFilter.FilterRules.length === 0 ) { userAgentFilterFlag = false; } const ipFilterRules = ipFilter.FilterRules.length ? ipFilter.FilterRules : [{ FilterType: ipFilter.FilterType, Filters: ipFilter?.Filters, RuleType: 'ip', RulePaths: ['*'] }]; const refererRules = referer.RefererRules; const userAgentFilterRules = userAgentFilter.FilterRules; if ( userAgentFilterRules.find((rule) => { return rule.RuleType !== "all"; }) ) { report.Details.push({ config: t("UA黑白名单(UserAgentFilter)"), result: t("失败"), detail: t(`EO 不支持按目录配置 UA 黑白名单,本配置无法迁移`), }); genLog.errorLog(t('EO 不支持按目录配置 UA 黑白名单,本配置无法迁移')); userAgentFilterFlag = false; } let param = { ZoneId: zoneId, Entity: domain, SecurityConfig: { IpTableConfig: { IpTableRules: [], Switch: ipFilter.Switch, }, }, }; if (ipFilterFlag) { const blackIpTempList = []; const whiteIpList = []; const transToAclConfigList = []; // edgeone 基础访问管控不支持相同域名下配置不同黑白名单 if(ipFilter?.Filters.length) { ipFilterRules.forEach((item) => { if (item.FilterType === "blacklist") { blackIpTempList.push(...item.Filters); } else if (item.FilterType === "whitelist") { whiteIpList.push(...item.Filters); } }); } else { ipFilterRules.forEach((item) => { const isAllRuleType = item.RuleType === "all"; const hasWildcardPath = item.RulePaths.some((path) => path.includes("*")); if (isAllRuleType && hasWildcardPath) { if (item.FilterType === "blacklist") { blackIpTempList.push(...item.Filters); } else if (item.FilterType === "whitelist") { whiteIpList.push(...item.Filters); } } else { transToAclConfigList.push(item); } }); } const blackIpList = blackIpTempList.filter( (ip) => !whiteIpList.includes(ip) ); let uniqWhitelist = _.uniq(whiteIpList); let uniqBlacklist = _.uniq(blackIpList); const allAllowCIDR = checkIsCIDR([ ...whiteIpList, ...blackIpTempList, ]).filter((cidrIp) => cidrIp.split("/").length > 1); const whiteIntersect = _.intersection(uniqWhitelist, allAllowCIDR).length; const blackIntersect = _.intersection(uniqBlacklist, allAllowCIDR).length; if (whiteIntersect || blackIntersect) { uniqWhitelist = uniqWhitelist.filter((item) => { if (allAllowCIDR.includes(item)) { return true; } else if (item.split("/").length > 1) { return false; } return true; }); uniqBlacklist = uniqBlacklist.filter( (item) => item.split("/").length === 1 ); } if (whiteIpList.length) { param.SecurityConfig.IpTableConfig.IpTableRules.push({ MatchFrom: "ip", MatchContent: uniqWhitelist.join(","), Action: "drop", Status: ipFilter.Switch, Operator: "not_match", RuleName: t(`CDN迁移EO-IP白名单-{{domain}}`, { domain }), }); } if (blackIpList.length) { param.SecurityConfig.IpTableConfig.IpTableRules.push({ MatchFrom: "ip", MatchContent: uniqBlacklist.join(","), Action: "drop", Status: ipFilter.Switch, Operator: "match", RuleName: t(`CDN迁移EO-IP黑名单-{{domain}}`, { domain }), }); } if (transToAclConfigList.length) { param.SecurityConfig.AclConfig = { AclUserRules: transToAclConfigList.map((rule, index) => { return { AclConditions: [ { MatchContent: domain, MatchFrom: "host", MatchParam: "", Operator: "equal", }, { MatchContent: rule.Filters.join(","), MatchFrom: "sip", MatchParam: "", Operator: rule.FilterType === "blacklist" ? "match" : "not_match", }, { MatchContent: rule.RulePaths.join(","), MatchFrom: "cgi", MatchParam: "", Operator: "equal", }, ], RuleName: rule.FilterType === "blacklist" ? t("CDN迁移EO-IP黑名单-{{domain}}-{{index}}", { domain, index, }) : t("CDN迁移EO-IP白名单-{{domain}}-{{index}}", { domain, index, }), Action: "drop", RuleStatus: ipFilter.Switch, RulePriority: 50, }; }), }; } } if (refererFlag) { refererRules.forEach((rule) => { param.SecurityConfig.IpTableConfig.IpTableRules.push({ MatchFrom: "referer", MatchContent: rule.Referers.join(","), Action: rule.RefererType === "blacklist" ? "drop" : "trans", Status: referer.Switch, Operator: "equal", RuleName: t(`CDN迁移EO-referer黑白名单-{{domain}}`, { domain }), }); if (rule.AllowEmpty) { param.SecurityConfig.IpTableConfig.IpTableRules.push({ MatchFrom: "referer", Action: rule.RefererType === "blacklist" ? "drop" : "trans", Status: referer.Switch, Operator: "is_empty", MatchContent: "", RuleName: t(`CDN迁移EO-referer黑白名单-空referer-{{domain}}`, { domain, }), }); } }); } if (userAgentFilterFlag) { userAgentFilter?.FilterRules.forEach((rule, index) => { param.SecurityConfig.IpTableConfig.IpTableRules.push({ MatchFrom: "ua", MatchContent: rule.UserAgents.join(","), Action: rule.FilterType === "blacklist" ? "drop" : "trans", Status: userAgentFilter.Switch, Operator: "equal", RuleName: t(`CDN迁移EO-UA黑白名单-{{index}}-{{domain}}`, { index, domain, }), }); }); } try { // 新站点,新增域名修改安全配置步骤:解绑到空模板 try { await capi("BindSecurityTemplateToEntity", TEO, { Entities: [domain], Operate: USE_DEFAULT, OverWrite: true, TemplateId: ZONE_GLOBAL_ENTITY, ZoneId: zoneId, }) } catch (e) { genLog.defaultLog(e?.message) } const res = await capi("ModifySecurityPolicy", TEO, param) report.Details.push({ config: t( "安全配置创建(IP黑白名单:IpFilter, 防盗链:Referer, UA黑白名单:UserAgentFilter)" ), result: t("成功"), detail: ``, }); genLog.successLog(`${t('安全配置创建(IP黑白名单:IpFilter, 防盗链:Referer, UA黑白名单:UserAgentFilter)')}${t('成功')}`) return res; } catch (e) { report.Details.push({ config: t( "安全配置创建(IP黑白名单:IpFilter, 防盗链:Referer, UA黑白名单:UserAgentFilter)" ), result: t("失败"), detail: `${e.toString()}`, }); genLog.errorLog(`${t('安全配置创建(IP黑白名单:IpFilter, 防盗链:Referer, UA黑白名单:UserAgentFilter)')}${t('失败')}`) } } module.exports = IpFilterRefererUserAgentFilter;