Skip to content
Snippets Groups Projects
captcha.rs 1.23 KiB
Newer Older
insert's avatar
insert committed
use reqwest::blocking::Client;
use serde::{Deserialize, Serialize};
insert's avatar
insert committed
use std::collections::HashMap;
use std::env;

#[derive(Serialize, Deserialize)]
struct CaptchaResponse {
    success: bool,
insert's avatar
insert committed
}

pub fn verify(user_token: &Option<String>) -> Result<(), String> {
    if let Ok(key) = env::var("HCAPTCHA_KEY") {
        if let Some(token) = user_token {
            let mut map = HashMap::new();
            map.insert("secret", key);
            map.insert("response", token.to_string());

            let client = Client::new();
            if let Ok(response) = client
                .post("https://hcaptcha.com/siteverify")
insert's avatar
insert committed
                .form(&map)
insert's avatar
insert committed
                .send()
            {
                let result: CaptchaResponse = response
                    .json()
                    .map_err(|_| "Failed to deserialise captcha result.".to_string())?;

                if result.success {
                    Ok(())
                } else {
                    Err("Unsuccessful captcha verification".to_string())
                }
            } else {
                Err("Failed to verify with hCaptcha".to_string())
            }
        } else {
            Err("Missing hCaptcha token!".to_string())
        }
    } else {
        Ok(())
    }
}