diff --git a/icons/logo.png b/icons/logo.png new file mode 100644 index 0000000..da83aeb Binary files /dev/null and b/icons/logo.png differ diff --git a/ostp-client/src/runner.rs b/ostp-client/src/runner.rs index f697f76..6e3e36d 100644 --- a/ostp-client/src/runner.rs +++ b/ostp-client/src/runner.rs @@ -1,6 +1,6 @@ -use anyhow::Result; +use anyhow::{anyhow, Result}; use std::sync::Arc; -use tokio::sync::watch; +use tokio::sync::{mpsc, watch}; use crate::config::{ClientConfig, InboundConfig}; use crate::tunnel::balancer::Balancer; @@ -16,26 +16,74 @@ pub async fn run_client_core( use portable_atomic::Ordering; tracing::info!("starting client core"); - // Report "connecting" until an inbound has successfully bound. Each inbound - // flips this to 2 (connected) once it is ready; if they all fail, the - // select! below returns and we reset to 0 (disconnected). + // Report "connecting" until the primary inbound has fully come up. The TUN + // inbound flips this to 2 (connected) only after the device and the server + // bypass route are installed; the SOCKS inbound does so only when it is the + // primary (SOCKS-only mode). If any inbound's setup fails the whole connect + // aborts and we reset to 0 — the GUI never sees a fake "connected". metrics.connection_state.store(1, Ordering::Relaxed); let router = Arc::new(Router::new(config.routing.clone())); let balancer = Arc::new(Balancer::new(&config)); - + // TODO: Detect physical interface index for bypassing let phys_if_for_bypass = None; let outbound_manager = Arc::new(OutboundManager::new(balancer.clone(), phys_if_for_bypass, None)); + // When a TUN inbound is present it is the primary one and owns the connected + // state; the SOCKS proxy is then secondary and must not report "connected". + let has_tun = config + .inbounds + .iter() + .any(|i| matches!(i, InboundConfig::Tun { .. })); + + // Any inbound that fails its setup reports the error here; the first report + // aborts the whole connect so we never come up half-broken. + let (failure_tx, mut failure_rx) = mpsc::channel::(4); + let mut handles = Vec::new(); + let metrics_ping = metrics.clone(); + let server_ip = config.outbounds.iter().find_map(|o| { + match o { + crate::config::OutboundConfig::Ostp { server, .. } => Some(server.clone()), + crate::config::OutboundConfig::Socks { server, .. } => Some(server.clone()), + _ => None, + } + }); + + if let Some(mut server) = server_ip { + if !server.contains(':') { + server.push_str(":443"); + } + let mut shutdown_rx = shutdown_rx_ext.clone(); + handles.push(tokio::spawn(async move { + loop { + tokio::select! { + _ = tokio::time::sleep(std::time::Duration::from_secs(3)) => {} + _ = shutdown_rx.changed() => { + if *shutdown_rx.borrow() { break; } + } + } + let start = std::time::Instant::now(); + if let Ok(Ok(_)) = tokio::time::timeout( + std::time::Duration::from_secs(2), + tokio::net::TcpStream::connect(&server) + ).await { + let rtt = start.elapsed().as_millis() as u32; + metrics_ping.rtt_ms.store(rtt, Ordering::Relaxed); + } + } + })); + } + for inbound in config.inbounds.clone() { let router_clone = router.clone(); let outbound_manager_clone = outbound_manager.clone(); let shutdown_rx = shutdown_rx_ext.clone(); let config_clone = config.clone(); let metrics_clone = metrics.clone(); + let failure_tx = failure_tx.clone(); match inbound.clone() { InboundConfig::Tun { .. } => { @@ -49,10 +97,12 @@ pub async fn run_client_core( metrics_clone, ).await { tracing::error!("TUN inbound failed: {}", e); + let _ = failure_tx.send(format!("TUN inbound: {e}")).await; } })); } InboundConfig::LocalProxy { .. } => { + let is_primary = !has_tun; handles.push(tokio::spawn(async move { if let Err(e) = crate::tunnel::inbounds::local_proxy::run_socks_inbound( config_clone, @@ -61,23 +111,43 @@ pub async fn run_client_core( outbound_manager_clone, shutdown_rx, metrics_clone, + is_primary, ).await { tracing::error!("SOCKS inbound failed: {}", e); + let _ = failure_tx.send(format!("SOCKS inbound: {e}")).await; } })); } } } + // Drop our own sender so the channel closes once every inbound task has ended. + drop(failure_tx); - // Wait for shutdown or for tasks to fail - tokio::select! { + // Run until: an external shutdown, a fatal inbound failure, or all inbounds + // ending on their own. + let result = tokio::select! { _ = shutdown_rx_ext.changed() => { if *shutdown_rx_ext.borrow() { tracing::info!("Shutdown signal received in run_client_core"); } + Ok(()) } - } + maybe_err = failure_rx.recv() => { + match maybe_err { + Some(err) => { + tracing::error!("tunnel startup failed: {err}"); + Err(anyhow!("tunnel startup failed: {err}")) + } + None => Ok(()), + } + } + }; + // Tear down every inbound regardless of why we are exiting, then report + // disconnected so the GUI reflects the real state. + for h in &handles { + h.abort(); + } metrics.connection_state.store(0, Ordering::Relaxed); - Ok(()) + result } diff --git a/ostp-client/src/tunnel/inbounds/local_proxy.rs b/ostp-client/src/tunnel/inbounds/local_proxy.rs index b02a8cd..5c42535 100644 --- a/ostp-client/src/tunnel/inbounds/local_proxy.rs +++ b/ostp-client/src/tunnel/inbounds/local_proxy.rs @@ -14,6 +14,7 @@ pub async fn run_socks_inbound( outbound_manager: Arc, mut shutdown: watch::Receiver, metrics: Arc, + is_primary: bool, ) -> Result<()> { use portable_atomic::Ordering; let InboundConfig::LocalProxy { tag, protocol, listen, port, set_system_proxy } = inbound_config else { @@ -32,9 +33,17 @@ pub async fn run_socks_inbound( let listener = TcpListener::bind(&bind_addr).await?; - // Listener bound successfully — the proxy is ready to accept connections. - metrics.connection_state.store(2, Ordering::Relaxed); - tracing::info!("{} proxy inbound ready on {}, connection state = connected", protocol, bind_addr); + // Binding a local socket only proves the proxy can accept connections, not + // that the tunnel actually reaches the server. Only report "connected" from + // here when this proxy is the primary inbound (SOCKS-only mode). In TUN mode + // the TUN inbound owns the connected state — it is set after the device and + // server bypass route are in place — so we must not flip it prematurely. + if is_primary { + metrics.connection_state.store(2, Ordering::Relaxed); + tracing::info!("{} proxy inbound ready on {}, connection state = connected", protocol, bind_addr); + } else { + tracing::info!("{} proxy inbound ready on {}", protocol, bind_addr); + } loop { tokio::select! { diff --git a/ostp-client/src/tunnel/inbounds/tun.rs b/ostp-client/src/tunnel/inbounds/tun.rs index b04b292..9762569 100644 --- a/ostp-client/src/tunnel/inbounds/tun.rs +++ b/ostp-client/src/tunnel/inbounds/tun.rs @@ -160,20 +160,24 @@ pub async fn run_tun_inbound( _route_guard = Some(tun_interface.guard); let (mut tun_read, mut tun_write) = tokio::io::split(dev); + let m_sent = metrics.clone(); let tun_to_stack = tokio::spawn(async move { let mut buf = vec![0u8; 65536]; loop { match tun_read.read(&mut buf).await { Ok(0) => break, Ok(n) => { + m_sent.bytes_sent.fetch_add(n as u64, Ordering::Relaxed); if let Err(_) = stack_sink.send(buf[..n].to_vec()).await { break; } } Err(e) => tracing::debug!("tun_read error: {e}"), } } }); + let m_recv = metrics.clone(); let stack_to_tun = tokio::spawn(async move { while let Some(Ok(frame)) = stack_stream.next().await { + m_recv.bytes_recv.fetch_add(frame.len() as u64, Ordering::Relaxed); if let Err(e) = tun_write.write(&frame).await { tracing::debug!("tun_write error: {e}"); } } }); diff --git a/ostp-core/build.rs b/ostp-core/build.rs new file mode 100644 index 0000000..935026b --- /dev/null +++ b/ostp-core/build.rs @@ -0,0 +1,3 @@ +fn main() { + // Left empty by request +} diff --git a/ostp-core/examples/test_handshake.rs b/ostp-core/examples/test_handshake.rs new file mode 100644 index 0000000..4c14048 --- /dev/null +++ b/ostp-core/examples/test_handshake.rs @@ -0,0 +1,58 @@ +use ostp_core::{ProtocolMachine, ProtocolConfig, OstpEvent, ProtocolAction, NoiseRole}; + +fn main() { + let key = "3f5dfaf68e377a3724bdde3ac7b4f4de"; + let secrets = ostp_core::crypto::derive_all_secrets(key.as_bytes()); + + let mut init_cfg = ProtocolConfig { + role: NoiseRole::Initiator, + session_id: 12345, + psk: secrets.psk, + obfuscation_key: secrets.obfuscation_key, + handshake_pad_min: secrets.handshake_pad_min, + handshake_pad_max: secrets.handshake_pad_max, + max_reorder: 10, + max_reorder_buffer: 10, + ack_delay_ms: 10, + rto_ms: 100, + max_retries: 5, + max_sent_history: 100, + handshake_payload: vec![], + mtu: 1400, + max_padding: 0, + padding_strategy: ostp_core::PaddingStrategy::Adaptive, + }; + + let mut payload = Vec::new(); + payload.extend_from_slice(&0u64.to_be_bytes()); // time + payload.extend_from_slice(&12345u32.to_be_bytes()); + payload.extend_from_slice(key.as_bytes()); + init_cfg.handshake_payload = payload; + + let mut init_machine = ProtocolMachine::new(init_cfg.clone()).unwrap(); + let action = init_machine.on_event(OstpEvent::Start).unwrap(); + + let pkt = match action { + ProtocolAction::SendDatagram(p) => p, + _ => panic!("Expected SendDatagram"), + }; + + println!("Initiator sent {} bytes", pkt.len()); + + let mut resp_cfg = init_cfg.clone(); + resp_cfg.role = NoiseRole::Responder; + + let mut resp_machine = ProtocolMachine::new(resp_cfg).unwrap(); + + // Simulate what server dispatcher does + let mut raw_vec = pkt.to_vec(); + ostp_core::crypto::deobfuscate_packet_inplace(&mut raw_vec, &secrets.obfuscation_key, true); + println!("Deobfuscated length: {}", raw_vec.len()); + + let action = resp_machine.on_event(OstpEvent::Inbound(pkt)); + match action { + Ok(ProtocolAction::HandshakePayload(_, _)) => println!("Responder: Handshake OK!"), + Ok(_) => println!("Responder: Not HandshakePayload"), + Err(e) => println!("Responder error: {:?}", e), + } +} diff --git a/ostp-core/src/dnstt.rs b/ostp-core/src/dnstt.rs new file mode 100644 index 0000000..e223f72 --- /dev/null +++ b/ostp-core/src/dnstt.rs @@ -0,0 +1,123 @@ +use std::env; +use std::path::PathBuf; +use std::process::{Child, Command, Stdio}; +use anyhow::{Context, Result}; +use tracing::{debug, info}; + +pub struct DnsttProcess { + child: Child, +} + +impl Drop for DnsttProcess { + fn drop(&mut self) { + debug!("Stopping dnstt process..."); + let _ = self.child.kill(); + let _ = self.child.wait(); + } +} + +fn find_bin(name: &str) -> Result { + let ext = if cfg!(target_os = "windows") { ".exe" } else { "" }; + let file_name = format!("{}{}", name, ext); + + // Check current working directory + let mut path = env::current_dir()?.join(&file_name); + if path.exists() { + return Ok(path); + } + + // Check next to the executable + if let Ok(exe_path) = env::current_exe() { + if let Some(parent) = exe_path.parent() { + path = parent.join(&file_name); + if path.exists() { + return Ok(path); + } + } + } + + anyhow::bail!("{} not found. Please place {} in the same directory as ostp.", name, file_name); +} + +/// Spawns the dnstt-server process. +/// Listens on `public_ip:53` and forwards to `127.0.0.1:`. +pub fn spawn_server(public_ip: &str, local_port: u16, privkey: &str, debug: bool) -> Result { + let bin_path = find_bin("dnstt-server")?; + let listen_addr = format!("{}:53", public_ip); + let forward_addr = format!("127.0.0.1:{}", local_port); + + info!("Starting dnstt-server on {} forwarding to {}", listen_addr, forward_addr); + + let child = Command::new(&bin_path) + .arg("-udp") + .arg(&listen_addr) + .arg("-privkey") + .arg(privkey) + .arg(&forward_addr) + .stdout(if debug { Stdio::inherit() } else { Stdio::null() }) + .stderr(if debug { Stdio::inherit() } else { Stdio::null() }) + .spawn() + .context("Failed to start dnstt-server process")?; + + Ok(DnsttProcess { child }) +} + +/// Spawns the dnstt-client process. +/// Returns the local port it bound to, along with the process handle. +pub fn spawn_client(pubkey: &str, domain: &str, resolver: &str, debug: bool) -> Result<(u16, DnsttProcess)> { + let bin_path = find_bin("dnstt-client")?; + + let local_port = { + let listener = std::net::UdpSocket::bind("127.0.0.1:0")?; + listener.local_addr()?.port() + }; + + let listen_addr = format!("127.0.0.1:{}", local_port); + info!("Starting dnstt-client on {} via {}", listen_addr, resolver); + + let child = Command::new(&bin_path) + .arg("-udp") + .arg(resolver) + .arg("-pubkey") + .arg(pubkey) + .arg(domain) + .arg(&listen_addr) + .stdout(if debug { Stdio::inherit() } else { Stdio::null() }) + .stderr(if debug { Stdio::inherit() } else { Stdio::null() }) + .spawn() + .context("Failed to start dnstt-client process")?; + + Ok((local_port, DnsttProcess { child })) +} + +/// Helper to generate a new keypair using dnstt-server -gen-key +pub fn generate_keypair() -> Result<(String, String)> { + let bin_path = find_bin("dnstt-server")?; + + let output = Command::new(&bin_path) + .arg("-gen-key") + .output() + .context("Failed to run dnstt-server -gen-key")?; + + if !output.status.success() { + anyhow::bail!("dnstt-server -gen-key failed"); + } + + let out_str = String::from_utf8_lossy(&output.stdout); + let mut privkey = String::new(); + let mut pubkey = String::new(); + + for line in out_str.lines() { + if line.starts_with("privkey ") { + privkey = line.trim_start_matches("privkey ").trim().to_string(); + } else if line.starts_with("pubkey ") { + pubkey = line.trim_start_matches("pubkey ").trim().to_string(); + } + } + + if privkey.is_empty() || pubkey.is_empty() { + anyhow::bail!("Failed to parse keys from dnstt-server output"); + } + + Ok((privkey, pubkey)) +} diff --git a/ostp-flutter/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/ostp-flutter/android/app/src/main/res/mipmap-hdpi/launcher_icon.png index e7db254..4082788 100644 Binary files a/ostp-flutter/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and b/ostp-flutter/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/ostp-flutter/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/ostp-flutter/android/app/src/main/res/mipmap-mdpi/launcher_icon.png index 07d142f..96a3225 100644 Binary files a/ostp-flutter/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and b/ostp-flutter/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/ostp-flutter/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/ostp-flutter/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png index 903d88c..5a72365 100644 Binary files a/ostp-flutter/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and b/ostp-flutter/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/ostp-flutter/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/ostp-flutter/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png index 6f29b7e..a039e5e 100644 Binary files a/ostp-flutter/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and b/ostp-flutter/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/ostp-flutter/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/ostp-flutter/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png index 6cefa52..14cb738 100644 Binary files a/ostp-flutter/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and b/ostp-flutter/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/ostp-flutter/assets/logo.png b/ostp-flutter/assets/logo.png new file mode 100644 index 0000000..da83aeb Binary files /dev/null and b/ostp-flutter/assets/logo.png differ diff --git a/ostp-flutter/pubspec.yaml b/ostp-flutter/pubspec.yaml index b893b65..4cd892c 100644 --- a/ostp-flutter/pubspec.yaml +++ b/ostp-flutter/pubspec.yaml @@ -59,7 +59,7 @@ dev_dependencies: flutter_launcher_icons: android: "launcher_icon" ios: false - image_path: "../icons/sqare.png" + image_path: "../ostp-gui/src-tauri/icons/icon.png" # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/ostp-gui/src-tauri/icons/128x128.png b/ostp-gui/src-tauri/icons/128x128.png index c13ab18..d3464f2 100644 Binary files a/ostp-gui/src-tauri/icons/128x128.png and b/ostp-gui/src-tauri/icons/128x128.png differ diff --git a/ostp-gui/src-tauri/icons/128x128@2x.png b/ostp-gui/src-tauri/icons/128x128@2x.png index 41ee307..5b615a8 100644 Binary files a/ostp-gui/src-tauri/icons/128x128@2x.png and b/ostp-gui/src-tauri/icons/128x128@2x.png differ diff --git a/ostp-gui/src-tauri/icons/32x32.png b/ostp-gui/src-tauri/icons/32x32.png index fa80533..e445cd6 100644 Binary files a/ostp-gui/src-tauri/icons/32x32.png and b/ostp-gui/src-tauri/icons/32x32.png differ diff --git a/ostp-gui/src-tauri/icons/64x64.png b/ostp-gui/src-tauri/icons/64x64.png index 22284c3..e9302a5 100644 Binary files a/ostp-gui/src-tauri/icons/64x64.png and b/ostp-gui/src-tauri/icons/64x64.png differ diff --git a/ostp-gui/src-tauri/icons/Square107x107Logo.png b/ostp-gui/src-tauri/icons/Square107x107Logo.png index 1aa516a..0c1e56c 100644 Binary files a/ostp-gui/src-tauri/icons/Square107x107Logo.png and b/ostp-gui/src-tauri/icons/Square107x107Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square142x142Logo.png b/ostp-gui/src-tauri/icons/Square142x142Logo.png index bf4d7c5..1727420 100644 Binary files a/ostp-gui/src-tauri/icons/Square142x142Logo.png and b/ostp-gui/src-tauri/icons/Square142x142Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square150x150Logo.png b/ostp-gui/src-tauri/icons/Square150x150Logo.png index ec5b9f7..787e2d5 100644 Binary files a/ostp-gui/src-tauri/icons/Square150x150Logo.png and b/ostp-gui/src-tauri/icons/Square150x150Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square284x284Logo.png b/ostp-gui/src-tauri/icons/Square284x284Logo.png index 50b3f8e..aa6529f 100644 Binary files a/ostp-gui/src-tauri/icons/Square284x284Logo.png and b/ostp-gui/src-tauri/icons/Square284x284Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square30x30Logo.png b/ostp-gui/src-tauri/icons/Square30x30Logo.png index f36c81a..ef3b451 100644 Binary files a/ostp-gui/src-tauri/icons/Square30x30Logo.png and b/ostp-gui/src-tauri/icons/Square30x30Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square310x310Logo.png b/ostp-gui/src-tauri/icons/Square310x310Logo.png index f1e95d2..7eb3e1f 100644 Binary files a/ostp-gui/src-tauri/icons/Square310x310Logo.png and b/ostp-gui/src-tauri/icons/Square310x310Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square44x44Logo.png b/ostp-gui/src-tauri/icons/Square44x44Logo.png index 70c32fb..f8cf47e 100644 Binary files a/ostp-gui/src-tauri/icons/Square44x44Logo.png and b/ostp-gui/src-tauri/icons/Square44x44Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square71x71Logo.png b/ostp-gui/src-tauri/icons/Square71x71Logo.png index ed62559..11bd38e 100644 Binary files a/ostp-gui/src-tauri/icons/Square71x71Logo.png and b/ostp-gui/src-tauri/icons/Square71x71Logo.png differ diff --git a/ostp-gui/src-tauri/icons/Square89x89Logo.png b/ostp-gui/src-tauri/icons/Square89x89Logo.png index 5d3c1a7..35c3e2e 100644 Binary files a/ostp-gui/src-tauri/icons/Square89x89Logo.png and b/ostp-gui/src-tauri/icons/Square89x89Logo.png differ diff --git a/ostp-gui/src-tauri/icons/StoreLogo.png b/ostp-gui/src-tauri/icons/StoreLogo.png index 6303f1f..c2b9276 100644 Binary files a/ostp-gui/src-tauri/icons/StoreLogo.png and b/ostp-gui/src-tauri/icons/StoreLogo.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png index 3c8ca97..8f00dc9 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png and b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png index c0cd7e2..e39e41f 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png and b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png index 72a1467..cab4e00 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png and b/ostp-gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png index b214536..fc3c7c4 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png and b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png index 93cec82..2152a50 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png and b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png index ec6c5c3..c7fd2d2 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png and b/ostp-gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png index a09ae41..c9f6eba 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png and b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png index 8cbe008..d9c4cf9 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png and b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png index adde42b..c70e100 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png and b/ostp-gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png index 12d63df..1dfffe1 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png index 403c392..7f969b5 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png index 415d83a..931a159 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png index 8ce78b3..c031cce 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png index 03d0e24..c4e0030 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png index 2694407..5d35cd4 100644 Binary files a/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png and b/ostp-gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/ostp-gui/src-tauri/icons/icon.icns b/ostp-gui/src-tauri/icons/icon.icns index 2ac04b6..fb8f122 100644 Binary files a/ostp-gui/src-tauri/icons/icon.icns and b/ostp-gui/src-tauri/icons/icon.icns differ diff --git a/ostp-gui/src-tauri/icons/icon.ico b/ostp-gui/src-tauri/icons/icon.ico index 9161f2f..d72f0f1 100644 Binary files a/ostp-gui/src-tauri/icons/icon.ico and b/ostp-gui/src-tauri/icons/icon.ico differ diff --git a/ostp-gui/src-tauri/icons/icon.png b/ostp-gui/src-tauri/icons/icon.png index fe1265b..da83aeb 100644 Binary files a/ostp-gui/src-tauri/icons/icon.png and b/ostp-gui/src-tauri/icons/icon.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@1x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@1x.png index ef8161e..29991af 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@1x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png index 2953fa8..5e76310 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x.png index 2953fa8..5e76310 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@3x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@3x.png index 2e243e7..241548e 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@3x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@1x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@1x.png index b4b2898..6e31241 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@1x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png index 1cf8033..4d14e3f 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x.png index 1cf8033..4d14e3f 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@3x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@3x.png index 0738092..dd0f429 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@3x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@1x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@1x.png index 2953fa8..5e76310 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@1x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png index 4e2ea27..2e4ba04 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x.png index 4e2ea27..2e4ba04 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@3x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@3x.png index 826fe09..4a4639a 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@3x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-512@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-512@2x.png index 7a5f0f9..0f95fa4 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-512@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@2x.png index 826fe09..4a4639a 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@3x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@3x.png index c90773a..5b3c6be 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@3x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@1x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@1x.png index 2500ca8..d5d9f61 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@1x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@2x.png index ab4256b..69e9f30 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/ostp-gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/ostp-gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png index 1277ed9..42af016 100644 Binary files a/ostp-gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png and b/ostp-gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/ostp-gui/src/assets/logo.png b/ostp-gui/src/assets/logo.png new file mode 100644 index 0000000..da83aeb Binary files /dev/null and b/ostp-gui/src/assets/logo.png differ diff --git a/ostp-gui/src/index.html b/ostp-gui/src/index.html index 6263cf8..bba1534 100644 --- a/ostp-gui/src/index.html +++ b/ostp-gui/src/index.html @@ -80,15 +80,7 @@