1- use anyhow:: { Context , anyhow} ;
2- use ipnetwork:: IpNetwork ;
31use oauth2:: { ClientId , ClientSecret } ;
42use url:: Url ;
53
@@ -53,8 +51,6 @@ pub struct Server {
5351 pub blocked_traffic : Vec < ( String , Vec < String > ) > ,
5452 pub blocked_ips : HashSet < IpAddr > ,
5553 pub max_allowed_page_offset : u32 ,
56- pub page_offset_ua_blocklist : Vec < String > ,
57- pub page_offset_cidr_blocklist : Vec < IpNetwork > ,
5854 pub excluded_crate_names : Vec < String > ,
5955 pub domain_name : String ,
6056 pub allowed_origins : AllowedOrigins ,
@@ -123,12 +119,6 @@ impl Server {
123119 /// querying metrics will be completely disabled.
124120 /// - `WEB_MAX_ALLOWED_PAGE_OFFSET`: Page offsets larger than this value are rejected. Defaults
125121 /// to 200.
126- /// - `WEB_PAGE_OFFSET_UA_BLOCKLIST`: A comma separated list of user-agent substrings that will
127- /// be blocked if `WEB_MAX_ALLOWED_PAGE_OFFSET` is exceeded. Including an empty string in the
128- /// list will block *all* user-agents exceeding the offset. If not set or empty, no blocking
129- /// will occur.
130- /// - `WEB_PAGE_OFFSET_CIDR_BLOCKLIST`: A comma separated list of CIDR blocks that will be used
131- /// to block IP addresses, e.g. `192.168.1.0/24`. If not set or empty, no blocking will occur.
132122 /// - `INSTANCE_METRICS_LOG_EVERY_SECONDS`: How frequently should instance metrics be logged.
133123 /// If the environment variable is not present instance metrics are not logged.
134124 /// - `FORCE_UNCONDITIONAL_REDIRECTS`: Whether to force unconditional redirects in the download
@@ -156,9 +146,6 @@ impl Server {
156146 let blocked_ips = HashSet :: from_iter ( list_parsed ( "BLOCKED_IPS" , IpAddr :: from_str) ?) ;
157147
158148 let allowed_origins = AllowedOrigins :: from_default_env ( ) ?;
159- let page_offset_ua_blocklist = list ( "WEB_PAGE_OFFSET_UA_BLOCKLIST" ) ?;
160- let page_offset_cidr_blocklist =
161- list_parsed ( "WEB_PAGE_OFFSET_CIDR_BLOCKLIST" , parse_cidr_block) ?;
162149
163150 let base = Base :: from_environment ( ) ?;
164151 let excluded_crate_names = list ( "EXCLUDED_CRATE_NAMES" ) ?;
@@ -229,8 +216,6 @@ impl Server {
229216 blocked_traffic : blocked_traffic ( ) ,
230217 blocked_ips,
231218 max_allowed_page_offset : var_parsed ( "WEB_MAX_ALLOWED_PAGE_OFFSET" ) ?. unwrap_or ( 200 ) ,
232- page_offset_ua_blocklist,
233- page_offset_cidr_blocklist,
234219 excluded_crate_names,
235220 domain_name,
236221 allowed_origins,
@@ -268,34 +253,6 @@ impl Server {
268253 }
269254}
270255
271- /// Parses a CIDR block string to a valid `IpNetwork` struct.
272- ///
273- /// The purpose is to be able to block IP ranges that overload the API that uses pagination.
274- ///
275- /// The minimum number of bits for a host prefix must be
276- ///
277- /// * at least 16 for IPv4 based CIDRs.
278- /// * at least 64 for IPv6 based CIDRs
279- ///
280- fn parse_cidr_block ( block : & str ) -> anyhow:: Result < IpNetwork > {
281- let cidr = block
282- . parse ( )
283- . context ( "WEB_PAGE_OFFSET_CIDR_BLOCKLIST must contain IPv4 or IPv6 CIDR blocks." ) ?;
284-
285- let host_prefix = match cidr {
286- IpNetwork :: V4 ( _) => 16 ,
287- IpNetwork :: V6 ( _) => 64 ,
288- } ;
289-
290- if cidr. prefix ( ) < host_prefix {
291- return Err ( anyhow ! (
292- "WEB_PAGE_OFFSET_CIDR_BLOCKLIST only allows CIDR blocks with a host prefix of at least 16 bits (IPv4) or 64 bits (IPv6)."
293- ) ) ;
294- }
295-
296- Ok ( cidr)
297- }
298-
299256fn blocked_traffic ( ) -> Vec < ( String , Vec < String > ) > {
300257 let pattern_list = dotenvy:: var ( "BLOCKED_TRAFFIC" ) . unwrap_or_default ( ) ;
301258 parse_traffic_patterns ( & pattern_list)
@@ -346,7 +303,7 @@ impl FromStr for AllowedOrigins {
346303#[ cfg( test) ]
347304mod tests {
348305 use super :: * ;
349- use claims:: { assert_err , assert_none, assert_ok_eq } ;
306+ use claims:: assert_none;
350307
351308 #[ test]
352309 fn parse_traffic_patterns_splits_on_comma_and_looks_for_equal_sign ( ) {
@@ -362,44 +319,4 @@ mod tests {
362319
363320 assert_none ! ( parse_traffic_patterns( pattern_string_3) . next( ) ) ;
364321 }
365-
366- #[ test]
367- fn parse_cidr_block_list_successfully ( ) {
368- assert_ok_eq ! (
369- parse_cidr_block( "127.0.0.1/24" ) ,
370- "127.0.0.1/24" . parse:: <IpNetwork >( ) . unwrap( )
371- ) ;
372- assert_ok_eq ! (
373- parse_cidr_block( "192.168.0.1/31" ) ,
374- "192.168.0.1/31" . parse:: <IpNetwork >( ) . unwrap( )
375- ) ;
376- }
377-
378- #[ test]
379- fn parse_cidr_blocks_panics_when_host_ipv4_prefix_is_too_low ( ) {
380- assert_err ! ( parse_cidr_block( "127.0.0.1/8" ) ) ;
381- }
382-
383- #[ test]
384- fn parse_cidr_blocks_panics_when_host_ipv6_prefix_is_too_low ( ) {
385- assert_err ! ( parse_cidr_block(
386- "2001:0db8:0123:4567:89ab:cdef:1234:5678/56"
387- ) ) ;
388- }
389-
390- #[ test]
391- fn parse_ipv6_based_cidr_blocks ( ) {
392- assert_ok_eq ! (
393- parse_cidr_block( "2002::1234:abcd:ffff:c0a8:101/64" ) ,
394- "2002::1234:abcd:ffff:c0a8:101/64"
395- . parse:: <IpNetwork >( )
396- . unwrap( )
397- ) ;
398- assert_ok_eq ! (
399- parse_cidr_block( "2001:0db8:0123:4567:89ab:cdef:1234:5678/92" ) ,
400- "2001:0db8:0123:4567:89ab:cdef:1234:5678/92"
401- . parse:: <IpNetwork >( )
402- . unwrap( )
403- ) ;
404- }
405322}
0 commit comments