Fix docker (#3)
Rust Build / Test Suite (push) Successful in 1m20s
Rust Build / Check (push) Successful in 1m31s
Rust Build / Rustfmt (push) Successful in 33s
Rust Build / Clippy (push) Successful in 1m27s
Rust Build / build (push) Successful in 1m38s
Rust Build / Check (pull_request) Successful in 1m16s
Rust Build / Test Suite (pull_request) Successful in 1m34s
Rust Build / Rustfmt (pull_request) Successful in 36s
Rust Build / Clippy (pull_request) Successful in 1m53s
Rust Build / build (pull_request) Successful in 1m47s

Reviewed-on: phoenix/textsender-auth#3
This commit was merged in pull request #3.
This commit is contained in:
2026-06-07 18:45:08 -04:00
parent 5edeba0799
commit 27f4443818
12 changed files with 116 additions and 72 deletions
+1
View File
@@ -5,5 +5,6 @@ DB_PASSWORD=password
DB_HOST=auth_db DB_HOST=auth_db
DB_PORT=5432 DB_PORT=5432
DB_SSLMODE=disable DB_SSLMODE=disable
DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME}
ENABLE_REGISTRATION=true ENABLE_REGISTRATION=true
ALLOWED_ORIGINS="http://textsender.com" ALLOWED_ORIGINS="http://textsender.com"
+1
View File
@@ -5,5 +5,6 @@ DB_PASSWORD=password
DB_HOST=localhost DB_HOST=localhost
DB_PORT=5432 DB_PORT=5432
DB_SSLMODE=disable DB_SSLMODE=disable
DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME}
ENABLE_REGISTRATION=true ENABLE_REGISTRATION=true
ALLOWED_ORIGINS="http://textsender.com" ALLOWED_ORIGINS="http://textsender.com"
-9
View File
@@ -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"
+12 -9
View File
@@ -3,12 +3,10 @@ name: Rust Build
on: on:
push: push:
branches: branches:
- v0.2.0 - main
- v0.2.0
pull_request: pull_request:
branches: branches:
- v0.2.0 - main
- v0.2.0
jobs: jobs:
check: check:
@@ -19,11 +17,12 @@ jobs:
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.95 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
chmod 600 ~/.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) eval $(ssh-agent -s)
ssh-add -v ~/.ssh/textsender-models_deploy_key ssh-add -v ~/.ssh/textsender-models_deploy_key
@@ -54,6 +53,7 @@ jobs:
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.95 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
# --- Add this step for explicit verification --- # --- Add this step for explicit verification ---
- name: Verify Docker Environment - name: Verify Docker Environment
run: | run: |
@@ -81,7 +81,7 @@ jobs:
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
chmod 600 ~/.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) eval $(ssh-agent -s)
ssh-add -v ~/.ssh/textsender-models_deploy_key ssh-add -v ~/.ssh/textsender-models_deploy_key
@@ -96,12 +96,13 @@ jobs:
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.95 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: rustup component add rustfmt - run: rustup component add rustfmt
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
chmod 600 ~/.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) eval $(ssh-agent -s)
ssh-add -v ~/.ssh/textsender-models_deploy_key ssh-add -v ~/.ssh/textsender-models_deploy_key
@@ -115,12 +116,13 @@ jobs:
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.95 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: rustup component add clippy - run: rustup component add clippy
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
chmod 600 ~/.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) eval $(ssh-agent -s)
ssh-add -v ~/.ssh/textsender-models_deploy_key ssh-add -v ~/.ssh/textsender-models_deploy_key
@@ -134,11 +136,12 @@ jobs:
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.95 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
chmod 600 ~/.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) eval $(ssh-agent -s)
ssh-add -v ~/.ssh/textsender-models_deploy_key ssh-add -v ~/.ssh/textsender-models_deploy_key
Generated
+1 -2
View File
@@ -2241,12 +2241,11 @@ dependencies = [
[[package]] [[package]]
name = "textsender_models" name = "textsender_models"
version = "0.3.0" 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 = [ dependencies = [
"const_format", "const_format",
"dotenvy", "dotenvy",
"josekit", "josekit",
"rand 0.10.1",
"serde", "serde",
"serde_json", "serde_json",
"time", "time",
+1 -1
View File
@@ -21,7 +21,7 @@ time = { version = "0.3.47", features = ["macros", "serde"] }
josekit = { version = "0.10.3" } josekit = { version = "0.10.3" }
utoipa = { version = "5.5.0", features = ["axum_extras"] } utoipa = { version = "5.5.0", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } 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] [dev-dependencies]
http-body-util = { version = "0.1.3" } http-body-util = { version = "0.1.3" }
+1 -1
View File
@@ -63,7 +63,7 @@ COPY --from=builder /usr/src/app/.env .
COPY --from=builder /usr/src/app/migrations ./migrations COPY --from=builder /usr/src/app/migrations ./migrations
# Expose the port your Axum app listens on (e.g., 3000 or 8000) # Expose the port your Axum app listens on (e.g., 3000 or 8000)
EXPOSE 8001 EXPOSE 9080
# Set the command to run your application # Set the command to run your application
# Ensure this matches the binary name copied above # Ensure this matches the binary name copied above
+29
View File
@@ -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
);
+32 -29
View File
@@ -1,29 +1,32 @@
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
DROP TABLE IF EXISTS users CASCADE; --
DROP TABLE IF EXISTS service_users CASCADE; -- DROP TABLE IF EXISTS "user" CASCADE;
-- DROP TABLE IF EXISTS "salt" CASCADE;
CREATE TABLE users ( -- DROP TABLE IF EXISTS "service_user" CASCADE;
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), --
first_name TEXT NULL, -- CREATE TABLE IF NOT EXISTS "user" (
last_name TEXT NULL, -- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
phone_number TEXT NOT NULL, -- first_name TEXT NOT NULL,
username TEXT NOT NULL, -- last_name TEXT NOT NULL,
password TEXT NOT NULL, -- phone_number TEXT NOT NULL,
created timestamptz DEFAULT now(), -- username TEXT NOT NULL,
last_login timestamptz NULL, -- password TEXT NOT NULL,
salt_id UUID 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 "salt" (
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
CREATE TABLE service_users ( -- salt TEXT NOT NULL
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), -- );
username TEXT NOT NULL, --
passphrase TEXT NOT NULL, -- CREATE TABLE IF NOT EXISTS "service_user" (
created timestamptz DEFAULT now(), -- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
last_login timestamptz NULL -- username TEXT NOT NULL,
); -- passphrase TEXT NOT NULL,
-- created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- last_login timestamptz NULL
-- );
+2 -2
View File
@@ -3,6 +3,6 @@ pub mod register;
pub mod endpoints { pub mod endpoints {
pub const ROOT: &str = "/"; pub const ROOT: &str = "/";
pub const REGISTER: &str = "/api/v2/register"; pub const REGISTER: &str = "/api/v1/register";
pub const DBTEST: &str = "/api/v2/test/db"; pub const DBTEST: &str = "/api/v1/test/db";
} }
+17 -13
View File
@@ -8,18 +8,15 @@ pub mod request {
#[derive(Default, Deserialize, Serialize, utoipa::ToSchema)] #[derive(Default, Deserialize, Serialize, utoipa::ToSchema)]
pub struct Request { pub struct Request {
#[serde(skip_serializing_if = "String::is_empty")]
pub username: String, pub username: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub password: String, pub password: String,
#[serde(skip_serializing_if = "String::is_empty")] pub phone_number: String,
pub email: String, #[serde(skip_serializing_if = "Option::is_none")]
#[serde(skip_serializing_if = "String::is_empty")] pub email: Option<String>,
pub phone: String, #[serde(skip_serializing_if = "Option::is_none")]
#[serde(skip_serializing_if = "String::is_empty")] pub firstname: Option<String>,
pub firstname: String, #[serde(skip_serializing_if = "Option::is_none")]
#[serde(skip_serializing_if = "String::is_empty")] pub lastname: Option<String>,
pub lastname: String,
} }
} }
@@ -71,16 +68,19 @@ pub async fn register_user(
username: payload.username.clone(), username: payload.username.clone(),
password: payload.password.clone(), password: payload.password.clone(),
// email: payload.email.clone(), // email: payload.email.clone(),
phone_number: payload.phone.clone(), phone_number: payload.phone_number.clone(),
firstname: payload.firstname.clone(),
lastname: payload.lastname.clone(),
// email_verified: true, // email_verified: true,
..Default::default() ..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 { match repo::user::exists(&pool, &user.username).await {
Ok(res) => { Ok(res) => {
if res { if res {
println!("Already exists");
( (
StatusCode::BAD_REQUEST, StatusCode::BAD_REQUEST,
Json(response::Response { Json(response::Response {
@@ -89,16 +89,20 @@ pub async fn register_user(
}), }),
) )
} else { } else {
println!("Good to create");
println!("Generate salt string");
let salt_string = hashing::generate_salt().unwrap(); let salt_string = hashing::generate_salt().unwrap();
let mut salt = textsender_models::user::Salt::default(); let mut salt = textsender_models::user::Salt::default();
let generated_salt = salt_string; let generated_salt = salt_string;
salt.salt = generated_salt.to_string(); salt.salt = generated_salt.to_string();
println!("Creating salt");
salt.id = repo::salt::insert(&pool, &salt).await.unwrap(); salt.id = repo::salt::insert(&pool, &salt).await.unwrap();
user.salt_id = salt.id; user.salt_id = salt.id;
let hashed_password = let hashed_password =
hashing::hash_password(&user.password, &generated_salt).unwrap(); hashing::hash_password(&user.password, &generated_salt).unwrap();
user.password = hashed_password; user.password = hashed_password;
println!("Creating user");
match repo::user::insert(&pool, &user).await { match repo::user::insert(&pool, &user).await {
Ok((id, date_created)) => { Ok((id, date_created)) => {
user.id = id; user.id = id;
+19 -6
View File
@@ -15,7 +15,7 @@ pub mod user {
) -> Result<textsender_models::user::User, sqlx::Error> { ) -> Result<textsender_models::user::User, sqlx::Error> {
let result = sqlx::query( let result = sqlx::query(
r#" 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) .bind(username)
@@ -85,8 +85,21 @@ pub mod user {
.await; .await;
match result { match result {
Ok(r) => Ok(r.is_some()), Ok(r) => match r {
Err(e) => Err(e), 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<time::OffsetDateTime>), sqlx::Error> { ) -> Result<(uuid::Uuid, std::option::Option<time::OffsetDateTime>), sqlx::Error> {
let row = sqlx::query( let row = sqlx::query(
r#" 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) VALUES ($1, $2, $3, $4, $5, $6)
RETURNING id, created; RETURNING id, created;
"#, "#,
@@ -117,7 +130,7 @@ pub mod user {
let result = InsertedData { let result = InsertedData {
id: row.try_get("id").map_err(|_e| sqlx::Error::RowNotFound)?, id: row.try_get("id").map_err(|_e| sqlx::Error::RowNotFound)?,
date_created: row date_created: row
.try_get("date_created") .try_get("created")
.map_err(|_e| sqlx::Error::RowNotFound)?, .map_err(|_e| sqlx::Error::RowNotFound)?,
}; };
@@ -143,7 +156,7 @@ pub mod salt {
) -> Result<textsender_models::user::Salt, sqlx::Error> { ) -> Result<textsender_models::user::Salt, sqlx::Error> {
let result = sqlx::query( let result = sqlx::query(
r#" r#"
SELECT * FROM "salt" WHERE id = $1 SELECT id, salt FROM "salt" WHERE id = $1
"#, "#,
) )
.bind(id) .bind(id)