├── .github ├── ISSUE_TEMPLATE.md ├── ISSUE_TEMPLATE │ ├── bug_cn.md │ ├── bug_en.md │ └── other_en.md ├── update_dependencies.sh └── workflows │ └── release.yml ├── .gitignore ├── LICENSE ├── LICENSE.upstream.txt ├── README.md ├── SECURITY.md ├── annotations.go ├── app ├── app.go ├── browserforwarder │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ └── forwarder.go ├── commander │ ├── commander.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── outbound.go │ └── service.go ├── dispatcher │ ├── config.pb.go │ ├── config.proto │ ├── default.go │ ├── dispatcher.go │ ├── errors.generated.go │ ├── raw.go │ ├── sniffer.go │ ├── stats.go │ ├── stats_test.go │ └── system.go ├── dns │ ├── config.pb.go │ ├── config.proto │ ├── dispatcher.go │ ├── dns.go │ ├── errors.generated.go │ ├── hosts.go │ ├── legacy.go │ ├── transport_https.go │ ├── transport_quic.go │ ├── transport_tcp.go │ ├── transport_tls.go │ └── transport_udp.go ├── instman │ ├── command │ │ ├── command.go │ │ ├── command.pb.go │ │ ├── command.proto │ │ └── command_grpc.pb.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ └── instman.go ├── log │ ├── command │ │ ├── command.go │ │ ├── command_test.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── config_grpc.pb.go │ │ └── errors.generated.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── log.go │ ├── log_creator.go │ └── log_test.go ├── observatory │ ├── burst │ │ ├── burst.go │ │ ├── burstobserver.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ ├── healthping.go │ │ ├── healthping_result.go │ │ ├── healthping_result_test.go │ │ └── ping.go │ ├── command │ │ ├── command.go │ │ ├── command.pb.go │ │ ├── command.proto │ │ ├── command_grpc.pb.go │ │ └── errors.generated.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── explainErrors.go │ ├── multiobservatory │ │ ├── config.pb.go │ │ ├── config.proto │ │ └── multi.go │ ├── observatory.go │ ├── observer.go │ └── persist.go ├── policy │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── manager.go │ ├── manager_test.go │ └── policy.go ├── proxyman │ ├── command │ │ ├── command.go │ │ ├── command.pb.go │ │ ├── command.proto │ │ ├── command_grpc.pb.go │ │ ├── doc.go │ │ └── errors.generated.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── inbound │ │ ├── always.go │ │ ├── dynamic.go │ │ ├── errors.generated.go │ │ ├── inbound.go │ │ └── worker.go │ └── outbound │ │ ├── errors.generated.go │ │ ├── handler.go │ │ ├── handler_test.go │ │ └── outbound.go ├── restfulapi │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── restful_api.go │ ├── service.go │ └── service_test.go ├── reverse │ ├── bridge.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── portal.go │ ├── portal_test.go │ └── reverse.go ├── router │ ├── balancing.go │ ├── balancing_override.go │ ├── command │ │ ├── command.go │ │ ├── command.pb.go │ │ ├── command.proto │ │ ├── command_grpc.pb.go │ │ ├── command_test.go │ │ ├── config.go │ │ └── errors.generated.go │ ├── condition.go │ ├── condition_geoip.go │ ├── condition_geoip_test.go │ ├── condition_test.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── router.go │ ├── router_test.go │ ├── routercommon │ │ ├── common.pb.go │ │ └── common.proto │ ├── strategy_leastload.go │ ├── strategy_leastload_test.go │ ├── strategy_leastping.go │ ├── strategy_random.go │ ├── weight.go │ └── weight_test.go └── stats │ ├── channel.go │ ├── channel_test.go │ ├── command │ ├── command.go │ ├── command.pb.go │ ├── command.proto │ ├── command_grpc.pb.go │ ├── command_test.go │ └── errors.generated.go │ ├── config.pb.go │ ├── config.proto │ ├── counter.go │ ├── counter_test.go │ ├── errors.generated.go │ ├── stats.go │ └── stats_test.go ├── common ├── antireplay │ ├── antireplay.go │ ├── bloomring.go │ └── replayfilter.go ├── bitmask │ ├── byte.go │ └── byte_test.go ├── buf │ ├── buf.go │ ├── buffer.go │ ├── buffer_test.go │ ├── connection.go │ ├── copy.go │ ├── copy_test.go │ ├── data │ │ └── test_MultiBufferReadAllToByte.dat │ ├── erasure.go │ ├── errors.generated.go │ ├── io.go │ ├── io_test.go │ ├── multi_buffer.go │ ├── multi_buffer_test.go │ ├── reader.go │ ├── reader_test.go │ ├── readv_posix.go │ ├── readv_reader.go │ ├── readv_reader_wasm.go │ ├── readv_test.go │ ├── readv_unix.go │ ├── readv_windows.go │ ├── writer.go │ └── writer_test.go ├── bytesgrp │ ├── bytes.go │ └── bytes_test.go ├── bytespool │ └── pool.go ├── cache │ ├── lru.go │ └── lru_test.go ├── cmdarg │ ├── arg.go │ ├── cmdarg.go │ └── errors.generated.go ├── common.go ├── common_test.go ├── cond.go ├── crypto │ ├── aes.go │ ├── auth.go │ ├── auth_test.go │ ├── benchmark_test.go │ ├── chacha20.go │ ├── chacha20_test.go │ ├── chunk.go │ ├── chunk_test.go │ ├── crypto.go │ ├── errors.generated.go │ ├── internal │ │ ├── chacha.go │ │ ├── chacha_core.generated.go │ │ └── chacha_core_gen.go │ ├── io.go │ └── salsa20.go ├── dice │ ├── dice.go │ └── dice_test.go ├── drain │ ├── drain.go │ ├── drainer.go │ └── errors.generated.go ├── environment │ ├── app.go │ ├── base.go │ ├── connection.go │ ├── envctx │ │ └── env.go │ ├── envimpl │ │ └── fs.go │ ├── filesystemcap │ │ └── fscap.go │ ├── proxy.go │ ├── rootcap.go │ ├── rootcap_impl.go │ ├── transientstorageimpl │ │ ├── errors.generated.go │ │ └── storage.go │ └── transport.go ├── errors.generated.go ├── errors │ ├── errorgen │ │ └── main.go │ ├── errors.go │ ├── errors_test.go │ └── multi_error.go ├── interfaces.go ├── log │ ├── access.go │ ├── log.go │ ├── log.pb.go │ ├── log.proto │ ├── log_test.go │ ├── logger.go │ └── logger_test.go ├── mux │ ├── client.go │ ├── client_test.go │ ├── endpoint.go │ ├── errors.generated.go │ ├── frame.go │ ├── frame_test.go │ ├── mux.go │ ├── mux_test.go │ ├── reader.go │ ├── server.go │ ├── session.go │ ├── session_test.go │ └── writer.go ├── net │ ├── address.go │ ├── address.pb.go │ ├── address.proto │ ├── address_test.go │ ├── destination.go │ ├── destination.pb.go │ ├── destination.proto │ ├── destination_test.go │ ├── errors.generated.go │ ├── net.go │ ├── network.go │ ├── network.pb.go │ ├── network.proto │ ├── packetaddr │ │ ├── bufio.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── connection_adaptor.go │ │ ├── errors.generated.go │ │ ├── packetaddr.go │ │ ├── packetaddr_test.go │ │ └── special_address.go │ ├── pingproto │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ ├── manager.go │ │ └── pingproto.go │ ├── pool.go │ ├── port.go │ ├── port.pb.go │ ├── port.proto │ ├── port_test.go │ ├── system.go │ ├── udpovertcp │ │ ├── bufio.go │ │ ├── conn.go │ │ ├── conn_test.go │ │ ├── errors.generated.go │ │ └── udpovertcp.go │ ├── uid.pb.go │ └── uid.proto ├── ocsp │ ├── errors.generated.go │ └── ocsp.go ├── peer │ ├── latency.go │ └── peer.go ├── platform │ ├── ctlcmd │ │ └── attr_other.go │ ├── filesystem │ │ ├── file.go │ │ └── fsifce │ │ │ └── ifce.go │ ├── others.go │ ├── platform.go │ ├── platform_test.go │ └── windows.go ├── protocol │ ├── account.go │ ├── address.go │ ├── address_test.go │ ├── bittorrent │ │ └── bittorrent.go │ ├── context.go │ ├── dns │ │ ├── errors.generated.go │ │ ├── io.go │ │ └── sniffer.go │ ├── errors.generated.go │ ├── headers.go │ ├── headers.pb.go │ ├── headers.proto │ ├── http │ │ ├── headers.go │ │ ├── headers_test.go │ │ ├── sniff.go │ │ └── sniff_test.go │ ├── id.go │ ├── id_test.go │ ├── payload.go │ ├── protocol.go │ ├── quic │ │ ├── sniff.go │ │ └── sniff_test.go │ ├── server_picker.go │ ├── server_picker_test.go │ ├── server_spec.go │ ├── server_spec.pb.go │ ├── server_spec.proto │ ├── server_spec_test.go │ ├── time.go │ ├── time_test.go │ ├── tls │ │ ├── cert │ │ │ ├── .gitignore │ │ │ ├── cert.go │ │ │ ├── cert_test.go │ │ │ ├── errors.generated.go │ │ │ └── privateKey.go │ │ ├── sniff.go │ │ └── sniff_test.go │ ├── udp │ │ ├── packet.go │ │ └── udp.go │ ├── user.go │ ├── user.pb.go │ └── user.proto ├── protoext │ ├── errors.generated.go │ ├── extensions.go │ ├── extensions.pb.go │ ├── extensions.proto │ └── testing │ │ ├── extension_test.go │ │ ├── test.pb.go │ │ └── test.proto ├── protofilter │ ├── errors.generated.go │ └── filter.go ├── registry │ ├── errors.generated.go │ ├── implementation_set.go │ └── registry.go ├── retry │ ├── errors.generated.go │ ├── retry.go │ └── retry_test.go ├── serial │ ├── resolver.go │ ├── serial.go │ ├── serial_test.go │ ├── string.go │ ├── string_test.go │ ├── typed_message.go │ └── typed_message_test.go ├── session │ ├── context.go │ └── session.go ├── signal │ ├── done │ │ └── done.go │ ├── notifier.go │ ├── notifier_test.go │ ├── pubsub │ │ ├── pubsub.go │ │ └── pubsub_test.go │ ├── semaphore │ │ └── semaphore.go │ ├── timer.go │ └── timer_test.go ├── strmatcher │ ├── benchmark_test.go │ ├── indexmatcher_linear.go │ ├── indexmatcher_linear_test.go │ ├── indexmatcher_mixed.go │ ├── indexmatcher_mixed_test.go │ ├── indexmatcher_mph.go │ ├── matchergroup_ac_automation.go │ ├── matchergroup_ac_automation_test.go │ ├── matchergroup_domain.go │ ├── matchergroup_domain_test.go │ ├── matchergroup_full.go │ ├── matchergroup_full_test.go │ ├── matchergroup_mph.go │ ├── matchergroup_mph_test.go │ ├── matchergroup_simple.go │ ├── matchergroup_simple_test.go │ ├── matchergroup_substr.go │ ├── matchergroup_substr_test.go │ ├── matchers.go │ ├── matchers_test.go │ └── strmatcher.go ├── taggedfeatures │ ├── configloader.go │ ├── creator.go │ ├── errors.generated.go │ ├── holder.go │ ├── skeleton.pb.go │ ├── skeleton.proto │ └── taggedfeatures.go ├── task │ ├── common.go │ ├── periodic.go │ ├── periodic_test.go │ ├── task.go │ └── task_test.go ├── type.go ├── type_test.go ├── units │ ├── bytesize.go │ └── bytesize_test.go ├── uuid │ ├── uuid.go │ └── uuid_test.go └── xudp │ └── xudp.go ├── config.go ├── config.pb.go ├── config.proto ├── context.go ├── context_test.go ├── core.go ├── errors.generated.go ├── features ├── dns │ ├── client.go │ ├── config.pb.go │ ├── config.proto │ ├── dns_new.go │ └── localdns │ │ ├── client.go │ │ └── transport.go ├── errors.generated.go ├── extension │ ├── browser.go │ ├── contextreceiver.go │ ├── instance.go │ ├── observatory.go │ ├── storage.go │ └── storage │ │ └── storage.go ├── feature.go ├── inbound │ └── inbound.go ├── outbound │ └── outbound.go ├── ping │ └── manager.go ├── policy │ ├── default.go │ └── policy.go ├── routing │ ├── balancer.go │ ├── context.go │ ├── dispatcher.go │ ├── dns │ │ ├── context.go │ │ └── errors.generated.go │ ├── router.go │ └── session │ │ └── context.go └── stats │ ├── errors.generated.go │ └── stats.go ├── format.go ├── functions.go ├── functions_test.go ├── go.mod ├── go.sum ├── infra ├── conf │ ├── cfgcommon │ │ ├── buildable.go │ │ ├── common.go │ │ ├── common_test.go │ │ ├── duration │ │ │ ├── duration.go │ │ │ └── duration_test.go │ │ ├── errors.generated.go │ │ ├── loader │ │ │ ├── errors.generated.go │ │ │ └── loader.go │ │ ├── muxcfg │ │ │ └── mux.go │ │ ├── proxycfg │ │ │ ├── errors.generated.go │ │ │ └── proxy.go │ │ ├── session.go │ │ ├── sniffer │ │ │ ├── errors.generated.go │ │ │ └── sniffer.go │ │ ├── socketcfg │ │ │ └── socket.go │ │ ├── testassist │ │ │ └── general.go │ │ └── tlscfg │ │ │ ├── errors.generated.go │ │ │ ├── tls.go │ │ │ └── xtls.go │ ├── geodata │ │ ├── attr.go │ │ ├── errors.generated.go │ │ ├── geodata.go │ │ ├── geodata_test.go │ │ ├── geodataproto.go │ │ ├── memconservative │ │ │ ├── cache.go │ │ │ ├── decode.go │ │ │ ├── decode_test.go │ │ │ ├── errors.generated.go │ │ │ └── memc.go │ │ └── standard │ │ │ ├── errors.generated.go │ │ │ └── standard.go │ ├── json │ │ ├── reader.go │ │ └── reader_test.go │ ├── jsonpb │ │ ├── errors.generated.go │ │ └── jsonpb.go │ ├── merge │ │ ├── errors.generated.go │ │ ├── map.go │ │ ├── merge.go │ │ ├── merge_test.go │ │ ├── priority.go │ │ ├── rules.go │ │ └── tag.go │ ├── mergers │ │ ├── errors.generated.go │ │ ├── extensions.go │ │ ├── merge.go │ │ ├── merger_base.go │ │ ├── mergers.go │ │ └── names.go │ ├── rule │ │ ├── errors.generated.go │ │ ├── rule.go │ │ └── rule_test.go │ ├── serial │ │ ├── errors.generated.go │ │ ├── loader.go │ │ ├── loader_test.go │ │ └── serial.go │ ├── synthetic │ │ ├── dns │ │ │ ├── dns.go │ │ │ ├── dns_test.go │ │ │ └── errors.generated.go │ │ ├── log │ │ │ └── log.go │ │ └── router │ │ │ ├── errors.generated.go │ │ │ ├── router.go │ │ │ ├── router_strategy.go │ │ │ └── router_test.go │ ├── v2jsonpb │ │ ├── any2.go │ │ ├── errors.generated.go │ │ ├── follower.go │ │ ├── followerany.go │ │ ├── followerlist.go │ │ ├── followermap.go │ │ └── v2jsonpb.go │ ├── v4 │ │ ├── api.go │ │ ├── blackhole.go │ │ ├── blackhole_test.go │ │ ├── browser_forwarder.go │ │ ├── conf.go │ │ ├── dns_proxy.go │ │ ├── dns_proxy_test.go │ │ ├── dokodemo.go │ │ ├── dokodemo_test.go │ │ ├── errors.generated.go │ │ ├── freedom.go │ │ ├── freedom_test.go │ │ ├── gun.go │ │ ├── http.go │ │ ├── http_test.go │ │ ├── lint.go │ │ ├── loopback.go │ │ ├── observatory.go │ │ ├── ping.go │ │ ├── policy.go │ │ ├── policy_test.go │ │ ├── reverse.go │ │ ├── reverse_test.go │ │ ├── services.go │ │ ├── shadowsocks.go │ │ ├── shadowsocks_test.go │ │ ├── socks.go │ │ ├── socks_test.go │ │ ├── ssh.go │ │ ├── transport.go │ │ ├── transport_authenticators.go │ │ ├── transport_internet.go │ │ ├── transport_test.go │ │ ├── trojan.go │ │ ├── trojan_sing.go │ │ ├── v2ray.go │ │ ├── v2ray_test.go │ │ ├── vless.go │ │ ├── vless_test.go │ │ ├── vliteu.go │ │ ├── vmess.go │ │ ├── vmess_test.go │ │ └── wireguard.go │ └── v5cfg │ │ ├── common.go │ │ ├── errors.generated.go │ │ ├── inbound.go │ │ ├── init.go │ │ ├── outbound.go │ │ ├── root.go │ │ ├── skeleton.go │ │ ├── stream.go │ │ └── v5cfg.go ├── vformat │ └── main.go └── vprotogen │ └── main.go ├── main ├── commands │ ├── all │ │ ├── api │ │ │ ├── api.go │ │ │ ├── balancer_info.go │ │ │ ├── balancer_override.go │ │ │ ├── jsonv4 │ │ │ │ ├── inbounds_add.go │ │ │ │ ├── inbounds_remove.go │ │ │ │ ├── init.go │ │ │ │ ├── outbounds_add.go │ │ │ │ └── outbounds_remove.go │ │ │ ├── log.go │ │ │ ├── shared.go │ │ │ └── stats.go │ │ ├── commands.go │ │ ├── engineering │ │ │ ├── convertpb.go │ │ │ ├── engineering.go │ │ │ ├── errors.generated.go │ │ │ └── reversepb.go │ │ ├── errors.generated.go │ │ ├── format_doc.go │ │ ├── jsonv4 │ │ │ ├── convert.go │ │ │ └── init.go │ │ ├── love.go │ │ ├── merge_doc.go │ │ ├── tls │ │ │ ├── cert.go │ │ │ ├── ping.go │ │ │ └── tls.go │ │ ├── uuid.go │ │ └── verify.go │ ├── base │ │ ├── command.go │ │ ├── env.go │ │ ├── execute.go │ │ ├── help.go │ │ └── root.go │ ├── errors.generated.go │ ├── helpers │ │ ├── config_load.go │ │ └── fs.go │ ├── run.go │ ├── test.go │ └── version.go ├── distro │ ├── all │ │ └── all.go │ ├── debug │ │ └── debug.go │ └── minimal │ │ └── minimal.go ├── errors.generated.go ├── formats │ ├── errors.generated.go │ └── formats.go ├── main.go ├── main_test.go └── v2binding │ ├── v2api │ └── api.go │ └── v2binding.go ├── mocks.go ├── proto.go ├── proxy ├── blackhole │ ├── blackhole.go │ ├── blackhole_test.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── config_test.go │ └── errors.generated.go ├── dns │ ├── config.pb.go │ ├── config.proto │ ├── dns.go │ ├── dns_test.go │ └── errors.generated.go ├── dokodemo │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── dokodemo.go │ └── errors.generated.go ├── freedom │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ └── freedom.go ├── http │ ├── client.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── http.go │ ├── server.go │ └── simplified │ │ ├── config.go │ │ ├── config.pb.go │ │ └── config.proto ├── loopback │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ └── loopback.go ├── proxy.go ├── shadowsocks │ ├── client.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── config_test.go │ ├── errors.generated.go │ ├── plugin.go │ ├── plugin │ │ ├── external │ │ │ ├── errors.generated.go │ │ │ ├── log.go │ │ │ └── plugin.go │ │ └── self │ │ │ ├── args.go │ │ │ ├── errors.generated.go │ │ │ └── plugin.go │ ├── protocol.go │ ├── protocol_test.go │ ├── server.go │ ├── shadowsocks.go │ ├── simplified │ │ ├── config.go │ │ ├── config.pb.go │ │ └── config.proto │ └── spec_2022.go ├── shadowsocks_sing │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── outbound.go │ └── shadowsocks_sing.go ├── socks │ ├── client.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── protocol.go │ ├── protocol_test.go │ ├── server.go │ ├── simplified │ │ ├── config.go │ │ ├── config.pb.go │ │ └── config.proto │ └── socks.go ├── ssh │ ├── client.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ └── ssh.go ├── trojan │ ├── client.go │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── protocol.go │ ├── protocol_test.go │ ├── server.go │ ├── simplified │ │ ├── config.go │ │ ├── config.pb.go │ │ └── config.proto │ ├── trojan.go │ └── validator.go ├── trojan_sing │ ├── config.pb.go │ ├── config.proto │ ├── errors.generated.go │ ├── outbound.go │ └── trojan_sing.go ├── vless │ ├── account.go │ ├── account.pb.go │ ├── account.proto │ ├── encoding │ │ ├── addons.go │ │ ├── addons.pb.go │ │ ├── addons.proto │ │ ├── encoding.go │ │ ├── encoding_test.go │ │ └── errors.generated.go │ ├── errors.generated.go │ ├── inbound │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ └── inbound.go │ ├── outbound │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ └── outbound.go │ ├── validator.go │ └── vless.go ├── vlite │ ├── inbound │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── connAdp.go │ │ ├── errors.generated.go │ │ └── inbound.go │ ├── outbound │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ └── outbound.go │ └── vlite.go ├── vmess │ ├── account.go │ ├── account.pb.go │ ├── account.proto │ ├── aead │ │ ├── authid.go │ │ ├── authid_test.go │ │ ├── consts.go │ │ ├── encrypt.go │ │ ├── encrypt_test.go │ │ ├── kdf.go │ │ └── kdf_test.go │ ├── encoding │ │ ├── auth.go │ │ ├── auth_test.go │ │ ├── client.go │ │ ├── commands.go │ │ ├── commands_test.go │ │ ├── encoding.go │ │ ├── encoding_test.go │ │ ├── errors.generated.go │ │ └── server.go │ ├── errors.generated.go │ ├── inbound │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ └── inbound.go │ ├── outbound │ │ ├── command.go │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── errors.generated.go │ │ └── outbound.go │ ├── validator.go │ ├── validator_test.go │ ├── vmess.go │ └── vmessCtxInterface.go └── wireguard │ ├── client.go │ ├── config.pb.go │ ├── config.proto │ ├── device.go │ ├── endpoint.go │ ├── errors.generated.go │ ├── icmp.go │ └── wireguard.go ├── release ├── config │ ├── config.json │ ├── systemd │ │ └── system │ │ │ ├── v2ray.service │ │ │ └── v2ray@.service │ ├── vpoint_socks_vmess.json │ └── vpoint_vmess_freedom.json ├── debian │ ├── changelog │ ├── control │ ├── copyright │ ├── rules │ ├── source │ │ └── format │ ├── v2ray-docs.docs │ ├── v2ray-domain-list-community.install │ ├── v2ray-geoip-only-cn-private.install │ ├── v2ray-geoip.install │ ├── v2ray.install │ ├── v2ray.service │ └── v2ray@.service ├── extra │ └── browserforwarder │ │ ├── index.html │ │ └── index.js ├── friendly-filenames.json ├── install-release.sh ├── requestsign.sh └── user-package.sh ├── testing ├── mocks │ ├── dns.go │ ├── io.go │ ├── log.go │ ├── mux.go │ ├── outbound.go │ └── proxy.go ├── scenarios │ ├── command_test.go │ ├── common.go │ ├── common_coverage.go │ ├── common_regular.go │ ├── dns_test.go │ ├── dokodemo_test.go │ ├── feature_test.go │ ├── grpc_test.go │ ├── http_test.go │ ├── policy_test.go │ ├── reverse_test.go │ ├── shadowsocks_2022_test.go │ ├── shadowsocks_test.go │ ├── socks_test.go │ ├── tls_test.go │ ├── transport_test.go │ └── vmess_test.go └── servers │ ├── http │ └── http.go │ ├── tcp │ ├── port.go │ └── tcp.go │ └── udp │ ├── port.go │ └── udp.go ├── transport ├── config.go ├── config.pb.go ├── config.proto ├── internet │ ├── config.go │ ├── config.pb.go │ ├── config.proto │ ├── connection.go │ ├── dialer.go │ ├── dialer_test.go │ ├── domainsocket │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── dial.go │ │ ├── errgen.go │ │ ├── errors.generated.go │ │ ├── listener.go │ │ └── listener_test.go │ ├── errors.generated.go │ ├── filelocker.go │ ├── filelocker_other.go │ ├── filelocker_windows.go │ ├── grpc │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── dial.go │ │ ├── encoding │ │ │ ├── conn.go │ │ │ ├── customSeviceName.go │ │ │ ├── encoding.go │ │ │ ├── errors.generated.go │ │ │ ├── multi.go │ │ │ ├── raw.go │ │ │ ├── stream.pb.go │ │ │ ├── stream.proto │ │ │ └── stream_grpc.pb.go │ │ ├── errors.generated.go │ │ ├── grpc.go │ │ └── hub.go │ ├── header.go │ ├── header_test.go │ ├── headers │ │ ├── http │ │ │ ├── config.go │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ ├── errors.generated.go │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── linkedreadRequest.go │ │ │ └── resp.go │ │ ├── noop │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ └── noop.go │ │ ├── srtp │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ ├── srtp.go │ │ │ └── srtp_test.go │ │ ├── tls │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ ├── dtls.go │ │ │ └── dtls_test.go │ │ ├── utp │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ ├── utp.go │ │ │ └── utp_test.go │ │ ├── wechat │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ ├── wechat.go │ │ │ └── wechat_test.go │ │ └── wireguard │ │ │ ├── config.pb.go │ │ │ ├── config.proto │ │ │ └── wireguard.go │ ├── http │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── dialer.go │ │ ├── errors.generated.go │ │ ├── http.go │ │ ├── http_test.go │ │ └── hub.go │ ├── internet.go │ ├── kcp │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── connection.go │ │ ├── connection_test.go │ │ ├── crypt.go │ │ ├── crypt_test.go │ │ ├── cryptreal.go │ │ ├── dialer.go │ │ ├── errors.generated.go │ │ ├── io.go │ │ ├── io_test.go │ │ ├── kcp.go │ │ ├── kcp_test.go │ │ ├── listener.go │ │ ├── output.go │ │ ├── receiving.go │ │ ├── segment.go │ │ ├── segment_test.go │ │ ├── sending.go │ │ ├── xor.go │ │ ├── xor_amd64.go │ │ └── xor_amd64.s │ ├── memory_settings.go │ ├── quic │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── conn.go │ │ ├── dialer.go │ │ ├── errors.generated.go │ │ ├── hub.go │ │ ├── pool.go │ │ ├── quic.go │ │ └── quic_test.go │ ├── sockopt.go │ ├── sockopt_darwin.go │ ├── sockopt_freebsd.go │ ├── sockopt_linux.go │ ├── sockopt_linux_test.go │ ├── sockopt_other.go │ ├── sockopt_test.go │ ├── sockopt_windows.go │ ├── system_dialer.go │ ├── system_dns_android.go │ ├── system_dns_android_test.go │ ├── system_listener.go │ ├── system_listener_test.go │ ├── tagged │ │ ├── tagged.go │ │ └── taggedimpl │ │ │ ├── errors.generated.go │ │ │ ├── impl.go │ │ │ └── taggedimpl.go │ ├── tcp │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── dialer.go │ │ ├── errors.generated.go │ │ ├── hub.go │ │ ├── sockopt_freebsd.go │ │ ├── sockopt_linux.go │ │ ├── sockopt_linux_test.go │ │ ├── sockopt_other.go │ │ └── tcp.go │ ├── tcp_hub.go │ ├── tls │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── config_other.go │ │ ├── config_test.go │ │ ├── config_windows.go │ │ ├── errors.generated.go │ │ ├── pin.go │ │ ├── pin_test.go │ │ └── tls.go │ ├── udp │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── copy.go │ │ ├── dialer.go │ │ ├── dispatcher.go │ │ ├── dispatcher_packetaddr.go │ │ ├── dispatcher_split.go │ │ ├── dispatcher_split_test.go │ │ ├── errors.generated.go │ │ ├── hub.go │ │ ├── hub_freebsd.go │ │ ├── hub_linux.go │ │ ├── hub_other.go │ │ └── udp.go │ ├── websocket │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── connection.go │ │ ├── connforwarder.go │ │ ├── dialer.go │ │ ├── errors.generated.go │ │ ├── hub.go │ │ ├── ws.go │ │ └── ws_test.go │ └── xtls │ │ ├── config.go │ │ ├── config.pb.go │ │ ├── config.proto │ │ ├── config_other.go │ │ ├── config_test.go │ │ ├── config_windows.go │ │ ├── errors.generated.go │ │ ├── unsafe.go │ │ └── xtls.go ├── link.go └── pipe │ ├── impl.go │ ├── interface.go │ ├── pipe.go │ ├── pipe_test.go │ ├── reader.go │ └── writer.go ├── v2ray.go └── v2ray_test.go /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用[Discussion](https://github.com/v2fly/discussion/issues)进行讨论。 2 | 3 | 此 Issue 会被立即关闭。 4 | 5 | If you are not sure if your question is truely a bug in V2Ray, please discuss it [here](https://github.com/v2fly/discussion/issues) first. 6 | 7 | This issue will be closed immediately. 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/other_en.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Other 3 | about: "其它问题请使用 https://github.com/v2fly/v2ray-core/discussions 进行讨论 / Please discuss other issues at https://github.com/v2fly/v2ray-core/discussions" 4 | --- 5 | 6 | 如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用[Discussion](https://github.com/v2fly/v2ray-core/discussions)进行讨论。 7 | 8 | 此 Issue 会被立即关闭。 9 | 10 | If you are not sure if your question is truely a bug in V2Ray, please discuss it [here](https://github.com/v2fly/v2ray-core/discussions) first. 11 | 12 | This issue will be closed immediately. 13 | -------------------------------------------------------------------------------- /.github/update_dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PROJECTS=$(dirname "$0")/../.. 4 | 5 | go get -x github.com/sagernet/sing@$(git -C $PROJECTS/sing rev-parse HEAD) 6 | go get -x github.com/sagernet/sing-shadowsocks@$(git -C $PROJECTS/sing-shadowsocks rev-parse HEAD) 7 | go mod tidy 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | 17 | *.DS_Store 18 | .idea 19 | *.zip 20 | *.tar.gz 21 | v2ray 22 | v2ctl 23 | mockgen 24 | vprotogen 25 | !infra/vprotogen/ 26 | errorgen 27 | !common/errors/errorgen/ 28 | *.dat 29 | *.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-2022 V2Fly Community 2 | Copyright (C) 2021 by nekohasekai 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . -------------------------------------------------------------------------------- /annotations.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | // Annotation is a concept in V2Ray. This struct is only for documentation. It is not used anywhere. 4 | // Annotations begin with "v2ray:" in comment, as metadata of functions or types. 5 | type Annotation struct { 6 | // API is for types or functions that can be used in other libs. Possible values are: 7 | // 8 | // * v2ray:api:beta for types or functions that are ready for use, but maybe changed in the future. 9 | // * v2ray:api:stable for types or functions with guarantee of backward compatibility. 10 | // * v2ray:api:deprecated for types or functions that should not be used anymore. 11 | // 12 | // Types or functions without api annotation should not be used externally. 13 | API string 14 | } 15 | -------------------------------------------------------------------------------- /app/app.go: -------------------------------------------------------------------------------- 1 | // Package app contains feature implementations of V2Ray. The features may be enabled during runtime. 2 | package app 3 | -------------------------------------------------------------------------------- /app/browserforwarder/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.browserforwarder; 4 | 5 | option csharp_namespace = "V2Ray.Core.App.Browserforwarder"; 6 | option go_package = "github.com/v2fly/v2ray-core/v5/app/browserforwarder"; 7 | option java_package = "com.v2ray.core.app.browserforwarder"; 8 | option java_multiple_files = true; 9 | 10 | import "common/protoext/extensions.proto"; 11 | 12 | // Config is the settings for BrowserForwarder. 13 | message Config { 14 | option (v2ray.core.common.protoext.message_opt).type = "service"; 15 | option (v2ray.core.common.protoext.message_opt).short_name = "browser"; 16 | 17 | string listen_addr = 1; 18 | int32 listen_port = 2; 19 | } -------------------------------------------------------------------------------- /app/browserforwarder/errors.generated.go: -------------------------------------------------------------------------------- 1 | package browserforwarder 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/commander/errors.generated.go: -------------------------------------------------------------------------------- 1 | package commander 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/commander/service.go: -------------------------------------------------------------------------------- 1 | package commander 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | "google.golang.org/grpc" 8 | "google.golang.org/grpc/reflection" 9 | ) 10 | 11 | // Service is a Commander service. 12 | type Service interface { 13 | // Register registers the service itself to a gRPC server. 14 | Register(*grpc.Server) 15 | } 16 | 17 | type reflectionService struct{} 18 | 19 | func (r reflectionService) Register(s *grpc.Server) { 20 | reflection.Register(s) 21 | } 22 | 23 | func init() { 24 | common.Must(common.RegisterConfig((*ReflectionConfig)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { 25 | return reflectionService{}, nil 26 | })) 27 | } 28 | -------------------------------------------------------------------------------- /app/dispatcher/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.dispatcher; 4 | option csharp_namespace = "V2Ray.Core.App.Dispatcher"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/dispatcher"; 6 | option java_package = "com.v2ray.core.app.dispatcher"; 7 | option java_multiple_files = true; 8 | 9 | message SessionConfig { 10 | reserved 1; 11 | } 12 | 13 | message Config { 14 | SessionConfig settings = 1; 15 | } 16 | -------------------------------------------------------------------------------- /app/dispatcher/dispatcher.go: -------------------------------------------------------------------------------- 1 | package dispatcher 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /app/dispatcher/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dispatcher 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/dispatcher/stats.go: -------------------------------------------------------------------------------- 1 | package dispatcher 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/common/buf" 6 | "github.com/v2fly/v2ray-core/v5/features/stats" 7 | ) 8 | 9 | type SizeStatWriter struct { 10 | Counter stats.Counter 11 | Writer buf.Writer 12 | } 13 | 14 | func (w *SizeStatWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { 15 | w.Counter.Add(int64(mb.Len())) 16 | return w.Writer.WriteMultiBuffer(mb) 17 | } 18 | 19 | func (w *SizeStatWriter) Close() error { 20 | return common.Close(w.Writer) 21 | } 22 | 23 | func (w *SizeStatWriter) Interrupt() { 24 | common.Interrupt(w.Writer) 25 | } 26 | -------------------------------------------------------------------------------- /app/dns/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/instman/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.instman; 4 | option csharp_namespace = "V2Ray.Core.App.Instman"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/instman"; 6 | option java_package = "com.v2ray.core.app.instman"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message Config { 12 | option (v2ray.core.common.protoext.message_opt).type = "service"; 13 | option (v2ray.core.common.protoext.message_opt).short_name = "instman"; 14 | } -------------------------------------------------------------------------------- /app/instman/errors.generated.go: -------------------------------------------------------------------------------- 1 | package instman 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/log/command/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.log.command; 4 | option csharp_namespace = "V2Ray.Core.App.Log.Command"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/log/command"; 6 | option java_package = "com.v2ray.core.app.log.command"; 7 | option java_multiple_files = true; 8 | 9 | message Config {} 10 | 11 | message RestartLoggerRequest {} 12 | 13 | message RestartLoggerResponse {} 14 | 15 | message FollowLogRequest {} 16 | 17 | message FollowLogResponse { 18 | string message = 1; 19 | } 20 | 21 | service LoggerService { 22 | rpc RestartLogger(RestartLoggerRequest) returns (RestartLoggerResponse) {} 23 | 24 | //Unstable interface 25 | rpc FollowLog(FollowLogRequest) returns (stream FollowLogResponse) {}; 26 | } 27 | -------------------------------------------------------------------------------- /app/log/command/errors.generated.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/log/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.log; 4 | option csharp_namespace = "V2Ray.Core.App.Log"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/log"; 6 | option java_package = "com.v2ray.core.app.log"; 7 | option java_multiple_files = true; 8 | 9 | import "common/log/log.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | enum LogType { 13 | None = 0; 14 | Console = 1; 15 | File = 2; 16 | Event = 3; 17 | } 18 | 19 | message LogSpecification { 20 | LogType type = 1; 21 | v2ray.core.common.log.Severity level = 2; 22 | string path = 3; 23 | } 24 | 25 | message Config { 26 | option (v2ray.core.common.protoext.message_opt).type = "service"; 27 | option (v2ray.core.common.protoext.message_opt).short_name = "log"; 28 | 29 | reserved 1,2,3,4,5; 30 | 31 | LogSpecification error = 6; 32 | LogSpecification access = 7; 33 | } 34 | -------------------------------------------------------------------------------- /app/log/errors.generated.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/observatory/burst/burst.go: -------------------------------------------------------------------------------- 1 | package burst 2 | 3 | import ( 4 | "math" 5 | "time" 6 | ) 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | 10 | const ( 11 | rttFailed = time.Duration(math.MaxInt64 - iota) 12 | rttUntested // nolint: varcheck 13 | rttUnqualified // nolint: varcheck 14 | ) 15 | -------------------------------------------------------------------------------- /app/observatory/burst/errors.generated.go: -------------------------------------------------------------------------------- 1 | package burst 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/observatory/command/command.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.observatory.command; 4 | option csharp_namespace = "V2Ray.Core.App.Observatory.Command"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/observatory/command"; 6 | option java_package = "com.v2ray.core.app.observatory.command"; 7 | option java_multiple_files = true; 8 | 9 | import "app/observatory/config.proto"; 10 | 11 | message GetOutboundStatusRequest { 12 | string Tag = 1; 13 | } 14 | 15 | message GetOutboundStatusResponse { 16 | v2ray.core.app.observatory.ObservationResult status = 1; 17 | } 18 | 19 | service ObservatoryService { 20 | rpc GetOutboundStatus(GetOutboundStatusRequest) 21 | returns (GetOutboundStatusResponse) {} 22 | } 23 | 24 | 25 | message Config {} -------------------------------------------------------------------------------- /app/observatory/command/errors.generated.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/observatory/errors.generated.go: -------------------------------------------------------------------------------- 1 | package observatory 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/observatory/explainErrors.go: -------------------------------------------------------------------------------- 1 | package observatory 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errorCollector struct { 6 | errors *errors.Error 7 | } 8 | 9 | func (e *errorCollector) SubmitError(err error) { 10 | if e.errors == nil { 11 | e.errors = newError("underlying connection error").Base(err) 12 | return 13 | } 14 | e.errors = e.errors.Base(newError("underlying connection error").Base(err)) 15 | } 16 | 17 | func newErrorCollector() *errorCollector { 18 | return &errorCollector{} 19 | } 20 | 21 | func (e *errorCollector) UnderlyingError() error { 22 | if e.errors == nil { 23 | return newError("failed to produce report") 24 | } 25 | return e.errors 26 | } 27 | -------------------------------------------------------------------------------- /app/observatory/multiobservatory/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.observatory.multiobservatory; 4 | option csharp_namespace = "V2Ray.Core.App.Observatory.MultiObservatory"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/observatory/multiobservatory"; 6 | option java_package = "com.v2ray.core.app.observatory.multiObservatory"; 7 | option java_multiple_files = true; 8 | 9 | import "common/taggedfeatures/skeleton.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | message Config{ 13 | option (v2ray.core.common.protoext.message_opt).type = "service"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "multiobservatory"; 15 | 16 | v2ray.core.common.taggedfeatures.Config holders = 1 ; 17 | } 18 | -------------------------------------------------------------------------------- /app/observatory/observatory.go: -------------------------------------------------------------------------------- 1 | package observatory 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /app/observatory/persist.go: -------------------------------------------------------------------------------- 1 | package observatory 2 | 3 | func (o *Observer) UpdateStatus(result *OutboundStatus) { 4 | o.statusLock.Lock() 5 | defer o.statusLock.Unlock() 6 | 7 | if location := o.findStatusLocationLockHolderOnly(result.OutboundTag); location != -1 { 8 | o.status[location] = result 9 | } else { 10 | o.status = append(o.status, result) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/policy/errors.generated.go: -------------------------------------------------------------------------------- 1 | package policy 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/policy/policy.go: -------------------------------------------------------------------------------- 1 | // Package policy is an implementation of policy.Manager feature. 2 | package policy 3 | 4 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 5 | -------------------------------------------------------------------------------- /app/proxyman/command/doc.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /app/proxyman/command/errors.generated.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/proxyman/inbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/proxyman/outbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/restfulapi/config.go: -------------------------------------------------------------------------------- 1 | package restfulapi 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | ) 8 | 9 | func init() { 10 | common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { 11 | return newRestfulService(ctx, config.(*Config)) 12 | })) 13 | } 14 | -------------------------------------------------------------------------------- /app/restfulapi/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.app.restfulapi; 4 | option csharp_namespace = "V2Ray.App.Restapi"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/restfulapi"; 6 | option java_package = "com.v2ray.core.app.restapi"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message Config{ 12 | option (v2ray.core.common.protoext.message_opt).type = "service"; 13 | option (v2ray.core.common.protoext.message_opt).short_name = "restfulapi"; 14 | 15 | string listen_addr = 1; 16 | int32 listen_port = 2; 17 | string auth_token = 3; 18 | } 19 | -------------------------------------------------------------------------------- /app/restfulapi/errors.generated.go: -------------------------------------------------------------------------------- 1 | package restfulapi 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/restfulapi/service_test.go: -------------------------------------------------------------------------------- 1 | package restfulapi 2 | 3 | import ( 4 | "reflect" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestTypeReturnAnonymousType(t *testing.T) { 11 | service := restfulService{} 12 | serviceType := service.Type() 13 | assert.Empty(t, reflect.TypeOf(serviceType).Name(), "must return anonymous type") 14 | } 15 | -------------------------------------------------------------------------------- /app/reverse/config.go: -------------------------------------------------------------------------------- 1 | package reverse 2 | 3 | import ( 4 | "crypto/rand" 5 | "io" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common/dice" 8 | ) 9 | 10 | func (c *Control) FillInRandom() { 11 | randomLength := dice.Roll(64) 12 | c.Random = make([]byte, randomLength) 13 | io.ReadFull(rand.Reader, c.Random) 14 | } 15 | -------------------------------------------------------------------------------- /app/reverse/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.reverse; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Reverse"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/reverse"; 6 | option java_package = "com.v2ray.core.proxy.reverse"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message Control { 12 | enum State { 13 | ACTIVE = 0; 14 | DRAIN = 1; 15 | } 16 | 17 | State state = 1; 18 | bytes random = 99; 19 | } 20 | 21 | message BridgeConfig { 22 | string tag = 1; 23 | string domain = 2; 24 | } 25 | 26 | message PortalConfig { 27 | string tag = 1; 28 | string domain = 2; 29 | } 30 | 31 | message Config { 32 | option (v2ray.core.common.protoext.message_opt).type = "service"; 33 | option (v2ray.core.common.protoext.message_opt).short_name = "reverse"; 34 | 35 | repeated BridgeConfig bridge_config = 1; 36 | repeated PortalConfig portal_config = 2; 37 | } 38 | -------------------------------------------------------------------------------- /app/reverse/errors.generated.go: -------------------------------------------------------------------------------- 1 | package reverse 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/reverse/portal_test.go: -------------------------------------------------------------------------------- 1 | package reverse_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/v2fly/v2ray-core/v5/app/reverse" 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | ) 9 | 10 | func TestStaticPickerEmpty(t *testing.T) { 11 | picker, err := reverse.NewStaticMuxPicker() 12 | common.Must(err) 13 | worker, err := picker.PickAvailable() 14 | if err == nil { 15 | t.Error("expected error, but nil") 16 | } 17 | if worker != nil { 18 | t.Error("expected nil worker, but not nil") 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/router/command/errors.generated.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/router/errors.generated.go: -------------------------------------------------------------------------------- 1 | package router 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/router/strategy_random.go: -------------------------------------------------------------------------------- 1 | package router 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/common/dice" 6 | ) 7 | 8 | // RandomStrategy represents a random balancing strategy 9 | type RandomStrategy struct{} 10 | 11 | func (s *RandomStrategy) GetPrincipleTarget(strings []string) []string { 12 | return strings 13 | } 14 | 15 | func (s *RandomStrategy) PickOutbound(candidates []string) string { 16 | count := len(candidates) 17 | if count == 0 { 18 | // goes to fallbackTag 19 | return "" 20 | } 21 | return candidates[dice.Roll(count)] 22 | } 23 | 24 | func init() { 25 | common.Must(common.RegisterConfig((*StrategyRandomConfig)(nil), nil)) 26 | } 27 | -------------------------------------------------------------------------------- /app/stats/command/errors.generated.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /app/stats/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.app.stats; 4 | option csharp_namespace = "V2Ray.Core.App.Stats"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/app/stats"; 6 | option java_package = "com.v2ray.core.app.stats"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message Config { 12 | option (v2ray.core.common.protoext.message_opt).type = "service"; 13 | option (v2ray.core.common.protoext.message_opt).short_name = "stats"; 14 | } 15 | 16 | message ChannelConfig { 17 | bool Blocking = 1; 18 | int32 SubscriberLimit = 2; 19 | int32 BufferSize = 3; 20 | } 21 | -------------------------------------------------------------------------------- /app/stats/counter.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import "sync/atomic" 4 | 5 | // Counter is an implementation of stats.Counter. 6 | type Counter struct { 7 | value int64 8 | } 9 | 10 | // Value implements stats.Counter. 11 | func (c *Counter) Value() int64 { 12 | return atomic.LoadInt64(&c.value) 13 | } 14 | 15 | // Set implements stats.Counter. 16 | func (c *Counter) Set(newValue int64) int64 { 17 | return atomic.SwapInt64(&c.value, newValue) 18 | } 19 | 20 | // Add implements stats.Counter. 21 | func (c *Counter) Add(delta int64) int64 { 22 | return atomic.AddInt64(&c.value, delta) 23 | } 24 | -------------------------------------------------------------------------------- /app/stats/counter_test.go: -------------------------------------------------------------------------------- 1 | package stats_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | . "github.com/v2fly/v2ray-core/v5/app/stats" 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | "github.com/v2fly/v2ray-core/v5/features/stats" 10 | ) 11 | 12 | func TestStatsCounter(t *testing.T) { 13 | raw, err := common.CreateObject(context.Background(), &Config{}) 14 | common.Must(err) 15 | 16 | m := raw.(stats.Manager) 17 | c, err := m.RegisterCounter("test.counter") 18 | common.Must(err) 19 | 20 | if v := c.Add(1); v != 1 { 21 | t.Fatal("unpexcted Add(1) return: ", v, ", wanted ", 1) 22 | } 23 | 24 | if v := c.Set(0); v != 1 { 25 | t.Fatal("unexpected Set(0) return: ", v, ", wanted ", 1) 26 | } 27 | 28 | if v := c.Value(); v != 0 { 29 | t.Fatal("unexpected Value() return: ", v, ", wanted ", 0) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/stats/errors.generated.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/antireplay/antireplay.go: -------------------------------------------------------------------------------- 1 | package antireplay 2 | 3 | type GeneralizedReplayFilter interface { 4 | Interval() int64 5 | Check(sum []byte) bool 6 | } 7 | -------------------------------------------------------------------------------- /common/antireplay/bloomring.go: -------------------------------------------------------------------------------- 1 | package antireplay 2 | 3 | import ( 4 | "sync" 5 | 6 | ss_bloomring "github.com/v2fly/ss-bloomring" 7 | ) 8 | 9 | type BloomRing struct { 10 | *ss_bloomring.BloomRing 11 | lock *sync.Mutex 12 | } 13 | 14 | func (b BloomRing) Interval() int64 { 15 | return 9999999 16 | } 17 | 18 | func (b BloomRing) Check(sum []byte) bool { 19 | b.lock.Lock() 20 | defer b.lock.Unlock() 21 | if b.Test(sum) { 22 | return false 23 | } 24 | b.Add(sum) 25 | return true 26 | } 27 | 28 | func NewBloomRing() BloomRing { 29 | const ( 30 | DefaultSFCapacity = 1e6 31 | // FalsePositiveRate 32 | DefaultSFFPR = 1e-6 33 | DefaultSFSlot = 10 34 | ) 35 | return BloomRing{ss_bloomring.NewBloomRing(DefaultSFSlot, DefaultSFCapacity, DefaultSFFPR), &sync.Mutex{}} 36 | } 37 | -------------------------------------------------------------------------------- /common/bitmask/byte.go: -------------------------------------------------------------------------------- 1 | package bitmask 2 | 3 | // Byte is a bitmask in byte. 4 | type Byte byte 5 | 6 | // Has returns true if this bitmask contains another bitmask. 7 | func (b Byte) Has(bb Byte) bool { 8 | return (b & bb) != 0 9 | } 10 | 11 | func (b *Byte) Set(bb Byte) { 12 | *b |= bb 13 | } 14 | 15 | func (b *Byte) Clear(bb Byte) { 16 | *b &= ^bb 17 | } 18 | 19 | func (b *Byte) Toggle(bb Byte) { 20 | *b ^= bb 21 | } 22 | -------------------------------------------------------------------------------- /common/bitmask/byte_test.go: -------------------------------------------------------------------------------- 1 | package bitmask_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/bitmask" 7 | ) 8 | 9 | func TestBitmaskByte(t *testing.T) { 10 | b := Byte(0) 11 | b.Set(Byte(1)) 12 | if !b.Has(1) { 13 | t.Fatal("expected ", b, " to contain 1, but actually not") 14 | } 15 | 16 | b.Set(Byte(2)) 17 | if !b.Has(2) { 18 | t.Fatal("expected ", b, " to contain 2, but actually not") 19 | } 20 | if !b.Has(1) { 21 | t.Fatal("expected ", b, " to contain 1, but actually not") 22 | } 23 | 24 | b.Clear(Byte(1)) 25 | if !b.Has(2) { 26 | t.Fatal("expected ", b, " to contain 2, but actually not") 27 | } 28 | if b.Has(1) { 29 | t.Fatal("expected ", b, " to not contain 1, but actually did") 30 | } 31 | 32 | b.Toggle(Byte(2)) 33 | if b.Has(2) { 34 | t.Fatal("expected ", b, " to not contain 2, but actually did") 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /common/buf/buf.go: -------------------------------------------------------------------------------- 1 | // Package buf provides a light-weight memory allocation mechanism. 2 | package buf 3 | 4 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 5 | -------------------------------------------------------------------------------- /common/buf/erasure.go: -------------------------------------------------------------------------------- 1 | package buf 2 | 3 | type EndpointErasureReader struct { 4 | Reader 5 | } 6 | 7 | func (r *EndpointErasureReader) ReadMultiBuffer() (MultiBuffer, error) { 8 | mb, err := r.Reader.ReadMultiBuffer() 9 | if err == nil { 10 | for _, buffer := range mb { 11 | buffer.Endpoint = nil 12 | } 13 | } 14 | return mb, err 15 | } 16 | 17 | type EndpointErasureWriter struct { 18 | Writer 19 | } 20 | 21 | func (w *EndpointErasureWriter) WriteMultiBuffer(mb MultiBuffer) error { 22 | for _, buffer := range mb { 23 | buffer.Endpoint = nil 24 | } 25 | return w.Writer.WriteMultiBuffer(mb) 26 | } 27 | -------------------------------------------------------------------------------- /common/buf/errors.generated.go: -------------------------------------------------------------------------------- 1 | package buf 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/buf/readv_reader_wasm.go: -------------------------------------------------------------------------------- 1 | //go:build wasm 2 | // +build wasm 3 | 4 | package buf 5 | 6 | import ( 7 | "io" 8 | "syscall" 9 | ) 10 | 11 | const useReadv = false 12 | 13 | func NewReadVReader(reader io.Reader, rawConn syscall.RawConn) Reader { 14 | panic("not implemented") 15 | } 16 | -------------------------------------------------------------------------------- /common/buf/readv_unix.go: -------------------------------------------------------------------------------- 1 | //go:build illumos 2 | // +build illumos 3 | 4 | package buf 5 | 6 | import "golang.org/x/sys/unix" 7 | 8 | type unixReader struct { 9 | iovs [][]byte 10 | } 11 | 12 | func (r *unixReader) Init(bs []*Buffer) { 13 | iovs := r.iovs 14 | if iovs == nil { 15 | iovs = make([][]byte, 0, len(bs)) 16 | } 17 | for _, b := range bs { 18 | iovs = append(iovs, b.v) 19 | } 20 | r.iovs = iovs 21 | } 22 | 23 | func (r *unixReader) Read(fd uintptr) int32 { 24 | n, e := unix.Readv(int(fd), r.iovs) 25 | if e != nil { 26 | return -1 27 | } 28 | return int32(n) 29 | } 30 | 31 | func (r *unixReader) Clear() { 32 | r.iovs = r.iovs[:0] 33 | } 34 | 35 | func newMultiReader() multiReader { 36 | return &unixReader{} 37 | } 38 | -------------------------------------------------------------------------------- /common/buf/readv_windows.go: -------------------------------------------------------------------------------- 1 | package buf 2 | 3 | import ( 4 | "syscall" 5 | ) 6 | 7 | type windowsReader struct { 8 | bufs []syscall.WSABuf 9 | } 10 | 11 | func (r *windowsReader) Init(bs []*Buffer) { 12 | if r.bufs == nil { 13 | r.bufs = make([]syscall.WSABuf, 0, len(bs)) 14 | } 15 | for _, b := range bs { 16 | r.bufs = append(r.bufs, syscall.WSABuf{Len: uint32(Size), Buf: &b.v[0]}) 17 | } 18 | } 19 | 20 | func (r *windowsReader) Clear() { 21 | for idx := range r.bufs { 22 | r.bufs[idx].Buf = nil 23 | } 24 | r.bufs = r.bufs[:0] 25 | } 26 | 27 | func (r *windowsReader) Read(fd uintptr) int32 { 28 | var nBytes uint32 29 | var flags uint32 30 | err := syscall.WSARecv(syscall.Handle(fd), &r.bufs[0], uint32(len(r.bufs)), &nBytes, &flags, nil, nil) 31 | if err != nil { 32 | return -1 33 | } 34 | return int32(nBytes) 35 | } 36 | 37 | func newMultiReader() multiReader { 38 | return new(windowsReader) 39 | } 40 | -------------------------------------------------------------------------------- /common/bytesgrp/bytes.go: -------------------------------------------------------------------------------- 1 | package bytesgrp 2 | 3 | import ( 4 | "encoding/binary" 5 | ) 6 | 7 | func Pack(data [][]byte) []byte { 8 | var merged []byte 9 | for _, b := range data { 10 | length := make([]byte, 8) 11 | offset := binary.PutUvarint(length, uint64(len(b))) 12 | merged = append(merged, length[0:offset]...) 13 | merged = append(merged, b...) 14 | } 15 | return merged 16 | } 17 | 18 | func UnPack(pack []byte) [][]byte { 19 | var data [][]byte 20 | dataLength := len(pack) 21 | index := 0 22 | for index < dataLength { 23 | length, skip := binary.Uvarint(pack[index:]) 24 | index += skip + int(length) 25 | if dataLength-index < 0 { 26 | // err 27 | return [][]byte{pack} 28 | } 29 | data = append(data, pack[index-int(length):index]) 30 | } 31 | return data 32 | } 33 | -------------------------------------------------------------------------------- /common/bytesgrp/bytes_test.go: -------------------------------------------------------------------------------- 1 | package bytesgrp_test 2 | 3 | import ( 4 | "bytes" 5 | "testing" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common/bytesgrp" 8 | ) 9 | 10 | func TestGroup(t *testing.T) { 11 | data := [][]byte{{1, 1, 4}, {5, 1, 4}, {1, 9}, {1, 9, 8}, {1, 0}} 12 | 13 | test := bytesgrp.UnPack(bytesgrp.Pack(data)) 14 | 15 | for i, b := range test { 16 | if !bytes.Equal(data[i], b) { 17 | t.Error("encode failed") 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/bytespool/pool.go: -------------------------------------------------------------------------------- 1 | package bytespool 2 | 3 | import "sync" 4 | 5 | // The following parameters controls the size of buffer pools. 6 | // There are numPools pools. Starting from 2k size, the size of each Pool is sizeMulti of the previous one. 7 | // Package buf is guaranteed to not use buffers larger than the largest Pool. 8 | // Other packets may use larger buffers. 9 | const ( 10 | poolSize = 20 * 1024 11 | ) 12 | 13 | var pool = sync.Pool{ 14 | New: func() any { 15 | return make([]byte, poolSize) 16 | }, 17 | } 18 | 19 | // GetPool returns a sync.Pool that generates bytes array with at least the given size. 20 | // It may return nil if no such Pool exists. 21 | // 22 | // v2ray:api:stable 23 | func GetPool(size int32) *sync.Pool { 24 | if size <= poolSize { 25 | return &pool 26 | } 27 | return nil 28 | } 29 | -------------------------------------------------------------------------------- /common/cmdarg/cmdarg.go: -------------------------------------------------------------------------------- 1 | package cmdarg 2 | 3 | import "strings" 4 | 5 | // Arg is used by flag to accept multiple argument. 6 | type Arg []string 7 | 8 | func (c *Arg) String() string { 9 | return strings.Join([]string(*c), " ") 10 | } 11 | 12 | // Set is the method flag package calls 13 | func (c *Arg) Set(value string) error { 14 | *c = append(*c, value) 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /common/cmdarg/errors.generated.go: -------------------------------------------------------------------------------- 1 | package cmdarg 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/crypto/chacha20.go: -------------------------------------------------------------------------------- 1 | package crypto 2 | 3 | import ( 4 | "crypto/cipher" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/crypto/internal" 7 | ) 8 | 9 | // NewChaCha20Stream creates a new Chacha20 encryption/descryption stream based on give key and IV. 10 | // Caller must ensure the length of key is 32 bytes, and length of IV is either 8 or 12 bytes. 11 | func NewChaCha20Stream(key []byte, iv []byte) cipher.Stream { 12 | return internal.NewChaCha20Stream(key, iv, 20) 13 | } 14 | -------------------------------------------------------------------------------- /common/crypto/crypto.go: -------------------------------------------------------------------------------- 1 | // Package crypto provides common crypto libraries for V2Ray. 2 | package crypto 3 | 4 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 5 | -------------------------------------------------------------------------------- /common/crypto/errors.generated.go: -------------------------------------------------------------------------------- 1 | package crypto 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/drain/drain.go: -------------------------------------------------------------------------------- 1 | package drain 2 | 3 | import "io" 4 | 5 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 6 | 7 | type Drainer interface { 8 | AcknowledgeReceive(size int) 9 | Drain(reader io.Reader) error 10 | } 11 | -------------------------------------------------------------------------------- /common/drain/errors.generated.go: -------------------------------------------------------------------------------- 1 | package drain 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/environment/app.go: -------------------------------------------------------------------------------- 1 | package environment 2 | 3 | type AppEnvironmentCapabilitySet interface { 4 | BaseEnvironmentCapabilitySet 5 | SystemNetworkCapabilitySet 6 | InstanceNetworkCapabilitySet 7 | FileSystemCapabilitySet 8 | PersistentStorageCapabilitySet 9 | TransientStorageCapabilitySet 10 | } 11 | 12 | type AppEnvironment interface { 13 | AppEnvironmentCapabilitySet 14 | NarrowScope(key string) (AppEnvironment, error) 15 | doNotImpl() 16 | } 17 | -------------------------------------------------------------------------------- /common/environment/connection.go: -------------------------------------------------------------------------------- 1 | package environment 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/log" 4 | 5 | type ConnectionCapabilitySet interface { 6 | ConnectionLogCapabilitySet 7 | } 8 | 9 | type ConnectionEnvironment interface { 10 | ConnectionCapabilitySet 11 | doNotImpl() 12 | } 13 | 14 | type ConnectionLogCapabilitySet interface { 15 | RecordConnectionLog(msg log.Message) 16 | } 17 | -------------------------------------------------------------------------------- /common/environment/envctx/env.go: -------------------------------------------------------------------------------- 1 | package envctx 2 | 3 | import "context" 4 | 5 | const ( 6 | environmentKey string = "v2.environment" 7 | ) 8 | 9 | func ContextWithEnvironment(ctx context.Context, environment interface{}) context.Context { 10 | return context.WithValue(ctx, environmentKey, environment) //nolint: revive 11 | } 12 | 13 | func EnvironmentFromContext(ctx context.Context) interface{} { 14 | return ctx.Value(environmentKey) 15 | } 16 | -------------------------------------------------------------------------------- /common/environment/envimpl/fs.go: -------------------------------------------------------------------------------- 1 | package envimpl 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/environment" 5 | "github.com/v2fly/v2ray-core/v5/common/platform/filesystem" 6 | "github.com/v2fly/v2ray-core/v5/common/platform/filesystem/fsifce" 7 | ) 8 | 9 | type fileSystemDefaultImpl struct{} 10 | 11 | func (f fileSystemDefaultImpl) OpenFileForReadSeek() fsifce.FileSeekerFunc { 12 | return filesystem.NewFileSeeker 13 | } 14 | 15 | func (f fileSystemDefaultImpl) OpenFileForRead() fsifce.FileReaderFunc { 16 | return filesystem.NewFileReader 17 | } 18 | 19 | func (f fileSystemDefaultImpl) OpenFileForWrite() fsifce.FileWriterFunc { 20 | return filesystem.NewFileWriter 21 | } 22 | 23 | func NewDefaultFileSystemDefaultImpl() environment.FileSystemCapabilitySet { 24 | return fileSystemDefaultImpl{} 25 | } 26 | -------------------------------------------------------------------------------- /common/environment/filesystemcap/fscap.go: -------------------------------------------------------------------------------- 1 | package filesystemcap 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/platform/filesystem/fsifce" 4 | 5 | type FileSystemCapabilitySet interface { 6 | OpenFileForReadSeek() fsifce.FileSeekerFunc 7 | OpenFileForRead() fsifce.FileReaderFunc 8 | OpenFileForWrite() fsifce.FileWriterFunc 9 | } 10 | -------------------------------------------------------------------------------- /common/environment/proxy.go: -------------------------------------------------------------------------------- 1 | package environment 2 | 3 | type ProxyEnvironmentCapabilitySet interface { 4 | BaseEnvironmentCapabilitySet 5 | InstanceNetworkCapabilitySet 6 | TransientStorageCapabilitySet 7 | } 8 | 9 | // TODO Add NarrowScopeToConnection 10 | 11 | type ProxyEnvironment interface { 12 | ProxyEnvironmentCapabilitySet 13 | NarrowScope(key string) (ProxyEnvironment, error) 14 | NarrowScopeToTransport(key string) (TransportEnvironment, error) 15 | doNotImpl() 16 | } 17 | -------------------------------------------------------------------------------- /common/environment/rootcap.go: -------------------------------------------------------------------------------- 1 | package environment 2 | 3 | type RootEnvironment interface { 4 | AppEnvironment(tag string) AppEnvironment 5 | ProxyEnvironment(tag string) ProxyEnvironment 6 | doNotImpl() 7 | } 8 | -------------------------------------------------------------------------------- /common/environment/transientstorageimpl/errors.generated.go: -------------------------------------------------------------------------------- 1 | package transientstorageimpl 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/environment/transport.go: -------------------------------------------------------------------------------- 1 | package environment 2 | 3 | type TransportEnvironmentCapacitySet interface { 4 | BaseEnvironmentCapabilitySet 5 | SystemNetworkCapabilitySet 6 | InstanceNetworkCapabilitySet 7 | TransientStorageCapabilitySet 8 | } 9 | 10 | type TransportEnvironment interface { 11 | TransportEnvironmentCapacitySet 12 | NarrowScope(key string) (TransportEnvironment, error) 13 | doNotImpl() 14 | } 15 | -------------------------------------------------------------------------------- /common/errors.generated.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/errors/errorgen/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "path/filepath" 7 | ) 8 | 9 | func main() { 10 | pwd, err := os.Getwd() 11 | if err != nil { 12 | fmt.Println("can not get current working directory") 13 | os.Exit(1) 14 | } 15 | pkg := filepath.Base(pwd) 16 | if pkg == "v2ray-core" { 17 | pkg = "core" 18 | } 19 | 20 | file, err := os.OpenFile("errors.generated.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0o644) 21 | if err != nil { 22 | fmt.Printf("Failed to generate errors.generated.go: %v", err) 23 | os.Exit(1) 24 | } 25 | defer file.Close() 26 | 27 | fmt.Fprintf(file, `package %s 28 | 29 | import "github.com/v2fly/v2ray-core/v5/common/errors" 30 | 31 | type errPathObjHolder struct{} 32 | 33 | func newError(values ...interface{}) *errors.Error { 34 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 35 | } 36 | `, pkg) 37 | } 38 | -------------------------------------------------------------------------------- /common/errors/multi_error.go: -------------------------------------------------------------------------------- 1 | package errors 2 | 3 | import ( 4 | "strings" 5 | ) 6 | 7 | type MultiError []error 8 | 9 | func (e MultiError) Error() string { 10 | if len(e) == 1 { 11 | return e[0].Error() 12 | } 13 | var r strings.Builder 14 | r.WriteString("multierr: ") 15 | for _, err := range e { 16 | r.WriteString(err.Error()) 17 | r.WriteString(" | ") 18 | } 19 | return r.String() 20 | } 21 | 22 | func Combine(maybeError ...error) error { 23 | var errs MultiError 24 | for _, err := range maybeError { 25 | if err != nil { 26 | errs = append(errs, err) 27 | } 28 | } 29 | if len(errs) == 0 { 30 | return nil 31 | } 32 | return errs 33 | } 34 | -------------------------------------------------------------------------------- /common/log/log.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.log; 4 | option csharp_namespace = "V2Ray.Core.Common.Log"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/log"; 6 | option java_package = "com.v2ray.core.common.log"; 7 | option java_multiple_files = true; 8 | 9 | enum Severity { 10 | Unknown = 0; 11 | Error = 1; 12 | Warning = 2; 13 | Info = 3; 14 | Debug = 4; 15 | } 16 | -------------------------------------------------------------------------------- /common/log/log_test.go: -------------------------------------------------------------------------------- 1 | package log_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/google/go-cmp/cmp" 7 | "github.com/v2fly/v2ray-core/v5/common/log" 8 | "github.com/v2fly/v2ray-core/v5/common/net" 9 | ) 10 | 11 | type testLogger struct { 12 | value string 13 | } 14 | 15 | func (l *testLogger) Handle(msg log.Message) { 16 | l.value = msg.String() 17 | } 18 | 19 | func TestLogRecord(t *testing.T) { 20 | var logger testLogger 21 | log.RegisterHandler(&logger) 22 | 23 | ip := "8.8.8.8" 24 | log.Record(&log.GeneralMessage{ 25 | Severity: log.Severity_Error, 26 | Content: net.ParseAddress(ip), 27 | }) 28 | 29 | if diff := cmp.Diff("[Error] "+ip, logger.value); diff != "" { 30 | t.Error(diff) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/mux/endpoint.go: -------------------------------------------------------------------------------- 1 | package mux 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/buf" 5 | ) 6 | 7 | type endpointWrapperWriter struct { 8 | buf.Writer 9 | *Session 10 | } 11 | 12 | func (w *endpointWrapperWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { 13 | for _, buffer := range mb { 14 | if buffer.Endpoint != nil { 15 | if w.sendEndpoint == -1 || *buffer.Endpoint == w.endpoint { 16 | buffer.Endpoint = nil 17 | } 18 | } 19 | } 20 | return w.Writer.WriteMultiBuffer(mb) 21 | } 22 | -------------------------------------------------------------------------------- /common/mux/errors.generated.go: -------------------------------------------------------------------------------- 1 | package mux 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/mux/frame_test.go: -------------------------------------------------------------------------------- 1 | package mux_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | "github.com/v2fly/v2ray-core/v5/common/buf" 8 | "github.com/v2fly/v2ray-core/v5/common/mux" 9 | "github.com/v2fly/v2ray-core/v5/common/net" 10 | ) 11 | 12 | func BenchmarkFrameWrite(b *testing.B) { 13 | frame := mux.FrameMetadata{ 14 | Target: net.TCPDestination(net.DomainAddress("www.v2fly.org"), net.Port(80)), 15 | SessionID: 1, 16 | SessionStatus: mux.SessionStatusNew, 17 | } 18 | writer := buf.New() 19 | defer writer.Release() 20 | 21 | for i := 0; i < b.N; i++ { 22 | common.Must(frame.WriteTo(writer)) 23 | writer.Clear() 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/mux/mux.go: -------------------------------------------------------------------------------- 1 | package mux 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /common/net/address.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net; 4 | option csharp_namespace = "V2Ray.Core.Common.Net"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net"; 6 | option java_package = "com.v2ray.core.common.net"; 7 | option java_multiple_files = true; 8 | 9 | // Address of a network host. It may be either an IP address or a domain 10 | // address. 11 | message IPOrDomain { 12 | oneof address { 13 | // IP address. Must by either 4 or 16 bytes. 14 | bytes ip = 1; 15 | 16 | // Domain address. 17 | string domain = 2; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /common/net/destination.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net; 4 | option csharp_namespace = "V2Ray.Core.Common.Net"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net"; 6 | option java_package = "com.v2ray.core.common.net"; 7 | option java_multiple_files = true; 8 | 9 | import "common/net/network.proto"; 10 | import "common/net/address.proto"; 11 | 12 | // Endpoint of a network connection. 13 | message Endpoint { 14 | Network network = 1; 15 | IPOrDomain address = 2; 16 | uint32 port = 3; 17 | } 18 | -------------------------------------------------------------------------------- /common/net/errors.generated.go: -------------------------------------------------------------------------------- 1 | package net 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/net/net.go: -------------------------------------------------------------------------------- 1 | // Package net is a drop-in replacement to Golang's net package, with some more functionalities. 2 | package net 3 | 4 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 5 | -------------------------------------------------------------------------------- /common/net/network.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net; 4 | option csharp_namespace = "V2Ray.Core.Common.Net"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net"; 6 | option java_package = "com.v2ray.core.common.net"; 7 | option java_multiple_files = true; 8 | 9 | enum Network { 10 | Unknown = 0; 11 | 12 | RawTCP = 1 [deprecated = true]; 13 | TCP = 2; 14 | UDP = 3; 15 | UNIX = 4; 16 | } 17 | 18 | // NetworkList is a list of Networks. 19 | message NetworkList { repeated Network network = 1; } 20 | -------------------------------------------------------------------------------- /common/net/packetaddr/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.net.packetaddr; 4 | option csharp_namespace = "V2Ray.Core.Common.Net.Packetaddr"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net/packetaddr"; 6 | option java_package = "com.v2ray.core.common.net.packetaddr"; 7 | option java_multiple_files = true; 8 | 9 | enum PacketAddrType { 10 | None = 0; 11 | Packet = 1; 12 | XUDP = 2; 13 | } -------------------------------------------------------------------------------- /common/net/packetaddr/errors.generated.go: -------------------------------------------------------------------------------- 1 | package packetaddr 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/net/packetaddr/special_address.go: -------------------------------------------------------------------------------- 1 | package packetaddr 2 | 3 | const SeqPacketMagicAddress = "sp.packet-addr.v2fly.arpa" 4 | -------------------------------------------------------------------------------- /common/net/pingproto/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net.pingproto; 4 | option csharp_namespace = "V2Ray.Core.Common.Net.PingProto"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net/pingproto"; 6 | option java_package = "com.v2ray.core.common.net.pingproto"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | enum Protocol { 12 | Default = 0; 13 | Unprivileged = 1; 14 | } 15 | 16 | message Config { 17 | Protocol protocol = 1; 18 | string gateway4 = 2; 19 | string gateway6 = 3; 20 | bool disableIPv6 = 4; 21 | } 22 | 23 | message SimplifiedConfig { 24 | option (v2ray.core.common.protoext.message_opt).type = "service"; 25 | option (v2ray.core.common.protoext.message_opt).short_name = "ping"; 26 | string protocol = 1; 27 | string gateway4 = 2; 28 | string gateway6 = 3; 29 | bool disableIPv6 = 4; 30 | } -------------------------------------------------------------------------------- /common/net/pingproto/errors.generated.go: -------------------------------------------------------------------------------- 1 | package pingproto 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/net/port.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net; 4 | option csharp_namespace = "V2Ray.Core.Common.Net"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net"; 6 | option java_package = "com.v2ray.core.common.net"; 7 | option java_multiple_files = true; 8 | 9 | // PortRange represents a range of ports. 10 | message PortRange { 11 | // The port that this range starts from. 12 | uint32 From = 1; 13 | // The port that this range ends with (inclusive). 14 | uint32 To = 2; 15 | } 16 | 17 | // PortList is a list of ports. 18 | message PortList { 19 | repeated PortRange range = 1; 20 | } 21 | -------------------------------------------------------------------------------- /common/net/port_test.go: -------------------------------------------------------------------------------- 1 | package net_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/net" 7 | ) 8 | 9 | func TestPortRangeContains(t *testing.T) { 10 | portRange := &PortRange{ 11 | From: 53, 12 | To: 53, 13 | } 14 | 15 | if !portRange.Contains(Port(53)) { 16 | t.Error("expected port range containing 53, but actually not") 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/net/udpovertcp/errors.generated.go: -------------------------------------------------------------------------------- 1 | package udpovertcp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/net/udpovertcp/udpovertcp.go: -------------------------------------------------------------------------------- 1 | package udpovertcp 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/net" 5 | "github.com/v2fly/v2ray-core/v5/common/protocol" 6 | ) 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | 10 | const UOTMagicAddress = "sp.udp-over-tcp.arpa" 11 | 12 | var addrParser = protocol.NewAddressParser( 13 | protocol.AddressFamilyByte(0x00, net.AddressFamilyIPv4), 14 | protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv6), 15 | protocol.AddressFamilyByte(0x02, net.AddressFamilyDomain), 16 | ) 17 | 18 | func GetDestinationSubsetOf(dest net.Destination) bool { 19 | return dest.Address.Family().IsDomain() && dest.Address.Domain() == UOTMagicAddress 20 | } 21 | -------------------------------------------------------------------------------- /common/net/uid.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.net; 4 | option csharp_namespace = "V2Ray.Core.Common.Net"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/net"; 6 | option java_package = "com.v2ray.core.common.net"; 7 | option java_multiple_files = true; 8 | 9 | // UidList represents a list of uid. 10 | message UidList { 11 | // The port that this range starts from. 12 | repeated uint32 uid = 1; 13 | } -------------------------------------------------------------------------------- /common/ocsp/errors.generated.go: -------------------------------------------------------------------------------- 1 | package ocsp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/peer/latency.go: -------------------------------------------------------------------------------- 1 | package peer 2 | 3 | import ( 4 | "sync" 5 | ) 6 | 7 | type Latency interface { 8 | Value() uint64 9 | } 10 | 11 | type HasLatency interface { 12 | ConnectionLatency() Latency 13 | HandshakeLatency() Latency 14 | } 15 | 16 | type AverageLatency struct { 17 | access sync.Mutex 18 | value uint64 19 | } 20 | 21 | func (al *AverageLatency) Update(newValue uint64) { 22 | al.access.Lock() 23 | defer al.access.Unlock() 24 | 25 | al.value = (al.value + newValue*2) / 3 26 | } 27 | 28 | func (al *AverageLatency) Value() uint64 { 29 | return al.value 30 | } 31 | -------------------------------------------------------------------------------- /common/peer/peer.go: -------------------------------------------------------------------------------- 1 | package peer 2 | -------------------------------------------------------------------------------- /common/platform/ctlcmd/attr_other.go: -------------------------------------------------------------------------------- 1 | //go:build !windows 2 | // +build !windows 3 | 4 | package ctlcmd 5 | 6 | import "syscall" 7 | 8 | func getSysProcAttr() *syscall.SysProcAttr { 9 | return nil 10 | } 11 | -------------------------------------------------------------------------------- /common/platform/filesystem/fsifce/ifce.go: -------------------------------------------------------------------------------- 1 | package fsifce 2 | 3 | import "io" 4 | 5 | type FileSeekerFunc func(path string) (io.ReadSeekCloser, error) 6 | 7 | type FileReaderFunc func(path string) (io.ReadCloser, error) 8 | 9 | type FileWriterFunc func(path string) (io.WriteCloser, error) 10 | -------------------------------------------------------------------------------- /common/protocol/account.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | // Account is a user identity used for authentication. 4 | type Account interface { 5 | Equals(Account) bool 6 | } 7 | 8 | // AsAccount is an object can be converted into account. 9 | type AsAccount interface { 10 | AsAccount() (Account, error) 11 | } 12 | -------------------------------------------------------------------------------- /common/protocol/context.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | import ( 4 | "context" 5 | ) 6 | 7 | type key int 8 | 9 | const ( 10 | requestKey key = iota 11 | ) 12 | 13 | func ContextWithRequestHeader(ctx context.Context, request *RequestHeader) context.Context { 14 | return context.WithValue(ctx, requestKey, request) 15 | } 16 | 17 | func RequestHeaderFromContext(ctx context.Context) *RequestHeader { 18 | request := ctx.Value(requestKey) 19 | if request == nil { 20 | return nil 21 | } 22 | return request.(*RequestHeader) 23 | } 24 | -------------------------------------------------------------------------------- /common/protocol/dns/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/protocol/errors.generated.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/protocol/headers.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.protocol; 4 | option csharp_namespace = "V2Ray.Core.Common.Protocol"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/protocol"; 6 | option java_package = "com.v2ray.core.common.protocol"; 7 | option java_multiple_files = true; 8 | 9 | enum SecurityType { 10 | UNKNOWN = 0; 11 | LEGACY = 1; 12 | AUTO = 2; 13 | AES128_GCM = 3; 14 | CHACHA20_POLY1305 = 4; 15 | NONE = 5; 16 | ZERO = 6; 17 | } 18 | 19 | message SecurityConfig { 20 | SecurityType type = 1; 21 | } 22 | -------------------------------------------------------------------------------- /common/protocol/id_test.go: -------------------------------------------------------------------------------- 1 | package protocol_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/protocol" 7 | "github.com/v2fly/v2ray-core/v5/common/uuid" 8 | ) 9 | 10 | func TestIdEquals(t *testing.T) { 11 | id1 := NewID(uuid.New()) 12 | id2 := NewID(id1.UUID()) 13 | 14 | if !id1.Equals(id2) { 15 | t.Error("expected id1 to equal id2, but actually not") 16 | } 17 | 18 | if id1.String() != id2.String() { 19 | t.Error(id1.String(), " != ", id2.String()) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/protocol/payload.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | type TransferType byte 4 | 5 | const ( 6 | TransferTypeStream TransferType = 0 7 | TransferTypePacket TransferType = 1 8 | ) 9 | 10 | type AddressType byte 11 | 12 | const ( 13 | AddressTypeIPv4 AddressType = 1 14 | AddressTypeDomain AddressType = 2 15 | AddressTypeIPv6 AddressType = 3 16 | ) 17 | -------------------------------------------------------------------------------- /common/protocol/protocol.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /common/protocol/server_spec.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.protocol; 4 | option csharp_namespace = "V2Ray.Core.Common.Protocol"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/protocol"; 6 | option java_package = "com.v2ray.core.common.protocol"; 7 | option java_multiple_files = true; 8 | 9 | import "common/net/address.proto"; 10 | import "common/protocol/user.proto"; 11 | 12 | message ServerEndpoint { 13 | v2ray.core.common.net.IPOrDomain address = 1; 14 | uint32 port = 2; 15 | repeated v2ray.core.common.protocol.User user = 3; 16 | } 17 | -------------------------------------------------------------------------------- /common/protocol/time.go: -------------------------------------------------------------------------------- 1 | package protocol 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/dice" 7 | ) 8 | 9 | type Timestamp int64 10 | 11 | type TimestampGenerator func() Timestamp 12 | 13 | func NowTime() Timestamp { 14 | return Timestamp(time.Now().Unix()) 15 | } 16 | 17 | func NewTimestampGenerator(base Timestamp, delta int) TimestampGenerator { 18 | return func() Timestamp { 19 | rangeInDelta := dice.Roll(delta*2) - delta 20 | return base + Timestamp(rangeInDelta) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /common/protocol/time_test.go: -------------------------------------------------------------------------------- 1 | package protocol_test 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | 7 | . "github.com/v2fly/v2ray-core/v5/common/protocol" 8 | ) 9 | 10 | func TestGenerateRandomInt64InRange(t *testing.T) { 11 | base := time.Now().Unix() 12 | delta := 100 13 | generator := NewTimestampGenerator(Timestamp(base), delta) 14 | 15 | for i := 0; i < 100; i++ { 16 | val := int64(generator()) 17 | if val > base+int64(delta) || val < base-int64(delta) { 18 | t.Error(val, " not between ", base-int64(delta), " and ", base+int64(delta)) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/protocol/tls/cert/.gitignore: -------------------------------------------------------------------------------- 1 | *.pem -------------------------------------------------------------------------------- /common/protocol/tls/cert/errors.generated.go: -------------------------------------------------------------------------------- 1 | package cert 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/protocol/udp/packet.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/buf" 5 | "github.com/v2fly/v2ray-core/v5/common/net" 6 | ) 7 | 8 | // Packet is a UDP packet together with its source and destination address. 9 | type Packet struct { 10 | Payload *buf.Buffer 11 | Source net.Destination 12 | Target net.Destination 13 | } 14 | -------------------------------------------------------------------------------- /common/protocol/udp/udp.go: -------------------------------------------------------------------------------- 1 | package udp 2 | -------------------------------------------------------------------------------- /common/protocol/user.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.protocol; 4 | option csharp_namespace = "V2Ray.Core.Common.Protocol"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/protocol"; 6 | option java_package = "com.v2ray.core.common.protocol"; 7 | option java_multiple_files = true; 8 | 9 | import "google/protobuf/any.proto"; 10 | 11 | // User is a generic user for all procotols. 12 | message User { 13 | uint32 level = 1; 14 | string email = 2; 15 | 16 | // Protocol specific account information. Must be the account proto in one of 17 | // the proxies. 18 | google.protobuf.Any account = 3; 19 | } 20 | -------------------------------------------------------------------------------- /common/protoext/errors.generated.go: -------------------------------------------------------------------------------- 1 | package protoext 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/protoext/testing/extension_test.go: -------------------------------------------------------------------------------- 1 | package testing 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | "github.com/v2fly/v2ray-core/v5/common/protoext" 8 | "google.golang.org/protobuf/reflect/protoreflect" 9 | ) 10 | 11 | func TestMessageOpt(t *testing.T) { 12 | msg := TestingMessage{} 13 | opt, err := protoext.GetMessageOptions(msg.ProtoReflect().Descriptor()) 14 | assert.Nil(t, err) 15 | assert.EqualValues(t, []string{"demo", "demo2"}, opt.Type) 16 | } 17 | 18 | func TestFieldOpt(t *testing.T) { 19 | msg := TestingMessage{ 20 | TestField: "Test", 21 | } 22 | msgreflect := msg.ProtoReflect() 23 | msgreflect.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool { 24 | opt, err := protoext.GetFieldOptions(descriptor) 25 | assert.Nil(t, err) 26 | assert.EqualValues(t, []string{"test", "test2"}, opt.AllowedValues) 27 | return true 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /common/protoext/testing/test.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.protoext.testing; 4 | option csharp_namespace = "V2Ray.Core.Common.ProtoExt.Testing"; 5 | option go_package = "github.com/v2fly/v2ray-core/common/protoext/testing"; 6 | option java_package = "com.v2ray.core.common.protoext.testing"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message TestingMessage{ 12 | option (v2ray.core.common.protoext.message_opt).type = "demo"; 13 | option (v2ray.core.common.protoext.message_opt).type = "demo2"; 14 | 15 | string test_field = 1 16 | [(v2ray.core.common.protoext.field_opt).allowed_values = "test", 17 | (v2ray.core.common.protoext.field_opt).allowed_values = "test2"]; 18 | } -------------------------------------------------------------------------------- /common/protofilter/errors.generated.go: -------------------------------------------------------------------------------- 1 | package protofilter 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/registry/errors.generated.go: -------------------------------------------------------------------------------- 1 | package registry 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/retry/errors.generated.go: -------------------------------------------------------------------------------- 1 | package retry 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/serial/resolver.go: -------------------------------------------------------------------------------- 1 | package serial 2 | 3 | import ( 4 | "github.com/golang/protobuf/proto" 5 | ) 6 | 7 | type AnyResolver interface { 8 | Resolve(typeURL string) (proto.Message, error) 9 | } 10 | 11 | type serialResolver struct{} 12 | 13 | func (s serialResolver) Resolve(typeURL string) (proto.Message, error) { 14 | instance, err := GetInstance(typeURL) 15 | if err != nil { 16 | return nil, err 17 | } 18 | return instance.(proto.Message), nil 19 | } 20 | 21 | func GetResolver() AnyResolver { 22 | return &serialResolver{} 23 | } 24 | -------------------------------------------------------------------------------- /common/serial/serial.go: -------------------------------------------------------------------------------- 1 | package serial 2 | 3 | import ( 4 | "encoding/binary" 5 | "io" 6 | ) 7 | 8 | // ReadUint16 reads first two bytes from the reader, and then coverts them to an uint16 value. 9 | func ReadUint16(reader io.Reader) (uint16, error) { 10 | var b [2]byte 11 | if _, err := io.ReadFull(reader, b[:]); err != nil { 12 | return 0, err 13 | } 14 | return binary.BigEndian.Uint16(b[:]), nil 15 | } 16 | 17 | // WriteUint16 writes an uint16 value into writer. 18 | func WriteUint16(writer io.Writer, value uint16) (int, error) { 19 | var b [2]byte 20 | binary.BigEndian.PutUint16(b[:], value) 21 | return writer.Write(b[:]) 22 | } 23 | 24 | // WriteUint64 writes an uint64 value into writer. 25 | func WriteUint64(writer io.Writer, value uint64) (int, error) { 26 | var b [8]byte 27 | binary.BigEndian.PutUint64(b[:], value) 28 | return writer.Write(b[:]) 29 | } 30 | -------------------------------------------------------------------------------- /common/serial/string.go: -------------------------------------------------------------------------------- 1 | package serial 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | ) 7 | 8 | // ToString serialize an arbitrary value into string. 9 | func ToString(v interface{}) string { 10 | if v == nil { 11 | return "" 12 | } 13 | 14 | switch value := v.(type) { 15 | case string: 16 | return value 17 | case *string: 18 | return *value 19 | case fmt.Stringer: 20 | return value.String() 21 | case error: 22 | return value.Error() 23 | default: 24 | return fmt.Sprintf("%+v", value) 25 | } 26 | } 27 | 28 | // Concat concatenates all input into a single string. 29 | func Concat(v ...interface{}) string { 30 | builder := strings.Builder{} 31 | for _, value := range v { 32 | builder.WriteString(ToString(value)) 33 | } 34 | return builder.String() 35 | } 36 | -------------------------------------------------------------------------------- /common/serial/typed_message_test.go: -------------------------------------------------------------------------------- 1 | package serial_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/serial" 7 | ) 8 | 9 | func TestGetInstance(t *testing.T) { 10 | p, err := GetInstance("") 11 | if p != nil { 12 | t.Error("expected nil instance, but got ", p) 13 | } 14 | if err == nil { 15 | t.Error("expect non-nil error, but got nil") 16 | } 17 | } 18 | 19 | func TestConvertingNilMessage(t *testing.T) { 20 | x := ToTypedMessage(nil) 21 | if x != nil { 22 | t.Error("expect nil, but actually not") 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/signal/notifier.go: -------------------------------------------------------------------------------- 1 | package signal 2 | 3 | // Notifier is a utility for notifying changes. The change producer may notify changes multiple time, and the consumer may get notified asynchronously. 4 | type Notifier struct { 5 | c chan struct{} 6 | } 7 | 8 | // NewNotifier creates a new Notifier. 9 | func NewNotifier() *Notifier { 10 | return &Notifier{ 11 | c: make(chan struct{}, 1), 12 | } 13 | } 14 | 15 | // Signal signals a change, usually by producer. This method never blocks. 16 | func (n *Notifier) Signal() { 17 | select { 18 | case n.c <- struct{}{}: 19 | default: 20 | } 21 | } 22 | 23 | // Wait returns a channel for waiting for changes. The returned channel never gets closed. 24 | func (n *Notifier) Wait() <-chan struct{} { 25 | return n.c 26 | } 27 | -------------------------------------------------------------------------------- /common/signal/notifier_test.go: -------------------------------------------------------------------------------- 1 | package signal_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/signal" 7 | ) 8 | 9 | func TestNotifierSignal(t *testing.T) { 10 | n := NewNotifier() 11 | 12 | w := n.Wait() 13 | n.Signal() 14 | 15 | select { 16 | case <-w: 17 | default: 18 | t.Fail() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/signal/pubsub/pubsub_test.go: -------------------------------------------------------------------------------- 1 | package pubsub_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/common/signal/pubsub" 7 | ) 8 | 9 | func TestPubsub(t *testing.T) { 10 | service := NewService() 11 | 12 | sub := service.Subscribe("a") 13 | service.Publish("a", 1) 14 | 15 | select { 16 | case v := <-sub.Wait(): 17 | if v != 1 { 18 | t.Error("expected subscribed value 1, but got ", v) 19 | } 20 | default: 21 | t.Fail() 22 | } 23 | 24 | sub.Close() 25 | service.Publish("a", 2) 26 | 27 | select { 28 | case <-sub.Wait(): 29 | t.Fail() 30 | default: 31 | } 32 | 33 | service.Cleanup() 34 | } 35 | -------------------------------------------------------------------------------- /common/signal/semaphore/semaphore.go: -------------------------------------------------------------------------------- 1 | package semaphore 2 | 3 | // Instance is an implementation of semaphore. 4 | type Instance struct { 5 | token chan struct{} 6 | } 7 | 8 | // New create a new Semaphore with n permits. 9 | func New(n int) *Instance { 10 | s := &Instance{ 11 | token: make(chan struct{}, n), 12 | } 13 | for i := 0; i < n; i++ { 14 | s.token <- struct{}{} 15 | } 16 | return s 17 | } 18 | 19 | // Wait returns a channel for acquiring a permit. 20 | func (s *Instance) Wait() <-chan struct{} { 21 | return s.token 22 | } 23 | 24 | // Signal releases a permit into the semaphore. 25 | func (s *Instance) Signal() { 26 | s.token <- struct{}{} 27 | } 28 | -------------------------------------------------------------------------------- /common/strmatcher/matchergroup_full.go: -------------------------------------------------------------------------------- 1 | package strmatcher 2 | 3 | // FullMatcherGroup is an implementation of MatcherGroup. 4 | // It uses a hash table to facilitate exact match lookup. 5 | type FullMatcherGroup struct { 6 | matchers map[string][]uint32 7 | } 8 | 9 | // AddFullMatcher implements MatcherGroupForFull.AddFullMatcher. 10 | func (g *FullMatcherGroup) AddFullMatcher(matcher FullMatcher, value uint32) { 11 | if g.matchers == nil { 12 | g.matchers = make(map[string][]uint32) 13 | } 14 | 15 | domain := matcher.Pattern() 16 | g.matchers[domain] = append(g.matchers[domain], value) 17 | } 18 | 19 | // Match implements MatcherGroup.Match. 20 | func (g *FullMatcherGroup) Match(input string) []uint32 { 21 | if g.matchers == nil { 22 | return nil 23 | } 24 | return g.matchers[input] 25 | } 26 | 27 | // MatchAny implements MatcherGroup.Any. 28 | func (g *FullMatcherGroup) MatchAny(input string) bool { 29 | return len(g.Match(input)) > 0 30 | } 31 | -------------------------------------------------------------------------------- /common/taggedfeatures/errors.generated.go: -------------------------------------------------------------------------------- 1 | package taggedfeatures 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /common/taggedfeatures/skeleton.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.common.taggedfeatures; 4 | option csharp_namespace = "V2Ray.Core.Common.Taggedfeatures"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/common/taggedfeatures"; 6 | option java_package = "com.v2ray.core.common.taggedfeatures"; 7 | option java_multiple_files = true; 8 | 9 | import "google/protobuf/any.proto"; 10 | 11 | message Config { 12 | map features = 1; 13 | } -------------------------------------------------------------------------------- /common/taggedfeatures/taggedfeatures.go: -------------------------------------------------------------------------------- 1 | package taggedfeatures 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /common/task/common.go: -------------------------------------------------------------------------------- 1 | package task 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common" 4 | 5 | // Close returns a func() that closes v. 6 | func Close(v interface{}) func() error { 7 | return func() error { 8 | return common.Close(v) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /context_test.go: -------------------------------------------------------------------------------- 1 | package core_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | _ "unsafe" 7 | 8 | . "github.com/v2fly/v2ray-core/v5" 9 | ) 10 | 11 | func TestFromContextPanic(t *testing.T) { 12 | defer func() { 13 | r := recover() 14 | if r == nil { 15 | t.Error("expect panic, but nil") 16 | } 17 | }() 18 | 19 | MustFromContext(context.Background()) 20 | } 21 | -------------------------------------------------------------------------------- /errors.generated.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /features/dns/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.features.dns; 4 | option csharp_namespace = "V2Ray.Core.Features.Dns"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/features/dns"; 6 | option java_package = "com.v2ray.core.features.dns"; 7 | option java_multiple_files = true; 8 | 9 | enum QueryStrategy { 10 | USE_IP = 0; 11 | USE_IP4 = 1; 12 | USE_IP6 = 2; 13 | PREFER_IP4 = 3; 14 | PREFER_IP6 = 4; 15 | } -------------------------------------------------------------------------------- /features/errors.generated.go: -------------------------------------------------------------------------------- 1 | package features 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /features/extension/browser.go: -------------------------------------------------------------------------------- 1 | package extension 2 | 3 | import ( 4 | "io" 5 | "net/http" 6 | ) 7 | 8 | type BrowserForwarder interface { 9 | DialWebsocket(url string, header http.Header) (io.ReadWriteCloser, error) 10 | } 11 | 12 | func BrowserForwarderType() interface{} { 13 | return (*BrowserForwarder)(nil) 14 | } 15 | -------------------------------------------------------------------------------- /features/extension/contextreceiver.go: -------------------------------------------------------------------------------- 1 | package extension 2 | 3 | import "context" 4 | 5 | type ContextReceiver interface { 6 | InjectContext(ctx context.Context) 7 | } 8 | -------------------------------------------------------------------------------- /features/extension/instance.go: -------------------------------------------------------------------------------- 1 | package extension 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/features" 7 | ) 8 | 9 | // InstanceManagement : unstable 10 | type InstanceManagement interface { 11 | features.Feature 12 | ListInstance(ctx context.Context) ([]string, error) 13 | AddInstance(ctx context.Context, name string, config []byte, configType string) error 14 | StartInstance(ctx context.Context, name string) error 15 | StopInstance(ctx context.Context, name string) error 16 | UntrackInstance(ctx context.Context, name string) error 17 | } 18 | 19 | func InstanceManagementType() interface{} { 20 | return (*InstanceManagement)(nil) 21 | } 22 | -------------------------------------------------------------------------------- /features/extension/observatory.go: -------------------------------------------------------------------------------- 1 | package extension 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/golang/protobuf/proto" 7 | "github.com/v2fly/v2ray-core/v5/features" 8 | ) 9 | 10 | type Observatory interface { 11 | features.Feature 12 | GetObservation(ctx context.Context) (proto.Message, error) 13 | } 14 | 15 | func ObservatoryType() interface{} { 16 | return (*Observatory)(nil) 17 | } 18 | -------------------------------------------------------------------------------- /features/extension/storage.go: -------------------------------------------------------------------------------- 1 | package extension 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/features" 7 | ) 8 | 9 | type PersistentStorageEngine interface { 10 | features.Feature 11 | PersistentStorageEngine() 12 | Put(ctx context.Context, key []byte, value []byte) error 13 | Get(ctx context.Context, key []byte) ([]byte, error) 14 | List(ctx context.Context, keyPrefix []byte) ([][]byte, error) 15 | } 16 | -------------------------------------------------------------------------------- /features/feature.go: -------------------------------------------------------------------------------- 1 | package features 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common" 4 | 5 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 6 | 7 | // Feature is the interface for V2Ray features. All features must implement this interface. 8 | // All existing features have an implementation in app directory. These features can be replaced by third-party ones. 9 | type Feature interface { 10 | common.HasType 11 | common.Runnable 12 | } 13 | 14 | // PrintDeprecatedFeatureWarning prints a warning for deprecated feature. 15 | func PrintDeprecatedFeatureWarning(feature string) { 16 | newError("You are using a deprecated feature: " + feature + ". Please update your config file with latest configuration format, or update your client software.").WriteToLog() 17 | } 18 | 19 | // TaggedFeatures unstable 20 | type TaggedFeatures interface { 21 | GetFeaturesByTag(tag string) (Feature, error) 22 | common.Runnable 23 | } 24 | -------------------------------------------------------------------------------- /features/ping/manager.go: -------------------------------------------------------------------------------- 1 | package ping 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/net" 5 | "github.com/v2fly/v2ray-core/v5/features" 6 | "github.com/v2fly/v2ray-core/v5/transport/internet" 7 | ) 8 | 9 | type Manager interface { 10 | features.Feature 11 | Dial(destination net.Destination) (internet.Connection, error) 12 | } 13 | 14 | func ManagerType() interface{} { 15 | return (*Manager)(nil) 16 | } 17 | -------------------------------------------------------------------------------- /features/policy/default.go: -------------------------------------------------------------------------------- 1 | package policy 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | // DefaultManager is the implementation of the Manager. 8 | type DefaultManager struct{} 9 | 10 | // Type implements common.HasType. 11 | func (DefaultManager) Type() interface{} { 12 | return ManagerType() 13 | } 14 | 15 | // ForLevel implements Manager. 16 | func (DefaultManager) ForLevel(level uint32) Session { 17 | p := SessionDefault() 18 | if level == 1 { 19 | p.Timeouts.ConnectionIdle = time.Second * 600 20 | } 21 | return p 22 | } 23 | 24 | // ForSystem implements Manager. 25 | func (DefaultManager) ForSystem() System { 26 | return System{} 27 | } 28 | 29 | // Start implements common.Runnable. 30 | func (DefaultManager) Start() error { 31 | return nil 32 | } 33 | 34 | // Close implements common.Closable. 35 | func (DefaultManager) Close() error { 36 | return nil 37 | } 38 | -------------------------------------------------------------------------------- /features/routing/balancer.go: -------------------------------------------------------------------------------- 1 | package routing 2 | 3 | type BalancerOverrider interface { 4 | SetOverrideTarget(tag, target string) error 5 | GetOverrideTarget(tag string) (string, error) 6 | } 7 | 8 | type BalancerPrincipleTarget interface { 9 | GetPrincipleTarget(tag string) ([]string, error) 10 | } 11 | -------------------------------------------------------------------------------- /features/routing/dns/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /features/stats/errors.generated.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /format.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | //go:generate go install -v github.com/daixiang0/gci@latest 4 | //go:generate go install -v mvdan.cc/gofumpt@latest 5 | //go:generate go run ./infra/vformat/ 6 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/buildable.go: -------------------------------------------------------------------------------- 1 | package cfgcommon 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/golang/protobuf/proto" 7 | ) 8 | 9 | type Buildable interface { 10 | Build() (proto.Message, error) 11 | } 12 | 13 | type BuildableV5 interface { 14 | BuildV5(ctx context.Context) (proto.Message, error) 15 | } 16 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/duration/duration.go: -------------------------------------------------------------------------------- 1 | package duration 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "time" 7 | ) 8 | 9 | type Duration int64 10 | 11 | func (d *Duration) MarshalJSON() ([]byte, error) { 12 | dr := time.Duration(*d) 13 | return json.Marshal(dr.String()) 14 | } 15 | 16 | func (d *Duration) UnmarshalJSON(b []byte) error { 17 | var v interface{} 18 | if err := json.Unmarshal(b, &v); err != nil { 19 | return err 20 | } 21 | switch value := v.(type) { 22 | case string: 23 | var err error 24 | dr, err := time.ParseDuration(value) 25 | if err != nil { 26 | return err 27 | } 28 | *d = Duration(dr) 29 | return nil 30 | default: 31 | return fmt.Errorf("invalid duration: %v", v) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/duration/duration_test.go: -------------------------------------------------------------------------------- 1 | package duration_test 2 | 3 | import ( 4 | "encoding/json" 5 | "testing" 6 | "time" 7 | 8 | "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon/duration" 9 | ) 10 | 11 | type testWithDuration struct { 12 | Duration duration.Duration 13 | } 14 | 15 | func TestDurationJSON(t *testing.T) { 16 | expected := &testWithDuration{ 17 | Duration: duration.Duration(time.Hour), 18 | } 19 | data, err := json.Marshal(expected) 20 | if err != nil { 21 | t.Error(err) 22 | return 23 | } 24 | actual := &testWithDuration{} 25 | err = json.Unmarshal(data, &actual) 26 | if err != nil { 27 | t.Error(err) 28 | return 29 | } 30 | if actual.Duration != expected.Duration { 31 | t.Errorf("expected: %s, actual: %s", time.Duration(expected.Duration), time.Duration(actual.Duration)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/errors.generated.go: -------------------------------------------------------------------------------- 1 | package cfgcommon 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/loader/errors.generated.go: -------------------------------------------------------------------------------- 1 | package loader 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/proxycfg/errors.generated.go: -------------------------------------------------------------------------------- 1 | package proxycfg 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/proxycfg/proxy.go: -------------------------------------------------------------------------------- 1 | package proxycfg 2 | 3 | import "github.com/v2fly/v2ray-core/v5/transport/internet" 4 | 5 | type ProxyConfig struct { 6 | Tag string `json:"tag"` 7 | TransportLayerProxy bool `json:"transportLayer"` 8 | } 9 | 10 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 11 | 12 | // Build implements Buildable. 13 | func (v *ProxyConfig) Build() (*internet.ProxyConfig, error) { 14 | if v.Tag == "" { 15 | return nil, newError("Proxy tag is not set.") 16 | } 17 | return &internet.ProxyConfig{ 18 | Tag: v.Tag, 19 | TransportLayerProxy: v.TransportLayerProxy, 20 | }, nil 21 | } 22 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/sniffer/errors.generated.go: -------------------------------------------------------------------------------- 1 | package sniffer 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/cfgcommon/tlscfg/errors.generated.go: -------------------------------------------------------------------------------- 1 | package tlscfg 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/geodata/errors.generated.go: -------------------------------------------------------------------------------- 1 | package geodata 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/geodata/geodataproto.go: -------------------------------------------------------------------------------- 1 | package geodata 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/app/router/routercommon" 5 | ) 6 | 7 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 8 | 9 | type LoaderImplementation interface { 10 | LoadSite(filename, list string) ([]*routercommon.Domain, error) 11 | LoadIP(filename, country string) ([]*routercommon.CIDR, error) 12 | } 13 | 14 | type Loader interface { 15 | LoaderImplementation 16 | LoadGeoSite(list string) ([]*routercommon.Domain, error) 17 | LoadGeoSiteWithAttr(file string, siteWithAttr string) ([]*routercommon.Domain, error) 18 | LoadGeoIP(country string) ([]*routercommon.CIDR, error) 19 | } 20 | -------------------------------------------------------------------------------- /infra/conf/geodata/memconservative/errors.generated.go: -------------------------------------------------------------------------------- 1 | package memconservative 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/geodata/standard/errors.generated.go: -------------------------------------------------------------------------------- 1 | package standard 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/jsonpb/errors.generated.go: -------------------------------------------------------------------------------- 1 | package jsonpb 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/merge/errors.generated.go: -------------------------------------------------------------------------------- 1 | package merge 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/merge/priority.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 Jebbs. All rights reserved. 2 | // Use of this source code is governed by MIT 3 | // license that can be found in the LICENSE file. 4 | 5 | package merge 6 | 7 | import "sort" 8 | 9 | func getPriority(v interface{}) float64 { 10 | var m map[string]interface{} 11 | var ok bool 12 | if m, ok = v.(map[string]interface{}); !ok { 13 | return 0 14 | } 15 | if i, ok := m[priorityKey]; ok { 16 | if p, ok := i.(float64); ok { 17 | return p 18 | } 19 | } 20 | return 0 21 | } 22 | 23 | // sortByPriority sort slice by priority fields of their elements 24 | func sortByPriority(slice []interface{}) { 25 | sort.Slice( 26 | slice, 27 | func(i, j int) bool { 28 | return getPriority(slice[i]) < getPriority(slice[j]) 29 | }, 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /infra/conf/mergers/errors.generated.go: -------------------------------------------------------------------------------- 1 | package mergers 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/mergers/extensions.go: -------------------------------------------------------------------------------- 1 | package mergers 2 | 3 | import "strings" 4 | 5 | // GetExtensions get extensions of given format 6 | func GetExtensions(formatName string) ([]string, error) { 7 | lowerName := strings.ToLower(formatName) 8 | if lowerName == "auto" { 9 | return GetAllExtensions(), nil 10 | } 11 | f, found := mergersByName[lowerName] 12 | if !found { 13 | return nil, newError(formatName+" not found", formatName).AtWarning() 14 | } 15 | return f.Extensions, nil 16 | } 17 | 18 | // GetAllExtensions get all extensions supported 19 | func GetAllExtensions() []string { 20 | extensions := make([]string, 0) 21 | for _, f := range mergersByName { 22 | extensions = append(extensions, f.Extensions...) 23 | } 24 | return extensions 25 | } 26 | -------------------------------------------------------------------------------- /infra/conf/mergers/names.go: -------------------------------------------------------------------------------- 1 | package mergers 2 | 3 | // GetAllNames get names of all formats 4 | func GetAllNames() []string { 5 | names := make([]string, 0) 6 | for _, f := range mergersByName { 7 | names = append(names, f.Name) 8 | } 9 | return names 10 | } 11 | -------------------------------------------------------------------------------- /infra/conf/rule/errors.generated.go: -------------------------------------------------------------------------------- 1 | package rule 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/serial/errors.generated.go: -------------------------------------------------------------------------------- 1 | package serial 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/serial/serial.go: -------------------------------------------------------------------------------- 1 | package serial 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /infra/conf/synthetic/dns/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/synthetic/router/errors.generated.go: -------------------------------------------------------------------------------- 1 | package router 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/v2jsonpb/errors.generated.go: -------------------------------------------------------------------------------- 1 | package v2jsonpb 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/v4/browser_forwarder.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import ( 4 | "strings" 5 | 6 | "github.com/golang/protobuf/proto" 7 | "github.com/v2fly/v2ray-core/v5/app/browserforwarder" 8 | ) 9 | 10 | type BrowserForwarderConfig struct { 11 | ListenAddr string `json:"listenAddr"` 12 | ListenPort int32 `json:"listenPort"` 13 | } 14 | 15 | func (b *BrowserForwarderConfig) Build() (proto.Message, error) { 16 | b.ListenAddr = strings.TrimSpace(b.ListenAddr) 17 | if b.ListenAddr != "" && b.ListenPort == 0 { 18 | b.ListenPort = 54321 19 | } 20 | return &browserforwarder.Config{ 21 | ListenAddr: b.ListenAddr, 22 | ListenPort: b.ListenPort, 23 | }, nil 24 | } 25 | -------------------------------------------------------------------------------- /infra/conf/v4/conf.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /infra/conf/v4/dns_proxy.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import ( 4 | "github.com/golang/protobuf/proto" 5 | "github.com/v2fly/v2ray-core/v5/common/net" 6 | "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon" 7 | "github.com/v2fly/v2ray-core/v5/proxy/dns" 8 | ) 9 | 10 | type DNSOutboundConfig struct { 11 | Network cfgcommon.Network `json:"network"` 12 | Address *cfgcommon.Address `json:"address"` 13 | Port uint16 `json:"port"` 14 | UserLevel uint32 `json:"userLevel"` 15 | } 16 | 17 | func (c *DNSOutboundConfig) Build() (proto.Message, error) { 18 | config := &dns.Config{ 19 | Server: &net.Endpoint{ 20 | Network: c.Network.Build(), 21 | Port: uint32(c.Port), 22 | }, 23 | UserLevel: c.UserLevel, 24 | } 25 | if c.Address != nil { 26 | config.Server.Address = c.Address.Build() 27 | } 28 | return config, nil 29 | } 30 | -------------------------------------------------------------------------------- /infra/conf/v4/dns_proxy_test.go: -------------------------------------------------------------------------------- 1 | package v4_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/net" 7 | "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon" 8 | "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon/testassist" 9 | v4 "github.com/v2fly/v2ray-core/v5/infra/conf/v4" 10 | "github.com/v2fly/v2ray-core/v5/proxy/dns" 11 | ) 12 | 13 | func TestDnsProxyConfig(t *testing.T) { 14 | creator := func() cfgcommon.Buildable { 15 | return new(v4.DNSOutboundConfig) 16 | } 17 | 18 | testassist.RunMultiTestCase(t, []testassist.TestCase{ 19 | { 20 | Input: `{ 21 | "address": "8.8.8.8", 22 | "port": 53, 23 | "network": "tcp" 24 | }`, 25 | Parser: testassist.LoadJSON(creator), 26 | Output: &dns.Config{ 27 | Server: &net.Endpoint{ 28 | Network: net.Network_TCP, 29 | Address: net.NewIPOrDomain(net.IPAddress([]byte{8, 8, 8, 8})), 30 | Port: 53, 31 | }, 32 | }, 33 | }, 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /infra/conf/v4/errors.generated.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/v4/lint.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | type ConfigureFilePostProcessingStage interface { 4 | Process(conf *Config) error 5 | } 6 | 7 | var configureFilePostProcessingStages map[string]ConfigureFilePostProcessingStage 8 | 9 | func RegisterConfigureFilePostProcessingStage(name string, stage ConfigureFilePostProcessingStage) { 10 | if configureFilePostProcessingStages == nil { 11 | configureFilePostProcessingStages = make(map[string]ConfigureFilePostProcessingStage) 12 | } 13 | configureFilePostProcessingStages[name] = stage 14 | } 15 | 16 | func PostProcessConfigureFile(conf *Config) error { 17 | for k, v := range configureFilePostProcessingStages { 18 | if err := v.Process(conf); err != nil { 19 | return newError("Rejected by Postprocessing Stage ", k).AtError().Base(err) 20 | } 21 | } 22 | return nil 23 | } 24 | -------------------------------------------------------------------------------- /infra/conf/v4/loopback.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import ( 4 | "github.com/golang/protobuf/proto" 5 | "github.com/v2fly/v2ray-core/v5/proxy/loopback" 6 | ) 7 | 8 | type LoopbackConfig struct { 9 | InboundTag string `json:"inboundTag"` 10 | } 11 | 12 | func (l LoopbackConfig) Build() (proto.Message, error) { 13 | return &loopback.Config{InboundTag: l.InboundTag}, nil 14 | } 15 | -------------------------------------------------------------------------------- /infra/conf/v4/ping.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import ( 4 | "github.com/golang/protobuf/proto" 5 | "github.com/v2fly/v2ray-core/v5/common/net/pingproto" 6 | ) 7 | 8 | type PingConfig struct { 9 | Protocol string `json:"protocol"` 10 | Gateway4 string `json:"gateway4"` 11 | Gateway6 string `json:"gateway6"` 12 | DisableIPv6 bool `json:"disableIPv6"` 13 | } 14 | 15 | func (c *PingConfig) Build() (proto.Message, error) { 16 | config := pingproto.Config{ 17 | Gateway4: c.Gateway4, 18 | Gateway6: c.Gateway6, 19 | DisableIPv6: c.DisableIPv6, 20 | } 21 | switch c.Protocol { 22 | case "unprivileged": 23 | config.Protocol = pingproto.Protocol_Unprivileged 24 | case "default", "": 25 | config.Protocol = pingproto.Protocol_Default 26 | default: 27 | return nil, newError("unknown icmp listen protocol ", c.Protocol) 28 | } 29 | 30 | return &config, nil 31 | } 32 | -------------------------------------------------------------------------------- /infra/conf/v4/policy_test.go: -------------------------------------------------------------------------------- 1 | package v4_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | v4 "github.com/v2fly/v2ray-core/v5/infra/conf/v4" 8 | ) 9 | 10 | func TestBufferSize(t *testing.T) { 11 | cases := []struct { 12 | Input int32 13 | Output int32 14 | }{ 15 | { 16 | Input: 0, 17 | Output: 0, 18 | }, 19 | { 20 | Input: -1, 21 | Output: -1, 22 | }, 23 | { 24 | Input: 1, 25 | Output: 1024, 26 | }, 27 | } 28 | 29 | for _, c := range cases { 30 | bs := c.Input 31 | pConf := v4.Policy{ 32 | BufferSize: &bs, 33 | } 34 | p, err := pConf.Build() 35 | common.Must(err) 36 | if p.Buffer.Connection != c.Output { 37 | t.Error("expected buffer size ", c.Output, " but got ", p.Buffer.Connection) 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /infra/conf/v4/trojan_sing.go: -------------------------------------------------------------------------------- 1 | package v4 2 | 3 | import ( 4 | "github.com/golang/protobuf/proto" 5 | "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon" 6 | "github.com/v2fly/v2ray-core/v5/proxy/trojan_sing" 7 | ) 8 | 9 | type TrojanSingClientConfig struct { 10 | Address *cfgcommon.Address `json:"address"` 11 | Port uint16 `json:"port"` 12 | Password string `json:"password"` 13 | ServerName string `json:"serverName"` 14 | NextProtos []string `json:"nextProtos"` 15 | Insecure bool `json:"insecure"` 16 | } 17 | 18 | func (v *TrojanSingClientConfig) Build() (proto.Message, error) { 19 | return &trojan_sing.ClientConfig{ 20 | Address: v.Address.Build(), 21 | Port: uint32(v.Port), 22 | Password: v.Password, 23 | ServerName: v.ServerName, 24 | NextProtos: v.NextProtos, 25 | Insecure: v.Insecure, 26 | }, nil 27 | } 28 | -------------------------------------------------------------------------------- /infra/conf/v5cfg/errors.generated.go: -------------------------------------------------------------------------------- 1 | package v5cfg 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /infra/conf/v5cfg/v5cfg.go: -------------------------------------------------------------------------------- 1 | package v5cfg 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /main/commands/all/api/api.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 5 | ) 6 | 7 | // CmdAPI calls an API in an V2Ray process 8 | var CmdAPI = &base.Command{ 9 | UsageLine: "{{.Exec}} api", 10 | Short: "call V2Ray API", 11 | Long: `{{.Exec}} {{.LongName}} provides tools to manipulate V2Ray via its API. 12 | `, 13 | Commands: []*base.Command{ 14 | cmdLog, 15 | cmdStats, 16 | cmdBalancerInfo, 17 | cmdBalancerOverride, 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /main/commands/all/api/jsonv4/init.go: -------------------------------------------------------------------------------- 1 | package jsonv4 2 | 3 | import "github.com/v2fly/v2ray-core/v5/main/commands/all/api" 4 | 5 | func init() { 6 | api.CmdAPI.Commands = append(api.CmdAPI.Commands, 7 | cmdAddInbounds, 8 | cmdAddOutbounds, 9 | cmdRemoveInbounds, 10 | cmdRemoveOutbounds) 11 | } 12 | -------------------------------------------------------------------------------- /main/commands/all/commands.go: -------------------------------------------------------------------------------- 1 | package all 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/main/commands/all/api" 5 | "github.com/v2fly/v2ray-core/v5/main/commands/all/tls" 6 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 7 | ) 8 | 9 | //go:generate go run v2ray.com/core/common/errors/errorgen 10 | 11 | func init() { 12 | base.RootCommand.Commands = append( 13 | base.RootCommand.Commands, 14 | api.CmdAPI, 15 | cmdLove, 16 | tls.CmdTLS, 17 | cmdUUID, 18 | cmdVerify, 19 | 20 | // documents 21 | docFormat, 22 | docMerge, 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /main/commands/all/engineering/engineering.go: -------------------------------------------------------------------------------- 1 | package engineering 2 | 3 | import "github.com/v2fly/v2ray-core/v5/main/commands/base" 4 | 5 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 6 | 7 | var cmdEngineering = &base.Command{ 8 | UsageLine: "{{.Exec}} engineering", 9 | Commands: []*base.Command{ 10 | cmdConvertPb, 11 | cmdReversePb, 12 | }, 13 | } 14 | 15 | func init() { 16 | base.RegisterCommand(cmdEngineering) 17 | } 18 | -------------------------------------------------------------------------------- /main/commands/all/engineering/errors.generated.go: -------------------------------------------------------------------------------- 1 | package engineering 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /main/commands/all/errors.generated.go: -------------------------------------------------------------------------------- 1 | package all 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /main/commands/all/jsonv4/init.go: -------------------------------------------------------------------------------- 1 | package jsonv4 2 | 3 | import "github.com/v2fly/v2ray-core/v5/main/commands/base" 4 | 5 | func init() { 6 | base.RegisterCommand(cmdConvert) 7 | } 8 | -------------------------------------------------------------------------------- /main/commands/all/tls/tls.go: -------------------------------------------------------------------------------- 1 | package tls 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 5 | ) 6 | 7 | // CmdTLS holds all tls sub commands 8 | var CmdTLS = &base.Command{ 9 | UsageLine: "{{.Exec}} tls", 10 | Short: "TLS tools", 11 | Long: `{{.Exec}} {{.LongName}} provides tools for TLS. 12 | `, 13 | 14 | Commands: []*base.Command{ 15 | cmdCert, 16 | cmdPing, 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /main/commands/all/uuid.go: -------------------------------------------------------------------------------- 1 | package all 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/uuid" 7 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 8 | ) 9 | 10 | var cmdUUID = &base.Command{ 11 | UsageLine: "{{.Exec}} uuid", 12 | Short: "generate new UUID", 13 | Long: `Generate new UUID. 14 | `, 15 | Run: executeUUID, 16 | } 17 | 18 | func executeUUID(cmd *base.Command, args []string) { 19 | u := uuid.New() 20 | fmt.Println(u.String()) 21 | } 22 | -------------------------------------------------------------------------------- /main/commands/base/env.go: -------------------------------------------------------------------------------- 1 | package base 2 | 3 | import ( 4 | "os" 5 | "path" 6 | ) 7 | 8 | // CommandEnvHolder is a struct holds the environment info of commands 9 | type CommandEnvHolder struct { 10 | // Excutable name of current binary 11 | Exec string 12 | // commands column width of current command 13 | CommandsWidth int 14 | } 15 | 16 | // CommandEnv holds the environment info of commands 17 | var CommandEnv CommandEnvHolder 18 | 19 | func init() { 20 | exec, err := os.Executable() 21 | if err != nil { 22 | return 23 | } 24 | CommandEnv.Exec = path.Base(exec) 25 | } 26 | -------------------------------------------------------------------------------- /main/commands/base/root.go: -------------------------------------------------------------------------------- 1 | package base 2 | 3 | // RootCommand is the root command of all commands 4 | var RootCommand *Command 5 | 6 | func init() { 7 | RootCommand = &Command{ 8 | UsageLine: CommandEnv.Exec, 9 | Long: "The root command", 10 | } 11 | } 12 | 13 | // RegisterCommand register a command to RootCommand 14 | func RegisterCommand(cmd *Command) { 15 | RootCommand.Commands = append(RootCommand.Commands, cmd) 16 | } 17 | -------------------------------------------------------------------------------- /main/commands/errors.generated.go: -------------------------------------------------------------------------------- 1 | package commands 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /main/commands/version.go: -------------------------------------------------------------------------------- 1 | package commands 2 | 3 | import ( 4 | "fmt" 5 | 6 | core "github.com/v2fly/v2ray-core/v5" 7 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 8 | ) 9 | 10 | // CmdVersion prints V2Ray Versions 11 | var CmdVersion = &base.Command{ 12 | UsageLine: "{{.Exec}} version", 13 | Short: "print V2Ray version", 14 | Long: `Prints the build information for V2Ray. 15 | `, 16 | Run: executeVersion, 17 | } 18 | 19 | func executeVersion(cmd *base.Command, args []string) { 20 | printVersion() 21 | } 22 | 23 | func printVersion() { 24 | version := core.VersionStatement() 25 | for _, s := range version { 26 | fmt.Println(s) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /main/distro/debug/debug.go: -------------------------------------------------------------------------------- 1 | package debug 2 | 3 | import ( 4 | "net/http" 5 | ) 6 | 7 | func init() { 8 | go func() { 9 | http.ListenAndServe(":6060", nil) 10 | }() 11 | } 12 | -------------------------------------------------------------------------------- /main/errors.generated.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /main/formats/errors.generated.go: -------------------------------------------------------------------------------- 1 | package formats 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /main/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/main/commands" 5 | "github.com/v2fly/v2ray-core/v5/main/commands/base" 6 | _ "github.com/v2fly/v2ray-core/v5/main/distro/all" 7 | ) 8 | 9 | func main() { 10 | base.RootCommand.Long = "A unified platform for anti-censorship." 11 | base.RegisterCommand(commands.CmdRun) 12 | base.RegisterCommand(commands.CmdVersion) 13 | base.RegisterCommand(commands.CmdTest) 14 | base.SortLessFunc = runIsTheFirst 15 | base.SortCommands() 16 | base.Execute() 17 | } 18 | 19 | func runIsTheFirst(i, j *base.Command) bool { 20 | left := i.Name() 21 | right := j.Name() 22 | if left == "run" { 23 | return true 24 | } 25 | if right == "run" { 26 | return false 27 | } 28 | return left < right 29 | } 30 | -------------------------------------------------------------------------------- /main/main_test.go: -------------------------------------------------------------------------------- 1 | //go:build coveragemain 2 | // +build coveragemain 3 | 4 | package main 5 | 6 | import ( 7 | "testing" 8 | ) 9 | 10 | func TestRunMainForCoverage(t *testing.T) { 11 | main() 12 | } 13 | -------------------------------------------------------------------------------- /main/v2binding/v2api/api.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/v2fly/v2ray-core/v5/main/v2binding" 7 | ) 8 | 9 | func main() { 10 | v2binding.StartAPIInstance(".") 11 | for { 12 | time.Sleep(time.Minute) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /proto.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | //go:generate go install -v google.golang.org/protobuf/cmd/protoc-gen-go@latest 4 | //go:generate go install -v google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest 5 | //go:generate go run ./infra/vprotogen/ 6 | -------------------------------------------------------------------------------- /proxy/blackhole/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.blackhole; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Blackhole"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/blackhole"; 6 | option java_package = "com.v2ray.core.proxy.blackhole"; 7 | option java_multiple_files = true; 8 | 9 | import "google/protobuf/any.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | message NoneResponse {} 13 | 14 | message HTTPResponse {} 15 | 16 | message Config { 17 | google.protobuf.Any response = 1; 18 | } 19 | 20 | 21 | message SimplifiedConfig { 22 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 23 | option (v2ray.core.common.protoext.message_opt).short_name = "blackhole"; 24 | } -------------------------------------------------------------------------------- /proxy/blackhole/config_test.go: -------------------------------------------------------------------------------- 1 | package blackhole_test 2 | 3 | import ( 4 | "bufio" 5 | "net/http" 6 | "testing" 7 | 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | "github.com/v2fly/v2ray-core/v5/common/buf" 10 | . "github.com/v2fly/v2ray-core/v5/proxy/blackhole" 11 | ) 12 | 13 | func TestHTTPResponse(t *testing.T) { 14 | buffer := buf.New() 15 | 16 | httpResponse := new(HTTPResponse) 17 | httpResponse.WriteTo(buf.NewWriter(buffer)) 18 | 19 | reader := bufio.NewReader(buffer) 20 | response, err := http.ReadResponse(reader, nil) 21 | common.Must(err) 22 | defer response.Body.Close() 23 | 24 | if response.StatusCode != 403 { 25 | t.Error("expected status code 403, but got ", response.StatusCode) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /proxy/blackhole/errors.generated.go: -------------------------------------------------------------------------------- 1 | package blackhole 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/dns/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.dns; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Dns"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/dns"; 6 | option java_package = "com.v2ray.core.proxy.dns"; 7 | option java_multiple_files = true; 8 | 9 | import "common/net/destination.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | message Config { 13 | // Server is the DNS server address. If specified, this address overrides the 14 | // original one. 15 | v2ray.core.common.net.Endpoint server = 1; 16 | uint32 user_level = 2; 17 | } 18 | 19 | message SimplifiedConfig { 20 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 21 | option (v2ray.core.common.protoext.message_opt).short_name = "dns"; 22 | } -------------------------------------------------------------------------------- /proxy/dns/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/dokodemo/config.go: -------------------------------------------------------------------------------- 1 | package dokodemo 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/net" 5 | ) 6 | 7 | // GetPredefinedAddress returns the defined address from proto config. Null if address is not valid. 8 | func (v *Config) GetPredefinedAddress() net.Address { 9 | addr := v.Address.AsAddress() 10 | if addr == nil { 11 | return nil 12 | } 13 | return addr 14 | } 15 | -------------------------------------------------------------------------------- /proxy/dokodemo/errors.generated.go: -------------------------------------------------------------------------------- 1 | package dokodemo 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/freedom/config.go: -------------------------------------------------------------------------------- 1 | package freedom 2 | 3 | func (c *Config) useIP() bool { 4 | return c.DomainStrategy == Config_USE_IP || c.DomainStrategy == Config_USE_IP4 || c.DomainStrategy == Config_USE_IP6 5 | } 6 | -------------------------------------------------------------------------------- /proxy/freedom/errors.generated.go: -------------------------------------------------------------------------------- 1 | package freedom 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/http/config.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/protocol" 5 | ) 6 | 7 | func (a *Account) Equals(another protocol.Account) bool { 8 | if account, ok := another.(*Account); ok { 9 | return a.Username == account.Username 10 | } 11 | return false 12 | } 13 | 14 | func (a *Account) AsAccount() (protocol.Account, error) { 15 | return a, nil 16 | } 17 | 18 | func (sc *ServerConfig) HasAccount(username, password string) bool { 19 | if sc.Accounts == nil { 20 | return false 21 | } 22 | 23 | p, found := sc.Accounts[username] 24 | if !found { 25 | return false 26 | } 27 | return p == password 28 | } 29 | -------------------------------------------------------------------------------- /proxy/http/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.http; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Http"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/http"; 6 | option java_package = "com.v2ray.core.proxy.http"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protocol/server_spec.proto"; 10 | 11 | message Account { 12 | string username = 1; 13 | string password = 2; 14 | } 15 | 16 | // Config for HTTP proxy server. 17 | message ServerConfig { 18 | uint32 timeout = 1 [deprecated = true]; 19 | map accounts = 2; 20 | bool allow_transparent = 3; 21 | uint32 user_level = 4; 22 | } 23 | 24 | // ClientConfig is the protobuf config for HTTP proxy client. 25 | message ClientConfig { 26 | // Sever is a list of HTTP server addresses. 27 | repeated v2ray.core.common.protocol.ServerEndpoint server = 1; 28 | } 29 | -------------------------------------------------------------------------------- /proxy/http/errors.generated.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/http/http.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /proxy/http/simplified/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.http.simplified; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Http.Simplified"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/http/simplified"; 6 | option java_package = "com.v2ray.core.proxy.http.simplified"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | 12 | message ServerConfig{ 13 | option (v2ray.core.common.protoext.message_opt).type = "inbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "http"; 15 | } 16 | 17 | message ClientConfig { 18 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 19 | option (v2ray.core.common.protoext.message_opt).short_name = "http"; 20 | 21 | v2ray.core.common.net.IPOrDomain address = 1; 22 | uint32 port = 2; 23 | } -------------------------------------------------------------------------------- /proxy/loopback/config.go: -------------------------------------------------------------------------------- 1 | package loopback 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /proxy/loopback/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.loopback; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Loopback"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/loopback"; 6 | option java_package = "com.v2ray.core.proxy.loopback"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message Config { 12 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 13 | option (v2ray.core.common.protoext.message_opt).short_name = "loopback"; 14 | 15 | string inbound_tag = 1; 16 | } 17 | -------------------------------------------------------------------------------- /proxy/loopback/errors.generated.go: -------------------------------------------------------------------------------- 1 | package loopback 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/shadowsocks/errors.generated.go: -------------------------------------------------------------------------------- 1 | package shadowsocks 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/shadowsocks/plugin/external/errors.generated.go: -------------------------------------------------------------------------------- 1 | package external 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/shadowsocks/plugin/external/log.go: -------------------------------------------------------------------------------- 1 | package external 2 | 3 | import "io" 4 | 5 | var _ io.Writer = (*pluginOutWriter)(nil) 6 | 7 | type pluginOutWriter struct { 8 | name string 9 | } 10 | 11 | func (w *pluginOutWriter) Write(p []byte) (n int, err error) { 12 | newError(w.name, "-stdout: ", string(p)).AtInfo().WriteToLog() 13 | return len(p), nil 14 | } 15 | 16 | var _ io.Writer = (*pluginErrWriter)(nil) 17 | 18 | type pluginErrWriter struct { 19 | name string 20 | } 21 | 22 | func (w *pluginErrWriter) Write(p []byte) (n int, err error) { 23 | newError(w.name, "-stderr: ", string(p)).WriteToLog() 24 | return len(p), nil 25 | } 26 | -------------------------------------------------------------------------------- /proxy/shadowsocks/plugin/self/errors.generated.go: -------------------------------------------------------------------------------- 1 | package self 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/shadowsocks/shadowsocks.go: -------------------------------------------------------------------------------- 1 | // Package shadowsocks provides compatible functionality to Shadowsocks. 2 | // 3 | // Shadowsocks client and server are implemented as outbound and inbound respectively in V2Ray's term. 4 | // 5 | // R.I.P Shadowsocks 6 | package shadowsocks 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | -------------------------------------------------------------------------------- /proxy/shadowsocks_sing/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.shadowsocks_sing; 4 | option csharp_namespace = "V2Ray.Core.Proxy.ShadowsocksSing"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/shadowsocks_sing"; 6 | option java_package = "com.v2ray.core.proxy.shadowsocks_sing"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | 12 | message ClientConfig { 13 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "shadowsocks_sing"; 15 | 16 | v2ray.core.common.net.IPOrDomain address = 1; 17 | uint32 port = 2; 18 | string method = 3; 19 | string password = 4; 20 | bool udp_over_tcp = 5; 21 | bool encrypted_protocol_extension = 6; 22 | } 23 | -------------------------------------------------------------------------------- /proxy/shadowsocks_sing/errors.generated.go: -------------------------------------------------------------------------------- 1 | package shadowsocks_sing 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/socks/config.go: -------------------------------------------------------------------------------- 1 | package socks 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/protocol" 4 | 5 | func (a *Account) Equals(another protocol.Account) bool { 6 | if account, ok := another.(*Account); ok { 7 | return a.Username == account.Username 8 | } 9 | return false 10 | } 11 | 12 | func (a *Account) AsAccount() (protocol.Account, error) { 13 | return a, nil 14 | } 15 | 16 | func (c *ServerConfig) HasAccount(username, password string) bool { 17 | if c.Accounts == nil { 18 | return false 19 | } 20 | storedPassed, found := c.Accounts[username] 21 | if !found { 22 | return false 23 | } 24 | return storedPassed == password 25 | } 26 | -------------------------------------------------------------------------------- /proxy/socks/errors.generated.go: -------------------------------------------------------------------------------- 1 | package socks 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/socks/socks.go: -------------------------------------------------------------------------------- 1 | // Package socks provides implements of Socks protocol 4, 4a and 5. 2 | package socks 3 | 4 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 5 | -------------------------------------------------------------------------------- /proxy/ssh/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.ssh; 4 | option csharp_namespace = "V2Ray.Core.Proxy.SSH"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/ssh"; 6 | option java_package = "com.v2ray.core.proxy.ssh"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | 12 | message Config { 13 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "ssh"; 15 | 16 | v2ray.core.common.net.IPOrDomain address = 1; 17 | uint32 port = 2; 18 | string user = 3; 19 | string password = 4; 20 | string private_key = 5; 21 | string public_key = 6; 22 | repeated string host_key_algorithms = 7; 23 | string client_version = 8; 24 | uint32 user_level = 9; 25 | } 26 | -------------------------------------------------------------------------------- /proxy/ssh/errors.generated.go: -------------------------------------------------------------------------------- 1 | package ssh 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/ssh/ssh.go: -------------------------------------------------------------------------------- 1 | package ssh 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /proxy/trojan/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.trojan; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Trojan"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/trojan"; 6 | option java_package = "com.v2ray.core.proxy.trojan"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protocol/user.proto"; 10 | import "common/protocol/server_spec.proto"; 11 | 12 | message Account { 13 | string password = 1; 14 | string flow = 2; 15 | } 16 | 17 | message Fallback { 18 | string name = 1; 19 | string alpn = 2; 20 | string path = 3; 21 | string type = 4; 22 | string dest = 5; 23 | uint64 xver = 6; 24 | } 25 | 26 | message ClientConfig { 27 | repeated v2ray.core.common.protocol.ServerEndpoint server = 1; 28 | } 29 | 30 | message ServerConfig { 31 | repeated v2ray.core.common.protocol.User users = 1; 32 | repeated Fallback fallbacks = 3; 33 | } 34 | -------------------------------------------------------------------------------- /proxy/trojan/errors.generated.go: -------------------------------------------------------------------------------- 1 | package trojan 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/trojan/simplified/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.trojan.simplified; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Trojan.Simplified"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/trojan/simplified"; 6 | option java_package = "com.v2ray.core.proxy.trojan.simplified"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | 12 | message ServerConfig{ 13 | option (v2ray.core.common.protoext.message_opt).type = "inbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "trojan"; 15 | 16 | repeated string users = 1; 17 | } 18 | 19 | message ClientConfig { 20 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 21 | option (v2ray.core.common.protoext.message_opt).short_name = "trojan"; 22 | 23 | v2ray.core.common.net.IPOrDomain address = 1; 24 | uint32 port = 2; 25 | string password = 3; 26 | } -------------------------------------------------------------------------------- /proxy/trojan/trojan.go: -------------------------------------------------------------------------------- 1 | package trojan 2 | -------------------------------------------------------------------------------- /proxy/trojan_sing/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.trojan_sing; 4 | option csharp_namespace = "V2Ray.Core.Proxy.TrojanSing"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/trojan_sing"; 6 | option java_package = "com.v2ray.core.proxy.trojan_sing"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | 12 | message ClientConfig { 13 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "trojan_sing"; 15 | 16 | v2ray.core.common.net.IPOrDomain address = 1; 17 | uint32 port = 2; 18 | string password = 3; 19 | string server_name = 4; 20 | repeated string next_protos = 5; 21 | bool insecure = 6; 22 | } 23 | -------------------------------------------------------------------------------- /proxy/trojan_sing/errors.generated.go: -------------------------------------------------------------------------------- 1 | package trojan_sing 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/trojan_sing/trojan_sing.go: -------------------------------------------------------------------------------- 1 | package trojan_sing 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /proxy/vless/account.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.vless; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Vless"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/vless"; 6 | option java_package = "com.v2ray.core.proxy.vless"; 7 | option java_multiple_files = true; 8 | 9 | message Account { 10 | // ID of the account, in the form of a UUID, e.g., "66ad4540-b58c-4ad2-9926-ea63445a9b57". 11 | string id = 1; 12 | // Flow settings. 13 | string flow = 2; 14 | // Encryption settings. Only applies to client side, and only accepts "none" for now. 15 | string encryption = 3; 16 | } 17 | -------------------------------------------------------------------------------- /proxy/vless/encoding/addons.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.vless.encoding; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Vless.Encoding"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/vless/encoding"; 6 | option java_package = "com.v2ray.core.proxy.vless.encoding"; 7 | option java_multiple_files = true; 8 | 9 | message Addons { 10 | string Flow = 1; 11 | bytes Seed = 2; 12 | } 13 | -------------------------------------------------------------------------------- /proxy/vless/encoding/errors.generated.go: -------------------------------------------------------------------------------- 1 | package encoding 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vless/errors.generated.go: -------------------------------------------------------------------------------- 1 | package vless 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vless/inbound/config.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | -------------------------------------------------------------------------------- /proxy/vless/inbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vless/outbound/config.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | -------------------------------------------------------------------------------- /proxy/vless/outbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vless/vless.go: -------------------------------------------------------------------------------- 1 | // Package vless contains the implementation of VLess protocol and transportation. 2 | // 3 | // VLess contains both inbound and outbound connections. VLess inbound is usually used on servers 4 | // together with 'freedom' to talk to final destination, while VLess outbound is usually used on 5 | // clients with 'socks' for proxying. 6 | package vless 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | 10 | const ( 11 | XRO = "xtls-rprx-origin" 12 | XRD = "xtls-rprx-direct" 13 | XRS = "xtls-rprx-splice" 14 | ) 15 | -------------------------------------------------------------------------------- /proxy/vlite/inbound/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.vlite.inbound; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Vlite.Inbound"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/vlite/inbound"; 6 | option java_package = "com.v2ray.core.proxy.vlite.inbound"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | 11 | message UDPProtocolConfig { 12 | option (v2ray.core.common.protoext.message_opt).type = "inbound"; 13 | option (v2ray.core.common.protoext.message_opt).short_name = "vliteu"; 14 | 15 | string password = 3; 16 | bool scramble_packet = 4; 17 | bool enable_fec = 5; 18 | bool enable_stabilization = 6; 19 | bool enable_renegotiation = 7; 20 | uint32 handshake_masking_padding_size = 8; 21 | } -------------------------------------------------------------------------------- /proxy/vlite/inbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vlite/outbound/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.vlite.outbound; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Vlite.Outbound"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/vlite/outbound"; 6 | option java_package = "com.v2ray.core.proxy.vlite.outbound"; 7 | option java_multiple_files = true; 8 | 9 | import "common/net/address.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | message UDPProtocolConfig { 13 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "vliteu"; 15 | v2ray.core.common.net.IPOrDomain address = 1; 16 | uint32 port = 2; 17 | 18 | string password = 3; 19 | bool scramble_packet = 4; 20 | bool enable_fec = 5; 21 | bool enable_stabilization = 6; 22 | bool enable_renegotiation = 7; 23 | uint32 handshake_masking_padding_size = 8; 24 | } -------------------------------------------------------------------------------- /proxy/vlite/outbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vlite/vlite.go: -------------------------------------------------------------------------------- 1 | // Package vlite contains the integration code for VLite protocol variety 2 | // 3 | // VLite is currently an experimental protocol, its stability is not guaranteed. 4 | package vlite 5 | -------------------------------------------------------------------------------- /proxy/vmess/account.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.vmess; 4 | option csharp_namespace = "V2Ray.Core.Proxy.Vmess"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/vmess"; 6 | option java_package = "com.v2ray.core.proxy.vmess"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protocol/headers.proto"; 10 | 11 | message Account { 12 | // ID of the account, in the form of a UUID, e.g., 13 | // "66ad4540-b58c-4ad2-9926-ea63445a9b57". 14 | string id = 1; 15 | // Number of alternative IDs. Client and server must share the same number. 16 | uint32 alter_id = 2; 17 | // Security settings. Only applies to client side. 18 | v2ray.core.common.protocol.SecurityConfig security_settings = 3; 19 | // Define tests enabled for this account 20 | string tests_enabled = 4; 21 | } 22 | -------------------------------------------------------------------------------- /proxy/vmess/aead/consts.go: -------------------------------------------------------------------------------- 1 | package aead 2 | 3 | const ( 4 | KDFSaltConstAuthIDEncryptionKey = "AES Auth ID Encryption" 5 | KDFSaltConstAEADRespHeaderLenKey = "AEAD Resp Header Len Key" 6 | KDFSaltConstAEADRespHeaderLenIV = "AEAD Resp Header Len IV" 7 | KDFSaltConstAEADRespHeaderPayloadKey = "AEAD Resp Header Key" 8 | KDFSaltConstAEADRespHeaderPayloadIV = "AEAD Resp Header IV" 9 | KDFSaltConstVMessAEADKDF = "VMess AEAD KDF" 10 | KDFSaltConstVMessHeaderPayloadAEADKey = "VMess Header AEAD Key" 11 | KDFSaltConstVMessHeaderPayloadAEADIV = "VMess Header AEAD Nonce" 12 | KDFSaltConstVMessHeaderPayloadLengthAEADKey = "VMess Header AEAD Key_Length" 13 | KDFSaltConstVMessHeaderPayloadLengthAEADIV = "VMess Header AEAD Nonce_Length" 14 | ) 15 | -------------------------------------------------------------------------------- /proxy/vmess/aead/kdf.go: -------------------------------------------------------------------------------- 1 | package aead 2 | 3 | import ( 4 | "crypto/hmac" 5 | "crypto/sha256" 6 | "hash" 7 | ) 8 | 9 | func KDF(key []byte, path ...string) []byte { 10 | hmacCreator := &hMacCreator{value: []byte(KDFSaltConstVMessAEADKDF)} 11 | for _, v := range path { 12 | hmacCreator = &hMacCreator{value: []byte(v), parent: hmacCreator} 13 | } 14 | hmacf := hmacCreator.Create() 15 | hmacf.Write(key) 16 | return hmacf.Sum(nil) 17 | } 18 | 19 | type hMacCreator struct { 20 | parent *hMacCreator 21 | value []byte 22 | } 23 | 24 | func (h *hMacCreator) Create() hash.Hash { 25 | if h.parent == nil { 26 | return hmac.New(sha256.New, h.value) 27 | } 28 | return hmac.New(h.parent.Create, h.value) 29 | } 30 | 31 | func KDF16(key []byte, path ...string) []byte { 32 | r := KDF(key, path...) 33 | return r[:16] 34 | } 35 | -------------------------------------------------------------------------------- /proxy/vmess/aead/kdf_test.go: -------------------------------------------------------------------------------- 1 | package aead 2 | 3 | import ( 4 | "encoding/hex" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestKDFValue(t *testing.T) { 12 | GeneratedKey := KDF([]byte("Demo Key for KDF Value Test"), "Demo Path for KDF Value Test", "Demo Path for KDF Value Test2", "Demo Path for KDF Value Test3") 13 | fmt.Println(hex.EncodeToString(GeneratedKey)) 14 | assert.Equal(t, "53e9d7e1bd7bd25022b71ead07d8a596efc8a845c7888652fd684b4903dc8892", hex.EncodeToString(GeneratedKey), "Should generate expected KDF Value") 15 | } 16 | -------------------------------------------------------------------------------- /proxy/vmess/encoding/auth_test.go: -------------------------------------------------------------------------------- 1 | package encoding_test 2 | 3 | import ( 4 | "crypto/rand" 5 | "testing" 6 | 7 | "github.com/google/go-cmp/cmp" 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | . "github.com/v2fly/v2ray-core/v5/proxy/vmess/encoding" 10 | ) 11 | 12 | func TestFnvAuth(t *testing.T) { 13 | fnvAuth := new(FnvAuthenticator) 14 | 15 | expectedText := make([]byte, 256) 16 | _, err := rand.Read(expectedText) 17 | common.Must(err) 18 | 19 | buffer := make([]byte, 512) 20 | b := fnvAuth.Seal(buffer[:0], nil, expectedText, nil) 21 | b, err = fnvAuth.Open(buffer[:0], nil, b, nil) 22 | common.Must(err) 23 | if r := cmp.Diff(b, expectedText); r != "" { 24 | t.Error(r) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /proxy/vmess/encoding/encoding.go: -------------------------------------------------------------------------------- 1 | package encoding 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/net" 5 | "github.com/v2fly/v2ray-core/v5/common/protocol" 6 | ) 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | 10 | const ( 11 | Version = byte(1) 12 | ) 13 | 14 | var addrParser = protocol.NewAddressParser( 15 | protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4), 16 | protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain), 17 | protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6), 18 | protocol.PortThenAddress(), 19 | ) 20 | -------------------------------------------------------------------------------- /proxy/vmess/encoding/errors.generated.go: -------------------------------------------------------------------------------- 1 | package encoding 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vmess/errors.generated.go: -------------------------------------------------------------------------------- 1 | package vmess 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vmess/inbound/config.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | 3 | // GetDefaultValue returns default settings of DefaultConfig. 4 | func (c *Config) GetDefaultValue() *DefaultConfig { 5 | if c.GetDefault() == nil { 6 | return &DefaultConfig{} 7 | } 8 | return c.Default 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vmess/inbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package inbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vmess/outbound/config.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | -------------------------------------------------------------------------------- /proxy/vmess/outbound/errors.generated.go: -------------------------------------------------------------------------------- 1 | package outbound 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/vmess/vmess.go: -------------------------------------------------------------------------------- 1 | // Package vmess contains the implementation of VMess protocol and transportation. 2 | // 3 | // VMess contains both inbound and outbound connections. VMess inbound is usually used on servers 4 | // together with 'freedom' to talk to final destination, while VMess outbound is usually used on 5 | // clients with 'socks' for proxying. 6 | package vmess 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | -------------------------------------------------------------------------------- /proxy/vmess/vmessCtxInterface.go: -------------------------------------------------------------------------------- 1 | package vmess 2 | 3 | // example 4 | const AlterID = "VMessCtxInterface_AlterID" 5 | -------------------------------------------------------------------------------- /proxy/wireguard/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.proxy.wireguard; 4 | option csharp_namespace = "V2Ray.Core.Proxy.WireGuard"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/proxy/wireguard"; 6 | option java_package = "com.v2ray.core.proxy.wireguard"; 7 | option java_multiple_files = true; 8 | 9 | import "common/protoext/extensions.proto"; 10 | import "common/net/address.proto"; 11 | import "common/net/network.proto"; 12 | 13 | message Config { 14 | option (v2ray.core.common.protoext.message_opt).type = "outbound"; 15 | option (v2ray.core.common.protoext.message_opt).short_name = "wireguard"; 16 | 17 | v2ray.core.common.net.IPOrDomain address = 1; 18 | uint32 port = 2; 19 | v2ray.core.common.net.Network network = 3; 20 | repeated string localAddress = 4; 21 | string private_key = 5; 22 | string peer_public_key = 6; 23 | string pre_shared_key = 7; 24 | uint32 mtu = 8; 25 | uint32 user_level = 9; 26 | } -------------------------------------------------------------------------------- /proxy/wireguard/errors.generated.go: -------------------------------------------------------------------------------- 1 | package wireguard 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /proxy/wireguard/icmp.go: -------------------------------------------------------------------------------- 1 | package wireguard 2 | 3 | import ( 4 | "io" 5 | "time" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common/net" 8 | ) 9 | 10 | type pingConnWrapper struct { 11 | outbound func(message []byte, addr net.Addr) (int, error) 12 | } 13 | 14 | func (c *pingConnWrapper) ReadFrom([]byte) (n int, addr net.Addr, err error) { 15 | return 0, nil, io.EOF 16 | } 17 | 18 | func (c *pingConnWrapper) WriteTo(p []byte, addr net.Addr) (n int, err error) { 19 | return c.outbound(p, addr) 20 | } 21 | 22 | func (c *pingConnWrapper) Close() error { 23 | return nil 24 | } 25 | 26 | func (c *pingConnWrapper) LocalAddr() net.Addr { 27 | return nil 28 | } 29 | 30 | func (c *pingConnWrapper) SetDeadline(t time.Time) error { 31 | return nil 32 | } 33 | 34 | func (c *pingConnWrapper) SetReadDeadline(t time.Time) error { 35 | return nil 36 | } 37 | 38 | func (c *pingConnWrapper) SetWriteDeadline(t time.Time) error { 39 | return nil 40 | } 41 | -------------------------------------------------------------------------------- /proxy/wireguard/wireguard.go: -------------------------------------------------------------------------------- 1 | package wireguard 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /release/config/systemd/system/v2ray.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=V2Ray Service 3 | Documentation=https://www.v2fly.org/ 4 | After=network.target nss-lookup.target 5 | 6 | [Service] 7 | User=nobody 8 | CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 9 | AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 10 | NoNewPrivileges=true 11 | ExecStart=/usr/local/bin/v2ray run -config /usr/local/etc/v2ray/config.json 12 | Restart=on-failure 13 | RestartPreventExitStatus=23 14 | 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /release/config/systemd/system/v2ray@.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=V2Ray Service 3 | Documentation=https://www.v2fly.org/ 4 | After=network.target nss-lookup.target 5 | 6 | [Service] 7 | User=nobody 8 | CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 9 | AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 10 | NoNewPrivileges=true 11 | ExecStart=/usr/local/bin/v2ray run -config /usr/local/etc/v2ray/%i.json 12 | Restart=on-failure 13 | RestartPreventExitStatus=23 14 | 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /release/config/vpoint_socks_vmess.json: -------------------------------------------------------------------------------- 1 | { 2 | "log": { 3 | "loglevel": "warning" 4 | }, 5 | "inbounds": [{ 6 | "port": 1080, 7 | "listen": "127.0.0.1", 8 | "protocol": "socks", 9 | "settings": { 10 | "auth": "noauth", 11 | "udp": false, 12 | "ip": "127.0.0.1" 13 | } 14 | }], 15 | "outbounds": [{ 16 | "protocol": "freedom", 17 | "settings": {}, 18 | "tag": "direct" 19 | }], 20 | "policy": { 21 | "levels": { 22 | "0": {"uplinkOnly": 0} 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /release/config/vpoint_vmess_freedom.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [{ 3 | "port": 10086, 4 | "protocol": "vmess", 5 | "settings": { 6 | "clients": [ 7 | { 8 | "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", 9 | "level": 1, 10 | "alterId": 64 11 | } 12 | ] 13 | } 14 | }], 15 | "outbounds": [{ 16 | "protocol": "freedom", 17 | "settings": {} 18 | },{ 19 | "protocol": "blackhole", 20 | "settings": {}, 21 | "tag": "blocked" 22 | }], 23 | "routing": { 24 | "rules": [ 25 | { 26 | "type": "field", 27 | "ip": ["geoip:private"], 28 | "outboundTag": "blocked" 29 | } 30 | ] 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /release/debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | 3 | include /usr/share/dpkg/default.mk 4 | 5 | BUILDDIR=_build 6 | 7 | %: 8 | dh $@ --builddirectory=$(BUILDDIR) --buildsystem=golang 9 | 10 | execute_after_dh_auto_configure: 11 | go mod vendor 12 | cp -r vendor/* _build/src 13 | 14 | override_dh_auto_build: 15 | DH_GOPKG="github.com/v2fly/v2ray-core/v5/main" dh_auto_build -- -ldflags "-s -w" 16 | cd $(BUILDDIR); mv bin/main bin/v2ray 17 | DH_GOPKG="github.com/v2fly/v2ray-core/v5/infra/control/main" dh_auto_build -- -ldflags "-s -w" -tags confonly 18 | cd $(BUILDDIR); mv bin/main bin/v2ctl 19 | 20 | override_dh_auto_install: 21 | dh_auto_install -- --no-source 22 | 23 | override_dh_auto_test: 24 | -------------------------------------------------------------------------------- /release/debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /release/debian/v2ray-docs.docs: -------------------------------------------------------------------------------- 1 | README.md 2 | -------------------------------------------------------------------------------- /release/debian/v2ray-domain-list-community.install: -------------------------------------------------------------------------------- 1 | release/config/geosite.dat usr/share/v2ray 2 | -------------------------------------------------------------------------------- /release/debian/v2ray-geoip-only-cn-private.install: -------------------------------------------------------------------------------- 1 | release/config/geoip-only-cn-private.dat usr/share/v2ray 2 | -------------------------------------------------------------------------------- /release/debian/v2ray-geoip.install: -------------------------------------------------------------------------------- 1 | release/config/geoip.dat usr/share/v2ray 2 | -------------------------------------------------------------------------------- /release/debian/v2ray.install: -------------------------------------------------------------------------------- 1 | usr/bin 2 | release/config/config.json etc/v2ray 3 | -------------------------------------------------------------------------------- /release/debian/v2ray.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=V2Ray Service 3 | Documentation=https://www.v2fly.org/ 4 | After=network.target nss-lookup.target 5 | 6 | [Service] 7 | User=nobody 8 | CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 9 | AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 10 | NoNewPrivileges=true 11 | ExecStart=/usr/bin/v2ray -config /etc/v2ray/config.json 12 | Restart=on-failure 13 | RestartPreventExitStatus=23 14 | 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /release/debian/v2ray@.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=V2Ray Service 3 | Documentation=https://www.v2fly.org/ 4 | After=network.target nss-lookup.target 5 | 6 | [Service] 7 | User=nobody 8 | CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 9 | AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 10 | NoNewPrivileges=true 11 | ExecStart=/usr/bin/v2ray -config /etc/v2ray/%i.json 12 | Restart=on-failure 13 | RestartPreventExitStatus=23 14 | 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /release/extra/browserforwarder/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bridge 6 | 7 | 8 | See debug console for detail 9 | 10 | 11 | -------------------------------------------------------------------------------- /release/install-release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # This file is accessible as https://install.direct/go.sh 4 | # Original source is located at github.com/v2fly/v2ray-core/release/install-release.sh 5 | 6 | # If not specify, default meaning of return value: 7 | # 0: Success 8 | # 1: System error 9 | # 2: Application error 10 | # 3: Network error 11 | 12 | #######color code######## 13 | RED="31m" # Error message 14 | YELLOW="33m" # Warning message 15 | colorEcho(){ 16 | echo -e "\033[${1}${@:2}\033[0m" 1>& 2 17 | } 18 | 19 | colorEcho ${RED} "ERROR: This script has been DISCARDED, please switch to fhs-install-v2ray project." 20 | colorEcho ${YELLOW} "HOW TO USE: https://github.com/v2fly/fhs-install-v2ray" 21 | colorEcho ${YELLOW} "TO MIGRATE: https://github.com/v2fly/fhs-install-v2ray/wiki/Migrate-from-the-old-script-to-this" 22 | exit 255 23 | -------------------------------------------------------------------------------- /testing/scenarios/common_regular.go: -------------------------------------------------------------------------------- 1 | //go:build !coverage 2 | // +build !coverage 3 | 4 | package scenarios 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "os" 10 | "os/exec" 11 | ) 12 | 13 | func BuildV2Ray() error { 14 | genTestBinaryPath() 15 | if _, err := os.Stat(testBinaryPath); err == nil { 16 | return nil 17 | } 18 | 19 | fmt.Printf("Building V2Ray into path (%s)\n", testBinaryPath) 20 | cmd := exec.Command("go", "build", "-o="+testBinaryPath, GetSourcePath()) 21 | return cmd.Run() 22 | } 23 | 24 | func RunV2RayProtobuf(config []byte) *exec.Cmd { 25 | genTestBinaryPath() 26 | proc := exec.Command(testBinaryPath, "run", "-format=pb") 27 | proc.Stdin = bytes.NewBuffer(config) 28 | proc.Stderr = os.Stderr 29 | proc.Stdout = os.Stdout 30 | 31 | return proc 32 | } 33 | -------------------------------------------------------------------------------- /testing/servers/tcp/port.go: -------------------------------------------------------------------------------- 1 | package tcp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/net" 4 | 5 | // PickPort returns an unused TCP port of the system. 6 | func PickPort() net.Port { 7 | listener := pickPort() 8 | defer listener.Close() 9 | 10 | addr := listener.Addr().(*net.TCPAddr) 11 | return net.Port(addr.Port) 12 | } 13 | 14 | func pickPort() net.Listener { 15 | listener, err := net.Listen("tcp4", "127.0.0.1:0") 16 | if err != nil { 17 | listener = pickPort() 18 | } 19 | return listener 20 | } 21 | -------------------------------------------------------------------------------- /testing/servers/udp/port.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/net" 4 | 5 | // PickPort returns an unused UDP port of the system. 6 | func PickPort() net.Port { 7 | conn := pickPort() 8 | defer conn.Close() 9 | 10 | addr := conn.LocalAddr().(*net.UDPAddr) 11 | return net.Port(addr.Port) 12 | } 13 | 14 | func pickPort() *net.UDPConn { 15 | conn, err := net.ListenUDP("udp4", &net.UDPAddr{ 16 | IP: net.LocalHostIP.IP(), 17 | Port: 0, 18 | }) 19 | if err != nil { 20 | conn = pickPort() 21 | } 22 | return conn 23 | } 24 | -------------------------------------------------------------------------------- /transport/config.go: -------------------------------------------------------------------------------- 1 | package transport 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/transport/internet" 5 | ) 6 | 7 | // Apply applies this Config. 8 | func (c *Config) Apply() error { 9 | if c == nil { 10 | return nil 11 | } 12 | return internet.ApplyGlobalTransportSettings(c.TransportSettings) 13 | } 14 | -------------------------------------------------------------------------------- /transport/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport; 4 | option csharp_namespace = "V2Ray.Core.Transport"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport"; 6 | option java_package = "com.v2ray.core.transport"; 7 | option java_multiple_files = true; 8 | 9 | import "transport/internet/config.proto"; 10 | 11 | // Global transport settings. This affects all type of connections that go 12 | // through V2Ray. Deprecated. Use each settings in StreamConfig. 13 | message Config { 14 | option deprecated = true; 15 | repeated v2ray.core.transport.internet.TransportConfig transport_settings = 1; 16 | } 17 | -------------------------------------------------------------------------------- /transport/internet/dialer_test.go: -------------------------------------------------------------------------------- 1 | package internet_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/google/go-cmp/cmp" 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | "github.com/v2fly/v2ray-core/v5/common/net" 10 | "github.com/v2fly/v2ray-core/v5/testing/servers/tcp" 11 | . "github.com/v2fly/v2ray-core/v5/transport/internet" 12 | ) 13 | 14 | func TestDialWithLocalAddr(t *testing.T) { 15 | server := &tcp.Server{} 16 | dest, err := server.Start() 17 | common.Must(err) 18 | defer server.Close() 19 | 20 | conn, err := DialSystem(context.Background(), net.TCPDestination(net.LocalHostIP, dest.Port), nil) 21 | common.Must(err) 22 | if r := cmp.Diff(conn.RemoteAddr().String(), "127.0.0.1:"+dest.Port.String()); r != "" { 23 | t.Error(r) 24 | } 25 | conn.Close() 26 | } 27 | -------------------------------------------------------------------------------- /transport/internet/domainsocket/config.go: -------------------------------------------------------------------------------- 1 | package domainsocket 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/common/net" 6 | "github.com/v2fly/v2ray-core/v5/transport/internet" 7 | ) 8 | 9 | const ( 10 | protocolName = "domainsocket" 11 | sizeofSunPath = 108 12 | ) 13 | 14 | func (c *Config) GetUnixAddr() (*net.UnixAddr, error) { 15 | path := c.Path 16 | if path == "" { 17 | return nil, newError("empty domain socket path") 18 | } 19 | if c.Abstract && path[0] != '@' { 20 | path = "@" + path 21 | } 22 | if c.Abstract && c.Padding { 23 | raw := []byte(path) 24 | addr := make([]byte, sizeofSunPath) 25 | copy(addr, raw) 26 | path = string(addr) 27 | } 28 | return &net.UnixAddr{ 29 | Name: path, 30 | Net: "unix", 31 | }, nil 32 | } 33 | 34 | func init() { 35 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 36 | return new(Config) 37 | })) 38 | } 39 | -------------------------------------------------------------------------------- /transport/internet/domainsocket/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.domainsocket; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.DomainSocket"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/domainsocket"; 6 | option java_package = "com.v2ray.core.transport.internet.domainsocket"; 7 | option java_multiple_files = true; 8 | 9 | message Config { 10 | // Path of the domain socket. This overrides the IP/Port parameter from 11 | // upstream caller. 12 | string path = 1; 13 | // Abstract specifies whether to use abstract namespace or not. 14 | // Traditionally Unix domain socket is file system based. Abstract domain 15 | // socket can be used without acquiring file lock. 16 | bool abstract = 2; 17 | // Some apps, eg. haproxy, use the full length of sockaddr_un.sun_path to 18 | // connect(2) or bind(2) when using abstract UDS. 19 | bool padding = 3; 20 | } 21 | -------------------------------------------------------------------------------- /transport/internet/domainsocket/errgen.go: -------------------------------------------------------------------------------- 1 | package domainsocket 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/domainsocket/errors.generated.go: -------------------------------------------------------------------------------- 1 | package domainsocket 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/errors.generated.go: -------------------------------------------------------------------------------- 1 | package internet 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/filelocker.go: -------------------------------------------------------------------------------- 1 | package internet 2 | 3 | import ( 4 | "os" 5 | ) 6 | 7 | // FileLocker is UDS access lock 8 | type FileLocker struct { 9 | path string 10 | file *os.File 11 | } 12 | -------------------------------------------------------------------------------- /transport/internet/filelocker_windows.go: -------------------------------------------------------------------------------- 1 | package internet 2 | 3 | // Acquire lock 4 | func (fl *FileLocker) Acquire() error { 5 | return nil 6 | } 7 | 8 | // Release lock 9 | func (fl *FileLocker) Release() { 10 | return 11 | } 12 | -------------------------------------------------------------------------------- /transport/internet/grpc/config.go: -------------------------------------------------------------------------------- 1 | package grpc 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/transport/internet" 6 | ) 7 | 8 | const protocolName = "gun" 9 | 10 | func init() { 11 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 12 | return new(Config) 13 | })) 14 | } 15 | -------------------------------------------------------------------------------- /transport/internet/grpc/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.grpc.encoding; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Grpc"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/grpc"; 6 | option java_package = "com.v2ray.core.transport.internet.grpc"; 7 | 8 | import "common/protoext/extensions.proto"; 9 | 10 | enum Mode { 11 | Gun = 0; 12 | Multi = 1; 13 | Raw = 2; 14 | } 15 | 16 | message Config { 17 | option (v2ray.core.common.protoext.message_opt).type = "transport"; 18 | option (v2ray.core.common.protoext.message_opt).short_name = "grpc"; 19 | 20 | option (v2ray.core.common.protoext.message_opt).transport_original_name = "gun"; 21 | 22 | string host = 1; 23 | string service_name = 2; 24 | Mode mode = 3; 25 | int32 idle_timeout = 4; 26 | int32 health_check_timeout = 5; 27 | bool permit_without_stream = 6; 28 | int32 initial_windows_size = 7; 29 | } -------------------------------------------------------------------------------- /transport/internet/grpc/encoding/encoding.go: -------------------------------------------------------------------------------- 1 | package encoding 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/grpc/encoding/errors.generated.go: -------------------------------------------------------------------------------- 1 | package encoding 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/grpc/encoding/stream.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.grpc.encoding; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Grpc.Encoding"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/grpc/encoding"; 6 | option java_package = "com.v2ray.core.transport.internet.grpc.encoding"; 7 | 8 | message Hunk { 9 | bytes data = 1; 10 | } 11 | 12 | message MultiHunk { 13 | repeated bytes data = 1; 14 | } 15 | 16 | service GunService { 17 | rpc Tun (stream Hunk) returns (stream Hunk); 18 | rpc TunMulti (stream MultiHunk) returns (stream MultiHunk); 19 | } 20 | -------------------------------------------------------------------------------- /transport/internet/grpc/errors.generated.go: -------------------------------------------------------------------------------- 1 | package grpc 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/grpc/grpc.go: -------------------------------------------------------------------------------- 1 | //go:build !confonly 2 | // +build !confonly 3 | 4 | package grpc 5 | 6 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 7 | -------------------------------------------------------------------------------- /transport/internet/headers/http/errors.generated.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/headers/http/linkedreadRequest.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "bufio" 5 | "net/http" 6 | // required to use go:linkname 7 | _ "unsafe" 8 | ) 9 | 10 | //go:linkname readRequest net/http.readRequest 11 | func readRequest(b *bufio.Reader) (req *http.Request, err error) 12 | -------------------------------------------------------------------------------- /transport/internet/headers/http/resp.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | var resp400 = &ResponseConfig{ 4 | Version: &Version{ 5 | Value: "1.1", 6 | }, 7 | Status: &Status{ 8 | Code: "400", 9 | Reason: "Bad Request", 10 | }, 11 | Header: []*Header{ 12 | { 13 | Name: "Connection", 14 | Value: []string{"close"}, 15 | }, 16 | { 17 | Name: "Cache-Control", 18 | Value: []string{"private"}, 19 | }, 20 | { 21 | Name: "Content-Length", 22 | Value: []string{"0"}, 23 | }, 24 | }, 25 | } 26 | 27 | var resp404 = &ResponseConfig{ 28 | Version: &Version{ 29 | Value: "1.1", 30 | }, 31 | Status: &Status{ 32 | Code: "404", 33 | Reason: "Not Found", 34 | }, 35 | Header: []*Header{ 36 | { 37 | Name: "Connection", 38 | Value: []string{"close"}, 39 | }, 40 | { 41 | Name: "Cache-Control", 42 | Value: []string{"private"}, 43 | }, 44 | { 45 | Name: "Content-Length", 46 | Value: []string{"0"}, 47 | }, 48 | }, 49 | } 50 | -------------------------------------------------------------------------------- /transport/internet/headers/noop/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.noop; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Noop"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/noop"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.noop"; 7 | option java_multiple_files = true; 8 | 9 | message Config {} 10 | 11 | message ConnectionConfig {} 12 | -------------------------------------------------------------------------------- /transport/internet/headers/noop/noop.go: -------------------------------------------------------------------------------- 1 | package noop 2 | 3 | import ( 4 | "context" 5 | "net" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | ) 9 | 10 | type Header struct{} 11 | 12 | func (Header) Size() int32 { 13 | return 0 14 | } 15 | 16 | // Serialize implements PacketHeader. 17 | func (Header) Serialize([]byte) {} 18 | 19 | func NewHeader(context.Context, interface{}) (interface{}, error) { 20 | return Header{}, nil 21 | } 22 | 23 | type ConnectionHeader struct{} 24 | 25 | func (ConnectionHeader) Client(conn net.Conn) net.Conn { 26 | return conn 27 | } 28 | 29 | func (ConnectionHeader) Server(conn net.Conn) net.Conn { 30 | return conn 31 | } 32 | 33 | func NewConnectionHeader(context.Context, interface{}) (interface{}, error) { 34 | return ConnectionHeader{}, nil 35 | } 36 | 37 | func init() { 38 | common.Must(common.RegisterConfig((*Config)(nil), NewHeader)) 39 | common.Must(common.RegisterConfig((*ConnectionConfig)(nil), NewConnectionHeader)) 40 | } 41 | -------------------------------------------------------------------------------- /transport/internet/headers/srtp/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.srtp; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Srtp"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/srtp"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.srtp"; 7 | option java_multiple_files = true; 8 | 9 | message Config { 10 | uint32 version = 1; 11 | bool padding = 2; 12 | bool extension = 3; 13 | uint32 csrc_count = 4; 14 | bool marker = 5; 15 | uint32 payload_type = 6; 16 | } 17 | -------------------------------------------------------------------------------- /transport/internet/headers/srtp/srtp.go: -------------------------------------------------------------------------------- 1 | package srtp 2 | 3 | import ( 4 | "context" 5 | "encoding/binary" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/dice" 9 | ) 10 | 11 | type SRTP struct { 12 | header uint16 13 | number uint16 14 | } 15 | 16 | func (*SRTP) Size() int32 { 17 | return 4 18 | } 19 | 20 | // Serialize implements PacketHeader. 21 | func (s *SRTP) Serialize(b []byte) { 22 | s.number++ 23 | binary.BigEndian.PutUint16(b, s.header) 24 | binary.BigEndian.PutUint16(b[2:], s.number) 25 | } 26 | 27 | // New returns a new SRTP instance based on the given config. 28 | func New(ctx context.Context, config interface{}) (interface{}, error) { 29 | return &SRTP{ 30 | header: 0xB5E8, 31 | number: dice.RollUint16(), 32 | }, nil 33 | } 34 | 35 | func init() { 36 | common.Must(common.RegisterConfig((*Config)(nil), New)) 37 | } 38 | -------------------------------------------------------------------------------- /transport/internet/headers/srtp/srtp_test.go: -------------------------------------------------------------------------------- 1 | package srtp_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/buf" 9 | . "github.com/v2fly/v2ray-core/v5/transport/internet/headers/srtp" 10 | ) 11 | 12 | func TestSRTPWrite(t *testing.T) { 13 | content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} 14 | srtpRaw, err := New(context.Background(), &Config{}) 15 | common.Must(err) 16 | 17 | srtp := srtpRaw.(*SRTP) 18 | 19 | payload := buf.New() 20 | srtp.Serialize(payload.Extend(srtp.Size())) 21 | payload.Write(content) 22 | 23 | expectedLen := int32(len(content)) + srtp.Size() 24 | if payload.Len() != expectedLen { 25 | t.Error("expected ", expectedLen, " of bytes, but got ", payload.Len()) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /transport/internet/headers/tls/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.tls; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Tls"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/tls"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.tls"; 7 | option java_multiple_files = true; 8 | 9 | message PacketConfig {} 10 | -------------------------------------------------------------------------------- /transport/internet/headers/tls/dtls_test.go: -------------------------------------------------------------------------------- 1 | package tls_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/buf" 9 | . "github.com/v2fly/v2ray-core/v5/transport/internet/headers/tls" 10 | ) 11 | 12 | func TestDTLSWrite(t *testing.T) { 13 | content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} 14 | dtlsRaw, err := New(context.Background(), &PacketConfig{}) 15 | common.Must(err) 16 | 17 | dtls := dtlsRaw.(*DTLS) 18 | 19 | payload := buf.New() 20 | dtls.Serialize(payload.Extend(dtls.Size())) 21 | payload.Write(content) 22 | 23 | if payload.Len() != int32(len(content))+dtls.Size() { 24 | t.Error("payload len: ", payload.Len(), " want ", int32(len(content))+dtls.Size()) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /transport/internet/headers/utp/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.utp; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Utp"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/utp"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.utp"; 7 | option java_multiple_files = true; 8 | 9 | message Config { 10 | uint32 version = 1; 11 | } 12 | -------------------------------------------------------------------------------- /transport/internet/headers/utp/utp.go: -------------------------------------------------------------------------------- 1 | package utp 2 | 3 | import ( 4 | "context" 5 | "encoding/binary" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/dice" 9 | ) 10 | 11 | type UTP struct { 12 | header byte 13 | extension byte 14 | connectionID uint16 15 | } 16 | 17 | func (*UTP) Size() int32 { 18 | return 4 19 | } 20 | 21 | // Serialize implements PacketHeader. 22 | func (u *UTP) Serialize(b []byte) { 23 | binary.BigEndian.PutUint16(b, u.connectionID) 24 | b[2] = u.header 25 | b[3] = u.extension 26 | } 27 | 28 | // New creates a new UTP header for the given config. 29 | func New(ctx context.Context, config interface{}) (interface{}, error) { 30 | return &UTP{ 31 | header: 1, 32 | extension: 0, 33 | connectionID: dice.RollUint16(), 34 | }, nil 35 | } 36 | 37 | func init() { 38 | common.Must(common.RegisterConfig((*Config)(nil), New)) 39 | } 40 | -------------------------------------------------------------------------------- /transport/internet/headers/utp/utp_test.go: -------------------------------------------------------------------------------- 1 | package utp_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/buf" 9 | . "github.com/v2fly/v2ray-core/v5/transport/internet/headers/utp" 10 | ) 11 | 12 | func TestUTPWrite(t *testing.T) { 13 | content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} 14 | utpRaw, err := New(context.Background(), &Config{}) 15 | common.Must(err) 16 | 17 | utp := utpRaw.(*UTP) 18 | 19 | payload := buf.New() 20 | utp.Serialize(payload.Extend(utp.Size())) 21 | payload.Write(content) 22 | 23 | if payload.Len() != int32(len(content))+utp.Size() { 24 | t.Error("unexpected payload length: ", payload.Len()) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /transport/internet/headers/wechat/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.wechat; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Wechat"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/wechat"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.wechat"; 7 | option java_multiple_files = true; 8 | 9 | message VideoConfig {} 10 | -------------------------------------------------------------------------------- /transport/internet/headers/wechat/wechat_test.go: -------------------------------------------------------------------------------- 1 | package wechat_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/v2fly/v2ray-core/v5/common" 8 | "github.com/v2fly/v2ray-core/v5/common/buf" 9 | . "github.com/v2fly/v2ray-core/v5/transport/internet/headers/wechat" 10 | ) 11 | 12 | func TestUTPWrite(t *testing.T) { 13 | videoRaw, err := NewVideoChat(context.Background(), &VideoConfig{}) 14 | common.Must(err) 15 | 16 | video := videoRaw.(*VideoChat) 17 | 18 | payload := buf.New() 19 | video.Serialize(payload.Extend(video.Size())) 20 | 21 | if payload.Len() != video.Size() { 22 | t.Error("expected payload size ", video.Size(), " but got ", payload.Len()) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /transport/internet/headers/wireguard/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.headers.wireguard; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Wireguard"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/headers/wireguard"; 6 | option java_package = "com.v2ray.core.transport.internet.headers.wireguard"; 7 | option java_multiple_files = true; 8 | 9 | message WireguardConfig {} 10 | -------------------------------------------------------------------------------- /transport/internet/headers/wireguard/wireguard.go: -------------------------------------------------------------------------------- 1 | package wireguard 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | ) 8 | 9 | type Wireguard struct{} 10 | 11 | func (Wireguard) Size() int32 { 12 | return 4 13 | } 14 | 15 | // Serialize implements PacketHeader. 16 | func (Wireguard) Serialize(b []byte) { 17 | b[0] = 0x04 18 | b[1] = 0x00 19 | b[2] = 0x00 20 | b[3] = 0x00 21 | } 22 | 23 | // NewWireguard returns a new VideoChat instance based on given config. 24 | func NewWireguard(ctx context.Context, config interface{}) (interface{}, error) { 25 | return Wireguard{}, nil 26 | } 27 | 28 | func init() { 29 | common.Must(common.RegisterConfig((*WireguardConfig)(nil), NewWireguard)) 30 | } 31 | -------------------------------------------------------------------------------- /transport/internet/http/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.http; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Http"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/http"; 6 | option java_package = "com.v2ray.core.transport.internet.http"; 7 | option java_multiple_files = true; 8 | 9 | import "transport/internet/headers/http/config.proto"; 10 | 11 | message Config { 12 | repeated string host = 1; 13 | string path = 2; 14 | string method = 3; 15 | repeated v2ray.core.transport.internet.headers.http.Header header = 4; 16 | } 17 | -------------------------------------------------------------------------------- /transport/internet/http/errors.generated.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/http/http.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/internet.go: -------------------------------------------------------------------------------- 1 | package internet 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/kcp/cryptreal.go: -------------------------------------------------------------------------------- 1 | package kcp 2 | 3 | import ( 4 | "crypto/aes" 5 | "crypto/cipher" 6 | "crypto/sha256" 7 | 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | ) 10 | 11 | func NewAEADAESGCMBasedOnSeed(seed string) cipher.AEAD { 12 | hashedSeed := sha256.Sum256([]byte(seed)) 13 | aesBlock := common.Must2(aes.NewCipher(hashedSeed[:16])).(cipher.Block) 14 | return common.Must2(cipher.NewGCM(aesBlock)).(cipher.AEAD) 15 | } 16 | -------------------------------------------------------------------------------- /transport/internet/kcp/errors.generated.go: -------------------------------------------------------------------------------- 1 | package kcp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/kcp/io_test.go: -------------------------------------------------------------------------------- 1 | package kcp_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/v2fly/v2ray-core/v5/transport/internet/kcp" 7 | ) 8 | 9 | func TestKCPPacketReader(t *testing.T) { 10 | reader := KCPPacketReader{ 11 | Security: &SimpleAuthenticator{}, 12 | } 13 | 14 | testCases := []struct { 15 | Input []byte 16 | Output []Segment 17 | }{ 18 | { 19 | Input: []byte{}, 20 | Output: nil, 21 | }, 22 | { 23 | Input: []byte{1}, 24 | Output: nil, 25 | }, 26 | } 27 | 28 | for _, testCase := range testCases { 29 | seg := reader.Read(testCase.Input) 30 | if testCase.Output == nil && seg != nil { 31 | t.Errorf("Expect nothing returned, but actually %v", seg) 32 | } else if testCase.Output != nil && seg == nil { 33 | t.Errorf("Expect some output, but got nil") 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /transport/internet/kcp/kcp.go: -------------------------------------------------------------------------------- 1 | // Package kcp - A Fast and Reliable ARQ Protocol 2 | // 3 | // Acknowledgement: 4 | // skywind3000@github for inventing the KCP protocol 5 | // xtaci@github for translating to Golang 6 | package kcp 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | -------------------------------------------------------------------------------- /transport/internet/kcp/xor.go: -------------------------------------------------------------------------------- 1 | //go:build !amd64 2 | // +build !amd64 3 | 4 | package kcp 5 | 6 | // xorfwd performs XOR forwards in words, x[i] ^= x[i-4], i from 0 to len 7 | func xorfwd(x []byte) { 8 | for i := 4; i < len(x); i++ { 9 | x[i] ^= x[i-4] 10 | } 11 | } 12 | 13 | // xorbkd performs XOR backwords in words, x[i] ^= x[i-4], i from len to 0 14 | func xorbkd(x []byte) { 15 | for i := len(x) - 1; i >= 4; i-- { 16 | x[i] ^= x[i-4] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /transport/internet/kcp/xor_amd64.go: -------------------------------------------------------------------------------- 1 | package kcp 2 | 3 | //go:noescape 4 | func xorfwd(x []byte) 5 | 6 | //go:noescape 7 | func xorbkd(x []byte) 8 | -------------------------------------------------------------------------------- /transport/internet/quic/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.quic; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Quic"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/quic"; 6 | option java_package = "com.v2ray.core.transport.internet.quic"; 7 | option java_multiple_files = true; 8 | 9 | import "google/protobuf/any.proto"; 10 | import "common/protocol/headers.proto"; 11 | 12 | import "common/protoext/extensions.proto"; 13 | 14 | message Config { 15 | option (v2ray.core.common.protoext.message_opt).type = "transport"; 16 | option (v2ray.core.common.protoext.message_opt).short_name = "quic"; 17 | 18 | string key = 1; 19 | v2ray.core.common.protocol.SecurityConfig security = 2; 20 | google.protobuf.Any header = 3; 21 | } 22 | -------------------------------------------------------------------------------- /transport/internet/quic/errors.generated.go: -------------------------------------------------------------------------------- 1 | package quic 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/quic/pool.go: -------------------------------------------------------------------------------- 1 | package quic 2 | 3 | import ( 4 | "sync" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/bytespool" 7 | ) 8 | 9 | var pool *sync.Pool 10 | 11 | func init() { 12 | pool = bytespool.GetPool(2048) 13 | } 14 | 15 | func getBuffer() []byte { 16 | return pool.Get().([]byte) 17 | } 18 | 19 | func putBuffer(p []byte) { 20 | pool.Put(p) // nolint: staticcheck 21 | } 22 | -------------------------------------------------------------------------------- /transport/internet/quic/quic.go: -------------------------------------------------------------------------------- 1 | package quic 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/transport/internet" 6 | ) 7 | 8 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 9 | 10 | // Here is some modification needs to be done before update quic vendor. 11 | // * use bytespool in buffer_pool.go 12 | // * set MaxReceivePacketSize to 1452 - 32 (16 bytes auth, 16 bytes head) 13 | // 14 | // 15 | 16 | const ( 17 | protocolName = "quic" 18 | internalDomain = "quic.internal.v2fly.org" 19 | ) 20 | 21 | func init() { 22 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 23 | return new(Config) 24 | })) 25 | } 26 | -------------------------------------------------------------------------------- /transport/internet/sockopt.go: -------------------------------------------------------------------------------- 1 | package internet 2 | 3 | func isTCPSocket(network string) bool { 4 | switch network { 5 | case "tcp", "tcp4", "tcp6": 6 | return true 7 | default: 8 | return false 9 | } 10 | } 11 | 12 | func isUDPSocket(network string) bool { 13 | switch network { 14 | case "udp", "udp4", "udp6": 15 | return true 16 | default: 17 | return false 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /transport/internet/sockopt_other.go: -------------------------------------------------------------------------------- 1 | //go:build js || dragonfly || netbsd || openbsd || solaris 2 | // +build js dragonfly netbsd openbsd solaris 3 | 4 | package internet 5 | 6 | func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { 7 | return nil 8 | } 9 | 10 | func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { 11 | return nil 12 | } 13 | 14 | func bindAddr(fd uintptr, ip []byte, port uint32) error { 15 | return nil 16 | } 17 | 18 | func setReuseAddr(fd uintptr) error { 19 | return nil 20 | } 21 | 22 | func setReusePort(fd uintptr) error { 23 | return nil 24 | } 25 | -------------------------------------------------------------------------------- /transport/internet/system_dns_android.go: -------------------------------------------------------------------------------- 1 | //go:build android 2 | // +build android 3 | 4 | package internet 5 | 6 | import ( 7 | "context" 8 | "net" 9 | ) 10 | 11 | const SystemDNS = "8.8.8.8:53" 12 | 13 | /* DNSResolverFunc 14 | This is a temporary API and is subject to removal at any time. 15 | */ 16 | type DNSResolverFunc func() *net.Resolver 17 | 18 | /* NewDNSResolver 19 | This is a temporary API and is subject to removal at any time. 20 | */ 21 | var NewDNSResolver DNSResolverFunc = func() *net.Resolver { 22 | return &net.Resolver{ 23 | PreferGo: true, 24 | Dial: func(ctx context.Context, network, _ string) (net.Conn, error) { 25 | var dialer net.Dialer 26 | return dialer.DialContext(ctx, network, SystemDNS) 27 | }, 28 | } 29 | } 30 | 31 | func init() { 32 | net.DefaultResolver = NewDNSResolver() 33 | } 34 | -------------------------------------------------------------------------------- /transport/internet/system_dns_android_test.go: -------------------------------------------------------------------------------- 1 | //go:build android 2 | // +build android 3 | 4 | package internet 5 | 6 | import ( 7 | "context" 8 | "testing" 9 | ) 10 | 11 | func TestDNSResolver(t *testing.T) { 12 | resolver := NewDNSResolver() 13 | if ips, err := resolver.LookupIP(context.Background(), "ip", "www.google.com"); err != nil { 14 | t.Errorf("failed to lookupIP, %v, %v", ips, err) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /transport/internet/system_listener_test.go: -------------------------------------------------------------------------------- 1 | package internet_test 2 | 3 | import ( 4 | "context" 5 | "net" 6 | "testing" 7 | 8 | "github.com/v2fly/v2ray-core/v5/common" 9 | "github.com/v2fly/v2ray-core/v5/transport/internet" 10 | ) 11 | 12 | func TestRegisterListenerController(t *testing.T) { 13 | var gotFd uintptr 14 | 15 | common.Must(internet.RegisterListenerController(func(network string, addr string, fd uintptr) error { 16 | gotFd = fd 17 | return nil 18 | })) 19 | 20 | conn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ 21 | IP: net.IPv4zero, 22 | }, nil) 23 | common.Must(err) 24 | common.Must(conn.Close()) 25 | 26 | if gotFd == 0 { 27 | t.Error("expected none-zero fd, but actually 0") 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /transport/internet/tagged/tagged.go: -------------------------------------------------------------------------------- 1 | package tagged 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common/net" 7 | ) 8 | 9 | type DialFunc func(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) 10 | 11 | var Dialer DialFunc 12 | -------------------------------------------------------------------------------- /transport/internet/tagged/taggedimpl/errors.generated.go: -------------------------------------------------------------------------------- 1 | package taggedimpl 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/tagged/taggedimpl/taggedimpl.go: -------------------------------------------------------------------------------- 1 | package taggedimpl 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/tcp/config.go: -------------------------------------------------------------------------------- 1 | package tcp 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/transport/internet" 6 | ) 7 | 8 | const protocolName = "tcp" 9 | 10 | func init() { 11 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 12 | return new(Config) 13 | })) 14 | } 15 | -------------------------------------------------------------------------------- /transport/internet/tcp/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.tcp; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Tcp"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/tcp"; 6 | option java_package = "com.v2ray.core.transport.internet.tcp"; 7 | option java_multiple_files = true; 8 | 9 | import "google/protobuf/any.proto"; 10 | import "common/protoext/extensions.proto"; 11 | 12 | message Config { 13 | option (v2ray.core.common.protoext.message_opt).type = "transport"; 14 | option (v2ray.core.common.protoext.message_opt).short_name = "tcp"; 15 | 16 | reserved 1; 17 | google.protobuf.Any header_settings = 2; 18 | bool accept_proxy_protocol = 3; 19 | } 20 | -------------------------------------------------------------------------------- /transport/internet/tcp/errors.generated.go: -------------------------------------------------------------------------------- 1 | package tcp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/tcp/sockopt_freebsd.go: -------------------------------------------------------------------------------- 1 | //go:build freebsd 2 | // +build freebsd 3 | 4 | package tcp 5 | 6 | import ( 7 | "github.com/v2fly/v2ray-core/v5/common/net" 8 | "github.com/v2fly/v2ray-core/v5/transport/internet" 9 | ) 10 | 11 | // GetOriginalDestination from tcp conn 12 | func GetOriginalDestination(conn internet.Connection) (net.Destination, error) { 13 | la := conn.LocalAddr() 14 | ra := conn.RemoteAddr() 15 | ip, port, err := internet.OriginalDst(la, ra) 16 | if err != nil { 17 | return net.Destination{}, newError("failed to get destination").Base(err) 18 | } 19 | dest := net.TCPDestination(net.IPAddress(ip), net.Port(port)) 20 | if !dest.IsValid() { 21 | return net.Destination{}, newError("failed to parse destination.") 22 | } 23 | return dest, nil 24 | } 25 | -------------------------------------------------------------------------------- /transport/internet/tcp/sockopt_linux_test.go: -------------------------------------------------------------------------------- 1 | //go:build linux 2 | // +build linux 3 | 4 | package tcp_test 5 | 6 | import ( 7 | "context" 8 | "strings" 9 | "testing" 10 | 11 | "github.com/v2fly/v2ray-core/v5/common" 12 | "github.com/v2fly/v2ray-core/v5/testing/servers/tcp" 13 | "github.com/v2fly/v2ray-core/v5/transport/internet" 14 | . "github.com/v2fly/v2ray-core/v5/transport/internet/tcp" 15 | ) 16 | 17 | func TestGetOriginalDestination(t *testing.T) { 18 | tcpServer := tcp.Server{} 19 | dest, err := tcpServer.Start() 20 | common.Must(err) 21 | defer tcpServer.Close() 22 | 23 | config, err := internet.ToMemoryStreamConfig(nil) 24 | common.Must(err) 25 | conn, err := Dial(context.Background(), dest, config) 26 | common.Must(err) 27 | defer conn.Close() 28 | 29 | originalDest, err := GetOriginalDestination(conn) 30 | if !(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt")) { 31 | t.Error("unexpected state") 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /transport/internet/tcp/sockopt_other.go: -------------------------------------------------------------------------------- 1 | //go:build !linux && !freebsd 2 | // +build !linux,!freebsd 3 | 4 | package tcp 5 | 6 | import ( 7 | "github.com/v2fly/v2ray-core/v5/common/net" 8 | "github.com/v2fly/v2ray-core/v5/transport/internet" 9 | ) 10 | 11 | func GetOriginalDestination(conn internet.Connection) (net.Destination, error) { 12 | return net.Destination{}, nil 13 | } 14 | -------------------------------------------------------------------------------- /transport/internet/tcp/tcp.go: -------------------------------------------------------------------------------- 1 | package tcp 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | -------------------------------------------------------------------------------- /transport/internet/tls/config_windows.go: -------------------------------------------------------------------------------- 1 | //go:build windows 2 | // +build windows 3 | 4 | package tls 5 | 6 | import "crypto/x509" 7 | 8 | func (c *Config) getCertPool() (*x509.CertPool, error) { 9 | if c.DisableSystemRoot { 10 | return c.loadSelfCertPool(Certificate_AUTHORITY_VERIFY) 11 | } 12 | 13 | return nil, nil 14 | } 15 | -------------------------------------------------------------------------------- /transport/internet/tls/errors.generated.go: -------------------------------------------------------------------------------- 1 | package tls 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/tls/pin.go: -------------------------------------------------------------------------------- 1 | package tls 2 | 3 | import ( 4 | "crypto/sha256" 5 | "encoding/base64" 6 | "encoding/pem" 7 | ) 8 | 9 | func CalculatePEMCertChainSHA256Hash(certContent []byte) string { 10 | var certChain [][]byte 11 | for { 12 | block, remain := pem.Decode(certContent) 13 | if block == nil { 14 | break 15 | } 16 | certChain = append(certChain, block.Bytes) 17 | certContent = remain 18 | } 19 | certChainHash := GenerateCertChainHash(certChain) 20 | certChainHashB64 := base64.StdEncoding.EncodeToString(certChainHash) 21 | return certChainHashB64 22 | } 23 | 24 | func GenerateCertChainHash(rawCerts [][]byte) []byte { 25 | var hashValue []byte 26 | for _, certValue := range rawCerts { 27 | out := sha256.Sum256(certValue) 28 | if hashValue == nil { 29 | hashValue = out[:] 30 | } else { 31 | newHashValue := sha256.Sum256(append(hashValue, out[:]...)) 32 | hashValue = newHashValue[:] 33 | } 34 | } 35 | return hashValue 36 | } 37 | -------------------------------------------------------------------------------- /transport/internet/udp/config.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common" 5 | "github.com/v2fly/v2ray-core/v5/transport/internet" 6 | ) 7 | 8 | func init() { 9 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 10 | return new(Config) 11 | })) 12 | } 13 | -------------------------------------------------------------------------------- /transport/internet/udp/config.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package v2ray.core.transport.internet.udp; 4 | option csharp_namespace = "V2Ray.Core.Transport.Internet.Udp"; 5 | option go_package = "github.com/v2fly/v2ray-core/v5/transport/internet/udp"; 6 | option java_package = "com.v2ray.core.transport.internet.udp"; 7 | option java_multiple_files = true; 8 | 9 | message Config {} 10 | -------------------------------------------------------------------------------- /transport/internet/udp/dialer.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | "github.com/v2fly/v2ray-core/v5/common/net" 8 | "github.com/v2fly/v2ray-core/v5/transport/internet" 9 | ) 10 | 11 | func init() { 12 | common.Must(internet.RegisterTransportDialer(protocolName, 13 | func(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { 14 | var sockopt *internet.SocketConfig 15 | if streamSettings != nil { 16 | sockopt = streamSettings.SocketSettings 17 | } 18 | conn, err := internet.DialSystem(ctx, dest, sockopt) 19 | if err != nil { 20 | return nil, err 21 | } 22 | // TODO: handle dialer options 23 | return internet.Connection(conn), nil 24 | })) 25 | } 26 | -------------------------------------------------------------------------------- /transport/internet/udp/dispatcher.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | "github.com/v2fly/v2ray-core/v5/common/buf" 8 | "github.com/v2fly/v2ray-core/v5/common/net" 9 | ) 10 | 11 | type DispatcherI interface { 12 | common.Closable 13 | Dispatch(ctx context.Context, destination net.Destination, payload *buf.Buffer) 14 | } 15 | -------------------------------------------------------------------------------- /transport/internet/udp/errors.generated.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/udp/hub_other.go: -------------------------------------------------------------------------------- 1 | //go:build !linux && !freebsd 2 | // +build !linux,!freebsd 3 | 4 | package udp 5 | 6 | import ( 7 | "github.com/v2fly/v2ray-core/v5/common/net" 8 | ) 9 | 10 | func RetrieveOriginalDest(oob []byte) net.Destination { 11 | return net.Destination{} 12 | } 13 | 14 | func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { 15 | nBytes, addr, err := conn.ReadFromUDP(payload) 16 | return nBytes, 0, 0, addr, err 17 | } 18 | -------------------------------------------------------------------------------- /transport/internet/udp/udp.go: -------------------------------------------------------------------------------- 1 | package udp 2 | 3 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 4 | 5 | const protocolName = "udp" 6 | -------------------------------------------------------------------------------- /transport/internet/websocket/config.go: -------------------------------------------------------------------------------- 1 | package websocket 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/v2fly/v2ray-core/v5/common" 7 | "github.com/v2fly/v2ray-core/v5/transport/internet" 8 | ) 9 | 10 | const protocolName = "websocket" 11 | 12 | func (c *Config) GetNormalizedPath() string { 13 | path := c.Path 14 | if path == "" { 15 | return "/" 16 | } 17 | if path[0] != '/' { 18 | return "/" + path 19 | } 20 | return path 21 | } 22 | 23 | func (c *Config) GetRequestHeader() http.Header { 24 | header := http.Header{} 25 | for _, h := range c.Header { 26 | header.Add(h.Key, h.Value) 27 | } 28 | return header 29 | } 30 | 31 | func init() { 32 | common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 33 | return new(Config) 34 | })) 35 | } 36 | -------------------------------------------------------------------------------- /transport/internet/websocket/errors.generated.go: -------------------------------------------------------------------------------- 1 | package websocket 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/websocket/ws.go: -------------------------------------------------------------------------------- 1 | /*Package websocket implements Websocket transport 2 | 3 | Websocket transport implements an HTTP(S) compliable, surveillance proof transport method with plausible deniability. 4 | */ 5 | package websocket 6 | 7 | //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen 8 | -------------------------------------------------------------------------------- /transport/internet/xtls/config_windows.go: -------------------------------------------------------------------------------- 1 | //go:build windows 2 | // +build windows 3 | 4 | package xtls 5 | 6 | import "crypto/x509" 7 | 8 | func (c *Config) getCertPool() (*x509.CertPool, error) { 9 | if c.DisableSystemRoot { 10 | return c.loadSelfCertPool() 11 | } 12 | 13 | return nil, nil 14 | } 15 | -------------------------------------------------------------------------------- /transport/internet/xtls/errors.generated.go: -------------------------------------------------------------------------------- 1 | package xtls 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/errors" 4 | 5 | type errPathObjHolder struct{} 6 | 7 | func newError(values ...interface{}) *errors.Error { 8 | return errors.New(values...).WithPathObj(errPathObjHolder{}) 9 | } 10 | -------------------------------------------------------------------------------- /transport/internet/xtls/unsafe.go: -------------------------------------------------------------------------------- 1 | package xtls 2 | 3 | import _ "unsafe" 4 | 5 | //go:linkname errNoCertificates github.com/xtls/go.errNoCertificates 6 | var errNoCertificates error 7 | -------------------------------------------------------------------------------- /transport/link.go: -------------------------------------------------------------------------------- 1 | package transport 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/buf" 4 | 5 | // Link is a utility for connecting between an inbound and an outbound proxy handler. 6 | type Link struct { 7 | Reader buf.Reader 8 | Writer buf.Writer 9 | } 10 | -------------------------------------------------------------------------------- /transport/pipe/interface.go: -------------------------------------------------------------------------------- 1 | package pipe 2 | 3 | import "github.com/v2fly/v2ray-core/v5/common/buf" 4 | 5 | type IPipe interface { 6 | IsPipe() bool 7 | } 8 | 9 | func IsPipe(pipe any) bool { 10 | if p, ok := pipe.(IPipe); ok { 11 | return p.IsPipe() 12 | } 13 | return false 14 | } 15 | 16 | type CachedReader interface { 17 | ReadMultiBufferCached() (buf.MultiBuffer, error) 18 | } 19 | -------------------------------------------------------------------------------- /transport/pipe/writer.go: -------------------------------------------------------------------------------- 1 | package pipe 2 | 3 | import ( 4 | "github.com/v2fly/v2ray-core/v5/common/buf" 5 | ) 6 | 7 | // Writer is a buf.Writer that writes data into a pipe. 8 | type Writer struct { 9 | pipe *pipe 10 | } 11 | 12 | // WriteMultiBuffer implements buf.Writer. 13 | func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error { 14 | return w.pipe.WriteMultiBuffer(mb) 15 | } 16 | 17 | // Close implements io.Closer. After the pipe is closed, writing to the pipe will return io.ErrClosedPipe, while reading will return io.EOF. 18 | func (w *Writer) Close() error { 19 | return w.pipe.Close() 20 | } 21 | 22 | // Interrupt implements common.Interruptible. 23 | func (w *Writer) Interrupt() { 24 | w.pipe.Interrupt() 25 | } 26 | 27 | func (w *Writer) IsPipe() bool { 28 | return true 29 | } 30 | --------------------------------------------------------------------------------