2022-09-06 15:23:27 -04:00
|
|
|
package transportcommon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2024-06-23 13:20:13 -04:00
|
|
|
"crypto/tls"
|
2022-09-06 15:23:27 -04:00
|
|
|
|
|
|
|
"github.com/v2fly/v2ray-core/v5/common/environment"
|
|
|
|
"github.com/v2fly/v2ray-core/v5/common/environment/envctx"
|
|
|
|
"github.com/v2fly/v2ray-core/v5/common/net"
|
|
|
|
"github.com/v2fly/v2ray-core/v5/common/session"
|
|
|
|
"github.com/v2fly/v2ray-core/v5/transport/internet"
|
2024-06-23 13:20:13 -04:00
|
|
|
v2tls "github.com/v2fly/v2ray-core/v5/transport/internet/tls"
|
2022-09-06 15:23:27 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
func ListenWithSecuritySettings(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig) (
|
2023-05-30 09:52:29 -04:00
|
|
|
net.Listener, error,
|
|
|
|
) {
|
2023-07-09 00:37:09 -04:00
|
|
|
var l net.Listener
|
2022-09-06 15:23:27 -04:00
|
|
|
|
|
|
|
transportEnvironment := envctx.EnvironmentFromContext(ctx).(environment.TransportEnvironment)
|
|
|
|
transportListener := transportEnvironment.Listener()
|
|
|
|
|
|
|
|
if port == net.Port(0) { // unix
|
|
|
|
listener, err := transportListener.Listen(ctx, &net.UnixAddr{
|
|
|
|
Name: address.Domain(),
|
|
|
|
Net: "unix",
|
|
|
|
}, streamSettings.SocketSettings)
|
|
|
|
if err != nil {
|
|
|
|
return nil, newError("failed to listen unix domain socket on ", address).Base(err)
|
|
|
|
}
|
|
|
|
newError("listening unix domain socket on ", address).WriteToLog(session.ExportIDToError(ctx))
|
2023-07-09 00:37:09 -04:00
|
|
|
l = listener
|
2022-09-06 15:23:27 -04:00
|
|
|
} else { // tcp
|
|
|
|
listener, err := transportListener.Listen(ctx, &net.TCPAddr{
|
|
|
|
IP: address.IP(),
|
|
|
|
Port: int(port),
|
|
|
|
}, streamSettings.SocketSettings)
|
|
|
|
if err != nil {
|
|
|
|
return nil, newError("failed to listen TCP on ", address, ":", port).Base(err)
|
|
|
|
}
|
|
|
|
newError("listening TCP on ", address, ":", port).WriteToLog(session.ExportIDToError(ctx))
|
2023-07-09 00:37:09 -04:00
|
|
|
l = listener
|
2022-09-06 15:23:27 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
if streamSettings.SocketSettings != nil && streamSettings.SocketSettings.AcceptProxyProtocol {
|
|
|
|
newError("accepting PROXY protocol").AtWarning().WriteToLog(session.ExportIDToError(ctx))
|
|
|
|
}
|
2024-06-23 13:20:13 -04:00
|
|
|
|
|
|
|
if config := v2tls.ConfigFromStreamSettings(streamSettings); config != nil {
|
|
|
|
if tlsConfig := config.GetTLSConfig(); tlsConfig != nil {
|
|
|
|
l = tls.NewListener(l, tlsConfig)
|
|
|
|
}
|
|
|
|
}
|
2023-07-09 00:37:09 -04:00
|
|
|
return l, nil
|
2022-09-06 15:23:27 -04:00
|
|
|
}
|