1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-07-26 11:44:22 -04:00
v2fly/common/environment/rootcap_impl.go
Xiaokang Wang (Shelikhoo) b1ef737d48
Add TLSMirror looks like TLS censorship resistant transport protocol as a developer preview transport (#3437)
* Add tlsmirror server processing routine

* Add tlsmirror server processing routine: generated

* Add tlsmirror server handshake capture

* it runs version~

* add draining copy for handshake

* refactor out base tls mirror connection

* tls mirror server side base

* add random field extraction

* add tls like encryption

* add tls like encryption (generated)

* add server side implementation for tlsmirror

* apply coding style: tlsmirror

* fix typo in mirrortls mirror crypto

* add client initial implementation for tls mirror

* add traffic generator implementation for tlsmirror

* add client processing of traffic generator originated traffic

* add embedded traffic generator support to mirrortls client

* override security setting of traffic generator if appropriate

* override security setting of traffic generator if appropriate

* apply request wait time for traffic generator

* add unsafe keyword required for linkname

* fix outbound manager registration for traffic ingress at tlsmirror client

* initial works at sticking packets together

* fix traffic generator's traffic goto logic

* fix get client and server random

* fix applying primary key

* fix log error handling for handshake random retrieval

* fix nonce generation and key derivation logic

* fix: add readPipe channel to client and server connection handlers

* fix: use detached context for persistent mirror TLS dialer

* fix: ensure proper closure of connections on context cancellation

* fix: proper detection of traffic generator originated connection

wait for connection ready before sending payload

* fix coding style
2025-07-03 11:33:16 +01:00

253 lines
6.2 KiB
Go

package environment
import (
"context"
"github.com/v2fly/v2ray-core/v5/common/platform/filesystem/fsifce"
"github.com/v2fly/v2ray-core/v5/features/extension/storage"
"github.com/v2fly/v2ray-core/v5/transport/internet"
"github.com/v2fly/v2ray-core/v5/transport/internet/tagged"
)
func NewRootEnvImpl(ctx context.Context, transientStorage storage.ScopedTransientStorage,
systemDialer internet.SystemDialer, systemListener internet.SystemListener,
filesystem FileSystemCapabilitySet, persistStorage storage.ScopedPersistentStorage,
) RootEnvironment {
return &rootEnvImpl{
transientStorage: transientStorage,
systemListener: systemListener,
systemDialer: systemDialer,
filesystem: filesystem,
persistStorage: persistStorage,
ctx: ctx,
}
}
type rootEnvImpl struct {
persistStorage storage.ScopedPersistentStorage
transientStorage storage.ScopedTransientStorage
systemDialer internet.SystemDialer
systemListener internet.SystemListener
filesystem FileSystemCapabilitySet
ctx context.Context
}
func (r *rootEnvImpl) doNotImpl() {
panic("placeholder doNotImpl")
}
func (r *rootEnvImpl) AppEnvironment(tag string) AppEnvironment {
transientStorage, err := r.transientStorage.NarrowScope(r.ctx, tag)
if err != nil {
return nil
}
persistStorage, err := r.persistStorage.NarrowScope(r.ctx, []byte(tag))
if err != nil {
return nil
}
return &appEnvImpl{
transientStorage: transientStorage,
persistStorage: persistStorage,
systemListener: r.systemListener,
systemDialer: r.systemDialer,
filesystem: r.filesystem,
ctx: r.ctx,
}
}
func (r *rootEnvImpl) ProxyEnvironment(tag string) ProxyEnvironment {
transientStorage, err := r.transientStorage.NarrowScope(r.ctx, tag)
if err != nil {
return nil
}
return &proxyEnvImpl{
transientStorage: transientStorage,
systemListener: r.systemListener,
systemDialer: r.systemDialer,
ctx: r.ctx,
}
}
func (r *rootEnvImpl) DropProxyEnvironment(tag string) error {
transientStorage, err := r.transientStorage.NarrowScope(r.ctx, tag)
if err != nil {
return err
}
return transientStorage.DropScope(r.ctx, tag)
}
type appEnvImpl struct {
persistStorage storage.ScopedPersistentStorage
transientStorage storage.ScopedTransientStorage
systemDialer internet.SystemDialer
systemListener internet.SystemListener
filesystem FileSystemCapabilitySet
ctx context.Context
}
func (a *appEnvImpl) RequireFeatures() interface{} {
panic("implement me")
}
func (a *appEnvImpl) RecordLog() interface{} {
panic("implement me")
}
func (a *appEnvImpl) Dialer() internet.SystemDialer {
panic("implement me")
}
func (a *appEnvImpl) Listener() internet.SystemListener {
panic("implement me")
}
func (a *appEnvImpl) OutboundDialer() tagged.DialFunc {
return internet.DialTaggedOutbound
}
func (a *appEnvImpl) OpenFileForReadSeek() fsifce.FileSeekerFunc {
return a.filesystem.OpenFileForReadSeek()
}
func (a *appEnvImpl) OpenFileForRead() fsifce.FileReaderFunc {
return a.filesystem.OpenFileForRead()
}
func (a *appEnvImpl) OpenFileForWrite() fsifce.FileWriterFunc {
return a.filesystem.OpenFileForWrite()
}
func (a *appEnvImpl) ReadDir() fsifce.FileReadDirFunc {
return a.filesystem.ReadDir()
}
func (a *appEnvImpl) RemoveFile() fsifce.FileRemoveFunc {
return a.filesystem.RemoveFile()
}
func (a *appEnvImpl) PersistentStorage() storage.ScopedPersistentStorage {
return a.persistStorage
}
func (a *appEnvImpl) TransientStorage() storage.ScopedTransientStorage {
return a.transientStorage
}
func (a *appEnvImpl) NarrowScope(key string) (AppEnvironment, error) {
transientStorage, err := a.transientStorage.NarrowScope(a.ctx, key)
if err != nil {
return nil, err
}
return &appEnvImpl{
transientStorage: transientStorage,
systemDialer: a.systemDialer,
systemListener: a.systemListener,
ctx: a.ctx,
}, nil
}
func (a *appEnvImpl) doNotImpl() {
panic("placeholder doNotImpl")
}
type proxyEnvImpl struct {
transientStorage storage.ScopedTransientStorage
systemDialer internet.SystemDialer
systemListener internet.SystemListener
ctx context.Context
}
func (p *proxyEnvImpl) RequireFeatures() interface{} {
panic("implement me")
}
func (p *proxyEnvImpl) RecordLog() interface{} {
panic("implement me")
}
func (p *proxyEnvImpl) OutboundDialer() tagged.DialFunc {
panic("implement me")
}
func (p *proxyEnvImpl) TransientStorage() storage.ScopedTransientStorage {
return p.transientStorage
}
func (p *proxyEnvImpl) NarrowScope(key string) (ProxyEnvironment, error) {
transientStorage, err := p.transientStorage.NarrowScope(p.ctx, key)
if err != nil {
return nil, err
}
return &proxyEnvImpl{
transientStorage: transientStorage,
ctx: p.ctx,
}, nil
}
func (p *proxyEnvImpl) NarrowScopeToTransport(key string) (TransportEnvironment, error) {
transientStorage, err := p.transientStorage.NarrowScope(p.ctx, key)
if err != nil {
return nil, err
}
return &transportEnvImpl{
ctx: p.ctx,
transientStorage: transientStorage,
systemDialer: p.systemDialer,
systemListener: p.systemListener,
}, nil
}
func (p *proxyEnvImpl) doNotImpl() {
panic("placeholder doNotImpl")
}
type transportEnvImpl struct {
transientStorage storage.ScopedTransientStorage
systemDialer internet.SystemDialer
systemListener internet.SystemListener
ctx context.Context
}
func (t *transportEnvImpl) RequireFeatures() interface{} {
panic("implement me")
}
func (t *transportEnvImpl) RecordLog() interface{} {
panic("implement me")
}
func (t *transportEnvImpl) Dialer() internet.SystemDialer {
return t.systemDialer
}
func (t *transportEnvImpl) Listener() internet.SystemListener {
return t.systemListener
}
func (t *transportEnvImpl) OutboundDialer() tagged.DialFunc {
return tagged.Dialer
}
func (t *transportEnvImpl) TransientStorage() storage.ScopedTransientStorage {
return t.transientStorage
}
func (t *transportEnvImpl) NarrowScope(key string) (TransportEnvironment, error) {
transientStorage, err := t.transientStorage.NarrowScope(t.ctx, key)
if err != nil {
return nil, err
}
return &transportEnvImpl{
ctx: t.ctx,
transientStorage: transientStorage,
}, nil
}
func (t *transportEnvImpl) doNotImpl() {
panic("implement me")
}