Skip to content

Commit f386191

Browse files
committed
feat: Beta 版增加 geoip,subnet,src-ip 等规则, 支持 pre-matching
1 parent 67b817b commit f386191

File tree

2 files changed

+50
-10
lines changed

2 files changed

+50
-10
lines changed

Rewrite-Parser.beta.js

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ let jsDelivr = istrue(queryObject.jsDelivr) //开启jsDelivr
9292
let localText = queryObject.localtext != undefined ? '\n' + queryObject.localtext : '' //纯文本输入
9393
let ipNoResolve = istrue(queryObject.nore) //ip规则不解析域名
9494
let sni = queryObject.sni != undefined ? getArgArr(queryObject.sni) : null //sni嗅探
95+
let pm = queryObject.pm != undefined ? getArgArr(queryObject.pm) : null // pre-matching
9596
let sufkeepHeader = keepHeader == true ? '&keepHeader=true' : '' //用于保留header的后缀
9697
let sufjsDelivr = jsDelivr == true ? '&jsDelivr=true' : '' //用于开启jsDeliver的后缀
9798

@@ -132,6 +133,7 @@ let name,
132133
ruletype,
133134
rulenore,
134135
rulesni,
136+
rulepm,
135137
rulePandV,
136138
rulepolicy,
137139
rulevalue,
@@ -365,7 +367,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
365367
// 加入对逻辑规则的判断
366368
if (
367369
x.indexOf(elem) != -1 &&
368-
(/^(DOMAIN|RULE-SET)/i.test(x) || /AND|OR|NOT\s*\?\s*?\,\s*?\(\s*?\(.+/i.test(x)) &&
370+
(/^(DOMAIN|RULE-SET)/i.test(x) || /(AND|OR|NOT)\s*?,\s*?\(\s*?\(\s*?.+\s*?\)/i.test(x)) &&
369371
!/,\s*extended-matching/i.test(x)
370372
) {
371373
x = x + ',extended-matching'
@@ -374,6 +376,25 @@ if (binaryInfo != null && binaryInfo.length > 0) {
374376
} //循环结束
375377
} //启用sni嗅探结束
376378

379+
// pre-matching
380+
if (pm != null) {
381+
for (let i = 0; i < pm.length; i++) {
382+
const elem = pm[i].trim()
383+
// 加入对逻辑规则的判断
384+
if (
385+
x.indexOf(elem) != -1 &&
386+
(/^(DOMAIN|DOMAIN|DOMAIN-SUFFIX|DOMAIN-KEYWORD|DOMAIN-SET|DOMAIN-WILDCARD|IP-CIDR|IP-CIDR6|GEOIP|IP-ASN|SUBNET|DEST-PORT|SRC-PORT|SRC-IP|RULE-SET)\s*?,/i.test(
387+
x
388+
) ||
389+
/(AND|OR|NOT)\s*?,\s*?\(\s*?\(\s*?.+\s*?\)/i.test(x)) &&
390+
!/,\s*pre-matching/i.test(x)
391+
) {
392+
x = x + ',pre-matching'
393+
break
394+
}
395+
} //循环结束
396+
} //启用 pre-matching 结束
397+
377398
//ip规则不解析域名
378399
if (ipNoResolve == true) {
379400
if (/^(?:ip-[ca]|RULE-SET)/i.test(x) && !/,\s*no-resolve/.test(x)) {
@@ -506,7 +527,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
506527

507528
//rule解析
508529
if (
509-
/^#?(?:domain(?:-suffix|-keyword|-wildcard|-set)?|ip-cidr6?|ip-asn|rule-set|user-agent|url-regex|(de?st|in|src)-port|and|not|or|protocol)\s*,.+/i.test(
530+
/^#?(?:domain(?:-suffix|-keyword|-wildcard|-set)?|ip-cidr6?|ip-asn|geoip|rule-set|user-agent|url-regex|(de?st|in|src)-port|src-ip|and|not|or|protocol|subnet)\s*,.+/i.test(
510531
x
511532
)
512533
) {
@@ -515,11 +536,13 @@ if (binaryInfo != null && binaryInfo.length > 0) {
515536
ruletype = x.split(/\s*,\s*/)[0].replace(/^#/, '')
516537
rulenore = /,\s*no-resolve/.test(x) ? ',no-resolve' : ''
517538
rulesni = /,\s*extended-matching/.test(x) ? ',extended-matching' : ''
539+
rulepm = /,\s*pre-matching/.test(x) ? ',pre-matching' : ''
518540
rulePandV = x
519541
.replace(/^#/, '')
520542
.replace(ruletype, '')
521543
.replace(/\s*,\s*no-resolve/, '')
522544
.replace(/\s*,\s*extended-matching/, '')
545+
.replace(/\s*,\s*pre-matching/, '')
523546
.replace(/^\s*,\s*/, '')
524547
rulepolicy = getPolicy(rulePandV)
525548
rulevalue = rulePandV
@@ -533,7 +556,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
533556
} else {
534557
modistatus = 'no'
535558
}
536-
ruleBox.push({ mark, noteK, ruletype, rulevalue, rulepolicy, rulenore, rulesni, ori: x, modistatus })
559+
ruleBox.push({ mark, noteK, ruletype, rulevalue, rulepolicy, rulenore, rulesni, rulepm, ori: x, modistatus })
537560
} //rule解析结束
538561

539562
//host解析
@@ -899,6 +922,16 @@ if (binaryInfo != null && binaryInfo.length > 0) {
899922
rulenore = ruleBox[i].rulenore ? ruleBox[i].rulenore : ''
900923
rulesni = ruleBox[i].rulesni ? ruleBox[i].rulesni : ''
901924
rulesni = isLooniOS || isStashiOS ? '' : rulesni
925+
rulepm = ruleBox[i].rulepm ? ruleBox[i].rulepm : ''
926+
rulepm = isLooniOS || isStashiOS ? '' : rulepm
927+
if (
928+
!/^(DOMAIN|DOMAIN-SUFFIX|DOMAIN-KEYWORD|DOMAIN-SET|DOMAIN-WILDCARD|IP-CIDR|IP-CIDR6|GEOIP|IP-ASN|AND|OR|NOT|SUBNET|DEST-PORT|SRC-PORT|SRC-IP|RULE-SET)$/i.test(
929+
ruletype
930+
) &&
931+
isSurgeiOS
932+
) {
933+
rulepm = ''
934+
}
902935
modistatus = ruleBox[i].modistatus
903936
ori = ruleBox[i].ori
904937
if (/de?st-port/i.test(ruletype)) {
@@ -919,31 +952,32 @@ if (binaryInfo != null && binaryInfo.length > 0) {
919952
if (/reject-[^-]+-no-drop/i.test(rulepolicy) && !isLooniOS) {
920953
rulepolicy = rulepolicy.replace(/-no-drop/i, '')
921954
}
922-
923955
if (rulepolicy == '') {
924956
notBuildInPolicy.push(ori)
925957
} else if (/^proxy$/i.test(rulepolicy) && modistatus == 'no' && (isSurgeiOS || isStashiOS)) {
926958
notBuildInPolicy.push(ori)
927959
} else if (!policyRegex.test(rulepolicy) && !/^proxy$/i.test(rulepolicy) && modistatus == 'no') {
928960
notBuildInPolicy.push(ori)
929961
} else if (/^in-port|domain-wildcard$/i.test(ruletype) && isSurgeiOS) {
930-
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni)
962+
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm)
931963
} else if (/^protocol$/i.test(ruletype) && (isLooniOS || isSurgeiOS)) {
932964
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore)
933965
} else if (/^(?:domain-set|rule-set)$/i.test(ruletype) && (isSurgeiOS || isShadowrocket)) {
934-
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni)
966+
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm)
935967
} else if (
936-
/^(?:domain(-suffix|-keyword)?|ip(-asn|-cidr6?)|user-agent|url-regex|de?st-port)$/i.test(ruletype) &&
968+
/^(?:domain(-suffix|-keyword)?|ip(-asn|-cidr6?)|geoip|user-agent|url-regex|de?st-port)$/i.test(ruletype) &&
937969
!isStashiOS
938970
) {
939971
rulevalue = /,/.test(rulevalue) && !/[()]/.test(rulevalue) ? '"' + rulevalue + '"' : rulevalue
940-
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni)
972+
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm)
941973
} else if (/^(?:and|or|not)$/i.test(ruletype) && !isStashiOS) {
942974
rules.push(ori)
943975
} else if (/(?:^domain$|domain-suffix|domain-keyword|ip-|de?st-port)/i.test(ruletype) && isStashiOS) {
944976
rules.push(mark + noteK2 + '- ' + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore)
945977
} else if (/src-port/i.test(ruletype) && (isSurgeiOS || isLooniOS)) {
946-
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy)
978+
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulepm)
979+
} else if (/src-ip|subnet/i.test(ruletype) && isSurgeiOS) {
980+
rules.push(mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulepm)
947981
} else if (/url-regex/i.test(ruletype) && isStashiOS && /reject/i.test(rulepolicy)) {
948982
let Urx2Reject
949983
if (/DICT/i.test(rulepolicy)) {

script-hub.beta.js

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)