lib.rs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. pub mod compress;
  2. pub mod platform;
  3. pub mod protos;
  4. pub use bytes;
  5. use config::Config;
  6. pub use futures;
  7. pub use protobuf;
  8. pub use protos::message as message_proto;
  9. pub use protos::rendezvous as rendezvous_proto;
  10. use std::{
  11. fs::File,
  12. io::{self, BufRead},
  13. net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4},
  14. path::Path,
  15. time::{self, SystemTime, UNIX_EPOCH},
  16. };
  17. pub use tokio;
  18. pub use tokio_util;
  19. pub mod socket_client;
  20. pub mod tcp;
  21. pub mod udp;
  22. pub use env_logger;
  23. pub use log;
  24. pub mod bytes_codec;
  25. #[cfg(feature = "quic")]
  26. pub mod quic;
  27. pub use anyhow::{self, bail};
  28. pub use futures_util;
  29. pub mod config;
  30. pub mod fs;
  31. pub use lazy_static;
  32. #[cfg(not(any(target_os = "android", target_os = "ios")))]
  33. pub use mac_address;
  34. pub use rand;
  35. pub use regex;
  36. pub use sodiumoxide;
  37. pub use tokio_socks;
  38. pub use tokio_socks::IntoTargetAddr;
  39. pub use tokio_socks::TargetAddr;
  40. pub mod password_security;
  41. pub use chrono;
  42. pub use directories_next;
  43. pub mod keyboard;
  44. #[cfg(feature = "quic")]
  45. pub type Stream = quic::Connection;
  46. #[cfg(not(feature = "quic"))]
  47. pub type Stream = tcp::FramedStream;
  48. #[inline]
  49. pub async fn sleep(sec: f32) {
  50. tokio::time::sleep(time::Duration::from_secs_f32(sec)).await;
  51. }
  52. #[macro_export]
  53. macro_rules! allow_err {
  54. ($e:expr) => {
  55. if let Err(err) = $e {
  56. log::debug!(
  57. "{:?}, {}:{}:{}:{}",
  58. err,
  59. module_path!(),
  60. file!(),
  61. line!(),
  62. column!()
  63. );
  64. } else {
  65. }
  66. };
  67. ($e:expr, $($arg:tt)*) => {
  68. if let Err(err) = $e {
  69. log::debug!(
  70. "{:?}, {}, {}:{}:{}:{}",
  71. err,
  72. format_args!($($arg)*),
  73. module_path!(),
  74. file!(),
  75. line!(),
  76. column!()
  77. );
  78. } else {
  79. }
  80. };
  81. }
  82. #[inline]
  83. pub fn timeout<T: std::future::Future>(ms: u64, future: T) -> tokio::time::Timeout<T> {
  84. tokio::time::timeout(std::time::Duration::from_millis(ms), future)
  85. }
  86. pub type ResultType<F, E = anyhow::Error> = anyhow::Result<F, E>;
  87. /// Certain router and firewalls scan the packet and if they
  88. /// find an IP address belonging to their pool that they use to do the NAT mapping/translation, so here we mangle the ip address
  89. pub struct AddrMangle();
  90. #[inline]
  91. pub fn try_into_v4(addr: SocketAddr) -> SocketAddr {
  92. match addr {
  93. SocketAddr::V6(v6) if !addr.ip().is_loopback() => {
  94. if let Some(v4) = v6.ip().to_ipv4() {
  95. SocketAddr::new(IpAddr::V4(v4), addr.port())
  96. } else {
  97. addr
  98. }
  99. }
  100. _ => addr,
  101. }
  102. }
  103. impl AddrMangle {
  104. pub fn encode(addr: SocketAddr) -> Vec<u8> {
  105. // not work with [:1]:<port>
  106. let addr = try_into_v4(addr);
  107. match addr {
  108. SocketAddr::V4(addr_v4) => {
  109. let tm = (SystemTime::now()
  110. .duration_since(UNIX_EPOCH)
  111. .unwrap()
  112. .as_micros() as u32) as u128;
  113. let ip = u32::from_le_bytes(addr_v4.ip().octets()) as u128;
  114. let port = addr.port() as u128;
  115. let v = ((ip + tm) << 49) | (tm << 17) | (port + (tm & 0xFFFF));
  116. let bytes = v.to_le_bytes();
  117. let mut n_padding = 0;
  118. for i in bytes.iter().rev() {
  119. if i == &0u8 {
  120. n_padding += 1;
  121. } else {
  122. break;
  123. }
  124. }
  125. bytes[..(16 - n_padding)].to_vec()
  126. }
  127. SocketAddr::V6(addr_v6) => {
  128. let mut x = addr_v6.ip().octets().to_vec();
  129. let port: [u8; 2] = addr_v6.port().to_le_bytes();
  130. x.push(port[0]);
  131. x.push(port[1]);
  132. x
  133. }
  134. }
  135. }
  136. pub fn decode(bytes: &[u8]) -> SocketAddr {
  137. use std::convert::TryInto;
  138. if bytes.len() > 16 {
  139. if bytes.len() != 18 {
  140. return Config::get_any_listen_addr(false);
  141. }
  142. let tmp: [u8; 2] = bytes[16..].try_into().unwrap();
  143. let port = u16::from_le_bytes(tmp);
  144. let tmp: [u8; 16] = bytes[..16].try_into().unwrap();
  145. let ip = std::net::Ipv6Addr::from(tmp);
  146. return SocketAddr::new(IpAddr::V6(ip), port);
  147. }
  148. let mut padded = [0u8; 16];
  149. padded[..bytes.len()].copy_from_slice(bytes);
  150. let number = u128::from_le_bytes(padded);
  151. let tm = (number >> 17) & (u32::max_value() as u128);
  152. let ip = (((number >> 49) - tm) as u32).to_le_bytes();
  153. let port = (number & 0xFFFFFF) - (tm & 0xFFFF);
  154. SocketAddr::V4(SocketAddrV4::new(
  155. Ipv4Addr::new(ip[0], ip[1], ip[2], ip[3]),
  156. port as u16,
  157. ))
  158. }
  159. }
  160. pub fn get_version_from_url(url: &str) -> String {
  161. let n = url.chars().count();
  162. let a = url.chars().rev().position(|x| x == '-');
  163. if let Some(a) = a {
  164. let b = url.chars().rev().position(|x| x == '.');
  165. if let Some(b) = b {
  166. if a > b {
  167. if url
  168. .chars()
  169. .skip(n - b)
  170. .collect::<String>()
  171. .parse::<i32>()
  172. .is_ok()
  173. {
  174. return url.chars().skip(n - a).collect();
  175. } else {
  176. return url.chars().skip(n - a).take(a - b - 1).collect();
  177. }
  178. } else {
  179. return url.chars().skip(n - a).collect();
  180. }
  181. }
  182. }
  183. "".to_owned()
  184. }
  185. pub fn gen_version() {
  186. println!("cargo:rerun-if-changed=Cargo.toml");
  187. use std::io::prelude::*;
  188. let mut file = File::create("./src/version.rs").unwrap();
  189. for line in read_lines("Cargo.toml").unwrap().flatten() {
  190. let ab: Vec<&str> = line.split('=').map(|x| x.trim()).collect();
  191. if ab.len() == 2 && ab[0] == "version" {
  192. file.write_all(format!("pub const VERSION: &str = {};\n", ab[1]).as_bytes())
  193. .ok();
  194. break;
  195. }
  196. }
  197. // generate build date
  198. let build_date = format!("{}", chrono::Local::now().format("%Y-%m-%d %H:%M"));
  199. file.write_all(
  200. format!("#[allow(dead_code)]\npub const BUILD_DATE: &str = \"{build_date}\";\n").as_bytes(),
  201. )
  202. .ok();
  203. file.sync_all().ok();
  204. }
  205. fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
  206. where
  207. P: AsRef<Path>,
  208. {
  209. let file = File::open(filename)?;
  210. Ok(io::BufReader::new(file).lines())
  211. }
  212. pub fn is_valid_custom_id(id: &str) -> bool {
  213. regex::Regex::new(r"^[a-zA-Z]\w{5,15}$")
  214. .unwrap()
  215. .is_match(id)
  216. }
  217. pub fn get_version_number(v: &str) -> i64 {
  218. let mut n = 0;
  219. for x in v.split('.') {
  220. n = n * 1000 + x.parse::<i64>().unwrap_or(0);
  221. }
  222. n
  223. }
  224. pub fn get_modified_time(path: &std::path::Path) -> SystemTime {
  225. std::fs::metadata(path)
  226. .map(|m| m.modified().unwrap_or(UNIX_EPOCH))
  227. .unwrap_or(UNIX_EPOCH)
  228. }
  229. pub fn get_created_time(path: &std::path::Path) -> SystemTime {
  230. std::fs::metadata(path)
  231. .map(|m| m.created().unwrap_or(UNIX_EPOCH))
  232. .unwrap_or(UNIX_EPOCH)
  233. }
  234. pub fn get_exe_time() -> SystemTime {
  235. std::env::current_exe().map_or(UNIX_EPOCH, |path| {
  236. let m = get_modified_time(&path);
  237. let c = get_created_time(&path);
  238. if m > c {
  239. m
  240. } else {
  241. c
  242. }
  243. })
  244. }
  245. pub fn get_uuid() -> Vec<u8> {
  246. #[cfg(not(any(target_os = "android", target_os = "ios")))]
  247. if let Ok(id) = machine_uid::get() {
  248. return id.into();
  249. }
  250. Config::get_key_pair().1
  251. }
  252. #[inline]
  253. pub fn get_time() -> i64 {
  254. std::time::SystemTime::now()
  255. .duration_since(std::time::UNIX_EPOCH)
  256. .map(|d| d.as_millis())
  257. .unwrap_or(0) as _
  258. }
  259. #[inline]
  260. pub fn is_ipv4_str(id: &str) -> bool {
  261. regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
  262. .unwrap()
  263. .is_match(id)
  264. }
  265. #[inline]
  266. pub fn is_ipv6_str(id: &str) -> bool {
  267. regex::Regex::new(r"^((([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4})|(\[([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4}\]:\d+))$")
  268. .unwrap()
  269. .is_match(id)
  270. }
  271. #[inline]
  272. pub fn is_ip_str(id: &str) -> bool {
  273. is_ipv4_str(id) || is_ipv6_str(id)
  274. }
  275. #[inline]
  276. pub fn is_domain_port_str(id: &str) -> bool {
  277. // modified regex for RFC1123 hostname. check https://stackoverflow.com/a/106223 for original version for hostname.
  278. // according to [TLD List](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) version 2023011700,
  279. // there is no digits in TLD, and length is 2~63.
  280. regex::Regex::new(
  281. r"(?i)^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z-]{0,61}[a-z]:\d{1,5}$",
  282. )
  283. .unwrap()
  284. .is_match(id)
  285. }
  286. #[cfg(test)]
  287. mod test {
  288. use super::*;
  289. #[test]
  290. fn test_mangle() {
  291. let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
  292. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  293. let addr = "[2001:db8::1]:8080".parse::<SocketAddr>().unwrap();
  294. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  295. let addr = "[2001:db8:ff::1111]:80".parse::<SocketAddr>().unwrap();
  296. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  297. }
  298. #[test]
  299. fn test_allow_err() {
  300. allow_err!(Err("test err") as Result<(), &str>);
  301. allow_err!(
  302. Err("test err with msg") as Result<(), &str>,
  303. "prompt {}",
  304. "failed"
  305. );
  306. }
  307. #[test]
  308. fn test_ipv6() {
  309. assert!(is_ipv6_str("1:2:3"));
  310. assert!(is_ipv6_str("[ab:2:3]:12"));
  311. assert!(is_ipv6_str("[ABEF:2a:3]:12"));
  312. assert!(!is_ipv6_str("[ABEG:2a:3]:12"));
  313. assert!(!is_ipv6_str("1[ab:2:3]:12"));
  314. assert!(!is_ipv6_str("1.1.1.1"));
  315. assert!(is_ip_str("1.1.1.1"));
  316. assert!(!is_ipv6_str("1:2:"));
  317. assert!(is_ipv6_str("1:2::0"));
  318. assert!(is_ipv6_str("[1:2::0]:1"));
  319. assert!(!is_ipv6_str("[1:2::0]:"));
  320. assert!(!is_ipv6_str("1:2::0]:1"));
  321. }
  322. #[test]
  323. fn test_hostname_port() {
  324. assert!(!is_domain_port_str("a:12"));
  325. assert!(!is_domain_port_str("a.b.c:12"));
  326. assert!(is_domain_port_str("test.com:12"));
  327. assert!(is_domain_port_str("test-UPPER.com:12"));
  328. assert!(is_domain_port_str("some-other.domain.com:12"));
  329. assert!(!is_domain_port_str("under_score:12"));
  330. assert!(!is_domain_port_str("a@bc:12"));
  331. assert!(!is_domain_port_str("1.1.1.1:12"));
  332. assert!(!is_domain_port_str("1.2.3:12"));
  333. assert!(!is_domain_port_str("1.2.3.45:12"));
  334. assert!(!is_domain_port_str("a.b.c:123456"));
  335. assert!(!is_domain_port_str("---:12"));
  336. assert!(!is_domain_port_str(".:12"));
  337. // todo: should we also check for these edge cases?
  338. // out-of-range port
  339. assert!(is_domain_port_str("test.com:0"));
  340. assert!(is_domain_port_str("test.com:98989"));
  341. }
  342. #[test]
  343. fn test_mangle2() {
  344. let addr = "[::ffff:127.0.0.1]:8080".parse().unwrap();
  345. let addr_v4 = "127.0.0.1:8080".parse().unwrap();
  346. assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr)), addr_v4);
  347. assert_eq!(
  348. AddrMangle::decode(&AddrMangle::encode("[::127.0.0.1]:8080".parse().unwrap())),
  349. addr_v4
  350. );
  351. assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v4)), addr_v4);
  352. let addr_v6 = "[ef::fe]:8080".parse().unwrap();
  353. assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v6)), addr_v6);
  354. let addr_v6 = "[::1]:8080".parse().unwrap();
  355. assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v6)), addr_v6);
  356. }
  357. }