From 0cb9fd3f95b00e723d025c46b6f6e08220771e93 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 14:58:08 -0400 Subject: [PATCH 01/19] Added new table and updated migrations --- migrations/20250402221858_init_migrate.sql | 6 ++++++ migrations/20250802185652_passphrase_data.sql | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 migrations/20250802185652_passphrase_data.sql diff --git a/migrations/20250402221858_init_migrate.sql b/migrations/20250402221858_init_migrate.sql index 8fe068c..0ad2121 100644 --- a/migrations/20250402221858_init_migrate.sql +++ b/migrations/20250402221858_init_migrate.sql @@ -20,3 +20,9 @@ CREATE TABLE IF NOT EXISTS "salt" ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), salt TEXT NOT NULL ); + +CREATE TABLE IF NOT EXISTS "passphrase" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + passphrase TEXT NOT NULL, + date_created TIMESTAMPTZ NOT NULL DEFAULT NOW() +); diff --git a/migrations/20250802185652_passphrase_data.sql b/migrations/20250802185652_passphrase_data.sql new file mode 100644 index 0000000..e18d2a1 --- /dev/null +++ b/migrations/20250802185652_passphrase_data.sql @@ -0,0 +1,2 @@ +-- Add migration script here +INSERT INTO "passphrase" (passphrase) VALUES('iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH'); -- 2.43.0 From c31743eed1915f18c465b3d918302a21729d6442 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 15:05:49 -0400 Subject: [PATCH 02/19] Adding test migrations --- test_migrations/20250802185608_init.down.sql | 4 +++ test_migrations/20250802185608_init.up.sql | 28 +++++++++++++++++++ .../20250802190131_passphrase_data.down.sql | 2 ++ .../20250802190131_passphrase_data.up.sql | 2 ++ 4 files changed, 36 insertions(+) create mode 100644 test_migrations/20250802185608_init.down.sql create mode 100644 test_migrations/20250802185608_init.up.sql create mode 100644 test_migrations/20250802190131_passphrase_data.down.sql create mode 100644 test_migrations/20250802190131_passphrase_data.up.sql diff --git a/test_migrations/20250802185608_init.down.sql b/test_migrations/20250802185608_init.down.sql new file mode 100644 index 0000000..1bcddd4 --- /dev/null +++ b/test_migrations/20250802185608_init.down.sql @@ -0,0 +1,4 @@ +-- Add down migration script here +DROP TABLE IF EXISTS "user"; +DROP TABLE IF EXISTS "salt"; +DROP TABLE IF EXISTS "passphrase"; diff --git a/test_migrations/20250802185608_init.up.sql b/test_migrations/20250802185608_init.up.sql new file mode 100644 index 0000000..c1d9c85 --- /dev/null +++ b/test_migrations/20250802185608_init.up.sql @@ -0,0 +1,28 @@ +-- Add up migration script here +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +CREATE TABLE IF NOT EXISTS "user" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + username TEXT NOT NULL, + password TEXT NOT NULL, + email TEXT NOT NULL, + phone TEXT NOT NULL, + firstname TEXT NOT NULL, + lastname TEXT NOT NULL, + email_verified BOOL NOT NULL, + date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(), + status TEXT NOT NULL, + last_login TIMESTAMPTZ NULL DEFAULT NOW(), + salt_id UUID NOT NULL +); + +CREATE TABLE IF NOT EXISTS "salt" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + salt TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS "passphrase" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + passphrase TEXT NOT NULL, + date_created TIMESTAMPTZ NOT NULL DEFAULT NOW() +); diff --git a/test_migrations/20250802190131_passphrase_data.down.sql b/test_migrations/20250802190131_passphrase_data.down.sql new file mode 100644 index 0000000..1fe56a3 --- /dev/null +++ b/test_migrations/20250802190131_passphrase_data.down.sql @@ -0,0 +1,2 @@ +-- Add down migration script here +DELETE FROM "passphrase"; diff --git a/test_migrations/20250802190131_passphrase_data.up.sql b/test_migrations/20250802190131_passphrase_data.up.sql new file mode 100644 index 0000000..a1080a0 --- /dev/null +++ b/test_migrations/20250802190131_passphrase_data.up.sql @@ -0,0 +1,2 @@ +-- Add up migration script here +INSERT INTO "passphrase" (passphrase) VALUES('Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak'); -- 2.43.0 From 3aa75b16b6db82218e395d7da4dae773f65af7fb Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:21:02 -0400 Subject: [PATCH 03/19] tsk-50: Added service login endpoint --- src/callers/login.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ src/repo/mod.rs | 26 +++++++++++++++++++++++ src/token_stuff/mod.rs | 9 ++++++++ 3 files changed, 83 insertions(+) diff --git a/src/callers/login.rs b/src/callers/login.rs index 9476df5..92b2ad8 100644 --- a/src/callers/login.rs +++ b/src/callers/login.rs @@ -6,6 +6,13 @@ pub mod request { pub username: String, pub password: String, } + + pub mod service_login { + #[derive(Debug, serde::Deserialize, serde::Serialize)] + pub struct Request { + pub passphrase: String, + } + } } pub mod response { @@ -16,6 +23,14 @@ pub mod response { pub message: String, pub data: Vec, } + + pub mod service_login { + #[derive(Debug, Default, serde::Deserialize, serde::Serialize)] + pub struct Response { + pub message: String, + pub data: Vec, + } + } } pub mod endpoint { @@ -79,4 +94,37 @@ pub mod endpoint { } } } + + pub async fn service_login(axum::Extension(pool): axum::Extension, axum::Json(payload): axum::Json) + -> (axum::http::StatusCode, axum::Json) { + let mut response = response::service_login::Response::default(); + + match repo::service::valid_passphrase(&pool, &payload.passphrase).await { + Ok((id, _passphrase, _date_created)) => { + let key = icarus_envy::environment::get_secret_key().await; + let (token_literal, duration) = token_stuff::create_service_token(&key).unwrap(); + + if token_stuff::verify_token(&key, &token_literal) { + let login_result = icarus_models::login_result::LoginResult { + id: id, + username: String::from("service"), + token: token_literal, + token_type: String::from(icarus_models::token::TOKEN_TYPE), + expiration: duration, + }; + + response.data.push(login_result); + response.message = String::from("Successful"); + + (axum::http::StatusCode::OK, axum::Json(response)) + } else { + (axum::http::StatusCode::OK, axum::Json(response)) + } + } + Err(err) => { + response.message = err.to_string(); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } + } } diff --git a/src/repo/mod.rs b/src/repo/mod.rs index 52e9e3c..e35b4ea 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -195,3 +195,29 @@ pub mod salt { } } } + +pub mod service { + use sqlx::Row; + + pub async fn valid_passphrase(pool: &sqlx::PgPool, passphrase: &String) -> Result<(uuid::Uuid, String, time::OffsetDateTime), sqlx::Error> { + let result = sqlx::query( + r#" + SELECT * FROM "passphrase" WHERE passphrase = $1 + "# + ) + .bind(passphrase) + .fetch_one(pool) + .await; + + match result { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + let passphrase: String = row.try_get("passphrase")?; + let date_created: Option = row.try_get("date_created")?; + + Ok((id, passphrase, date_created.unwrap())) + } + Err(err) => Err(err) + } + } +} diff --git a/src/token_stuff/mod.rs b/src/token_stuff/mod.rs index ea2f412..241216a 100644 --- a/src/token_stuff/mod.rs +++ b/src/token_stuff/mod.rs @@ -29,6 +29,15 @@ pub fn create_token(provided_key: &String) -> Result<(String, i64), josekit::Jos icarus_models::token::create_token(provided_key, &resource, time::Duration::hours(4)) } +pub fn create_service_token(provided: &String) -> Result<(String, i64), josekit::JoseError> { + let resource = icarus_models::token::TokenResource { + message: String::from("Service random"), + issuer: String::from(ISSUER), + audiences: vec![String::from(AUDIENCE)], + }; + icarus_models::token::create_token(provided, &resource, time::Duration::hours(1)) +} + pub fn verify_token(key: &String, token: &String) -> bool { let ver = Hs256.verifier_from_bytes(key.as_bytes()).unwrap(); let (payload, _header) = jwt::decode_with_verifier(token, &ver).unwrap(); -- 2.43.0 From 7f02213282302d827214b2adec3348d0fb77a9c9 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:24:49 -0400 Subject: [PATCH 04/19] tsk-50: Endpoint is available --- src/callers/mod.rs | 1 + src/main.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/callers/mod.rs b/src/callers/mod.rs index ab9f31e..4fdaf82 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -7,4 +7,5 @@ pub mod endpoints { pub const REGISTER: &str = "/api/v2/register"; pub const DBTEST: &str = "/api/v2/test/db"; pub const LOGIN: &str = "/api/v2/login"; + pub const SERVICE_LOGIN: &str = "/api/v2/service/login"; } diff --git a/src/main.rs b/src/main.rs index f12ff7c..3b25c42 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,6 +41,7 @@ mod init { callers::endpoints::LOGIN, post(callers::login::endpoint::login), ) + .route(callers::endpoints::SERVICE_LOGIN, post(callers::login::endpoint::service_login)) } pub async fn app() -> Router { -- 2.43.0 From 10597f78e3a3afcadf462a4392a9e3a489500d01 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:29:27 -0400 Subject: [PATCH 05/19] tsk-50: Updated docker sample .env files --- .env.docker.sample | 3 +++ .env.sample | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.env.docker.sample b/.env.docker.sample index 5c0ad33..f68a7c1 100644 --- a/.env.docker.sample +++ b/.env.docker.sample @@ -1,6 +1,9 @@ SECRET_KEY=refero34o8rfhfjn983thf39fhc943rf923n3h +SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH POSTGRES_AUTH_USER=icarus_op POSTGRES_AUTH_PASSWORD=password POSTGRES_AUTH_DB=icarus_auth_db POSTGRES_AUTH_HOST=auth_db DATABASE_URL=postgresql://${POSTGRES_AUTH_USER}:${POSTGRES_AUTH_PASSWORD}@${POSTGRES_AUTH_HOST}:5432/${POSTGRES_AUTH_DB} + +TEST_SERVICE_PASSPHRASE=Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak diff --git a/.env.sample b/.env.sample index b556c08..ccaadb2 100644 --- a/.env.sample +++ b/.env.sample @@ -1,6 +1,9 @@ SECRET_KEY=refero34o8rfhfjn983thf39fhc943rf923n3h +SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH POSTGRES_AUTH_USER=icarus_op_test POSTGRES_AUTH_PASSWORD=password POSTGRES_AUTH_DB=icarus_auth_test_db POSTGRES_AUTH_HOST=localhost DATABASE_URL=postgresql://${POSTGRES_AUTH_USER}:${POSTGRES_AUTH_PASSWORD}@${POSTGRES_AUTH_HOST}:5432/${POSTGRES_AUTH_DB} + +TEST_SERVICE_PASSPHRASE=Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak -- 2.43.0 From 8bbfd8f3dcc6a5ebe3254948b2ab2eb1f0456ef8 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:40:18 -0400 Subject: [PATCH 06/19] tsk-50: Test refactor --- src/main.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3b25c42..fdb4495 100644 --- a/src/main.rs +++ b/src/main.rs @@ -112,6 +112,15 @@ mod tests { Ok(()) } + pub async fn migrations(pool: &sqlx::PgPool) { + // Run migrations using the sqlx::migrate! macro + // Assumes your migrations are in a ./migrations folder relative to Cargo.toml + sqlx::migrate!("./test_migrations") + .run(pool) + .await + .expect("Failed to run migrations"); + } + pub async fn get_database_name() -> Result> { let database_url = icarus_envy::environment::get_db_url().await; @@ -194,7 +203,7 @@ mod tests { let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - icarus_auth::db::migrations(&pool).await; + db_mgr::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); @@ -244,6 +253,23 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + pub mod requests { + use tower::ServiceExt; // for `call`, `oneshot`, and `ready` + + pub async fn register(app: &axum::Router) -> Result { + let usr = super::get_test_register_request(); + let payload = super::get_test_register_payload(&usr); + let req = axum::http::Request::builder() + .method(axum::http::Method::POST) + .uri(crate::callers::endpoints::REGISTER) + .header(axum::http::header::CONTENT_TYPE, "application/json") + .body(axum::body::Body::from(payload.to_string())) + .unwrap(); + + app.clone().oneshot(req).await + } + } + #[tokio::test] async fn test_login_user() { let tm_pool = db_mgr::get_pool().await.unwrap(); @@ -261,7 +287,7 @@ mod tests { let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - icarus_auth::db::migrations(&pool).await; + db_mgr::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); -- 2.43.0 From b5714c49c3c41367f25d96d1f090cd7383968766 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:44:35 -0400 Subject: [PATCH 07/19] tsk-50: Test migration changes --- test_migrations/20250802185608_init.down.sql | 6 +++--- test_migrations/20250802190131_passphrase_data.down.sql | 2 +- test_migrations/20250802190131_passphrase_data.up.sql | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test_migrations/20250802185608_init.down.sql b/test_migrations/20250802185608_init.down.sql index 1bcddd4..1825768 100644 --- a/test_migrations/20250802185608_init.down.sql +++ b/test_migrations/20250802185608_init.down.sql @@ -1,4 +1,4 @@ -- Add down migration script here -DROP TABLE IF EXISTS "user"; -DROP TABLE IF EXISTS "salt"; -DROP TABLE IF EXISTS "passphrase"; +-- DROP TABLE IF EXISTS "user"; +-- DROP TABLE IF EXISTS "salt"; +-- DROP TABLE IF EXISTS "passphrase"; diff --git a/test_migrations/20250802190131_passphrase_data.down.sql b/test_migrations/20250802190131_passphrase_data.down.sql index 1fe56a3..cf600aa 100644 --- a/test_migrations/20250802190131_passphrase_data.down.sql +++ b/test_migrations/20250802190131_passphrase_data.down.sql @@ -1,2 +1,2 @@ -- Add down migration script here -DELETE FROM "passphrase"; +-- DELETE FROM "passphrase"; diff --git a/test_migrations/20250802190131_passphrase_data.up.sql b/test_migrations/20250802190131_passphrase_data.up.sql index a1080a0..e91962f 100644 --- a/test_migrations/20250802190131_passphrase_data.up.sql +++ b/test_migrations/20250802190131_passphrase_data.up.sql @@ -1,2 +1,2 @@ -- Add up migration script here -INSERT INTO "passphrase" (passphrase) VALUES('Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak'); +-- INSERT INTO "passphrase" (passphrase) VALUES('Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak'); -- 2.43.0 From adf8db4e55e4154f22f279cce649b28b55265d9c Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:51:51 -0400 Subject: [PATCH 08/19] tsk-50: Deleted test migrations --- test_migrations/20250802185608_init.down.sql | 4 --- test_migrations/20250802185608_init.up.sql | 28 ------------------- .../20250802190131_passphrase_data.down.sql | 2 -- .../20250802190131_passphrase_data.up.sql | 2 -- 4 files changed, 36 deletions(-) delete mode 100644 test_migrations/20250802185608_init.down.sql delete mode 100644 test_migrations/20250802185608_init.up.sql delete mode 100644 test_migrations/20250802190131_passphrase_data.down.sql delete mode 100644 test_migrations/20250802190131_passphrase_data.up.sql diff --git a/test_migrations/20250802185608_init.down.sql b/test_migrations/20250802185608_init.down.sql deleted file mode 100644 index 1825768..0000000 --- a/test_migrations/20250802185608_init.down.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Add down migration script here --- DROP TABLE IF EXISTS "user"; --- DROP TABLE IF EXISTS "salt"; --- DROP TABLE IF EXISTS "passphrase"; diff --git a/test_migrations/20250802185608_init.up.sql b/test_migrations/20250802185608_init.up.sql deleted file mode 100644 index c1d9c85..0000000 --- a/test_migrations/20250802185608_init.up.sql +++ /dev/null @@ -1,28 +0,0 @@ --- Add up migration script here -CREATE EXTENSION IF NOT EXISTS pgcrypto; - -CREATE TABLE IF NOT EXISTS "user" ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - username TEXT NOT NULL, - password TEXT NOT NULL, - email TEXT NOT NULL, - phone TEXT NOT NULL, - firstname TEXT NOT NULL, - lastname TEXT NOT NULL, - email_verified BOOL NOT NULL, - date_created TIMESTAMPTZ NOT NULL DEFAULT NOW(), - status TEXT NOT NULL, - last_login TIMESTAMPTZ NULL DEFAULT NOW(), - salt_id UUID NOT NULL -); - -CREATE TABLE IF NOT EXISTS "salt" ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - salt TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS "passphrase" ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - passphrase TEXT NOT NULL, - date_created TIMESTAMPTZ NOT NULL DEFAULT NOW() -); diff --git a/test_migrations/20250802190131_passphrase_data.down.sql b/test_migrations/20250802190131_passphrase_data.down.sql deleted file mode 100644 index cf600aa..0000000 --- a/test_migrations/20250802190131_passphrase_data.down.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Add down migration script here --- DELETE FROM "passphrase"; diff --git a/test_migrations/20250802190131_passphrase_data.up.sql b/test_migrations/20250802190131_passphrase_data.up.sql deleted file mode 100644 index e91962f..0000000 --- a/test_migrations/20250802190131_passphrase_data.up.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Add up migration script here --- INSERT INTO "passphrase" (passphrase) VALUES('Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak'); -- 2.43.0 From 847556a0ccb8018dc56db1a612f18a0f6921f3b4 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:54:05 -0400 Subject: [PATCH 09/19] tsk-50: Updated sample .env files --- .env.docker.sample | 2 -- .env.sample | 2 -- 2 files changed, 4 deletions(-) diff --git a/.env.docker.sample b/.env.docker.sample index f68a7c1..ffde663 100644 --- a/.env.docker.sample +++ b/.env.docker.sample @@ -5,5 +5,3 @@ POSTGRES_AUTH_PASSWORD=password POSTGRES_AUTH_DB=icarus_auth_db POSTGRES_AUTH_HOST=auth_db DATABASE_URL=postgresql://${POSTGRES_AUTH_USER}:${POSTGRES_AUTH_PASSWORD}@${POSTGRES_AUTH_HOST}:5432/${POSTGRES_AUTH_DB} - -TEST_SERVICE_PASSPHRASE=Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak diff --git a/.env.sample b/.env.sample index ccaadb2..c00c477 100644 --- a/.env.sample +++ b/.env.sample @@ -5,5 +5,3 @@ POSTGRES_AUTH_PASSWORD=password POSTGRES_AUTH_DB=icarus_auth_test_db POSTGRES_AUTH_HOST=localhost DATABASE_URL=postgresql://${POSTGRES_AUTH_USER}:${POSTGRES_AUTH_PASSWORD}@${POSTGRES_AUTH_HOST}:5432/${POSTGRES_AUTH_DB} - -TEST_SERVICE_PASSPHRASE=Hg3TWfAT8pEiW6fZGhQKXICkZ246EzrE8Bx26O9iEKmQkbpzlFJTOW8UwSf09oak -- 2.43.0 From 503a1b98b4d568f432776564009d644a7545b9b7 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 16:58:05 -0400 Subject: [PATCH 10/19] tsk-50: Using migrations from db module --- src/main.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index fdb4495..c798f1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -112,15 +112,6 @@ mod tests { Ok(()) } - pub async fn migrations(pool: &sqlx::PgPool) { - // Run migrations using the sqlx::migrate! macro - // Assumes your migrations are in a ./migrations folder relative to Cargo.toml - sqlx::migrate!("./test_migrations") - .run(pool) - .await - .expect("Failed to run migrations"); - } - pub async fn get_database_name() -> Result> { let database_url = icarus_envy::environment::get_db_url().await; @@ -203,7 +194,7 @@ mod tests { let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db_mgr::migrations(&pool).await; + icarus_auth::db::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); @@ -287,7 +278,7 @@ mod tests { let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db_mgr::migrations(&pool).await; + icarus_auth::db::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); -- 2.43.0 From 7a1a31fdb7452bd55a605042b0c66240cf25075f Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 17:04:13 -0400 Subject: [PATCH 11/19] tsk-50: Test refactor --- src/main.rs | 58 ++++++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/src/main.rs b/src/main.rs index c798f1f..e65a0da 100644 --- a/src/main.rs +++ b/src/main.rs @@ -155,6 +155,23 @@ mod tests { }) } + pub mod requests { + use tower::ServiceExt; // for `call`, `oneshot`, and `ready` + + pub async fn register(app: &axum::Router, usr: &icarus_auth::callers::register::request::Request) -> Result { + // let usr = super::get_test_register_request(); + let payload = super::get_test_register_payload(&usr); + let req = axum::http::Request::builder() + .method(axum::http::Method::POST) + .uri(crate::callers::endpoints::REGISTER) + .header(axum::http::header::CONTENT_TYPE, "application/json") + .body(axum::body::Body::from(payload.to_string())) + .unwrap(); + + app.clone().oneshot(req).await + } + } + #[tokio::test] async fn test_hello_world() { let app = init::app().await; @@ -199,18 +216,8 @@ mod tests { let app = init::routes().await.layer(axum::Extension(pool)); let usr = get_test_register_request(); - let payload = get_test_register_payload(&usr); - let response = app - .oneshot( - Request::builder() - .method(axum::http::Method::POST) - .uri(callers::endpoints::REGISTER) - .header(axum::http::header::CONTENT_TYPE, "application/json") - .body(Body::from(payload.to_string())) - .unwrap(), - ) - .await; + let response = requests::register(&app, &usr).await; match response { Ok(resp) => { @@ -244,22 +251,6 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } - pub mod requests { - use tower::ServiceExt; // for `call`, `oneshot`, and `ready` - - pub async fn register(app: &axum::Router) -> Result { - let usr = super::get_test_register_request(); - let payload = super::get_test_register_payload(&usr); - let req = axum::http::Request::builder() - .method(axum::http::Method::POST) - .uri(crate::callers::endpoints::REGISTER) - .header(axum::http::header::CONTENT_TYPE, "application/json") - .body(axum::body::Body::from(payload.to_string())) - .unwrap(); - - app.clone().oneshot(req).await - } - } #[tokio::test] async fn test_login_user() { @@ -283,19 +274,8 @@ mod tests { let app = init::routes().await.layer(axum::Extension(pool)); let usr = get_test_register_request(); - let payload = get_test_register_payload(&usr); - let response = app - .clone() - .oneshot( - Request::builder() - .method(axum::http::Method::POST) - .uri(callers::endpoints::REGISTER) - .header(axum::http::header::CONTENT_TYPE, "application/json") - .body(Body::from(payload.to_string())) - .unwrap(), - ) - .await; + let response = requests::register(&app, &usr).await; match response { Ok(resp) => { -- 2.43.0 From 2f88edb02211f35481620142a65746bc1c4530ee Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 17:29:45 -0400 Subject: [PATCH 12/19] icarus_envy bump --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9370a38..a4ce5ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -752,8 +752,8 @@ dependencies = [ [[package]] name = "icarus_envy" -version = "0.3.0" -source = "git+ssh://git@git.kundeng.us/phoenix/icarus_envy.git?tag=v0.3.0-devel-d73fba9899-006#d73fba9899372b0655a90cb426645930135152da" +version = "0.3.1" +source = "git+ssh://git@git.kundeng.us/phoenix/icarus_envy.git?tag=v0.3.1-main-3cd42dab6b-006#3cd42dab6b2503609883f5f57ad3508755c34a2e" dependencies = [ "const_format", "dotenvy", diff --git a/Cargo.toml b/Cargo.toml index 71caf6d..c90e064 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ rand = { version = "0.9.1" } time = { version = "0.3.41", features = ["macros", "serde"] } josekit = { version = "0.10.3" } icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.5.4-devel-1e95822b5a-111" } -icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.3.0-devel-d73fba9899-006" } +icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.3.1-main-3cd42dab6b-006" } [dev-dependencies] http-body-util = { version = "0.1.3" } -- 2.43.0 From 4db6c16e065519007b53591744ef8eb0536c4e42 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 17:35:53 -0400 Subject: [PATCH 13/19] Test --- src/main.rs | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/main.rs b/src/main.rs index e65a0da..ceee915 100644 --- a/src/main.rs +++ b/src/main.rs @@ -337,6 +337,60 @@ mod tests { } }; + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } + + #[tokio::test] + async fn test_service_login_user() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + + let db_name = db_mgr::generate_db_name().await; + + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(e) => { + assert!(false, "Error: {:?}", e.to_string()); + } + } + + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + + icarus_auth::db::migrations(&pool).await; + + let app = init::routes().await.layer(axum::Extension(pool)); + let passphrase = icarus_envy::environment::get_service_passphrase().await; + let payload = serde_json::json!({ + "passphrase": passphrase + }); + + + match app + .oneshot( + Request::builder() + .method(axum::http::Method::POST) + .uri(callers::endpoints::SERVICE_LOGIN) + .header(axum::http::header::CONTENT_TYPE, "application/json") + .body(Body::from(payload.to_string())) + .unwrap(), + ) + .await { + Ok(response) => { + assert_eq!(StatusCode::OK, response.status(), "Status is not right"); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let parsed_body: callers::login::response::service_login::Response = + serde_json::from_slice(&body).unwrap(); + let _login_result = &parsed_body.data[0]; + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } } -- 2.43.0 From 99fd64d5c8d6e0613f7b3ec6f17881bc86e45dcc Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 17:37:55 -0400 Subject: [PATCH 14/19] Code formatting --- src/callers/login.rs | 9 +++++++-- src/main.rs | 42 +++++++++++++++++++++++------------------- src/repo/mod.rs | 17 ++++++++++------- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/callers/login.rs b/src/callers/login.rs index 92b2ad8..25184a9 100644 --- a/src/callers/login.rs +++ b/src/callers/login.rs @@ -95,8 +95,13 @@ pub mod endpoint { } } - pub async fn service_login(axum::Extension(pool): axum::Extension, axum::Json(payload): axum::Json) - -> (axum::http::StatusCode, axum::Json) { + pub async fn service_login( + axum::Extension(pool): axum::Extension, + axum::Json(payload): axum::Json, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { let mut response = response::service_login::Response::default(); match repo::service::valid_passphrase(&pool, &payload.passphrase).await { diff --git a/src/main.rs b/src/main.rs index ceee915..774f446 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,7 +41,10 @@ mod init { callers::endpoints::LOGIN, post(callers::login::endpoint::login), ) - .route(callers::endpoints::SERVICE_LOGIN, post(callers::login::endpoint::service_login)) + .route( + callers::endpoints::SERVICE_LOGIN, + post(callers::login::endpoint::service_login), + ) } pub async fn app() -> Router { @@ -157,8 +160,11 @@ mod tests { pub mod requests { use tower::ServiceExt; // for `call`, `oneshot`, and `ready` - - pub async fn register(app: &axum::Router, usr: &icarus_auth::callers::register::request::Request) -> Result { + + pub async fn register( + app: &axum::Router, + usr: &icarus_auth::callers::register::request::Request, + ) -> Result { // let usr = super::get_test_register_request(); let payload = super::get_test_register_payload(&usr); let req = axum::http::Request::builder() @@ -251,7 +257,6 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } - #[tokio::test] async fn test_login_user() { let tm_pool = db_mgr::get_pool().await.unwrap(); @@ -365,7 +370,6 @@ mod tests { "passphrase": passphrase }); - match app .oneshot( Request::builder() @@ -375,21 +379,21 @@ mod tests { .body(Body::from(payload.to_string())) .unwrap(), ) - .await { - Ok(response) => { - assert_eq!(StatusCode::OK, response.status(), "Status is not right"); - let body = axum::body::to_bytes(response.into_body(), usize::MAX) - .await - .unwrap(); - let parsed_body: callers::login::response::service_login::Response = - serde_json::from_slice(&body).unwrap(); - let _login_result = &parsed_body.data[0]; - } - Err(err) => { - assert!(false, "Error: {err:?}"); - } + .await + { + Ok(response) => { + assert_eq!(StatusCode::OK, response.status(), "Status is not right"); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let parsed_body: callers::login::response::service_login::Response = + serde_json::from_slice(&body).unwrap(); + let _login_result = &parsed_body.data[0]; } - + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } diff --git a/src/repo/mod.rs b/src/repo/mod.rs index e35b4ea..db62bb4 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -199,15 +199,18 @@ pub mod salt { pub mod service { use sqlx::Row; - pub async fn valid_passphrase(pool: &sqlx::PgPool, passphrase: &String) -> Result<(uuid::Uuid, String, time::OffsetDateTime), sqlx::Error> { + pub async fn valid_passphrase( + pool: &sqlx::PgPool, + passphrase: &String, + ) -> Result<(uuid::Uuid, String, time::OffsetDateTime), sqlx::Error> { let result = sqlx::query( r#" SELECT * FROM "passphrase" WHERE passphrase = $1 - "# - ) - .bind(passphrase) - .fetch_one(pool) - .await; + "#, + ) + .bind(passphrase) + .fetch_one(pool) + .await; match result { Ok(row) => { @@ -217,7 +220,7 @@ pub mod service { Ok((id, passphrase, date_created.unwrap())) } - Err(err) => Err(err) + Err(err) => Err(err), } } } -- 2.43.0 From d5e9a1723a59c6c5fe8d3d83f78d44e100994c56 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 17:59:50 -0400 Subject: [PATCH 15/19] tsk-50: Warning fix --- src/callers/login.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/callers/login.rs b/src/callers/login.rs index 25184a9..6d5fd20 100644 --- a/src/callers/login.rs +++ b/src/callers/login.rs @@ -111,7 +111,7 @@ pub mod endpoint { if token_stuff::verify_token(&key, &token_literal) { let login_result = icarus_models::login_result::LoginResult { - id: id, + id, username: String::from("service"), token: token_literal, token_type: String::from(icarus_models::token::TOKEN_TYPE), -- 2.43.0 From 15f23647942e0346ad6a755876e43ee513958154 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 18:00:16 -0400 Subject: [PATCH 16/19] Version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4ce5ee..ba72c60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -728,7 +728,7 @@ dependencies = [ [[package]] name = "icarus_auth" -version = "0.4.1" +version = "0.4.2" dependencies = [ "argon2", "axum", diff --git a/Cargo.toml b/Cargo.toml index c90e064..caa4c42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_auth" -version = "0.4.1" +version = "0.4.2" edition = "2024" rust-version = "1.88" -- 2.43.0 From 7cc9483a3f91da4dadf3a86645253b901e88d068 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 18:02:55 -0400 Subject: [PATCH 17/19] tsk-50: Pipeline test fix --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 774f446..359da6d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -365,7 +365,7 @@ mod tests { icarus_auth::db::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); - let passphrase = icarus_envy::environment::get_service_passphrase().await; + let passphrase = String::from("iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH"); let payload = serde_json::json!({ "passphrase": passphrase }); -- 2.43.0 From 838d81a6f38bbc616d8a1f5ee05e637d7439ce6e Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 2 Aug 2025 18:05:49 -0400 Subject: [PATCH 18/19] tsk-50: code formatting --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 359da6d..b4d3ddc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -365,7 +365,8 @@ mod tests { icarus_auth::db::migrations(&pool).await; let app = init::routes().await.layer(axum::Extension(pool)); - let passphrase = String::from("iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH"); + let passphrase = + String::from("iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH"); let payload = serde_json::json!({ "passphrase": passphrase }); -- 2.43.0 From d37b002b0ed26dba2da2f3c979dbd52b08e46c68 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 3 Aug 2025 18:57:05 -0400 Subject: [PATCH 19/19] tsk-50: Cleanup --- src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b4d3ddc..5d8a4ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -165,7 +165,6 @@ mod tests { app: &axum::Router, usr: &icarus_auth::callers::register::request::Request, ) -> Result { - // let usr = super::get_test_register_request(); let payload = super::get_test_register_payload(&usr); let req = axum::http::Request::builder() .method(axum::http::Method::POST) -- 2.43.0