1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3
4pub use ipnet::IpNet;
5
6pub mod acl;
7pub mod error;
8pub mod utils;
9
10pub use acl::{HttpAcl, HttpAclBuilder, HttpRequestMethod};
11pub use utils::IntoIpRange;
12
13#[cfg(test)]
14mod tests {
15 use super::HttpAclBuilder;
16 use ipnet::IpNet;
17
18 #[test]
19 fn acl() {
20 let acl = HttpAclBuilder::new()
21 .add_allowed_host("example.com".to_string())
22 .unwrap()
23 .add_allowed_host("example.org".to_string())
24 .unwrap()
25 .add_denied_host("example.net".to_string())
26 .unwrap()
27 .add_allowed_port_range(8080..=8080)
28 .unwrap()
29 .add_denied_port_range(8443..=8443)
30 .unwrap()
31 .add_allowed_ip_range("1.0.0.0/8".parse::<IpNet>().unwrap())
32 .unwrap()
33 .add_denied_ip_range("9.0.0.0/8".parse::<IpNet>().unwrap())
34 .unwrap()
35 .build();
36
37 assert!(acl.is_host_allowed("example.com").is_allowed());
38 assert!(acl.is_host_allowed("example.org").is_allowed());
39 assert!(!acl.is_host_allowed("example.net").is_allowed());
40 assert!(acl.is_port_allowed(8080).is_allowed());
41 assert!(!acl.is_port_allowed(8443).is_allowed());
42 assert!(acl.is_ip_allowed(&"1.1.1.1".parse().unwrap()).is_allowed());
43 assert!(acl.is_ip_allowed(&"9.9.9.9".parse().unwrap()).is_denied());
44 assert!(
45 acl.is_ip_allowed(&"192.168.1.1".parse().unwrap())
46 .is_denied()
47 );
48 }
49
50 #[test]
51 fn host_acl() {
52 let acl = HttpAclBuilder::new()
53 .add_allowed_host("example.com".to_string())
54 .unwrap()
55 .add_allowed_host("example.org".to_string())
56 .unwrap()
57 .add_denied_host("example.net".to_string())
58 .unwrap()
59 .build();
60
61 assert!(acl.is_host_allowed("example.com").is_allowed());
62 assert!(acl.is_host_allowed("example.org").is_allowed());
63 assert!(!acl.is_host_allowed("example.net").is_allowed());
64 }
65
66 #[test]
67 fn port_acl() {
68 let acl = HttpAclBuilder::new()
69 .clear_allowed_port_ranges()
70 .add_allowed_port_range(8080..=8080)
71 .unwrap()
72 .add_denied_port_range(8443..=8443)
73 .unwrap()
74 .build();
75
76 assert!(acl.is_port_allowed(8080).is_allowed());
77 assert!(!acl.is_port_allowed(8443).is_allowed());
78 }
79
80 #[test]
81 fn ip_acl() {
82 let acl = HttpAclBuilder::new()
83 .clear_allowed_ip_ranges()
84 .add_allowed_ip_range("1.0.0.0/8".parse::<IpNet>().unwrap())
85 .unwrap()
86 .add_denied_ip_range("9.0.0.0/8".parse::<IpNet>().unwrap())
87 .unwrap()
88 .build();
89
90 assert!(acl.is_ip_allowed(&"1.1.1.1".parse().unwrap()).is_allowed());
91 assert!(acl.is_ip_allowed(&"9.9.9.9".parse().unwrap()).is_denied());
92 assert!(
93 acl.is_ip_allowed(&"192.168.1.1".parse().unwrap())
94 .is_denied()
95 );
96 }
97
98 #[test]
99 fn private_ip_acl() {
100 let acl = HttpAclBuilder::new()
101 .private_ip_ranges(true)
102 .ip_acl_default(true)
103 .build();
104
105 assert!(
106 acl.is_ip_allowed(&"192.168.1.1".parse().unwrap())
107 .is_allowed()
108 );
109 }
110
111 #[test]
112 fn default_ip_acl() {
113 let acl = HttpAclBuilder::new().build();
114
115 assert!(
116 acl.is_ip_allowed(&"192.168.1.1".parse().unwrap())
117 .is_denied()
118 );
119 assert!(acl.is_ip_allowed(&"1.1.1.1".parse().unwrap()).is_denied());
120 assert!(!acl.is_port_allowed(8080).is_allowed());
121 }
122
123 #[test]
124 fn url_path_acl() {
125 let acl = HttpAclBuilder::new()
126 .add_allowed_url_path("/allowed".to_string())
127 .unwrap()
128 .add_allowed_url_path("/allowed/:id".to_string())
129 .unwrap()
130 .add_denied_url_path("/denied".to_string())
131 .unwrap()
132 .add_denied_url_path("/denied/{*path}".to_string())
133 .unwrap()
134 .build();
135
136 assert!(acl.is_url_path_allowed("/allowed").is_allowed());
137 assert!(acl.is_url_path_allowed("/allowed/allowed").is_allowed());
138 assert!(acl.is_url_path_allowed("/denied").is_denied());
139 assert!(acl.is_url_path_allowed("/denied/denied").is_denied());
140 assert!(acl.is_url_path_allowed("/denied/denied/denied").is_denied());
141 }
142
143 #[test]
144 fn header_acl() {
145 let acl = HttpAclBuilder::new()
146 .add_allowed_header("X-Allowed".to_string(), Some("true".to_string()))
147 .unwrap()
148 .add_allowed_header("X-Allowed2".to_string(), None)
149 .unwrap()
150 .add_denied_header("X-Denied".to_string(), Some("true".to_string()))
151 .unwrap()
152 .add_denied_header("X-Denied2".to_string(), None)
153 .unwrap()
154 .build();
155
156 assert!(acl.is_header_allowed("X-Allowed", "true").is_allowed());
157 assert!(acl.is_header_allowed("X-Allowed2", "false").is_allowed());
158 assert!(acl.is_header_allowed("X-Denied", "true").is_denied());
159 assert!(acl.is_header_allowed("X-Denied2", "false").is_denied());
160 }
161}