diff --git a/Cargo.lock b/Cargo.lock index 178daf9..9a7fd52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,18 +11,42 @@ dependencies = [ "memchr", ] +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + [[package]] name = "memchr" version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + [[package]] name = "querystring" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9318ead08c799aad12a55a3e78b82e0b6167271ffd1f627b758891282f739187" +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + [[package]] name = "regex" version = "1.9.6" @@ -52,10 +76,66 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "serde" +version = "1.0.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + [[package]] name = "v2parser" version = "0.1.0" dependencies = [ "querystring", "regex", + "serde", + "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index 1bbc517..86c497e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,5 @@ edition = "2021" [dependencies] querystring = "1.1.0" regex = "1.9.6" +serde = { version = "1.0.189", features = ["derive"] } +serde_json = "1.0.107" diff --git a/src/parser/vless.rs b/src/parser/vless.rs index 6828283..fc44de2 100644 --- a/src/parser/vless.rs +++ b/src/parser/vless.rs @@ -1,6 +1,13 @@ +use querystring; +use serde::{Deserialize, Serialize}; use std::process::exit; -use querystring; +#[derive(Serialize, Deserialize)] +struct Person { + name: String, + age: u8, + phones: Vec, +} struct VlessQuery { security: String, @@ -36,6 +43,7 @@ pub struct VlessData { // Outbound structs +#[derive(Serialize, Deserialize)] struct VlessUser { id: String, encryption: String, @@ -43,16 +51,19 @@ struct VlessUser { level: u8, } +#[derive(Serialize, Deserialize)] struct VlessServerObject { address: String, port: u16, users: Vec, } +#[derive(Serialize, Deserialize)] struct VlessOutboundSettings { vnext: Vec, } +#[derive(Serialize, Deserialize)] enum OutboundSettings { Vless(VlessOutboundSettings), } @@ -61,6 +72,7 @@ struct TlsSettings { allowInsecure: bool, certificates: u8, serverName: String, + // u8 is a dummy type here alpn: u8, enableSessionResumption: bool, disableSystemRoot: bool, @@ -80,6 +92,7 @@ struct StreamSettings { tlsSettings: TlsSettings, } +#[derive(Serialize, Deserialize)] pub struct Outbound { settings: OutboundSettings, protocol: String, @@ -257,4 +270,13 @@ mod tests { assert_eq!(parsed.port, 3012); assert_eq!(parsed.uuid, "uu0id"); } + + #[test] + fn log_vless_outbound() { + let v = "vless://4d2c3e35-749d-52e3-bdb6-3f3f4950c183@tre.test.one:2053?security=reality&type=tcp&flow=xtls-rprx-vision#test-name"; + let data = get_vless_data(v); + let outbound_object = create_outbound_object(data); + let serialized = serde_json::to_string(&outbound_object).unwrap(); + println!("serialized = {}", serialized); + } }