diff --git a/Cargo.lock b/Cargo.lock index cd56dfb..334fe02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -847,6 +847,53 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +[[package]] +name = "decentralized" +version = "0.1.0" +dependencies = [ + "actix-web", + "actix-web-actors", + "aes-gcm", + "async-trait", + "base64", + "chrono", + "crossterm", + "dashmap", + "futures", + "futures-util", + "hex", + "hkdf", + "hyper", + "hyper-util", + "json", + "lazy_static", + "once_cell", + "open", + "pnet", + "rand 0.8.5", + "rand_core 0.6.4", + "ratatui", + "reqwest", + "rusqlite", + "rustls", + "rustls-pemfile", + "serde_json", + "sha2", + "strum 0.27.2", + "strum_macros 0.27.2", + "sysinfo", + "tokio", + "tokio-tungstenite", + "ttp-core", + "ttp-native", + "tungstenite", + "uuid", + "walkdir", + "warp", + "x448", + "zip", +] + [[package]] name = "deflate64" version = "0.1.12" @@ -1028,9 +1075,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "a043dc74da1e37d6afe657061213aa6f425f855399a11d3463c6ecccc4dfda1f" [[package]] name = "fiat-crypto" @@ -1723,6 +1770,14 @@ dependencies = [ [[package]] name = "iota" version = "0.1.0" +dependencies = [ + "ttp-core", + "ttp-native", +] + +[[package]] +name = "iota-cli" +version = "0.1.0" dependencies = [ "actix-web", "actix-web-actors", @@ -1738,6 +1793,7 @@ dependencies = [ "hkdf", "hyper", "hyper-util", + "iota-state", "json", "lazy_static", "once_cell", @@ -1767,6 +1823,64 @@ dependencies = [ "zip", ] +[[package]] +name = "iota-core" +version = "0.1.0" +dependencies = [ + "dashmap", + "iota-state", + "json", + "once_cell", + "pnet", + "ratatui", + "reqwest", + "tokio", + "ttp-core", + "ttp-native", +] + +[[package]] +name = "iota-logger" +version = "0.1.0" + +[[package]] +name = "iota-state" +version = "0.1.0" +dependencies = [ + "dashmap", + "json", + "once_cell", + "sysinfo", + "tokio", + "ttp-core", +] + +[[package]] +name = "iota-storage" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "base64", + "hex", + "hkdf", + "json", + "once_cell", + "rand 0.8.5", + "rand_core 0.6.4", + "ratatui", + "reqwest", + "rusqlite", + "sha2", + "sysinfo", + "tokio", + "ttp-core", + "ttp-native", + "uuid", + "walkdir", + "x448", + "zip", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -2257,6 +2371,18 @@ dependencies = [ "asn1-rs", ] +[[package]] +name = "omikron-connector" +version = "0.1.0" +dependencies = [ + "dashmap", + "json", + "tokio", + "ttp-core", + "ttp-native", + "uuid", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -4224,6 +4350,53 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-ui" +version = "0.1.0" +dependencies = [ + "actix-web", + "actix-web-actors", + "aes-gcm", + "async-trait", + "base64", + "chrono", + "crossterm", + "dashmap", + "futures", + "futures-util", + "hex", + "hkdf", + "hyper", + "hyper-util", + "json", + "lazy_static", + "once_cell", + "open", + "pnet", + "rand 0.8.5", + "rand_core 0.6.4", + "ratatui", + "reqwest", + "rusqlite", + "rustls", + "rustls-pemfile", + "serde_json", + "sha2", + "strum 0.27.2", + "strum_macros 0.27.2", + "sysinfo", + "tokio", + "tokio-tungstenite", + "ttp-core", + "ttp-native", + "tungstenite", + "uuid", + "walkdir", + "warp", + "x448", + "zip", +] + [[package]] name = "webpki-root-certs" version = "1.0.6" diff --git a/Cargo.toml b/Cargo.toml index 8767b56..7d4ef81 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,56 +1,2 @@ -[package] -name = "iota" -version = "0.1.0" -edition = "2024" - -[dependencies] -ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } -ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } - -actix-web = { version = "4", features = ["rustls-0_23"] } -actix-web-actors = "4" -aes-gcm = "0.10.3" -base64 = "0.22.1" -crossterm = "*" -futures = "*" -futures-util = "*" -hex = "*" -hkdf = "0.12.4" -hyper-util = { version = "*" } -hyper = { version = "1.8.1", features = [ - "capi", - "client", - "full", - "http1", - "http2", - "nightly", - "server", -] } -json = "*" -once_cell = "1.21.3" -rand = "0.8" -rand_core = { version = "0.6", features = ["getrandom", "std"] } -reqwest = "0.13.2" -rustls = { version = "0.23.37", features = ["aws-lc-rs"] } -sha2 = "0.10.9" -sysinfo = "0.38.3" -tokio = { version = "1.50.0", features = ["full"] } -tokio-tungstenite = { version = "*", features = ["native-tls"] } -tungstenite = "*" -uuid = { version = "*", features = ["v4"] } -walkdir = "2.5.0" -warp = "*" -x448 = { version = "*" } -rustls-pemfile = "2.2.0" -async-trait = "0.1.89" -zip = "6.0.0" -pnet = "0.35.0" -dashmap = "6.1.0" -strum = "0.27.2" -strum_macros = "0.27.2" -ratatui = "0.30.0" -open = "5.3.3" -chrono = "0.4.43" -serde_json = "1.0.149" -rusqlite = "0.39.0" -lazy_static = "1.5.0" +[workspace] +members = ["iota-storage", "iota-state", "iota-cli", "iota-core", "omikron-connector", "web-server", "web-ui", "decentralized", "iota-logger"] diff --git a/decentralized/Cargo.toml b/decentralized/Cargo.toml new file mode 100644 index 0000000..9c21cdf --- /dev/null +++ b/decentralized/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "decentralized" +version = "0.1.0" +edition = "2024" + +[dependencies] +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +actix-web = { version = "4", features = ["rustls-0_23"] } +actix-web-actors = "4" +aes-gcm = "0.10.3" +async-trait = "0.1.89" +base64 = "0.22.1" +chrono = "0.4.43" +crossterm = "*" +dashmap = "6.1.0" +futures = "*" +futures-util = "*" +hex = "*" +hkdf = "0.12.4" +hyper = { version = "1.8.1", features = [ + "capi", + "client", + "full", + "http1", + "http2", + "nightly", + "server", +] } +hyper-util = { version = "*" } +json = "*" +lazy_static = "1.5.0" +once_cell = "1.21.3" +open = "5.3.3" +pnet = "0.35.0" +rand = "0.8" +rand_core = { version = "0.6", features = ["getrandom", "std"] } +ratatui = "0.30.0" +reqwest = "0.13.2" +rusqlite = "0.39.0" +rustls = { version = "0.23.37", features = ["aws-lc-rs"] } +rustls-pemfile = "2.2.0" +serde_json = "1.0.149" +sha2 = "0.10.9" +strum = "0.27.2" +strum_macros = "0.27.2" +sysinfo = "0.38.3" +tokio = { version = "1.50.0", features = ["full"] } +tokio-tungstenite = { version = "*", features = ["native-tls"] } +tungstenite = "*" +uuid = { version = "*", features = ["v4"] } +walkdir = "2.5.0" +warp = "*" +x448 = { version = "*" } +zip = "6.0.0" diff --git a/src/communities/community.rs b/decentralized/src/communities/community.rs similarity index 100% rename from src/communities/community.rs rename to decentralized/src/communities/community.rs diff --git a/src/communities/community_connection.rs b/decentralized/src/communities/community_connection.rs similarity index 100% rename from src/communities/community_connection.rs rename to decentralized/src/communities/community_connection.rs diff --git a/src/communities/community_manager.rs b/decentralized/src/communities/community_manager.rs similarity index 100% rename from src/communities/community_manager.rs rename to decentralized/src/communities/community_manager.rs diff --git a/src/communities/interactables/category.rs b/decentralized/src/communities/interactables/category.rs similarity index 100% rename from src/communities/interactables/category.rs rename to decentralized/src/communities/interactables/category.rs diff --git a/src/communities/interactables/interactable.rs b/decentralized/src/communities/interactables/interactable.rs similarity index 100% rename from src/communities/interactables/interactable.rs rename to decentralized/src/communities/interactables/interactable.rs diff --git a/src/communities/interactables/registry.rs b/decentralized/src/communities/interactables/registry.rs similarity index 100% rename from src/communities/interactables/registry.rs rename to decentralized/src/communities/interactables/registry.rs diff --git a/src/communities/interactables/text_chat.rs b/decentralized/src/communities/interactables/text_chat.rs similarity index 100% rename from src/communities/interactables/text_chat.rs rename to decentralized/src/communities/interactables/text_chat.rs diff --git a/src/communities/interactables/voice_chat.rs b/decentralized/src/communities/interactables/voice_chat.rs similarity index 100% rename from src/communities/interactables/voice_chat.rs rename to decentralized/src/communities/interactables/voice_chat.rs diff --git a/src/communities/mod.rs b/decentralized/src/communities/mod.rs similarity index 100% rename from src/communities/mod.rs rename to decentralized/src/communities/mod.rs diff --git a/src/communities/perms/permission.rs b/decentralized/src/communities/perms/permission.rs similarity index 100% rename from src/communities/perms/permission.rs rename to decentralized/src/communities/perms/permission.rs diff --git a/src/gui/tui.rs b/decentralized/src/lib.rs similarity index 100% rename from src/gui/tui.rs rename to decentralized/src/lib.rs diff --git a/src/auth/auth_user.rs b/decentralized/src/local-auth/auth_user.rs similarity index 100% rename from src/auth/auth_user.rs rename to decentralized/src/local-auth/auth_user.rs diff --git a/src/auth/local_auth.rs b/decentralized/src/local-auth/local_auth.rs similarity index 100% rename from src/auth/local_auth.rs rename to decentralized/src/local-auth/local_auth.rs diff --git a/src/auth/mod.rs b/decentralized/src/local-auth/mod.rs similarity index 100% rename from src/auth/mod.rs rename to decentralized/src/local-auth/mod.rs diff --git a/iota-cli/Cargo.toml b/iota-cli/Cargo.toml new file mode 100644 index 0000000..029e7e0 --- /dev/null +++ b/iota-cli/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "iota-cli" +version = "0.1.0" +edition = "2024" + +[dependencies] +iota-state = { path = "../iota-state" } +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +actix-web = { version = "4", features = ["rustls-0_23"] } +actix-web-actors = "4" +aes-gcm = "0.10.3" +async-trait = "0.1.89" +base64 = "0.22.1" +chrono = "0.4.43" +crossterm = "*" +dashmap = "6.1.0" +futures = "*" +futures-util = "*" +hex = "*" +hkdf = "0.12.4" +hyper = { version = "1.8.1", features = [ + "capi", + "client", + "full", + "http1", + "http2", + "nightly", + "server", +] } +hyper-util = { version = "*" } +json = "*" +lazy_static = "1.5.0" +once_cell = "1.21.3" +open = "5.3.3" +pnet = "0.35.0" +rand = "0.8" +rand_core = { version = "0.6", features = ["getrandom", "std"] } +ratatui = "0.30.0" +reqwest = "0.13.2" +rusqlite = "0.39.0" +rustls = { version = "0.23.37", features = ["aws-lc-rs"] } +rustls-pemfile = "2.2.0" +serde_json = "1.0.149" +sha2 = "0.10.9" +strum = "0.27.2" +strum_macros = "0.27.2" +sysinfo = "0.38.3" +tokio = { version = "1.50.0", features = ["full"] } +tokio-tungstenite = { version = "*", features = ["native-tls"] } +tungstenite = "*" +uuid = { version = "*", features = ["v4"] } +walkdir = "2.5.0" +warp = "*" +x448 = { version = "*" } +zip = "6.0.0" diff --git a/iota-cli/src/app_state.rs b/iota-cli/src/app_state.rs new file mode 100755 index 0000000..cfb4b3b --- /dev/null +++ b/iota-cli/src/app_state.rs @@ -0,0 +1 @@ +pub use iota_state::*; diff --git a/src/gui/elements/console_card.rs b/iota-cli/src/elements/console_card.rs similarity index 100% rename from src/gui/elements/console_card.rs rename to iota-cli/src/elements/console_card.rs diff --git a/src/gui/elements/elements.rs b/iota-cli/src/elements/elements.rs similarity index 100% rename from src/gui/elements/elements.rs rename to iota-cli/src/elements/elements.rs diff --git a/src/gui/elements/graph_card.rs b/iota-cli/src/elements/graph_card.rs similarity index 100% rename from src/gui/elements/graph_card.rs rename to iota-cli/src/elements/graph_card.rs diff --git a/src/gui/elements/log_card.rs b/iota-cli/src/elements/log_card.rs similarity index 100% rename from src/gui/elements/log_card.rs rename to iota-cli/src/elements/log_card.rs diff --git a/src/gui/input_handler.rs b/iota-cli/src/input_handler.rs similarity index 98% rename from src/gui/input_handler.rs rename to iota-cli/src/input_handler.rs index b2557c5..92b899c 100644 --- a/src/gui/input_handler.rs +++ b/iota-cli/src/input_handler.rs @@ -1,4 +1,4 @@ -use crate::gui::ui::{UI, UNIQUE}; +use crate::ui::{UI, UNIQUE}; use crate::{RELOAD, SHUTDOWN}; use crossterm::event::{Event, KeyEvent, KeyEventKind, KeyModifiers, poll, read}; use std::sync::Arc; diff --git a/src/gui/interaction_result.rs b/iota-cli/src/interaction_result.rs similarity index 97% rename from src/gui/interaction_result.rs rename to iota-cli/src/interaction_result.rs index 462149a..f9ba7e0 100644 --- a/src/gui/interaction_result.rs +++ b/iota-cli/src/interaction_result.rs @@ -2,7 +2,7 @@ use std::fmt::{Debug, Formatter}; use std::future::Future; use std::pin::Pin; -use crate::gui::screens::screens::Screen; +use crate::screens::screens::Screen; #[allow(unused)] pub enum InteractionResult { diff --git a/src/langu/language_creator.rs b/iota-cli/src/langu/language_creator.rs similarity index 100% rename from src/langu/language_creator.rs rename to iota-cli/src/langu/language_creator.rs diff --git a/src/langu/language_manager.rs b/iota-cli/src/langu/language_manager.rs similarity index 100% rename from src/langu/language_manager.rs rename to iota-cli/src/langu/language_manager.rs diff --git a/src/langu/mod.rs b/iota-cli/src/langu/mod.rs similarity index 100% rename from src/langu/mod.rs rename to iota-cli/src/langu/mod.rs diff --git a/src/gui/mod.rs b/iota-cli/src/lib.rs similarity index 100% rename from src/gui/mod.rs rename to iota-cli/src/lib.rs diff --git a/src/gui/screens/main_screen.rs b/iota-cli/src/screens/main_screen.rs similarity index 99% rename from src/gui/screens/main_screen.rs rename to iota-cli/src/screens/main_screen.rs index 85dbbaa..e10947d 100644 --- a/src/gui/screens/main_screen.rs +++ b/iota-cli/src/screens/main_screen.rs @@ -1,4 +1,4 @@ -use crate::gui::{ +use crate::{ elements::{ console_card::ConsoleCard, elements::{InteractableElement, JoinableElement}, diff --git a/src/gui/screens/md_viewer.rs b/iota-cli/src/screens/md_viewer.rs similarity index 99% rename from src/gui/screens/md_viewer.rs rename to iota-cli/src/screens/md_viewer.rs index 10eabce..2faa2f1 100644 --- a/src/gui/screens/md_viewer.rs +++ b/iota-cli/src/screens/md_viewer.rs @@ -7,7 +7,7 @@ use ratatui::{ }; use std::{any::Any, time::Duration}; -use crate::gui::{interaction_result::InteractionResult, screens::screens::Screen}; +use crate::{interaction_result::InteractionResult, screens::screens::Screen}; pub struct FileViewer { title: String, diff --git a/src/gui/screens/screens.rs b/iota-cli/src/screens/screens.rs similarity index 89% rename from src/gui/screens/screens.rs rename to iota-cli/src/screens/screens.rs index 9676fbb..7606521 100644 --- a/src/gui/screens/screens.rs +++ b/iota-cli/src/screens/screens.rs @@ -3,7 +3,7 @@ use std::any::Any; use crossterm::event::KeyEvent; use ratatui::{Frame, layout::Rect}; -use crate::gui::interaction_result::InteractionResult; +use crate::interaction_result::InteractionResult; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum NavDirection { diff --git a/src/gui/screens/terms_checker.rs b/iota-cli/src/screens/terms_checker.rs similarity index 97% rename from src/gui/screens/terms_checker.rs rename to iota-cli/src/screens/terms_checker.rs index 26bb7c6..0808ac5 100644 --- a/src/gui/screens/terms_checker.rs +++ b/iota-cli/src/screens/terms_checker.rs @@ -1,15 +1,7 @@ use crate::{ - gui::{ - interaction_result::InteractionResult, - screens::{md_viewer::FileViewer, screens::Screen}, - ui::UI, - }, - terms::{ - buttons::{checkbox, draw_buttons}, - consent_state::UserChoice, - focus::Focus, - terms_getter::{Type, get_link, get_terms}, - }, + interaction_result::InteractionResult, + screens::{md_viewer::FileViewer, screens::Screen}, + ui::UI, }; use crossterm::event::{KeyCode, KeyEvent}; use ratatui::{ diff --git a/src/gui/screens/terms_updater.rs b/iota-cli/src/screens/terms_updater.rs similarity index 98% rename from src/gui/screens/terms_updater.rs rename to iota-cli/src/screens/terms_updater.rs index 35da364..909da8d 100644 --- a/src/gui/screens/terms_updater.rs +++ b/iota-cli/src/screens/terms_updater.rs @@ -1,15 +1,6 @@ use crate::{ - gui::{ - interaction_result::InteractionResult, - screens::{md_viewer::FileViewer, screens::Screen}, - }, - terms::{ - buttons::{checkbox, draw_buttons}, - consent_state::{UpdateDecision, UserChoice}, - doc::Doc, - focus::Focus, - terms_getter::{Type, get_newest_link, get_terms}, - }, + interaction_result::InteractionResult, + screens::{md_viewer::FileViewer, screens::Screen}, }; use chrono::{Local, TimeZone, Utc}; use crossterm::event::{KeyCode, KeyEvent}; diff --git a/iota-cli/src/tui.rs b/iota-cli/src/tui.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/gui/ui.rs b/iota-cli/src/ui.rs similarity index 96% rename from src/gui/ui.rs rename to iota-cli/src/ui.rs index 5903a4b..71e9847 100644 --- a/src/gui/ui.rs +++ b/iota-cli/src/ui.rs @@ -1,9 +1,6 @@ use crate::{ - ACTIVE_TASKS, SHUTDOWN, - gui::{ - input_handler::setup_input_handler, interaction_result::InteractionResult, - screens::screens::Screen, - }, + input_handler::setup_input_handler, interaction_result::InteractionResult, + screens::screens::Screen, }; use crossterm::event::KeyEvent; use once_cell::sync::Lazy; diff --git a/src/gui/util/borders.rs b/iota-cli/src/util/borders.rs similarity index 100% rename from src/gui/util/borders.rs rename to iota-cli/src/util/borders.rs diff --git a/iota-core/Cargo.toml b/iota-core/Cargo.toml new file mode 100644 index 0000000..7db34a2 --- /dev/null +++ b/iota-core/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "iota-core" +version = "0.1.0" +edition = "2024" + +[dependencies] +iota-state = { path = "../iota-state" } +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +dashmap = "6.1.0" +json = "*" +once_cell = "1.21.3" +pnet = "0.35.0" +ratatui = "0.30.0" +reqwest = "0.13.2" +tokio = { version = "1.50.0", features = ["full"] } diff --git a/src/main.rs b/iota-core/src/main.rs similarity index 81% rename from src/main.rs rename to iota-core/src/main.rs index 767106f..f8f4847 100644 --- a/src/main.rs +++ b/iota-core/src/main.rs @@ -1,39 +1,7 @@ -use dashmap::DashSet; -use once_cell::sync::Lazy; use pnet::datalink::NetworkInterface; -use std::sync::Arc; -use std::sync::LazyLock; -use std::sync::Mutex; -use tokio::sync::RwLock; use tokio::time::{Duration, sleep}; -mod auth; -mod gui; -mod langu; -mod omikron; -mod terms; -mod users; -mod util; - -use crate::gui::app_state; -use crate::gui::app_state::AppState; -use crate::gui::screens::main_screen::MainScreen; -use crate::gui::ui::start_tui; -use crate::langu::language_creator; -use crate::omikron::omikron_connection::OmikronConnection; -use crate::terms::consent_state; -use crate::users::user_manager; -use crate::util::config_util::CONFIG; -use crate::util::file_util::download_and_extract_zip; -use crate::util::file_util::has_dir; -use crate::util::logger; - -pub static APP_STATE: LazyLock>> = - LazyLock::new(|| Arc::new(Mutex::new(AppState::new()))); - -pub static SHUTDOWN: Lazy> = Lazy::new(|| RwLock::new(false)); -pub static RELOAD: Lazy> = Lazy::new(|| RwLock::new(true)); -pub static ACTIVE_TASKS: Lazy> = Lazy::new(|| DashSet::new()); +use iota_state::{ACTIVE_TASKS, APP_STATE, AppState, RELOAD, SHUTDOWN}; #[tokio::main(flavor = "multi_thread", worker_threads = 16)] #[allow(unused_must_use, dead_code)] @@ -73,7 +41,7 @@ async fn main() { println!("You can find this at 'agreements'!"); return; } - app_state::setup(); + iota_state::setup(); let main_screen = MainScreen::new(ui.clone()).await; ui.set_screen(Box::new(main_screen)).await; diff --git a/src/terms/buttons.rs b/iota-core/src/terms/buttons.rs similarity index 100% rename from src/terms/buttons.rs rename to iota-core/src/terms/buttons.rs diff --git a/src/terms/doc.rs b/iota-core/src/terms/doc.rs similarity index 100% rename from src/terms/doc.rs rename to iota-core/src/terms/doc.rs diff --git a/src/terms/focus.rs b/iota-core/src/terms/focus.rs similarity index 100% rename from src/terms/focus.rs rename to iota-core/src/terms/focus.rs diff --git a/src/terms/mod.rs b/iota-core/src/terms/mod.rs similarity index 74% rename from src/terms/mod.rs rename to iota-core/src/terms/mod.rs index 4a11008..947fc13 100644 --- a/src/terms/mod.rs +++ b/iota-core/src/terms/mod.rs @@ -1,5 +1,4 @@ pub mod buttons; -pub mod consent_state; pub mod doc; pub mod focus; pub mod terms_getter; diff --git a/src/terms/terms_getter.rs b/iota-core/src/terms/terms_getter.rs similarity index 100% rename from src/terms/terms_getter.rs rename to iota-core/src/terms/terms_getter.rs diff --git a/iota-logger/Cargo.toml b/iota-logger/Cargo.toml new file mode 100644 index 0000000..a07b745 --- /dev/null +++ b/iota-logger/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "iota-logger" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/iota-logger/src/lib.rs b/iota-logger/src/lib.rs new file mode 100644 index 0000000..b93cf3f --- /dev/null +++ b/iota-logger/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/iota-state/Cargo.toml b/iota-state/Cargo.toml new file mode 100644 index 0000000..eff1cb7 --- /dev/null +++ b/iota-state/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "iota-state" +version = "0.1.0" +edition = "2024" + +[dependencies] +dashmap = "6.1.0" +once_cell = "1.21.3" +tokio = { version = "1.50.0", features = ["full"] } +json = "*" +sysinfo = "0.38.3" +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } diff --git a/src/gui/app_state.rs b/iota-state/src/lib.rs old mode 100755 new mode 100644 similarity index 76% rename from src/gui/app_state.rs rename to iota-state/src/lib.rs index a161226..5d8d351 --- a/src/gui/app_state.rs +++ b/iota-state/src/lib.rs @@ -1,7 +1,33 @@ -use crate::{ACTIVE_TASKS, APP_STATE, SHUTDOWN, gui::elements::log_card::UiLogEntry}; +use dashmap::DashSet; use json::{JsonValue, object}; -use std::{collections::VecDeque, thread, time::Duration}; +use once_cell::sync::Lazy; +use std::collections::VecDeque; +use std::sync::{Arc, LazyLock, Mutex}; +use std::thread; +use std::time::Duration; use sysinfo::{RefreshKind, System}; +use tokio::sync::RwLock; + +pub const MAX_POINTS: usize = 1000; +pub const MAX_LOGS: usize = 100; + +#[derive(Clone, Debug)] +pub struct UiLogEntry { + pub timestamp_ms: u128, + pub sender: String, + pub message: String, + pub is_error: bool, +} + +impl UiLogEntry { + pub fn format_timestamp(&self) -> String { + let secs = (self.timestamp_ms / 1000) as i64; + let hours = (secs / 3600) % 24; + let minutes = (secs / 60) % 60; + let seconds = secs % 60; + format!("{:02}:{:02}:{:02}", hours, minutes, seconds) + } +} #[derive(Clone)] pub struct AppState { @@ -13,8 +39,6 @@ pub struct AppState { pub net_down: Vec<(f64, f64)>, pub sys_info: String, } -const MAX_POINTS: usize = 1000; -const MAX_LOGS: usize = 100; impl AppState { pub fn new() -> Self { @@ -74,34 +98,17 @@ impl AppState { self.net_down.remove(0); } } + pub fn to_json(&self) -> JsonValue { - let json = object! { - "cpu" => self.cpu - .iter() - .map(|(_, y)| *y) - .collect::>(), - "ram" => self.ram - .iter() - .map(|(_, y)| *y) - .collect::>(), - "ping" => self - .ping - .iter() - .map(|(_, y)| *y) - .collect::>(), - "net_up" => self - .net_up - .iter() - .map(|(_, y)| *y) - .collect::>(), - "net_down" => self - .net_down - .iter() - .map(|(_, y)| *y) - .collect::>(), - }; - json + object! { + "cpu" => self.cpu.iter().map(|(_, y)| *y).collect::>(), + "ram" => self.ram.iter().map(|(_, y)| *y).collect::>(), + "ping" => self.ping.iter().map(|(_, y)| *y).collect::>(), + "net_up" => self.net_up.iter().map(|(_, y)| *y).collect::>(), + "net_down" => self.net_down.iter().map(|(_, y)| *y).collect::>(), + } } + pub fn with_width(&self, width: u16) -> Self { let mut new = self.clone(); new.cpu = Self::downsample_to_fit_width(&new.cpu, width); @@ -128,10 +135,9 @@ impl AppState { .first() .map(|(x, _)| x - (dx * pad_len as f64)) .unwrap_or(0.0); - let _ = data.first().map(|(_, y)| *y).unwrap_or(0.0); for i in 0..pad_len { - result.push((start_x + i as f64 * dx, -1 as f64)); + result.push((start_x + i as f64 * dx, -1.0)); } result.extend_from_slice(data); @@ -140,6 +146,13 @@ impl AppState { } } +pub static APP_STATE: LazyLock>> = + LazyLock::new(|| Arc::new(Mutex::new(AppState::new()))); + +pub static SHUTDOWN: Lazy> = Lazy::new(|| RwLock::new(false)); +pub static RELOAD: Lazy> = Lazy::new(|| RwLock::new(true)); +pub static ACTIVE_TASKS: Lazy> = Lazy::new(|| DashSet::new()); + pub fn setup() { ACTIVE_TASKS.insert("System info loader".to_string()); tokio::spawn(async move { diff --git a/iota-storage/Cargo.toml b/iota-storage/Cargo.toml new file mode 100644 index 0000000..b62ac11 --- /dev/null +++ b/iota-storage/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "iota-storage" +version = "0.1.0" +edition = "2024" + +[dependencies] +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +aes-gcm = "0.10.3" +base64 = "0.22.1" +hex = "*" +hkdf = "0.12.4" +json = "*" +once_cell = "1.21.3" +rand = "0.8" +rand_core = { version = "0.6", features = ["getrandom", "std"] } +ratatui = "0.30.0" +reqwest = "0.13.2" +rusqlite = "0.39.0" +sha2 = "0.10.9" +sysinfo = "0.38.3" +tokio = { version = "1.50.0", features = ["full"] } +uuid = { version = "*", features = ["v4"] } +walkdir = "2.5.0" +x448 = { version = "*" } +zip = "6.0.0" diff --git a/iota-storage/src/lib.rs b/iota-storage/src/lib.rs new file mode 100644 index 0000000..778de0f --- /dev/null +++ b/iota-storage/src/lib.rs @@ -0,0 +1,2 @@ +mod users; +mod util; diff --git a/src/users/contact.rs b/iota-storage/src/users/contact.rs similarity index 100% rename from src/users/contact.rs rename to iota-storage/src/users/contact.rs diff --git a/src/users/mod.rs b/iota-storage/src/users/mod.rs similarity index 100% rename from src/users/mod.rs rename to iota-storage/src/users/mod.rs diff --git a/src/users/user_community_util.rs b/iota-storage/src/users/user_community_util.rs similarity index 100% rename from src/users/user_community_util.rs rename to iota-storage/src/users/user_community_util.rs diff --git a/src/users/user_manager.rs b/iota-storage/src/users/user_manager.rs similarity index 100% rename from src/users/user_manager.rs rename to iota-storage/src/users/user_manager.rs diff --git a/src/users/user_profile.rs b/iota-storage/src/users/user_profile.rs similarity index 100% rename from src/users/user_profile.rs rename to iota-storage/src/users/user_profile.rs diff --git a/src/util/chat_files.rs b/iota-storage/src/util/chat_files.rs similarity index 100% rename from src/util/chat_files.rs rename to iota-storage/src/util/chat_files.rs diff --git a/src/util/chats_util.rs b/iota-storage/src/util/chats_util.rs similarity index 100% rename from src/util/chats_util.rs rename to iota-storage/src/util/chats_util.rs diff --git a/src/util/communities_util.rs b/iota-storage/src/util/communities_util.rs similarity index 100% rename from src/util/communities_util.rs rename to iota-storage/src/util/communities_util.rs diff --git a/src/util/config_util.rs b/iota-storage/src/util/config_util.rs similarity index 100% rename from src/util/config_util.rs rename to iota-storage/src/util/config_util.rs diff --git a/src/util/crypto_helper.rs b/iota-storage/src/util/crypto_helper.rs similarity index 100% rename from src/util/crypto_helper.rs rename to iota-storage/src/util/crypto_helper.rs diff --git a/src/util/crypto_util.rs b/iota-storage/src/util/crypto_util.rs similarity index 100% rename from src/util/crypto_util.rs rename to iota-storage/src/util/crypto_util.rs diff --git a/src/util/db.rs b/iota-storage/src/util/db.rs similarity index 100% rename from src/util/db.rs rename to iota-storage/src/util/db.rs diff --git a/src/util/file_util.rs b/iota-storage/src/util/file_util.rs similarity index 100% rename from src/util/file_util.rs rename to iota-storage/src/util/file_util.rs diff --git a/src/util/logger.rs b/iota-storage/src/util/logger.rs similarity index 100% rename from src/util/logger.rs rename to iota-storage/src/util/logger.rs diff --git a/src/util/mod.rs b/iota-storage/src/util/mod.rs similarity index 100% rename from src/util/mod.rs rename to iota-storage/src/util/mod.rs diff --git a/omikron-connector/Cargo.toml b/omikron-connector/Cargo.toml new file mode 100644 index 0000000..89aa2d4 --- /dev/null +++ b/omikron-connector/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "omikron-connector" +version = "0.1.0" +edition = "2024" + +[dependencies] +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +dashmap = "6.1.0" +json = "*" +tokio = { version = "1.50.0", features = ["full"] } +uuid = { version = "*", features = ["v4"] } diff --git a/src/omikron/mod.rs b/omikron-connector/src/lib.rs similarity index 100% rename from src/omikron/mod.rs rename to omikron-connector/src/lib.rs diff --git a/src/omikron/omikron_connection.rs b/omikron-connector/src/omikron_connection.rs similarity index 100% rename from src/omikron/omikron_connection.rs rename to omikron-connector/src/omikron_connection.rs diff --git a/src/omikron/ping_pong_task.rs b/omikron-connector/src/ping_pong_task.rs similarity index 100% rename from src/omikron/ping_pong_task.rs rename to omikron-connector/src/ping_pong_task.rs diff --git a/src/terms/consent_state.rs b/src/terms/consent_state.rs deleted file mode 100644 index 1cc6e0a..0000000 --- a/src/terms/consent_state.rs +++ /dev/null @@ -1,491 +0,0 @@ -use tokio::sync::oneshot; - -use crate::{ - gui::{ - screens::{terms_checker::TermsCheckerScreen, terms_updater::TermsUpdaterScreen}, - ui::UI, - }, - terms::{ - doc::Doc, - terms_getter::{Type, get_current_docs, get_newest_docs}, - }, - util::file_util::{load_file, save_file}, -}; -use std::sync::Arc; -use std::time::{SystemTime, UNIX_EPOCH}; - -pub async fn check(ui: Arc) -> (bool, bool) { - let mut state = ConsentState::load_state(); - - if ensure_initial_consent(ui.clone(), &mut state) - .await - .is_err() - { - return (false, false); - } - if ensure_updates(ui, &mut state).await.is_err() { - return (false, false); - }; - - state = state.sanitize(); - state.save_state(); - - (state.accepted_eula, state.accepted_tos && state.accepted_pp) -} - -async fn ensure_initial_consent(ui: Arc, state: &mut ConsentState) -> Result<(), ()> { - if state.accepted_eula { - return Ok(()); - } - - let (tx, rx) = oneshot::channel(); - - ui.set_screen(Box::new(TermsCheckerScreen::new(ui.clone(), Some(tx)))) - .await; - - let result = rx.await.unwrap_or(UserChoice::Deny); - - match result { - UserChoice::AcceptEULA | UserChoice::AcceptAll => { - if let Some((eula, tos, privacy)) = get_current_docs().await { - state.accepted_eula = true; - state.eula = Some(eula); - - if matches!(result, UserChoice::AcceptAll) { - state.accepted_tos = true; - state.accepted_pp = true; - state.tos = Some(tos); - state.privacy = Some(privacy); - } - } - - let _ = &state.save_state(); - Ok(()) - } - UserChoice::Deny => Err(()), - } -} -async fn ensure_updates(ui: Arc, state: &mut ConsentState) -> Result<(), ()> { - let Some((eula_update, tos_update, privacy_update)) = get_updates().await else { - return Ok(()); - }; - - let is_forced = matches!(eula_update, UpdateDecision::Forced(_)) - || matches!(tos_update, UpdateDecision::Forced(_)) - || matches!(privacy_update, UpdateDecision::Forced(_)); - - let (tx, rx) = oneshot::channel(); - - ui.set_screen(Box::new(TermsUpdaterScreen::new( - eula_update.clone(), - tos_update.clone(), - privacy_update.clone(), - Some(tx), - ))) - .await; - - let result = rx.await.unwrap_or(UserChoice::Deny); - - if is_forced { - match result { - UserChoice::AcceptAll => { - state.accepted_eula = true; - state.accepted_tos = true; - state.accepted_pp = true; - } - UserChoice::AcceptEULA => { - state.accepted_eula = true; - } - UserChoice::Deny => return Err(()), - } - } else { - apply_future_updates(state, result, eula_update, tos_update, privacy_update); - } - - state.save_state(); - Ok(()) -} -fn apply_future_updates( - state: &mut ConsentState, - result: UserChoice, - eula_update: UpdateDecision, - tos_update: UpdateDecision, - privacy_update: UpdateDecision, -) { - match result { - UserChoice::AcceptAll => { - if let UpdateDecision::Future { newest } = eula_update { - state.future_eula = Some(newest); - } - if let UpdateDecision::Future { newest } = tos_update { - state.future_tos = Some(newest); - } - if let UpdateDecision::Future { newest } = privacy_update { - state.future_privacy = Some(newest); - } - } - UserChoice::AcceptEULA => { - if let UpdateDecision::Future { newest } = eula_update { - state.future_eula = Some(newest); - } - } - UserChoice::Deny => {} - } -} - -async fn get_updates() -> Option<( - // Ok(None) indicates no update - // Ok(Some) Indicates a future update - // Err indicates a update that has to be accepted before the programm can continue - UpdateDecision, - UpdateDecision, - UpdateDecision, -)> { - if let ( - Some((current_eula, current_tos, current_privacy)), - Some((newest_eula, newest_tos, newest_privacy)), - ) = (get_current_docs().await, get_newest_docs().await) - { - let file = load_file("", "agreements"); - let accepted_state = ConsentState::from_str(&file).sanitize(); - save_file("", "agreements", &accepted_state.to_string()); - - let eula_update: UpdateDecision = if current_eula.equals_some(&accepted_state.eula) { - if current_eula.equals(&newest_eula) { - UpdateDecision::NoChange - } else { - if newest_eula.equals_some(&accepted_state.future_eula) { - UpdateDecision::NoChange - } else { - UpdateDecision::Future { - newest: newest_eula, - } - } - } - } else if newest_eula.equals_some(&accepted_state.eula) { - UpdateDecision::NoChange - } else { - UpdateDecision::Forced(current_eula) - }; - - let tos_update: UpdateDecision = - if !accepted_state.accepted_tos || newest_tos.equals_some(&accepted_state.tos) { - UpdateDecision::NoChange - } else if accepted_state.accepted_tos && current_tos.equals_some(&accepted_state.tos) { - if current_tos.equals(&newest_tos) { - UpdateDecision::NoChange - } else { - if newest_tos.equals_some(&accepted_state.future_tos) { - UpdateDecision::NoChange - } else { - UpdateDecision::Future { newest: newest_tos } - } - } - } else { - UpdateDecision::Forced(current_tos) - }; - - let privacy_update: UpdateDecision = if !accepted_state.accepted_pp - || newest_privacy.equals_some(&accepted_state.privacy) - { - UpdateDecision::NoChange - } else if accepted_state.accepted_pp && current_privacy.equals_some(&accepted_state.privacy) - { - if current_privacy.equals(&newest_privacy) { - UpdateDecision::NoChange - } else { - if newest_privacy.equals_some(&accepted_state.future_privacy) { - UpdateDecision::NoChange - } else { - UpdateDecision::Future { - newest: newest_privacy, - } - } - } - } else { - UpdateDecision::Forced(current_privacy) - }; - match (&eula_update, &tos_update, &privacy_update) { - (&UpdateDecision::NoChange, &UpdateDecision::NoChange, &UpdateDecision::NoChange) => { - None - } - _ => Some((eula_update, tos_update, privacy_update)), - } - } else { - None - } -} - -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum UserChoice { - Deny, - AcceptEULA, - AcceptAll, -} - -#[derive(Debug, Clone, PartialEq)] -pub enum UpdateDecision { - NoChange, - Future { newest: Doc }, - Forced(Doc), -} - -#[derive(Debug, Clone)] -pub struct ConsentState { - pub eula: Option, - pub accepted_eula: bool, - pub future_eula: Option, - - pub tos: Option, - pub accepted_tos: bool, - pub future_tos: Option, - - pub privacy: Option, - pub accepted_pp: bool, - pub future_privacy: Option, -} - -impl ConsentState { - fn sanitize(mut self) -> Self { - let current_secs = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs(); - - if let Some(future_eula) = self.future_eula.clone() { - if future_eula.get_time() < current_secs { - self.eula = Some(future_eula); - self.future_eula = None; - } - } - if let Some(future_tos) = self.future_tos.clone() { - if future_tos.get_time() < current_secs { - self.tos = Some(future_tos); - self.future_tos = None; - } - } - if let Some(future_privacy) = self.future_privacy.clone() { - if future_privacy.get_time() < current_secs { - self.privacy = Some(future_privacy); - self.future_privacy = None; - } - } - - if !self.accepted_eula { - self.accepted_tos = false; - self.accepted_pp = false; - } - self - } - - pub fn load_state() -> ConsentState { - let file = load_file("", "agreements"); - ConsentState::from_str(&file).sanitize() - } - - pub fn save_state(&self) { - save_file("", "agreements", &self.to_string()); - } - - fn to_string(&self) -> String { - let current_secs = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs(); - - let mut file_out: String = format!( - "This file reflects the current consent state used by the application.\ - \nIt may be regenerated or overwritten by the application.\ - \nThis file was last edited by Tensamin at:\ - \nUNIX-SECOND={}", - current_secs - ); - - if let Some(eula) = &self.eula { - file_out.push_str(&format!("\ - \n\"EULA=true\" indicates that you read, understood and accepted Tensamin's End User Licence agreement. You can find our EULA at https://legal.tensamin.net/eula/\ - \nEULA={}\ - \nEULA-VERSION={}\ - \nEULA-HASH={}\ - ", self.accepted_eula, eula.get_version(), eula.get_hash())); - - if self.accepted_tos - && let Some(tos) = &self.tos - { - file_out.push_str(&format!("\ - \n\"Terms-of-Service=true\" indicates that you read, understood and accepted Tensamin's Terms of Service. You can find our Terms of Serivce at https://legal.tensamin.net/tos/\ - \nTerms-of-Service={}\ - \nTerms-of-Service-VERSION={}\ - \nTerms-of-Service-HASH={}\ - ", self.accepted_tos, tos.get_version(), tos.get_hash())); - } - if self.accepted_pp - && let Some(pp) = &self.privacy - { - file_out.push_str(&format!("\ - \n\"Privacy-Policy=true\" indicates that you read, understood and accepted Tensamin's Privacy Policy. You can find our Privacy Policy at https://legal.tensamin.net/privacy/\ - \nPrivacy-Policy={}\ - \nPrivacy-Policy-VERSION={}\ - \nPrivacy-Policy-HASH={}\ - ", self.accepted_pp, pp.get_version(), pp.get_hash())); - } - } else { - file_out.push_str("\ - \n\"EULA=true\" indicates that you read, understood and accepted Tensamin's End User Licence Agreement. You can find Tensamin's EULA at https://legal.tensamin.net/eula/\ - \nEULA=false\ - "); - } - - if let Some(eula) = &self.future_eula { - file_out.push_str(&format!( - "\ - \nFUTURE-EULA-VERSION={}\ - \nFUTURE-EULA-HASH={}\ - \nFUTURE-EULA-TIME={}\ - ", - eula.get_version(), - eula.get_hash(), - eula.get_time() - )); - } - if let Some(tos) = &self.future_tos { - file_out.push_str(&format!( - "\ - \nFUTURE-Terms-of-Service-VERSION={}\ - \nFUTURE-Terms-of-Service-HASH={}\ - \nFUTURE-Terms-of-Service-TIME={}\ - ", - tos.get_version(), - tos.get_hash(), - tos.get_time() - )); - } - if let Some(pp) = &self.future_privacy { - file_out.push_str(&format!( - "\ - \nFUTURE-Privacy-Policy-VERSION={}\ - \nFUTURE-Privacy-Policy-HASH={}\ - \nFUTURE-Privacy-Policy-TIME={}\ - ", - pp.get_version(), - pp.get_hash(), - pp.get_time() - )); - } - - file_out - } - - fn from_str(s: &str) -> Self { - let mut eula = false; - let mut eula_version = String::new(); - let mut eula_hash = String::new(); - let mut pp = false; - let mut pp_version = String::new(); - let mut pp_hash = String::new(); - let mut tos = false; - let mut tos_version = String::new(); - let mut tos_hash = String::new(); - - let mut future_eula_version = String::new(); - let mut future_eula_hash = String::new(); - let mut future_eula_time = String::new(); - - let mut future_tos_version = String::new(); - let mut future_tos_hash = String::new(); - let mut future_tos_time = String::new(); - - let mut future_pp_version = String::new(); - let mut future_pp_hash = String::new(); - let mut future_pp_time = String::new(); - - let mut unix = String::new(); - - for line in s.lines() { - if let Some(v) = line.strip_prefix("EULA=") { - eula = v == "true"; - } else if let Some(v) = line.strip_prefix("EULA-VERSION=") { - eula_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("EULA-HASH=") { - eula_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("Terms-of-Service=") { - tos = v == "true"; - } else if let Some(v) = line.strip_prefix("Terms-of-Service-VERSION=") { - tos_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("Terms-of-Service-HASH=") { - tos_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("Privacy-Policy=") { - pp = v == "true"; - } else if let Some(v) = line.strip_prefix("Privacy-Policy-VERSION=") { - pp_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("Privacy-Policy-HASH=") { - pp_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("UNIX-SECOND=") { - unix = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-EULA-VERSION=") { - future_eula_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-EULA-HASH=") { - future_eula_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-EULA-TIME=") { - future_eula_time = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Terms-of-Service-VERSION=") { - future_tos_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Terms-of-Service-HASH=") { - future_tos_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Terms-of-Service-TIME=") { - future_tos_time = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Privacy-Policy-VERSION=") { - future_pp_version = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Privacy-Policy-HASH=") { - future_pp_hash = v.to_string(); - } else if let Some(v) = line.strip_prefix("FUTURE-Privacy-Policy-TIME=") { - future_pp_time = v.to_string(); - } - } - let unix: u64 = unix.parse::().unwrap_or(0); - let future_eula_time = future_eula_time.parse::().unwrap_or(0); - let future_tos_time = future_tos_time.parse::().unwrap_or(0); - let future_pp_time = future_pp_time.parse::().unwrap_or(0); - let state = Self { - accepted_eula: eula, - eula: Some(Doc::new(eula_version, eula_hash, Type::EULA, unix)), - accepted_pp: pp, - privacy: Some(Doc::new(pp_version, pp_hash, Type::PP, unix)), - accepted_tos: tos, - tos: Some(Doc::new(tos_version, tos_hash, Type::TOS, unix)), - future_eula: if !future_eula_version.is_empty() { - Some(Doc::new( - future_eula_version, - future_eula_hash, - Type::EULA, - future_eula_time, - )) - } else { - None - }, - future_tos: if !future_tos_version.is_empty() { - Some(Doc::new( - future_tos_version, - future_tos_hash, - Type::TOS, - future_tos_time, - )) - } else { - None - }, - future_privacy: if !future_pp_version.is_empty() { - Some(Doc::new( - future_pp_version, - future_pp_hash, - Type::PP, - future_pp_time, - )) - } else { - None - }, - } - .sanitize(); - - state - } -} diff --git a/web-server/Cargo.toml b/web-server/Cargo.toml new file mode 100644 index 0000000..fdeeb44 --- /dev/null +++ b/web-server/Cargo.toml @@ -0,0 +1,9 @@ + +[package] +name = "iota" +version = "0.1.0" +edition = "2024" + +[dependencies] +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } diff --git a/web-server/src/lib.rs b/web-server/src/lib.rs new file mode 100644 index 0000000..e69de29 diff --git a/web-ui/Cargo.toml b/web-ui/Cargo.toml new file mode 100644 index 0000000..4d2ef71 --- /dev/null +++ b/web-ui/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "web-ui" +version = "0.1.0" +edition = "2024" + +[dependencies] +ttp-core = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-core" } +ttp-native = { git = "https://github.com/Tensamin/TTP.git", package = "ttp-native" } + +actix-web = { version = "4", features = ["rustls-0_23"] } +actix-web-actors = "4" +aes-gcm = "0.10.3" +async-trait = "0.1.89" +base64 = "0.22.1" +chrono = "0.4.43" +crossterm = "*" +dashmap = "6.1.0" +futures = "*" +futures-util = "*" +hex = "*" +hkdf = "0.12.4" +hyper = { version = "1.8.1", features = [ + "capi", + "client", + "full", + "http1", + "http2", + "nightly", + "server", +] } +hyper-util = { version = "*" } +json = "*" +lazy_static = "1.5.0" +once_cell = "1.21.3" +open = "5.3.3" +pnet = "0.35.0" +rand = "0.8" +rand_core = { version = "0.6", features = ["getrandom", "std"] } +ratatui = "0.30.0" +reqwest = "0.13.2" +rusqlite = "0.39.0" +rustls = { version = "0.23.37", features = ["aws-lc-rs"] } +rustls-pemfile = "2.2.0" +serde_json = "1.0.149" +sha2 = "0.10.9" +strum = "0.27.2" +strum_macros = "0.27.2" +sysinfo = "0.38.3" +tokio = { version = "1.50.0", features = ["full"] } +tokio-tungstenite = { version = "*", features = ["native-tls"] } +tungstenite = "*" +uuid = { version = "*", features = ["v4"] } +walkdir = "2.5.0" +warp = "*" +x448 = { version = "*" } +zip = "6.0.0" diff --git a/src/server/api.rs b/web-ui/src/api.rs similarity index 100% rename from src/server/api.rs rename to web-ui/src/api.rs diff --git a/src/server/mod.rs b/web-ui/src/lib.rs similarity index 100% rename from src/server/mod.rs rename to web-ui/src/lib.rs diff --git a/src/server/server.rs b/web-ui/src/server.rs similarity index 100% rename from src/server/server.rs rename to web-ui/src/server.rs diff --git a/src/server/web_path_parser.rs b/web-ui/src/web_path_parser.rs similarity index 100% rename from src/server/web_path_parser.rs rename to web-ui/src/web_path_parser.rs