From ef8d75eceeebaa82b7de9d82b3b6bedec78c6b03 Mon Sep 17 00:00:00 2001 From: Philippe Loctaux
Date: Sat, 18 Mar 2023 15:16:15 +0100
Subject: [PATCH] ezidam + refresh tokens: create and insert refresh token
---
Cargo.lock | 21 +++++++++
.../20230318135414_refresh_tokens.down.sql | 1 +
.../20230318135414_refresh_tokens.up.sql | 13 ++++++
.../queries/refresh_tokens/insert.sql | 2 +
crates/database/sqlx-data.json | 10 +++++
crates/database/src/tables.rs | 2 +
crates/database/src/tables/refresh_tokens.rs | 41 ++++++++++++++++++
crates/ezidam/Cargo.toml | 2 +
crates/ezidam/src/error/conversion.rs | 6 +++
crates/ezidam/src/routes/oauth/redirect.rs | 22 ++++++++++
crates/refresh_tokens/Cargo.toml | 12 ++++++
crates/refresh_tokens/src/database.rs | 43 +++++++++++++++++++
crates/refresh_tokens/src/error.rs | 8 ++++
crates/refresh_tokens/src/lib.rs | 21 +++++++++
14 files changed, 204 insertions(+)
create mode 100644 crates/database/migrations/20230318135414_refresh_tokens.down.sql
create mode 100644 crates/database/migrations/20230318135414_refresh_tokens.up.sql
create mode 100644 crates/database/queries/refresh_tokens/insert.sql
create mode 100644 crates/database/src/tables/refresh_tokens.rs
create mode 100644 crates/refresh_tokens/Cargo.toml
create mode 100644 crates/refresh_tokens/src/database.rs
create mode 100644 crates/refresh_tokens/src/error.rs
create mode 100644 crates/refresh_tokens/src/lib.rs
diff --git a/Cargo.lock b/Cargo.lock
index 5fa1c30..d84d121 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -803,7 +803,9 @@ dependencies = [
"infer",
"jwt",
"openid",
+ "refresh_tokens",
"rocket",
+ "rocket-client-addr",
"rocket_db_pools",
"rocket_dyn_templates",
"settings",
@@ -2447,6 +2449,16 @@ dependencies = [
"syn",
]
+[[package]]
+name = "refresh_tokens"
+version = "0.0.0"
+dependencies = [
+ "chrono",
+ "database",
+ "id",
+ "thiserror",
+]
+
[[package]]
name = "regex"
version = "1.7.1"
@@ -2538,6 +2550,15 @@ dependencies = [
"yansi",
]
+[[package]]
+name = "rocket-client-addr"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cb54a6e3dd696465c8a47fa61603b49e28cf475133a3d082902c2d4eaae9df1"
+dependencies = [
+ "rocket",
+]
+
[[package]]
name = "rocket_codegen"
version = "0.5.0-rc.2"
diff --git a/crates/database/migrations/20230318135414_refresh_tokens.down.sql b/crates/database/migrations/20230318135414_refresh_tokens.down.sql
new file mode 100644
index 0000000..c840649
--- /dev/null
+++ b/crates/database/migrations/20230318135414_refresh_tokens.down.sql
@@ -0,0 +1 @@
+drop table if exists refresh_tokens;
diff --git a/crates/database/migrations/20230318135414_refresh_tokens.up.sql b/crates/database/migrations/20230318135414_refresh_tokens.up.sql
new file mode 100644
index 0000000..0a897a2
--- /dev/null
+++ b/crates/database/migrations/20230318135414_refresh_tokens.up.sql
@@ -0,0 +1,13 @@
+create table if not exists refresh_tokens
+(
+ -- info
+ token TEXT not null primary key,
+ ip_address TEXT not null,
+ user TEXT not null references users (id),
+
+ -- timings
+ created_at TEXT not null default CURRENT_TIMESTAMP,
+ expires_at TEXT not null,
+ used_at TEXT,
+ revoked_at TEXT
+);
diff --git a/crates/database/queries/refresh_tokens/insert.sql b/crates/database/queries/refresh_tokens/insert.sql
new file mode 100644
index 0000000..ee496a9
--- /dev/null
+++ b/crates/database/queries/refresh_tokens/insert.sql
@@ -0,0 +1,2 @@
+insert into refresh_tokens (token, ip_address, user, expires_at)
+values (?, ?, ?, datetime(?, 'unixepoch'))
diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json
index b7d3c13..431b660 100644
--- a/crates/database/sqlx-data.json
+++ b/crates/database/sqlx-data.json
@@ -322,6 +322,16 @@
},
"query": "insert into authorization_codes (code, app, user, expires_at)\nvalues (?, ?, ?, datetime(?, 'unixepoch'))\n"
},
+ "aa88eb27d38ba4cfb539e4b4d7a86770c24221109e8fcc188a7d38f41e674817": {
+ "describe": {
+ "columns": [],
+ "nullable": [],
+ "parameters": {
+ "Right": 4
+ }
+ },
+ "query": "insert into refresh_tokens (token, ip_address, user, expires_at)\nvalues (?, ?, ?, datetime(?, 'unixepoch'))\n"
+ },
"aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5": {
"describe": {
"columns": [],
diff --git a/crates/database/src/tables.rs b/crates/database/src/tables.rs
index 63d7382..d52ac8a 100644
--- a/crates/database/src/tables.rs
+++ b/crates/database/src/tables.rs
@@ -1,11 +1,13 @@
mod apps;
mod authorization_codes;
mod keys;
+mod refresh_tokens;
mod settings;
mod users;
pub use apps::Apps;
pub use authorization_codes::AuthorizationCodes;
pub use keys::Keys;
+pub use refresh_tokens::RefreshTokens;
pub use settings::Settings;
pub use users::Users;
diff --git a/crates/database/src/tables/refresh_tokens.rs b/crates/database/src/tables/refresh_tokens.rs
new file mode 100644
index 0000000..53f240c
--- /dev/null
+++ b/crates/database/src/tables/refresh_tokens.rs
@@ -0,0 +1,41 @@
+use crate::error::{handle_error, Error};
+use sqlx::sqlite::SqliteQueryResult;
+use sqlx::types::chrono::{DateTime, Utc};
+use sqlx::{FromRow, SqliteExecutor};
+
+#[derive(FromRow)]
+pub struct RefreshTokens {
+ // Info
+ pub token: String,
+ pub ip_address: String,
+ pub user: String,
+
+ // Timings
+ pub created_at: DateTime