Skip to content

Commit a6d6dac

Browse files
author
messica
committed
feat: 🎸 update singbox protocol
1 parent 1996b3e commit a6d6dac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1163
-821
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ serde_yaml = "0.9"
2222

2323
anyhow = "1.0"
2424
thiserror = "2.0"
25-
indexmap = "2.12"
25+
indexmap = { version = "2.12", features = ["serde"] }
2626

2727
tracing = "0.1"
2828
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use serde::{Deserialize, Serialize};
2+
use serde_with::skip_serializing_none;
3+
4+
#[skip_serializing_none]
5+
#[derive(Serialize, Deserialize, Debug, Clone)]
6+
pub struct Certificate {
7+
pub store: Option<StoreType>,
8+
pub certificate: Option<Vec<String>>,
9+
pub certificate_path: Option<Vec<String>>,
10+
pub certificate_directory_path: Option<Vec<String>>,
11+
}
12+
13+
#[derive(Serialize, Deserialize, Debug, Clone)]
14+
#[serde(rename_all = "lowercase")]
15+
pub enum StoreType {
16+
System,
17+
Mozilla,
18+
Chrome,
19+
None,
20+
}

src/protocols/singbox/common/base.rs

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub enum IpVersion {
3838
#[derive(Serialize, Deserialize, Debug, Clone)]
3939
#[serde(untagged)]
4040
pub enum QueryType {
41-
Code(usize),
41+
Code(u16),
4242
Name(String),
4343
}
4444

@@ -63,20 +63,13 @@ pub enum LogicalMode {
6363
}
6464

6565
#[skip_serializing_none]
66-
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
66+
#[derive(Serialize, Deserialize, Debug, Clone)]
6767
pub struct Handshake {
68-
detour: Option<String>,
69-
bind_interface: Option<String>,
70-
inet4_bind_address: Option<String>,
71-
inet6_bind_address: Option<String>,
72-
routing_mark: Option<usize>,
73-
reuse_addr: Option<bool>,
74-
connect_timeout: Option<String>,
75-
tcp_fast_open: Option<bool>,
76-
tcp_multi_path: Option<bool>,
77-
udp_fragment: Option<bool>,
78-
domain_strategy: Option<Strategy>,
79-
fallback_delay: Option<String>,
68+
pub server: String,
69+
pub server_port: u16,
70+
71+
#[serde(flatten)]
72+
pub dial_params: Option<DialParams>,
8073
}
8174

8275
#[derive(Serialize, Deserialize, Debug, Clone)]
@@ -98,14 +91,77 @@ impl Default for Stack {
9891
pub struct ListenParams {
9992
listen: Option<String>,
10093
listen_port: Option<u16>,
94+
bind_interface: Option<String>,
95+
routing_mark: Option<u32>,
96+
reuse_addr: Option<bool>,
97+
netns: Option<String>,
10198
tcp_fast_open: Option<bool>,
10299
tcp_multi_path: Option<bool>,
100+
disable_tcp_keep_alive: Option<bool>,
101+
tcp_keep_alive: Option<String>,
102+
tcp_keep_alive_interval: Option<String>,
103103
udp_fragment: Option<bool>,
104104
udp_timeout: Option<String>,
105105
detour: Option<String>,
106-
sniff: Option<bool>,
107-
sniff_override_destination: Option<bool>,
108-
sniff_timeout: Option<String>,
109-
domain_strategy: Option<Strategy>,
110-
udp_disable_domain_unmapping: Option<bool>,
111106
}
107+
108+
#[skip_serializing_none]
109+
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
110+
pub struct DialParams {
111+
pub detour: Option<String>,
112+
pub bind_interface: Option<String>,
113+
pub inet4_bind_address: Option<String>,
114+
pub inet6_bind_address: Option<String>,
115+
/// Only supported on Linux.
116+
pub routing_mark: Option<usize>,
117+
pub reuse_addr: Option<bool>,
118+
/// Only supported on Linux.
119+
pub netns: Option<String>,
120+
pub connect_timeout: Option<String>,
121+
pub tcp_fast_open: Option<bool>,
122+
pub tcp_multi_path: Option<bool>,
123+
pub disable_tcp_keep_alive: Option<bool>,
124+
pub tcp_keep_alive: Option<String>,
125+
pub tcp_keep_alive_interval: Option<String>,
126+
pub udp_fragment: Option<bool>,
127+
pub domain_resolver: Option<DomainResolver>,
128+
pub network_strategy: Option<NetworkStrategy>,
129+
pub network_type: Option<Vec<NetworkType>>,
130+
pub fallback_network_type: Option<Vec<NetworkType>>,
131+
pub fallback_delay: Option<u64>,
132+
}
133+
134+
#[skip_serializing_none]
135+
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
136+
pub struct DomainResolver {
137+
pub server: String,
138+
pub strategy: Option<Strategy>,
139+
pub disable_cache: Option<bool>,
140+
pub rewrite_ttl: Option<u32>,
141+
pub client_subnet: Option<String>,
142+
}
143+
144+
#[derive(Serialize, Deserialize, Debug, Clone)]
145+
#[serde(rename_all = "snake_case")]
146+
pub enum NetworkStrategy {
147+
Default,
148+
Hybrid,
149+
Fallback,
150+
}
151+
152+
#[derive(Serialize, Deserialize, Debug, Clone)]
153+
#[serde(rename_all = "snake_case")]
154+
pub enum NetworkType {
155+
Wifi,
156+
Cellular,
157+
Ethernet,
158+
Other,
159+
}
160+
161+
#[derive(Serialize, Deserialize, Debug, Clone)]
162+
#[serde(rename_all = "snake_case")]
163+
pub enum ClashMode {
164+
Direct,
165+
Global,
166+
Rule,
167+
}

src/protocols/singbox/common/multiplex.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ pub enum Multiplex {
1111
Outbound {
1212
enabled: bool,
1313
protocol: MultiplexProtocol,
14-
max_connections: usize,
15-
min_streams: usize,
16-
max_streams: usize,
14+
max_connections: u32,
15+
min_streams: u32,
16+
max_streams: u32,
1717
padding: bool,
1818
brutal: Brutal,
1919
},
@@ -37,6 +37,6 @@ impl Default for MultiplexProtocol {
3737
pub struct Brutal {
3838
#[serde(skip_serializing_if = "Option::is_none")]
3939
enabled: Option<bool>,
40-
up_mbps: usize,
41-
down_mbps: usize,
40+
up_mbps: u32,
41+
down_mbps: u32,
4242
}

src/protocols/singbox/common/tls.rs

Lines changed: 77 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,6 @@ pub enum Tls {
99
Outbound(Outbound),
1010
}
1111

12-
#[skip_serializing_none]
13-
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
14-
pub struct Inbound {
15-
enabled: Option<bool>,
16-
server_name: Option<String>,
17-
alpn: Option<Vec<String>>,
18-
min_version: Option<String>,
19-
max_version: Option<String>,
20-
cipher_suites: Option<Vec<String>>,
21-
certificate: Option<Vec<String>>,
22-
certificate_path: Option<String>,
23-
key: Option<Vec<String>>,
24-
key_path: Option<String>,
25-
acme: Option<ACME>,
26-
ech: Option<Ech>,
27-
reality: Option<Reality>,
28-
}
2912

3013
#[skip_serializing_none]
3114
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
@@ -103,27 +86,87 @@ pub struct RealityHandshake {
10386
fallback_delay: Option<String>,
10487
}
10588

106-
#[skip_serializing_none]
107-
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
108-
pub struct Outbound {
109-
enabled: Option<bool>,
110-
disable_sni: Option<bool>,
111-
server_name: Option<String>,
112-
insecure: Option<bool>,
113-
alpn: Option<Vec<String>>,
114-
min_version: Option<String>,
115-
max_version: Option<String>,
116-
cipher_suites: Option<Vec<String>>,
117-
certificate: Option<Vec<String>>,
118-
certificate_path: Option<String>,
119-
ech: Option<Ech>,
120-
utls: Option<OutboundUtils>,
121-
reality: Option<Reality>,
122-
}
89+
12390

12491
#[skip_serializing_none]
12592
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
12693
pub struct OutboundUtils {
12794
enabled: Option<bool>,
12895
fingerprint: Option<String>,
12996
}
97+
98+
#[skip_serializing_none]
99+
#[derive(Serialize, Deserialize, Debug, Clone)]
100+
pub struct Inbound {
101+
pub enabled: Option<bool>,
102+
pub certificate: Option<SingleOrMultipleValue<String>>,
103+
pub key: Option<SingleOrMultipleValue<String>>,
104+
pub key_password: Option<String>,
105+
pub fingerprint: Option<TlsFingerprint>,
106+
pub alpn: Option<Vec<String>>,
107+
pub alpn_mode: Option<AlpnMode>,
108+
pub min_version: Option<String>,
109+
pub max_version: Option<String>,
110+
pub session_ticket: Option<bool>,
111+
pub curves: Option<Vec<String>>,
112+
pub signature_algorithms: Option<String>,
113+
pub key_share_mode: Option<String>,
114+
pub only_grease: Option<bool>,
115+
pub force_ciphersuites: Option<Vec<String>>,
116+
pub session_cache_size: Option<u32>,
117+
pub session_cache_timeout: Option<u64>,
118+
pub client_auth: Option<bool>,
119+
pub client_ca: Option<SingleOrMultipleValue<String>>,
120+
}
121+
122+
#[skip_serializing_none]
123+
#[derive(Serialize, Deserialize, Debug, Clone)]
124+
pub struct Outbound {
125+
pub enabled: Option<bool>,
126+
pub insecure: Option<bool>,
127+
pub server_name: Option<String>,
128+
pub certificate: Option<SingleOrMultipleValue<String>>,
129+
pub fingerprint: Option<TlsFingerprint>,
130+
pub alpn: Option<Vec<String>>,
131+
pub alpn_mode: Option<AlpnMode>,
132+
pub min_version: Option<String>,
133+
pub max_version: Option<String>,
134+
pub session_ticket: Option<bool>,
135+
pub curves: Option<Vec<String>>,
136+
pub signature_algorithms: Option<String>,
137+
pub key_share_mode: Option<String>,
138+
pub only_grease: Option<bool>,
139+
pub force_ciphersuites: Option<Vec<String>>,
140+
pub early_data_size: Option<u32>,
141+
pub session_cache_size: Option<u32>,
142+
pub session_cache_timeout: Option<u64>,
143+
pub client_certificate: Option<ClientCertificateConfig>,
144+
}
145+
146+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
147+
#[serde(rename_all = "kebab-case")]
148+
pub enum TlsFingerprint {
149+
Chrome,
150+
Firefox,
151+
Safari,
152+
Ios,
153+
Android,
154+
Edge,
155+
Random,
156+
Randomized,
157+
}
158+
159+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
160+
#[serde(rename_all = "snake_case")]
161+
pub enum AlpnMode {
162+
Auto,
163+
Strict,
164+
}
165+
166+
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
167+
pub struct ClientCertificateConfig {
168+
pub certificate_path: Option<String>,
169+
pub key_path: Option<String>,
170+
pub password: Option<String>,
171+
pub ocsp_stapling: Option<u64>,
172+
}

src/protocols/singbox/common/transport.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::{Deserialize, Serialize};
22
use serde_with::skip_serializing_none;
3-
use std::collections::HashMap;
3+
use indexmap::IndexMap;
44

55
#[skip_serializing_none]
66
#[derive(Serialize, Deserialize, Debug, Clone)]
@@ -19,7 +19,7 @@ pub struct HTTP {
1919
host: Option<Vec<String>>,
2020
path: Option<String>,
2121
method: Option<String>,
22-
headers: Option<HashMap<String, String>>,
22+
headers: Option<IndexMap<String, String>>,
2323
idle_timeout: Option<String>,
2424
ping_timeout: Option<String>,
2525
}
@@ -28,7 +28,7 @@ pub struct HTTP {
2828
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
2929
pub struct WS {
3030
path: Option<String>,
31-
headers: Option<HashMap<String, String>>,
31+
headers: Option<IndexMap<String, String>>,
3232
max_early_data: Option<usize>,
3333
early_data_header_name: Option<String>,
3434
}
@@ -51,5 +51,5 @@ pub struct GRPC {
5151
pub struct HttpUpgrade {
5252
host: Option<String>,
5353
path: Option<String>,
54-
headers: Option<HashMap<String, String>>,
54+
headers: Option<IndexMap<String, String>>,
5555
}

0 commit comments

Comments
 (0)