]> Untitled Git - lemmy.git/blob - crates/api/src/lib.rs
Remove chatserver (#2919)
[lemmy.git] / crates / api / src / lib.rs
1 use actix_web::web::Data;
2 use lemmy_api_common::{context::LemmyContext, utils::local_site_to_slur_regex};
3 use lemmy_db_schema::source::local_site::LocalSite;
4 use lemmy_utils::{error::LemmyError, utils::slurs::check_slurs};
5
6 mod comment;
7 mod comment_report;
8 mod community;
9 mod local_user;
10 mod post;
11 mod post_report;
12 mod private_message;
13 mod private_message_report;
14 mod site;
15
16 #[async_trait::async_trait(?Send)]
17 pub trait Perform {
18   type Response: serde::ser::Serialize + Send;
19
20   async fn perform(&self, context: &Data<LemmyContext>) -> Result<Self::Response, LemmyError>;
21 }
22
23 /// Check size of report and remove whitespace
24 pub(crate) fn check_report_reason(reason: &str, local_site: &LocalSite) -> Result<(), LemmyError> {
25   let slur_regex = &local_site_to_slur_regex(local_site);
26
27   check_slurs(reason, slur_regex)?;
28   if reason.is_empty() {
29     return Err(LemmyError::from_message("report_reason_required"));
30   }
31   if reason.chars().count() > 1000 {
32     return Err(LemmyError::from_message("report_too_long"));
33   }
34   Ok(())
35 }
36
37 #[cfg(test)]
38 mod tests {
39   use lemmy_api_common::utils::check_validator_time;
40   use lemmy_db_schema::{
41     source::{
42       instance::Instance,
43       local_user::{LocalUser, LocalUserInsertForm},
44       person::{Person, PersonInsertForm},
45       secret::Secret,
46     },
47     traits::Crud,
48     utils::build_db_pool_for_tests,
49   };
50   use lemmy_utils::{claims::Claims, settings::SETTINGS};
51   use serial_test::serial;
52
53   #[tokio::test]
54   #[serial]
55   async fn test_should_not_validate_user_token_after_password_change() {
56     let pool = &build_db_pool_for_tests().await;
57     let secret = Secret::init(pool).await.unwrap();
58     let settings = &SETTINGS.to_owned();
59
60     let inserted_instance = Instance::read_or_create(pool, "my_domain.tld".to_string())
61       .await
62       .unwrap();
63
64     let new_person = PersonInsertForm::builder()
65       .name("Gerry9812".into())
66       .public_key("pubkey".to_string())
67       .instance_id(inserted_instance.id)
68       .build();
69
70     let inserted_person = Person::create(pool, &new_person).await.unwrap();
71
72     let local_user_form = LocalUserInsertForm::builder()
73       .person_id(inserted_person.id)
74       .password_encrypted("123456".to_string())
75       .build();
76
77     let inserted_local_user = LocalUser::create(pool, &local_user_form).await.unwrap();
78
79     let jwt = Claims::jwt(
80       inserted_local_user.id.0,
81       &secret.jwt_secret,
82       &settings.hostname,
83     )
84     .unwrap();
85     let claims = Claims::decode(&jwt, &secret.jwt_secret).unwrap().claims;
86     let check = check_validator_time(&inserted_local_user.validator_time, &claims);
87     assert!(check.is_ok());
88
89     // The check should fail, since the validator time is now newer than the jwt issue time
90     let updated_local_user =
91       LocalUser::update_password(pool, inserted_local_user.id, "password111")
92         .await
93         .unwrap();
94     let check_after = check_validator_time(&updated_local_user.validator_time, &claims);
95     assert!(check_after.is_err());
96
97     let num_deleted = Person::delete(pool, inserted_person.id).await.unwrap();
98     assert_eq!(1, num_deleted);
99   }
100 }