@@ -12,7 +12,7 @@ import (
1212 "time"
1313 "unsafe"
1414
15- app_dispatcher "github.com/xtls/xray-core/app/dispatcher"
15+ "github.com/xtls/xray-core/app/dispatcher"
1616 "github.com/xtls/xray-core/app/reverse"
1717 "github.com/xtls/xray-core/common"
1818 "github.com/xtls/xray-core/common/buf"
@@ -71,23 +71,27 @@ func init() {
7171
7272// Handler is an inbound connection handler that handles messages in VLess protocol.
7373type Handler struct {
74- inboundHandlerManager feature_inbound.Manager
75- policyManager policy.Manager
76- validator vless.Validator
77- dns dns.Client
78- decryption * encryption.ServerInstance
79- fallbacks map [string ]map [string ]map [string ]* Fallback // or nil
74+ inboundHandlerManager feature_inbound.Manager
75+ policyManager policy.Manager
76+ validator vless.Validator
77+ decryption * encryption.ServerInstance
78+ outboundHandlerManager outbound.Manager
79+ defaultDispatcher * dispatcher.DefaultDispatcher
80+ ctx context.Context
81+ fallbacks map [string ]map [string ]map [string ]* Fallback // or nil
8082 // regexps map[string]*regexp.Regexp // or nil
8183}
8284
8385// New creates a new VLess inbound handler.
8486func New (ctx context.Context , config * Config , dc dns.Client , validator vless.Validator ) (* Handler , error ) {
8587 v := core .MustFromContext (ctx )
8688 handler := & Handler {
87- inboundHandlerManager : v .GetFeature (feature_inbound .ManagerType ()).(feature_inbound.Manager ),
88- policyManager : v .GetFeature (policy .ManagerType ()).(policy.Manager ),
89- dns : dc ,
90- validator : validator ,
89+ inboundHandlerManager : v .GetFeature (feature_inbound .ManagerType ()).(feature_inbound.Manager ),
90+ policyManager : v .GetFeature (policy .ManagerType ()).(policy.Manager ),
91+ validator : validator ,
92+ outboundHandlerManager : v .GetFeature (outbound .ManagerType ()).(outbound.Manager ),
93+ defaultDispatcher : v .GetFeature (routing .DispatcherType ()).(* dispatcher.DefaultDispatcher ),
94+ ctx : ctx ,
9195 }
9296
9397 if config .Decryption != "" && config .Decryption != "none" {
@@ -179,12 +183,46 @@ func isMuxAndNotXUDP(request *protocol.RequestHeader, first *buf.Buffer) bool {
179183 firstBytes [6 ] == 2 ) // Network type: UDP
180184}
181185
186+ func (h * Handler ) GetReverse (a * vless.MemoryAccount ) (* Reverse , error ) {
187+ u := h .validator .Get (a .ID .UUID ())
188+ if u == nil {
189+ return nil , errors .New ("reverse: user " + a .ID .String () + " doesn't exist anymore" )
190+ }
191+ a = u .Account .(* vless.MemoryAccount )
192+ if a .Reverse == nil || a .Reverse .Tag == "" {
193+ return nil , errors .New ("reverse: user " + a .ID .String () + " is not allowed to create reverse proxy" )
194+ }
195+ r := h .outboundHandlerManager .GetHandler (a .Reverse .Tag )
196+ if r == nil {
197+ picker , _ := reverse .NewStaticMuxPicker ()
198+ r = & Reverse {tag : a .Reverse .Tag , picker : picker , client : & mux.ClientManager {Picker : picker }}
199+ if err := h .outboundHandlerManager .AddHandler (h .ctx , r ); err != nil {
200+ return nil , err
201+ }
202+ }
203+ if r , ok := r .(* Reverse ); ok {
204+ return r , nil
205+ }
206+ return nil , errors .New ("reverse: outbound " + a .Reverse .Tag + " is not type Reverse" )
207+ }
208+
209+ func (h * Handler ) RemoveReverse (u * protocol.MemoryUser ) {
210+ if u != nil {
211+ a := u .Account .(* vless.MemoryAccount )
212+ if a .Reverse != nil && a .Reverse .Tag != "" {
213+ h .outboundHandlerManager .RemoveHandler (h .ctx , a .Reverse .Tag )
214+ }
215+ }
216+ }
217+
182218// Close implements common.Closable.Close().
183219func (h * Handler ) Close () error {
184220 if h .decryption != nil {
185221 h .decryption .Close ()
186222 }
187- // TODO: remove reverse's handlers (needs ctx)
223+ for _ , u := range h .validator .GetAll () {
224+ h .RemoveReverse (u )
225+ }
188226 return errors .Combine (common .Close (h .validator ))
189227}
190228
@@ -195,19 +233,7 @@ func (h *Handler) AddUser(ctx context.Context, u *protocol.MemoryUser) error {
195233
196234// RemoveUser implements proxy.UserManager.RemoveUser().
197235func (h * Handler ) RemoveUser (ctx context.Context , e string ) error {
198- u := h .validator .GetByEmail (e )
199- if u != nil {
200- a := u .Account .(* vless.MemoryAccount )
201- if a .Reverse != nil && a .Reverse .Tag != "" {
202- core .RequireFeatures (ctx , func (d routing.Dispatcher , om outbound.Manager ) error { // not sure whether it works or not
203- go func () {
204- time .Sleep (time .Minute ) // TODO: check firstLen
205- om .RemoveHandler (ctx , a .Reverse .Tag )
206- }()
207- return nil
208- })
209- }
210- }
236+ h .RemoveReverse (h .validator .GetByEmail (e ))
211237 return h .validator .Del (e )
212238}
213239
@@ -519,6 +545,8 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
519545 switch request .Command {
520546 case protocol .RequestCommandUDP :
521547 return errors .New (requestAddons .Flow + " doesn't support UDP" ).AtWarning ()
548+ case protocol .RequestCommandRvs :
549+ inbound .CanSpliceCopy = 3
522550 case protocol .RequestCommandMux :
523551 fallthrough // we will break Mux connections that contain TCP requests
524552 case protocol .RequestCommandTCP :
@@ -585,30 +613,11 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
585613 bufferWriter .SetFlushNext ()
586614
587615 if request .Command == protocol .RequestCommandRvs {
588- if account .Reverse == nil || account .Reverse .Tag == "" {
589- return errors .New ("account " + account .ID .String () + " can not use reverse proxy" )
590- }
591- var rd routing.Dispatcher
592- var obm outbound.Manager
593- if err := core .RequireFeatures (ctx , func (d routing.Dispatcher , om outbound.Manager ) error {
594- rd = d
595- obm = om
596- return nil
597- }); err != nil {
616+ r , err := h .GetReverse (account )
617+ if err != nil {
598618 return err
599619 }
600- r := obm .GetHandler (account .Reverse .Tag )
601- if r == nil {
602- picker , _ := reverse .NewStaticMuxPicker ()
603- r = & Reverse {tag : account .Reverse .Tag , picker : picker , client : & mux.ClientManager {Picker : picker }}
604- if err := obm .AddHandler (ctx , r ); err != nil {
605- return err
606- }
607- }
608- if r , ok := r .(* Reverse ); ok {
609- return r .NewMux (ctx , rd .(* app_dispatcher.DefaultDispatcher ).WrapLink (ctx , & transport.Link {Reader : clientReader , Writer : clientWriter }))
610- }
611- return errors .New ("mismatched reverse tag" )
620+ return r .NewMux (ctx , h .defaultDispatcher .WrapLink (ctx , & transport.Link {Reader : clientReader , Writer : clientWriter }))
612621 }
613622
614623 if err := dispatcher .DispatchLink (ctx , request .Destination (), & transport.Link {
@@ -630,14 +639,14 @@ func (r *Reverse) Tag() string {
630639 return r .tag
631640}
632641
633- func (r * Reverse ) NewMux (ctx context.Context , link * transport.Link ) error {
642+ func (r * Reverse ) NewMux (ctx context.Context , link * transport.Link ) error { // XTLS? vnext? users?
634643 muxClient , err := mux .NewClientWorker (* link , mux.ClientStrategy {})
635644 if err != nil {
636645 return errors .New ("failed to create mux client worker" ).Base (err ).AtWarning ()
637646 }
638647 worker , err := reverse .NewPortalWorker (muxClient )
639648 if err != nil {
640- return errors .New ("failed to create portal worker" ).Base (err )
649+ return errors .New ("failed to create portal worker" ).Base (err ). AtWarning ()
641650 }
642651 r .picker .AddWorker (worker )
643652 select {
0 commit comments