|
|
|
@ -463,6 +463,10 @@ make_config! {
|
|
|
|
|
/// service is set, an icon request to Vaultwarden will return an HTTP redirect to the
|
|
|
|
|
/// corresponding icon at the external service.
|
|
|
|
|
icon_service: String, false, def, "internal".to_string();
|
|
|
|
|
/// Internal
|
|
|
|
|
_icon_service_url: String, false, gen, |c| generate_icon_service_url(&c.icon_service);
|
|
|
|
|
/// Internal
|
|
|
|
|
_icon_service_csp: String, false, gen, |c| generate_icon_service_csp(&c.icon_service, &c._icon_service_url);
|
|
|
|
|
/// Icon redirect code |> The HTTP status code to use for redirects to an external icon service.
|
|
|
|
|
/// The supported codes are 301 (legacy permanent), 302 (legacy temporary), 307 (temporary), and 308 (permanent).
|
|
|
|
|
/// Temporary redirects are useful while testing different icon services, but once a service
|
|
|
|
@ -748,6 +752,34 @@ fn extract_url_path(url: &str) -> String {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Generate the correct URL for the icon service.
|
|
|
|
|
/// This will be used within icons.rs to call the external icon service.
|
|
|
|
|
fn generate_icon_service_url(icon_service: &str) -> String {
|
|
|
|
|
match icon_service {
|
|
|
|
|
"internal" => "".to_string(),
|
|
|
|
|
"bitwarden" => "https://icons.bitwarden.net/{}/icon.png".to_string(),
|
|
|
|
|
"duckduckgo" => "https://icons.duckduckgo.com/ip3/{}.ico".to_string(),
|
|
|
|
|
"google" => "https://www.google.com/s2/favicons?domain={}&sz=32".to_string(),
|
|
|
|
|
_ => icon_service.to_string(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Generate the CSP string needed to allow redirected icon fetching
|
|
|
|
|
fn generate_icon_service_csp(icon_service: &str, icon_service_url: &str) -> String {
|
|
|
|
|
// We split on the first '{', since that is the variable delimiter for an icon service URL.
|
|
|
|
|
// Everything up until the first '{' should be fixed and can be used as an CSP string.
|
|
|
|
|
let csp_string = match icon_service_url.split_once('{') {
|
|
|
|
|
Some((c, _)) => c.to_string(),
|
|
|
|
|
None => "".to_string(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Because Google does a second redirect to there gstatic.com domain, we need to add an extra csp string.
|
|
|
|
|
match icon_service {
|
|
|
|
|
"google" => csp_string + " https://*.gstatic.com/favicon",
|
|
|
|
|
_ => csp_string,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Convert the old SMTP_SSL and SMTP_EXPLICIT_TLS options
|
|
|
|
|
fn smtp_convert_deprecated_ssl_options(smtp_ssl: Option<bool>, smtp_explicit_tls: Option<bool>) -> String {
|
|
|
|
|
if smtp_explicit_tls.is_some() || smtp_ssl.is_some() {
|
|
|
|
|