From dc1f6f33eb8a608f4b9e15003ef1d92a0be85977 Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Thu, 12 Dec 2024 20:45:54 +0300 Subject: [PATCH] webapp: Extract domain name for ssltest link Difference from python impl is better handling of invalid urls. --- Cargo.lock | 1 + repology-webapp/Cargo.toml | 1 + repology-webapp/src/lib.rs | 1 + repology-webapp/src/template_funcs.rs | 70 +++++++++++++++++++ repology-webapp/templates/_macros/links.html | 6 +- .../tests/integration_tests/link.rs | 1 - 6 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 repology-webapp/src/template_funcs.rs diff --git a/Cargo.lock b/Cargo.lock index 33205f7..7cf97a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2082,6 +2082,7 @@ dependencies = [ "tracing-appender", "tracing-subscriber", "ttf-parser", + "url", "url-escape", ] diff --git a/repology-webapp/Cargo.toml b/repology-webapp/Cargo.toml index 9b68175..faf550e 100644 --- a/repology-webapp/Cargo.toml +++ b/repology-webapp/Cargo.toml @@ -39,6 +39,7 @@ tracing = "0.1.41" tracing-appender = "0.2.3" tracing-subscriber = "0.3.19" ttf-parser = "0.25.1" +url = "2.5.4" url-escape = "0.1.1" [dev-dependencies] diff --git a/repology-webapp/src/lib.rs b/repology-webapp/src/lib.rs index a915177..484d64b 100644 --- a/repology-webapp/src/lib.rs +++ b/repology-webapp/src/lib.rs @@ -22,6 +22,7 @@ mod result; mod state; mod static_files; mod template_context; +mod template_funcs; mod url_for; mod views; mod xmlwriter; diff --git a/repology-webapp/src/template_funcs.rs b/repology-webapp/src/template_funcs.rs new file mode 100644 index 0000000..da49ea7 --- /dev/null +++ b/repology-webapp/src/template_funcs.rs @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: Copyright 2024 Dmitry Marakasov +// SPDX-License-Identifier: GPL-3.0-or-later + +use url::Url; + +/// Given an url, try to extract domain for Qualys SSL Server Test +/// +/// Qualys requires domain (not an IP address) and does not allow +/// custom ports, so only return host part if +pub fn extract_domain_for_ssltest(url: &str) -> Option { + let url = Url::parse(url).ok()?; + if url.port_or_known_default().is_none_or(|port| port == 443) { + url.domain().map(|domain| domain.into()) + } else { + None + } +} + +#[cfg(test)] +#[coverage(off)] +mod tests { + mod test_extract_domain_for_ssltest { + use super::super::*; + + #[test] + fn test_basic() { + assert_eq!( + extract_domain_for_ssltest("https://example.com/").as_deref(), + Some("example.com") + ); + } + + #[test] + fn test_default_port() { + assert_eq!( + extract_domain_for_ssltest("https://example.com:443/").as_deref(), + Some("example.com") + ); + } + + #[test] + fn test_custom_port() { + assert_eq!(extract_domain_for_ssltest("https://example.com:444/"), None); + } + + #[test] + fn test_custom_schema() { + assert_eq!( + extract_domain_for_ssltest("git+https://example.com/").as_deref(), + Some("example.com") + ); + } + + #[test] + fn test_not_https() { + assert_eq!(extract_domain_for_ssltest("http://example.com/"), None); + } + + #[test] + fn test_invalid_urls() { + assert_eq!(extract_domain_for_ssltest(""), None); + assert_eq!(extract_domain_for_ssltest("!&?"), None); + assert_eq!(extract_domain_for_ssltest(" "), None); + assert_eq!(extract_domain_for_ssltest("..."), None); + assert_eq!(extract_domain_for_ssltest("\n"), None); + assert_eq!(extract_domain_for_ssltest("example.com"), None); + assert_eq!(extract_domain_for_ssltest("file:///example.com"), None); + } + } +} diff --git a/repology-webapp/templates/_macros/links.html b/repology-webapp/templates/_macros/links.html index eaaaac4..d98ef21 100644 --- a/repology-webapp/templates/_macros/links.html +++ b/repology-webapp/templates/_macros/links.html @@ -42,8 +42,10 @@ {%- if code == -205 -%} (related reading) {%- endif -%} - {%- if code >= -599 && code <= -500 -%}{# TODO: we only need netloc here #} - (check on SSL Labs) + {%- if code >= -599 && code <= -500 -%} + {%- if let Some(domain) = crate::template_funcs::extract_domain_for_ssltest(url) -%} + (check on SSL Labs) + {%- endif -%} {%- endif -%} {%- endmacro -%} diff --git a/repology-webapp/tests/integration_tests/link.rs b/repology-webapp/tests/integration_tests/link.rs index 601d567..de7cbcd 100644 --- a/repology-webapp/tests/integration_tests/link.rs +++ b/repology-webapp/tests/integration_tests/link.rs @@ -92,7 +92,6 @@ async fn test_ipv6_redirect(pool: PgPool) { ); } -#[ignore] #[sqlx::test(migrator = "repology_common::MIGRATOR", fixtures("link_data"))] async fn test_ssl_failure(pool: PgPool) { check_response!(