From 5100aa1b4e7cb4e3e0f7a0bf7ffa30292ac38ab8 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Sat, 18 Mar 2023 21:49:08 +0100
Subject: [PATCH] ezidam: added logout page, added RefreshToken guard
---
.../queries/refresh_tokens/get_one.sql | 14 ++++
.../queries/refresh_tokens/revoke.sql | 5 ++
crates/database/sqlx-data.json | 64 +++++++++++++++++++
crates/database/src/tables/refresh_tokens.rs | 20 ++++++
crates/ezidam/src/guards.rs | 2 +
crates/ezidam/src/guards/refresh_token.rs | 24 +++++++
crates/ezidam/src/routes/root.rs | 48 +++++++++++++-
.../ezidam/templates/shell/header.html.tera | 4 +-
crates/refresh_tokens/src/database.rs | 13 ++++
crates/refresh_tokens/src/lib.rs | 14 ++++
10 files changed, 205 insertions(+), 3 deletions(-)
create mode 100644 crates/database/queries/refresh_tokens/get_one.sql
create mode 100644 crates/database/queries/refresh_tokens/revoke.sql
create mode 100644 crates/ezidam/src/guards/refresh_token.rs
diff --git a/crates/database/queries/refresh_tokens/get_one.sql b/crates/database/queries/refresh_tokens/get_one.sql
new file mode 100644
index 0000000..f43ec1a
--- /dev/null
+++ b/crates/database/queries/refresh_tokens/get_one.sql
@@ -0,0 +1,14 @@
+select
+ -- info
+ token,
+ ip_address,
+ user,
+
+ -- timings
+ created_at as "created_at: DateTime",
+ expires_at as "expires_at: DateTime",
+ used_at as "used_at: DateTime",
+ revoked_at as "revoked_at: DateTime"
+from refresh_tokens
+
+where token is (?)
\ No newline at end of file
diff --git a/crates/database/queries/refresh_tokens/revoke.sql b/crates/database/queries/refresh_tokens/revoke.sql
new file mode 100644
index 0000000..c1d5924
--- /dev/null
+++ b/crates/database/queries/refresh_tokens/revoke.sql
@@ -0,0 +1,5 @@
+update refresh_tokens
+
+set revoked_at = CURRENT_TIMESTAMP
+
+where token is ?
\ No newline at end of file
diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json
index 1e842c9..32d452e 100644
--- a/crates/database/sqlx-data.json
+++ b/crates/database/sqlx-data.json
@@ -322,6 +322,60 @@
},
"query": "insert into authorization_codes (code, app, user, expires_at)\nvalues (?, ?, ?, datetime(?, 'unixepoch'))\n"
},
+ "a7405a0479b551ce8e3ea7451fd781214e049a0f12551146ace1e9a2f2f0c06d": {
+ "describe": {
+ "columns": [
+ {
+ "name": "token",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "ip_address",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "user",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "expires_at: DateTime",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "used_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "revoked_at: DateTime",
+ "ordinal": 6,
+ "type_info": "Text"
+ }
+ ],
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true
+ ],
+ "parameters": {
+ "Right": 1
+ }
+ },
+ "query": "select\n -- info\n token,\n ip_address,\n user,\n\n -- timings\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\"\nfrom refresh_tokens\n\nwhere token is (?)"
+ },
"aa88eb27d38ba4cfb539e4b4d7a86770c24221109e8fcc188a7d38f41e674817": {
"describe": {
"columns": [],
@@ -498,6 +552,16 @@
},
"query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\"\nfrom users u\n\n inner join settings s on u.id = s.first_admin\n\nwhere u.is_admin is 1\n and u.is_archived is 0\n and u.id is s.first_admin\n\nlimit 1"
},
+ "c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40": {
+ "describe": {
+ "columns": [],
+ "nullable": [],
+ "parameters": {
+ "Right": 1
+ }
+ },
+ "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
+ },
"cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406": {
"describe": {
"columns": [
diff --git a/crates/database/src/tables/refresh_tokens.rs b/crates/database/src/tables/refresh_tokens.rs
index 53f240c..2cc2d4c 100644
--- a/crates/database/src/tables/refresh_tokens.rs
+++ b/crates/database/src/tables/refresh_tokens.rs
@@ -38,4 +38,24 @@ impl RefreshTokens {
Ok((query.rows_affected() == 1).then_some(()))
}
+
+ pub async fn get_one(
+ conn: impl SqliteExecutor<'_>,
+ token: &str,
+ ) -> Result