mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2025-06-14 18:26:36 +00:00
fix: return username to store in sessions when getting password
This commit is contained in:
parent
d9b36179d1
commit
5bcf7beddc
@ -89,6 +89,15 @@ pub enum Login<'a> {
|
|||||||
Email(&'a str),
|
Email(&'a str),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
||||||
|
/// type encapsulating username and hashed password of a user
|
||||||
|
pub struct NameHash {
|
||||||
|
/// username
|
||||||
|
pub username: String,
|
||||||
|
/// hashed password
|
||||||
|
pub hash: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
/// mCaptcha's database requirements. To implement support for $Database, kindly implement this
|
/// mCaptcha's database requirements. To implement support for $Database, kindly implement this
|
||||||
/// trait.
|
/// trait.
|
||||||
@ -112,7 +121,7 @@ pub trait MCDatabase: std::marker::Send + std::marker::Sync + CloneSPDatabase {
|
|||||||
async fn update_email(&self, p: &UpdateEmail) -> DBResult<()>;
|
async fn update_email(&self, p: &UpdateEmail) -> DBResult<()>;
|
||||||
|
|
||||||
/// get a user's password
|
/// get a user's password
|
||||||
async fn get_password(&self, l: &Login) -> DBResult<String>;
|
async fn get_password(&self, l: &Login) -> DBResult<NameHash>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait to clone MCDatabase
|
/// Trait to clone MCDatabase
|
||||||
|
@ -29,20 +29,23 @@ pub async fn database_works<'a, T: MCDatabase>(db: &T, p: &Register<'a>) {
|
|||||||
}
|
}
|
||||||
db.register(p).await.unwrap();
|
db.register(p).await.unwrap();
|
||||||
|
|
||||||
assert_eq!(
|
// testing get_password
|
||||||
db.get_password(&Login::Username(p.username)).await.unwrap(),
|
|
||||||
p.hash,
|
|
||||||
"user password matches"
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_eq!(
|
// with username
|
||||||
db.get_password(&Login::Email(p.email.as_ref().unwrap()))
|
let name_hash = db.get_password(&Login::Username(p.username)).await.unwrap();
|
||||||
.await
|
assert_eq!(name_hash.hash, p.hash, "user password matches");
|
||||||
.unwrap(),
|
|
||||||
p.hash,
|
|
||||||
"user password matches"
|
|
||||||
);
|
|
||||||
|
|
||||||
|
assert_eq!(name_hash.username, p.username, "username matches");
|
||||||
|
|
||||||
|
// with email
|
||||||
|
let name_hash = db
|
||||||
|
.get_password(&Login::Email(p.email.as_ref().unwrap()))
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(name_hash.hash, p.hash, "user password matches");
|
||||||
|
assert_eq!(name_hash.username, p.username, "username matches");
|
||||||
|
|
||||||
|
// testing email exists
|
||||||
assert!(
|
assert!(
|
||||||
db.email_exists(p.email.as_ref().unwrap()).await.unwrap(),
|
db.email_exists(p.email.as_ref().unwrap()).await.unwrap(),
|
||||||
"user is registered so email should exsit"
|
"user is registered so email should exsit"
|
||||||
@ -70,11 +73,11 @@ pub async fn database_works<'a, T: MCDatabase>(db: &T, p: &Register<'a>) {
|
|||||||
"user registration with email is deleted; so email shouldn't exsit"
|
"user registration with email is deleted; so email shouldn't exsit"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// testing update email
|
||||||
let update_email = UpdateEmail {
|
let update_email = UpdateEmail {
|
||||||
username: p.username,
|
username: p.username,
|
||||||
new_email: p.email.as_ref().unwrap(),
|
new_email: p.email.as_ref().unwrap(),
|
||||||
};
|
};
|
||||||
|
|
||||||
db.update_email(&update_email).await.unwrap();
|
db.update_email(&update_email).await.unwrap();
|
||||||
println!(
|
println!(
|
||||||
"null user email: {}",
|
"null user email: {}",
|
||||||
|
@ -189,15 +189,16 @@ impl MCDatabase for Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// get a user's password
|
/// get a user's password
|
||||||
async fn get_password(&self, l: &Login) -> DBResult<String> {
|
async fn get_password(&self, l: &Login) -> DBResult<NameHash> {
|
||||||
struct Password {
|
struct Password {
|
||||||
|
name: String,
|
||||||
password: String,
|
password: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
let rec = match l {
|
let rec = match l {
|
||||||
Login::Username(u) => sqlx::query_as!(
|
Login::Username(u) => sqlx::query_as!(
|
||||||
Password,
|
Password,
|
||||||
r#"SELECT password FROM mcaptcha_users WHERE name = ($1)"#,
|
r#"SELECT name, password FROM mcaptcha_users WHERE name = ($1)"#,
|
||||||
u,
|
u,
|
||||||
)
|
)
|
||||||
.fetch_one(&self.pool)
|
.fetch_one(&self.pool)
|
||||||
@ -206,7 +207,7 @@ impl MCDatabase for Database {
|
|||||||
|
|
||||||
Login::Email(e) => sqlx::query_as!(
|
Login::Email(e) => sqlx::query_as!(
|
||||||
Password,
|
Password,
|
||||||
r#"SELECT password FROM mcaptcha_users WHERE email = ($1)"#,
|
r#"SELECT name, password FROM mcaptcha_users WHERE email = ($1)"#,
|
||||||
e,
|
e,
|
||||||
)
|
)
|
||||||
.fetch_one(&self.pool)
|
.fetch_one(&self.pool)
|
||||||
@ -214,7 +215,12 @@ impl MCDatabase for Database {
|
|||||||
.map_err(map_register_err)?,
|
.map_err(map_register_err)?,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(rec.password)
|
let res = NameHash {
|
||||||
|
hash: rec.password,
|
||||||
|
username: rec.name,
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user