]> Untitled Git - lemmy.git/commitdiff
Adding more rust captcha features. Fixes #1248
authorDessalines <tyhou13@gmx.com>
Thu, 1 Apr 2021 17:30:24 +0000 (13:30 -0400)
committerDessalines <tyhou13@gmx.com>
Thu, 1 Apr 2021 17:30:24 +0000 (13:30 -0400)
crates/api/src/lib.rs
crates/api/src/local_user.rs
crates/api_common/src/person.rs
docker/dev/Dockerfile
docker/dev/volume_mount.dockerfile
docker/prod/Dockerfile
docker/prod/Dockerfile.arm

index 5dc678be66d7ff0ce3aa6f9236fefba23050843a..c9de749ef36e9a9999392b99738b3b57cc912372 100644 (file)
@@ -1,9 +1,9 @@
 use actix_web::{web, web::Data};
+use captcha::Captcha;
 use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*, websocket::*};
 use lemmy_utils::{ConnectionId, LemmyError};
 use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperation};
 use serde::Deserialize;
-use std::{env, process::Command};
 
 mod comment;
 mod comment_report;
@@ -158,60 +158,23 @@ where
   serialize_websocket_message(&op, &res)
 }
 
-pub(crate) fn captcha_espeak_wav_base64(captcha: &str) -> Result<String, LemmyError> {
-  let mut built_text = String::new();
+/// Converts the captcha to a base64 encoded wav audio file
+pub(crate) fn captcha_as_wav_base64(captcha: &Captcha) -> String {
+  let letters = captcha.as_wav();
 
-  // Building proper speech text for espeak
-  for mut c in captcha.chars() {
-    let new_str = if c.is_alphabetic() {
-      if c.is_lowercase() {
-        c.make_ascii_uppercase();
-        format!("lower case {} ... ", c)
-      } else {
-        c.make_ascii_uppercase();
-        format!("capital {} ... ", c)
-      }
-    } else {
-      format!("{} ...", c)
-    };
+  let mut concat_letters: Vec<u8> = Vec::new();
 
-    built_text.push_str(&new_str);
+  for letter in letters {
+    let bytes = letter.unwrap_or_default();
+    concat_letters.extend(bytes);
   }
 
-  espeak_wav_base64(&built_text)
-}
-
-pub(crate) fn espeak_wav_base64(text: &str) -> Result<String, LemmyError> {
-  // Make a temp file path
-  let uuid = uuid::Uuid::new_v4().to_string();
-  let file_path = format!(
-    "{}/lemmy_espeak_{}.wav",
-    env::temp_dir().to_string_lossy(),
-    &uuid
-  );
-
-  // Write the wav file
-  Command::new("espeak")
-    .arg("-w")
-    .arg(&file_path)
-    .arg(text)
-    .status()?;
-
-  // Read the wav file bytes
-  let bytes = std::fs::read(&file_path)?;
-
-  // Delete the file
-  std::fs::remove_file(file_path)?;
-
   // Convert to base64
-  let base64 = base64::encode(bytes);
-
-  Ok(base64)
+  base64::encode(concat_letters)
 }
 
 #[cfg(test)]
 mod tests {
-  use crate::captcha_espeak_wav_base64;
   use lemmy_api_common::check_validator_time;
   use lemmy_db_queries::{establish_unpooled_connection, source::local_user::LocalUser_, Crud};
   use lemmy_db_schema::source::{
@@ -253,9 +216,4 @@ mod tests {
     let num_deleted = Person::delete(&conn, inserted_person.id).unwrap();
     assert_eq!(1, num_deleted);
   }
-
-  #[test]
-  fn test_espeak() {
-    assert!(captcha_espeak_wav_base64("WxRt2l").is_ok())
-  }
 }
index 656ddf9719fec29b859659f04cae6be112228143..831e38a17de8af0b56056f5ddaeb63c919262153 100644 (file)
@@ -1,4 +1,4 @@
-use crate::{captcha_espeak_wav_base64, Perform};
+use crate::{captcha_as_wav_base64, Perform};
 use actix_web::web::Data;
 use anyhow::Context;
 use bcrypt::verify;
@@ -135,13 +135,11 @@ impl Perform for GetCaptcha {
 
     let answer = captcha.chars_as_string();
 
-    let png_byte_array = captcha.as_png().expect("failed to generate captcha");
-
-    let png = base64::encode(png_byte_array);
+    let png = captcha.as_base64().expect("failed to generate captcha");
 
     let uuid = uuid::Uuid::new_v4().to_string();
 
-    let wav = captcha_espeak_wav_base64(&answer).ok();
+    let wav = captcha_as_wav_base64(&captcha);
 
     let captcha_item = CaptchaItem {
       answer,
index 7767da460d82e118f7b21c51774eb0fcf6e2aad9..7b732412c8275bedff68f396ca411628ae3fa4cf 100644 (file)
@@ -39,8 +39,8 @@ pub struct GetCaptchaResponse {
 
 #[derive(Serialize)]
 pub struct CaptchaResponse {
-  pub png: String,         // A Base64 encoded png
-  pub wav: Option<String>, // A Base64 encoded wav audio
+  pub png: String, // A Base64 encoded png
+  pub wav: String, // A Base64 encoded wav audio
   pub uuid: String,
 }
 
index 954c85c84bfa531a874ab2b2754455a4afbf5173..5d2acec7faf9a1192de816c803ad5307cd668e1c 100644 (file)
@@ -49,9 +49,6 @@ FROM alpine:3.12 as lemmy
 # Install libpq for postgres
 RUN apk add libpq
 
-# Install Espeak for captchas
-RUN apk add espeak
-
 RUN addgroup -g 1000 lemmy
 RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
 
index 0cb036247186a2a9d86750bd10a19dd3dfbcb0b5..d848e0ea6cf7e08eccd1de8c1108add9fa049f89 100644 (file)
@@ -19,9 +19,9 @@ RUN --mount=type=cache,target=/app/target \
 
 FROM ubuntu:20.10
 
-# Install libpq for postgres and espeak
+# Install libpq for postgres
 RUN apt-get update -y
-RUN apt-get install -y libpq-dev espeak 
+RUN apt-get install -y libpq-dev
 
 # Copy resources
 COPY config/defaults.hjson /config/defaults.hjson
index 2ad601aec1d3dab663b58c864248aafa79cf71fb..88a05fb269acc89fb7bf55933be625e833a1b88f 100644 (file)
@@ -49,9 +49,6 @@ FROM alpine:3.12 as lemmy
 # Install libpq for postgres
 RUN apk add libpq
 
-# Install Espeak for captchas
-RUN apk add espeak
-
 RUN addgroup -g 1000 lemmy
 RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy
 
index 61d1f86c9c2bbc6695c3e90675231ee31a669353..b3eacb4f9f41ea6d29eb5849dc019747ede67dfe 100644 (file)
@@ -22,9 +22,9 @@ RUN cp ./target/release/lemmy_server /app/lemmy_server
 # The Debian runner
 FROM debian:buster-slim as lemmy
 
-# Install libpq for postgres and espeak for captchas
+# Install libpq for postgres
 RUN apt-get update \
- && apt-get -y install --no-install-recommends espeak postgresql-client libc6 libssl1.1 \
+ && apt-get -y install --no-install-recommends postgresql-client libc6 libssl1.1 \
  && rm -rf /var/lib/apt/lists/*
 
 RUN addgroup --gid 1000 lemmy