Xray-core/common/session/session.go

111 lines
2.9 KiB
Go
Raw Normal View History

2020-11-25 13:01:53 +02:00
// Package session provides functions for sessions of incoming requests.
2020-12-04 03:36:16 +02:00
package session // import "github.com/xtls/xray-core/common/session"
2020-11-25 13:01:53 +02:00
import (
"context"
"math/rand"
2020-12-04 03:36:16 +02:00
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/protocol"
2020-12-05 13:58:10 +02:00
"github.com/xtls/xray-core/common/signal"
2020-11-25 13:01:53 +02:00
)
// ID of a session.
type ID uint32
// NewID generates a new ID. The generated ID is high likely to be unique, but not cryptographically secure.
// The generated ID will never be 0.
func NewID() ID {
for {
id := ID(rand.Uint32())
if id != 0 {
return id
}
}
}
// ExportIDToError transfers session.ID into an error object, for logging purpose.
// This can be used with error.WriteToLog().
func ExportIDToError(ctx context.Context) errors.ExportOption {
id := IDFromContext(ctx)
return func(h *errors.ExportOptionHolder) {
h.SessionID = uint32(id)
}
}
// Inbound is the metadata of an inbound connection.
type Inbound struct {
// Source address of the inbound connection.
Source net.Destination
2021-10-12 19:49:05 +03:00
// Gateway address.
2020-11-25 13:01:53 +02:00
Gateway net.Destination
// Tag of the inbound proxy that handles the connection.
Tag string
// User is the user that authencates for the inbound. May be nil if the protocol allows anounymous traffic.
User *protocol.MemoryUser
2020-12-05 13:58:10 +02:00
// Conn is actually internet.Connection. May be nil.
2020-12-04 03:36:16 +02:00
Conn net.Conn
2020-12-05 13:58:10 +02:00
// Timer of the inbound buf copier. May be nil.
Timer *signal.ActivityTimer
2021-08-27 08:00:13 +03:00
// Uid is the unix user id for the inbound connection
Uid uint32
// SagerNet private: AppStatus is the android app's status for the inbound connection
AppStatus []string
2021-09-13 05:58:52 +03:00
// SagerNet private
SkipFakeDNS bool
2020-11-25 13:01:53 +02:00
}
// Outbound is the metadata of an outbound connection.
type Outbound struct {
// Target address of the outbound connection.
2021-09-16 10:05:48 +03:00
Target net.Destination
RouteTarget net.Destination
2020-11-25 13:01:53 +02:00
// Gateway address
Gateway net.Address
}
// SniffingRequest controls the behavior of content sniffing.
type SniffingRequest struct {
ExcludeForDomain []string
2020-11-25 13:01:53 +02:00
OverrideDestinationForProtocol []string
Enabled bool
MetadataOnly bool
2021-09-16 10:05:48 +03:00
RouteOnly bool
2020-11-25 13:01:53 +02:00
}
// Content is the metadata of the connection content.
type Content struct {
// Protocol of current content.
Protocol string
SniffingRequest SniffingRequest
Attributes map[string]string
Merge dns (#722) * DNS: add clientip for specific nameserver * Refactoring: DNS App * DNS: add DNS over QUIC support * Feat: add disableCache option for DNS * Feat: add queryStrategy option for DNS * Feat: add disableFallback & skipFallback option for DNS * Feat: DNS hosts support multiple addresses * Feat: DNS transport over TCP * DNS: fix typo & refine code * DNS: refine code * Add disableFallbackIfMatch dns option * Feat: routing and freedom outbound ignore Fake DNS Turn off fake DNS for request sent from Routing and Freedom outbound. Fake DNS now only apply to DNS outbound. This is important for Android, where VPN service take over all system DNS traffic and pass it to core. "UseIp" option can be used in Freedom outbound to avoid getting fake IP and fail connection. * Fix test * Fix dns return * Fix local dns return empty * Apply timeout to dns outbound * Update app/dns/config.go Co-authored-by: Loyalsoldier <10487845+loyalsoldier@users.noreply.github.com> Co-authored-by: Ye Zhihao <vigilans@foxmail.com> Co-authored-by: maskedeken <52683904+maskedeken@users.noreply.github.com> Co-authored-by: V2Fly Team <51714622+vcptr@users.noreply.github.com> Co-authored-by: CalmLong <37164399+calmlong@users.noreply.github.com> Co-authored-by: Shelikhoo <xiaokangwang@outlook.com> Co-authored-by: 秋のかえで <autmaple@protonmail.com> Co-authored-by: 朱聖黎 <digglife@gmail.com> Co-authored-by: rurirei <72071920+rurirei@users.noreply.github.com> Co-authored-by: yuhan6665 <1588741+yuhan6665@users.noreply.github.com> Co-authored-by: Arthur Morgan <4637240+badO1a5A90@users.noreply.github.com>
2021-10-16 16:02:51 +03:00
SkipDNSResolve bool
2020-11-25 13:01:53 +02:00
}
// Sockopt is the settings for socket connection.
type Sockopt struct {
// Mark of the socket connection.
Mark int32
}
// SetAttribute attachs additional string attributes to content.
func (c *Content) SetAttribute(name string, value string) {
if c.Attributes == nil {
c.Attributes = make(map[string]string)
}
c.Attributes[name] = value
}
// Attribute retrieves additional string attributes from content.
func (c *Content) Attribute(name string) string {
if c.Attributes == nil {
return ""
}
return c.Attributes[name]
}