Skip to content

Commit b8e10db

Browse files
committed
feat: Add lower case matching support
1 parent b0ee624 commit b8e10db

File tree

4 files changed

+56
-14
lines changed

4 files changed

+56
-14
lines changed

config/rule.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package config
2+
3+
import (
4+
"encoding/json"
5+
6+
"github.com/layou233/zbproxy/v3/common/jsonx"
7+
)
8+
9+
type _RuleParameterListableString struct {
10+
Lists jsonx.Listable[string]
11+
LowerCase bool
12+
}
13+
14+
type RuleParameterListableString _RuleParameterListableString
15+
16+
var _ json.Unmarshaler = (*RuleParameterListableString)(nil)
17+
18+
func (r *RuleParameterListableString) UnmarshalJSON(bytes []byte) error {
19+
err := json.Unmarshal(bytes, (*_RuleParameterListableString)(r))
20+
if err == nil {
21+
return nil
22+
}
23+
err = json.Unmarshal(bytes, &r.Lists)
24+
if err == nil {
25+
r.LowerCase = false
26+
return nil
27+
}
28+
return err
29+
}

config/service.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ type Service struct {
1717
}
1818

1919
type access struct {
20-
Mode string // 'accept' or 'deny' or empty
21-
ListTags []string `json:",omitempty"`
20+
Mode string // 'accept' or 'deny' or empty
21+
ListTags []string `json:",omitempty"`
22+
LowerCase bool `json:",omitempty"`
2223
}
2324

2425
type MinecraftService struct {

protocol/minecraft/outbound.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,10 @@ func (o *Outbound) InjectConnection(ctx context.Context, conn *bufio.CachedConn,
224224
}
225225
if o.config.Minecraft.HostnameAccess.Mode != access.DefaultMode {
226226
hostnameClean := metadata.Minecraft.CleanOriginDestination()
227-
if !access.Check(o.hostnameAccessLists, o.config.Minecraft.HostnameAccess.Mode, metadata.Minecraft.CleanOriginDestination()) {
227+
if o.config.Minecraft.HostnameAccess.LowerCase {
228+
hostnameClean = strings.ToLower(hostnameClean)
229+
}
230+
if !access.Check(o.hostnameAccessLists, o.config.Minecraft.HostnameAccess.Mode, hostnameClean) {
228231
conn.Conn.(*net.TCPConn).SetLinger(0)
229232
conn.Close()
230233
return common.Cause("hostname "+o.config.Minecraft.HostnameAccess.Mode+
@@ -338,7 +341,11 @@ func (o *Outbound) InjectConnection(ctx context.Context, conn *bufio.CachedConn,
338341
buffer := buf.New()
339342
buffer.Reset(mcprotocol.MaxVarIntLen)
340343
if o.config.Minecraft.NameAccess.Mode != access.DefaultMode {
341-
if !access.Check(o.nameAccessLists, o.config.Minecraft.NameAccess.Mode, metadata.Minecraft.PlayerName) {
344+
name := metadata.Minecraft.PlayerName
345+
if o.config.Minecraft.NameAccess.LowerCase {
346+
name = strings.ToLower(metadata.Minecraft.PlayerName)
347+
}
348+
if !access.Check(o.nameAccessLists, o.config.Minecraft.NameAccess.Mode, name) {
342349
msg, err := generateKickMessage(o.config, metadata.Minecraft.PlayerName).MarshalJSON()
343350
if err != nil { // almost impossible
344351
buffer.Release()

route/rule_minecraft.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,29 @@ import (
66
"strings"
77

88
"github.com/layou233/zbproxy/v3/adapter"
9-
"github.com/layou233/zbproxy/v3/common/jsonx"
109
"github.com/layou233/zbproxy/v3/common/mcprotocol"
1110
"github.com/layou233/zbproxy/v3/common/set"
1211
"github.com/layou233/zbproxy/v3/config"
1312
)
1413

1514
type RuleMinecraftPlayerName struct {
16-
sets []set.StringSet
17-
config *config.Rule
15+
sets []set.StringSet
16+
lowerCase bool
17+
config *config.Rule
1818
}
1919

2020
var _ Rule = (*RuleMinecraftPlayerName)(nil)
2121

2222
func NewMinecraftPlayerNameRule(newConfig *config.Rule, listMap map[string]set.StringSet) (Rule, error) {
23-
var playerList jsonx.Listable[string]
24-
err := json.Unmarshal(newConfig.Parameter, &playerList)
23+
var playerNameParameter config.RuleParameterListableString
24+
err := json.Unmarshal(newConfig.Parameter, &playerNameParameter)
2525
if err != nil {
26-
return nil, fmt.Errorf("bad player name list %v: %w", newConfig.Parameter, err)
26+
return nil, fmt.Errorf("bad player name parameter %v: %w", newConfig.Parameter, err)
2727
}
2828
sets := []set.StringSet{
2929
{}, // new set for individual names
3030
}
31-
for _, i := range playerList {
31+
for _, i := range playerNameParameter.Lists {
3232
if strings.HasPrefix(i, parameterListPrefix) {
3333
i = strings.TrimPrefix(i, parameterListPrefix)
3434
nameSet, found := listMap[i]
@@ -41,8 +41,9 @@ func NewMinecraftPlayerNameRule(newConfig *config.Rule, listMap map[string]set.S
4141
}
4242
}
4343
return &RuleMinecraftPlayerName{
44-
sets: sets,
45-
config: newConfig,
44+
sets: sets,
45+
lowerCase: playerNameParameter.LowerCase,
46+
config: newConfig,
4647
}, nil
4748
}
4849

@@ -52,8 +53,12 @@ func (r *RuleMinecraftPlayerName) Config() *config.Rule {
5253

5354
func (r *RuleMinecraftPlayerName) Match(metadata *adapter.Metadata) (match bool) {
5455
if metadata.Minecraft != nil {
56+
name := metadata.Minecraft.PlayerName
57+
if r.lowerCase {
58+
name = strings.ToLower(name)
59+
}
5560
for _, nameSet := range r.sets {
56-
match = nameSet.Has(metadata.Minecraft.PlayerName)
61+
match = nameSet.Has(name)
5762
if match {
5863
break
5964
}

0 commit comments

Comments
 (0)