Skip to content

Commit cb871a0

Browse files
committed
fix: vless vmess parse failed
1 parent c0eade1 commit cb871a0

File tree

8 files changed

+270
-128
lines changed

8 files changed

+270
-128
lines changed

conf/config.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ rename_pattern = "${COUNTRYCODE}_${CITY}_${ISP}"
1616
need_add_pool = true
1717
# 代理节点池
1818
pools = [
19-
"https://raw.githubusercontent.com/Ruk1ng001/freeSub/main/clash.yaml",
20-
"https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml",
21-
"https://raw.githubusercontent.com/free18/v2ray/refs/heads/main/c.yaml",
22-
"https://guanxi.us.kg/guanxi"
19+
"https://raw.githubusercontent.com/Ruk1ng001/freeSub/main/clash.yaml"
2320
]
2421

2522
# 测试分组大小

proxrs/src/protocol/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ mod hysteria2;
22
mod ss;
33
mod ssr;
44
mod trojan;
5-
mod vless;
6-
mod vmess;
5+
pub(crate) mod vless;
6+
pub(crate) mod vmess;
77

88
use std::any::Any;
99
use std::collections::HashMap;

proxrs/src/protocol/ss.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl ProxyAdapter for SS {
9696
}
9797

9898
// parse plugin
99-
let url = parts[0];
99+
let url = base64decode(parts[0]);
100100
let parts: Vec<&str> = url.split("?").collect();
101101
let mut plugin = None;
102102
let mut plugin_opts = None;
@@ -135,7 +135,7 @@ impl ProxyAdapter for SS {
135135
let secret_server_port_parts: Vec<&str> = url.split("@").collect();
136136

137137
let secret = base64decode(secret_server_port_parts[0]);
138-
let cipher_pwd_parts: Vec<&str> = secret.split(":").collect();
138+
let cipher_pwd_parts: Vec<&str> = secret.splitn(2, ":").collect();
139139
let cipher = cipher_pwd_parts[0].parse().unwrap();
140140
let password = cipher_pwd_parts[1].parse().unwrap();
141141

@@ -206,6 +206,16 @@ mod test {
206206
assert_eq!("aes-256-gcm", result.cipher);
207207
}
208208

209+
#[test]
210+
fn test_parse_base64_ss1() {
211+
let link = String::from(
212+
"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206emtWV2lPU1o4OEVnZi9LSlE1azFlWFRZUFNMNXhZWEZ6OTFPanBFRWE1UT06dzZLQTFFYkNrM2hpdWJQZWlMMktkUUJjcG9kbUl3c1VlcDJBLzFVd3hLbz1AYXdzMS5pb2xvZnQubWU6NDg1Njc#%F0%9F%87%AF%F0%9F%87%B5%20AWS",
213+
);
214+
let result = SS::from_link(link.clone()).unwrap();
215+
assert_eq!("zkVWiOSZ88Egf/KJQ5k1eXTYPSL5xYXFz91OjpEEa5Q=:w6KA1EbCk3hiubPeiL2KdQBcpodmIwsUep2A/1UwxKo=", result.password);
216+
assert_eq!("2022-blake3-aes-256-gcm", result.cipher);
217+
}
218+
209219
#[test]
210220
fn test_ss2() {
211221
let link = String::from("ss://[email protected]:12452?plugin=obfs-local;mode%3Dwebsocket#%E9%A6%99%E6%B8%AF%40vpnhat");

proxrs/src/protocol/vless.rs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,31 @@ use crate::protocol::WSOptions;
1616

1717
#[derive(Deserialize, Debug, Serialize, Eq, Clone)]
1818
pub struct Vless {
19-
name: String,
20-
server: String,
19+
pub name: String,
20+
pub server: String,
2121
#[serde(deserialize_with = "deserialize_u16_or_string")]
22-
port: u16,
23-
uuid: String,
22+
pub port: u16,
23+
pub uuid: String,
2424
#[serde(skip_serializing_if = "Option::is_none")]
25-
flow: Option<String>,
25+
pub flow: Option<String>,
2626
#[serde(skip_serializing_if = "Option::is_none")]
27-
tls: Option<bool>,
27+
pub tls: Option<bool>,
2828
#[serde(skip_serializing_if = "Option::is_none")]
29-
udp: Option<bool>,
29+
pub udp: Option<bool>,
3030
#[serde(skip_serializing_if = "Option::is_none", rename = "skip-cert-verify")]
31-
skip_cert_verify: Option<bool>,
31+
pub skip_cert_verify: Option<bool>,
3232
#[serde(skip_serializing_if = "Option::is_none")]
33-
fingerprint: Option<String>,
33+
pub fingerprint: Option<String>,
3434
#[serde(skip_serializing_if = "Option::is_none")]
35-
servername: Option<String>,
35+
pub servername: Option<String>,
3636
#[serde(skip_serializing_if = "Option::is_none")]
37-
network: Option<String>,
37+
pub network: Option<String>,
3838
#[serde(skip_serializing_if = "Option::is_none", rename = "ws-opts")]
39-
ws_opts: Option<WSOptions>,
39+
pub ws_opts: Option<WSOptions>,
4040
#[serde(skip_serializing_if = "Option::is_none", rename = "reality-opts")]
41-
reality_opts: Option<RealtyOptions>,
41+
pub reality_opts: Option<RealtyOptions>,
4242
#[serde(skip_serializing_if = "Option::is_none", rename = "grpc-opts")]
43-
grpc_opts: Option<GrpcOptions>,
43+
pub grpc_opts: Option<GrpcOptions>,
4444
}
4545

4646
impl PartialEq for Vless {
@@ -78,14 +78,16 @@ impl ProxyAdapter for Vless {
7878
}
7979

8080
let url = parts[0];
81+
let mut params_map: HashMap<&str, String> = HashMap::new();
8182
let parts = url.split("?").collect::<Vec<_>>();
8283

83-
let params = parts[1];
84-
let mut params_map: HashMap<&str, String> = HashMap::new();
85-
for param in params.split("&") {
86-
if let Some((key, value)) = param.split_once('=') {
87-
let value = value.parse::<String>().unwrap();
88-
params_map.insert(key, value);
84+
if parts.len() > 1 {
85+
let params = parts[1];
86+
for param in params.split("&") {
87+
if let Some((key, value)) = param.split_once('=') {
88+
let value = value.parse::<String>().unwrap();
89+
params_map.insert(key, value);
90+
}
8991
}
9092
}
9193

0 commit comments

Comments
 (0)