3 schema::password_reset_request::dsl::*,
4 source::password_reset_request::*,
7 use diesel::{dsl::*, result::Error, PgConnection, *};
8 use sha2::{Digest, Sha256};
10 impl Crud for PasswordResetRequest {
11 type Form = PasswordResetRequestForm;
13 fn read(conn: &mut PgConnection, password_reset_request_id: i32) -> Result<Self, Error> {
14 password_reset_request
15 .find(password_reset_request_id)
18 fn create(conn: &mut PgConnection, form: &PasswordResetRequestForm) -> Result<Self, Error> {
19 insert_into(password_reset_request)
21 .get_result::<Self>(conn)
24 conn: &mut PgConnection,
25 password_reset_request_id: i32,
26 form: &PasswordResetRequestForm,
27 ) -> Result<Self, Error> {
28 diesel::update(password_reset_request.find(password_reset_request_id))
30 .get_result::<Self>(conn)
34 impl PasswordResetRequest {
36 conn: &mut PgConnection,
37 from_local_user_id: LocalUserId,
39 ) -> Result<PasswordResetRequest, Error> {
40 let mut hasher = Sha256::new();
42 let token_hash: String = bytes_to_hex(hasher.finalize().to_vec());
44 let form = PasswordResetRequestForm {
45 local_user_id: from_local_user_id,
46 token_encrypted: token_hash,
49 Self::create(conn, &form)
51 pub fn read_from_token(
52 conn: &mut PgConnection,
54 ) -> Result<PasswordResetRequest, Error> {
55 let mut hasher = Sha256::new();
57 let token_hash: String = bytes_to_hex(hasher.finalize().to_vec());
58 password_reset_request
59 .filter(token_encrypted.eq(token_hash))
60 .filter(published.gt(now - 1.days()))
65 fn bytes_to_hex(bytes: Vec<u8>) -> String {
66 let mut str = String::new();
68 str = format!("{}{:02x}", str, byte);
77 local_user::{LocalUser, LocalUserForm},
78 password_reset_request::PasswordResetRequest,
82 utils::establish_unpooled_connection,
84 use serial_test::serial;
89 let conn = &mut establish_unpooled_connection();
91 let new_person = PersonForm {
92 name: "thommy prw".into(),
93 public_key: Some("pubkey".to_string()),
94 ..PersonForm::default()
97 let inserted_person = Person::create(conn, &new_person).unwrap();
99 let new_local_user = LocalUserForm {
100 person_id: Some(inserted_person.id),
101 password_encrypted: Some("pass".to_string()),
102 ..LocalUserForm::default()
105 let inserted_local_user = LocalUser::create(conn, &new_local_user).unwrap();
108 let token_encrypted_ = "ca3704aa0b06f5954c79ee837faa152d84d6b2d42838f0637a15eda8337dbdce";
110 let inserted_password_reset_request =
111 PasswordResetRequest::create_token(conn, inserted_local_user.id, token).unwrap();
113 let expected_password_reset_request = PasswordResetRequest {
114 id: inserted_password_reset_request.id,
115 local_user_id: inserted_local_user.id,
116 token_encrypted: token_encrypted_.to_string(),
117 published: inserted_password_reset_request.published,
120 let read_password_reset_request = PasswordResetRequest::read_from_token(conn, token).unwrap();
121 let num_deleted = Person::delete(conn, inserted_person.id).unwrap();
123 assert_eq!(expected_password_reset_request, read_password_reset_request);
125 expected_password_reset_request,
126 inserted_password_reset_request
128 assert_eq!(1, num_deleted);