From 471e2fc74066d9ac203eb68cc40157a8dc2dbe6a Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Thu, 16 Mar 2023 23:15:56 +0100 Subject: [PATCH] authorization_codes: crate, database, insert one --- Cargo.lock | 10 +++++ crates/authorization_codes/Cargo.toml | 12 ++++++ crates/authorization_codes/src/database.rs | 42 +++++++++++++++++++ crates/authorization_codes/src/error.rs | 8 ++++ crates/authorization_codes/src/lib.rs | 20 +++++++++ ...0230316213207_authorization_codes.down.sql | 1 + .../20230316213207_authorization_codes.up.sql | 12 ++++++ .../queries/authorization_codes/insert.sql | 2 + crates/database/sqlx-data.json | 10 +++++ crates/database/src/tables.rs | 2 + .../src/tables/authorization_codes.rs | 40 ++++++++++++++++++ 11 files changed, 159 insertions(+) create mode 100644 crates/authorization_codes/Cargo.toml create mode 100644 crates/authorization_codes/src/database.rs create mode 100644 crates/authorization_codes/src/error.rs create mode 100644 crates/authorization_codes/src/lib.rs create mode 100644 crates/database/migrations/20230316213207_authorization_codes.down.sql create mode 100644 crates/database/migrations/20230316213207_authorization_codes.up.sql create mode 100644 crates/database/queries/authorization_codes/insert.sql create mode 100644 crates/database/src/tables/authorization_codes.rs diff --git a/Cargo.lock b/Cargo.lock index ffb75c4..554495a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -164,6 +164,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "authorization_codes" +version = "0.0.0" +dependencies = [ + "chrono", + "database", + "id", + "thiserror", +] + [[package]] name = "autocfg" version = "1.1.0" diff --git a/crates/authorization_codes/Cargo.toml b/crates/authorization_codes/Cargo.toml new file mode 100644 index 0000000..facc16d --- /dev/null +++ b/crates/authorization_codes/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "authorization_codes" +version = "0.0.0" +edition = "2021" + +[dependencies] +thiserror = { workspace = true } +chrono = { workspace = true } + +# local crates +database = { path = "../database" } +id = { path = "../id" } diff --git a/crates/authorization_codes/src/database.rs b/crates/authorization_codes/src/database.rs new file mode 100644 index 0000000..836ef0f --- /dev/null +++ b/crates/authorization_codes/src/database.rs @@ -0,0 +1,42 @@ +use crate::error::Error; +use crate::AuthorizationCodes; +use chrono::{Duration, Utc}; +use database::sqlx::SqliteExecutor; +use database::AuthorizationCodes as DatabaseAuthorizationCodes; +use id::{AppID, UserID}; + +impl From for AuthorizationCodes { + fn from(db: DatabaseAuthorizationCodes) -> Self { + Self { + // Info + code: db.code, + app: AppID(db.app), + user: UserID(db.user), + + // Timings + created_at: db.created_at, + expires_at: db.expires_at, + used_at: db.used_at, + } + } +} + +impl AuthorizationCodes { + pub async fn insert( + conn: impl SqliteExecutor<'_>, + code: &str, + app: &AppID, + user: &UserID, + ) -> Result, Error> { + let expires_at = Utc::now() + Duration::minutes(10); + + Ok(DatabaseAuthorizationCodes::insert( + conn, + code, + app.as_ref(), + user.as_ref(), + expires_at.timestamp(), + ) + .await?) + } +} diff --git a/crates/authorization_codes/src/error.rs b/crates/authorization_codes/src/error.rs new file mode 100644 index 0000000..47def78 --- /dev/null +++ b/crates/authorization_codes/src/error.rs @@ -0,0 +1,8 @@ +// error +#[derive(thiserror::Error)] +// the rest +#[derive(Debug)] +pub enum Error { + #[error("Database: {0}")] + Database(#[from] database::Error), +} diff --git a/crates/authorization_codes/src/lib.rs b/crates/authorization_codes/src/lib.rs new file mode 100644 index 0000000..1ea677e --- /dev/null +++ b/crates/authorization_codes/src/lib.rs @@ -0,0 +1,20 @@ +mod database; +mod error; + +use chrono::{DateTime, Utc}; +use id::{AppID, UserID}; + +pub use crate::error::Error; + +#[derive(Debug)] +pub struct AuthorizationCodes { + // Info + code: String, + app: AppID, + user: UserID, + + // Timings + created_at: DateTime, + expires_at: DateTime, + used_at: Option>, +} diff --git a/crates/database/migrations/20230316213207_authorization_codes.down.sql b/crates/database/migrations/20230316213207_authorization_codes.down.sql new file mode 100644 index 0000000..844ea36 --- /dev/null +++ b/crates/database/migrations/20230316213207_authorization_codes.down.sql @@ -0,0 +1 @@ +drop table if exists authorization_codes; diff --git a/crates/database/migrations/20230316213207_authorization_codes.up.sql b/crates/database/migrations/20230316213207_authorization_codes.up.sql new file mode 100644 index 0000000..a075800 --- /dev/null +++ b/crates/database/migrations/20230316213207_authorization_codes.up.sql @@ -0,0 +1,12 @@ +create table if not exists authorization_codes +( + -- info + code TEXT not null primary key, + app TEXT not null references apps (id), + user TEXT not null references users (id), + + -- timings + created_at TEXT not null default CURRENT_TIMESTAMP, + expires_at TEXT not null, + used_at TEXT +); diff --git a/crates/database/queries/authorization_codes/insert.sql b/crates/database/queries/authorization_codes/insert.sql new file mode 100644 index 0000000..dede465 --- /dev/null +++ b/crates/database/queries/authorization_codes/insert.sql @@ -0,0 +1,2 @@ +insert into authorization_codes (code, app, user, expires_at) +values (?, ?, ?, datetime(?, 'unixepoch')) diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json index bf0f025..fdcc0f3 100644 --- a/crates/database/sqlx-data.json +++ b/crates/database/sqlx-data.json @@ -302,6 +302,16 @@ }, "query": "update settings\n\nset url = ?\n\nwhere id is 0\n" }, + "a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Right": 4 + } + }, + "query": "insert into authorization_codes (code, app, 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 2381e4b..63d7382 100644 --- a/crates/database/src/tables.rs +++ b/crates/database/src/tables.rs @@ -1,9 +1,11 @@ mod apps; +mod authorization_codes; mod keys; mod settings; mod users; pub use apps::Apps; +pub use authorization_codes::AuthorizationCodes; pub use keys::Keys; pub use settings::Settings; pub use users::Users; diff --git a/crates/database/src/tables/authorization_codes.rs b/crates/database/src/tables/authorization_codes.rs new file mode 100644 index 0000000..f6f2922 --- /dev/null +++ b/crates/database/src/tables/authorization_codes.rs @@ -0,0 +1,40 @@ +use crate::error::{handle_error, Error}; +use sqlx::sqlite::SqliteQueryResult; +use sqlx::types::chrono::{DateTime, Utc}; +use sqlx::{FromRow, SqliteExecutor}; + +#[derive(FromRow)] +pub struct AuthorizationCodes { + // Info + pub code: String, + pub app: String, + pub user: String, + + // Timings + pub created_at: DateTime, + pub expires_at: DateTime, + pub used_at: Option>, +} + +impl AuthorizationCodes { + pub async fn insert( + conn: impl SqliteExecutor<'_>, + code: &str, + app: &str, + user: &str, + expires_at: i64, + ) -> Result, Error> { + let query: SqliteQueryResult = sqlx::query_file!( + "queries/authorization_codes/insert.sql", + code, + app, + user, + expires_at + ) + .execute(conn) + .await + .map_err(handle_error)?; + + Ok((query.rows_affected() == 1).then_some(())) + } +}