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_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"
+1
View File
@@ -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"
-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:
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
Generated
+1 -2
View File
@@ -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",
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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
+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";
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
-- );
+2 -2
View File
@@ -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";
}
+17 -13
View File
@@ -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<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub firstname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lastname: Option<String>,
}
}
@@ -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;
+19 -6
View File
@@ -15,7 +15,7 @@ pub mod user {
) -> Result<textsender_models::user::User, sqlx::Error> {
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<time::OffsetDateTime>), 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<textsender_models::user::Salt, sqlx::Error> {
let result = sqlx::query(
r#"
SELECT * FROM "salt" WHERE id = $1
SELECT id, salt FROM "salt" WHERE id = $1
"#,
)
.bind(id)