mirror of https://github.com/v2ray/v2ray-core
commit
b613a9bcb6
@ -0,0 +1,46 @@
|
|||||||
|
run:
|
||||||
|
modules-download-mode: vendor
|
||||||
|
skip-dirs:
|
||||||
|
- generated.*
|
||||||
|
- external
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- bodyclose
|
||||||
|
- deadcode
|
||||||
|
- depguard
|
||||||
|
- dogsled
|
||||||
|
- dupl
|
||||||
|
- errcheck
|
||||||
|
- exhaustive
|
||||||
|
- funlen
|
||||||
|
- gochecknoinits
|
||||||
|
- goconst
|
||||||
|
- gocritic
|
||||||
|
- gocyclo
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- golint
|
||||||
|
- gomnd
|
||||||
|
- goprintffuncname
|
||||||
|
- gosec
|
||||||
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- interfacer
|
||||||
|
- lll
|
||||||
|
- misspell
|
||||||
|
- nakedret
|
||||||
|
- noctx
|
||||||
|
- nolintlint
|
||||||
|
- rowserrcheck
|
||||||
|
- scopelint
|
||||||
|
- staticcheck
|
||||||
|
- structcheck
|
||||||
|
- stylecheck
|
||||||
|
- typecheck
|
||||||
|
- unconvert
|
||||||
|
- unparam
|
||||||
|
- unused
|
||||||
|
- varcheck
|
||||||
|
- whitespace
|
@ -1,43 +0,0 @@
|
|||||||
name: Release Docker Image
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout default branch
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install Buildx and QEMU
|
|
||||||
run: |
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
docker build --platform=local -o . git://github.com/docker/buildx
|
|
||||||
mkdir -p ~/.docker/cli-plugins
|
|
||||||
mv buildx ~/.docker/cli-plugins/docker-buildx
|
|
||||||
docker run --rm --privileged multiarch/qemu-user-static:latest --reset -p yes --credential yes
|
|
||||||
docker buildx create --use --name build --node build --driver-opt network=host
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
env:
|
|
||||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
run: |
|
|
||||||
echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
env:
|
|
||||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
DOCKER_IMAGE_PLATFORM: linux/386,linux/amd64,linux/arm/v7,linux/arm64
|
|
||||||
run: |
|
|
||||||
DOCKER_IMAGE_NAME=$(echo $DOCKER_USERNAME | tr '[:upper:]' '[:lower:]')/v2fly-core
|
|
||||||
DOCKER_IMAGE_VERSION=${GITHUB_REF#refs/*/}
|
|
||||||
docker buildx build \
|
|
||||||
--platform "$DOCKER_IMAGE_PLATFORM" \
|
|
||||||
--output "type=image,push=true" \
|
|
||||||
--tag "$DOCKER_IMAGE_NAME":"$DOCKER_IMAGE_VERSION" \
|
|
||||||
--tag "$DOCKER_IMAGE_NAME":latest \
|
|
||||||
--file ./Dockerfile .
|
|
@ -0,0 +1,40 @@
|
|||||||
|
package routing
|
||||||
|
|
||||||
|
import (
|
||||||
|
"v2ray.com/core/common/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Context is a feature to store connection information for routing.
|
||||||
|
//
|
||||||
|
// v2ray:api:beta
|
||||||
|
type Context interface {
|
||||||
|
// GetInboundTag returns the tag of the inbound the connection was from.
|
||||||
|
GetInboundTag() string
|
||||||
|
|
||||||
|
// GetSourcesIPs returns the source IPs bound to the connection.
|
||||||
|
GetSourceIPs() []net.IP
|
||||||
|
|
||||||
|
// GetSourcePort returns the source port of the connection.
|
||||||
|
GetSourcePort() net.Port
|
||||||
|
|
||||||
|
// GetTargetIPs returns the target IP of the connection or resolved IPs of target domain.
|
||||||
|
GetTargetIPs() []net.IP
|
||||||
|
|
||||||
|
// GetTargetPort returns the target port of the connection.
|
||||||
|
GetTargetPort() net.Port
|
||||||
|
|
||||||
|
// GetTargetDomain returns the target domain of the connection, if exists.
|
||||||
|
GetTargetDomain() string
|
||||||
|
|
||||||
|
// GetNetwork returns the network type of the connection.
|
||||||
|
GetNetwork() net.Network
|
||||||
|
|
||||||
|
// GetProtocol returns the protocol from the connection content, if sniffed out.
|
||||||
|
GetProtocol() string
|
||||||
|
|
||||||
|
// GetUser returns the user email from the connection content, if exists.
|
||||||
|
GetUser() string
|
||||||
|
|
||||||
|
// GetAttributes returns extra attributes from the conneciont content.
|
||||||
|
GetAttributes() map[string]interface{}
|
||||||
|
}
|
@ -0,0 +1,119 @@
|
|||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"v2ray.com/core/common/net"
|
||||||
|
"v2ray.com/core/common/session"
|
||||||
|
"v2ray.com/core/features/routing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Context is an implementation of routing.Context, which is a wrapper of context.context with session info.
|
||||||
|
type Context struct {
|
||||||
|
Inbound *session.Inbound
|
||||||
|
Outbound *session.Outbound
|
||||||
|
Content *session.Content
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInboundTag implements routing.Context.
|
||||||
|
func (ctx *Context) GetInboundTag() string {
|
||||||
|
if ctx.Inbound == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ctx.Inbound.Tag
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSourceIPs implements routing.Context.
|
||||||
|
func (ctx *Context) GetSourceIPs() []net.IP {
|
||||||
|
if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
dest := ctx.Inbound.Source
|
||||||
|
if dest.Address.Family().IsDomain() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return []net.IP{dest.Address.IP()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSourcePort implements routing.Context.
|
||||||
|
func (ctx *Context) GetSourcePort() net.Port {
|
||||||
|
if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return ctx.Inbound.Source.Port
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTargetIPs implements routing.Context.
|
||||||
|
func (ctx *Context) GetTargetIPs() []net.IP {
|
||||||
|
if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if ctx.Outbound.Target.Address.Family().IsIP() {
|
||||||
|
return []net.IP{ctx.Outbound.Target.Address.IP()}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTargetPort implements routing.Context.
|
||||||
|
func (ctx *Context) GetTargetPort() net.Port {
|
||||||
|
if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return ctx.Outbound.Target.Port
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTargetDomain implements routing.Context.
|
||||||
|
func (ctx *Context) GetTargetDomain() string {
|
||||||
|
if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
dest := ctx.Outbound.Target
|
||||||
|
if !dest.Address.Family().IsDomain() {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return dest.Address.Domain()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetNetwork implements routing.Context.
|
||||||
|
func (ctx *Context) GetNetwork() net.Network {
|
||||||
|
if ctx.Outbound == nil {
|
||||||
|
return net.Network_Unknown
|
||||||
|
}
|
||||||
|
return ctx.Outbound.Target.Network
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetProtocol implements routing.Context.
|
||||||
|
func (ctx *Context) GetProtocol() string {
|
||||||
|
if ctx.Content == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ctx.Content.Protocol
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUser implements routing.Context.
|
||||||
|
func (ctx *Context) GetUser() string {
|
||||||
|
if ctx.Inbound == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ctx.Inbound.User.Email
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAttributes implements routing.Context.
|
||||||
|
func (ctx *Context) GetAttributes() map[string]interface{} {
|
||||||
|
if ctx.Content == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return ctx.Content.Attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsRoutingContext creates a context from context.context with session info.
|
||||||
|
func AsRoutingContext(ctx context.Context) routing.Context {
|
||||||
|
return &Context{
|
||||||
|
Inbound: session.InboundFromContext(ctx),
|
||||||
|
Outbound: session.OutboundFromContext(ctx),
|
||||||
|
Content: session.ContentFromContext(ctx),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue