users: set archive status, totp_login_request: use all for user

This commit is contained in:
Philippe Loctaux 2023-05-03 21:47:57 +02:00
parent 4bfc8a517f
commit f82c6368e3
10 changed files with 133 additions and 52 deletions

View file

@ -52,9 +52,9 @@ impl AuthorizationCode {
} }
pub async fn use_all_for_user( pub async fn use_all_for_user(
&self,
conn: impl SqliteExecutor<'_>, conn: impl SqliteExecutor<'_>,
user: &UserID,
) -> Result<Option<()>, Error> { ) -> Result<Option<()>, Error> {
Ok(DatabaseAuthorizationCodes::use_all_for_user(conn, self.user.as_ref()).await?) Ok(DatabaseAuthorizationCodes::use_all_for_user(conn, user.as_ref()).await?)
} }
} }

View file

@ -0,0 +1,6 @@
update totp_login_requests
set used_at = CURRENT_TIMESTAMP
where user is ?
and used_at is null

View file

@ -0,0 +1,5 @@
update users
set is_archived = ?
where id is ?

View file

@ -296,6 +296,16 @@
}, },
"query": "insert into users (id, is_admin, username, password)\nvalues (?, ?, ?, ?)\n" "query": "insert into users (id, is_admin, username, password)\nvalues (?, ?, ?, ?)\n"
}, },
"52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0": {
"describe": {
"columns": [],
"nullable": [],
"parameters": {
"Right": 2
}
},
"query": "update users\n\nset is_archived = ?\n\nwhere id is ?"
},
"545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c": { "545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c": {
"describe": { "describe": {
"columns": [], "columns": [],
@ -454,6 +464,16 @@
}, },
"query": "update users\n\nset timezone = ?\n\nwhere id is ?" "query": "update users\n\nset timezone = ?\n\nwhere id is ?"
}, },
"5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c": {
"describe": {
"columns": [],
"nullable": [],
"parameters": {
"Right": 1
}
},
"query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null"
},
"5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669": { "5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669": {
"describe": { "describe": {
"columns": [ "columns": [
@ -516,54 +536,6 @@
}, },
"query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?" "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
}, },
"64cf880633d3ee5c18f6e7c2a865470442f1ba4b1019806a580ec384329dc32e": {
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Int64"
},
{
"name": "created_at: DateTime<Utc>",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "updated_at: DateTime<Utc>",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "business_name",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "business_logo",
"ordinal": 4,
"type_info": "Blob"
},
{
"name": "url",
"ordinal": 5,
"type_info": "Text"
}
],
"nullable": [
false,
false,
false,
true,
true,
true
],
"parameters": {
"Right": 0
}
},
"query": "select id,\n created_at as \"created_at: DateTime<Utc>\",\n updated_at as \"updated_at: DateTime<Utc>\",\n business_name,\n business_logo,\n url\n\nfrom settings\n\nwhere id is 0\n"
},
"68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5": { "68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5": {
"describe": { "describe": {
"columns": [], "columns": [],
@ -1004,6 +976,60 @@
}, },
"query": "update settings\n\nset first_admin = ?\n\nwhere id is 0\n" "query": "update settings\n\nset first_admin = ?\n\nwhere id is 0\n"
}, },
"adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d": {
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Int64"
},
{
"name": "created_at: DateTime<Utc>",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "updated_at: DateTime<Utc>",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "business_name",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "business_logo",
"ordinal": 4,
"type_info": "Blob"
},
{
"name": "url",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "first_admin",
"ordinal": 6,
"type_info": "Text"
}
],
"nullable": [
false,
false,
false,
true,
true,
true,
true
],
"parameters": {
"Right": 0
}
},
"query": "select id,\n created_at as \"created_at: DateTime<Utc>\",\n updated_at as \"updated_at: DateTime<Utc>\",\n business_name,\n business_logo,\n url,\n first_admin\n\nfrom settings\n\nwhere id is 0\n"
},
"afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356": { "afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356": {
"describe": { "describe": {
"columns": [], "columns": [],

View file

@ -57,4 +57,17 @@ impl TotpLoginRequests {
Ok((query.rows_affected() == 1).then_some(())) Ok((query.rows_affected() == 1).then_some(()))
} }
pub async fn use_all_for_user(
conn: impl SqliteExecutor<'_>,
user: &str,
) -> Result<Option<()>, Error> {
let query: SqliteQueryResult =
sqlx::query_file!("queries/totp_login_requests/use_all_for_user.sql", user)
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() >= 1).then_some(()))
}
} }

View file

@ -243,4 +243,18 @@ impl Users {
Ok((query.rows_affected() == 1).then_some(())) Ok((query.rows_affected() == 1).then_some(()))
} }
pub async fn set_archive_status(
conn: impl SqliteExecutor<'_>,
id: &str,
value: bool,
) -> Result<Option<()>, Error> {
let query: SqliteQueryResult =
sqlx::query_file!("queries/users/set_archive_status.sql", value, id)
.execute(conn)
.await
.map_err(handle_error)?;
Ok((query.rows_affected() == 1).then_some(()))
}
} }

View file

@ -33,7 +33,7 @@ pub async fn redirect_page(
// Make sure code has not been used // Make sure code has not been used
if code.has_been_used() { if code.has_been_used() {
// Revoke all codes and refresh tokens for user // Revoke all codes and refresh tokens for user
code.use_all_for_user(&mut transaction).await?; AuthorizationCode::use_all_for_user(&mut transaction, code.user()).await?;
RefreshToken::revoke_all_for_user(&mut transaction, code.user()).await?; RefreshToken::revoke_all_for_user(&mut transaction, code.user()).await?;
transaction.commit().await?; transaction.commit().await?;

View file

@ -189,7 +189,7 @@ pub async fn request_token(
// Make sure code has not been used // Make sure code has not been used
if code.has_been_used() { if code.has_been_used() {
// Revoke all codes and refresh tokens for user // Revoke all codes and refresh tokens for user
code.use_all_for_user(&mut transaction) AuthorizationCode::use_all_for_user(&mut transaction, code.user())
.await .await
.map_err(TokenError::AuthorizationError)?; .map_err(TokenError::AuthorizationError)?;
RefreshToken::revoke_all_for_user(&mut transaction, code.user()) RefreshToken::revoke_all_for_user(&mut transaction, code.user())

View file

@ -252,4 +252,14 @@ impl User {
Ok(()) Ok(())
} }
pub async fn set_archive_status(
&self,
conn: impl SqliteExecutor<'_>,
value: bool,
) -> Result<(), Error> {
DatabaseUsers::set_archive_status(conn, self.id.as_ref(), value).await?;
Ok(())
}
} }

View file

@ -70,4 +70,11 @@ impl TotpLoginRequest {
pub async fn use_code(self, conn: impl SqliteExecutor<'_>) -> Result<Option<()>, Error> { pub async fn use_code(self, conn: impl SqliteExecutor<'_>) -> Result<Option<()>, Error> {
Ok(DatabaseTotpLoginRequests::use_token(conn, &self.token).await?) Ok(DatabaseTotpLoginRequests::use_token(conn, &self.token).await?)
} }
pub async fn use_all_for_user(
conn: impl SqliteExecutor<'_>,
user: &UserID,
) -> Result<Option<()>, Error> {
Ok(DatabaseTotpLoginRequests::use_all_for_user(conn, user.as_ref()).await?)
}
} }