From 5f09ef225ddca19e1a1b1aefe5928d9a2e4b2732 Mon Sep 17 00:00:00 2001 From: "whitesource-bolt-for-github[bot]" <42819689+whitesource-bolt-for-github[bot]@users.noreply.github.com> Date: Thu, 4 Nov 2021 15:55:37 +0000 Subject: [PATCH 1/3] Add .whitesource configuration file --- .whitesource | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .whitesource diff --git a/.whitesource b/.whitesource new file mode 100644 index 0000000..55b922e --- /dev/null +++ b/.whitesource @@ -0,0 +1,12 @@ +{ + "scanSettings": { + "baseBranches": [] + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "failure", + "displayMode": "diff" + }, + "issueSettings": { + "minSeverityLevel": "LOW" + } +} \ No newline at end of file From 8bcb4ee2aaf21537ae6cf6c488da2e8a25fcfefb Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 28 Dec 2023 11:39:13 +0000 Subject: [PATCH 2/3] fix: Edition and dependency updates --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f44d109..a6db29e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ authors = ["panicbit "] license = "MIT" keywords = ["recaptcha", "captcha"] repository = "https://github.com/panicbit/recaptcha-rs" -edition = "2018" +edition = "2021" [features] @@ -14,11 +14,11 @@ default = ["reqwest/default-tls"] rustls-tls = ["reqwest/rustls-tls"] [dependencies] -reqwest = { version = "0.10.4", features = ["json"], default-features = false } +reqwest = { version = "0.11.23", features = ["json"], default-features = false } serde_derive = "1.0.106" serde = "1.0.106" failure = "0.1.7" [dev-dependencies] serde_json = "1.0.50" -tokio = { version = "0.2.15", features = ["macros"] } +tokio = { version = "1.35.1", features = ["macros"] } From 4b02a6c6b3b2c428489e319f6240b73eff3fdbb9 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Thu, 28 Dec 2023 12:21:31 +0000 Subject: [PATCH 3/3] fix: Update crate handling, remove failure - Remove extern crate and macro_use as no longer required. - add use for serde_derive in response . - replace failure crate with thiserror (failure no longer maintained) - Update error handling to use thiserror --- Cargo.toml | 2 +- src/error.rs | 50 ++++++++++++++++++++++++++----------------------- src/lib.rs | 17 ++++------------- src/response.rs | 9 +++++---- 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a6db29e..6a938cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ rustls-tls = ["reqwest/rustls-tls"] reqwest = { version = "0.11.23", features = ["json"], default-features = false } serde_derive = "1.0.106" serde = "1.0.106" -failure = "0.1.7" +thiserror = "1.0.52" [dev-dependencies] serde_json = "1.0.50" diff --git a/src/error.rs b/src/error.rs index 96557b4..7479162 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,28 +1,17 @@ -use std::collections::HashSet; -use std::io; -use serde::{Deserializer, Deserialize}; use reqwest; +use serde::{Deserialize, Deserializer}; +use std::collections::HashSet; +use std::{fmt, io}; +use thiserror::Error; -#[derive(Fail, Debug)] +#[derive(Error, Debug)] pub enum Error { - #[fail(display = "{:?}", _0)] + #[error("{0:?}")] Codes(HashSet), - #[fail(display = "{}", _0)] - Reqwest(#[cause] reqwest::Error), - #[fail(display = "{}", _0)] - Io(#[cause] io::Error), -} - -impl From for Error { - fn from(err: reqwest::Error) -> Error { - Error::Reqwest(err) - } -} - -impl From for Error { - fn from(err: io::Error) -> Error { - Error::Io(err) - } + #[error("{0:?}")] + Reqwest(#[from] reqwest::Error), + #[error("{0:?}")] + Io(#[from] io::Error), } #[derive(PartialEq, Eq, Hash, Debug)] @@ -33,13 +22,28 @@ pub enum Code { InvalidResponse, BadRequest, TimeoutOrDuplicate, - Unknown(String) + Unknown(String), +} + +impl fmt::Display for Code { + #[allow(unused_variables)] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Code::BadRequest => write!(f, "bad-request"), + Code::InvalidResponse => write!(f, "invalid-input-secret"), + Code::InvalidSecret => write!(f, "invalid-input-secret"), + Code::MissingResponse => write!(f, "missing-input-response"), + Code::MissingSecret => write!(f, "missing-input-secret"), + Code::TimeoutOrDuplicate => write!(f, "timeout-or-duplicate"), + Code::Unknown(s) => write!(f, "unknown code: {}", s), + } + } } impl<'de> Deserialize<'de> for Code { fn deserialize(de: D) -> Result where - D: Deserializer<'de> + D: Deserializer<'de>, { let code = String::deserialize(de)?; Ok(match &*code { diff --git a/src/lib.rs b/src/lib.rs index 19c19a2..4d5ec23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,3 @@ -extern crate reqwest; -extern crate serde; -#[macro_use] extern crate serde_derive; -#[macro_use] extern crate failure; - pub mod error; mod response; @@ -14,18 +9,14 @@ use reqwest::Url; use response::RecaptchaResponse; pub use error::Error; - - /// Verify a recaptcha user response pub async fn verify(key: &str, response: &str, user_ip: Option<&IpAddr>) -> Result<(), Error> { let user_ip = user_ip.map(ToString::to_string); let mut url = Url::parse("https://www.google.com/recaptcha/api/siteverify").unwrap(); - url.query_pairs_mut().extend_pairs(&[ - ("secret", key), - ("response", response), - ]); + url.query_pairs_mut() + .extend_pairs(&[("secret", key), ("response", response)]); if let Some(user_ip) = user_ip { url.query_pairs_mut().append_pair("remoteip", &user_ip); @@ -37,7 +28,7 @@ pub async fn verify(key: &str, response: &str, user_ip: Option<&IpAddr>) -> Resu match (recaptcha_response.success, recaptcha_response.error_codes) { (true, _) => Ok(()), (false, Some(errors)) => Err(Error::Codes(errors)), - (false, _) => Err(Error::Codes(HashSet::new())) + (false, _) => Err(Error::Codes(HashSet::new())), } } @@ -47,8 +38,8 @@ mod tests { #[tokio::test] async fn test_invalid_secret_missing_response() { - use error::Error::*; use error::Code::*; + use error::Error::*; let response = verify("", "", None).await; match response { diff --git a/src/response.rs b/src/response.rs index 11d0a98..f831e98 100644 --- a/src/response.rs +++ b/src/response.rs @@ -1,11 +1,12 @@ -use std::collections::HashSet; use crate::error::Code; +use serde_derive::Deserialize; +use std::collections::HashSet; #[derive(Debug, Deserialize)] pub struct RecaptchaResponse { pub success: bool, - #[serde(rename="error-codes")] - pub error_codes: Option> + #[serde(rename = "error-codes")] + pub error_codes: Option>, } #[cfg(test)] @@ -14,8 +15,8 @@ mod tests { #[test] fn decoding_test() { - use serde_json::json; use crate::error::Code::*; + use serde_json::json; let response = json!({ "success": true,