1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-02-20 23:47:21 -05:00

merge user info inbound metadata

This commit is contained in:
Darien Raymond 2018-10-15 08:36:50 +02:00
parent e35e3e6e53
commit 595f3d685e
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
8 changed files with 42 additions and 26 deletions

View File

@ -133,7 +133,12 @@ func (d *DefaultDispatcher) getLink(ctx context.Context) (*vio.Link, *vio.Link)
Writer: downlinkWriter, Writer: downlinkWriter,
} }
user := protocol.UserFromContext(ctx) sessionInbound := session.InboundFromContext(ctx)
var user *protocol.MemoryUser
if sessionInbound != nil {
user = sessionInbound.User
}
if user != nil && len(user.Email) > 0 { if user != nil && len(user.Email) > 0 {
p := d.policy.ForLevel(user.Level) p := d.policy.ForLevel(user.Level)
if p.Stats.UserUplink { if p.Stats.UserUplink {

View File

@ -8,7 +8,6 @@ import (
"v2ray.com/core/app/dispatcher" "v2ray.com/core/app/dispatcher"
"v2ray.com/core/common/net" "v2ray.com/core/common/net"
"v2ray.com/core/common/protocol"
"v2ray.com/core/common/strmatcher" "v2ray.com/core/common/strmatcher"
"v2ray.com/core/proxy" "v2ray.com/core/proxy"
) )
@ -282,7 +281,12 @@ func NewUserMatcher(users []string) *UserMatcher {
} }
func (v *UserMatcher) Apply(ctx context.Context) bool { func (v *UserMatcher) Apply(ctx context.Context) bool {
user := protocol.UserFromContext(ctx) inbound := session.InboundFromContext(ctx)
if inbound == nil {
return false
}
user := inbound.User
if user == nil { if user == nil {
return false return false
} }

View File

@ -27,6 +27,10 @@ func withOutbound(outbound *session.Outbound) context.Context {
return session.ContextWithOutbound(context.Background(), outbound) return session.ContextWithOutbound(context.Background(), outbound)
} }
func withInbound(inbound *session.Inbound) context.Context {
return session.ContextWithInbound(context.Background(), inbound)
}
func TestRoutingRule(t *testing.T) { func TestRoutingRule(t *testing.T) {
assert := With(t) assert := With(t)
@ -131,11 +135,11 @@ func TestRoutingRule(t *testing.T) {
}, },
test: []ruleTest{ test: []ruleTest{
{ {
input: protocol.ContextWithUser(context.Background(), &protocol.MemoryUser{Email: "admin@v2ray.com"}), input: withInbound(&session.Inbound{User: &protocol.MemoryUser{Email: "admin@v2ray.com"}}),
output: true, output: true,
}, },
{ {
input: protocol.ContextWithUser(context.Background(), &protocol.MemoryUser{Email: "love@v2ray.com"}), input: withInbound(&session.Inbound{User: &protocol.MemoryUser{Email: "love@v2ray.com"}}),
output: false, output: false,
}, },
{ {

View File

@ -7,24 +7,9 @@ import (
type key int type key int
const ( const (
userKey key = iota requestKey key = iota
requestKey
) )
// ContextWithUser returns a context combined with a User.
func ContextWithUser(ctx context.Context, user *MemoryUser) context.Context {
return context.WithValue(ctx, userKey, user)
}
// UserFromContext extracts a User from the given context, if any.
func UserFromContext(ctx context.Context) *MemoryUser {
v := ctx.Value(userKey)
if v == nil {
return nil
}
return v.(*MemoryUser)
}
func ContextWithRequestHeader(ctx context.Context, request *RequestHeader) context.Context { func ContextWithRequestHeader(ctx context.Context, request *RequestHeader) context.Context {
return context.WithValue(ctx, requestKey, request) return context.WithValue(ctx, requestKey, request)
} }

View File

@ -30,7 +30,9 @@ func (u *User) ToMemoryUser() (*MemoryUser, error) {
}, nil }, nil
} }
// MemoryUser is a parsed form of User, to reduce number of parsing of Account proto.
type MemoryUser struct { type MemoryUser struct {
// Account is the parsed account of the protocol.
Account Account Account Account
Email string Email string
Level uint32 Level uint32

View File

@ -7,6 +7,7 @@ import (
"v2ray.com/core/common/errors" "v2ray.com/core/common/errors"
"v2ray.com/core/common/net" "v2ray.com/core/common/net"
"v2ray.com/core/common/protocol"
) )
// ID of a session. // ID of a session.
@ -34,6 +35,8 @@ type Inbound struct {
Source net.Destination Source net.Destination
Gateway net.Destination Gateway net.Destination
Tag string Tag string
// User is the user that authencates for the inbound. May be nil if the protocol allows anounymous traffic.
User *protocol.MemoryUser
} }
type Outbound struct { type Outbound struct {

View File

@ -89,6 +89,11 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
}) })
account := s.user.Account.(*MemoryAccount) account := s.user.Account.(*MemoryAccount)
inbound := session.InboundFromContext(ctx)
if inbound == nil {
panic("no inbound metadata")
}
inbound.User = s.user
reader := buf.NewReader(conn) reader := buf.NewReader(conn)
for { for {
@ -126,7 +131,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
} }
dest := request.Destination() dest := request.Destination()
if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { if inbound.Source.IsValid() {
log.Record(&log.AccessMessage{ log.Record(&log.AccessMessage{
From: inbound.Source, From: inbound.Source,
To: dest, To: dest,
@ -136,7 +141,6 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
} }
newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(ctx)) newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(ctx))
ctx = protocol.ContextWithUser(ctx, request.User)
ctx = protocol.ContextWithRequestHeader(ctx, request) ctx = protocol.ContextWithRequestHeader(ctx, request)
udpServer.Dispatch(ctx, dest, data) udpServer.Dispatch(ctx, dest, data)
} }
@ -162,6 +166,12 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection,
} }
conn.SetReadDeadline(time.Time{}) conn.SetReadDeadline(time.Time{})
inbound := session.InboundFromContext(ctx)
if inbound == nil {
panic("no inbound metadata")
}
inbound.User = s.user
dest := request.Destination() dest := request.Destination()
log.Record(&log.AccessMessage{ log.Record(&log.AccessMessage{
From: conn.RemoteAddr(), From: conn.RemoteAddr(),
@ -171,8 +181,6 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection,
}) })
newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(ctx)) newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(ctx))
ctx = protocol.ContextWithUser(ctx, request.User)
ctx, cancel := context.WithCancel(ctx) ctx, cancel := context.WithCancel(ctx)
timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle)

View File

@ -264,8 +264,13 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i
newError("unable to set back read deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) newError("unable to set back read deadline").Base(err).WriteToLog(session.ExportIDToError(ctx))
} }
inbound := session.InboundFromContext(ctx)
if inbound == nil {
panic("no inbound metadata")
}
inbound.User = request.User
sessionPolicy = h.policyManager.ForLevel(request.User.Level) sessionPolicy = h.policyManager.ForLevel(request.User.Level)
ctx = protocol.ContextWithUser(ctx, request.User)
ctx, cancel := context.WithCancel(ctx) ctx, cancel := context.WithCancel(ctx)
timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle)