[Add] basic split
This commit is contained in:
parent
a0ff6b1082
commit
3cdf7c62d5
77 changed files with 506 additions and 648 deletions
177
Cargo.lock
generated
177
Cargo.lock
generated
|
|
@ -847,6 +847,53 @@ version = "2.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea"
|
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]]
|
[[package]]
|
||||||
name = "deflate64"
|
name = "deflate64"
|
||||||
version = "0.1.12"
|
version = "0.1.12"
|
||||||
|
|
@ -1028,9 +1075,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "2.3.0"
|
version = "2.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
checksum = "a043dc74da1e37d6afe657061213aa6f425f855399a11d3463c6ecccc4dfda1f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fiat-crypto"
|
name = "fiat-crypto"
|
||||||
|
|
@ -1723,6 +1770,14 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iota"
|
name = "iota"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"ttp-core",
|
||||||
|
"ttp-native",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iota-cli"
|
||||||
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-web",
|
"actix-web",
|
||||||
"actix-web-actors",
|
"actix-web-actors",
|
||||||
|
|
@ -1738,6 +1793,7 @@ dependencies = [
|
||||||
"hkdf",
|
"hkdf",
|
||||||
"hyper",
|
"hyper",
|
||||||
"hyper-util",
|
"hyper-util",
|
||||||
|
"iota-state",
|
||||||
"json",
|
"json",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
|
@ -1767,6 +1823,64 @@ dependencies = [
|
||||||
"zip",
|
"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]]
|
[[package]]
|
||||||
name = "ipnet"
|
name = "ipnet"
|
||||||
version = "2.12.0"
|
version = "2.12.0"
|
||||||
|
|
@ -2257,6 +2371,18 @@ dependencies = [
|
||||||
"asn1-rs",
|
"asn1-rs",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "omikron-connector"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"dashmap",
|
||||||
|
"json",
|
||||||
|
"tokio",
|
||||||
|
"ttp-core",
|
||||||
|
"ttp-native",
|
||||||
|
"uuid",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.21.4"
|
version = "1.21.4"
|
||||||
|
|
@ -4224,6 +4350,53 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"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]]
|
[[package]]
|
||||||
name = "webpki-root-certs"
|
name = "webpki-root-certs"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
|
|
|
||||||
58
Cargo.toml
58
Cargo.toml
|
|
@ -1,56 +1,2 @@
|
||||||
[package]
|
[workspace]
|
||||||
name = "iota"
|
members = ["iota-storage", "iota-state", "iota-cli", "iota-core", "omikron-connector", "web-server", "web-ui", "decentralized", "iota-logger"]
|
||||||
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"
|
|
||||||
|
|
|
||||||
56
decentralized/Cargo.toml
Normal file
56
decentralized/Cargo.toml
Normal file
|
|
@ -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"
|
||||||
57
iota-cli/Cargo.toml
Normal file
57
iota-cli/Cargo.toml
Normal file
|
|
@ -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"
|
||||||
1
iota-cli/src/app_state.rs
Executable file
1
iota-cli/src/app_state.rs
Executable file
|
|
@ -0,0 +1 @@
|
||||||
|
pub use iota_state::*;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::gui::ui::{UI, UNIQUE};
|
use crate::ui::{UI, UNIQUE};
|
||||||
use crate::{RELOAD, SHUTDOWN};
|
use crate::{RELOAD, SHUTDOWN};
|
||||||
use crossterm::event::{Event, KeyEvent, KeyEventKind, KeyModifiers, poll, read};
|
use crossterm::event::{Event, KeyEvent, KeyEventKind, KeyModifiers, poll, read};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
@ -2,7 +2,7 @@ use std::fmt::{Debug, Formatter};
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
|
||||||
use crate::gui::screens::screens::Screen;
|
use crate::screens::screens::Screen;
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub enum InteractionResult {
|
pub enum InteractionResult {
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::gui::{
|
use crate::{
|
||||||
elements::{
|
elements::{
|
||||||
console_card::ConsoleCard,
|
console_card::ConsoleCard,
|
||||||
elements::{InteractableElement, JoinableElement},
|
elements::{InteractableElement, JoinableElement},
|
||||||
|
|
@ -7,7 +7,7 @@ use ratatui::{
|
||||||
};
|
};
|
||||||
use std::{any::Any, time::Duration};
|
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 {
|
pub struct FileViewer {
|
||||||
title: String,
|
title: String,
|
||||||
|
|
@ -3,7 +3,7 @@ use std::any::Any;
|
||||||
use crossterm::event::KeyEvent;
|
use crossterm::event::KeyEvent;
|
||||||
use ratatui::{Frame, layout::Rect};
|
use ratatui::{Frame, layout::Rect};
|
||||||
|
|
||||||
use crate::gui::interaction_result::InteractionResult;
|
use crate::interaction_result::InteractionResult;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum NavDirection {
|
pub enum NavDirection {
|
||||||
|
|
@ -1,15 +1,7 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
gui::{
|
interaction_result::InteractionResult,
|
||||||
interaction_result::InteractionResult,
|
screens::{md_viewer::FileViewer, screens::Screen},
|
||||||
screens::{md_viewer::FileViewer, screens::Screen},
|
ui::UI,
|
||||||
ui::UI,
|
|
||||||
},
|
|
||||||
terms::{
|
|
||||||
buttons::{checkbox, draw_buttons},
|
|
||||||
consent_state::UserChoice,
|
|
||||||
focus::Focus,
|
|
||||||
terms_getter::{Type, get_link, get_terms},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use crossterm::event::{KeyCode, KeyEvent};
|
use crossterm::event::{KeyCode, KeyEvent};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
|
|
@ -1,15 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
gui::{
|
interaction_result::InteractionResult,
|
||||||
interaction_result::InteractionResult,
|
screens::{md_viewer::FileViewer, screens::Screen},
|
||||||
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},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use chrono::{Local, TimeZone, Utc};
|
use chrono::{Local, TimeZone, Utc};
|
||||||
use crossterm::event::{KeyCode, KeyEvent};
|
use crossterm::event::{KeyCode, KeyEvent};
|
||||||
0
iota-cli/src/tui.rs
Normal file
0
iota-cli/src/tui.rs
Normal file
|
|
@ -1,9 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
ACTIVE_TASKS, SHUTDOWN,
|
input_handler::setup_input_handler, interaction_result::InteractionResult,
|
||||||
gui::{
|
screens::screens::Screen,
|
||||||
input_handler::setup_input_handler, interaction_result::InteractionResult,
|
|
||||||
screens::screens::Screen,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
use crossterm::event::KeyEvent;
|
use crossterm::event::KeyEvent;
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
17
iota-core/Cargo.toml
Normal file
17
iota-core/Cargo.toml
Normal file
|
|
@ -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"] }
|
||||||
|
|
@ -1,39 +1,7 @@
|
||||||
use dashmap::DashSet;
|
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use pnet::datalink::NetworkInterface;
|
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};
|
use tokio::time::{Duration, sleep};
|
||||||
|
|
||||||
mod auth;
|
use iota_state::{ACTIVE_TASKS, APP_STATE, AppState, RELOAD, SHUTDOWN};
|
||||||
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<Arc<Mutex<AppState>>> =
|
|
||||||
LazyLock::new(|| Arc::new(Mutex::new(AppState::new())));
|
|
||||||
|
|
||||||
pub static SHUTDOWN: Lazy<RwLock<bool>> = Lazy::new(|| RwLock::new(false));
|
|
||||||
pub static RELOAD: Lazy<RwLock<bool>> = Lazy::new(|| RwLock::new(true));
|
|
||||||
pub static ACTIVE_TASKS: Lazy<DashSet<String>> = Lazy::new(|| DashSet::new());
|
|
||||||
|
|
||||||
#[tokio::main(flavor = "multi_thread", worker_threads = 16)]
|
#[tokio::main(flavor = "multi_thread", worker_threads = 16)]
|
||||||
#[allow(unused_must_use, dead_code)]
|
#[allow(unused_must_use, dead_code)]
|
||||||
|
|
@ -73,7 +41,7 @@ async fn main() {
|
||||||
println!("You can find this at 'agreements'!");
|
println!("You can find this at 'agreements'!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
app_state::setup();
|
iota_state::setup();
|
||||||
|
|
||||||
let main_screen = MainScreen::new(ui.clone()).await;
|
let main_screen = MainScreen::new(ui.clone()).await;
|
||||||
ui.set_screen(Box::new(main_screen)).await;
|
ui.set_screen(Box::new(main_screen)).await;
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
pub mod buttons;
|
pub mod buttons;
|
||||||
pub mod consent_state;
|
|
||||||
pub mod doc;
|
pub mod doc;
|
||||||
pub mod focus;
|
pub mod focus;
|
||||||
pub mod terms_getter;
|
pub mod terms_getter;
|
||||||
6
iota-logger/Cargo.toml
Normal file
6
iota-logger/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "iota-logger"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
14
iota-logger/src/lib.rs
Normal file
14
iota-logger/src/lib.rs
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
12
iota-state/Cargo.toml
Normal file
12
iota-state/Cargo.toml
Normal file
|
|
@ -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" }
|
||||||
77
src/gui/app_state.rs → iota-state/src/lib.rs
Executable file → Normal file
77
src/gui/app_state.rs → iota-state/src/lib.rs
Executable file → Normal file
|
|
@ -1,7 +1,33 @@
|
||||||
use crate::{ACTIVE_TASKS, APP_STATE, SHUTDOWN, gui::elements::log_card::UiLogEntry};
|
use dashmap::DashSet;
|
||||||
use json::{JsonValue, object};
|
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 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)]
|
#[derive(Clone)]
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
|
|
@ -13,8 +39,6 @@ pub struct AppState {
|
||||||
pub net_down: Vec<(f64, f64)>,
|
pub net_down: Vec<(f64, f64)>,
|
||||||
pub sys_info: String,
|
pub sys_info: String,
|
||||||
}
|
}
|
||||||
const MAX_POINTS: usize = 1000;
|
|
||||||
const MAX_LOGS: usize = 100;
|
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
|
|
@ -74,34 +98,17 @@ impl AppState {
|
||||||
self.net_down.remove(0);
|
self.net_down.remove(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_json(&self) -> JsonValue {
|
pub fn to_json(&self) -> JsonValue {
|
||||||
let json = object! {
|
object! {
|
||||||
"cpu" => self.cpu
|
"cpu" => self.cpu.iter().map(|(_, y)| *y).collect::<Vec<f64>>(),
|
||||||
.iter()
|
"ram" => self.ram.iter().map(|(_, y)| *y).collect::<Vec<f64>>(),
|
||||||
.map(|(_, y)| *y)
|
"ping" => self.ping.iter().map(|(_, y)| *y).collect::<Vec<f64>>(),
|
||||||
.collect::<Vec<f64>>(),
|
"net_up" => self.net_up.iter().map(|(_, y)| *y).collect::<Vec<f64>>(),
|
||||||
"ram" => self.ram
|
"net_down" => self.net_down.iter().map(|(_, y)| *y).collect::<Vec<f64>>(),
|
||||||
.iter()
|
}
|
||||||
.map(|(_, y)| *y)
|
|
||||||
.collect::<Vec<f64>>(),
|
|
||||||
"ping" => self
|
|
||||||
.ping
|
|
||||||
.iter()
|
|
||||||
.map(|(_, y)| *y)
|
|
||||||
.collect::<Vec<f64>>(),
|
|
||||||
"net_up" => self
|
|
||||||
.net_up
|
|
||||||
.iter()
|
|
||||||
.map(|(_, y)| *y)
|
|
||||||
.collect::<Vec<f64>>(),
|
|
||||||
"net_down" => self
|
|
||||||
.net_down
|
|
||||||
.iter()
|
|
||||||
.map(|(_, y)| *y)
|
|
||||||
.collect::<Vec<f64>>(),
|
|
||||||
};
|
|
||||||
json
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_width(&self, width: u16) -> Self {
|
pub fn with_width(&self, width: u16) -> Self {
|
||||||
let mut new = self.clone();
|
let mut new = self.clone();
|
||||||
new.cpu = Self::downsample_to_fit_width(&new.cpu, width);
|
new.cpu = Self::downsample_to_fit_width(&new.cpu, width);
|
||||||
|
|
@ -128,10 +135,9 @@ impl AppState {
|
||||||
.first()
|
.first()
|
||||||
.map(|(x, _)| x - (dx * pad_len as f64))
|
.map(|(x, _)| x - (dx * pad_len as f64))
|
||||||
.unwrap_or(0.0);
|
.unwrap_or(0.0);
|
||||||
let _ = data.first().map(|(_, y)| *y).unwrap_or(0.0);
|
|
||||||
|
|
||||||
for i in 0..pad_len {
|
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);
|
result.extend_from_slice(data);
|
||||||
|
|
@ -140,6 +146,13 @@ impl AppState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub static APP_STATE: LazyLock<Arc<Mutex<AppState>>> =
|
||||||
|
LazyLock::new(|| Arc::new(Mutex::new(AppState::new())));
|
||||||
|
|
||||||
|
pub static SHUTDOWN: Lazy<RwLock<bool>> = Lazy::new(|| RwLock::new(false));
|
||||||
|
pub static RELOAD: Lazy<RwLock<bool>> = Lazy::new(|| RwLock::new(true));
|
||||||
|
pub static ACTIVE_TASKS: Lazy<DashSet<String>> = Lazy::new(|| DashSet::new());
|
||||||
|
|
||||||
pub fn setup() {
|
pub fn setup() {
|
||||||
ACTIVE_TASKS.insert("System info loader".to_string());
|
ACTIVE_TASKS.insert("System info loader".to_string());
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
27
iota-storage/Cargo.toml
Normal file
27
iota-storage/Cargo.toml
Normal file
|
|
@ -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"
|
||||||
2
iota-storage/src/lib.rs
Normal file
2
iota-storage/src/lib.rs
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
mod users;
|
||||||
|
mod util;
|
||||||
13
omikron-connector/Cargo.toml
Normal file
13
omikron-connector/Cargo.toml
Normal file
|
|
@ -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"] }
|
||||||
|
|
@ -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<UI>) -> (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<UI>, 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<UI>, 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<Doc>,
|
|
||||||
pub accepted_eula: bool,
|
|
||||||
pub future_eula: Option<Doc>,
|
|
||||||
|
|
||||||
pub tos: Option<Doc>,
|
|
||||||
pub accepted_tos: bool,
|
|
||||||
pub future_tos: Option<Doc>,
|
|
||||||
|
|
||||||
pub privacy: Option<Doc>,
|
|
||||||
pub accepted_pp: bool,
|
|
||||||
pub future_privacy: Option<Doc>,
|
|
||||||
}
|
|
||||||
|
|
||||||
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::<u64>().unwrap_or(0);
|
|
||||||
let future_eula_time = future_eula_time.parse::<u64>().unwrap_or(0);
|
|
||||||
let future_tos_time = future_tos_time.parse::<u64>().unwrap_or(0);
|
|
||||||
let future_pp_time = future_pp_time.parse::<u64>().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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
9
web-server/Cargo.toml
Normal file
9
web-server/Cargo.toml
Normal file
|
|
@ -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" }
|
||||||
0
web-server/src/lib.rs
Normal file
0
web-server/src/lib.rs
Normal file
56
web-ui/Cargo.toml
Normal file
56
web-ui/Cargo.toml
Normal file
|
|
@ -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"
|
||||||
Loading…
Reference in a new issue