From 707a0d56261d911a3089931809a2dee62592c426 Mon Sep 17 00:00:00 2001 From: fys <40801205+fengys1996@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:35:03 +0800 Subject: [PATCH] fix: urldecode when influxdb auth (#2831) * fix: add url decode when influxdb auth * chore: fmt toml --- Cargo.lock | 17 +++++++++-------- src/servers/Cargo.toml | 1 + src/servers/src/error.rs | 8 ++++++++ src/servers/src/http/authorize.rs | 6 ++++-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba35273b81..19e122bd18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3190,9 +3190,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -3875,9 +3875,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -5876,9 +5876,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -8277,6 +8277,7 @@ dependencies = [ "tonic-reflection", "tower", "tower-http", + "urlencoding", ] [[package]] @@ -10248,9 +10249,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", diff --git a/src/servers/Cargo.toml b/src/servers/Cargo.toml index 0ea4641cd5..4d4078c5d1 100644 --- a/src/servers/Cargo.toml +++ b/src/servers/Cargo.toml @@ -92,6 +92,7 @@ tonic-reflection = "0.10" tonic.workspace = true tower = { version = "0.4", features = ["full"] } tower-http = { version = "0.3", features = ["full"] } +urlencoding = "2.1" [target.'cfg(not(windows))'.dependencies] tikv-jemalloc-ctl = { version = "0.5", features = ["use_std"] } diff --git a/src/servers/src/error.rs b/src/servers/src/error.rs index be6b202859..e105b6885e 100644 --- a/src/servers/src/error.rs +++ b/src/servers/src/error.rs @@ -394,6 +394,13 @@ pub enum Error { error: serde_json::error::Error, location: Location, }, + + #[snafu(display("Failed to decode url"))] + UrlDecode { + #[snafu(source)] + error: FromUtf8Error, + location: Location, + }, } pub type Result = std::result::Result; @@ -444,6 +451,7 @@ impl ErrorExt for Error { | DataFrame { .. } | PreparedStmtTypeMismatch { .. } | TimePrecision { .. } + | UrlDecode { .. } | IncompatibleSchema { .. } => StatusCode::InvalidArguments, InfluxdbLinesWrite { source, .. } diff --git a/src/servers/src/http/authorize.rs b/src/servers/src/http/authorize.rs index e4217bb69e..9225b6ec52 100644 --- a/src/servers/src/http/authorize.rs +++ b/src/servers/src/http/authorize.rs @@ -35,7 +35,7 @@ use super::header::GreptimeDbName; use super::PUBLIC_APIS; use crate::error::{ self, InvalidAuthorizationHeaderSnafu, InvalidParameterSnafu, InvisibleASCIISnafu, - NotFoundInfluxAuthSnafu, Result, UnsupportedAuthSchemeSnafu, + NotFoundInfluxAuthSnafu, Result, UnsupportedAuthSchemeSnafu, UrlDecodeSnafu, }; use crate::http::HTTP_API_PREFIX; @@ -166,7 +166,9 @@ fn get_influxdb_credentials( return Ok(None); }; - match extract_influxdb_user_from_query(query_str) { + let query_str = urlencoding::decode(query_str).context(UrlDecodeSnafu)?; + + match extract_influxdb_user_from_query(&query_str) { (None, None) => Ok(None), (Some(username), Some(password)) => { Ok(Some((username.to_string(), password.to_string().into())))