From 27f4443818d14bc982b1ce0384835fff6e0fac8b Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 7 Jun 2026 18:45:08 -0400 Subject: [PATCH] Fix docker (#3) Reviewed-on: http://git.kundeng.us/phoenix/textsender-auth/pulls/3 --- .env.docker.sample | 1 + .env.local.sample | 1 + .env.sample | 9 ----- .gitea/workflows/workflow.yml | 21 +++++----- Cargo.lock | 3 +- Cargo.toml | 2 +- Dockerfile | 2 +- migrations/20260607214210_init.sql | 29 ++++++++++++++ migrations/schema.sql | 61 ++++++++++++++++-------------- src/callers/mod.rs | 4 +- src/callers/register.rs | 30 ++++++++------- src/repo/mod.rs | 25 +++++++++--- 12 files changed, 116 insertions(+), 72 deletions(-) delete mode 100644 .env.sample create mode 100644 migrations/20260607214210_init.sql diff --git a/.env.docker.sample b/.env.docker.sample index 7fce7cd..6c2c1d6 100644 --- a/.env.docker.sample +++ b/.env.docker.sample @@ -5,5 +5,6 @@ DB_PASSWORD=password DB_HOST=auth_db DB_PORT=5432 DB_SSLMODE=disable +DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME} ENABLE_REGISTRATION=true ALLOWED_ORIGINS="http://textsender.com" diff --git a/.env.local.sample b/.env.local.sample index 11f68eb..2625bcf 100644 --- a/.env.local.sample +++ b/.env.local.sample @@ -5,5 +5,6 @@ DB_PASSWORD=password DB_HOST=localhost DB_PORT=5432 DB_SSLMODE=disable +DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME} ENABLE_REGISTRATION=true ALLOWED_ORIGINS="http://textsender.com" diff --git a/.env.sample b/.env.sample deleted file mode 100644 index dc73a18..0000000 --- a/.env.sample +++ /dev/null @@ -1,9 +0,0 @@ -SECRET_KEY=NULqYIzgt28bTiyziCd7IOO7b6LnWDW! -DB_NAME=textsender_auth_db -DB_USER=textsender_auth -DB_PASSWORD=yEDjWZCH2vdctjn! -DB_HOST=localhost -DB_PORT=5432 -DB_SSLMODE=disable -ENABLE_REGISTRATION=true -ALLOWED_ORIGINS="http://textsender.com" diff --git a/.gitea/workflows/workflow.yml b/.gitea/workflows/workflow.yml index a18b278..c2cc7d7 100644 --- a/.gitea/workflows/workflow.yml +++ b/.gitea/workflows/workflow.yml @@ -3,12 +3,10 @@ name: Rust Build on: push: branches: - - v0.2.0 - - v0.2.0 + - main pull_request: branches: - - v0.2.0 - - v0.2.0 + - main jobs: check: @@ -19,11 +17,12 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: 1.95 + - uses: Swatinem/rust-cache@v2 - run: | mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key chmod 600 ~/.ssh/textsender-models_deploy_key - ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/textsender-models_deploy_key @@ -54,6 +53,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: 1.95 + - uses: Swatinem/rust-cache@v2 # --- Add this step for explicit verification --- - name: Verify Docker Environment run: | @@ -81,7 +81,7 @@ jobs: mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key chmod 600 ~/.ssh/textsender-models_deploy_key - ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/textsender-models_deploy_key @@ -96,12 +96,13 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: 1.95 + - uses: Swatinem/rust-cache@v2 - run: rustup component add rustfmt - run: | mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key chmod 600 ~/.ssh/textsender-models_deploy_key - ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/textsender-models_deploy_key @@ -115,12 +116,13 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: 1.95 + - uses: Swatinem/rust-cache@v2 - run: rustup component add clippy - run: | mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key chmod 600 ~/.ssh/textsender-models_deploy_key - ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/textsender-models_deploy_key @@ -134,11 +136,12 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: 1.95 + - uses: Swatinem/rust-cache@v2 - run: | mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key chmod 600 ~/.ssh/textsender-models_deploy_key - ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/textsender-models_deploy_key diff --git a/Cargo.lock b/Cargo.lock index 5e832f2..c999c73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2241,12 +2241,11 @@ dependencies = [ [[package]] name = "textsender_models" version = "0.3.0" -source = "git+ssh://git@git.kundeng.us/phoenix/textsender-models.git?tag=v0.3.0-19-cf112a468d-111#cf112a468d4e653ec49c55bc890d59b730c85f79" +source = "git+ssh://git@git.kundeng.us/phoenix/textsender-models.git?tag=v0.3.0#d504108745b7b97a02eac24e16763cdb5e731f2b" dependencies = [ "const_format", "dotenvy", "josekit", - "rand 0.10.1", "serde", "serde_json", "time", diff --git a/Cargo.toml b/Cargo.toml index 1390f63..6128aaf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ time = { version = "0.3.47", features = ["macros", "serde"] } josekit = { version = "0.10.3" } utoipa = { version = "5.5.0", features = ["axum_extras"] } utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } -textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender-models.git", tag = "v0.3.0-19-cf112a468d-111" } +textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender-models.git", tag = "v0.3.0" } [dev-dependencies] http-body-util = { version = "0.1.3" } diff --git a/Dockerfile b/Dockerfile index abad4dd..1cd620e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,7 +63,7 @@ COPY --from=builder /usr/src/app/.env . COPY --from=builder /usr/src/app/migrations ./migrations # Expose the port your Axum app listens on (e.g., 3000 or 8000) -EXPOSE 8001 +EXPOSE 9080 # Set the command to run your application # Ensure this matches the binary name copied above diff --git a/migrations/20260607214210_init.sql b/migrations/20260607214210_init.sql new file mode 100644 index 0000000..86e6df9 --- /dev/null +++ b/migrations/20260607214210_init.sql @@ -0,0 +1,29 @@ +-- Add migration script here +CREATE EXTENSION IF NOT EXISTS pgcrypto; +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TABLE IF NOT EXISTS "user" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + firstname TEXT NOT NULL, + lastname TEXT NOT NULL, + phone_number TEXT NOT NULL, + username TEXT NOT NULL, + password TEXT NOT NULL, + created TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_login TIMESTAMPTZ NOT 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 "service_user" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + username TEXT NOT NULL, + passphrase TEXT NOT NULL, + created TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_login timestamptz NULL +); diff --git a/migrations/schema.sql b/migrations/schema.sql index aaedc1c..05395e1 100644 --- a/migrations/schema.sql +++ b/migrations/schema.sql @@ -1,29 +1,32 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - -DROP TABLE IF EXISTS users CASCADE; -DROP TABLE IF EXISTS service_users CASCADE; - -CREATE TABLE users ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - first_name TEXT NULL, - last_name TEXT NULL, - phone_number TEXT NOT NULL, - username TEXT NOT NULL, - password TEXT NOT NULL, - created timestamptz DEFAULT now(), - last_login timestamptz NULL, - 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 service_users ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - username TEXT NOT NULL, - passphrase TEXT NOT NULL, - created timestamptz DEFAULT now(), - last_login timestamptz NULL -); +-- CREATE EXTENSION IF NOT EXISTS pgcrypto; +-- CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +-- +-- DROP TABLE IF EXISTS "user" CASCADE; +-- DROP TABLE IF EXISTS "salt" CASCADE; +-- DROP TABLE IF EXISTS "service_user" CASCADE; +-- +-- CREATE TABLE IF NOT EXISTS "user" ( +-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(), +-- first_name TEXT NOT NULL, +-- last_name TEXT NOT NULL, +-- phone_number TEXT NOT NULL, +-- username TEXT NOT NULL, +-- password TEXT NOT NULL, +-- created TIMESTAMPTZ NOT NULL DEFAULT NOW(), +-- last_login TIMESTAMPTZ NOT 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 "service_user" ( +-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(), +-- username TEXT NOT NULL, +-- passphrase TEXT NOT NULL, +-- created TIMESTAMPTZ NOT NULL DEFAULT NOW(), +-- last_login timestamptz NULL +-- ); diff --git a/src/callers/mod.rs b/src/callers/mod.rs index 33ddec1..ab14499 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -3,6 +3,6 @@ pub mod register; pub mod endpoints { pub const ROOT: &str = "/"; - pub const REGISTER: &str = "/api/v2/register"; - pub const DBTEST: &str = "/api/v2/test/db"; + pub const REGISTER: &str = "/api/v1/register"; + pub const DBTEST: &str = "/api/v1/test/db"; } diff --git a/src/callers/register.rs b/src/callers/register.rs index b435543..a16df74 100644 --- a/src/callers/register.rs +++ b/src/callers/register.rs @@ -8,18 +8,15 @@ pub mod request { #[derive(Default, Deserialize, Serialize, utoipa::ToSchema)] pub struct Request { - #[serde(skip_serializing_if = "String::is_empty")] pub username: String, - #[serde(skip_serializing_if = "String::is_empty")] pub password: String, - #[serde(skip_serializing_if = "String::is_empty")] - pub email: String, - #[serde(skip_serializing_if = "String::is_empty")] - pub phone: String, - #[serde(skip_serializing_if = "String::is_empty")] - pub firstname: String, - #[serde(skip_serializing_if = "String::is_empty")] - pub lastname: String, + pub phone_number: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub firstname: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub lastname: Option, } } @@ -71,16 +68,19 @@ pub async fn register_user( username: payload.username.clone(), password: payload.password.clone(), // email: payload.email.clone(), - phone_number: payload.phone.clone(), - firstname: payload.firstname.clone(), - lastname: payload.lastname.clone(), + phone_number: payload.phone_number.clone(), // email_verified: true, ..Default::default() }; + user.firstname = payload.firstname.unwrap_or_default(); + user.lastname = payload.lastname.unwrap_or_default(); + + println!("Checking if user exists"); match repo::user::exists(&pool, &user.username).await { Ok(res) => { if res { + println!("Already exists"); ( StatusCode::BAD_REQUEST, Json(response::Response { @@ -89,16 +89,20 @@ pub async fn register_user( }), ) } else { + println!("Good to create"); + println!("Generate salt string"); let salt_string = hashing::generate_salt().unwrap(); let mut salt = textsender_models::user::Salt::default(); let generated_salt = salt_string; salt.salt = generated_salt.to_string(); + println!("Creating salt"); salt.id = repo::salt::insert(&pool, &salt).await.unwrap(); user.salt_id = salt.id; let hashed_password = hashing::hash_password(&user.password, &generated_salt).unwrap(); user.password = hashed_password; + println!("Creating user"); match repo::user::insert(&pool, &user).await { Ok((id, date_created)) => { user.id = id; diff --git a/src/repo/mod.rs b/src/repo/mod.rs index 1682239..1b51e54 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -15,7 +15,7 @@ pub mod user { ) -> Result { let result = sqlx::query( r#" - SELECT * FROM "user" WHERE username = $1 + SELECT id, username, password, phone_number, salt_id, firstname, lastname, created, last_login FROM "user" WHERE username = $1 "#, ) .bind(username) @@ -85,8 +85,21 @@ pub mod user { .await; match result { - Ok(r) => Ok(r.is_some()), - Err(e) => Err(e), + Ok(r) => match r { + Some(row) => { + if row.is_empty() { + Ok(false) + } else { + Ok(true) + } + } + None => Ok(false), + }, + Err(e) => { + eprintln!("What??"); + eprintln!("Error: {e:?}"); + Err(e) + } } } @@ -96,7 +109,7 @@ pub mod user { ) -> Result<(uuid::Uuid, std::option::Option), sqlx::Error> { let row = sqlx::query( r#" - INSERT INTO "user" (username, password, phone, firstname, lastname, salt_id) + INSERT INTO "user" (username, password, phone_number, firstname, lastname, salt_id) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id, created; "#, @@ -117,7 +130,7 @@ pub mod user { let result = InsertedData { id: row.try_get("id").map_err(|_e| sqlx::Error::RowNotFound)?, date_created: row - .try_get("date_created") + .try_get("created") .map_err(|_e| sqlx::Error::RowNotFound)?, }; @@ -143,7 +156,7 @@ pub mod salt { ) -> Result { let result = sqlx::query( r#" - SELECT * FROM "salt" WHERE id = $1 + SELECT id, salt FROM "salt" WHERE id = $1 "#, ) .bind(id)