data_faking/data/it/
ipv4.rs1use crate::utils::seeder;
2use regex::Regex;
3use std::ops::Range;
4use wasm_bindgen::prelude::*;
5
6#[wasm_bindgen]
7pub fn ipv4_address() -> String {
8 let mut slist: Vec<String> = vec![];
9 for _ in 0..4 {
10 let v = seeder::gen_range(IP_RANGE_MIN..=IP_RANGE_MAX).to_string();
11 slist.push(v);
12 }
13 slist.join(".")
14}
15
16#[wasm_bindgen]
17pub fn ipv4_address_with_cidr() -> String {
18 let mut s = ipv4_address();
19 s.push_str("/");
20
21 let v = seeder::gen_range(CIDR_MIN..=CIDR_MAX).to_string();
22 s.push_str(&v);
23 s
24}
25
26#[wasm_bindgen]
27pub fn ipv4_address_public() -> String {
28 let ctrl = 0;
29
30 while ctrl < 10000 {
32 let ip = ipv4_address();
33 if is_private_network(&ip) || is_reserved_network(&ip) {
34 continue;
35 }
36 return ip;
37 }
38 return "".to_owned();
39}
40
41#[wasm_bindgen]
42pub fn ipv4_address_private() -> String {
43 let ranges = PRIVATE_RANGES[seeder::gen_range(0..(*PRIVATE_RANGES_LEN))];
44 let mut slist: Vec<String> = vec![];
45 for i in ranges {
46 if i.start == i.end {
47 slist.push(i.start.to_string());
48 continue;
49 }
50
51 let v = seeder::gen_range(i.start..i.end).to_string();
52 slist.push(v);
53 }
54 slist.join(".")
55}
56
57fn is_private_network(ip: &String) -> bool {
58 for elem in PRIVATE_RANGES_REGEX.iter() {
59 if (**elem).is_match(ip.as_str()) {
60 return true;
61 }
62 }
63 return false;
64}
65
66fn is_reserved_network(ip: &String) -> bool {
67 for elem in RESERVED_RANGES_REGEX.iter() {
68 if (**elem).is_match(ip.as_str()) {
69 return true;
70 }
71 }
72 return false;
73}
74
75static IP_RANGE_MIN: u32 = 0;
76static IP_RANGE_MAX: u32 = 255;
77
78static CIDR_MIN: u32 = 1;
79static CIDR_MAX: u32 = 127;
80
81lazy_static! {
82 static ref REGEXP_PRIVATE_LOCAL: Regex = Regex::new(r"^10\.").unwrap();
83 static ref REGEXP_PRIVATE_SHARED_ADDR: Regex = Regex::new(r"^100\.(6[4-9]|[7-9]\d|1[0-1]\d|12[0-7])\.").unwrap();
84 static ref REGEXP_PRIVATE_LOOPBACK: Regex = Regex::new(r"^127\.").unwrap();
85 static ref REGEXP_PRIVATE_LOCAL_LINK_ADDR: Regex = Regex::new(r"^169\.254\.").unwrap();
86 static ref REGEXP_PRIVATE_LOCAL_PRIVATE_1: Regex = Regex::new(r"^172\.(1[6-9]|2\d|3[0-1])\.").unwrap();
87 static ref REGEXP_PRIVATE_IETF_PROTOCOLS: Regex = Regex::new(r"^192\.0\.0\.").unwrap();
88 static ref REGEXP_PRIVATE_LOCAL_PRIVATE_2: Regex = Regex::new(r"^192\.168\.").unwrap();
89 static ref REGEXP_PRIVATE_BENCHMARK: Regex = Regex::new(r"^198\.(1[8-9])\.").unwrap();
90
91 static ref PRIVATE_RANGES_REGEX: [&'static Regex; 8] = [
92 ®EXP_PRIVATE_LOCAL,
93 ®EXP_PRIVATE_SHARED_ADDR,
94 ®EXP_PRIVATE_LOOPBACK,
95 ®EXP_PRIVATE_LOCAL_LINK_ADDR,
96 ®EXP_PRIVATE_LOCAL_PRIVATE_1,
97 ®EXP_PRIVATE_IETF_PROTOCOLS,
98 ®EXP_PRIVATE_LOCAL_PRIVATE_2,
99 ®EXP_PRIVATE_BENCHMARK
100 ];
101 static ref PRIVATE_RANGES_REGEX_LEN: usize = PRIVATE_RANGES_REGEX.len();
102
103 static ref REGEXP_RESERVED_LOCAL: Regex = Regex::new(r"^0\.").unwrap();
104 static ref REGEXP_RESERVED_TEST_NET_1: Regex = Regex::new(r"^192\.0\.2\.").unwrap();
105 static ref REGEXP_RESERVED_IPV6_RELAY: Regex = Regex::new(r"^192\.88\.99\.").unwrap();
106 static ref REGEXP_RESERVED_TEST_NET_2: Regex = Regex::new(r"^198\.51\.100\.").unwrap();
107 static ref REGEXP_RESERVED_TEST_NET_3: Regex = Regex::new(r"^203\.0\.113\.").unwrap();
108 static ref REGEXP_RESERVED_MULTICAST: Regex = Regex::new(r"^(22[4-9]|23\d)\.").unwrap();
109 static ref REGEXP_RESERVED_FUTURE_USE: Regex = Regex::new(r"^(24\d|25[0-5])\.").unwrap();
110
111 static ref RESERVED_RANGES_REGEX: [&'static Regex; 7] = [
112 ®EXP_RESERVED_LOCAL,
113 ®EXP_RESERVED_TEST_NET_1,
114 ®EXP_RESERVED_IPV6_RELAY,
115 ®EXP_RESERVED_TEST_NET_2,
116 ®EXP_RESERVED_TEST_NET_3,
117 ®EXP_RESERVED_MULTICAST,
118 ®EXP_RESERVED_FUTURE_USE
119 ];
120 static ref RESERVED_RANGES_REGEX_LEN: usize = RESERVED_RANGES_REGEX.len();
121
122 static ref PRIVATE_RANGES: [&'static [Range<i32>; 4]; 8] = [
123 &[10..10, 0..255, 0..255, 1..255],
124 &[100..100, 64..127, 0..255, 1..255],
125 &[127..127, 0..255, 0..255, 1..255],
126 &[169..169, 254..254, 0..255, 1..255],
127 &[172..172, 16..31, 0..255, 1..255],
128 &[192..192, 0..0, 0..0, 1..255],
129 &[192..192, 168..168, 0..255, 1..255],
130 &[198..198, 18..19, 0..255, 1..255]
131 ];
132 static ref PRIVATE_RANGES_LEN: usize = PRIVATE_RANGES.len();
133}