mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-11-16 03:32:33 +08:00
chore: code cleanup
This commit is contained in:
parent
9bd516bc62
commit
78d945470d
|
@ -8,8 +8,10 @@ import (
|
||||||
|
|
||||||
type Addition func(metadata *C.Metadata)
|
type Addition func(metadata *C.Metadata)
|
||||||
|
|
||||||
func (a Addition) Apply(metadata *C.Metadata) {
|
func ApplyAdditions(metadata *C.Metadata, additions ...Addition) {
|
||||||
a(metadata)
|
for _, addition := range additions {
|
||||||
|
addition(metadata)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithInName(name string) Addition {
|
func WithInName(name string) Addition {
|
||||||
|
@ -36,26 +38,28 @@ func WithSpecialProxy(specialProxy string) Addition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithSrcAddr(addr net.Addr) Addition {
|
func WithDstAddr(addr net.Addr) Addition {
|
||||||
return func(metadata *C.Metadata) {
|
return func(metadata *C.Metadata) {
|
||||||
addrPort := parseAddr(addr)
|
_ = metadata.SetRemoteAddr(addr)
|
||||||
metadata.SrcIP = addrPort.Addr().Unmap()
|
|
||||||
metadata.SrcPort = addrPort.Port()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithDstAddr(addr net.Addr) Addition {
|
func WithSrcAddr(addr net.Addr) Addition {
|
||||||
return func(metadata *C.Metadata) {
|
return func(metadata *C.Metadata) {
|
||||||
addrPort := parseAddr(addr)
|
m := C.Metadata{}
|
||||||
metadata.DstIP = addrPort.Addr().Unmap()
|
if err := m.SetRemoteAddr(addr);err ==nil{
|
||||||
metadata.DstPort = addrPort.Port()
|
metadata.SrcIP = m.DstIP
|
||||||
|
metadata.SrcPort = m.DstPort
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithInAddr(addr net.Addr) Addition {
|
func WithInAddr(addr net.Addr) Addition {
|
||||||
return func(metadata *C.Metadata) {
|
return func(metadata *C.Metadata) {
|
||||||
addrPort := parseAddr(addr)
|
m := C.Metadata{}
|
||||||
metadata.InIP = addrPort.Addr().Unmap()
|
if err := m.SetRemoteAddr(addr);err ==nil{
|
||||||
metadata.InPort = addrPort.Port()
|
metadata.InIP = m.DstIP
|
||||||
|
metadata.InPort = m.DstPort
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@ package inbound
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
|
||||||
|
C "github.com/Dreamacro/clash/constant"
|
||||||
)
|
)
|
||||||
|
|
||||||
var skipAuthPrefixes []netip.Prefix
|
var skipAuthPrefixes []netip.Prefix
|
||||||
|
@ -16,9 +18,25 @@ func SkipAuthPrefixes() []netip.Prefix {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SkipAuthRemoteAddr(addr net.Addr) bool {
|
func SkipAuthRemoteAddr(addr net.Addr) bool {
|
||||||
if addrPort := parseAddr(addr); addrPort.IsValid() {
|
m := C.Metadata{}
|
||||||
|
if err := m.SetRemoteAddr(addr); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return skipAuth(m.AddrPort().Addr())
|
||||||
|
}
|
||||||
|
|
||||||
|
func SkipAuthRemoteAddress(addr string) bool {
|
||||||
|
m := C.Metadata{}
|
||||||
|
if err := m.SetRemoteAddress(addr); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return skipAuth(m.AddrPort().Addr())
|
||||||
|
}
|
||||||
|
|
||||||
|
func skipAuth(addr netip.Addr) bool {
|
||||||
|
if addr.IsValid() {
|
||||||
for _, prefix := range skipAuthPrefixes {
|
for _, prefix := range skipAuthPrefixes {
|
||||||
if prefix.Contains(addrPort.Addr().Unmap()) {
|
if prefix.Contains(addr.Unmap()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,7 @@ func NewHTTP(target socks5.Addr, source net.Addr, conn net.Conn, additions ...Ad
|
||||||
metadata := parseSocksAddr(target)
|
metadata := parseSocksAddr(target)
|
||||||
metadata.NetWork = C.TCP
|
metadata.NetWork = C.TCP
|
||||||
metadata.Type = C.HTTP
|
metadata.Type = C.HTTP
|
||||||
additions = append(additions, WithSrcAddr(source), WithInAddr(conn.LocalAddr()))
|
ApplyAdditions(metadata, WithSrcAddr(source), WithInAddr(conn.LocalAddr()))
|
||||||
for _, addition := range additions {
|
ApplyAdditions(metadata, additions...)
|
||||||
addition.Apply(metadata)
|
|
||||||
}
|
|
||||||
return conn, metadata
|
return conn, metadata
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,7 @@ import (
|
||||||
func NewHTTPS(request *http.Request, conn net.Conn, additions ...Addition) (net.Conn, *C.Metadata) {
|
func NewHTTPS(request *http.Request, conn net.Conn, additions ...Addition) (net.Conn, *C.Metadata) {
|
||||||
metadata := parseHTTPAddr(request)
|
metadata := parseHTTPAddr(request)
|
||||||
metadata.Type = C.HTTPS
|
metadata.Type = C.HTTPS
|
||||||
additions = append(additions, WithSrcAddr(conn.RemoteAddr()), WithInAddr(conn.LocalAddr()))
|
ApplyAdditions(metadata, WithSrcAddr(conn.RemoteAddr()), WithInAddr(conn.LocalAddr()))
|
||||||
for _, addition := range additions {
|
ApplyAdditions(metadata, additions...)
|
||||||
addition.Apply(metadata)
|
|
||||||
}
|
|
||||||
return conn, metadata
|
return conn, metadata
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,13 +10,11 @@ func NewPacket(target socks5.Addr, packet C.UDPPacket, source C.Type, additions
|
||||||
metadata := parseSocksAddr(target)
|
metadata := parseSocksAddr(target)
|
||||||
metadata.NetWork = C.UDP
|
metadata.NetWork = C.UDP
|
||||||
metadata.Type = source
|
metadata.Type = source
|
||||||
additions = append(additions, WithSrcAddr(packet.LocalAddr()))
|
ApplyAdditions(metadata, WithSrcAddr(packet.LocalAddr()))
|
||||||
if p, ok := packet.(C.UDPPacketInAddr); ok {
|
if p, ok := packet.(C.UDPPacketInAddr); ok {
|
||||||
additions = append(additions, WithInAddr(p.InAddr()))
|
ApplyAdditions(metadata, WithInAddr(p.InAddr()))
|
||||||
}
|
|
||||||
for _, addition := range additions {
|
|
||||||
addition.Apply(metadata)
|
|
||||||
}
|
}
|
||||||
|
ApplyAdditions(metadata, additions...)
|
||||||
|
|
||||||
return packet, metadata
|
return packet, metadata
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,7 @@ func NewSocket(target socks5.Addr, conn net.Conn, source C.Type, additions ...Ad
|
||||||
metadata := parseSocksAddr(target)
|
metadata := parseSocksAddr(target)
|
||||||
metadata.NetWork = C.TCP
|
metadata.NetWork = C.TCP
|
||||||
metadata.Type = source
|
metadata.Type = source
|
||||||
additions = append(additions, WithSrcAddr(conn.RemoteAddr()), WithInAddr(conn.LocalAddr()))
|
ApplyAdditions(metadata, WithSrcAddr(conn.RemoteAddr()), WithInAddr(conn.LocalAddr()))
|
||||||
for _, addition := range additions {
|
ApplyAdditions(metadata, additions...)
|
||||||
addition.Apply(metadata)
|
|
||||||
}
|
|
||||||
|
|
||||||
return conn, metadata
|
return conn, metadata
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,31 +61,3 @@ func parseHTTPAddr(request *http.Request) *C.Metadata {
|
||||||
|
|
||||||
return metadata
|
return metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseAddr(addr net.Addr) netip.AddrPort {
|
|
||||||
// Filter when net.Addr interface is nil
|
|
||||||
if addr == nil {
|
|
||||||
return netip.AddrPort{}
|
|
||||||
}
|
|
||||||
if addr, ok := addr.(interface{ RawAddr() net.Addr }); ok {
|
|
||||||
if rawAddr := addr.RawAddr(); rawAddr != nil {
|
|
||||||
return parseAddr(rawAddr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if addr, ok := addr.(interface{ AddrPort() netip.AddrPort }); ok {
|
|
||||||
return addr.AddrPort()
|
|
||||||
}
|
|
||||||
addrStr := addr.String()
|
|
||||||
host, port, err := net.SplitHostPort(addrStr)
|
|
||||||
if err != nil {
|
|
||||||
return netip.AddrPort{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var uint16Port uint16
|
|
||||||
if port, err := strconv.ParseUint(port, 10, 16); err == nil {
|
|
||||||
uint16Port = uint16(port)
|
|
||||||
}
|
|
||||||
|
|
||||||
ip, _ := netip.ParseAddr(host)
|
|
||||||
return netip.AddrPortFrom(ip, uint16Port)
|
|
||||||
}
|
|
||||||
|
|
|
@ -70,10 +70,7 @@ func (p proxyDialer) DialContext(ctx context.Context, network, address string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p proxyDialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) {
|
func (p proxyDialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) {
|
||||||
currentMeta := &C.Metadata{Type: C.INNER}
|
currentMeta := &C.Metadata{Type: C.INNER, DstIP: rAddrPort.Addr(), DstPort: rAddrPort.Port()}
|
||||||
if err := currentMeta.SetRemoteAddress(rAddrPort.String()); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return p.listenPacket(ctx, currentMeta)
|
return p.listenPacket(ctx, currentMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -240,6 +240,34 @@ func (m *Metadata) Valid() bool {
|
||||||
return m.Host != "" || m.DstIP.IsValid()
|
return m.Host != "" || m.DstIP.IsValid()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Metadata) SetRemoteAddr(addr net.Addr) error {
|
||||||
|
if addr == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if rawAddr, ok := addr.(interface{ RawAddr() net.Addr }); ok {
|
||||||
|
if rawAddr := rawAddr.RawAddr(); rawAddr != nil {
|
||||||
|
if err := m.SetRemoteAddr(rawAddr); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if addr, ok := addr.(interface{ AddrPort() netip.AddrPort }); ok { // *net.TCPAddr, *net.UDPAddr, M.Socksaddr
|
||||||
|
if addrPort := addr.AddrPort(); addrPort.Port() != 0 {
|
||||||
|
m.DstPort = addrPort.Port()
|
||||||
|
if addrPort.IsValid() { // sing's M.Socksaddr maybe return an invalid AddrPort if it's a DomainName
|
||||||
|
m.DstIP = addrPort.Addr().Unmap()
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
if addr, ok := addr.(interface{ AddrString() string }); ok { // must be sing's M.Socksaddr
|
||||||
|
m.Host = addr.AddrString() // actually is M.Socksaddr.Fqdn
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m.SetRemoteAddress(addr.String())
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Metadata) SetRemoteAddress(rawAddress string) error {
|
func (m *Metadata) SetRemoteAddress(rawAddress string) error {
|
||||||
host, port, err := net.SplitHostPort(rawAddress)
|
host, port, err := net.SplitHostPort(rawAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -100,7 +100,7 @@ func HandleConn(c net.Conn, tunnel C.Tunnel, cache *cache.LruCache[string, bool]
|
||||||
|
|
||||||
func authenticate(request *http.Request, cache *cache.LruCache[string, bool]) *http.Response {
|
func authenticate(request *http.Request, cache *cache.LruCache[string, bool]) *http.Response {
|
||||||
authenticator := authStore.Authenticator()
|
authenticator := authStore.Authenticator()
|
||||||
if inbound.SkipAuthRemoteAddr(N.NewCustomAddr("", request.RemoteAddr, nil)) {
|
if inbound.SkipAuthRemoteAddress(request.RemoteAddr) {
|
||||||
authenticator = nil
|
authenticator = nil
|
||||||
}
|
}
|
||||||
if authenticator != nil {
|
if authenticator != nil {
|
||||||
|
|
|
@ -17,35 +17,15 @@ func WithAdditions(ctx context.Context, additions ...inbound.Addition) context.C
|
||||||
return context.WithValue(ctx, ctxKeyAdditions, additions)
|
return context.WithValue(ctx, ctxKeyAdditions, additions)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAdditions(ctx context.Context) []inbound.Addition {
|
func getAdditions(ctx context.Context) (additions []inbound.Addition) {
|
||||||
if v := ctx.Value(ctxKeyAdditions); v != nil {
|
if v := ctx.Value(ctxKeyAdditions); v != nil {
|
||||||
if a, ok := v.([]inbound.Addition); ok {
|
if a, ok := v.([]inbound.Addition); ok {
|
||||||
return a
|
additions = a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func combineAdditions(ctx context.Context, additions []inbound.Addition, extraAdditions ...inbound.Addition) []inbound.Addition {
|
|
||||||
additionsCloned := false
|
|
||||||
if ctxAdditions := getAdditions(ctx); len(ctxAdditions) > 0 {
|
|
||||||
additions = slices.Clone(additions)
|
|
||||||
additionsCloned = true
|
|
||||||
additions = append(additions, ctxAdditions...)
|
|
||||||
}
|
|
||||||
if user, ok := auth.UserFromContext[string](ctx); ok {
|
if user, ok := auth.UserFromContext[string](ctx); ok {
|
||||||
if !additionsCloned {
|
additions = slices.Clone(additions)
|
||||||
additions = slices.Clone(additions)
|
|
||||||
additionsCloned = true
|
|
||||||
}
|
|
||||||
additions = append(additions, inbound.WithInUser(user))
|
additions = append(additions, inbound.WithInUser(user))
|
||||||
}
|
}
|
||||||
if len(extraAdditions) > 0 {
|
return
|
||||||
if !additionsCloned {
|
|
||||||
additions = slices.Clone(additions)
|
|
||||||
additionsCloned = true
|
|
||||||
}
|
|
||||||
additions = append(additions, extraAdditions...)
|
|
||||||
}
|
|
||||||
return additions
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,12 +92,10 @@ func (h *ListenerHandler) NewConnection(ctx context.Context, conn net.Conn, meta
|
||||||
cMetadata := &C.Metadata{
|
cMetadata := &C.Metadata{
|
||||||
NetWork: C.TCP,
|
NetWork: C.TCP,
|
||||||
Type: h.Type,
|
Type: h.Type,
|
||||||
Host: metadata.Destination.Fqdn,
|
|
||||||
}
|
|
||||||
additions := combineAdditions(ctx, h.Additions, inbound.WithDstAddr(metadata.Destination), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr()))
|
|
||||||
for _, addition := range additions {
|
|
||||||
addition.Apply(cMetadata)
|
|
||||||
}
|
}
|
||||||
|
inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(metadata.Destination), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr()))
|
||||||
|
inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...)
|
||||||
|
inbound.ApplyAdditions(cMetadata, h.Additions...)
|
||||||
|
|
||||||
h.Tunnel.HandleTCPConn(conn, cMetadata) // this goroutine must exit after conn unused
|
h.Tunnel.HandleTCPConn(conn, cMetadata) // this goroutine must exit after conn unused
|
||||||
return nil
|
return nil
|
||||||
|
@ -155,12 +153,10 @@ func (h *ListenerHandler) NewPacketConnection(ctx context.Context, conn network.
|
||||||
cMetadata := &C.Metadata{
|
cMetadata := &C.Metadata{
|
||||||
NetWork: C.UDP,
|
NetWork: C.UDP,
|
||||||
Type: h.Type,
|
Type: h.Type,
|
||||||
Host: dest.Fqdn,
|
|
||||||
}
|
|
||||||
additions := combineAdditions(ctx, h.Additions, inbound.WithDstAddr(dest), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr()))
|
|
||||||
for _, addition := range additions {
|
|
||||||
addition.Apply(cMetadata)
|
|
||||||
}
|
}
|
||||||
|
inbound.ApplyAdditions(cMetadata, inbound.WithDstAddr(dest), inbound.WithSrcAddr(metadata.Source), inbound.WithInAddr(conn.LocalAddr()))
|
||||||
|
inbound.ApplyAdditions(cMetadata, getAdditions(ctx)...)
|
||||||
|
inbound.ApplyAdditions(cMetadata, h.Additions...)
|
||||||
|
|
||||||
h.Tunnel.HandleUDPPacket(cPacket, cMetadata)
|
h.Tunnel.HandleUDPPacket(cPacket, cMetadata)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,7 @@ func (l *Listener) Close() error {
|
||||||
|
|
||||||
func (l *Listener) handleTCP(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition) {
|
func (l *Listener) handleTCP(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition) {
|
||||||
N.TCPKeepAlive(conn)
|
N.TCPKeepAlive(conn)
|
||||||
conn, metadata := inbound.NewSocket(l.target, conn, C.TUNNEL, additions...)
|
tunnel.HandleTCPConn(inbound.NewSocket(l.target, conn, C.TUNNEL, additions...))
|
||||||
metadata.SpecialProxy = l.proxy
|
|
||||||
tunnel.HandleTCPConn(conn, metadata)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(addr, target, proxy string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener, error) {
|
func New(addr, target, proxy string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener, error) {
|
||||||
|
@ -59,6 +57,10 @@ func New(addr, target, proxy string, tunnel C.Tunnel, additions ...inbound.Addit
|
||||||
addr: addr,
|
addr: addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if proxy != "" {
|
||||||
|
additions = append([]inbound.Addition{inbound.WithSpecialProxy(proxy)}, additions...)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
c, err := l.Accept()
|
c, err := l.Accept()
|
||||||
|
|
|
@ -51,6 +51,11 @@ func NewUDP(addr, target, proxy string, tunnel C.Tunnel, additions ...inbound.Ad
|
||||||
proxy: proxy,
|
proxy: proxy,
|
||||||
addr: addr,
|
addr: addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if proxy != "" {
|
||||||
|
additions = append([]inbound.Addition{inbound.WithSpecialProxy(proxy)}, additions...)
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
buf := pool.Get(pool.UDPBufferSize)
|
buf := pool.Get(pool.UDPBufferSize)
|
||||||
|
@ -76,7 +81,5 @@ func (l *PacketConn) handleUDP(pc net.PacketConn, tunnel C.Tunnel, buf []byte, a
|
||||||
payload: buf,
|
payload: buf,
|
||||||
}
|
}
|
||||||
|
|
||||||
packet, metadata := inbound.NewPacket(l.target, cPacket, C.TUNNEL, additions...)
|
tunnel.HandleUDPPacket(inbound.NewPacket(l.target, cPacket, C.TUNNEL, additions...))
|
||||||
metadata.SpecialProxy = l.proxy
|
|
||||||
tunnel.HandleUDPPacket(packet, metadata)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user