From fce0fa9c57c8e26731a640f71d1812fa09191818 Mon Sep 17 00:00:00 2001 From: CodeMan62 Date: Wed, 2 Apr 2025 00:19:50 +0530 Subject: [PATCH 1/4] Update network URL validation error message format to match expected pattern --- crates/meilisearch/src/routes/network.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/meilisearch/src/routes/network.rs b/crates/meilisearch/src/routes/network.rs index 458ae8cbf..16a1248ba 100644 --- a/crates/meilisearch/src/routes/network.rs +++ b/crates/meilisearch/src/routes/network.rs @@ -211,7 +211,15 @@ async fn patch_network( let merged = DbRemote { url: match new_url { - Setting::Set(new_url) => new_url, + Setting::Set(new_url) => { + if !new_url.starts_with("http://") && !new_url.starts_with("https://") { + return Err(ResponseError::from_msg( + format!("in .remotes.{key}.url: error from Url::parse"), + meilisearch_types::error::Code::InvalidNetworkUrl, + )); + } + new_url + }, Setting::Reset => { return Err(ResponseError::from_msg( format!( From c2ff4dd3b279131995ed701e7f0342194b8e00ce Mon Sep 17 00:00:00 2001 From: CodeMan62 Date: Wed, 2 Apr 2025 19:08:46 +0530 Subject: [PATCH 2/4] Apply cargo fmt changes --- crates/meilisearch/src/routes/network.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/meilisearch/src/routes/network.rs b/crates/meilisearch/src/routes/network.rs index 16a1248ba..95033312a 100644 --- a/crates/meilisearch/src/routes/network.rs +++ b/crates/meilisearch/src/routes/network.rs @@ -212,14 +212,16 @@ async fn patch_network( let merged = DbRemote { url: match new_url { Setting::Set(new_url) => { - if !new_url.starts_with("http://") && !new_url.starts_with("https://") { + if !new_url.starts_with("http://") + && !new_url.starts_with("https://") + { return Err(ResponseError::from_msg( format!("in .remotes.{key}.url: error from Url::parse"), meilisearch_types::error::Code::InvalidNetworkUrl, )); } new_url - }, + } Setting::Reset => { return Err(ResponseError::from_msg( format!( From 7ca2a8eb6f72894d18a150d9c3cd269c747cb3fd Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Thu, 3 Apr 2025 11:44:53 +0200 Subject: [PATCH 3/4] Use `url::Url::parse` to check the url --- crates/meilisearch/src/routes/network.rs | 26 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/crates/meilisearch/src/routes/network.rs b/crates/meilisearch/src/routes/network.rs index 95033312a..7e58df113 100644 --- a/crates/meilisearch/src/routes/network.rs +++ b/crates/meilisearch/src/routes/network.rs @@ -119,10 +119,22 @@ pub struct Network { impl Remote { pub fn try_into_db_node(self, name: &str) -> Result { Ok(DbRemote { - url: self.url.set().ok_or(ResponseError::from_msg( - format!("Missing field `.remotes.{name}.url`"), - meilisearch_types::error::Code::MissingNetworkUrl, - ))?, + url: self + .url + .set() + .ok_or(ResponseError::from_msg( + format!("Missing field `.remotes.{name}.url`"), + meilisearch_types::error::Code::MissingNetworkUrl, + )) + .and_then(|url| { + if let Err(error) = url::Url::parse(&url) { + return Err(ResponseError::from_msg( + format!("Invalid `.remotes.{name}.url` (`{url}`): {error}"), + meilisearch_types::error::Code::InvalidNetworkUrl, + )); + } + Ok(url) + })?, search_api_key: self.search_api_key.set(), }) } @@ -212,11 +224,9 @@ async fn patch_network( let merged = DbRemote { url: match new_url { Setting::Set(new_url) => { - if !new_url.starts_with("http://") - && !new_url.starts_with("https://") - { + if let Err(error) = url::Url::parse(&new_url) { return Err(ResponseError::from_msg( - format!("in .remotes.{key}.url: error from Url::parse"), + format!("Invalid `.remotes.{key}.url` (`{new_url}`): {error}"), meilisearch_types::error::Code::InvalidNetworkUrl, )); } From c4787760d3d183bddac2522e9daca8304155c899 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Thu, 3 Apr 2025 11:57:43 +0200 Subject: [PATCH 4/4] add test --- crates/meilisearch/tests/network/mod.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/meilisearch/tests/network/mod.rs b/crates/meilisearch/tests/network/mod.rs index 1c3661a06..60f73ed40 100644 --- a/crates/meilisearch/tests/network/mod.rs +++ b/crates/meilisearch/tests/network/mod.rs @@ -117,6 +117,25 @@ async fn errors_on_param() { } "###); + // remote with url not valid + let (response, code) = server + .set_network(json!({"remotes": { + "new": { + "url": "no-http-scheme" + } + }})) + .await; + + meili_snap::snapshot!(code, @"400 Bad Request"); + meili_snap::snapshot!(meili_snap::json_string!(response), @r###" + { + "message": "Invalid `.remotes.new.url` (`no-http-scheme`): relative URL without a base", + "code": "invalid_network_url", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#invalid_network_url" + } + "###); + // remote with non-existing param let (response, code) = server .set_network(json!({"remotes": {