users: set archive status, totp_login_request: use all for user
This commit is contained in:
parent
4bfc8a517f
commit
f82c6368e3
10 changed files with 133 additions and 52 deletions
|
|
@ -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?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
update totp_login_requests
|
||||||
|
|
||||||
|
set used_at = CURRENT_TIMESTAMP
|
||||||
|
|
||||||
|
where user is ?
|
||||||
|
and used_at is null
|
||||||
5
crates/database/queries/users/set_archive_status.sql
Normal file
5
crates/database/queries/users/set_archive_status.sql
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
update users
|
||||||
|
|
||||||
|
set is_archived = ?
|
||||||
|
|
||||||
|
where id is ?
|
||||||
|
|
@ -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": [],
|
||||||
|
|
|
||||||
|
|
@ -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(()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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?;
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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?)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue