From 8b21e451dd98617cbab5ef466f9be1798e63e52f Mon Sep 17 00:00:00 2001 From: Alex Emmet Date: Mon, 1 Sep 2025 22:15:49 +0200 Subject: [PATCH] Added auth & general --- src/auth/auth_connector.rs | 173 ++++++++++++++++++ src/auth/mod.rs | 1 + ...ronConnection.rs => omikron_connection.rs} | 0 src/users/user_manager.rs | 0 src/users/user_profile.rs | 0 src/users/user_profile_full.rs | 0 src/util/{chatFiles.rs => chat_files.rs} | 0 src/util/{chatsUtil.rs => chats_util.rs} | 0 src/util/{configUtil.rs => config_util.rs} | 0 src/util/{fileUtil.rs => file_util.rs} | 0 10 files changed, 174 insertions(+) create mode 100644 src/auth/auth_connector.rs create mode 100644 src/auth/mod.rs rename src/omikron/{omikronConnection.rs => omikron_connection.rs} (100%) create mode 100644 src/users/user_manager.rs create mode 100644 src/users/user_profile.rs create mode 100644 src/users/user_profile_full.rs rename src/util/{chatFiles.rs => chat_files.rs} (100%) rename src/util/{chatsUtil.rs => chats_util.rs} (100%) rename src/util/{configUtil.rs => config_util.rs} (100%) rename src/util/{fileUtil.rs => file_util.rs} (100%) diff --git a/src/auth/auth_connector.rs b/src/auth/auth_connector.rs new file mode 100644 index 0000000..97039b2 --- /dev/null +++ b/src/auth/auth_connector.rs @@ -0,0 +1,173 @@ +use std::time::Duration; +use std::collections::HashMap; +use uuid::Uuid; +use reqwest::blocking::{Client, Response}; +use reqwest::header::CONTENT_TYPE; +use json::JsonValue; + +#[derive(Debug, Clone)] +pub struct AuthUser { + pub created_at: i64, + pub username: String, + pub display: String, + pub avatar: String, + pub about: String, + pub status: String, + pub public_key: String, + pub sub_level: i32, + pub sub_end: i32, +} + +pub struct AuthConnector; + +impl AuthConnector { + fn client() -> Client { + Client::builder() + .connect_timeout(Duration::from_secs(100)) + .timeout(Duration::from_secs(150)) + .build() + .unwrap() + } + + pub fn unregister_user(auth_server: &str, user_id: Uuid, reset_token: &str) -> bool { + let url = format!("https://{}/api/delete/{}", auth_server, user_id); + let client = Self::client(); + + let mut payload = JsonValue::new_object(); + payload["reset_token"] = reset_token.into(); + + let res = client.post(&url) + .header(CONTENT_TYPE, "application/json") + .body(payload.dump()) + .send(); + + match res { + Ok(resp) => Self::handle_response(resp), + Err(_) => false, + } + } + + pub fn get_uuid(auth_server: &str, username: &str) -> Option { + let url = format!("https://{}/api/get/uuid/{}", auth_server, username); + let client = Self::client(); + let res = client.get(&url).send().ok()?; + let json = res.text().ok()?; + + let cv = CommunicationValue::from_string(&json); + if !cv.is_success() { + return None; + } + cv.get_user_id() + } + + pub fn get_user(auth_server: &str, user_id: Uuid) -> Option { + let url = format!("https://{}/api/get/{}", auth_server, user_id); + let client = Self::client(); + let res = client.get(&url).send().ok()?; + let json = res.text().ok()?; + + let cv = CommunicationValue::from_string(&json); + if !cv.is_success() { + return None; + } + + Some(AuthUser { + created_at: cv.get_number("created_at")? as i64, + username: cv.get_string("username")?, + display: cv.get_string("display")?, + avatar: cv.get_string("avatar")?, + about: cv.get_string("about")?, + status: cv.get_string("status")?, + public_key: cv.get_string("public_key")?, + sub_level: cv.get_number("sub_level")? as i32, + sub_end: cv.get_number("sub_end")? as i32, + }) + } + + pub fn get_register(auth_server: &str) -> Option { + let url = format!("https://{}/api/register/init/", auth_server); + let client = Self::client(); + let res = client.get(&url).send().ok()?; + let json = res.text().ok()?; + + let cv = CommunicationValue::from_string(&json); + cv.get_user_id() + } + + pub fn complete_register(auth_server: &str, user_profile: &UserProfile, iota_id: &str) -> bool { + let url = format!("https://{}/api/register/complete/", auth_server); + let client = Self::client(); + + let mut payload = JsonValue::new_object(); + payload["uuid"] = user_profile.user_id.to_string().into(); + payload["public_key"] = user_profile.public_key.clone().into(); + payload["private_key_hash"] = user_profile.private_key_hash.clone().into(); + payload["username"] = user_profile.username.clone().into(); + payload["iota_id"] = iota_id.into(); + payload["reset_token"] = user_profile.reset_token.clone().into(); + + let res = client.post(&url) + .header(CONTENT_TYPE, "application/json") + .body(payload.dump()) + .send(); + + match res { + Ok(resp) => Self::handle_response(resp), + Err(_) => false, + } + } + + pub fn migrate_user(auth_server: &str, user_profile: &mut UserProfile, iota_id: &str) -> bool { + let url = format!("https://{}/api/change/iota-id/{}", auth_server, user_profile.user_id); + let client = Self::client(); + + let mut payload = JsonValue::new_object(); + payload["iota_id"] = iota_id.into(); + payload["reset_token"] = user_profile.reset_token.clone().into(); + payload["new_token"] = user_profile.randomize_reset_token().into(); + + let res = client.post(&url) + .header(CONTENT_TYPE, "application/json") + .body(payload.dump()) + .send(); + + match res { + Ok(resp) => Self::handle_response(resp), + Err(_) => false, + } + } + + fn handle_response(resp: Response) -> bool { + if let Ok(text) = resp.text() { + let cv = CommunicationValue::from_string(&text); + return cv.is_success(); + } + false + } +} + +// --- Stubs for other modules --- +pub struct UserProfile { + pub user_id: Uuid, + pub public_key: String, + pub private_key_hash: String, + pub username: String, + pub reset_token: String, +} +impl UserProfile { + pub fn randomize_reset_token(&mut self) -> String { + // stub: generate new token + let new_tok = format!("{}-new", self.reset_token); + self.reset_token = new_tok.clone(); + new_tok + } +} + +pub struct CommunicationValue; +impl CommunicationValue { + pub fn from_string(s: &str) -> Self { Self } + pub fn is_success(&self) -> bool { true } + pub fn get_user_id(&self) -> Option { Some(Uuid::new_v4()) } + pub fn get_string(&self, _k: &str) -> Option { Some("demo".to_string()) } + pub fn get_number(&self, _k: &str) -> Option { Some(123) } +} diff --git a/src/auth/mod.rs b/src/auth/mod.rs new file mode 100644 index 0000000..f442b83 --- /dev/null +++ b/src/auth/mod.rs @@ -0,0 +1 @@ +pub mod auth_connector; \ No newline at end of file diff --git a/src/omikron/omikronConnection.rs b/src/omikron/omikron_connection.rs similarity index 100% rename from src/omikron/omikronConnection.rs rename to src/omikron/omikron_connection.rs diff --git a/src/users/user_manager.rs b/src/users/user_manager.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/users/user_profile.rs b/src/users/user_profile.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/users/user_profile_full.rs b/src/users/user_profile_full.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/util/chatFiles.rs b/src/util/chat_files.rs similarity index 100% rename from src/util/chatFiles.rs rename to src/util/chat_files.rs diff --git a/src/util/chatsUtil.rs b/src/util/chats_util.rs similarity index 100% rename from src/util/chatsUtil.rs rename to src/util/chats_util.rs diff --git a/src/util/configUtil.rs b/src/util/config_util.rs similarity index 100% rename from src/util/configUtil.rs rename to src/util/config_util.rs diff --git a/src/util/fileUtil.rs b/src/util/file_util.rs similarity index 100% rename from src/util/fileUtil.rs rename to src/util/file_util.rs