Files

125 lines
3.9 KiB
Go
Raw Permalink Normal View History

2020-11-25 19:01:53 +08:00
// Package session provides functions for sessions of incoming requests.
2020-12-04 09:36:16 +08:00
package session // import "github.com/xtls/xray-core/common/session"
2020-11-25 19:01:53 +08:00
import (
"context"
"math/rand"
2024-06-29 14:32:57 -04:00
c "github.com/xtls/xray-core/common/ctx"
2020-12-04 09:36:16 +08:00
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/geodata"
2020-12-04 09:36:16 +08:00
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/protocol"
2020-12-05 11:58:10 +00:00
"github.com/xtls/xray-core/common/signal"
2020-11-25 19:01:53 +08:00
)
// 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.
2024-06-29 14:32:57 -04:00
func NewID() c.ID {
2020-11-25 19:01:53 +08:00
for {
2024-06-29 14:32:57 -04:00
id := c.ID(rand.Uint32())
2020-11-25 19:01:53 +08:00
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 {
2024-06-29 14:32:57 -04:00
id := c.IDFromContext(ctx)
2020-11-25 19:01:53 +08:00
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
// Local address of the inbound connection.
Local net.Destination
2021-10-13 00:49:05 +08:00
// Gateway address.
2020-11-25 19:01:53 +08:00
Gateway net.Destination
// Tag of the inbound proxy that handles the connection.
Tag string
// Name of the inbound proxy that handles the connection.
Name string
2024-04-11 17:51:12 +08:00
// User is the user that authenticates for the inbound. May be nil if the protocol allows anonymous traffic.
2020-11-25 19:01:53 +08:00
User *protocol.MemoryUser
// VlessRoute is the user-sent VLESS UUID's 7th<<8 | 8th bytes.
VlessRoute net.Port
// Used by splice copy. Conn is actually internet.Connection. May be nil.
2020-12-04 09:36:16 +08:00
Conn net.Conn
// Used by splice copy. Timer of the inbound buf copier. May be nil.
2020-12-05 11:58:10 +00:00
Timer *signal.ActivityTimer
// CanSpliceCopy is a property for this connection
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
CanSpliceCopy int
}
2020-11-25 19:01:53 +08:00
// Outbound is the metadata of an outbound connection.
type Outbound struct {
// Target address of the outbound connection.
2023-08-29 15:12:36 +08:00
OriginalTarget net.Destination
Target net.Destination
RouteTarget net.Destination
2020-11-25 19:01:53 +08:00
// Gateway address
Gateway net.Address
// Tag of the outbound proxy that handles the connection.
Tag string
// Name of the outbound proxy that handles the connection.
Name string
// Unused. Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings
Conn net.Conn
// CanSpliceCopy is a property for this connection
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
CanSpliceCopy int
2020-11-25 19:01:53 +08:00
}
// SniffingRequest controls the behavior of content sniffing. They are from inbound config. Read-only
2020-11-25 19:01:53 +08:00
type SniffingRequest struct {
ExcludeForDomain geodata.DomainMatcher
ExcludeForIP geodata.IPMatcher
OverrideDestinationForProtocol []string
2020-11-25 19:01:53 +08:00
Enabled bool
2021-03-06 23:39:50 -05:00
MetadataOnly bool
2021-09-16 15:05:48 +08:00
RouteOnly bool
2020-11-25 19:01:53 +08:00
}
// Content is the metadata of the connection content. Mainly used for routing.
2020-11-25 19:01:53 +08:00
type Content struct {
// Protocol of current content.
Protocol string
SniffingRequest SniffingRequest
// HTTP traffic sniffed headers
2020-11-25 19:01:53 +08:00
Attributes map[string]string
// SkipDNSResolve is set from DNS module. the DOH remote server maybe a domain name, this prevents cycle resolving dead loop
2021-10-16 21:02:51 +08:00
SkipDNSResolve bool
2020-11-25 19:01:53 +08:00
}
// Sockopt is the settings for socket connection.
type Sockopt struct {
// Mark of the socket connection.
Mark int32
}
2022-02-03 08:57:32 +08:00
// SetAttribute attaches additional string attributes to content.
2020-11-25 19:01:53 +08:00
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]
}