data_faking/data/it/
ipv4.rs

1use 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  // Using 10,000 as a heuristic to ensure loop does not run forever.
31  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    &REGEXP_PRIVATE_LOCAL,
93    &REGEXP_PRIVATE_SHARED_ADDR,
94    &REGEXP_PRIVATE_LOOPBACK,
95    &REGEXP_PRIVATE_LOCAL_LINK_ADDR,
96    &REGEXP_PRIVATE_LOCAL_PRIVATE_1,
97    &REGEXP_PRIVATE_IETF_PROTOCOLS,
98    &REGEXP_PRIVATE_LOCAL_PRIVATE_2,
99    &REGEXP_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    &REGEXP_RESERVED_LOCAL,
113    &REGEXP_RESERVED_TEST_NET_1,
114    &REGEXP_RESERVED_IPV6_RELAY,
115    &REGEXP_RESERVED_TEST_NET_2,
116    &REGEXP_RESERVED_TEST_NET_3,
117    &REGEXP_RESERVED_MULTICAST,
118    &REGEXP_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}