shadowsocks: Multi-user support for legacy AEAD inbound

Signed-off-by: wwqgtxx <wwqgtxx@gmail.com>
This commit is contained in:
世界 2023-04-14 20:49:34 +08:00
parent 0a4abcbbc8
commit 2850354070
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
2 changed files with 22 additions and 10 deletions

View file

@ -9,6 +9,8 @@ import (
C "github.com/sagernet/sing-box/constant" 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" "github.com/sagernet/sing-box/option"
"github.com/sagernet/sing-shadowsocks"
"github.com/sagernet/sing-shadowsocks/shadowaead"
"github.com/sagernet/sing-shadowsocks/shadowaead_2022" "github.com/sagernet/sing-shadowsocks/shadowaead_2022"
"github.com/sagernet/sing/common" "github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/auth" "github.com/sagernet/sing/common/auth"
@ -25,7 +27,7 @@ var (
type ShadowsocksMulti struct { type ShadowsocksMulti struct {
myInboundAdapter myInboundAdapter
service *shadowaead_2022.MultiService[int] service shadowsocks.MultiService[int]
users []option.ShadowsocksUser users []option.ShadowsocksUser
} }
@ -49,16 +51,26 @@ func newShadowsocksMulti(ctx context.Context, router adapter.Router, logger log.
} else { } else {
udpTimeout = int64(C.UDPTimeout.Seconds()) udpTimeout = int64(C.UDPTimeout.Seconds())
} }
if !common.Contains(shadowaead_2022.List, options.Method) { var (
return nil, E.New("unsupported method: " + options.Method) service shadowsocks.MultiService[int]
} err error
service, err := shadowaead_2022.NewMultiServiceWithPassword[int]( )
if common.Contains(shadowaead_2022.List, options.Method) {
service, err = shadowaead_2022.NewMultiServiceWithPassword[int](
options.Method, options.Method,
options.Password, options.Password,
udpTimeout, udpTimeout,
adapter.NewUpstreamContextHandler(inbound.newConnection, inbound.newPacketConnection, inbound), adapter.NewUpstreamContextHandler(inbound.newConnection, inbound.newPacketConnection, inbound),
router.TimeFunc(), router.TimeFunc(),
) )
} else if common.Contains(shadowaead.List, options.Method) {
service, err = shadowaead.NewMultiService[int](
options.Method,
udpTimeout,
adapter.NewUpstreamContextHandler(inbound.newConnection, inbound.newPacketConnection, inbound))
} else {
return nil, E.New("unsupported method: " + options.Method)
}
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -4,7 +4,7 @@ type ShadowsocksInboundOptions struct {
ListenOptions ListenOptions
Network NetworkList `json:"network,omitempty"` Network NetworkList `json:"network,omitempty"`
Method string `json:"method"` Method string `json:"method"`
Password string `json:"password"` Password string `json:"password,omitempty"`
Users []ShadowsocksUser `json:"users,omitempty"` Users []ShadowsocksUser `json:"users,omitempty"`
Destinations []ShadowsocksDestination `json:"destinations,omitempty"` Destinations []ShadowsocksDestination `json:"destinations,omitempty"`
} }