From f82c6368e34022b0506ad91f380b537dea1568c0 Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Wed, 3 May 2023 21:47:57 +0200 Subject: [PATCH] users: set archive status, totp_login_request: use all for user --- crates/authorization_codes/src/database.rs | 4 +- .../totp_login_requests/use_all_for_user.sql | 6 + .../queries/users/set_archive_status.sql | 5 + crates/database/sqlx-data.json | 122 +++++++++++------- .../src/tables/totp_login_requests.rs | 13 ++ crates/database/src/tables/users.rs | 14 ++ crates/ezidam/src/routes/oauth/redirect.rs | 2 +- crates/ezidam/src/routes/oauth/token.rs | 2 +- crates/users/src/database.rs | 10 ++ crates/users/src/totp_login_request.rs | 7 + 10 files changed, 133 insertions(+), 52 deletions(-) create mode 100644 crates/database/queries/totp_login_requests/use_all_for_user.sql create mode 100644 crates/database/queries/users/set_archive_status.sql diff --git a/crates/authorization_codes/src/database.rs b/crates/authorization_codes/src/database.rs index b13ef06..94c104d 100644 --- a/crates/authorization_codes/src/database.rs +++ b/crates/authorization_codes/src/database.rs @@ -52,9 +52,9 @@ impl AuthorizationCode { } pub async fn use_all_for_user( - &self, conn: impl SqliteExecutor<'_>, + user: &UserID, ) -> Result, Error> { - Ok(DatabaseAuthorizationCodes::use_all_for_user(conn, self.user.as_ref()).await?) + Ok(DatabaseAuthorizationCodes::use_all_for_user(conn, user.as_ref()).await?) } } diff --git a/crates/database/queries/totp_login_requests/use_all_for_user.sql b/crates/database/queries/totp_login_requests/use_all_for_user.sql new file mode 100644 index 0000000..bef62a6 --- /dev/null +++ b/crates/database/queries/totp_login_requests/use_all_for_user.sql @@ -0,0 +1,6 @@ +update totp_login_requests + +set used_at = CURRENT_TIMESTAMP + +where user is ? + and used_at is null \ No newline at end of file diff --git a/crates/database/queries/users/set_archive_status.sql b/crates/database/queries/users/set_archive_status.sql new file mode 100644 index 0000000..3e7a57f --- /dev/null +++ b/crates/database/queries/users/set_archive_status.sql @@ -0,0 +1,5 @@ +update users + +set is_archived = ? + +where id is ? \ No newline at end of file diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json index b2ed816..bd26b26 100644 --- a/crates/database/sqlx-data.json +++ b/crates/database/sqlx-data.json @@ -296,6 +296,16 @@ }, "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": { "describe": { "columns": [], @@ -454,6 +464,16 @@ }, "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": { "describe": { "columns": [ @@ -516,54 +536,6 @@ }, "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", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "updated_at: DateTime", - "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\",\n updated_at as \"updated_at: DateTime\",\n business_name,\n business_logo,\n url\n\nfrom settings\n\nwhere id is 0\n" - }, "68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5": { "describe": { "columns": [], @@ -1004,6 +976,60 @@ }, "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", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "updated_at: DateTime", + "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\",\n updated_at as \"updated_at: DateTime\",\n business_name,\n business_logo,\n url,\n first_admin\n\nfrom settings\n\nwhere id is 0\n" + }, "afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356": { "describe": { "columns": [], diff --git a/crates/database/src/tables/totp_login_requests.rs b/crates/database/src/tables/totp_login_requests.rs index f4d93e2..5544002 100644 --- a/crates/database/src/tables/totp_login_requests.rs +++ b/crates/database/src/tables/totp_login_requests.rs @@ -57,4 +57,17 @@ impl TotpLoginRequests { Ok((query.rows_affected() == 1).then_some(())) } + + pub async fn use_all_for_user( + conn: impl SqliteExecutor<'_>, + user: &str, + ) -> Result, 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(())) + } } diff --git a/crates/database/src/tables/users.rs b/crates/database/src/tables/users.rs index 7f84f5f..84a22b4 100644 --- a/crates/database/src/tables/users.rs +++ b/crates/database/src/tables/users.rs @@ -243,4 +243,18 @@ impl Users { Ok((query.rows_affected() == 1).then_some(())) } + + pub async fn set_archive_status( + conn: impl SqliteExecutor<'_>, + id: &str, + value: bool, + ) -> Result, 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(())) + } } diff --git a/crates/ezidam/src/routes/oauth/redirect.rs b/crates/ezidam/src/routes/oauth/redirect.rs index 9abfc46..b793890 100644 --- a/crates/ezidam/src/routes/oauth/redirect.rs +++ b/crates/ezidam/src/routes/oauth/redirect.rs @@ -33,7 +33,7 @@ pub async fn redirect_page( // Make sure code has not been used if code.has_been_used() { // 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?; transaction.commit().await?; diff --git a/crates/ezidam/src/routes/oauth/token.rs b/crates/ezidam/src/routes/oauth/token.rs index 0d376b1..a96485d 100644 --- a/crates/ezidam/src/routes/oauth/token.rs +++ b/crates/ezidam/src/routes/oauth/token.rs @@ -189,7 +189,7 @@ pub async fn request_token( // Make sure code has not been used if code.has_been_used() { // 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 .map_err(TokenError::AuthorizationError)?; RefreshToken::revoke_all_for_user(&mut transaction, code.user()) diff --git a/crates/users/src/database.rs b/crates/users/src/database.rs index 2befd51..39151bf 100644 --- a/crates/users/src/database.rs +++ b/crates/users/src/database.rs @@ -252,4 +252,14 @@ impl User { 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(()) + } } diff --git a/crates/users/src/totp_login_request.rs b/crates/users/src/totp_login_request.rs index 35edb98..e04df3d 100644 --- a/crates/users/src/totp_login_request.rs +++ b/crates/users/src/totp_login_request.rs @@ -70,4 +70,11 @@ impl TotpLoginRequest { pub async fn use_code(self, conn: impl SqliteExecutor<'_>) -> Result, Error> { Ok(DatabaseTotpLoginRequests::use_token(conn, &self.token).await?) } + + pub async fn use_all_for_user( + conn: impl SqliteExecutor<'_>, + user: &UserID, + ) -> Result, Error> { + Ok(DatabaseTotpLoginRequests::use_all_for_user(conn, user.as_ref()).await?) + } }