mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-27 14:51:18 +00:00
1d38aad9d3
* a lot * merge * Fix stuff broken by merge * Get rid of repetitive `&mut *context.conn().await?` * Add blank lines under each line with `conn =` * Fix style mistakes (partial) * Revert "Fix style mistakes (partial)" This reverts commit48a033b87f
. * Revert "Add blank lines under each line with `conn =`" This reverts commit773a6d3beb
. * Revert "Get rid of repetitive `&mut *context.conn().await?`" This reverts commitd2c6263ea1
. * Use DbConn for CaptchaAnswer methods * DbConn trait * Remove more `&mut *` * Fix stuff * Re-run CI * try to make ci start * fix * fix * Fix api_common::utils * Fix apub::activities::block * Fix apub::api::resolve_object * Fix some things * Revert "Fix some things" This reverts commit2bf8574bc8
. * Revert "Fix apub::api::resolve_object" This reverts commit3e4059aabb
. * Revert "Fix apub::activities::block" This reverts commit3b02389abd
. * Revert "Fix api_common::utils" This reverts commit7dc73de613
. * Revert "Revert "Fix api_common::utils"" This reverts commitf740f115e5
. * Revert "Revert "Fix apub::activities::block"" This reverts commit2ee206af7c
. * Revert "Revert "Fix apub::api::resolve_object"" This reverts commit96ed8bf2e9
. * Fix fetch_local_site_data * Fix get_comment_parent_creator * Remove unused perma deleted text * Fix routes::feeds * Fix lib.rs * Update lib.rs * rerun ci * Attempt to create custom GetConn and RunQueryDsl traits * Start over * Add GetConn trait * aaaa * Revert "aaaa" This reverts commitacc9ca1aed
. * Revert "Revert "aaaa"" This reverts commit443a2a00a5
. * still aaaaaaaaaaaaa * Return to earlier thing Revert "Add GetConn trait" This reverts commitab4e94aea5
. * Try to use DbPool enum * Revert "Try to use DbPool enum" This reverts commite4d1712646
. * DbConn and DbPool enums (db_schema only fails to compile for tests) * fmt * Make functions take `&mut DbPool<'_>` and make db_schema tests compile * Add try_join_with_pool macro and run fix-clippy on more crates * Fix some errors * I did it * Remove function variants that take connection * rerun ci * rerun ci * rerun ci
141 lines
4.3 KiB
Rust
141 lines
4.3 KiB
Rust
use actix_web::web::Data;
|
|
use base64::{engine::general_purpose::STANDARD_NO_PAD as base64, Engine};
|
|
use captcha::Captcha;
|
|
use lemmy_api_common::{context::LemmyContext, utils::local_site_to_slur_regex};
|
|
use lemmy_db_schema::source::local_site::LocalSite;
|
|
use lemmy_utils::{
|
|
error::{LemmyError, LemmyErrorExt, LemmyErrorType},
|
|
utils::slurs::check_slurs,
|
|
};
|
|
use std::io::Cursor;
|
|
|
|
mod comment;
|
|
mod comment_report;
|
|
mod community;
|
|
mod local_user;
|
|
mod post;
|
|
mod post_report;
|
|
mod private_message;
|
|
mod private_message_report;
|
|
mod site;
|
|
|
|
#[async_trait::async_trait(?Send)]
|
|
pub trait Perform {
|
|
type Response: serde::ser::Serialize + Send + Clone + Sync;
|
|
|
|
async fn perform(&self, context: &Data<LemmyContext>) -> Result<Self::Response, LemmyError>;
|
|
}
|
|
|
|
/// Converts the captcha to a base64 encoded wav audio file
|
|
pub(crate) fn captcha_as_wav_base64(captcha: &Captcha) -> Result<String, LemmyError> {
|
|
let letters = captcha.as_wav();
|
|
|
|
// Decode each wav file, concatenate the samples
|
|
let mut concat_samples: Vec<i16> = Vec::new();
|
|
let mut any_header: Option<wav::Header> = None;
|
|
for letter in letters {
|
|
let mut cursor = Cursor::new(letter.unwrap_or_default());
|
|
let (header, samples) = wav::read(&mut cursor)?;
|
|
any_header = Some(header);
|
|
if let Some(samples16) = samples.as_sixteen() {
|
|
concat_samples.extend(samples16);
|
|
} else {
|
|
return Err(LemmyErrorType::CouldntCreateAudioCaptcha)?;
|
|
}
|
|
}
|
|
|
|
// Encode the concatenated result as a wav file
|
|
let mut output_buffer = Cursor::new(vec![]);
|
|
let header = match any_header {
|
|
Some(header) => header,
|
|
None => return Err(LemmyErrorType::CouldntCreateAudioCaptcha)?,
|
|
};
|
|
wav::write(
|
|
header,
|
|
&wav::BitDepth::Sixteen(concat_samples),
|
|
&mut output_buffer,
|
|
)
|
|
.with_lemmy_type(LemmyErrorType::CouldntCreateAudioCaptcha)?;
|
|
|
|
Ok(base64.encode(output_buffer.into_inner()))
|
|
}
|
|
|
|
/// Check size of report and remove whitespace
|
|
pub(crate) fn check_report_reason(reason: &str, local_site: &LocalSite) -> Result<(), LemmyError> {
|
|
let slur_regex = &local_site_to_slur_regex(local_site);
|
|
|
|
check_slurs(reason, slur_regex)?;
|
|
if reason.is_empty() {
|
|
return Err(LemmyErrorType::ReportReasonRequired)?;
|
|
}
|
|
if reason.chars().count() > 1000 {
|
|
return Err(LemmyErrorType::ReportTooLong)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use lemmy_api_common::utils::check_validator_time;
|
|
use lemmy_db_schema::{
|
|
source::{
|
|
instance::Instance,
|
|
local_user::{LocalUser, LocalUserInsertForm},
|
|
person::{Person, PersonInsertForm},
|
|
secret::Secret,
|
|
},
|
|
traits::Crud,
|
|
utils::build_db_pool_for_tests,
|
|
};
|
|
use lemmy_utils::{claims::Claims, settings::SETTINGS};
|
|
use serial_test::serial;
|
|
|
|
#[tokio::test]
|
|
#[serial]
|
|
async fn test_should_not_validate_user_token_after_password_change() {
|
|
let pool = &build_db_pool_for_tests().await;
|
|
let pool = &mut pool.into();
|
|
let secret = Secret::init(pool).await.unwrap();
|
|
let settings = &SETTINGS.to_owned();
|
|
|
|
let inserted_instance = Instance::read_or_create(pool, "my_domain.tld".to_string())
|
|
.await
|
|
.unwrap();
|
|
|
|
let new_person = PersonInsertForm::builder()
|
|
.name("Gerry9812".into())
|
|
.public_key("pubkey".to_string())
|
|
.instance_id(inserted_instance.id)
|
|
.build();
|
|
|
|
let inserted_person = Person::create(pool, &new_person).await.unwrap();
|
|
|
|
let local_user_form = LocalUserInsertForm::builder()
|
|
.person_id(inserted_person.id)
|
|
.password_encrypted("123456".to_string())
|
|
.build();
|
|
|
|
let inserted_local_user = LocalUser::create(pool, &local_user_form).await.unwrap();
|
|
|
|
let jwt = Claims::jwt(
|
|
inserted_local_user.id.0,
|
|
&secret.jwt_secret,
|
|
&settings.hostname,
|
|
)
|
|
.unwrap();
|
|
let claims = Claims::decode(&jwt, &secret.jwt_secret).unwrap().claims;
|
|
let check = check_validator_time(&inserted_local_user.validator_time, &claims);
|
|
assert!(check.is_ok());
|
|
|
|
// The check should fail, since the validator time is now newer than the jwt issue time
|
|
let updated_local_user =
|
|
LocalUser::update_password(pool, inserted_local_user.id, "password111")
|
|
.await
|
|
.unwrap();
|
|
let check_after = check_validator_time(&updated_local_user.validator_time, &claims);
|
|
assert!(check_after.is_err());
|
|
|
|
let num_deleted = Person::delete(pool, inserted_person.id).await.unwrap();
|
|
assert_eq!(1, num_deleted);
|
|
}
|
|
}
|