@@ -24,6 +24,7 @@ import (
2424
2525 "github.com/fatedier/frp/models/config"
2626 "github.com/fatedier/frp/models/msg"
27+ plugin "github.com/fatedier/frp/models/plugin/server"
2728 "github.com/fatedier/frp/server/controller"
2829 "github.com/fatedier/frp/server/metrics"
2930 frpNet "github.com/fatedier/frp/utils/net"
@@ -41,6 +42,8 @@ type Proxy interface {
4142 GetConf () config.ProxyConf
4243 GetWorkConnFromPool (src , dst net.Addr ) (workConn net.Conn , err error )
4344 GetUsedPortsNum () int
45+ GetResourceController () * controller.ResourceController
46+ GetUserInfo () plugin.UserInfo
4447 Close ()
4548}
4649
@@ -52,6 +55,7 @@ type BaseProxy struct {
5255 poolCount int
5356 getWorkConnFn GetWorkConnFn
5457 serverCfg config.ServerCommonConf
58+ userInfo plugin.UserInfo
5559
5660 mu sync.RWMutex
5761 xl * xlog.Logger
@@ -70,6 +74,14 @@ func (pxy *BaseProxy) GetUsedPortsNum() int {
7074 return pxy .usedPortsNum
7175}
7276
77+ func (pxy * BaseProxy ) GetResourceController () * controller.ResourceController {
78+ return pxy .rc
79+ }
80+
81+ func (pxy * BaseProxy ) GetUserInfo () plugin.UserInfo {
82+ return pxy .userInfo
83+ }
84+
7385func (pxy * BaseProxy ) Close () {
7486 xl := xlog .FromContextSafe (pxy .ctx )
7587 xl .Info ("proxy closing" )
@@ -154,7 +166,7 @@ func (pxy *BaseProxy) startListenHandler(p Proxy, handler func(Proxy, net.Conn,
154166 }
155167}
156168
157- func NewProxy (ctx context.Context , runId string , rc * controller.ResourceController , poolCount int ,
169+ func NewProxy (ctx context.Context , userInfo plugin. UserInfo , rc * controller.ResourceController , poolCount int ,
158170 getWorkConnFn GetWorkConnFn , pxyConf config.ProxyConf , serverCfg config.ServerCommonConf ) (pxy Proxy , err error ) {
159171
160172 xl := xlog .FromContextSafe (ctx ).Spawn ().AppendPrefix (pxyConf .GetBaseInfo ().ProxyName )
@@ -167,6 +179,7 @@ func NewProxy(ctx context.Context, runId string, rc *controller.ResourceControll
167179 serverCfg : serverCfg ,
168180 xl : xl ,
169181 ctx : xlog .NewContext (ctx , xl ),
182+ userInfo : userInfo ,
170183 }
171184 switch cfg := pxyConf .(type ) {
172185 case * config.TcpProxyConf :
@@ -218,6 +231,20 @@ func HandleUserTcpConnection(pxy Proxy, userConn net.Conn, serverCfg config.Serv
218231 xl := xlog .FromContextSafe (pxy .Context ())
219232 defer userConn .Close ()
220233
234+ // server plugin hook
235+ rc := pxy .GetResourceController ()
236+ content := & plugin.NewUserConnContent {
237+ User : pxy .GetUserInfo (),
238+ ProxyName : pxy .GetName (),
239+ ProxyType : pxy .GetConf ().GetBaseInfo ().ProxyType ,
240+ RemoteAddr : userConn .RemoteAddr ().String (),
241+ }
242+ _ , err := rc .PluginManager .NewUserConn (content )
243+ if err != nil {
244+ xl .Warn ("the user conn [%s] was rejected, err:%v" , content .RemoteAddr , err )
245+ return
246+ }
247+
221248 // try all connections from the pool
222249 workConn , err := pxy .GetWorkConnFromPool (userConn .RemoteAddr (), userConn .LocalAddr ())
223250 if err != nil {
0 commit comments