lib.rs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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. #[cfg(feature = "quic")]
  44. pub type Stream = quic::Connection;
  45. #[cfg(not(feature = "quic"))]
  46. pub type Stream = tcp::FramedStream;
  47. #[inline]
  48. pub async fn sleep(sec: f32) {
  49. tokio::time::sleep(time::Duration::from_secs_f32(sec)).await;
  50. }
  51. #[macro_export]
  52. macro_rules! allow_err {
  53. ($e:expr) => {
  54. if let Err(err) = $e {
  55. log::debug!(
  56. "{:?}, {}:{}:{}:{}",
  57. err,
  58. module_path!(),
  59. file!(),
  60. line!(),
  61. column!()
  62. );
  63. } else {
  64. }
  65. };
  66. ($e:expr, $($arg:tt)*) => {
  67. if let Err(err) = $e {
  68. log::debug!(
  69. "{:?}, {}, {}:{}:{}:{}",
  70. err,
  71. format_args!($($arg)*),
  72. module_path!(),
  73. file!(),
  74. line!(),
  75. column!()
  76. );
  77. } else {
  78. }
  79. };
  80. }
  81. #[inline]
  82. pub fn timeout<T: std::future::Future>(ms: u64, future: T) -> tokio::time::Timeout<T> {
  83. tokio::time::timeout(std::time::Duration::from_millis(ms), future)
  84. }
  85. pub type ResultType<F, E = anyhow::Error> = anyhow::Result<F, E>;
  86. /// Certain router and firewalls scan the packet and if they
  87. /// find an IP address belonging to their pool that they use to do the NAT mapping/translation, so here we mangle the ip address
  88. pub struct AddrMangle();
  89. impl AddrMangle {
  90. pub fn encode(addr: SocketAddr) -> Vec<u8> {
  91. match addr {
  92. SocketAddr::V4(addr_v4) => {
  93. let tm = (SystemTime::now()
  94. .duration_since(UNIX_EPOCH)
  95. .unwrap()
  96. .as_micros() as u32) as u128;
  97. let ip = u32::from_le_bytes(addr_v4.ip().octets()) as u128;
  98. let port = addr.port() as u128;
  99. let v = ((ip + tm) << 49) | (tm << 17) | (port + (tm & 0xFFFF));
  100. let bytes = v.to_le_bytes();
  101. let mut n_padding = 0;
  102. for i in bytes.iter().rev() {
  103. if i == &0u8 {
  104. n_padding += 1;
  105. } else {
  106. break;
  107. }
  108. }
  109. bytes[..(16 - n_padding)].to_vec()
  110. }
  111. SocketAddr::V6(addr_v6) => {
  112. let mut x = addr_v6.ip().octets().to_vec();
  113. let port: [u8; 2] = addr_v6.port().to_le_bytes();
  114. x.push(port[0]);
  115. x.push(port[1]);
  116. x
  117. }
  118. }
  119. }
  120. pub fn decode(bytes: &[u8]) -> SocketAddr {
  121. if bytes.len() > 16 {
  122. if bytes.len() != 18 {
  123. return Config::get_any_listen_addr(false);
  124. }
  125. #[allow(invalid_value)]
  126. let mut tmp: [u8; 2] = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
  127. tmp.copy_from_slice(&bytes[16..]);
  128. let port = u16::from_le_bytes(tmp);
  129. #[allow(invalid_value)]
  130. let mut tmp: [u8; 16] = unsafe { std::mem::MaybeUninit::uninit().assume_init() };
  131. tmp.copy_from_slice(&bytes[..16]);
  132. let ip = std::net::Ipv6Addr::from(tmp);
  133. return SocketAddr::new(IpAddr::V6(ip), port);
  134. }
  135. let mut padded = [0u8; 16];
  136. padded[..bytes.len()].copy_from_slice(&bytes);
  137. let number = u128::from_le_bytes(padded);
  138. let tm = (number >> 17) & (u32::max_value() as u128);
  139. let ip = (((number >> 49) - tm) as u32).to_le_bytes();
  140. let port = (number & 0xFFFFFF) - (tm & 0xFFFF);
  141. SocketAddr::V4(SocketAddrV4::new(
  142. Ipv4Addr::new(ip[0], ip[1], ip[2], ip[3]),
  143. port as u16,
  144. ))
  145. }
  146. }
  147. pub fn get_version_from_url(url: &str) -> String {
  148. let n = url.chars().count();
  149. let a = url
  150. .chars()
  151. .rev()
  152. .enumerate()
  153. .filter(|(_, x)| x == &'-')
  154. .next()
  155. .map(|(i, _)| i);
  156. if let Some(a) = a {
  157. let b = url
  158. .chars()
  159. .rev()
  160. .enumerate()
  161. .filter(|(_, x)| x == &'.')
  162. .next()
  163. .map(|(i, _)| i);
  164. if let Some(b) = b {
  165. if a > b {
  166. if url
  167. .chars()
  168. .skip(n - b)
  169. .collect::<String>()
  170. .parse::<i32>()
  171. .is_ok()
  172. {
  173. return url.chars().skip(n - a).collect();
  174. } else {
  175. return url.chars().skip(n - a).take(a - b - 1).collect();
  176. }
  177. } else {
  178. return url.chars().skip(n - a).collect();
  179. }
  180. }
  181. }
  182. "".to_owned()
  183. }
  184. pub fn gen_version() {
  185. use std::io::prelude::*;
  186. let mut file = File::create("./src/version.rs").unwrap();
  187. for line in read_lines("Cargo.toml").unwrap() {
  188. if let Ok(line) = line {
  189. let ab: Vec<&str> = line.split("=").map(|x| x.trim()).collect();
  190. if ab.len() == 2 && ab[0] == "version" {
  191. file.write_all(format!("pub const VERSION: &str = {};\n", ab[1]).as_bytes())
  192. .ok();
  193. break;
  194. }
  195. }
  196. }
  197. // generate build date
  198. let build_date = format!("{}", chrono::Local::now().format("%Y-%m-%d %H:%M"));
  199. file.write_all(format!("pub const BUILD_DATE: &str = \"{}\";", build_date).as_bytes())
  200. .ok();
  201. file.sync_all().ok();
  202. }
  203. fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
  204. where
  205. P: AsRef<Path>,
  206. {
  207. let file = File::open(filename)?;
  208. Ok(io::BufReader::new(file).lines())
  209. }
  210. pub fn is_valid_custom_id(id: &str) -> bool {
  211. regex::Regex::new(r"^[a-zA-Z]\w{5,15}$")
  212. .unwrap()
  213. .is_match(id)
  214. }
  215. pub fn get_version_number(v: &str) -> i64 {
  216. let mut n = 0;
  217. for x in v.split(".") {
  218. n = n * 1000 + x.parse::<i64>().unwrap_or(0);
  219. }
  220. n
  221. }
  222. pub fn get_modified_time(path: &std::path::Path) -> SystemTime {
  223. std::fs::metadata(&path)
  224. .map(|m| m.modified().unwrap_or(UNIX_EPOCH))
  225. .unwrap_or(UNIX_EPOCH)
  226. }
  227. pub fn get_created_time(path: &std::path::Path) -> SystemTime {
  228. std::fs::metadata(&path)
  229. .map(|m| m.created().unwrap_or(UNIX_EPOCH))
  230. .unwrap_or(UNIX_EPOCH)
  231. }
  232. pub fn get_exe_time() -> SystemTime {
  233. std::env::current_exe().map_or(UNIX_EPOCH, |path| {
  234. let m = get_modified_time(&path);
  235. let c = get_created_time(&path);
  236. if m > c {
  237. m
  238. } else {
  239. c
  240. }
  241. })
  242. }
  243. pub fn get_uuid() -> Vec<u8> {
  244. #[cfg(not(any(target_os = "android", target_os = "ios")))]
  245. if let Ok(id) = machine_uid::get() {
  246. return id.into();
  247. }
  248. Config::get_key_pair().1
  249. }
  250. #[inline]
  251. pub fn get_time() -> i64 {
  252. std::time::SystemTime::now()
  253. .duration_since(std::time::UNIX_EPOCH)
  254. .map(|d| d.as_millis())
  255. .unwrap_or(0) as _
  256. }
  257. #[cfg(test)]
  258. mod tests {
  259. use super::*;
  260. #[test]
  261. fn test_mangle() {
  262. let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
  263. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  264. let addr = "[2001:db8::1]:8080".parse::<SocketAddr>().unwrap();
  265. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  266. let addr = "[2001:db8:ff::1111]:80".parse::<SocketAddr>().unwrap();
  267. assert_eq!(addr, AddrMangle::decode(&AddrMangle::encode(addr)));
  268. }
  269. #[test]
  270. fn test_allow_err() {
  271. allow_err!(Err("test err") as Result<(), &str>);
  272. allow_err!(
  273. Err("test err with msg") as Result<(), &str>,
  274. "prompt {}",
  275. "failed"
  276. );
  277. }
  278. }
  279. #[inline]
  280. pub fn is_ipv4_str(id: &str) -> bool {
  281. regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
  282. .unwrap()
  283. .is_match(id)
  284. }
  285. #[inline]
  286. pub fn is_ipv6_str(id: &str) -> bool {
  287. 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+))$")
  288. .unwrap()
  289. .is_match(id)
  290. }
  291. #[inline]
  292. pub fn is_ip_str(id: &str) -> bool {
  293. is_ipv4_str(id) || is_ipv6_str(id)
  294. }
  295. #[cfg(test)]
  296. mod test_lib {
  297. use super::*;
  298. #[test]
  299. fn test_ipv6() {
  300. assert_eq!(is_ipv6_str("1:2:3"), true);
  301. assert_eq!(is_ipv6_str("[ab:2:3]:12"), true);
  302. assert_eq!(is_ipv6_str("[ABEF:2a:3]:12"), true);
  303. assert_eq!(is_ipv6_str("[ABEG:2a:3]:12"), false);
  304. assert_eq!(is_ipv6_str("1[ab:2:3]:12"), false);
  305. assert_eq!(is_ipv6_str("1.1.1.1"), false);
  306. assert_eq!(is_ip_str("1.1.1.1"), true);
  307. assert_eq!(is_ipv6_str("1:2:"), false);
  308. assert_eq!(is_ipv6_str("1:2::0"), true);
  309. assert_eq!(is_ipv6_str("[1:2::0]:1"), true);
  310. assert_eq!(is_ipv6_str("[1:2::0]:"), false);
  311. assert_eq!(is_ipv6_str("1:2::0]:1"), false);
  312. }
  313. }