|  |  | @ -1,5 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | use std::{ | 
			
		
	
		
			
				
					|  |  |  |     collections::HashMap, | 
			
		
	
		
			
				
					|  |  |  |     net::IpAddr, | 
			
		
	
		
			
				
					|  |  |  |     sync::Arc, | 
			
		
	
		
			
				
					|  |  |  |     time::{Duration, SystemTime}, | 
			
		
	
	
		
			
				
					|  |  | @ -18,7 +17,6 @@ use tokio::{ | 
			
		
	
		
			
				
					|  |  |  |     fs::{create_dir_all, remove_file, symlink_metadata, File}, | 
			
		
	
		
			
				
					|  |  |  |     io::{AsyncReadExt, AsyncWriteExt}, | 
			
		
	
		
			
				
					|  |  |  |     net::lookup_host, | 
			
		
	
		
			
				
					|  |  |  |     sync::RwLock, | 
			
		
	
		
			
				
					|  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | use html5gum::{Emitter, EndTag, InfallibleTokenizer, Readable, StartTag, StringReader, Tokenizer}; | 
			
		
	
	
		
			
				
					|  |  | @ -76,7 +74,7 @@ static CLIENT: Lazy<Client> = Lazy::new(|| { | 
			
		
	
		
			
				
					|  |  |  | static ICON_SIZE_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"(?x)(\d+)\D*(\d+)").unwrap()); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | // Special HashMap which holds the user defined Regex to speedup matching the regex.
 | 
			
		
	
		
			
				
					|  |  |  | static ICON_BLACKLIST_REGEX: Lazy<RwLock<HashMap<String, Regex>>> = Lazy::new(|| RwLock::new(HashMap::new())); | 
			
		
	
		
			
				
					|  |  |  | static ICON_BLACKLIST_REGEX: Lazy<dashmap::DashMap<String, Regex>> = Lazy::new(dashmap::DashMap::new); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | async fn icon_redirect(domain: &str, template: &str) -> Option<Redirect> { | 
			
		
	
		
			
				
					|  |  |  |     if !is_valid_domain(domain).await { | 
			
		
	
	
		
			
				
					|  |  | @ -293,32 +291,25 @@ async fn is_domain_blacklisted(domain: &str) -> bool { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if let Some(blacklist) = CONFIG.icon_blacklist_regex() { | 
			
		
	
		
			
				
					|  |  |  |         let mut regex_hashmap = ICON_BLACKLIST_REGEX.read().await; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Use the pre-generate Regex stored in a Lazy HashMap if there's one, else generate it.
 | 
			
		
	
		
			
				
					|  |  |  |         let regex = if let Some(regex) = regex_hashmap.get(&blacklist) { | 
			
		
	
		
			
				
					|  |  |  |             regex | 
			
		
	
		
			
				
					|  |  |  |         let is_match = if let Some(regex) = ICON_BLACKLIST_REGEX.get(&blacklist) { | 
			
		
	
		
			
				
					|  |  |  |             regex.is_match(domain) | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |             drop(regex_hashmap); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             let mut regex_hashmap_write = ICON_BLACKLIST_REGEX.write().await; | 
			
		
	
		
			
				
					|  |  |  |             // Clear the current list if the previous key doesn't exists.
 | 
			
		
	
		
			
				
					|  |  |  |             // To prevent growing of the HashMap after someone has changed it via the admin interface.
 | 
			
		
	
		
			
				
					|  |  |  |             if regex_hashmap_write.len() >= 1 { | 
			
		
	
		
			
				
					|  |  |  |                 regex_hashmap_write.clear(); | 
			
		
	
		
			
				
					|  |  |  |             if ICON_BLACKLIST_REGEX.len() >= 1 { | 
			
		
	
		
			
				
					|  |  |  |                 ICON_BLACKLIST_REGEX.clear(); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Generate the regex to store in too the Lazy Static HashMap.
 | 
			
		
	
		
			
				
					|  |  |  |             let blacklist_regex = Regex::new(&blacklist); | 
			
		
	
		
			
				
					|  |  |  |             regex_hashmap_write.insert(blacklist.to_string(), blacklist_regex.unwrap()); | 
			
		
	
		
			
				
					|  |  |  |             drop(regex_hashmap_write); | 
			
		
	
		
			
				
					|  |  |  |             let blacklist_regex = Regex::new(&blacklist).unwrap(); | 
			
		
	
		
			
				
					|  |  |  |             let is_match = blacklist_regex.is_match(domain); | 
			
		
	
		
			
				
					|  |  |  |             ICON_BLACKLIST_REGEX.insert(blacklist.to_string(), blacklist_regex); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             regex_hashmap = ICON_BLACKLIST_REGEX.read().await; | 
			
		
	
		
			
				
					|  |  |  |             regex_hashmap.get(&blacklist).unwrap() | 
			
		
	
		
			
				
					|  |  |  |             is_match | 
			
		
	
		
			
				
					|  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Use the pre-generate Regex stored in a Lazy HashMap.
 | 
			
		
	
		
			
				
					|  |  |  |         if regex.is_match(domain) { | 
			
		
	
		
			
				
					|  |  |  |         if is_match { | 
			
		
	
		
			
				
					|  |  |  |             debug!("Blacklisted domain: {} matched ICON_BLACKLIST_REGEX", domain); | 
			
		
	
		
			
				
					|  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  | 
 |