From 97ee2a9386b1c520563976cf28141a4a6b22b1d8 Mon Sep 17 00:00:00 2001 From: Guy Dols Date: Fri, 15 May 2026 23:37:38 +0200 Subject: [PATCH 1/2] Added Bytehive icons to favicon for web, systemtray and GUI icons. --- Cargo.lock | 49 +++++++++++++++++-- crates/core/assets/bytehive_icon_128x128.png | Bin 0 -> 13164 bytes crates/core/assets/bytehive_icon_256x256.png | Bin 0 -> 40748 bytes crates/core/assets/bytehive_icon_32x32.png | Bin 0 -> 1877 bytes crates/core/assets/bytehive_icon_64x64.png | Bin 0 -> 4663 bytes crates/core/assets/bytehive_icon_96x96.png | Bin 0 -> 8397 bytes crates/core/assets/dashboard.html | 7 +++ crates/core/assets/filebrowser.html | 7 +++ crates/core/assets/password_share.html | 7 +++ crates/core/assets/portal.html | 7 +++ crates/core/assets/setup.html | 7 +++ crates/core/assets/share_error.html | 7 +++ crates/core/src/html.rs | 3 ++ crates/core/src/http.rs | 20 +++++++- crates/filesync/src/gui/app.rs | 10 ++++ crates/filesync/src/gui/tray.rs | 43 +++------------- 16 files changed, 126 insertions(+), 41 deletions(-) create mode 100644 crates/core/assets/bytehive_icon_128x128.png create mode 100644 crates/core/assets/bytehive_icon_256x256.png create mode 100644 crates/core/assets/bytehive_icon_32x32.png create mode 100644 crates/core/assets/bytehive_icon_64x64.png create mode 100644 crates/core/assets/bytehive_icon_96x96.png diff --git a/Cargo.lock b/Cargo.lock index b22a85b..44e5990 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -635,6 +635,7 @@ dependencies = [ "glib 0.21.5", "gtk", "iced", + "image", "inotify", "log", "lz4_flex", @@ -2679,6 +2680,19 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png 0.18.1", +] + [[package]] name = "image-webp" version = "0.2.4" @@ -3189,6 +3203,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "muda" version = "0.17.1" @@ -3205,7 +3229,7 @@ dependencies = [ "objc2-core-foundation", "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -3966,6 +3990,19 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" version = "3.11.0" @@ -4100,6 +4137,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + [[package]] name = "quick-error" version = "2.0.1" @@ -5207,7 +5250,7 @@ dependencies = [ "bytemuck", "cfg-if", "log", - "png", + "png 0.17.16", "tiny-skia-path", ] @@ -5519,7 +5562,7 @@ dependencies = [ "objc2-core-graphics", "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "thiserror 2.0.18", "windows-sys 0.60.2", ] diff --git a/crates/core/assets/bytehive_icon_128x128.png b/crates/core/assets/bytehive_icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..401b439fba8463109f335bc8529320d0c7fd476e GIT binary patch literal 13164 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%0AOf}EQcPQ)X+4*%&-lT*oRm$R3}S_e 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 A>Hq)$ literal 0 HcmV?d00001 diff --git a/crates/core/assets/bytehive_icon_32x32.png b/crates/core/assets/bytehive_icon_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..681e3dca047c9e76aa1ffe7e83c2430145c5409e GIT binary patch literal 1877 zcmV-b2demqP)bY(Qda?3`o7*_4(4X z{9Tkom4#KP)-;Xn4=aoL0LP&~An*a#x|aRU)Ny(f#1W}kwF z$k9c>S^Tv*6bwRPVc~^jGC45Zmoa={QY2EvSvOe(F?JpT2PuJpFs>Z5+%_QHuVQMv z;v*aWvdI~gdO}_N@l)6u%34j6N=w%a_m@+GXD3AtGI~|sA4x+xKWf3cxf!VW-3OOC z3~4%0021=_fXXAb`VOvN)CVoyCRA)Kf^@HI-XRS^ZENd|wIdJ^nR5l#xI`kEgTPU| zubY>Fis@NcJ~JaT<7E^G2>3NZ(z%e530ZhCGNka58AwPpcC;oOF5P7NbvO_R1Z!Ah ziVZesC!k;cO&|sG0l)au2dM#-Q2DeBM4q;w<(6B?@)w4n@p2yQt{aB|zeOKbrSQFF zX-xMTaIMuR^JA+8ckZMQ<&=Qozs|o-wvjrv9PrdNgs++)w_rM#vJwk^dH=3lUh(-j zXt*MCA$E%CK0^W*+i)A!zo~RY0Q1&`A=Qf_gyy!^#1ygabBknwN?5syJjG=RXx`Z! z?@N8q7P2~GZtb;#>3Y?jfe7=2BCCf7Iu9XfYeed zw*-@}vz4e5nqr!xcVJZpDyLiUWupnPdY|k96qM3>f-kM#+;lc9`Y1#fn|)xP6;c=E zuo5xE+uB-X2^{ul&fD18eT_N{YPgP&NFp@Goq8a-Nub4tM8oAVazT`VYc1EGD#$|l z^dWaYuLC)~UND;x08~f$=vV8^6(qlk`+plbL z78?HZaS%w6XDs~nlN2y9Vb^g#>^xqeKmdrhx3}dY;6XxqtXYJxVK#y{OK%Wj1eb6N ziZ-0j?;^w-T}UVY<~Hq<`%tu`a4w|sm3wNZmzm%pq4ukMaEz~iYe6DyL#9+Bg@B3M zDu9QWJuHf}?-r>Ev?*a7s{I99AW; z1JVyo9@_DSh1KO2Z2j3_B8~t~+TQc_0IcM3ow$YY>NdaEly~Hd?|4T?`_vo+)Guzj zY6K%{2JqN*2Z5Udk>)kOSr8~7uPvQ`u;EN%R7X0DY{QAg#j*|U)v{-J&JPkKQf`1{ zVWLazZV$gTM_E1Eq?UL%!Gh;4xY%OI5(uZ&uVr!mv@Cpl%twh^hP^l5+1W9C5`yk+ z#K0J$)9?7Oo;#rGMApgnV!KU3f?z&FzElzHV!Htx7?Tf(xuN==6}eMz$Ff1Gljk)4WM2APk=JY+pt-o2&oK|PLw=DW3BsK{98xUuNft|Z&9cY}z3I_x?m=C4g zvK*MsP{fAuktLWoaWng_8Oaw_;Ybj%`ehS7Ysk`_K{)}HJ+wK%m)1gngR7bGe1Ppg z>)su?JH%YDKglrg-HwiqTA|?3xwEr#4?hmMjcN}d^||;t1FGj3u%HCdvedY=?|`;c zzDO`5OtAO`wUzX(DAjA*kwF}`oeRmi6ZZD@*7^PZX0|(vHwSfcvK`K~5!GL{@NA2| zq=f_wV7$adNmX<9-3~?KRoe)fMyk%&Ba% zR^G6+MI1(BH5c3qsC#nAN1bV!v%9;yV)t|YKm>-%gb5QCGL{F~K@@UkDca?5h|qL$+r#nN>YKJ!eK^b5sa;rMS2_Iy5vi%P@=(KkEc<;0fe^_CkY`Yi&N& P00000NkvXXu0mjff^}_5 literal 0 HcmV?d00001 diff --git a/crates/core/assets/bytehive_icon_64x64.png b/crates/core/assets/bytehive_icon_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..6871ecf892b22a7e79fafefe587a38e31c3bbb02 GIT binary patch literal 4663 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 literal 0 HcmV?d00001 diff --git a/crates/core/assets/bytehive_icon_96x96.png b/crates/core/assets/bytehive_icon_96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..70b238ef534fb5bcca7da2e8e6cbf7a0a2432032 GIT binary patch literal 8397 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 + + Bytehive — Ops diff --git a/crates/core/assets/filebrowser.html b/crates/core/assets/filebrowser.html index 9efb9cb..5d5f08d 100644 --- a/crates/core/assets/filebrowser.html +++ b/crates/core/assets/filebrowser.html @@ -3,6 +3,13 @@ + + Files — Bytehive diff --git a/crates/core/assets/password_share.html b/crates/core/assets/password_share.html index 91cee03..980310d 100644 --- a/crates/core/assets/password_share.html +++ b/crates/core/assets/password_share.html @@ -3,6 +3,13 @@ + + Protected Share — Bytehive diff --git a/crates/core/assets/portal.html b/crates/core/assets/portal.html index 5b17051..f2f9447 100644 --- a/crates/core/assets/portal.html +++ b/crates/core/assets/portal.html @@ -3,6 +3,13 @@ + + Bytehive diff --git a/crates/core/assets/setup.html b/crates/core/assets/setup.html index 4e63222..b301d7b 100644 --- a/crates/core/assets/setup.html +++ b/crates/core/assets/setup.html @@ -3,6 +3,13 @@ + + Bytehive — First Run Setup diff --git a/crates/core/assets/share_error.html b/crates/core/assets/share_error.html index 608ccd6..aa3bc6b 100644 --- a/crates/core/assets/share_error.html +++ b/crates/core/assets/share_error.html @@ -3,6 +3,13 @@ + + Link Error — Bytehive diff --git a/crates/core/src/html.rs b/crates/core/src/html.rs index 4b13c05..abadd99 100644 --- a/crates/core/src/html.rs +++ b/crates/core/src/html.rs @@ -25,3 +25,6 @@ pub const SHARE_ERROR: &str = include_str!("../assets/share_error.html"); pub const PASSWORD_SHARE_ERROR: &str = r#"

Incorrect password — try again.

"#; pub const PASSWORD_SHARE: &str = include_str!("../assets/password_share.html"); + +pub const BYTEHIVE_ICON_32_PNG: &[u8] = include_bytes!("../assets/bytehive_icon_32x32.png"); +pub const BYTEHIVE_ICON_64_PNG: &[u8] = include_bytes!("../assets/bytehive_icon_64x64.png"); diff --git a/crates/core/src/http.rs b/crates/core/src/http.rs index abf3afc..ffdc80e 100644 --- a/crates/core/src/http.rs +++ b/crates/core/src/http.rs @@ -1,6 +1,8 @@ use crate::auth::Auth; use crate::bus::{BusMessage, MessageBus}; -use crate::html::{ADMIN_DASHBOARD_HTML, PORTAL_HTML, SETUP_HTML}; +use crate::html::{ + ADMIN_DASHBOARD_HTML, BYTEHIVE_ICON_32_PNG, BYTEHIVE_ICON_64_PNG, PORTAL_HTML, SETUP_HTML, +}; use crate::registry::AppRegistry; use crate::users::{AuthContext, AuthMethod, Group, UserEntry, UserStore}; @@ -270,6 +272,8 @@ fn build_router(state: ApiState) -> Router { .route("/", get(portal_handler)) .route("/bytehive-icon.svg", get(bytehive_icon_handler)) .route("/bytehive-logo-full.svg", get(bytehive_logo_full_handler)) + .route("/bytehive_icon_32x32.png", get(bytehive_icon_32_handler)) + .route("/bytehive_icon_64x64.png", get(bytehive_icon_64_handler)) .route("/web/*path", get(static_handler)) .route("/s/:token", get(share_handler).post(share_handler)) .nest("/api/auth", public_auth.merge(authenticated_auth)) @@ -633,6 +637,20 @@ async fn bytehive_logo_full_handler() -> impl IntoResponse { ) } +async fn bytehive_icon_32_handler() -> impl IntoResponse { + ( + [(axum::http::header::CONTENT_TYPE, "image/png")], + BYTEHIVE_ICON_32_PNG, + ) +} + +async fn bytehive_icon_64_handler() -> impl IntoResponse { + ( + [(axum::http::header::CONTENT_TYPE, "image/png")], + BYTEHIVE_ICON_64_PNG, + ) +} + async fn static_handler(State(s): State, Path(rel): Path) -> impl IntoResponse { if s.web_root.is_empty() { return (StatusCode::NOT_FOUND, "no web_root configured").into_response(); diff --git a/crates/filesync/src/gui/app.rs b/crates/filesync/src/gui/app.rs index d7e220e..e603193 100644 --- a/crates/filesync/src/gui/app.rs +++ b/crates/filesync/src/gui/app.rs @@ -43,6 +43,16 @@ pub fn run(tray: TrayHandle) -> iced::Result { .run() } +fn load_window_icon() -> Option { + const ICON_PNG: &[u8] = + include_bytes!("../../../core/assets/bytehive_icon_128x128.png"); + let img = image::load_from_memory(ICON_PNG) + .ok()? + .into_rgba8(); + let (w, h) = img.dimensions(); + window::icon::from_rgba(img.into_raw(), w, h).ok() +} + // ─── State ──────────────────────────────────────────────────────────────────── #[derive(Default)] diff --git a/crates/filesync/src/gui/tray.rs b/crates/filesync/src/gui/tray.rs index bf7296a..dae1e91 100644 --- a/crates/filesync/src/gui/tray.rs +++ b/crates/filesync/src/gui/tray.rs @@ -72,41 +72,10 @@ pub fn setup_tray() -> TrayHandle { } fn make_icon() -> Icon { - const SIZE: usize = 22; - let mut px = vec![0u8; SIZE * SIZE * 4]; - - for y in 0..SIZE { - for x in 0..SIZE { - let dx = x as f32 - 10.5; - let dy = y as f32 - 10.5; - let r = (dx * dx + dy * dy).sqrt(); - - let i = (y * SIZE + x) * 4; - - if r > 10.2 { - continue; - } - - px[i] = 0x3B; - px[i + 1] = 0x82; - px[i + 2] = 0xF6; - px[i + 3] = 255; - - let angle = dy.atan2(dx); - let in_arc = - !(angle > std::f32::consts::FRAC_PI_4 && angle < std::f32::consts::FRAC_PI_2 * 1.5); - if r > 5.5 && r < 8.0 && in_arc { - px[i] = 255; - px[i + 1] = 255; - px[i + 2] = 255; - } - - if dx > 0.5 && dy > -2.0 && dy < 2.0 && r < 8.0 && r > 4.0 { - px[i] = 255; - px[i + 1] = 255; - px[i + 2] = 255; - } - } - } - Icon::from_rgba(px, SIZE as u32, SIZE as u32).expect("create tray icon pixels") + const ICON_PNG: &[u8] = include_bytes!("../../../core/assets/bytehive_icon_32x32.png"); + let img = image::load_from_memory(ICON_PNG) + .expect("decode tray icon PNG") + .into_rgba8(); + let (w, h) = img.dimensions(); + Icon::from_rgba(img.into_raw(), w, h).expect("create tray icon") } From def043f9651ad638bd36fdeea3e3969f3d6545a1 Mon Sep 17 00:00:00 2001 From: Guy Dols Date: Fri, 15 May 2026 23:41:21 +0200 Subject: [PATCH 2/2] Changed the trash bin behaviour and added auto rescan time option. --- config.toml | 15 + crates/core/assets/portal.html | 12 +- crates/core/src/lib.rs | 2 + crates/core/src/trash.rs | 336 ++++++++++++++++++++++ crates/filebrowser/src/app.rs | 70 ++++- crates/filebrowser/src/fs_util.rs | 31 -- crates/filebrowser/src/handlers.rs | 75 ++++- crates/filebrowser/tests/test_app.rs | 1 + crates/filebrowser/tests/test_handlers.rs | 1 + crates/filesync/Cargo.toml | 1 + crates/filesync/src/app.rs | 86 +++++- crates/filesync/src/common.rs | 2 +- crates/filesync/src/gui/app.rs | 209 +++++++++++++- crates/filesync/src/protocol.rs | 1 + crates/filesync/src/sync_engine.rs | 107 ++++--- crates/filesync/tests/test_app.rs | 6 + 16 files changed, 854 insertions(+), 101 deletions(-) create mode 100644 crates/core/src/trash.rs diff --git a/config.toml b/config.toml index bdc4d25..45ab9a1 100644 --- a/config.toml +++ b/config.toml @@ -173,6 +173,21 @@ bind_addr = "0.0.0.0:7878" # Authentication: server validates clients via the framework UserStore. # No extra config needed for the server. Clients set auth_token below. +# Trash settings +# ────────────── +# When a file is deleted it is moved into .bh_filesync/trash/ under the root, +# mirroring the original folder structure. An index.json inside the trash +# directory records metadata (original path, deletion time, size, …) for +# every entry so files can be listed and restored via the API. +# +# trash_expiry_days — automatically purge entries older than N days. +# 0 or omitted → keep forever (manual purge only). +# trash_expiry_days = 30 + +# full_scan_interval_secs — how often to do a full filesystem re-scan to +# catch changes that inotify may have missed. Default: 900 (15 minutes). +# full_scan_interval_secs = 900 + exclude_patterns = [ # ── Python ──────────────────────────────────────────────── "**/venv/**", diff --git a/crates/core/assets/portal.html b/crates/core/assets/portal.html index f2f9447..6ee2956 100644 --- a/crates/core/assets/portal.html +++ b/crates/core/assets/portal.html @@ -695,7 +695,10 @@ id="inp-user" autocomplete="username" placeholder="username" - onkeydown="if(event.key==='Enter')document.getElementById('inp-pass').focus()" + onkeydown=" + if (event.key === 'Enter') + document.getElementById('inp-pass').focus(); + " />
@@ -705,7 +708,7 @@ id="inp-pass" autocomplete="current-password" placeholder="••••••••" - onkeydown="if(event.key==='Enter')doLogin()" + onkeydown="if (event.key === 'Enter') doLogin();" />