diff --git a/compose.dev.yml b/compose.dev.yml new file mode 100644 index 0000000..02f46a3 --- /dev/null +++ b/compose.dev.yml @@ -0,0 +1,36 @@ +version: '3.5' +volumes: + gorb-backend: + gorb-database: +networks: + gorb: +services: + backend: + image: gorb/backend + build: + dockerfile: ./Dockerfile + restart: always + ports: + - 8080:8080 + networks: + - gorb + volumes: + - gorb-backend:/gorb + environment: + #- RUST_LOG=debug + - DATABASE_USERNAME=gorb + - DATABASE_PASSWORD=gorb + - DATABASE=gorb + - DATABASE_HOST=database + - DATABASE_PORT=5432 + database: + image: postgres:16 + restart: always + networks: + - gorb + volumes: + - gorb-database:/var/lib/postgresql/data + environment: + - POSTGRES_USER=gorb + - POSTGRES_PASSWORD=gorb + - POSTGRES_DB=gorb diff --git a/entrypoint.sh b/entrypoint.sh index 07e8618..63bfa84 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -36,7 +36,6 @@ rotate_log() { fi } -rotate_log "/gorb/logs/stdout.log" -rotate_log "/gorb/logs/stderr.log" +rotate_log "/gorb/logs/backend.log" -/usr/bin/gorb-backend --config /gorb/config/config.toml > /gorb/logs/stdout.log 2> /gorb/logs/stderr.log +/usr/bin/gorb-backend --config /gorb/config/config.toml 2>&1 | tee /gorb/logs/backend.log diff --git a/run-dev.sh b/run-dev.sh new file mode 100755 index 0000000..69067b8 --- /dev/null +++ b/run-dev.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +podman-compose --file compose.dev.yml up --build + +echo "SHUTTING DOWN CONTAINERS" +podman container stop backend_backend_1 backend_database_1 + +echo "DELETING CONTAINERS" +podman container rm backend_backend_1 backend_database_1 diff --git a/src/api/v1/auth/login.rs b/src/api/v1/auth/login.rs index 50aff9d..bf28ae5 100644 --- a/src/api/v1/auth/login.rs +++ b/src/api/v1/auth/login.rs @@ -4,11 +4,11 @@ use actix_web::{Error, HttpResponse, error, post, web}; use argon2::{PasswordHash, PasswordVerifier}; use futures::StreamExt; use log::error; -use regex::Regex; use serde::{Deserialize, Serialize}; use crate::{ Data, + api::v1::auth::{EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX}, crypto::{generate_access_token, generate_refresh_token}, }; @@ -44,19 +44,11 @@ pub async fn response( let login_information = serde_json::from_slice::(&body)?; - let email_regex = Regex::new(r"[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+(?:\.[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[A-Za-z0-9](?:[-A-Za-z0-9]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[-A-Za-z0-9]*[A-Za-z0-9])?").unwrap(); - - // FIXME: This regex doesnt seem to be working - let username_regex = Regex::new(r"[a-zA-Z0-9.-_]").unwrap(); - - // Password is expected to be hashed using SHA3-384 - let password_regex = Regex::new(r"[0-9a-f]{96}").unwrap(); - - if !password_regex.is_match(&login_information.password) { + if !PASSWORD_REGEX.is_match(&login_information.password) { return Ok(HttpResponse::Forbidden().json(r#"{ "password_hashed": false }"#)); } - if email_regex.is_match(&login_information.username) { + if EMAIL_REGEX.is_match(&login_information.username) { if let Ok(row) = sqlx::query_as("SELECT CAST(uuid as VARCHAR), password FROM users WHERE email = $1") .bind(login_information.username) @@ -75,7 +67,7 @@ pub async fn response( } return Ok(HttpResponse::Unauthorized().finish()); - } else if username_regex.is_match(&login_information.username) { + } else if USERNAME_REGEX.is_match(&login_information.username) { if let Ok(row) = sqlx::query_as("SELECT CAST(uuid as VARCHAR), password FROM users WHERE username = $1") .bind(login_information.username) diff --git a/src/api/v1/auth/mod.rs b/src/api/v1/auth/mod.rs index dcfeb6b..469ccc2 100644 --- a/src/api/v1/auth/mod.rs +++ b/src/api/v1/auth/mod.rs @@ -1,10 +1,12 @@ use std::{ str::FromStr, + sync::LazyLock, time::{SystemTime, UNIX_EPOCH}, }; use actix_web::{HttpResponse, Scope, web}; use log::error; +use regex::Regex; use sqlx::Postgres; use uuid::Uuid; @@ -13,6 +15,16 @@ mod refresh; mod register; mod revoke; +static EMAIL_REGEX: LazyLock = LazyLock::new(|| { + Regex::new(r"[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+(?:\.[-A-Za-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[A-Za-z0-9](?:[-A-Za-z0-9]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[-A-Za-z0-9]*[A-Za-z0-9])?").unwrap() +}); + +// FIXME: This regex doesnt seem to be working +static USERNAME_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"[a-zA-Z0-9.-_]").unwrap()); + +// Password is expected to be hashed using SHA3-384 +static PASSWORD_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"[0-9a-f]{96}").unwrap()); + pub fn web() -> Scope { web::scope("/auth") .service(register::res) diff --git a/src/api/v1/auth/register.rs b/src/api/v1/auth/register.rs index f6bcfd2..5abe127 100644 --- a/src/api/v1/auth/register.rs +++ b/src/api/v1/auth/register.rs @@ -7,13 +7,13 @@ use argon2::{ }; use futures::StreamExt; use log::error; -use regex::Regex; use serde::{Deserialize, Serialize}; use uuid::Uuid; use super::login::Response; use crate::{ Data, + api::v1::auth::{EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX}, crypto::{generate_access_token, generate_refresh_token}, }; @@ -73,19 +73,14 @@ pub async fn res(mut payload: web::Payload, data: web::Data) -> Result 32 { @@ -95,10 +90,7 @@ pub async fn res(mut payload: web::Payload, data: web::Data) -> Result; -/// Simple program to greet a person #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args {