mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-08-30 05:57:36 +08:00
Compare commits
109 Commits
ea149f2401
...
ccceb8b30a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ccceb8b30a | ||
![]() |
778f9ef81f | ||
![]() |
0c5947e1e3 | ||
![]() |
e268f53c87 | ||
![]() |
8505fc8352 | ||
![]() |
8c4298fd90 | ||
![]() |
e3f6d827bd | ||
![]() |
3f78bf5b93 | ||
![]() |
91f4ab15e9 | ||
![]() |
663da9d605 | ||
![]() |
0c53d6fe4c | ||
![]() |
63760e7f53 | ||
![]() |
d7936ad3a0 | ||
![]() |
e2e36e0d9e | ||
![]() |
47b77b2cc0 | ||
![]() |
8982765024 | ||
![]() |
93dbcbdb47 | ||
![]() |
46a45af787 | ||
![]() |
d3f7f2aaef | ||
![]() |
e617f7ac2d | ||
![]() |
213ad2f3c1 | ||
![]() |
83ca997dd3 | ||
![]() |
bf2963da47 | ||
![]() |
d0108ef0d7 | ||
![]() |
6c559b5df1 | ||
![]() |
4c2eaf624c | ||
![]() |
819c2b46c4 | ||
![]() |
5b34431612 | ||
![]() |
d0e5d145f2 | ||
![]() |
7a219c4613 | ||
![]() |
1a4827a292 | ||
![]() |
4f665ca82e | ||
![]() |
37297190da | ||
![]() |
105101fa0b | ||
![]() |
58c2f6f2cb | ||
![]() |
5cf1b601b4 | ||
![]() |
cd46c5323a | ||
![]() |
6c128dc213 | ||
![]() |
c0e374451d | ||
![]() |
2f1a618390 | ||
![]() |
b0206c1337 | ||
![]() |
07b955c305 | ||
![]() |
442f96e509 | ||
![]() |
2ae7c0964c | ||
![]() |
2afe76b3fd | ||
![]() |
6017820c82 | ||
![]() |
d2b136ed98 | ||
![]() |
11c23a30a4 | ||
![]() |
d1a405cea0 | ||
![]() |
194c890f7a | ||
![]() |
c2518597d5 | ||
![]() |
41e2cb5be4 | ||
![]() |
41699a35f1 | ||
![]() |
9802c6a930 | ||
![]() |
2450dec60e | ||
![]() |
5d7c093158 | ||
![]() |
6de9da225a | ||
![]() |
4f9b09e82a | ||
![]() |
bf556b1209 | ||
![]() |
34cd7f9634 | ||
![]() |
a6686075b1 | ||
![]() |
0d6ae99f33 | ||
![]() |
dac7028377 | ||
![]() |
09e8f7a4ef | ||
![]() |
4ee3b46e52 | ||
![]() |
69f86934fc | ||
![]() |
c64fb04fc9 | ||
![]() |
689f3b6b10 | ||
![]() |
83aecd3605 | ||
![]() |
6d2d9a58c6 | ||
![]() |
78488015c2 | ||
![]() |
ea3e5bf5e2 | ||
![]() |
16da80db87 | ||
![]() |
76e16f8a05 | ||
![]() |
da25171807 | ||
![]() |
afe870e530 | ||
![]() |
434b81ecf0 | ||
![]() |
f204231a76 | ||
![]() |
b032700526 | ||
![]() |
9514219058 | ||
![]() |
2610949d7d | ||
![]() |
241f5ec390 | ||
![]() |
a277fa1020 | ||
![]() |
67ab67975f | ||
![]() |
3665723c66 | ||
![]() |
5253490bde | ||
![]() |
46d40e6370 | ||
![]() |
1b544afc62 | ||
![]() |
9d5bc110ac | ||
![]() |
71927fc02b | ||
![]() |
02885d2c0a | ||
![]() |
3fb5d84542 | ||
![]() |
bf36e62560 | ||
![]() |
ffd8ce99f0 | ||
![]() |
2a5bba8695 | ||
![]() |
e76d0d5a9b | ||
![]() |
0d287ae15e | ||
![]() |
a5332b48c3 | ||
![]() |
43ca1756dc | ||
![]() |
8a0e272e7f | ||
![]() |
61ec6bb81c | ||
![]() |
93a3f1e12f | ||
![]() |
125cad85c8 | ||
![]() |
26af3ecfa1 | ||
![]() |
4682149516 | ||
![]() |
b465281ed9 | ||
![]() |
6094118a7a | ||
![]() |
692d863422 | ||
![]() |
2d1b824b62 |
@ -54,7 +54,7 @@ func convertRuleSet(sourcePath string) error {
|
|||||||
var rules []option.HeadlessRule
|
var rules []option.HeadlessRule
|
||||||
switch flagRuleSetConvertType {
|
switch flagRuleSetConvertType {
|
||||||
case "adguard":
|
case "adguard":
|
||||||
rules, err = adguard.Convert(reader, log.StdLogger())
|
rules, err = adguard.ToOptions(reader, log.StdLogger())
|
||||||
case "":
|
case "":
|
||||||
return E.New("source type is required")
|
return E.New("source type is required")
|
||||||
default:
|
default:
|
||||||
|
@ -6,7 +6,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/common/srs"
|
"github.com/sagernet/sing-box/common/srs"
|
||||||
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
|
"github.com/sagernet/sing-box/option"
|
||||||
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/json"
|
"github.com/sagernet/sing/common/json"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -50,6 +53,11 @@ func decompileRuleSet(sourcePath string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if hasRule(ruleSet.Options.Rules, func(rule option.DefaultHeadlessRule) bool {
|
||||||
|
return len(rule.AdGuardDomain) > 0
|
||||||
|
}) {
|
||||||
|
return E.New("unable to decompile binary AdGuard rules to rule-set.")
|
||||||
|
}
|
||||||
var outputPath string
|
var outputPath string
|
||||||
if flagRuleSetDecompileOutput == flagRuleSetDecompileDefaultOutput {
|
if flagRuleSetDecompileOutput == flagRuleSetDecompileDefaultOutput {
|
||||||
if strings.HasSuffix(sourcePath, ".srs") {
|
if strings.HasSuffix(sourcePath, ".srs") {
|
||||||
@ -75,3 +83,19 @@ func decompileRuleSet(sourcePath string) error {
|
|||||||
outputFile.Close()
|
outputFile.Close()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasRule(rules []option.HeadlessRule, cond func(rule option.DefaultHeadlessRule) bool) bool {
|
||||||
|
for _, rule := range rules {
|
||||||
|
switch rule.Type {
|
||||||
|
case C.RuleTypeDefault:
|
||||||
|
if cond(rule.DefaultOptions) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
case C.RuleTypeLogical:
|
||||||
|
if hasRule(rule.LogicalOptions.Rules, cond) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package adguard
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
@ -27,7 +28,7 @@ type agdguardRuleLine struct {
|
|||||||
isImportant bool
|
isImportant bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func Convert(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, error) {
|
func ToOptions(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, error) {
|
||||||
scanner := bufio.NewScanner(reader)
|
scanner := bufio.NewScanner(reader)
|
||||||
var (
|
var (
|
||||||
ruleLines []agdguardRuleLine
|
ruleLines []agdguardRuleLine
|
||||||
@ -36,45 +37,17 @@ func Convert(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, err
|
|||||||
parseLine:
|
parseLine:
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
ruleLine := scanner.Text()
|
ruleLine := scanner.Text()
|
||||||
|
|
||||||
// Empty line
|
|
||||||
if ruleLine == "" {
|
if ruleLine == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Comment (both line comment and in-line comment)
|
|
||||||
if strings.Contains(ruleLine, "!") {
|
if strings.Contains(ruleLine, "!") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Either comment or cosmetic filter
|
|
||||||
if strings.Contains(ruleLine, "#") {
|
if strings.Contains(ruleLine, "#") {
|
||||||
ignoredLines++
|
ignoredLines++
|
||||||
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// We don't support URL query anyway
|
|
||||||
if strings.Contains(ruleLine, "?") || strings.Contains(ruleLine, "&") {
|
|
||||||
ignoredLines++
|
|
||||||
logger.Debug("ignored unsupported rule with query: ", ruleLine)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Commonly seen in CSS selectors of cosmetic filters
|
|
||||||
if strings.Contains(ruleLine, "[") || strings.Contains(ruleLine, "]") {
|
|
||||||
ignoredLines++
|
|
||||||
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if strings.Contains(ruleLine, "(") || strings.Contains(ruleLine, ")") {
|
|
||||||
ignoredLines++
|
|
||||||
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// We don't support $domain modifier
|
|
||||||
if strings.Contains(ruleLine, "~") {
|
|
||||||
ignoredLines++
|
|
||||||
logger.Debug("ignored unsupported rule modifier: ", ruleLine)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
originRuleLine := ruleLine
|
originRuleLine := ruleLine
|
||||||
if M.IsDomainName(ruleLine) {
|
if M.IsDomainName(ruleLine) {
|
||||||
ruleLines = append(ruleLines, agdguardRuleLine{
|
ruleLines = append(ruleLines, agdguardRuleLine{
|
||||||
@ -169,6 +142,26 @@ parseLine:
|
|||||||
logger.Debug("ignored unsupported rule with path: ", ruleLine)
|
logger.Debug("ignored unsupported rule with path: ", ruleLine)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if strings.Contains(ruleLine, "?") || strings.Contains(ruleLine, "&") {
|
||||||
|
ignoredLines++
|
||||||
|
logger.Debug("ignored unsupported rule with query: ", ruleLine)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.Contains(ruleLine, "[") || strings.Contains(ruleLine, "]") {
|
||||||
|
ignoredLines++
|
||||||
|
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.Contains(ruleLine, "(") || strings.Contains(ruleLine, ")") {
|
||||||
|
ignoredLines++
|
||||||
|
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.Contains(ruleLine, "~") {
|
||||||
|
ignoredLines++
|
||||||
|
logger.Debug("ignored unsupported rule modifier: ", ruleLine)
|
||||||
|
continue
|
||||||
|
}
|
||||||
var domainCheck string
|
var domainCheck string
|
||||||
if strings.HasPrefix(ruleLine, ".") || strings.HasPrefix(ruleLine, "-") {
|
if strings.HasPrefix(ruleLine, ".") || strings.HasPrefix(ruleLine, "-") {
|
||||||
domainCheck = "r" + ruleLine
|
domainCheck = "r" + ruleLine
|
||||||
@ -313,6 +306,106 @@ parseLine:
|
|||||||
return []option.HeadlessRule{currentRule}, nil
|
return []option.HeadlessRule{currentRule}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrInvalid = E.New("invalid binary AdGuard rule-set")
|
||||||
|
|
||||||
|
func FromOptions(rules []option.HeadlessRule) ([]byte, error) {
|
||||||
|
if len(rules) != 1 {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
rule := rules[0]
|
||||||
|
var (
|
||||||
|
importantDomain []string
|
||||||
|
importantDomainRegex []string
|
||||||
|
importantExcludeDomain []string
|
||||||
|
importantExcludeDomainRegex []string
|
||||||
|
domain []string
|
||||||
|
domainRegex []string
|
||||||
|
excludeDomain []string
|
||||||
|
excludeDomainRegex []string
|
||||||
|
)
|
||||||
|
parse:
|
||||||
|
for {
|
||||||
|
switch rule.Type {
|
||||||
|
case C.RuleTypeLogical:
|
||||||
|
if !(len(rule.LogicalOptions.Rules) == 2 && rule.LogicalOptions.Rules[0].Type == C.RuleTypeDefault) {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
if rule.LogicalOptions.Mode == C.LogicalTypeAnd && rule.LogicalOptions.Rules[0].DefaultOptions.Invert {
|
||||||
|
if len(importantExcludeDomain) == 0 && len(importantExcludeDomainRegex) == 0 {
|
||||||
|
importantExcludeDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
|
||||||
|
importantExcludeDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
|
||||||
|
if len(importantExcludeDomain)+len(importantExcludeDomainRegex) == 0 {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
excludeDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
|
||||||
|
excludeDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
|
||||||
|
if len(excludeDomain)+len(excludeDomainRegex) == 0 {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if rule.LogicalOptions.Mode == C.LogicalTypeOr && !rule.LogicalOptions.Rules[0].DefaultOptions.Invert {
|
||||||
|
importantDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
|
||||||
|
importantDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
|
||||||
|
if len(importantDomain)+len(importantDomainRegex) == 0 {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
rule = rule.LogicalOptions.Rules[1]
|
||||||
|
case C.RuleTypeDefault:
|
||||||
|
domain = rule.DefaultOptions.AdGuardDomain
|
||||||
|
domainRegex = rule.DefaultOptions.DomainRegex
|
||||||
|
if len(domain)+len(domainRegex) == 0 {
|
||||||
|
return nil, ErrInvalid
|
||||||
|
}
|
||||||
|
break parse
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var output bytes.Buffer
|
||||||
|
for _, ruleLine := range importantDomain {
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("$important\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range importantDomainRegex {
|
||||||
|
output.WriteString("/")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("/$important\n")
|
||||||
|
|
||||||
|
}
|
||||||
|
for _, ruleLine := range importantExcludeDomain {
|
||||||
|
output.WriteString("@@")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("$important\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range importantExcludeDomainRegex {
|
||||||
|
output.WriteString("@@/")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("/$important\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range domain {
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range domainRegex {
|
||||||
|
output.WriteString("/")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("/\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range excludeDomain {
|
||||||
|
output.WriteString("@@")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("\n")
|
||||||
|
}
|
||||||
|
for _, ruleLine := range excludeDomainRegex {
|
||||||
|
output.WriteString("@@/")
|
||||||
|
output.WriteString(ruleLine)
|
||||||
|
output.WriteString("/\n")
|
||||||
|
}
|
||||||
|
return output.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
func ignoreIPCIDRRegexp(ruleLine string) bool {
|
func ignoreIPCIDRRegexp(ruleLine string) bool {
|
||||||
if strings.HasPrefix(ruleLine, "(http?:\\/\\/)") {
|
if strings.HasPrefix(ruleLine, "(http?:\\/\\/)") {
|
||||||
ruleLine = ruleLine[12:]
|
ruleLine = ruleLine[12:]
|
||||||
|
@ -14,7 +14,8 @@ import (
|
|||||||
|
|
||||||
func TestConverter(t *testing.T) {
|
func TestConverter(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rules, err := Convert(strings.NewReader(`
|
ruleString := `||sagernet.org^$important
|
||||||
|
@@|sing-box.sagernet.org^$important
|
||||||
||example.org^
|
||example.org^
|
||||||
|example.com^
|
|example.com^
|
||||||
example.net^
|
example.net^
|
||||||
@ -22,10 +23,9 @@ example.net^
|
|||||||
||example.edu.tw^
|
||example.edu.tw^
|
||||||
|example.gov
|
|example.gov
|
||||||
example.arpa
|
example.arpa
|
||||||
@@|sagernet.example.org|
|
@@|sagernet.example.org^
|
||||||
||sagernet.org^$important
|
`
|
||||||
@@|sing-box.sagernet.org^$important
|
rules, err := ToOptions(strings.NewReader(ruleString), logger.NOP())
|
||||||
`), logger.NOP())
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Len(t, rules, 1)
|
require.Len(t, rules, 1)
|
||||||
rule, err := rule.NewHeadlessRule(context.Background(), rules[0])
|
rule, err := rule.NewHeadlessRule(context.Background(), rules[0])
|
||||||
@ -76,11 +76,14 @@ example.arpa
|
|||||||
Domain: domain,
|
Domain: domain,
|
||||||
}), domain)
|
}), domain)
|
||||||
}
|
}
|
||||||
|
ruleFromOptions, err := FromOptions(rules)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, ruleString, string(ruleFromOptions))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHosts(t *testing.T) {
|
func TestHosts(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rules, err := Convert(strings.NewReader(`
|
rules, err := ToOptions(strings.NewReader(`
|
||||||
127.0.0.1 localhost
|
127.0.0.1 localhost
|
||||||
::1 localhost #[IPv6]
|
::1 localhost #[IPv6]
|
||||||
0.0.0.0 google.com
|
0.0.0.0 google.com
|
||||||
@ -111,7 +114,7 @@ func TestHosts(t *testing.T) {
|
|||||||
|
|
||||||
func TestSimpleHosts(t *testing.T) {
|
func TestSimpleHosts(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
rules, err := Convert(strings.NewReader(`
|
rules, err := ToOptions(strings.NewReader(`
|
||||||
example.com
|
example.com
|
||||||
www.example.org
|
www.example.org
|
||||||
`), logger.NOP())
|
`), logger.NOP())
|
||||||
|
@ -215,16 +215,15 @@ func readDefaultRule(reader varbin.Reader, recover bool) (rule option.DefaultHea
|
|||||||
case ruleItemWIFIBSSID:
|
case ruleItemWIFIBSSID:
|
||||||
rule.WIFIBSSID, err = readRuleItemString(reader)
|
rule.WIFIBSSID, err = readRuleItemString(reader)
|
||||||
case ruleItemAdGuardDomain:
|
case ruleItemAdGuardDomain:
|
||||||
if recover {
|
|
||||||
err = E.New("unable to decompile binary AdGuard rules to rule-set")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var matcher *domain.AdGuardMatcher
|
var matcher *domain.AdGuardMatcher
|
||||||
matcher, err = domain.ReadAdGuardMatcher(reader)
|
matcher, err = domain.ReadAdGuardMatcher(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
rule.AdGuardDomainMatcher = matcher
|
rule.AdGuardDomainMatcher = matcher
|
||||||
|
if recover {
|
||||||
|
rule.AdGuardDomain = matcher.Dump()
|
||||||
|
}
|
||||||
case ruleItemNetworkType:
|
case ruleItemNetworkType:
|
||||||
rule.NetworkType, err = readRuleItemUint8[option.InterfaceType](reader)
|
rule.NetworkType, err = readRuleItemUint8[option.InterfaceType](reader)
|
||||||
case ruleItemNetworkIsExpensive:
|
case ruleItemNetworkIsExpensive:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
icon: material/alert-decagram
|
icon: material/alert-decagram
|
||||||
---
|
---
|
||||||
|
|
||||||
#### 1.12.0-beta.25
|
#### 1.12.0-beta.26
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -34,7 +34,7 @@ require (
|
|||||||
github.com/sagernet/sing-shadowsocks v0.2.8
|
github.com/sagernet/sing-shadowsocks v0.2.8
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.1
|
github.com/sagernet/sing-shadowsocks2 v0.2.1
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11
|
||||||
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2
|
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26
|
||||||
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88
|
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88
|
||||||
github.com/sagernet/smux v1.5.34-mod.2
|
github.com/sagernet/smux v1.5.34-mod.2
|
||||||
github.com/sagernet/tailscale v1.80.3-mod.5
|
github.com/sagernet/tailscale v1.80.3-mod.5
|
||||||
|
4
go.sum
4
go.sum
@ -180,8 +180,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnq
|
|||||||
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
|
||||||
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2 h1:leio5dGtYCKHQam+SyLszq4bbXGaxF4ElK5Aif/lUb8=
|
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26 h1:N9yAoqtQlawlJzLONjdQvIO3GJLEg9tZBfyKToSi0cM=
|
||||||
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
|
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
|
||||||
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88 h1:0pVm8sPOel+BoiCddW3pV3cKDKEaSioVTYDdTSKjyFI=
|
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88 h1:0pVm8sPOel+BoiCddW3pV3cKDKEaSioVTYDdTSKjyFI=
|
||||||
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88/go.mod h1:IL8Rr+EGwuqijszZkNrEFTQDKhilEpkqFqOlvdpS6/w=
|
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88/go.mod h1:IL8Rr+EGwuqijszZkNrEFTQDKhilEpkqFqOlvdpS6/w=
|
||||||
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
|
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
|
||||||
|
Loading…
x
Reference in New Issue
Block a user