| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -406,9 +406,10 @@ make_config! { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// This setting applies globally to all users.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        incomplete_2fa_time_limit: i64, true,   def,    3; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Disable icon downloads |> Set to true to disable icon downloading, this would still serve icons from
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// $ICON_CACHE_FOLDER, but it won't produce any external network request. Needs to set $ICON_CACHE_TTL to 0,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// otherwise it will delete them and they won't be downloaded again.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Disable icon downloads |> Set to true to disable icon downloading in the internal icon service.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// This still serves existing icons from $ICON_CACHE_FOLDER, without generating any external
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// network requests. $ICON_CACHE_TTL must also be set to 0; otherwise, the existing icons
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// will be deleted eventually, but won't be downloaded again.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        disable_icon_download:  bool,   true,   def,    false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Allow new signups |> Controls whether new users can register. Users can be invited by the vaultwarden admin even if this is disabled
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        signups_allowed:        bool,   true,   def,    true; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -449,6 +450,13 @@ make_config! { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ip_header:              String, true,   def,    "X-Real-IP".to_string(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Internal IP header property, used to avoid recomputing each time
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        _ip_header_enabled:     bool,   false,  gen,    |c| &c.ip_header.trim().to_lowercase() != "none"; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Icon service |> The predefined icon services are: internal, bitwarden, duckduckgo, google.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// To specify a custom icon service, set a URL template with exactly one instance of `{}`,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// which is replaced with the domain. For example: `https://icon.example.com/domain/{}`.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// `internal` refers to Vaultwarden's built-in icon fetching implementation. If an external
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// service is set, an icon request to Vaultwarden will return an HTTP 307 redirect to the
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// corresponding icon at the external service.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        icon_service:           String, false,  def,    "internal".to_string(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Positive icon cache expiry |> Number of seconds to consider that an already cached icon is fresh. After this period, the icon will be redownloaded
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        icon_cache_ttl:         u64,    true,   def,    2_592_000; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        /// Negative icon cache expiry |> Number of seconds before trying to download an icon that failed again.
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -659,6 +667,22 @@ fn validate_config(cfg: &ConfigItems) -> Result<(), Error> { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Check if the icon service is valid
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let icon_service = cfg.icon_service.as_str(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    match icon_service { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "internal" | "bitwarden" | "duckduckgo" | "google" => (), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        _ => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if !icon_service.starts_with("http") { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                err!(format!("Icon service URL `{}` must start with \"http\"", icon_service)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            match icon_service.matches("{}").count() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                1 => (), // nominal
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                0 => err!(format!("Icon service URL `{}` has no placeholder \"{{}}\"", icon_service)), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                _ => err!(format!("Icon service URL `{}` has more than one placeholder \"{{}}\"", icon_service)), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Ok(()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |