feat: update hickory-resolver v0.25 public release

- ref hickory-dns/hickory-dns#2206

reformatted with 1.85 new formatter
This commit is contained in:
ty
2025-03-19 12:50:53 +08:00
parent fd518ee32d
commit 9eefc2db3e
85 changed files with 296 additions and 316 deletions
Generated
+28 -14
View File
@@ -698,6 +698,12 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "critical-section"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]]
name = "crossbeam-channel"
version = "0.5.14"
@@ -1323,9 +1329,9 @@ dependencies = [
[[package]]
name = "h3"
version = "0.0.6"
version = "0.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e7675a0963b47a6d12fe44c279918b4ffb19baee838ac37f48d2722ad5bc6ab"
checksum = "7dfb059a4f28a66f186ed16ad912d142f490676acba59353831d7cb45a96b0d3"
dependencies = [
"bytes",
"fastrand",
@@ -1337,9 +1343,9 @@ dependencies = [
[[package]]
name = "h3-quinn"
version = "0.0.7"
version = "0.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17c799f413fceeea505236c4d8132f084ff4b55a652288d91439ee93dc24d855"
checksum = "6d482318ae94198fc8e3cbb0b7ba3099c865d744e6ec7c62039ca7b6b6c66fbf"
dependencies = [
"bytes",
"futures",
@@ -1388,14 +1394,15 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hickory-proto"
version = "0.25.0-alpha.5"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d00147af6310f4392a31680db52a3ed45a2e0f68eb18e8c3fe5537ecc96d9e2"
checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287"
dependencies = [
"async-recursion",
"async-trait",
"bytes",
"cfg-if",
"critical-section",
"data-encoding",
"enum-as-inner",
"futures-channel",
@@ -1411,6 +1418,7 @@ dependencies = [
"pin-project-lite",
"quinn",
"rand 0.9.0",
"ring",
"rustls",
"serde",
"thiserror 2.0.12",
@@ -1424,9 +1432,9 @@ dependencies = [
[[package]]
name = "hickory-resolver"
version = "0.25.0-alpha.5"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5762f69ebdbd4ddb2e975cd24690bf21fe6b2604039189c26acddbc427f12887"
checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331"
dependencies = [
"cfg-if",
"futures-util",
@@ -2320,6 +2328,10 @@ name = "once_cell"
version = "1.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
dependencies = [
"critical-section",
"portable-atomic",
]
[[package]]
name = "opaque-debug"
@@ -2663,11 +2675,12 @@ checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec"
[[package]]
name = "quinn"
version = "0.11.6"
version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012"
dependencies = [
"bytes",
"cfg_aliases",
"futures-io",
"pin-project-lite",
"quinn-proto",
@@ -2678,17 +2691,18 @@ dependencies = [
"thiserror 2.0.12",
"tokio",
"tracing",
"web-time",
]
[[package]]
name = "quinn-proto"
version = "0.11.9"
version = "0.11.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
dependencies = [
"bytes",
"getrandom 0.2.15",
"rand 0.8.5",
"getrandom 0.3.1",
"rand 0.9.0",
"ring",
"rustc-hash 2.1.1",
"rustls",
+1 -1
View File
@@ -6,7 +6,7 @@
use std::process::ExitCode;
use clap::{Arg, ArgAction, Command, ValueHint};
use qrcode::{types::Color, QrCode};
use qrcode::{QrCode, types::Color};
use shadowsocks_service::{
config::{Config, ConfigType, ServerInstanceConfig},
+4 -4
View File
@@ -42,15 +42,15 @@ hickory-dns = ["hickory-resolver", "shadowsocks/trust-dns"]
trust-dns = ["hickory-dns"]
dns-over-tls = [
"hickory-dns",
"hickory-resolver/dns-over-rustls",
"hickory-resolver/tls-ring",
"hickory-resolver/webpki-roots",
]
dns-over-https = [
"hickory-dns",
"hickory-resolver/dns-over-https-rustls",
"hickory-resolver/https-ring",
"hickory-resolver/webpki-roots",
]
dns-over-h3 = ["hickory-dns", "hickory-resolver/dns-over-h3"]
dns-over-h3 = ["hickory-dns", "hickory-resolver/h3-ring"]
# Enable DNS-relay
local-dns = ["local", "hickory-dns"]
@@ -166,7 +166,7 @@ http-body-util = { version = "0.1", optional = true }
http = { version = "1.1", optional = true }
httparse = { version = "1.9", optional = true }
hickory-resolver = { version = "=0.25.0-alpha.5", optional = true, features = [
hickory-resolver = { version = "0.25", optional = true, features = [
"serde",
] }
+3 -1
View File
@@ -1893,7 +1893,9 @@ impl Config {
return Err(err);
}
None => {
warn!("OnlineConfig \"version\" is missing in the configuration, assuming it is a compatible version for this project");
warn!(
"OnlineConfig \"version\" is missing in the configuration, assuming it is a compatible version for this project"
);
}
}
}
+3 -3
View File
@@ -41,9 +41,9 @@ pub async fn build_dns_resolver(
Ok(r) => Some(r),
Err(err) => {
warn!(
"initialize hickory-dns DNS system resolver failed, fallback to default system resolver, error: {}",
err
);
"initialize hickory-dns DNS system resolver failed, fallback to default system resolver, error: {}",
err
);
None
}
};
@@ -3,14 +3,14 @@
#[cfg(unix)]
use std::path::Path;
use std::{
collections::{hash_map::Entry, HashMap, VecDeque},
collections::{HashMap, VecDeque, hash_map::Entry},
future::Future,
io,
net::SocketAddr,
time::Duration,
};
use hickory_resolver::proto::{op::Message, ProtoError};
use hickory_resolver::proto::{ProtoError, op::Message};
use log::{debug, trace};
use tokio::sync::Mutex;
@@ -15,11 +15,11 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use futures::{
future::{self, Either},
FutureExt,
future::{self, Either},
};
use hickory_resolver::proto::{
op::{header::MessageType, response_code::ResponseCode, Message, OpCode, Query},
op::{Message, OpCode, Query, header::MessageType, response_code::ResponseCode},
rr::{DNSClass, Name, RData, RecordType},
};
use log::{debug, error, info, trace, warn};
@@ -30,10 +30,10 @@ use tokio::{
};
use shadowsocks::{
ServerAddr,
config::Mode,
net::TcpListener,
relay::{udprelay::MAXIMUM_UDP_PAYLOAD_SIZE, Address},
ServerAddr,
relay::{Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
};
use crate::{
@@ -12,7 +12,7 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use hickory_resolver::proto::{op::Message, ProtoError, ProtoErrorKind};
use hickory_resolver::proto::{ProtoError, ProtoErrorKind, op::Message};
use log::{error, trace};
use lru_time_cache::{Entry, LruCache};
use shadowsocks::{
@@ -20,9 +20,9 @@ use shadowsocks::{
context::SharedContext,
net::{ConnectOpts, TcpStream as ShadowTcpStream, UdpSocket as ShadowUdpSocket},
relay::{
tcprelay::ProxyClientStream,
udprelay::{options::UdpSocketControlData, ProxySocket},
Address,
tcprelay::ProxyClientStream,
udprelay::{ProxySocket, options::UdpSocketControlData},
},
};
#[cfg(unix)]
@@ -34,9 +34,9 @@ use tokio::{
};
use crate::{
local::net::udp::generate_client_session_id,
net::{packet_window::PacketWindowFilter, FlowStat, MonProxySocket, MonProxyStream},
DEFAULT_UDP_EXPIRY_DURATION,
local::net::udp::generate_client_session_id,
net::{FlowStat, MonProxySocket, MonProxyStream, packet_window::PacketWindowFilter},
};
/// Collection of various DNS connections
@@ -231,8 +231,8 @@ impl DnsClient {
#[cfg(windows)]
fn check_peekable<F: std::os::windows::io::AsRawSocket>(s: &mut F) -> bool {
use windows_sys::{
Win32::Networking::WinSock::{MSG_PEEK, SOCKET, recv},
core::PSTR,
Win32::Networking::WinSock::{recv, MSG_PEEK, SOCKET},
};
let sock = s.as_raw_socket() as SOCKET;
@@ -75,9 +75,7 @@ macro_rules! map_domain_ip {
db.put(&name2ip_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {}",
$domain,
i,
domain_name_mapping.expire_time
$domain, i, domain_name_mapping.expire_time
);
return Ok((i, $self.expire_duration));
} else {
@@ -94,9 +92,7 @@ macro_rules! map_domain_ip {
db.put(&ip2name_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {}",
$domain,
i,
domain_name_mapping.expire_time
$domain, i, domain_name_mapping.expire_time
);
return Ok((i, $self.expire_duration));
}
@@ -141,9 +137,7 @@ macro_rules! map_domain_ip {
db.put(&name2ip_key, nv)?;
trace!(
"fakedns mapping {} -> {}, expires {} created",
$domain,
ip,
domain_name_mapping.expire_time
$domain, ip, domain_name_mapping.expire_time
);
return Ok((ip, $self.expire_duration));
@@ -3,10 +3,10 @@
use std::io;
use hickory_resolver::proto::{
op::{header::MessageType, response_code::ResponseCode, Header, Message, OpCode},
op::{Header, Message, OpCode, header::MessageType, response_code::ResponseCode},
rr::{
rdata::{A, AAAA},
DNSClass, RData, Record, RecordType,
rdata::{A, AAAA},
},
};
use log::{debug, trace, warn};
@@ -8,7 +8,7 @@ use std::{
time::Duration,
};
use futures::{future, FutureExt};
use futures::{FutureExt, future};
use ipnet::{Ipv4Net, Ipv6Net};
use shadowsocks::config::{Mode, ServerAddr};
@@ -10,11 +10,11 @@ use std::{
use byteorder::{BigEndian, ByteOrder};
use bytes::{BufMut, BytesMut};
use hickory_resolver::proto::{
op::{response_code::ResponseCode, Message},
op::{Message, response_code::ResponseCode},
serialize::binary::{BinEncodable, BinEncoder, EncodeMode},
};
use log::{error, trace};
use shadowsocks::{lookup_then, net::TcpListener as ShadowTcpListener, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::TcpListener as ShadowTcpListener};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
net::TcpStream,
@@ -2,9 +2,9 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use hickory_resolver::proto::op::{response_code::ResponseCode, Message};
use hickory_resolver::proto::op::{Message, response_code::ResponseCode};
use log::error;
use shadowsocks::{lookup_then, net::UdpSocket as ShadowUdpSocket, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::UdpSocket as ShadowUdpSocket};
use tokio::time;
use crate::local::context::ServiceContext;
@@ -12,13 +12,13 @@ use std::{
time::{Duration, Instant},
};
use http::{header::InvalidHeaderValue, HeaderValue, Method as HttpMethod, Uri, Version as HttpVersion};
use http::{HeaderValue, Method as HttpMethod, Uri, Version as HttpVersion, header::InvalidHeaderValue};
use hyper::{
Request, Response,
body::{self, Body},
client::conn::{http1, http2},
http::uri::Scheme,
rt::{Sleep, Timer},
Request, Response,
};
use log::{error, trace};
use lru_time_cache::LruCache;
@@ -229,8 +229,7 @@ where
if check_keep_alive(response.version(), response.headers(), false) {
trace!(
"HTTP connection keep-alive for host: {}, response: {:?}",
host,
response
host, response
);
self.cache_conn
.lock()
@@ -284,8 +283,7 @@ where
) -> io::Result<HttpConnection<B>> {
trace!(
"HTTP making new HTTP/1.1 connection to host: {}, scheme: {}",
host,
scheme
host, scheme
);
let stream = ProxyHttpStream::connect_http(stream);
@@ -3,12 +3,11 @@
use std::{net::SocketAddr, str::FromStr, sync::Arc};
use bytes::Bytes;
use http_body_util::{combinators::BoxBody, BodyExt};
use http_body_util::{BodyExt, combinators::BoxBody};
use hyper::{
body,
HeaderMap, Method, Request, Response, StatusCode, Uri, Version, body,
header::{self, HeaderValue},
http::uri::{Authority, Scheme},
HeaderMap, Method, Request, Response, StatusCode, Uri, Version,
};
use log::{debug, error, trace};
use shadowsocks::relay::Address;
@@ -65,8 +65,8 @@ impl ProxyHttpStream {
use rustls_native_certs::CertificateResult;
use std::sync::Arc;
use tokio_rustls::{
rustls::{pki_types::ServerName, ClientConfig, RootCertStore},
TlsConnector,
rustls::{ClientConfig, RootCertStore, pki_types::ServerName},
};
static TLS_CONFIG: Lazy<Arc<ClientConfig>> = Lazy::new(|| {
@@ -7,9 +7,9 @@ use std::{
};
use hyper::{
HeaderMap, Uri, Version,
header::{self, HeaderValue},
http::uri::Authority,
HeaderMap, Uri, Version,
};
use log::error;
use shadowsocks::relay::socks5::Address;
@@ -7,8 +7,8 @@ use std::{
iter::Iterator,
net::{Ipv4Addr, SocketAddr},
sync::{
atomic::{AtomicUsize, Ordering},
Arc,
atomic::{AtomicUsize, Ordering},
},
time::{Duration, Instant},
};
@@ -18,14 +18,14 @@ use byte_string::ByteStr;
use futures::future;
use log::{debug, error, info, trace, warn};
use shadowsocks::{
ServerConfig,
config::{Mode, ServerSource},
plugin::{Plugin, PluginMode},
relay::{
socks5::Address,
tcprelay::proxy_stream::ProxyClientStream,
udprelay::{options::UdpSocketControlData, proxy_socket::ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, options::UdpSocketControlData, proxy_socket::ProxySocket},
},
ServerConfig,
};
use spin::Mutex as SpinMutex;
use tokio::{
@@ -39,7 +39,7 @@ use crate::{config::ServerInstanceConfig, local::context::ServiceContext};
use super::{
server_data::ServerIdent,
server_stat::{Score, DEFAULT_CHECK_INTERVAL_SEC, DEFAULT_CHECK_TIMEOUT_SEC},
server_stat::{DEFAULT_CHECK_INTERVAL_SEC, DEFAULT_CHECK_TIMEOUT_SEC, Score},
};
const EXPECTED_CHECK_POINTS_IN_CHECK_WINDOW: u32 = 67;
@@ -4,13 +4,13 @@ use std::{
fmt::{self, Debug},
net::SocketAddr,
sync::{
atomic::{AtomicU32, Ordering},
Arc,
atomic::{AtomicU32, Ordering},
},
time::Duration,
};
use shadowsocks::{net::ConnectOpts, ServerConfig};
use shadowsocks::{ServerConfig, net::ConnectOpts};
use tokio::sync::Mutex;
use crate::{config::ServerInstanceConfig, local::context::ServiceContext};
+6 -2
View File
@@ -106,8 +106,12 @@ impl Server {
let server = &inst.config;
if server.method().is_stream() {
log::warn!("stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.", server.method(), server.addr());
log::warn!(
"stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.",
server.method(),
server.addr()
);
}
}
@@ -13,23 +13,23 @@ use bytes::Bytes;
use futures::future;
use log::{debug, error, trace, warn};
use lru_time_cache::LruCache;
use rand::{rngs::SmallRng, Rng, SeedableRng};
use rand::{Rng, SeedableRng, rngs::SmallRng};
use tokio::{sync::mpsc, task::JoinHandle, time};
use shadowsocks::{
lookup_then,
net::{AddrFamily, UdpSocket as ShadowUdpSocket},
relay::{
udprelay::{options::UdpSocketControlData, ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
Address,
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, ProxySocket, options::UdpSocketControlData},
},
};
use crate::{
local::{context::ServiceContext, loadbalancing::PingBalancer},
net::{
packet_window::PacketWindowFilter, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE, UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
packet_window::PacketWindowFilter,
},
};
@@ -1,5 +1,5 @@
#[allow(unused_imports)]
pub use self::association::{generate_client_session_id, UdpAssociationManager, UdpInboundWrite};
pub use self::association::{UdpAssociationManager, UdpInboundWrite, generate_client_session_id};
pub mod association;
pub mod listener;
@@ -19,7 +19,7 @@ use mime::Mime;
use shadowsocks::config::ServerSource;
use tokio::time;
use self::content_encoding::{read_body, ContentEncoding};
use self::content_encoding::{ContentEncoding, read_body};
mod content_encoding;
@@ -214,7 +214,8 @@ impl OnlineConfigService {
let finish_time = Instant::now();
debug!("server-loader task finished loading {} servers from url: {}, fetch time: {:?}, read time: {:?}, load time: {:?}, total time: {:?}",
debug!(
"server-loader task finished loading {} servers from url: {}, fetch time: {:?}, read time: {:?}, load time: {:?}, total time: {:?}",
server_len,
self.config_url,
fetch_time - start_time,
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode};
use crate::{
config::RedirType,
@@ -13,7 +13,7 @@ use nix::ioctl_readwrite;
use once_cell::sync::Lazy;
use socket2::{Protocol, SockAddr};
use super::pfvar::{in6_addr, in_addr, pfioc_natlook, sockaddr_in, sockaddr_in6, PF_OUT};
use super::pfvar::{PF_OUT, in_addr, in6_addr, pfioc_natlook, sockaddr_in, sockaddr_in6};
#[cfg(any(target_os = "macos", target_os = "ios"))]
use super::pfvar::{pf_addr, pfioc_states, pfsync_state};
@@ -3524,7 +3524,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn cpuset_getid(arg1: cpulevel_t, arg2: cpuwhich_t, arg3: id_t, arg4: *mut cpusetid_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn cpuset_getaffinity(
@@ -6739,7 +6739,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn clock_getcpuclockid2(arg1: id_t, arg2: ::std::os::raw::c_int, arg3: *mut clockid_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn futimes(arg1: ::std::os::raw::c_int, arg2: *const timeval) -> ::std::os::raw::c_int;
@@ -7562,11 +7562,11 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -7644,7 +7644,7 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn sendmmsg(arg1: ::std::os::raw::c_int, arg2: *mut mmsghdr, arg3: usize, arg4: ::std::os::raw::c_int)
-> isize;
-> isize;
}
unsafe extern "C" {
pub fn setfib(arg1: ::std::os::raw::c_int) -> ::std::os::raw::c_int;
@@ -10859,12 +10859,12 @@ unsafe extern "C" {
unsafe extern "C" {
#[link_name = "\u{1}_getpeername$UNIX2003"]
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
#[link_name = "\u{1}_getsockname$UNIX2003"]
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -1134,7 +1134,7 @@ pub const uio_seg_UIO_SYSSPACE: uio_seg = 1;
pub type uio_seg = ::std::os::raw::c_uint;
unsafe extern "C" {
pub fn preadv(arg1: ::std::os::raw::c_int, arg2: *const iovec, arg3: ::std::os::raw::c_int, arg4: __off_t)
-> isize;
-> isize;
}
unsafe extern "C" {
pub fn pwritev(
@@ -1599,11 +1599,11 @@ unsafe extern "C" {
}
unsafe extern "C" {
pub fn getpeername(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockname(arg1: ::std::os::raw::c_int, arg2: *mut sockaddr, arg3: *mut socklen_t)
-> ::std::os::raw::c_int;
-> ::std::os::raw::c_int;
}
unsafe extern "C" {
pub fn getsockopt(
@@ -8,7 +8,7 @@ use std::{
};
use log::{debug, error, info, trace};
use shadowsocks::{lookup_then, net::TcpListener as ShadowTcpListener, relay::socks5::Address, ServerAddr};
use shadowsocks::{ServerAddr, lookup_then, net::TcpListener as ShadowTcpListener, relay::socks5::Address};
use tokio::{
net::{TcpListener, TcpStream},
time,
@@ -4,7 +4,7 @@ use std::{
};
use log::warn;
use shadowsocks::net::{is_dual_stack_addr, set_tcp_fastopen, AcceptOpts};
use shadowsocks::net::{AcceptOpts, is_dual_stack_addr, set_tcp_fastopen};
use socket2::Protocol;
use tokio::net::{TcpListener, TcpSocket, TcpStream};
@@ -6,7 +6,7 @@ use std::{
};
use log::warn;
use shadowsocks::net::{is_dual_stack_addr, set_tcp_fastopen, AcceptOpts};
use shadowsocks::net::{AcceptOpts, is_dual_stack_addr, set_tcp_fastopen};
use socket2::SockAddr;
use tokio::net::{TcpListener, TcpSocket, TcpStream};
@@ -10,10 +10,9 @@ use std::{
use log::{debug, error, info, trace, warn};
use lru_time_cache::LruCache;
use shadowsocks::{
lookup_then,
net::{get_ip_stack_capabilities, ConnectOpts},
ServerAddr, lookup_then,
net::{ConnectOpts, get_ip_stack_capabilities},
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
ServerAddr,
};
use tokio::{sync::Mutex, task::JoinHandle, time};
@@ -186,10 +185,7 @@ impl UdpInboundWrite for UdpRedirInboundWriter {
trace!(
"udp redir send back data {} bytes, remote: {}, peer: {}, socket_opts: {:?}",
n,
remote_addr,
peer_addr,
self.socket_opts
n, remote_addr, peer_addr, self.socket_opts
);
Ok(())
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode};
use crate::local::{context::ServiceContext, loadbalancing::PingBalancer};
@@ -1,7 +1,7 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info};
use shadowsocks::{config::Mode, net::TcpListener as ShadowTcpListener, ServerAddr};
use shadowsocks::{ServerAddr, config::Mode, net::TcpListener as ShadowTcpListener};
use tokio::{net::TcpStream, time};
#[cfg(feature = "local-http")]
@@ -9,12 +9,12 @@ use std::{
use log::{debug, error, trace, warn};
use shadowsocks::{
ServerAddr,
config::Mode,
relay::socks5::{
self, Address, Command, Error as Socks5Error, HandshakeRequest, HandshakeResponse, PasswdAuthRequest,
PasswdAuthResponse, Reply, TcpRequestHeader, TcpResponseHeader,
},
ServerAddr,
};
use tokio::net::TcpStream;
@@ -145,8 +145,7 @@ impl Socks5TcpHandler {
if self.auth.passwd.check_user(user_name, password) {
trace!(
"socks5 authenticated with Username/Password method, user: {}, password: {}",
user_name,
password
user_name, password
);
let rsp = PasswdAuthResponse::new(0);
@@ -11,11 +11,11 @@ use byte_string::ByteStr;
use bytes::{BufMut, BytesMut};
use log::{debug, error, info, trace};
use shadowsocks::{
ServerAddr,
relay::{
socks5::{Address, UdpAssociateHeader},
udprelay::MAXIMUM_UDP_PAYLOAD_SIZE,
},
ServerAddr,
};
use tokio::{net::UdpSocket, time};
@@ -23,7 +23,7 @@ use crate::{
local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{udp::listener::create_standard_udp_listener, UdpAssociationManager, UdpInboundWrite},
net::{UdpAssociationManager, UdpInboundWrite, udp::listener::create_standard_udp_listener},
},
net::utils::to_ipv4_mapped,
};
@@ -186,9 +186,7 @@ impl Tun {
trace!(
"[TUN] tun device network: {} (address: {}, netmask: {})",
address_net,
address,
netmask
address_net, address, netmask
);
let address_broadcast = address_net.broadcast();
@@ -283,10 +281,7 @@ impl Tun {
if src_non_unicast || dst_non_unicast {
trace!(
"[TUN] IP packet {} (unicast? {}) -> {} (unicast? {}) throwing away",
src_ip_addr,
!src_non_unicast,
dst_ip_addr,
!dst_non_unicast
src_ip_addr, !src_non_unicast, dst_ip_addr, !dst_non_unicast
);
return Ok(());
}
@@ -320,11 +315,7 @@ impl Tun {
trace!(
"[TUN] TCP packet {} (unicast? {}) -> {} (unicast? {}) {}",
src_addr,
!src_non_unicast,
dst_addr,
!dst_non_unicast,
tcp_packet
src_addr, !src_non_unicast, dst_addr, !dst_non_unicast, tcp_packet
);
// TCP first handshake packet.
@@ -366,11 +357,7 @@ impl Tun {
let payload = udp_packet.payload();
trace!(
"[TUN] UDP packet {} (unicast? {}) -> {} (unicast? {}) {}",
src_addr,
!src_non_unicast,
dst_addr,
!dst_non_unicast,
udp_packet
src_addr, !src_non_unicast, dst_addr, !dst_non_unicast, udp_packet
);
if let Err(err) = self.udp.handle_packet(src_addr, dst_addr, payload).await {
@@ -6,8 +6,8 @@ use std::{
net::{IpAddr, SocketAddr},
pin::Pin,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
atomic::{AtomicBool, Ordering},
},
task::{Context, Poll, Waker},
thread::{self, JoinHandle, Thread},
@@ -3,8 +3,8 @@
use std::{
marker::PhantomData,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
atomic::{AtomicBool, Ordering},
},
};
@@ -2,8 +2,8 @@
use std::{io, sync::Arc, time::Duration};
use futures::{future, FutureExt};
use shadowsocks::{config::Mode, relay::socks5::Address, ServerAddr};
use futures::{FutureExt, future};
use shadowsocks::{ServerAddr, config::Mode, relay::socks5::Address};
use crate::local::{context::ServiceContext, loadbalancing::PingBalancer};
@@ -3,13 +3,13 @@
use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info, trace};
use shadowsocks::{net::TcpListener as ShadowTcpListener, relay::socks5::Address, ServerAddr};
use shadowsocks::{ServerAddr, net::TcpListener as ShadowTcpListener, relay::socks5::Address};
use tokio::{net::TcpStream, time};
use crate::local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{tcp::listener::create_standard_tcp_listener, AutoProxyClientStream},
net::{AutoProxyClientStream, tcp::listener::create_standard_tcp_listener},
utils::{establish_tcp_tunnel, establish_tcp_tunnel_bypassed},
};
@@ -4,15 +4,15 @@ use std::{io, net::SocketAddr, sync::Arc, time::Duration};
use log::{debug, error, info};
use shadowsocks::{
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
ServerAddr,
relay::{socks5::Address, udprelay::MAXIMUM_UDP_PAYLOAD_SIZE},
};
use tokio::{net::UdpSocket, time};
use crate::local::{
context::ServiceContext,
loadbalancing::PingBalancer,
net::{udp::listener::create_standard_udp_listener, UdpAssociationManager, UdpInboundWrite},
net::{UdpAssociationManager, UdpInboundWrite, udp::listener::create_standard_udp_listener},
};
pub struct TunnelUdpServerBuilder {
+6 -17
View File
@@ -8,7 +8,7 @@ use shadowsocks::{
relay::{socks5::Address, tcprelay::utils::copy_encrypted_bidirectional},
};
use tokio::{
io::{copy_bidirectional, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt},
io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, copy_bidirectional},
time,
};
@@ -60,8 +60,7 @@ where
trace!(
"tcp tunnel {} -> {} (proxied) sent handshake without data",
peer_addr,
target_addr
peer_addr, target_addr
);
}
}
@@ -71,18 +70,13 @@ where
Ok((wn, rn)) => {
trace!(
"tcp tunnel {} <-> {} (proxied) closed, L2R {} bytes, R2L {} bytes",
peer_addr,
target_addr,
rn,
wn
peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} (proxied) closed with error: {}",
peer_addr,
target_addr,
err
peer_addr, target_addr, err
);
}
}
@@ -106,18 +100,13 @@ where
Ok((rn, wn)) => {
trace!(
"tcp tunnel {} <-> {} (bypassed) closed, L2R {} bytes, R2L {} bytes",
peer_addr,
target_addr,
rn,
wn
peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} (bypassed) closed with error: {}",
peer_addr,
target_addr,
err
peer_addr, target_addr, err
);
}
}
@@ -6,6 +6,7 @@ use std::{collections::HashMap, io, net::SocketAddr, sync::Arc, time::Duration};
use log::{error, info, trace};
use shadowsocks::{
ManagerListener, ServerAddr,
config::{Mode, ServerConfig, ServerType, ServerUser, ServerUserManager},
context::{Context, SharedContext},
crypto::CipherKind,
@@ -19,7 +20,6 @@ use shadowsocks::{
},
net::{AcceptOpts, ConnectOpts},
plugin::PluginConfig,
ManagerListener, ServerAddr,
};
use tokio::{sync::Mutex, task::JoinHandle};
@@ -3,11 +3,11 @@
use std::{io, net::SocketAddr, sync::Arc};
use shadowsocks::{
ProxySocket,
relay::{
socks5::Address,
udprelay::{options::UdpSocketControlData, DatagramReceive, DatagramSend},
udprelay::{DatagramReceive, DatagramSend, options::UdpSocketControlData},
},
ProxySocket,
};
use super::flow::FlowStat;
+6 -2
View File
@@ -42,8 +42,12 @@ pub async fn run(config: Config) -> io::Result<()> {
let server = &inst.config;
if server.method().is_stream() {
log::warn!("stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.", server.method(), server.addr());
log::warn!(
"stream cipher {} for server {} have inherent weaknesses (see discussion in https://github.com/shadowsocks/shadowsocks-org/issues/36). \
DO NOT USE. It will be removed in the future.",
server.method(),
server.addr()
);
}
}
@@ -10,11 +10,11 @@ use std::{
use futures::future;
use log::{error, trace};
use shadowsocks::{
ManagerClient,
config::{ManagerAddr, ServerConfig},
dns_resolver::DnsResolver,
net::{AcceptOpts, ConnectOpts},
plugin::{Plugin, PluginMode},
ManagerClient,
};
use tokio::time;
@@ -10,10 +10,10 @@ use std::{
use log::{debug, error, info, trace, warn};
use shadowsocks::{
ProxyListener, ServerConfig,
crypto::CipherKind,
net::{AcceptOpts, TcpStream as OutboundTcpStream},
relay::tcprelay::{utils::copy_encrypted_bidirectional, ProxyServerStream},
ProxyListener, ServerConfig,
relay::tcprelay::{ProxyServerStream, utils::copy_encrypted_bidirectional},
};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
@@ -21,7 +21,7 @@ use tokio::{
time,
};
use crate::net::{utils::ignore_until_end, MonProxyStream};
use crate::net::{MonProxyStream, utils::ignore_until_end};
use super::context::ServiceContext;
@@ -179,8 +179,7 @@ impl TcpServerClient {
trace!(
"tcp silent-drop peer: {} is now closing with result {:?}",
self.peer_addr,
res
self.peer_addr, res
);
return Ok(());
@@ -189,8 +188,7 @@ impl TcpServerClient {
trace!(
"accepted tcp client connection {}, establishing tunnel to {}",
self.peer_addr,
target_addr
self.peer_addr, target_addr
);
if self.context.check_outbound_blocked(&target_addr).await {
@@ -244,8 +242,7 @@ impl TcpServerClient {
trace!(
"tcp tunnel {} -> {} sent TFO connect without data",
self.peer_addr,
target_addr
self.peer_addr, target_addr
);
}
}
@@ -262,18 +259,13 @@ impl TcpServerClient {
Ok((rn, wn)) => {
trace!(
"tcp tunnel {} <-> {} closed, L2R {} bytes, R2L {} bytes",
self.peer_addr,
target_addr,
rn,
wn
self.peer_addr, target_addr, rn, wn
);
}
Err(err) => {
trace!(
"tcp tunnel {} <-> {} closed with error: {}",
self.peer_addr,
target_addr,
err
self.peer_addr, target_addr, err
);
}
}
@@ -12,26 +12,26 @@ use bytes::Bytes;
use futures::future;
use log::{debug, error, info, trace, warn};
use lru_time_cache::LruCache;
use rand::{rngs::SmallRng, Rng, SeedableRng};
use rand::{Rng, SeedableRng, rngs::SmallRng};
use shadowsocks::{
ServerConfig,
config::ServerUser,
crypto::CipherCategory,
lookup_then,
net::{
get_ip_stack_capabilities, AcceptOpts, AddrFamily, UdpSocket as OutboundUdpSocket,
UdpSocket as InboundUdpSocket,
AcceptOpts, AddrFamily, UdpSocket as OutboundUdpSocket, UdpSocket as InboundUdpSocket,
get_ip_stack_capabilities,
},
relay::{
socks5::Address,
udprelay::{options::UdpSocketControlData, ProxySocket, MAXIMUM_UDP_PAYLOAD_SIZE},
udprelay::{MAXIMUM_UDP_PAYLOAD_SIZE, ProxySocket, options::UdpSocketControlData},
},
ServerConfig,
};
use tokio::{runtime::Handle, sync::mpsc, task::JoinHandle, time};
use crate::net::{
packet_window::PacketWindowFilter, utils::to_ipv4_mapped, MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE,
UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
MonProxySocket, UDP_ASSOCIATION_KEEP_ALIVE_CHANNEL_SIZE, UDP_ASSOCIATION_SEND_CHANNEL_SIZE,
packet_window::PacketWindowFilter, utils::to_ipv4_mapped,
};
use super::context::ServiceContext;
+1 -1
View File
@@ -86,7 +86,7 @@ tokio = { version = "1.9.0", features = [
"time",
] }
hickory-resolver = { version = "=0.25.0-alpha.5", optional = true }
hickory-resolver = { version = "0.25", optional = true }
arc-swap = { version = "1.7", optional = true }
notify = { version = "8.0", optional = true }
+4 -1
View File
@@ -500,7 +500,10 @@ where
debug_assert_eq!(method.key_len(), 0);
if !password.is_empty() {
warn!("method \"none\" doesn't need a password, which should be set as an empty String, but password.len() = {}", password.len());
warn!(
"method \"none\" doesn't need a password, which should be set as an empty String, but password.len() = {}",
password.len()
);
}
return Ok((password, Vec::new().into_boxed_slice(), Vec::new()));
@@ -13,18 +13,18 @@ use std::{
use cfg_if::cfg_if;
use futures::ready;
use hickory_resolver::{
ResolveError, Resolver,
config::{LookupIpStrategy, ResolverConfig, ResolverOpts},
name_server::GenericConnector,
proto::{
runtime::{iocompat::AsyncIoTokioAsStd, RuntimeProvider, TokioHandle, TokioTime},
runtime::{RuntimeProvider, TokioHandle, TokioTime, iocompat::AsyncIoTokioAsStd},
udp::DnsUdpSocket,
},
ResolveError, Resolver,
};
use log::trace;
use log::{error, trace};
use tokio::{io::ReadBuf, net::UdpSocket};
use crate::net::{tcp::TcpStream as ShadowTcpStream, udp::UdpSocket as ShadowUdpSocket, ConnectOpts};
use crate::net::{ConnectOpts, tcp::TcpStream as ShadowTcpStream, udp::UdpSocket as ShadowUdpSocket};
/// Shadowsocks hickory-dns Runtime Provider
#[derive(Clone)]
@@ -130,7 +130,17 @@ pub async fn create_resolver(
// Customized dns resolution
match dns {
Some(conf) => {
let mut resolver_opts = opts.unwrap_or_default();
trace!("initializing DNS resolver with config {:?}", conf,);
let mut builder = DnsResolver::builder_with_config(
conf,
ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts)),
);
if let Some(opts) = opts {
*builder.options_mut() = opts;
}
let resolver_opts = builder.options_mut();
// Use Ipv4AndIpv6 strategy. Because Ipv4ThenIpv6 or Ipv6ThenIpv4 will return if the first query returned.
// Since we want to use Happy Eyeballs to connect to both IPv4 and IPv6 addresses, we need both A and AAAA records.
resolver_opts.ip_strategy = LookupIpStrategy::Ipv4AndIpv6;
@@ -138,39 +148,19 @@ pub async fn create_resolver(
// Enable EDNS0 for large records
resolver_opts.edns0 = true;
trace!(
"initializing DNS resolver with config {:?} opts {:?}",
conf,
resolver_opts
);
Ok(DnsResolver::new(
conf,
resolver_opts,
ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts)),
))
trace!("initializing DNS resolver with opts {:?}", resolver_opts);
Ok(builder.build())
}
// To make this independent, if targeting macOS, BSD, Linux, or Windows, we can use the system's configuration
// Android doesn't have /etc/resolv.conf.
None => {
cfg_if! {
if #[cfg(any(all(unix, not(target_os = "android")), windows))] {
use hickory_resolver::system_conf::read_system_conf;
// use the system resolver configuration
let (config, mut opts) = match read_system_conf() {
Ok(o) => o,
Err(err) => {
use log::error;
error!("failed to initialize DNS resolver with system-config, error: {}", err);
// From::from is required because on error type is different on Windows
#[allow(clippy::useless_conversion)]
return Err(From::from(err));
}
};
match DnsResolver::builder(ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(
connect_opts,
))) {
Ok(mut builder) => {
let opts = builder.options_mut();
// NOTE: timeout will be set by config (for example, /etc/resolv.conf on UNIX-like system)
//
// Only ip_strategy should be changed. Why Ipv4AndIpv6? See comments above.
@@ -179,15 +169,15 @@ pub async fn create_resolver(
// Enable EDNS0 for large records
opts.edns0 = true;
trace!(
"initializing DNS resolver with system-config {:?} opts {:?}",
config,
opts
);
trace!("initializing DNS resolver with system-config opts {:?}", opts);
Ok(DnsResolver::new(config, opts, ShadowDnsConnectionProvider::new(ShadowDnsRuntimeProvider::new(connect_opts))))
} else {
Err(ResolveError::from("current platform doesn't support hickory-dns resolver with system configured".to_owned()))
Ok(builder.build())
}
Err(err) => {
error!("initialize DNS resolver with system-config failed, error: {}", err);
Err(ResolveError::from(
"current platform doesn't support hickory-dns resolver with system configured".to_owned(),
))
}
}
}
@@ -18,7 +18,7 @@ use hickory_resolver::config::ResolverConfig;
use hickory_resolver::config::ResolverOpts;
#[cfg(all(feature = "hickory-dns", unix, not(target_os = "android")))]
use log::error;
use log::{log_enabled, trace, Level};
use log::{Level, log_enabled, trace};
use tokio::net::lookup_host;
#[cfg(all(feature = "hickory-dns", unix, not(target_os = "android")))]
use tokio::task::JoinHandle;
@@ -290,7 +290,11 @@ impl DnsResolver {
}
/// Resolve address into `SocketAddr`s
pub async fn resolve<'a>(&self, addr: &'a str, port: u16) -> io::Result<impl Iterator<Item = SocketAddr> + 'a + use<'a>> {
pub async fn resolve<'a>(
&self,
addr: &'a str,
port: u16,
) -> io::Result<impl Iterator<Item = SocketAddr> + 'a + use<'a>> {
struct ResolverLogger<'x, 'y> {
resolver: &'x DnsResolver,
addr: &'y str,
+1 -1
View File
@@ -6,7 +6,7 @@ use std::{fmt, io, net::SocketAddr};
use tokio::net::UdpSocket;
#[cfg(unix)]
use tokio::net::{unix::SocketAddr as UnixSocketAddr, UnixDatagram};
use tokio::net::{UnixDatagram, unix::SocketAddr as UnixSocketAddr};
use crate::{
config::ManagerAddr,
+1 -1
View File
@@ -6,7 +6,7 @@ use std::net::SocketAddr;
pub use self::sys::uds::{UnixListener, UnixStream};
pub use self::{
option::{AcceptOpts, ConnectOpts, TcpSocketOpts, UdpSocketOpts},
sys::{get_ip_stack_capabilities, set_tcp_fastopen, socket_bind_dual_stack, IpStackCapabilities},
sys::{IpStackCapabilities, get_ip_stack_capabilities, set_tcp_fastopen, socket_bind_dual_stack},
tcp::{TcpListener, TcpStream},
udp::UdpSocket,
};
@@ -18,9 +18,9 @@ use tokio::{
use tokio_tfo::TfoStream;
use crate::net::{
AcceptOpts, AddrFamily, ConnectOpts,
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
udp::{BatchRecvMessage, BatchSendMessage},
AcceptOpts, AddrFamily, ConnectOpts,
};
/// A `TcpStream` that supports TFO (TCP Fast Open)
@@ -22,9 +22,9 @@ use tokio::{
use tokio_tfo::TfoStream;
use crate::net::{
AcceptOpts, AddrFamily, ConnectOpts,
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
udp::{BatchRecvMessage, BatchSendMessage},
AcceptOpts, AddrFamily, ConnectOpts,
};
/// A `TcpStream` that supports TFO (TCP Fast Open)
@@ -19,9 +19,9 @@ use tokio::{
use tokio_tfo::TfoStream;
use crate::net::{
AcceptOpts, AddrFamily, ConnectOpts,
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, socket_bind_dual_stack},
udp::{BatchRecvMessage, BatchSendMessage},
AcceptOpts, AddrFamily, ConnectOpts,
};
/// A `TcpStream` that supports TFO (TCP Fast Open)
+1 -1
View File
@@ -9,7 +9,7 @@ use log::warn;
use socket2::{Domain, Protocol, Socket, TcpKeepalive, Type};
use tokio::net::UdpSocket;
use crate::net::{is_dual_stack_addr, sys::socket_bind_dual_stack, AcceptOpts, AddrFamily, ConnectOpts, TcpSocketOpts};
use crate::net::{AcceptOpts, AddrFamily, ConnectOpts, TcpSocketOpts, is_dual_stack_addr, sys::socket_bind_dual_stack};
cfg_if! {
if #[cfg(any(target_os = "linux", target_os = "android"))] {
@@ -14,8 +14,8 @@ use tokio::{
};
use crate::net::{
sys::{set_common_sockopt_after_connect, set_common_sockopt_for_connect, ErrorKind},
AcceptOpts, AddrFamily, ConnectOpts,
sys::{ErrorKind, set_common_sockopt_after_connect, set_common_sockopt_for_connect},
};
/// A wrapper of `TcpStream`
+1 -1
View File
@@ -13,7 +13,7 @@ use pin_project::pin_project;
use sendfd::{RecvWithFd, SendWithFd};
use tokio::{
io::{AsyncRead, AsyncWrite, Interest, ReadBuf},
net::{unix::SocketAddr, UnixListener as TokioUnixListener, UnixStream as TokioUnixStream},
net::{UnixListener as TokioUnixListener, UnixStream as TokioUnixStream, unix::SocketAddr},
};
/// A UnixStream supports transferring FDs between processes
@@ -1,7 +1,7 @@
use std::{
cell::RefCell,
collections::HashMap,
ffi::{c_void, CStr, CString, OsString},
ffi::{CStr, CString, OsString, c_void},
io::{self, ErrorKind},
mem,
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
@@ -25,28 +25,27 @@ use tokio::{
};
use tokio_tfo::TfoStream;
use windows_sys::{
core::PCSTR,
Win32::{
Foundation::{BOOL, ERROR_BUFFER_OVERFLOW, ERROR_NO_DATA, ERROR_SUCCESS},
NetworkManagement::IpHelper::{
if_nametoindex, GetAdaptersAddresses, GAA_FLAG_SKIP_ANYCAST, GAA_FLAG_SKIP_DNS_SERVER,
GAA_FLAG_SKIP_MULTICAST, GAA_FLAG_SKIP_UNICAST, IP_ADAPTER_ADDRESSES_LH,
GAA_FLAG_SKIP_ANYCAST, GAA_FLAG_SKIP_DNS_SERVER, GAA_FLAG_SKIP_MULTICAST, GAA_FLAG_SKIP_UNICAST,
GetAdaptersAddresses, IP_ADAPTER_ADDRESSES_LH, if_nametoindex,
},
Networking::WinSock::{
htonl, setsockopt, WSAGetLastError, WSAIoctl, AF_UNSPEC, IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP,
IPV6_MTU_DISCOVER, IPV6_UNICAST_IF, IP_MTU_DISCOVER, IP_PMTUDISC_DO, IP_UNICAST_IF, SIO_UDP_CONNRESET,
SOCKET, SOCKET_ERROR, TCP_FASTOPEN,
AF_UNSPEC, IP_MTU_DISCOVER, IP_PMTUDISC_DO, IP_UNICAST_IF, IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP,
IPV6_MTU_DISCOVER, IPV6_UNICAST_IF, SIO_UDP_CONNRESET, SOCKET, SOCKET_ERROR, TCP_FASTOPEN, WSAGetLastError,
WSAIoctl, htonl, setsockopt,
},
},
core::PCSTR,
};
// BOOL values
const FALSE: BOOL = 0;
use crate::net::{
is_dual_stack_addr,
AcceptOpts, AddrFamily, ConnectOpts, is_dual_stack_addr,
sys::{set_common_sockopt_for_connect, socket_bind_dual_stack},
AcceptOpts, AddrFamily, ConnectOpts,
};
/// A `TcpStream` that supports TFO (TCP Fast Open)
+4 -5
View File
@@ -19,15 +19,14 @@ use tokio::{
net::{TcpListener as TokioTcpListener, TcpStream as TokioTcpStream},
};
use crate::{context::Context, relay::socks5::Address, ServerAddr};
use crate::{ServerAddr, context::Context, relay::socks5::Address};
use super::{
is_dual_stack_addr,
AcceptOpts, ConnectOpts, is_dual_stack_addr,
sys::{
create_inbound_tcp_socket, set_common_sockopt_after_accept, set_tcp_fastopen, socket_bind_dual_stack,
TcpStream as SysTcpStream,
TcpStream as SysTcpStream, create_inbound_tcp_socket, set_common_sockopt_after_accept, set_tcp_fastopen,
socket_bind_dual_stack,
},
AcceptOpts, ConnectOpts,
};
/// TcpStream for outbound connections
+2 -2
View File
@@ -35,11 +35,11 @@ use futures::ready;
use tokio::io::Interest;
use tokio::{io::ReadBuf, net::ToSocketAddrs};
use crate::{context::Context, relay::socks5::Address, ServerAddr};
use crate::{ServerAddr, context::Context, relay::socks5::Address};
use super::{
sys::{bind_outbound_udp_socket, create_inbound_udp_socket, create_outbound_udp_socket},
AcceptOpts, AddrFamily, ConnectOpts,
sys::{bind_outbound_udp_socket, create_inbound_udp_socket, create_outbound_udp_socket},
};
/// Message struct for `batch_send`
+1 -5
View File
@@ -7,11 +7,7 @@ use tokio::process::Command;
pub fn plugin_cmd(plugin: &PluginConfig, remote: &ServerAddr, local: &SocketAddr, _mode: PluginMode) -> Command {
trace!(
"Starting plugin \"{}\", opt: {:?}, arg: {:?}, remote: {}, local: {}",
plugin.plugin,
plugin.plugin_opts,
plugin.plugin_args,
remote,
local
plugin.plugin, plugin.plugin_opts, plugin.plugin_args, remote, local
);
let mut cmd = Command::new(&plugin.plugin);
+1 -1
View File
@@ -15,7 +15,7 @@ const AEAD2022_MAX_PADDING_SIZE: usize = 900;
fn get_aead_2022_padding_size(payload: &[u8]) -> usize {
use std::cell::RefCell;
use rand::{rngs::SmallRng, Rng, SeedableRng};
use rand::{Rng, SeedableRng, rngs::SmallRng};
thread_local! {
static PADDING_RNG: RefCell<SmallRng> = RefCell::new(SmallRng::from_os_rng());
@@ -47,7 +47,7 @@ use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use crate::{
context::Context,
crypto::{v1::Cipher, CipherKind},
crypto::{CipherKind, v1::Cipher},
};
/// AEAD packet payload must be smaller than 0x3FFF
@@ -64,7 +64,9 @@ pub enum ProtocolError {
DecryptDataError,
#[error("decrypt length failed")]
DecryptLengthError,
#[error("buffer size too large ({0:#x}), AEAD encryption protocol requires buffer to be smaller than 0x3FFF, the higher two bits must be set to zero")]
#[error(
"buffer size too large ({0:#x}), AEAD encryption protocol requires buffer to be smaller than 0x3FFF, the higher two bits must be set to zero"
)]
DataTooLong(usize),
}
@@ -54,8 +54,8 @@ use std::{
};
use aes::{
cipher::{BlockDecrypt, BlockEncrypt, KeyInit},
Aes128, Aes256, Block,
cipher::{BlockDecrypt, BlockEncrypt, KeyInit},
};
use byte_string::ByteStr;
use bytes::{Buf, BufMut, Bytes, BytesMut};
@@ -65,9 +65,9 @@ use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use super::{crypto_io::StreamType, proxy_stream::protocol::v2::SERVER_STREAM_TIMESTAMP_MAX_DIFF};
use crate::{
config::{method_support_eih, ServerUserManager},
config::{ServerUserManager, method_support_eih},
context::Context,
crypto::{v2::tcp::TcpCipher, CipherKind},
crypto::{CipherKind, v2::tcp::TcpCipher},
};
#[inline]
@@ -128,7 +128,7 @@ where
return Err(io::Error::new(
ErrorKind::TimedOut,
format!("connect {} timeout", svr_cfg.addr()),
))
));
}
}
}
@@ -15,7 +15,7 @@ use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
use crate::{
context::Context,
crypto::{v1::Cipher, CipherKind},
crypto::{CipherKind, v1::Cipher},
};
/// Stream protocol error
@@ -255,8 +255,7 @@ where
Ok(..) => {
trace!(
"copy bidirection ends, a_to_b: {:?}, b_to_a: {:?}",
self.a_to_b,
self.b_to_a
self.a_to_b, self.b_to_a
);
}
Err(ref err) => {
@@ -19,7 +19,7 @@ use log::trace;
use crate::{
context::Context,
crypto::{v1::Cipher, CipherKind},
crypto::{CipherKind, v1::Cipher},
relay::socks5::{Address, Error as Socks5Error},
};
@@ -57,8 +57,8 @@ use std::{
};
use aes::{
cipher::{BlockDecrypt, BlockEncrypt, KeyInit},
Aes128, Aes256, Block,
cipher::{BlockDecrypt, BlockEncrypt, KeyInit},
};
use byte_string::ByteStr;
use bytes::{Buf, BufMut, Bytes, BytesMut};
@@ -68,11 +68,11 @@ use lru_time_cache::LruCache;
#[cfg(feature = "aead-cipher-2022-extra")]
use crate::crypto::v2::udp::ChaCha8Poly1305Cipher;
use crate::{
config::{method_support_eih, ServerUser, ServerUserManager},
config::{ServerUser, ServerUserManager, method_support_eih},
context::Context,
crypto::{
v2::udp::{ChaCha20Poly1305Cipher, UdpCipher},
CipherKind,
v2::udp::{ChaCha20Poly1305Cipher, UdpCipher},
},
relay::{
get_aead_2022_padding_size,
@@ -8,7 +8,7 @@ use std::{
io::{self, ErrorKind},
net::SocketAddr,
sync::Arc,
task::{ready, Context, Poll},
task::{Context, Poll, ready},
time::Duration,
};
@@ -29,8 +29,8 @@ use crate::{
use super::{
compat::{DatagramReceive, DatagramReceiveExt, DatagramSend, DatagramSendExt, DatagramSocket},
crypto_io::{
decrypt_client_payload, decrypt_server_payload, encrypt_client_payload, encrypt_server_payload, ProtocolError,
ProtocolResult,
ProtocolError, ProtocolResult, decrypt_client_payload, decrypt_server_payload, encrypt_client_payload,
encrypt_server_payload,
},
};
@@ -385,7 +385,8 @@ where
/// Send a UDP packet to target through proxy `target`
pub async fn send_to(&self, target: SocketAddr, addr: &Address, payload: &[u8]) -> ProxySocketResult<usize> {
self.send_to_with_ctrl(target, addr, &DEFAULT_SOCKET_CONTROL, payload).await
self.send_to_with_ctrl(target, addr, &DEFAULT_SOCKET_CONTROL, payload)
.await
}
/// Send a UDP packet to target through proxy `target`
@@ -479,10 +480,7 @@ where
trace!(
"UDP server client receive from {}, control: {:?}, packet length {} bytes, payload length {} bytes",
addr,
control,
recv_n,
n
addr, control, recv_n, n
);
Ok((n, addr, recv_n, control))
@@ -527,11 +525,7 @@ where
trace!(
"UDP server client receive from {}, addr {}, control: {:?}, packet length {} bytes, payload length {} bytes",
target_addr,
addr,
control,
recv_n,
n,
target_addr, addr, control, recv_n, n,
);
Ok((n, target_addr, addr, recv_n, control))
@@ -17,7 +17,7 @@ use log::trace;
use crate::{
context::Context,
crypto::{v1::Cipher, CipherKind},
crypto::{CipherKind, v1::Cipher},
relay::socks5::{Address, Error as Socks5Error},
};
+1 -1
View File
@@ -14,6 +14,7 @@ use tokio::{
};
use shadowsocks::{
ProxyClientStream, ProxyListener,
config::{ServerConfig, ServerType},
context::Context,
crypto::CipherKind,
@@ -24,7 +25,6 @@ use shadowsocks::{
utils::{copy_from_encrypted, copy_to_encrypted},
},
},
ProxyClientStream, ProxyListener,
};
async fn handle_tcp_tunnel_server_client(
+1 -1
View File
@@ -13,6 +13,7 @@ use byte_string::ByteStr;
use futures::future;
use log::debug;
use shadowsocks::{
ProxyClientStream, ProxyListener, ServerConfig,
config::ServerType,
context::Context,
crypto::CipherKind,
@@ -21,7 +22,6 @@ use shadowsocks::{
socks5::Address,
tcprelay::utils::{copy_from_encrypted, copy_to_encrypted},
},
ProxyClientStream, ProxyListener, ServerConfig,
};
use tokio::{
io::{AsyncBufReadExt, AsyncWriteExt, BufReader},
+1 -1
View File
@@ -4,7 +4,7 @@ use std::io::IsTerminal;
use time::UtcOffset;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{fmt::time::OffsetTime, EnvFilter, FmtSubscriber};
use tracing_subscriber::{EnvFilter, FmtSubscriber, fmt::time::OffsetTime};
use crate::config::LogConfig;
+1 -1
View File
@@ -1,7 +1,7 @@
use futures::future::{self, Either, FutureExt};
use log::info;
use std::io;
use tokio::signal::unix::{signal, SignalKind};
use tokio::signal::unix::{SignalKind, signal};
/// Create a monitor future for signals
///
+2 -2
View File
@@ -3,9 +3,9 @@
use std::process::ExitCode;
use base64::Engine as _;
use clap::{builder::PossibleValuesParser, Arg, ArgAction, ArgMatches, Command};
use clap::{Arg, ArgAction, ArgMatches, Command, builder::PossibleValuesParser};
use shadowsocks_service::shadowsocks::crypto::{available_ciphers, CipherKind};
use shadowsocks_service::shadowsocks::crypto::{CipherKind, available_ciphers};
/// Defines command line options
pub fn define_command_line_options(mut app: Command) -> Command {
+11 -8
View File
@@ -10,7 +10,7 @@ use std::{
time::{Duration, Instant},
};
use clap::{builder::PossibleValuesParser, Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint};
use clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint, builder::PossibleValuesParser};
use futures::future::{self, FutureExt};
use log::{error, info, trace};
use tokio::{
@@ -25,13 +25,13 @@ use shadowsocks_service::shadowsocks::relay::socks5::Address;
use shadowsocks_service::{
acl::AccessControl,
config::{
read_variable_field_value, Config, ConfigType, LocalConfig, LocalInstanceConfig, ProtocolType,
ServerInstanceConfig,
Config, ConfigType, LocalConfig, LocalInstanceConfig, ProtocolType, ServerInstanceConfig,
read_variable_field_value,
},
local::{loadbalancing::PingBalancer, Server},
local::{Server, loadbalancing::PingBalancer},
shadowsocks::{
config::{Mode, ServerAddr, ServerConfig, ServerSource},
crypto::{available_ciphers, CipherKind},
crypto::{CipherKind, available_ciphers},
plugin::PluginConfig,
},
};
@@ -939,8 +939,11 @@ pub fn create(matches: &ArgMatches) -> ShadowsocksResult<(Runtime, impl Future<O
// DONE READING options
if config.local.is_empty() {
return Err(ShadowsocksError::InsufficientParams("missing `local_address`, consider specifying it by --local-addr command line option, \
or \"local_address\" and \"local_port\" in configuration file".to_string()));
return Err(ShadowsocksError::InsufficientParams(
"missing `local_address`, consider specifying it by --local-addr command line option, \
or \"local_address\" and \"local_port\" in configuration file"
.to_string(),
));
}
config
@@ -1099,7 +1102,7 @@ impl ServerReloader {
#[cfg(unix)]
async fn launch_signal_reload_server_task(self: Arc<Self>) {
use log::debug;
use tokio::signal::unix::{signal, SignalKind};
use tokio::signal::unix::{SignalKind, signal};
let mut sigusr1 = signal(SignalKind::user_defined1()).expect("signal");
+15 -9
View File
@@ -2,7 +2,7 @@
use std::{future::Future, net::IpAddr, path::PathBuf, process::ExitCode, time::Duration};
use clap::{builder::PossibleValuesParser, Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint};
use clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint, builder::PossibleValuesParser};
use futures::future::{self, Either};
use log::{info, trace};
use tokio::{
@@ -18,7 +18,7 @@ use shadowsocks_service::{
run_manager,
shadowsocks::{
config::{ManagerAddr, Mode},
crypto::{available_ciphers, CipherKind},
crypto::{CipherKind, available_ciphers},
plugin::PluginConfig,
},
};
@@ -340,11 +340,14 @@ pub fn create(matches: &ArgMatches) -> ShadowsocksResult<(Runtime, impl Future<O
}
if let Some(addr) = matches.get_one::<ManagerAddr>("MANAGER_ADDR").cloned() {
match config.manager { Some(ref mut manager_config) => {
manager_config.addr = addr;
} _ => {
config.manager = Some(ManagerConfig::new(addr));
}}
match config.manager {
Some(ref mut manager_config) => {
manager_config.addr = addr;
}
_ => {
config.manager = Some(ManagerConfig::new(addr));
}
}
}
#[cfg(all(unix, not(target_os = "android")))]
@@ -457,8 +460,11 @@ pub fn create(matches: &ArgMatches) -> ShadowsocksResult<(Runtime, impl Future<O
// DONE reading options
config.manager.as_ref().ok_or_else(|| {
ShadowsocksError::InsufficientParams("missing `manager_address`, consider specifying it by --manager-address command line option, \
or \"manager_address\" and \"manager_port\" keys in configuration file".to_string())
ShadowsocksError::InsufficientParams(
"missing `manager_address`, consider specifying it by --manager-address command line option, \
or \"manager_address\" and \"manager_port\" keys in configuration file"
.to_string(),
)
})?;
config
+16 -10
View File
@@ -2,7 +2,7 @@
use std::{future::Future, net::IpAddr, path::PathBuf, process::ExitCode, time::Duration};
use clap::{builder::PossibleValuesParser, Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint};
use clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command, ValueHint, builder::PossibleValuesParser};
use futures::future::{self, Either};
use log::{info, trace};
use tokio::{
@@ -12,11 +12,11 @@ use tokio::{
use shadowsocks_service::{
acl::AccessControl,
config::{read_variable_field_value, Config, ConfigType, ManagerConfig, ServerInstanceConfig},
config::{Config, ConfigType, ManagerConfig, ServerInstanceConfig, read_variable_field_value},
run_server,
shadowsocks::{
config::{ManagerAddr, Mode, ServerAddr, ServerConfig},
crypto::{available_ciphers, CipherKind},
crypto::{CipherKind, available_ciphers},
plugin::PluginConfig,
},
};
@@ -418,11 +418,14 @@ pub fn create(matches: &ArgMatches) -> ShadowsocksResult<(Runtime, impl Future<O
}
if let Some(addr) = matches.get_one::<ManagerAddr>("MANAGER_ADDR").cloned() {
match config.manager { Some(ref mut manager_config) => {
manager_config.addr = addr;
} _ => {
config.manager = Some(ManagerConfig::new(addr));
}}
match config.manager {
Some(ref mut manager_config) => {
manager_config.addr = addr;
}
_ => {
config.manager = Some(ManagerConfig::new(addr));
}
}
}
#[cfg(all(unix, not(target_os = "android")))]
@@ -481,9 +484,12 @@ pub fn create(matches: &ArgMatches) -> ShadowsocksResult<(Runtime, impl Future<O
// DONE READING options
if config.server.is_empty() {
return Err(ShadowsocksError::InsufficientParams("missing proxy servers, consider specifying it by \
return Err(ShadowsocksError::InsufficientParams(
"missing proxy servers, consider specifying it by \
--server-addr, --encrypt-method, --password command line option, \
or configuration file, check more details in https://shadowsocks.org/doc/configs.html".to_string()));
or configuration file, check more details in https://shadowsocks.org/doc/configs.html"
.to_string(),
));
}
config
+1 -1
View File
@@ -12,7 +12,7 @@ use shadowsocks_service::config::RedirType;
use shadowsocks_service::local::dns::NameServerAddr;
use shadowsocks_service::{
config::{ManagerServerHost, ManagerServerMode},
shadowsocks::{crypto::CipherKind, relay::socks5::Address, ManagerAddr, ServerAddr, ServerConfig},
shadowsocks::{ManagerAddr, ServerAddr, ServerConfig, crypto::CipherKind, relay::socks5::Address},
};
macro_rules! value_parser_type {
+1 -1
View File
@@ -9,7 +9,7 @@ use shadowsocks_service::{
config::{Config, ConfigType, LocalConfig, LocalInstanceConfig, ProtocolType, ServerInstanceConfig},
local::socks::client::socks5::Socks5UdpClient,
run_local, run_server,
shadowsocks::{config::Mode, crypto::CipherKind, relay::socks5::Address, ServerConfig},
shadowsocks::{ServerConfig, config::Mode, crypto::CipherKind, relay::socks5::Address},
};
const SERVER_ADDR: &str = "127.0.0.1:8093";