feat: start implementing device name generation in the backend

This commit is contained in:
Twig 2025-07-14 00:36:15 +02:00
parent 3647086adb
commit 8656115dc9
No known key found for this signature in database
7 changed files with 1034 additions and 22 deletions

View file

@ -60,5 +60,6 @@ regex = "1.11"
random-string = "1.1" random-string = "1.1"
lettre = { version = "0.11", features = ["tokio1", "tokio1-native-tls"] } lettre = { version = "0.11", features = ["tokio1", "tokio1-native-tls"] }
chrono = { version = "0.4.41", features = ["serde"] } chrono = { version = "0.4.41", features = ["serde"] }
rand = "0.9.1"

View file

@ -7,10 +7,7 @@ use diesel_async::RunQueryDsl;
use serde::Deserialize; use serde::Deserialize;
use crate::{ use crate::{
Data, error::Error, schema::*, utils::{generate_token, new_refresh_token_cookie, user_uuid_from_identifier, PASSWORD_REGEX}, generate_device_name::generate_device_name, Data
error::Error,
schema::*,
utils::{PASSWORD_REGEX, generate_token, new_refresh_token_cookie, user_uuid_from_identifier},
}; };
use super::Response; use super::Response;
@ -19,7 +16,6 @@ use super::Response;
struct LoginInformation { struct LoginInformation {
username: String, username: String,
password: String, password: String,
device_name: String,
} }
#[post("/login")] #[post("/login")]
@ -63,12 +59,14 @@ pub async fn response(
use refresh_tokens::dsl as rdsl; use refresh_tokens::dsl as rdsl;
let device_name = generate_device_name();
insert_into(refresh_tokens::table) insert_into(refresh_tokens::table)
.values(( .values((
rdsl::token.eq(&refresh_token), rdsl::token.eq(&refresh_token),
rdsl::uuid.eq(uuid), rdsl::uuid.eq(uuid),
rdsl::created_at.eq(current_time), rdsl::created_at.eq(current_time),
rdsl::device_name.eq(&login_information.device_name), rdsl::device_name.eq(&device_name),
)) ))
.execute(&mut conn) .execute(&mut conn)
.await?; .await?;
@ -87,5 +85,5 @@ pub async fn response(
Ok(HttpResponse::Ok() Ok(HttpResponse::Ok()
.cookie(new_refresh_token_cookie(&data.config, refresh_token)) .cookie(new_refresh_token_cookie(&data.config, refresh_token))
.json(Response { access_token })) .json(Response { access_token, device_name }))
} }

View file

@ -20,6 +20,7 @@ mod verify_email;
#[derive(Serialize)] #[derive(Serialize)]
struct Response { struct Response {
access_token: String, access_token: String,
device_name: String,
} }
pub fn web() -> Scope { pub fn web() -> Scope {

View file

@ -77,6 +77,15 @@ pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
let access_token = generate_token::<16>()?; let access_token = generate_token::<16>()?;
let device_name: String;
// fix me tomorrow
// let devices: Vec<Device> = dsl::refresh_tokens
// .filter(dsl::uuid.eq(uuid))
// .select(Device::as_select())
// .get_results(&mut conn)
// .await?;
update(access_tokens::table) update(access_tokens::table)
.filter(dsl::refresh_token.eq(&refresh_token)) .filter(dsl::refresh_token.eq(&refresh_token))
.set(( .set((
@ -88,7 +97,7 @@ pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
return Ok(HttpResponse::Ok() return Ok(HttpResponse::Ok()
.cookie(new_refresh_token_cookie(&data.config, refresh_token)) .cookie(new_refresh_token_cookie(&data.config, refresh_token))
.json(Response { access_token })); .json(Response { access_token, device_name }));
} }
refresh_token_cookie.make_removal(); refresh_token_cookie.make_removal();

View file

@ -12,17 +12,13 @@ use uuid::Uuid;
use super::Response; use super::Response;
use crate::{ use crate::{
Data, error::Error, objects::Member, schema::{
error::Error,
objects::Member,
schema::{
access_tokens::{self, dsl as adsl}, access_tokens::{self, dsl as adsl},
refresh_tokens::{self, dsl as rdsl}, refresh_tokens::{self, dsl as rdsl},
users::{self, dsl as udsl}, users::{self, dsl as udsl},
}, }, utils::{
utils::{ generate_token, new_refresh_token_cookie, EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX
EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX, generate_token, new_refresh_token_cookie, }, generate_device_name::generate_device_name, Data
},
}; };
#[derive(Deserialize)] #[derive(Deserialize)]
@ -30,7 +26,6 @@ struct AccountInformation {
identifier: String, identifier: String,
email: String, email: String,
password: String, password: String,
device_name: String,
} }
#[derive(Serialize)] #[derive(Serialize)]
@ -125,12 +120,14 @@ pub async fn res(
let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64; let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64;
let device_name = generate_device_name();
insert_into(refresh_tokens::table) insert_into(refresh_tokens::table)
.values(( .values((
rdsl::token.eq(&refresh_token), rdsl::token.eq(&refresh_token),
rdsl::uuid.eq(uuid), rdsl::uuid.eq(uuid),
rdsl::created_at.eq(current_time), rdsl::created_at.eq(current_time),
rdsl::device_name.eq(&account_information.device_name), rdsl::device_name.eq(&device_name),
)) ))
.execute(&mut conn) .execute(&mut conn)
.await?; .await?;
@ -151,7 +148,7 @@ pub async fn res(
return Ok(HttpResponse::Ok() return Ok(HttpResponse::Ok()
.cookie(new_refresh_token_cookie(&data.config, refresh_token)) .cookie(new_refresh_token_cookie(&data.config, refresh_token))
.json(Response { access_token })); .json(Response { access_token, device_name }));
} }
Ok(HttpResponse::InternalServerError().finish()) Ok(HttpResponse::InternalServerError().finish())

View file

@ -9,6 +9,7 @@ use objects::MailClient;
use simple_logger::SimpleLogger; use simple_logger::SimpleLogger;
use std::time::SystemTime; use std::time::SystemTime;
mod config; mod config;
mod generate_device_name;
use config::{Config, ConfigBuilder}; use config::{Config, ConfigBuilder};
use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations}; use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations};

1005
src/word_list.rs Normal file

File diff suppressed because it is too large Load diff