From 1af23dd81bf77e957b0d7d9becd7c310b63d0325 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sun, 12 Jan 2025 17:47:10 +0100 Subject: [PATCH 01/40] add SVG to represent bogon IP addresses --- resources/countries_flags/4x3/zz-bogon.svg | 28 ++++++++++++++++++++++ src/countries/flags_pictures.rs | 1 + 2 files changed, 29 insertions(+) create mode 100644 resources/countries_flags/4x3/zz-bogon.svg diff --git a/resources/countries_flags/4x3/zz-bogon.svg b/resources/countries_flags/4x3/zz-bogon.svg new file mode 100644 index 000000000..e897f24b4 --- /dev/null +++ b/resources/countries_flags/4x3/zz-bogon.svg @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/src/countries/flags_pictures.rs b/src/countries/flags_pictures.rs index a1c579837..f13feced8 100644 --- a/src/countries/flags_pictures.rs +++ b/src/countries/flags_pictures.rs @@ -255,3 +255,4 @@ pub const MULTICAST: &[u8] = include_bytes!("../../resources/countries_flags/4x3 pub const BROADCAST: &[u8] = include_bytes!("../../resources/countries_flags/4x3/zz-broadcast.svg"); pub const UNKNOWN: &[u8] = include_bytes!("../../resources/countries_flags/4x3/zz-unknown.svg"); pub const COMPUTER: &[u8] = include_bytes!("../../resources/countries_flags/4x3/zz-computer.svg"); +pub const BOGON: &[u8] = include_bytes!("../../resources/countries_flags/4x3/zz-bogon.svg"); From f118c08bbbca6a674e1db086a1768aaab44599ed Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 18 Jan 2025 17:15:49 +0100 Subject: [PATCH 02/40] tag bogon IP addresses (WIP) --- src/networking/types/bogon.rs | 177 ++++++++++++++++++++++++++ src/networking/types/ip_collection.rs | 4 +- src/networking/types/mod.rs | 1 + 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 src/networking/types/bogon.rs diff --git a/src/networking/types/bogon.rs b/src/networking/types/bogon.rs new file mode 100644 index 000000000..74cb5aceb --- /dev/null +++ b/src/networking/types/bogon.rs @@ -0,0 +1,177 @@ +use crate::networking::types::ip_collection::AddressCollection; +use once_cell::sync::Lazy; +use std::net::IpAddr; +use std::str::FromStr; + +pub struct Bogon { + pub range: AddressCollection, + pub description: &'static str, +} + +// IPv4 bogons + +static THIS_NETWORK: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("0.0.0.0-0.255.255.255").unwrap(), + description: "\"this\" network", +}); + +static PRIVATE_USE: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new( + "10.0.0.0-10.255.255.255, 172.16.0.0-172.31.255.255, 192.168.0.0-192.168.255.255", + ) + .unwrap(), + description: "private-use networks", +}); + +static CARRIER_GRADE: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("100.64.0.0-100.127.255.255").unwrap(), + description: "carrier-grade NAT", +}); + +static LOOPBACK: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("127.0.0.0-127.255.255.255").unwrap(), + description: "loopback", +}); + +static LINK_LOCAL: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("169.254.0.0-169.254.255.255").unwrap(), + description: "link local", +}); + +static IETF_PROTOCOL: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("192.0.0.0-192.0.0.255").unwrap(), + description: "IETF protocol assignments", +}); + +static TEST_NET_1: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("192.0.2.0-192.0.2.255").unwrap(), + description: "TEST-NET-1", +}); + +static NETWORK_INTERCONNECT: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("198.18.0.0-198.19.255.255").unwrap(), + description: "network interconnect device benchmark testing", +}); + +static TEST_NET_2: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("198.51.100.0-198.51.100.255").unwrap(), + description: "TEST-NET-2", +}); + +static TEST_NET_3: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("203.0.113.0-203.0.113.255").unwrap(), + description: "TEST-NET-3", +}); + +static FUTURE_USE: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("240.0.0.0-255.255.255.255").unwrap(), + description: "reserved for future use", +}); + +// IPv6 bogons + +static NODE_SCOPE_UNSPECIFIED: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("::").unwrap(), + description: "node-scope unicast unspecified", +}); + +static NODE_SCOPE_LOOPBACK: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("::1").unwrap(), + description: "node-scope unicast loopback", +}); + +static IPV4_MAPPED: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("::ffff:0.0.0.0-::ffff:255.255.255.255").unwrap(), + description: "IPv4-mapped", +}); + +static IPV4_COMPATIBLE: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("::-::255.255.255.255").unwrap(), + description: "IPv4-compatible", +}); + +static REMOTELY_TRIGGERED: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("100::-100::ffff:ffff:ffff:ffff").unwrap(), + description: "remotely triggered black hole", +}); + +static ORCHID: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("2001:10::-2001:1f:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), + description: "ORCHID", +}); + +static DOCUMENTATION_PREFIX: Lazy = Lazy::new(|| { + Bogon { + range: AddressCollection::new("2001:db8::-2001:db8:ffff:ffff:ffff:ffff:ffff:ffff, 3fff::-3fff:fff:ffff:ffff:ffff:ffff:ffff:ffff") + .unwrap(), + description: "documentation prefix", +} +}); + +static ULA: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), + description: "ULA", +}); + +static LINK_LOCAL_UNICAST: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), + description: "link-local unicast", +}); + +static SITE_LOCAL_UNICAST: Lazy = Lazy::new(|| Bogon { + range: AddressCollection::new("fec0::-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), + description: "site-local unicast", +}); + +// all bogons + +static BOGONS: Lazy> = Lazy::new(|| { + vec![ + &THIS_NETWORK, + &PRIVATE_USE, + &CARRIER_GRADE, + &LOOPBACK, + &LINK_LOCAL, + &IETF_PROTOCOL, + &TEST_NET_1, + &NETWORK_INTERCONNECT, + &TEST_NET_2, + &TEST_NET_3, + &FUTURE_USE, + &NODE_SCOPE_UNSPECIFIED, + &NODE_SCOPE_LOOPBACK, + &IPV4_MAPPED, + &IPV4_COMPATIBLE, + &REMOTELY_TRIGGERED, + &ORCHID, + &DOCUMENTATION_PREFIX, + &ULA, + &LINK_LOCAL_UNICAST, + &SITE_LOCAL_UNICAST, + ] +}); + +pub fn is_bogon(address: &str) -> Option<&'static str> { + let ip = IpAddr::from_str(address).ok()?; + for bogon in BOGONS.iter() { + if bogon.range.contains(&ip) { + return Some(bogon.description); + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_bogon_no() { + assert_eq!(is_bogon("8.8.8.8"), None); + } + + #[test] + fn test_is_bogon_this_network() { + assert_eq!(is_bogon("0.1.2.3"), Some("\"this\" network")); + } +} diff --git a/src/networking/types/ip_collection.rs b/src/networking/types/ip_collection.rs index e2dcfba33..687c47fe1 100644 --- a/src/networking/types/ip_collection.rs +++ b/src/networking/types/ip_collection.rs @@ -4,8 +4,8 @@ use std::str::FromStr; #[derive(Debug, Eq, PartialEq, Clone)] pub(crate) struct AddressCollection { - pub(crate) ips: Vec, - pub(crate) ranges: Vec>, + ips: Vec, + ranges: Vec>, } impl AddressCollection { diff --git a/src/networking/types/mod.rs b/src/networking/types/mod.rs index fe7dec598..93c87318a 100644 --- a/src/networking/types/mod.rs +++ b/src/networking/types/mod.rs @@ -1,5 +1,6 @@ pub mod address_port_pair; pub mod asn; +pub mod bogon; pub mod byte_multiple; pub mod capture_context; pub mod data_info; From 5d15764464862de4ca604e64ba540003207549ce Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 18 Jan 2025 17:28:28 +0100 Subject: [PATCH 03/40] test bogon IPv4 tagging --- src/networking/types/bogon.rs | 59 +++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/networking/types/bogon.rs b/src/networking/types/bogon.rs index 74cb5aceb..8f5f689d7 100644 --- a/src/networking/types/bogon.rs +++ b/src/networking/types/bogon.rs @@ -20,7 +20,7 @@ static PRIVATE_USE: Lazy = Lazy::new(|| Bogon { "10.0.0.0-10.255.255.255, 172.16.0.0-172.31.255.255, 192.168.0.0-192.168.255.255", ) .unwrap(), - description: "private-use networks", + description: "private-use", }); static CARRIER_GRADE: Lazy = Lazy::new(|| Bogon { @@ -65,7 +65,7 @@ static TEST_NET_3: Lazy = Lazy::new(|| Bogon { static FUTURE_USE: Lazy = Lazy::new(|| Bogon { range: AddressCollection::new("240.0.0.0-255.255.255.255").unwrap(), - description: "reserved for future use", + description: "future use", }); // IPv6 bogons @@ -174,4 +174,59 @@ mod tests { fn test_is_bogon_this_network() { assert_eq!(is_bogon("0.1.2.3"), Some("\"this\" network")); } + + #[test] + fn test_is_bogon_private_use_networks() { + assert_eq!(is_bogon("10.1.2.3"), Some("private-use")); + assert_eq!(is_bogon("172.22.2.3"), Some("private-use")); + assert_eq!(is_bogon("192.168.255.3"), Some("private-use")); + } + + #[test] + fn test_is_bogon_carrier_grade() { + assert_eq!(is_bogon("100.99.2.1"), Some("carrier-grade NAT")); + } + + #[test] + fn test_is_bogon_loopback() { + assert_eq!(is_bogon("127.99.2.1"), Some("loopback")); + } + + #[test] + fn test_is_bogon_link_local() { + assert_eq!(is_bogon("169.254.0.0"), Some("link local")); + } + + #[test] + fn test_is_bogon_ietf() { + assert_eq!(is_bogon("192.0.0.255"), Some("IETF protocol assignments")); + } + + #[test] + fn test_is_bogon_test_net_1() { + assert_eq!(is_bogon("192.0.2.128"), Some("TEST-NET-1")); + } + + #[test] + fn test_is_bogon_network_interconnect() { + assert_eq!( + is_bogon("198.18.2.128"), + Some("network interconnect device benchmark testing") + ); + } + + #[test] + fn test_is_bogon_test_net_2() { + assert_eq!(is_bogon("198.51.100.128"), Some("TEST-NET-2")); + } + + #[test] + fn test_is_bogon_test_net_3() { + assert_eq!(is_bogon("203.0.113.128"), Some("TEST-NET-3")); + } + + #[test] + fn test_is_bogon_future_use() { + assert_eq!(is_bogon("240.0.0.0"), Some("future use")); + } } From b9552dc56930a60ef4e4ab868692757fe3517eaf Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 18 Jan 2025 22:33:57 +0100 Subject: [PATCH 04/40] test bogon IPv6 tagging --- src/networking/types/bogon.rs | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/networking/types/bogon.rs b/src/networking/types/bogon.rs index 8f5f689d7..a546ecbe8 100644 --- a/src/networking/types/bogon.rs +++ b/src/networking/types/bogon.rs @@ -168,6 +168,7 @@ mod tests { #[test] fn test_is_bogon_no() { assert_eq!(is_bogon("8.8.8.8"), None); + assert_eq!(is_bogon("2001:4860:4860::8888"), None); } #[test] @@ -229,4 +230,55 @@ mod tests { fn test_is_bogon_future_use() { assert_eq!(is_bogon("240.0.0.0"), Some("future use")); } + + #[test] + fn test_node_scope_unspecified() { + assert_eq!(is_bogon("::"), Some("node-scope unicast unspecified")); + } + + #[test] + fn test_node_scope_loopback() { + assert_eq!(is_bogon("::1"), Some("node-scope unicast loopback")); + } + + #[test] + fn test_ipv4_mapped() { + assert_eq!(is_bogon("::ffff:8.8.8.8"), Some("IPv4-mapped")); + } + + #[test] + fn test_ipv4_compatible() { + assert_eq!(is_bogon("::8.8.8.8"), Some("IPv4-compatible")); + } + + #[test] + fn test_remotely_triggered() { + assert_eq!(is_bogon("100::beef"), Some("remotely triggered black hole")); + } + + #[test] + fn test_orchid() { + assert_eq!(is_bogon("2001:10::feed"), Some("ORCHID")); + } + + #[test] + fn test_documentation_prefix() { + assert_eq!(is_bogon("2001:db8::fe90"), Some("documentation prefix")); + assert_eq!(is_bogon("3fff::"), Some("documentation prefix")); + } + + #[test] + fn test_ula() { + assert_eq!(is_bogon("fdff::"), Some("ULA")); + } + + #[test] + fn test_link_local_unicast() { + assert_eq!(is_bogon("feaf::"), Some("link-local unicast")); + } + + #[test] + fn test_site_local_unicast() { + assert_eq!(is_bogon("feea::1"), Some("site-local unicast")); + } } From 1af5ab67dd57ea0dc0b3748fc9afc02f156be8c4 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 18 Jan 2025 22:52:48 +0100 Subject: [PATCH 05/40] update bogon icon --- resources/countries_flags/4x3/zz-bogon.svg | 48 +++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/countries_flags/4x3/zz-bogon.svg b/resources/countries_flags/4x3/zz-bogon.svg index e897f24b4..65c95a2ab 100644 --- a/resources/countries_flags/4x3/zz-bogon.svg +++ b/resources/countries_flags/4x3/zz-bogon.svg @@ -2,27 +2,27 @@ - - - - + fill="#000000" + height="855" + width="1140" + version="1.1" + id="Layer_1" + viewBox="0 0 470.24995 352.6875" + xml:space="preserve" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + + + + From 9a9d40b44ec55be7160e84404597fac2cdf86b93 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 18 Jan 2025 23:20:41 +0100 Subject: [PATCH 06/40] use bogon tooltip for local addresses when applicable --- src/countries/country_utils.rs | 51 +++++++++++++----------- src/gui/pages/connection_details_page.rs | 2 + src/translations/mod.rs | 1 + src/translations/translations_4.rs | 11 +++++ 4 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/translations/translations_4.rs diff --git a/src/countries/country_utils.rs b/src/countries/country_utils.rs index 39ac6ee8a..6b14d7f75 100644 --- a/src/countries/country_utils.rs +++ b/src/countries/country_utils.rs @@ -6,16 +6,16 @@ use iced::Font; use crate::countries::flags_pictures::{ AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, BE, BF, BG, BH, BI, - BJ, BM, BN, BO, BR, BROADCAST, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, - CN, CO, COMPUTER, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, ER, ES, - ET, FI, FJ, FK, FLAGS_WIDTH_BIG, FLAGS_WIDTH_SMALL, FM, FO, FR, GA, GB, GD, GE, GG, GH, GI, GL, - GM, GN, GQ, GR, GS, GT, GU, GW, GY, HK, HN, HOME, HR, HT, HU, ID, IE, IL, IM, IN, IO, IQ, IR, - IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, LI, LK, LR, LS, - LT, LU, LV, LY, MA, MC, MD, ME, MG, MH, MK, ML, MM, MN, MO, MP, MR, MS, MT, MU, MULTICAST, MV, - MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, - PN, PR, PS, PT, PW, PY, QA, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SK, SL, SM, SN, SO, - SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ, UA, - UG, UNKNOWN, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WS, YE, ZA, ZM, ZW, + BJ, BM, BN, BO, BOGON, BR, BROADCAST, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, + CL, CM, CN, CO, COMPUTER, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, + ER, ES, ET, FI, FJ, FK, FLAGS_WIDTH_BIG, FLAGS_WIDTH_SMALL, FM, FO, FR, GA, GB, GD, GE, GG, GH, + GI, GL, GM, GN, GQ, GR, GS, GT, GU, GW, GY, HK, HN, HOME, HR, HT, HU, ID, IE, IL, IM, IN, IO, + IQ, IR, IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, LI, LK, + LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MG, MH, MK, ML, MM, MN, MO, MP, MR, MS, MT, MU, + MULTICAST, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ, OM, PA, PE, PF, + PG, PH, PK, PL, PN, PR, PS, PT, PW, PY, QA, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SK, + SL, SM, SN, SO, SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, + TV, TW, TZ, UA, UG, UNKNOWN, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WS, YE, ZA, ZM, ZW, }; use crate::countries::types::country::Country; use crate::gui::styles::container::ContainerType; @@ -26,6 +26,7 @@ use crate::networking::types::traffic_type::TrafficType; use crate::translations::translations_2::{ local_translation, unknown_translation, your_network_adapter_translation, }; +use crate::translations::translations_4::reserved_address_translation; use crate::{Language, StyleType}; fn get_flag_from_country<'a>( @@ -358,31 +359,33 @@ pub fn get_flag_tooltip<'a>( pub fn get_computer_tooltip<'a>( is_my_address: bool, is_local: bool, + is_bogon: Option<&str>, traffic_type: TrafficType, language: Language, font: Font, ) -> Tooltip<'a, Message, StyleType> { let content = Svg::new(Handle::from_memory(Vec::from( - match (is_my_address, is_local, traffic_type) { - (true, _, _) => COMPUTER, - (false, _, TrafficType::Multicast) => MULTICAST, - (false, _, TrafficType::Broadcast) => BROADCAST, - (false, true, _) => HOME, - (false, false, TrafficType::Unicast) => UNKNOWN, + match (is_my_address, is_local, is_bogon, traffic_type) { + (true, _, _, _) => COMPUTER, + (false, _, _, TrafficType::Multicast) => MULTICAST, + (false, _, _, TrafficType::Broadcast) => BROADCAST, + (false, true, _, _) => HOME, + (false, false, Some(_), _) => BOGON, + (false, false, None, TrafficType::Unicast) => UNKNOWN, }, ))) .class(SvgType::AdaptColor) .width(FLAGS_WIDTH_BIG) .height(FLAGS_WIDTH_BIG * 0.75); - let tooltip = match (is_my_address, is_local, traffic_type) { - (true, _, _) => your_network_adapter_translation(language), - (false, _, TrafficType::Multicast) => "Multicast", - (false, _, TrafficType::Broadcast) => "Broadcast", - (false, true, _) => local_translation(language), - (false, false, TrafficType::Unicast) => unknown_translation(language), - } - .to_string(); + let tooltip = match (is_my_address, is_local, is_bogon, traffic_type) { + (true, _, _, _) => your_network_adapter_translation(language).to_string(), + (false, _, _, TrafficType::Multicast) => "Multicast".to_string(), + (false, _, _, TrafficType::Broadcast) => "Broadcast".to_string(), + (false, true, _, _) => local_translation(language).to_string(), + (false, false, Some(t), _) => reserved_address_translation(language, t), + (false, false, None, TrafficType::Unicast) => unknown_translation(language).to_string(), + }; Tooltip::new( content, diff --git a/src/gui/pages/connection_details_page.rs b/src/gui/pages/connection_details_page.rs index d293bb5bb..840011dda 100644 --- a/src/gui/pages/connection_details_page.rs +++ b/src/gui/pages/connection_details_page.rs @@ -19,6 +19,7 @@ use crate::networking::manage_packets::{ get_address_to_lookup, get_traffic_type, is_local_connection, is_my_address, }; use crate::networking::types::address_port_pair::AddressPortPair; +use crate::networking::types::bogon::is_bogon; use crate::networking::types::host::Host; use crate::networking::types::icmp_type::IcmpType; use crate::networking::types::info_address_port_pair::InfoAddressPortPair; @@ -304,6 +305,7 @@ fn get_local_tooltip<'a>( get_computer_tooltip( is_my_address(local_address, my_interface_addresses), is_local_connection(local_address, my_interface_addresses), + is_bogon(local_address), get_traffic_type( if address_to_lookup.eq(&key.address1) { &key.address2 diff --git a/src/translations/mod.rs b/src/translations/mod.rs index 342693ceb..b55b49080 100644 --- a/src/translations/mod.rs +++ b/src/translations/mod.rs @@ -2,4 +2,5 @@ pub mod translations; pub mod translations_2; pub mod translations_3; +pub mod translations_4; pub mod types; diff --git a/src/translations/translations_4.rs b/src/translations/translations_4.rs new file mode 100644 index 000000000..8a1e7ac45 --- /dev/null +++ b/src/translations/translations_4.rs @@ -0,0 +1,11 @@ +#![allow(clippy::match_same_arms)] + +use crate::translations::types::language::Language; + +pub fn reserved_address_translation(language: Language, info: &str) -> String { + match language { + Language::EN => format!("Reserved address ({info})"), + Language::IT => format!("Indirizzo riservato ({info})"), + _ => format!("Reserved address ({info})"), + } +} From 3f57927d2c95786820372bb6eabb8df372c965c3 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sun, 19 Jan 2025 17:23:05 +0100 Subject: [PATCH 07/40] use bogon tooltip for remote hosts when applicable --- src/countries/country_utils.rs | 20 ++++++++++++++------ src/networking/manage_packets.rs | 3 +++ src/networking/types/data_info_host.rs | 2 ++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/countries/country_utils.rs b/src/countries/country_utils.rs index 6b14d7f75..593947d87 100644 --- a/src/countries/country_utils.rs +++ b/src/countries/country_utils.rs @@ -34,6 +34,7 @@ fn get_flag_from_country<'a>( width: f32, is_local: bool, is_loopback: bool, + is_bogon: Option<&str>, traffic_type: TrafficType, language: Language, ) -> (Svg<'a, StyleType>, String) { @@ -288,19 +289,24 @@ fn get_flag_from_country<'a>( Country::ZW => ZW, Country::ZZ => { let (flag, new_tooltip) = if is_loopback { - (COMPUTER, your_network_adapter_translation(language)) + ( + COMPUTER, + your_network_adapter_translation(language).to_string(), + ) } else if traffic_type.eq(&TrafficType::Multicast) { - (MULTICAST, "Multicast") + (MULTICAST, "Multicast".to_string()) } else if traffic_type.eq(&TrafficType::Broadcast) { - (BROADCAST, "Broadcast") + (BROADCAST, "Broadcast".to_string()) } else if is_local { - (HOME, local_translation(language)) + (HOME, local_translation(language).to_string()) + } else if let Some(bogon) = is_bogon { + (BOGON, reserved_address_translation(language, bogon)) } else { - (UNKNOWN, unknown_translation(language)) + (UNKNOWN, unknown_translation(language).to_string()) }; svg_style = SvgType::AdaptColor; - tooltip = new_tooltip.to_string(); + tooltip = new_tooltip; flag } }))) @@ -325,12 +331,14 @@ pub fn get_flag_tooltip<'a>( }; let is_local = host_info.is_local; let is_loopback = host_info.is_loopback; + let is_bogon = host_info.is_bogon; let traffic_type = host_info.traffic_type; let (content, tooltip) = get_flag_from_country( country, width, is_local, is_loopback, + is_bogon, traffic_type, language, ); diff --git a/src/networking/manage_packets.rs b/src/networking/manage_packets.rs index 7f4576bd8..7f2a35f45 100644 --- a/src/networking/manage_packets.rs +++ b/src/networking/manage_packets.rs @@ -12,6 +12,7 @@ use crate::mmdb::asn::get_asn; use crate::mmdb::country::get_country; use crate::mmdb::types::mmdb_reader::MmdbReaders; use crate::networking::types::address_port_pair::AddressPortPair; +use crate::networking::types::bogon::is_bogon; use crate::networking::types::data_info_host::DataInfoHost; use crate::networking::types::host::Host; use crate::networking::types::host_data_states::HostData; @@ -320,6 +321,7 @@ pub fn reverse_dns_lookup( ); let is_loopback = is_loopback(&address_to_lookup); let is_local = is_local_connection(&address_to_lookup, &my_interface_addresses); + let is_bogon = is_bogon(&address_to_lookup); let country = get_country(&address_to_lookup, &mmdb_readers.country); let asn = get_asn(&address_to_lookup, &mmdb_readers.asn); let r_dns = if let Ok(result) = lookup_result { @@ -358,6 +360,7 @@ pub fn reverse_dns_lookup( is_favorite: false, is_loopback, is_local, + is_bogon, traffic_type, }); diff --git a/src/networking/types/data_info_host.rs b/src/networking/types/data_info_host.rs index 5c052ac96..a8459b951 100644 --- a/src/networking/types/data_info_host.rs +++ b/src/networking/types/data_info_host.rs @@ -14,6 +14,8 @@ pub struct DataInfoHost { pub is_loopback: bool, /// Determine if the connection with this host is local pub is_local: bool, + /// Determine if the connection is with a bogon address + pub is_bogon: Option<&'static str>, /// Determine if the connection with this host is unicast, multicast, or broadcast pub traffic_type: TrafficType, } From fbf63c11b141b5ea82ac0a1ed728547773cb4a4e Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sun, 19 Jan 2025 17:43:39 +0100 Subject: [PATCH 08/40] update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a73cf7b6..78c323b83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All Sniffnet releases with the relative changes are documented in this file. +## [UNRELEASED] +- Identify and tag unassigned/reserved "bogon" IP addresses ([#678](https://github.com/GyulyVGC/sniffnet/pull/678) — fixes [#209](https://github.com/GyulyVGC/sniffnet/issues/209)) + ## [1.3.2] - 2025-01-06 - Dropdown menus for network host filters ([#659](https://github.com/GyulyVGC/sniffnet/pull/659) — fixes [#354](https://github.com/GyulyVGC/sniffnet/issues/354)) - Added CLI argument `--adapter []` to allow immediately starting the capture from a given network interface ([#643](https://github.com/GyulyVGC/sniffnet/pull/643) — fixes [#636](https://github.com/GyulyVGC/sniffnet/issues/636)) From 5067cb6eb93bd987e64441ef6eff2dff94d3b77c Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sun, 19 Jan 2025 22:26:51 +0100 Subject: [PATCH 09/40] update README's Acknowledgements section --- README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.md b/README.md index 16319e892..87e6922ac 100644 --- a/README.md +++ b/README.md @@ -235,13 +235,6 @@ ICED_BACKEND=tiny-skia ## Acknowledgements - A big shout-out to [all the contributors](https://github.com/GyulyVGC/sniffnet/blob/main/CONTRIBUTORS.md) of Sniffnet! - - The graphical user interface has been realized with [iced](https://github.com/iced-rs/iced), a cross-platform GUI library for Rust focused on simplicity and type-safety - -

- - - -

- +- IP geolocation and ASN data are provided by [MaxMind](https://www.maxmind.com) - Last but not least, thanks to [every single stargazer](https://github.com/GyulyVGC/sniffnet/stargazers): all forms of support made it possible to keep improving Sniffnet! From 71c4f8f771f10d7d3a63c1cee57d807d0b8963bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 04:02:30 +0000 Subject: [PATCH 10/40] Bump clap from 4.5.26 to 4.5.27 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.26 to 4.5.27. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.26...clap_complete-v4.5.27) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55c466aaa..57699f048 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -657,9 +657,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -667,9 +667,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", diff --git a/Cargo.toml b/Cargo.toml index 38414fde8..e247acb53 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ rfd = "0.15.2" phf = "0.11.3" phf_shared = "0.11.3" splines = "4.4.1" -clap = { version = "4.5.26", features = ["derive"] } +clap = { version = "4.5.27", features = ["derive"] } [target.'cfg(windows)'.dependencies] gag = "1.0.0" From 2a0d64161c52b906f87d754b96f5134375681ead Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Thu, 23 Jan 2025 00:12:37 +0100 Subject: [PATCH 11/40] show data agglomerates in inspect page table --- src/gui/pages/inspect_page.rs | 41 +++++++++++++++++++++++++++++++- src/gui/pages/overview_page.rs | 2 +- src/report/get_report_entries.rs | 30 ++++++++++++++++++++--- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/gui/pages/inspect_page.rs b/src/gui/pages/inspect_page.rs index db824d053..6014034ba 100644 --- a/src/gui/pages/inspect_page.rs +++ b/src/gui/pages/inspect_page.rs @@ -13,6 +13,7 @@ use iced::{alignment, Alignment, Font, Length, Padding, Pixels}; use crate::gui::components::tab::get_pages_tabs; use crate::gui::components::types::my_modal::MyModal; +use crate::gui::pages::overview_page::get_bars; use crate::gui::styles::button::ButtonType; use crate::gui::styles::container::ContainerType; use crate::gui::styles::scrollbar::ScrollbarType; @@ -21,6 +22,7 @@ use crate::gui::styles::text::TextType; use crate::gui::styles::text_input::TextInputType; use crate::gui::types::message::Message; use crate::networking::types::address_port_pair::AddressPortPair; +use crate::networking::types::byte_multiple::ByteMultiple; use crate::networking::types::host_data_states::HostStates; use crate::networking::types::info_address_port_pair::InfoAddressPortPair; use crate::networking::types::traffic_direction::TrafficDirection; @@ -116,7 +118,8 @@ fn lazy_report<'a>(sniffer: &Sniffer) -> Column<'a, Message, StyleType> { } = sniffer.configs.lock().unwrap().settings; let font = style.get_extension().font; - let (search_results, results_number) = get_searched_entries(sniffer); + let (search_results, results_number, packets, in_bytes, out_bytes) = + get_searched_entries(sniffer); let mut ret_val = Column::new() .height(Length::Fill) @@ -147,6 +150,8 @@ fn lazy_report<'a>(sniffer: &Sniffer) -> Column<'a, Message, StyleType> { .width(Length::Fill), ) .push(Rule::horizontal(5)) + .push(get_agglomerates_row(font, packets, in_bytes, out_bytes)) + .push(Rule::horizontal(5)) .push(get_change_page_row( font, language, @@ -547,6 +552,40 @@ fn get_button_change_page<'a>(increment: bool) -> Button<'a, Message, StyleType> .on_press(Message::UpdatePageNumber(increment)) } +fn get_agglomerates_row<'a>( + font: Font, + tot_packets: u128, + tot_in_bytes: u128, + tot_out_bytes: u128, +) -> Row<'a, Message, StyleType> { + let tot_bytes = tot_in_bytes + tot_out_bytes; + let width = ReportCol::ALL + .iter() + .filter(|x| *x != &ReportCol::Bytes && *x != &ReportCol::Packets) + .fold(0.0, |acc, x| acc + x.get_width()); + let in_length = width * (tot_in_bytes as f32 / tot_bytes as f32); + let out_length = width - in_length; + let bars = get_bars(in_length, out_length); + + let bytes_col = Column::new() + .align_x(Alignment::Center) + .width(ReportCol::Bytes.get_width()) + .push(Text::new(ByteMultiple::formatted_string(tot_bytes)).font(font)); + + let packets_col = Column::new() + .align_x(Alignment::Center) + .width(ReportCol::Packets.get_width()) + .push(Text::new(tot_packets.to_string()).font(font)); + + Row::new() + .padding([0, 2]) + .height(40) + .align_y(Alignment::Center) + .push(bars) + .push(bytes_col) + .push(packets_col) +} + fn get_change_page_row<'a>( font: Font, language: Language, diff --git a/src/gui/pages/overview_page.rs b/src/gui/pages/overview_page.rs index 5dae518da..b4324ad41 100644 --- a/src/gui/pages/overview_page.rs +++ b/src/gui/pages/overview_page.rs @@ -736,7 +736,7 @@ fn get_bars_length( (in_len, out_len) } -fn get_bars<'a>(in_len: f32, out_len: f32) -> Row<'a, Message, StyleType> { +pub fn get_bars<'a>(in_len: f32, out_len: f32) -> Row<'a, Message, StyleType> { Row::new() .push(if in_len > 0.0 { Row::new() diff --git a/src/report/get_report_entries.rs b/src/report/get_report_entries.rs index 367a3363d..38fe8eb82 100644 --- a/src/report/get_report_entries.rs +++ b/src/report/get_report_entries.rs @@ -7,14 +7,22 @@ use crate::networking::types::data_info::DataInfo; use crate::networking::types::data_info_host::DataInfoHost; use crate::networking::types::host::Host; use crate::networking::types::info_address_port_pair::InfoAddressPortPair; +use crate::networking::types::traffic_direction::TrafficDirection; use crate::report::types::sort_type::SortType; use crate::{ChartType, InfoTraffic, ReportSortType, Service, Sniffer}; -/// Returns the elements which satisfy the search constraints and belong to the given page, -/// and the total number of elements which satisfy the search constraints +/// Return the elements that satisfy the search constraints and belong to the given page, +/// and the total number of elements which satisfy the search constraints, +/// with their packets, in-bytes, and out-bytes count pub fn get_searched_entries( sniffer: &Sniffer, -) -> (Vec<(AddressPortPair, InfoAddressPortPair)>, usize) { +) -> ( + Vec<(AddressPortPair, InfoAddressPortPair)>, + usize, + u128, + u128, + u128, +) { let info_traffic_lock = sniffer.info_traffic.lock().unwrap(); let mut all_results: Vec<(&AddressPortPair, &InfoAddressPortPair)> = info_traffic_lock .map @@ -32,6 +40,19 @@ pub fn get_searched_entries( .match_entry(key, value, r_dns_host, is_favorite) }) .collect(); + + let mut tot_packets = 0; + let mut tot_in_bytes = 0; + let mut tot_out_bytes = 0; + all_results.iter().for_each(|(_, val)| { + tot_packets += val.transmitted_packets; + if val.traffic_direction == TrafficDirection::Outgoing { + tot_out_bytes += val.transmitted_bytes; + } else { + tot_in_bytes += val.transmitted_bytes; + } + }); + all_results.sort_by(|&(_, a), &(_, b)| match sniffer.report_sort_type { ReportSortType { byte_sort, @@ -62,6 +83,9 @@ pub fn get_searched_entries( .map(|&(key, val)| (key.to_owned(), val.to_owned())) .collect(), all_results.len(), + tot_packets, + tot_in_bytes, + tot_out_bytes, ) } From b4d7a8d810e378dece5611aa7028a59da284ee5a Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Thu, 23 Jan 2025 23:55:47 +0100 Subject: [PATCH 12/40] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78c323b83..cf431fa37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All Sniffnet releases with the relative changes are documented in this file. ## [UNRELEASED] - Identify and tag unassigned/reserved "bogon" IP addresses ([#678](https://github.com/GyulyVGC/sniffnet/pull/678) — fixes [#209](https://github.com/GyulyVGC/sniffnet/issues/209)) +- Show data agglomerates in _Inspect_ page table ([#684](https://github.com/GyulyVGC/sniffnet/pull/684) — fixes [#601](https://github.com/GyulyVGC/sniffnet/issues/601)) ## [1.3.2] - 2025-01-06 - Dropdown menus for network host filters ([#659](https://github.com/GyulyVGC/sniffnet/pull/659) — fixes [#354](https://github.com/GyulyVGC/sniffnet/issues/354)) From 957e30012b89e5cec406afcacec09eb3066397c8 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Fri, 24 Jan 2025 00:06:16 +0100 Subject: [PATCH 13/40] fix clippy pedantic lints --- src/gui/pages/inspect_page.rs | 1 + src/report/get_report_entries.rs | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/gui/pages/inspect_page.rs b/src/gui/pages/inspect_page.rs index 6014034ba..4367d4248 100644 --- a/src/gui/pages/inspect_page.rs +++ b/src/gui/pages/inspect_page.rs @@ -563,6 +563,7 @@ fn get_agglomerates_row<'a>( .iter() .filter(|x| *x != &ReportCol::Bytes && *x != &ReportCol::Packets) .fold(0.0, |acc, x| acc + x.get_width()); + #[allow(clippy::cast_precision_loss)] let in_length = width * (tot_in_bytes as f32 / tot_bytes as f32); let out_length = width - in_length; let bars = get_bars(in_length, out_length); diff --git a/src/report/get_report_entries.rs b/src/report/get_report_entries.rs index 38fe8eb82..e1c1da5b4 100644 --- a/src/report/get_report_entries.rs +++ b/src/report/get_report_entries.rs @@ -23,6 +23,9 @@ pub fn get_searched_entries( u128, u128, ) { + let mut tot_packets = 0; + let mut tot_in_bytes = 0; + let mut tot_out_bytes = 0; let info_traffic_lock = sniffer.info_traffic.lock().unwrap(); let mut all_results: Vec<(&AddressPortPair, &InfoAddressPortPair)> = info_traffic_lock .map @@ -39,20 +42,17 @@ pub fn get_searched_entries( .search .match_entry(key, value, r_dns_host, is_favorite) }) + .map(|(key, val)| { + tot_packets += val.transmitted_packets; + if val.traffic_direction == TrafficDirection::Outgoing { + tot_out_bytes += val.transmitted_bytes; + } else { + tot_in_bytes += val.transmitted_bytes; + } + (key, val) + }) .collect(); - let mut tot_packets = 0; - let mut tot_in_bytes = 0; - let mut tot_out_bytes = 0; - all_results.iter().for_each(|(_, val)| { - tot_packets += val.transmitted_packets; - if val.traffic_direction == TrafficDirection::Outgoing { - tot_out_bytes += val.transmitted_bytes; - } else { - tot_in_bytes += val.transmitted_bytes; - } - }); - all_results.sort_by(|&(_, a), &(_, b)| match sniffer.report_sort_type { ReportSortType { byte_sort, From fcfd8656244bc135401f888a1cc3113caef2b05e Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Fri, 24 Jan 2025 00:20:25 +0100 Subject: [PATCH 14/40] add constant ReportCol::FILTER_COLUMNS_WIDTH --- src/gui/pages/inspect_page.rs | 5 +---- src/report/types/report_col.rs | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/gui/pages/inspect_page.rs b/src/gui/pages/inspect_page.rs index 4367d4248..e36060c18 100644 --- a/src/gui/pages/inspect_page.rs +++ b/src/gui/pages/inspect_page.rs @@ -559,10 +559,7 @@ fn get_agglomerates_row<'a>( tot_out_bytes: u128, ) -> Row<'a, Message, StyleType> { let tot_bytes = tot_in_bytes + tot_out_bytes; - let width = ReportCol::ALL - .iter() - .filter(|x| *x != &ReportCol::Bytes && *x != &ReportCol::Packets) - .fold(0.0, |acc, x| acc + x.get_width()); + let width = ReportCol::FILTER_COLUMNS_WIDTH; #[allow(clippy::cast_precision_loss)] let in_length = width * (tot_in_bytes as f32 / tot_bytes as f32); let out_length = width - in_length; diff --git a/src/report/types/report_col.rs b/src/report/types/report_col.rs index bbcf4c6b5..dd5e5fb40 100644 --- a/src/report/types/report_col.rs +++ b/src/report/types/report_col.rs @@ -41,6 +41,8 @@ impl ReportCol { ReportCol::Packets, ]; + pub(crate) const FILTER_COLUMNS_WIDTH: f32 = 4.0 * SMALL_COL_WIDTH + 2.0 * LARGE_COL_WIDTH; + pub(crate) fn get_title(&self, language: Language) -> String { match self { ReportCol::SrcIp | ReportCol::DstIp => address_translation(language).to_string(), From 5a3becc0047abf50f9f70cd94125c5cdbabcd16d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 03:07:21 +0000 Subject: [PATCH 15/40] Bump splines from 4.4.1 to 4.4.2 Bumps splines from 4.4.1 to 4.4.2. --- updated-dependencies: - dependency-name: splines dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57699f048..a437c94fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4576,9 +4576,9 @@ dependencies = [ [[package]] name = "splines" -version = "4.4.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef39a4cf041b421dd2b4dd2da7f30bb7059be7a1872fb4f56114b53303d0e1e" +checksum = "3278aafb315f972aa58d958e3f6b8ef60ceb7723bfedfbd00399c73ed0570583" [[package]] name = "stable_deref_trait" diff --git a/Cargo.toml b/Cargo.toml index e247acb53..827a5b076 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,7 +52,7 @@ ctrlc = { version = "3.4.5", features = ["termination"] } rfd = "0.15.2" phf = "0.11.3" phf_shared = "0.11.3" -splines = "4.4.1" +splines = "4.4.2" clap = { version = "4.5.27", features = ["derive"] } [target.'cfg(windows)'.dependencies] From c3f5008e58795d7a265c1014a4798078645317f7 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Fri, 31 Jan 2025 10:13:02 +0100 Subject: [PATCH 16/40] add logos for sniffnet apparel --- .../logos/stickers/glyph_for_dark_bg.svg | 57 +++++++++++++++++++ .../logos/stickers/glyph_for_light_bg.svg | 57 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 resources/logos/stickers/glyph_for_dark_bg.svg create mode 100644 resources/logos/stickers/glyph_for_light_bg.svg diff --git a/resources/logos/stickers/glyph_for_dark_bg.svg b/resources/logos/stickers/glyph_for_dark_bg.svg new file mode 100644 index 000000000..e47c6cf09 --- /dev/null +++ b/resources/logos/stickers/glyph_for_dark_bg.svg @@ -0,0 +1,57 @@ + + diff --git a/resources/logos/stickers/glyph_for_light_bg.svg b/resources/logos/stickers/glyph_for_light_bg.svg new file mode 100644 index 000000000..ff295394c --- /dev/null +++ b/resources/logos/stickers/glyph_for_light_bg.svg @@ -0,0 +1,57 @@ + + From c109f7c302e480c094c7daae7a0c648632e05195 Mon Sep 17 00:00:00 2001 From: guilherme-demarchi Date: Fri, 31 Jan 2025 23:51:48 -0300 Subject: [PATCH 17/40] Update translations_3.rs Language: Portuguese (Brazil) --- src/translations/translations_3.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/translations/translations_3.rs b/src/translations/translations_3.rs index 7e2005699..e6129a171 100644 --- a/src/translations/translations_3.rs +++ b/src/translations/translations_3.rs @@ -23,6 +23,7 @@ pub fn general_translation(language: Language) -> &'static str { Language::ZH => "通用", Language::KO => "일반", Language::TR => "Genel", + Language::PT => "Geral", _ => "General", } } @@ -35,6 +36,7 @@ pub fn zoom_translation(language: Language) -> &'static str { | Language::FR | Language::DE | Language::RO + | Language::PT | Language::SV => "Zoom", // Language::FA => "بزرگنمایی", Language::PL => "Powiększenie", @@ -67,6 +69,7 @@ pub fn mmdb_files_translation(language: Language) -> &'static str { Language::ZH => "数据库文件", Language::KO => "데이터베이스 파일", Language::TR => "Veri tabanı dosyaları", + Language::PT => "Arquivos da base de dados", _ => "Database files", } } @@ -89,6 +92,7 @@ pub fn params_not_editable_translation(language: Language) -> &'static str { Language::ZH => "以下参数在分析过程中不能修改", Language::KO => "분석 중 다음의 매개변수들은 수정할 수 없습니다", Language::TR => "Analiz sırasında bu parametrelere müdahale edilemez", + Language::PT => "Os seguintes parâmetros não podem ser modificados durante a análise", _ => "The following parameters can't be modified during the analysis", } } @@ -111,6 +115,7 @@ pub fn custom_style_translation(language: Language) -> &'static str { Language::ZH => "自定义样式", Language::KO => "사용자 지정 스타일", Language::TR => "Kişisel görünüm", + Language::PT => "Estilo personalizado", _ => "Custom style", } } @@ -131,6 +136,7 @@ pub fn copy_translation(language: Language) -> &'static str { Language::ZH => "复制", Language::KO => "복사", Language::TR => "Kopyala", + Language::PT => "Copiar", _ => "Copy", } } @@ -153,6 +159,7 @@ pub fn port_translation(language: Language) -> &'static str { Language::VI => "Cổng", Language::ZH => "端口", Language::KO => "포트", + Language::PT => "Porta", _ => "Port", } } @@ -175,6 +182,7 @@ pub fn invalid_filters_translation(language: Language) -> &'static str { Language::ZH => "无效的过滤器", Language::KO => "잘못된 필터", Language::TR => "Geçersiz filtreler", + Language::PT => "Filtros inválidos", _ => "Invalid filters", } } @@ -196,6 +204,7 @@ pub fn messages_translation(language: Language) -> &'static str { Language::ZH => "信息", Language::KO => "메시지", Language::TR => "Mesajlar", + Language::PT => "Mensagens", _ => "Messages", } } @@ -218,6 +227,7 @@ pub fn link_type_translation(language: Language) -> &'static str { Language::ZH => "链接类型", Language::KO => "링크 유형", Language::TR => "Link türü", + Language::PT => "Tipo de conexão", _ => "Link type", } } @@ -243,6 +253,7 @@ pub fn unsupported_link_type_translation<'a>( Language::ZH => "Sniffnet 尚不支持与此适配器关联的链接类型...", Language::KO => "이 어댑터와 연결된 링크 유형은 Sniffnet에서 아직 지원되지 않습니다...", Language::TR => "Bu adaptör ile ilişkilendirilmiş link türü henüz Sniffnet tarafından desteklenmiyor...", + Language::PT => "O tipo de conexão associado com este adaptador não é suportado pelo Sniffnet ainda...", _ => "The link type associated with this adapter is not supported by Sniffnet yet...", }; @@ -270,6 +281,7 @@ pub fn style_from_file_translation(language: Language) -> &'static str { Language::ZH => "从文件中选择样式", Language::KO => "파일에서 스타일을 선택하세요", Language::TR => "Dosyadan bir görünüm seç", + Language::PT => "Selecionar estilo a partir de um arquivo", _ => "Select style from a file", } } @@ -292,6 +304,7 @@ pub fn database_from_file_translation(language: Language) -> &'static str { Language::ZH => "选择数据库文件", Language::KO => "데이터베이스 파일 선택", Language::TR => "Veri tabanı dosyası seç", + Language::PT => "Selecione um arquivo de base de dados", _ => "Select database file", } } @@ -314,6 +327,7 @@ pub fn filter_by_host_translation(language: Language) -> &'static str { Language::ZH => "按网络主机筛选", Language::KO => "네트워크 호스트로 필터링", Language::TR => "Ağ sunucusuna göre filtrele", + Language::PT => "Filtrar por host de rede", _ => "Filter by network host", } } @@ -333,6 +347,7 @@ pub fn service_translation(language: Language) -> &'static str { Language::ZH => "服务", Language::KO => "서비스", Language::TR => "Servis", + Language::PT => "Serviço", _ => "Service", } } @@ -354,6 +369,7 @@ pub fn export_capture_translation(language: Language) -> &'static str { Language::ZH => "导出捕获文件", Language::KO => "캡처 파일 내보내기", Language::TR => "Yakalanan dosyayı dışa aktar", + Language::PT => "Exportar arquivo capturado", _ => "Export capture file", } } @@ -374,6 +390,7 @@ pub fn directory_translation(language: Language) -> &'static str { Language::ZH => "目录", Language::KO => "디렉토리", Language::TR => "Klasör", + Language::PT => "Diretório", _ => "Directory", } } @@ -395,6 +412,7 @@ pub fn select_directory_translation(language: Language) -> &'static str { Language::ZH => "选择目标目录", Language::KO => "대상 디렉토리 선택", Language::TR => "Hedef klasörü seç", + Language::PT => "Selecionar diretório de destino", _ => "Select destination directory", } } @@ -416,6 +434,7 @@ pub fn file_name_translation(language: Language) -> &'static str { Language::ZH => "文件名", Language::KO => "파일 이름", Language::TR => "Dosya adı", + Language::PT => "Nome do arquivo", _ => "File name", } } @@ -437,6 +456,7 @@ pub fn thumbnail_mode_translation(language: Language) -> &'static str { Language::ZH => "缩略图模式", Language::KO => "썸네일 모드", Language::TR => "Küçük resim modu", + Language::PT => "Modo miniatura", _ => "Thumbnail mode", } } @@ -458,6 +478,7 @@ pub fn learn_more_translation(language: Language) -> &'static str { Language::ZH => "想知道更多吗?", Language::KO => "더 자세히 알고 싶으십니까?", Language::TR => "Daha fazlasını öğrenmek ister misin?", + Language::PT => "Quer aprender mais?", _ => "Do you want to learn more?", } } From c13607f1e7bb599454c674bd488a1f80a370318b Mon Sep 17 00:00:00 2001 From: guilherme-demarchi Date: Fri, 31 Jan 2025 23:54:50 -0300 Subject: [PATCH 18/40] Update translations_4.rs --- src/translations/translations_4.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/translations/translations_4.rs b/src/translations/translations_4.rs index 8a1e7ac45..2ac2dd713 100644 --- a/src/translations/translations_4.rs +++ b/src/translations/translations_4.rs @@ -6,6 +6,7 @@ pub fn reserved_address_translation(language: Language, info: &str) -> String { match language { Language::EN => format!("Reserved address ({info})"), Language::IT => format!("Indirizzo riservato ({info})"), + Language::PT => format!("Endereço reservado ({info})"), _ => format!("Reserved address ({info})"), } } From ae068d228bda8e8341fe56dd7960e14371fbbfd7 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 1 Feb 2025 11:17:02 +0100 Subject: [PATCH 19/40] show data agglomerates in inspect page corresponding to the selected data representation in overview page --- src/gui/pages/inspect_page.rs | 26 ++++++++++++++++++-------- src/networking/types/data_info.rs | 12 ++++++++++++ src/report/get_report_entries.rs | 21 ++++++++------------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/gui/pages/inspect_page.rs b/src/gui/pages/inspect_page.rs index e36060c18..13cb7c145 100644 --- a/src/gui/pages/inspect_page.rs +++ b/src/gui/pages/inspect_page.rs @@ -11,6 +11,7 @@ use iced::widget::{ use iced::widget::{lazy, Button, Column, Container, Row, Scrollable, Text, TextInput}; use iced::{alignment, Alignment, Font, Length, Padding, Pixels}; +use crate::chart::types::chart_type::ChartType; use crate::gui::components::tab::get_pages_tabs; use crate::gui::components::types::my_modal::MyModal; use crate::gui::pages::overview_page::get_bars; @@ -23,6 +24,7 @@ use crate::gui::styles::text_input::TextInputType; use crate::gui::types::message::Message; use crate::networking::types::address_port_pair::AddressPortPair; use crate::networking::types::byte_multiple::ByteMultiple; +use crate::networking::types::data_info::DataInfoWithoutTimestamp; use crate::networking::types::host_data_states::HostStates; use crate::networking::types::info_address_port_pair::InfoAddressPortPair; use crate::networking::types::traffic_direction::TrafficDirection; @@ -118,8 +120,7 @@ fn lazy_report<'a>(sniffer: &Sniffer) -> Column<'a, Message, StyleType> { } = sniffer.configs.lock().unwrap().settings; let font = style.get_extension().font; - let (search_results, results_number, packets, in_bytes, out_bytes) = - get_searched_entries(sniffer); + let (search_results, results_number, agglomerate) = get_searched_entries(sniffer); let mut ret_val = Column::new() .height(Length::Fill) @@ -150,7 +151,11 @@ fn lazy_report<'a>(sniffer: &Sniffer) -> Column<'a, Message, StyleType> { .width(Length::Fill), ) .push(Rule::horizontal(5)) - .push(get_agglomerates_row(font, packets, in_bytes, out_bytes)) + .push(get_agglomerates_row( + font, + agglomerate, + sniffer.traffic_chart.chart_type, + )) .push(Rule::horizontal(5)) .push(get_change_page_row( font, @@ -554,14 +559,19 @@ fn get_button_change_page<'a>(increment: bool) -> Button<'a, Message, StyleType> fn get_agglomerates_row<'a>( font: Font, - tot_packets: u128, - tot_in_bytes: u128, - tot_out_bytes: u128, + tot: DataInfoWithoutTimestamp, + chart_type: ChartType, ) -> Row<'a, Message, StyleType> { - let tot_bytes = tot_in_bytes + tot_out_bytes; + let tot_packets = tot.incoming_packets + tot.outgoing_packets; + let tot_bytes = tot.incoming_bytes + tot.outgoing_bytes; let width = ReportCol::FILTER_COLUMNS_WIDTH; + #[allow(clippy::cast_precision_loss)] - let in_length = width * (tot_in_bytes as f32 / tot_bytes as f32); + let in_length = if chart_type == ChartType::Packets { + width * (tot.incoming_packets as f32 / tot_packets as f32) + } else { + width * (tot.incoming_bytes as f32 / tot_bytes as f32) + }; let out_length = width - in_length; let bars = get_bars(in_length, out_length); diff --git a/src/networking/types/data_info.rs b/src/networking/types/data_info.rs index 0408b63b2..766cc3405 100644 --- a/src/networking/types/data_info.rs +++ b/src/networking/types/data_info.rs @@ -122,3 +122,15 @@ impl AddAssign for DataInfo { self.final_timestamp = Local::now(); } } + +#[derive(Clone, Default, Copy)] +pub struct DataInfoWithoutTimestamp { + /// Incoming packets + pub incoming_packets: u128, + /// Outgoing packets + pub outgoing_packets: u128, + /// Incoming bytes + pub incoming_bytes: u128, + /// Outgoing bytes + pub outgoing_bytes: u128, +} diff --git a/src/report/get_report_entries.rs b/src/report/get_report_entries.rs index e1c1da5b4..893f12375 100644 --- a/src/report/get_report_entries.rs +++ b/src/report/get_report_entries.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use crate::networking::manage_packets::get_address_to_lookup; use crate::networking::types::address_port_pair::AddressPortPair; -use crate::networking::types::data_info::DataInfo; +use crate::networking::types::data_info::{DataInfo, DataInfoWithoutTimestamp}; use crate::networking::types::data_info_host::DataInfoHost; use crate::networking::types::host::Host; use crate::networking::types::info_address_port_pair::InfoAddressPortPair; @@ -19,13 +19,9 @@ pub fn get_searched_entries( ) -> ( Vec<(AddressPortPair, InfoAddressPortPair)>, usize, - u128, - u128, - u128, + DataInfoWithoutTimestamp, ) { - let mut tot_packets = 0; - let mut tot_in_bytes = 0; - let mut tot_out_bytes = 0; + let mut agglomerate = DataInfoWithoutTimestamp::default(); let info_traffic_lock = sniffer.info_traffic.lock().unwrap(); let mut all_results: Vec<(&AddressPortPair, &InfoAddressPortPair)> = info_traffic_lock .map @@ -43,11 +39,12 @@ pub fn get_searched_entries( .match_entry(key, value, r_dns_host, is_favorite) }) .map(|(key, val)| { - tot_packets += val.transmitted_packets; if val.traffic_direction == TrafficDirection::Outgoing { - tot_out_bytes += val.transmitted_bytes; + agglomerate.outgoing_packets += val.transmitted_packets; + agglomerate.outgoing_bytes += val.transmitted_bytes; } else { - tot_in_bytes += val.transmitted_bytes; + agglomerate.incoming_packets += val.transmitted_packets; + agglomerate.incoming_bytes += val.transmitted_bytes; } (key, val) }) @@ -83,9 +80,7 @@ pub fn get_searched_entries( .map(|&(key, val)| (key.to_owned(), val.to_owned())) .collect(), all_results.len(), - tot_packets, - tot_in_bytes, - tot_out_bytes, + agglomerate, ) } From 5e49ab2a6d4a1ce216e892550927a182b5f88a3b Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 1 Feb 2025 11:35:06 +0100 Subject: [PATCH 20/40] unify duplicated translation cases --- src/translations/translations_3.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/translations/translations_3.rs b/src/translations/translations_3.rs index e6129a171..471988b22 100644 --- a/src/translations/translations_3.rs +++ b/src/translations/translations_3.rs @@ -101,7 +101,7 @@ pub fn custom_style_translation(language: Language) -> &'static str { match language { Language::EN => "Custom style", // Language::FA => "شیوه سفارشی", - Language::ES => "Estilo personalizado", + Language::ES | Language::PT => "Estilo personalizado", Language::IT => "Stile personalizzato", Language::FR => "Style personnalisé", Language::DE => "Benutzerdefinierter Stil", @@ -115,7 +115,6 @@ pub fn custom_style_translation(language: Language) -> &'static str { Language::ZH => "自定义样式", Language::KO => "사용자 지정 스타일", Language::TR => "Kişisel görünüm", - Language::PT => "Estilo personalizado", _ => "Custom style", } } @@ -153,13 +152,12 @@ pub fn port_translation(language: Language) -> &'static str { | Language::TR => "Port", // Language::FA => "درگاه", Language::ES => "Puerto", - Language::IT => "Porta", + Language::IT | Language::PT => "Porta", Language::RU => "Порт", Language::JA => "ポート", Language::VI => "Cổng", Language::ZH => "端口", Language::KO => "포트", - Language::PT => "Porta", _ => "Port", } } @@ -168,7 +166,7 @@ pub fn invalid_filters_translation(language: Language) -> &'static str { match language { Language::EN => "Invalid filters", // Language::FA => "صافی نامعتبر", - Language::ES => "Filtros inválidos", + Language::ES | Language::PT => "Filtros inválidos", Language::IT => "Filtri non validi", Language::FR => "Filtres invalides", Language::DE => "Ungültige Filter", @@ -182,7 +180,6 @@ pub fn invalid_filters_translation(language: Language) -> &'static str { Language::ZH => "无效的过滤器", Language::KO => "잘못된 필터", Language::TR => "Geçersiz filtreler", - Language::PT => "Filtros inválidos", _ => "Invalid filters", } } From b2c37e796afb07159a714e24ffdcbe6bad3fad29 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 1 Feb 2025 11:46:30 +0100 Subject: [PATCH 21/40] update CHANGELOG and translations status --- CHANGELOG.md | 1 + src/translations/types/language.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf431fa37..de1ba36e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All Sniffnet releases with the relative changes are documented in this file. ## [UNRELEASED] - Identify and tag unassigned/reserved "bogon" IP addresses ([#678](https://github.com/GyulyVGC/sniffnet/pull/678) — fixes [#209](https://github.com/GyulyVGC/sniffnet/issues/209)) - Show data agglomerates in _Inspect_ page table ([#684](https://github.com/GyulyVGC/sniffnet/pull/684) — fixes [#601](https://github.com/GyulyVGC/sniffnet/issues/601)) +- Updated Portuguese translation to v1.3 ([#690](https://github.com/GyulyVGC/sniffnet/pull/690)) ## [1.3.2] - 2025-01-06 - Dropdown menus for network host filters ([#659](https://github.com/GyulyVGC/sniffnet/pull/659) — fixes [#354](https://github.com/GyulyVGC/sniffnet/issues/354)) diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 5b3746b14..4b9514c00 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -126,6 +126,7 @@ impl Language { | Language::ZH | Language::KO | Language::TR + | Language::PT ) } } From 06d86415132eafa4d73e0b96bac2a8b749c0adbf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:49:39 +0000 Subject: [PATCH 22/40] docs: update CONTRIBUTORS.md [skip ci] --- CONTRIBUTORS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 52f7673d5..176fc04b0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -70,14 +70,15 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont glitsj16
glitsj16

📦 + guilherme-demarchi
guilherme-demarchi

🌍 hirotake111
hirotake111

🌍 luca3s
luca3s

🌍 pia
pia

🌍 pin
pin

📦 starccy
starccy

💻 - tiansheng li
tiansheng li

💵 + tiansheng li
tiansheng li

💵 vtiinanen
vtiinanen

🌍 yossarian
yossarian

🌍 陈寒彤
陈寒彤

🌍 From dabd97aba27d980191ddeab9fa7fb062b19d37b6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:49:40 +0000 Subject: [PATCH 23/40] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7e9e925e7..a18bffbef 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -547,6 +547,15 @@ "contributions": [ "translation" ] + }, + { + "login": "guilherme-demarchi", + "name": "guilherme-demarchi", + "avatar_url": "https://avatars.githubusercontent.com/u/196574579?v=4", + "profile": "https://github.com/guilherme-demarchi", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, From 1619b5d5f782e5b7d938014e747e316825ad4820 Mon Sep 17 00:00:00 2001 From: Yevhen Kapelianovych Date: Sat, 1 Feb 2025 18:38:19 +0200 Subject: [PATCH 24/40] Add Ukrainian translation for version 3. --- src/translations/translations_3.rs | 21 +++++++++++++++++++++ src/translations/translations_4.rs | 1 + 2 files changed, 22 insertions(+) diff --git a/src/translations/translations_3.rs b/src/translations/translations_3.rs index 471988b22..e3a03138a 100644 --- a/src/translations/translations_3.rs +++ b/src/translations/translations_3.rs @@ -24,6 +24,7 @@ pub fn general_translation(language: Language) -> &'static str { Language::KO => "일반", Language::TR => "Genel", Language::PT => "Geral", + Language::UK => "Загальні", _ => "General", } } @@ -47,6 +48,7 @@ pub fn zoom_translation(language: Language) -> &'static str { Language::ZH => "缩放", Language::KO => "확대", Language::TR => "Yakınlaştırma", + Language::UK => "Масштабування", _ => "Zoom", } } @@ -70,6 +72,7 @@ pub fn mmdb_files_translation(language: Language) -> &'static str { Language::KO => "데이터베이스 파일", Language::TR => "Veri tabanı dosyaları", Language::PT => "Arquivos da base de dados", + Language::UK => "Файли бази даних", _ => "Database files", } } @@ -93,6 +96,7 @@ pub fn params_not_editable_translation(language: Language) -> &'static str { Language::KO => "분석 중 다음의 매개변수들은 수정할 수 없습니다", Language::TR => "Analiz sırasında bu parametrelere müdahale edilemez", Language::PT => "Os seguintes parâmetros não podem ser modificados durante a análise", + Language::UK => "Наступні параметри не можна змінювати під час аналізу трафіку", _ => "The following parameters can't be modified during the analysis", } } @@ -115,6 +119,7 @@ pub fn custom_style_translation(language: Language) -> &'static str { Language::ZH => "自定义样式", Language::KO => "사용자 지정 스타일", Language::TR => "Kişisel görünüm", + Language::UK => "Власний стиль", _ => "Custom style", } } @@ -136,6 +141,7 @@ pub fn copy_translation(language: Language) -> &'static str { Language::KO => "복사", Language::TR => "Kopyala", Language::PT => "Copiar", + Language::UK => "Копіювати", _ => "Copy", } } @@ -158,6 +164,7 @@ pub fn port_translation(language: Language) -> &'static str { Language::VI => "Cổng", Language::ZH => "端口", Language::KO => "포트", + Language::UK => "Порт", _ => "Port", } } @@ -180,6 +187,7 @@ pub fn invalid_filters_translation(language: Language) -> &'static str { Language::ZH => "无效的过滤器", Language::KO => "잘못된 필터", Language::TR => "Geçersiz filtreler", + Language::UK => "Неправильний формат фільтрів", _ => "Invalid filters", } } @@ -202,6 +210,7 @@ pub fn messages_translation(language: Language) -> &'static str { Language::KO => "메시지", Language::TR => "Mesajlar", Language::PT => "Mensagens", + Language::UK => "Повідомлення", _ => "Messages", } } @@ -225,6 +234,7 @@ pub fn link_type_translation(language: Language) -> &'static str { Language::KO => "링크 유형", Language::TR => "Link türü", Language::PT => "Tipo de conexão", + Language::UK => "Різновид зʼєднання", _ => "Link type", } } @@ -251,6 +261,7 @@ pub fn unsupported_link_type_translation<'a>( Language::KO => "이 어댑터와 연결된 링크 유형은 Sniffnet에서 아직 지원되지 않습니다...", Language::TR => "Bu adaptör ile ilişkilendirilmiş link türü henüz Sniffnet tarafından desteklenmiyor...", Language::PT => "O tipo de conexão associado com este adaptador não é suportado pelo Sniffnet ainda...", + Language::UK => "Різновид зʼєднання, повʼязаний з даним адаптером, ще не підтримується Sniffnet-ом...", _ => "The link type associated with this adapter is not supported by Sniffnet yet...", }; @@ -279,6 +290,7 @@ pub fn style_from_file_translation(language: Language) -> &'static str { Language::KO => "파일에서 스타일을 선택하세요", Language::TR => "Dosyadan bir görünüm seç", Language::PT => "Selecionar estilo a partir de um arquivo", + Language::UK => "Виберіть стиль з файлу", _ => "Select style from a file", } } @@ -302,6 +314,7 @@ pub fn database_from_file_translation(language: Language) -> &'static str { Language::KO => "데이터베이스 파일 선택", Language::TR => "Veri tabanı dosyası seç", Language::PT => "Selecione um arquivo de base de dados", + Language::UK => "Виберіть файл бази даних", _ => "Select database file", } } @@ -325,6 +338,7 @@ pub fn filter_by_host_translation(language: Language) -> &'static str { Language::KO => "네트워크 호스트로 필터링", Language::TR => "Ağ sunucusuna göre filtrele", Language::PT => "Filtrar por host de rede", + Language::UK => "Фільтр за хостом мережі", _ => "Filter by network host", } } @@ -345,6 +359,7 @@ pub fn service_translation(language: Language) -> &'static str { Language::KO => "서비스", Language::TR => "Servis", Language::PT => "Serviço", + Language::UK => "Сервіс", _ => "Service", } } @@ -367,6 +382,7 @@ pub fn export_capture_translation(language: Language) -> &'static str { Language::KO => "캡처 파일 내보내기", Language::TR => "Yakalanan dosyayı dışa aktar", Language::PT => "Exportar arquivo capturado", + Language::UK => "Експорт файлу захоплення", _ => "Export capture file", } } @@ -388,6 +404,7 @@ pub fn directory_translation(language: Language) -> &'static str { Language::KO => "디렉토리", Language::TR => "Klasör", Language::PT => "Diretório", + Language::UK => "Тека", _ => "Directory", } } @@ -410,6 +427,7 @@ pub fn select_directory_translation(language: Language) -> &'static str { Language::KO => "대상 디렉토리 선택", Language::TR => "Hedef klasörü seç", Language::PT => "Selecionar diretório de destino", + Language::UK => "Виберіть теку призначення", _ => "Select destination directory", } } @@ -432,6 +450,7 @@ pub fn file_name_translation(language: Language) -> &'static str { Language::KO => "파일 이름", Language::TR => "Dosya adı", Language::PT => "Nome do arquivo", + Language::UK => "Назва файлу", _ => "File name", } } @@ -454,6 +473,7 @@ pub fn thumbnail_mode_translation(language: Language) -> &'static str { Language::KO => "썸네일 모드", Language::TR => "Küçük resim modu", Language::PT => "Modo miniatura", + Language::UK => "Режим мініатюри", _ => "Thumbnail mode", } } @@ -476,6 +496,7 @@ pub fn learn_more_translation(language: Language) -> &'static str { Language::KO => "더 자세히 알고 싶으십니까?", Language::TR => "Daha fazlasını öğrenmek ister misin?", Language::PT => "Quer aprender mais?", + Language::UK => "Бажаєте дізнатись більше?", _ => "Do you want to learn more?", } } diff --git a/src/translations/translations_4.rs b/src/translations/translations_4.rs index 2ac2dd713..88ce5d983 100644 --- a/src/translations/translations_4.rs +++ b/src/translations/translations_4.rs @@ -7,6 +7,7 @@ pub fn reserved_address_translation(language: Language, info: &str) -> String { Language::EN => format!("Reserved address ({info})"), Language::IT => format!("Indirizzo riservato ({info})"), Language::PT => format!("Endereço reservado ({info})"), + Language::UK => format!("Зарезервована адреса ({info})"), _ => format!("Reserved address ({info})"), } } From 7be26d3bbf188e81217c957d35a490a6dcc60e56 Mon Sep 17 00:00:00 2001 From: Yevhen Kapelianovych Date: Sat, 1 Feb 2025 19:45:30 +0200 Subject: [PATCH 25/40] Revisit existing Ukrainian translations. Marked Ukrainian translation as up to date. Add a note to the CHANGELOG. --- CHANGELOG.md | 4 +- src/translations/translations.rs | 59 +++++++++++++++--------------- src/translations/translations_2.rs | 10 ++--- src/translations/types/language.rs | 1 + 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de1ba36e7..7433fcd3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,9 @@ All Sniffnet releases with the relative changes are documented in this file. ## [UNRELEASED] - Identify and tag unassigned/reserved "bogon" IP addresses ([#678](https://github.com/GyulyVGC/sniffnet/pull/678) — fixes [#209](https://github.com/GyulyVGC/sniffnet/issues/209)) - Show data agglomerates in _Inspect_ page table ([#684](https://github.com/GyulyVGC/sniffnet/pull/684) — fixes [#601](https://github.com/GyulyVGC/sniffnet/issues/601)) -- Updated Portuguese translation to v1.3 ([#690](https://github.com/GyulyVGC/sniffnet/pull/690)) +- Updated some of the existing translations to v1.3: + - Portuguese ([#690](https://github.com/GyulyVGC/sniffnet/pull/690)) + - Ukrainian ([#692](https://github.com/GyulyVGC/sniffnet/pull/692)) ## [1.3.2] - 2025-01-06 - Dropdown menus for network host filters ([#659](https://github.com/GyulyVGC/sniffnet/pull/659) — fixes [#354](https://github.com/GyulyVGC/sniffnet/issues/354)) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index f173572d0..ea5eacba5 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -13,7 +13,7 @@ pub fn choose_adapters_translation<'a>(language: Language) -> Text<'a, StyleType Language::ES => "Seleccione el adaptador de red que desea inspeccionar", Language::PL => "Wybierz adapter sieciowy do inspekcji", Language::DE => "Wähle einen Netzwerkadapter zum überwachen aus", - Language::UK => "Вибрати мережевий адаптер для інспекції", + Language::UK => "Виберіть мережевий адаптер для перевірки", Language::ZH => "选择需要监控的网络适配器", Language::RO => "Selectați adaptor de rețea pentru a inspecta", Language::KO => "검사할 네트워크 어댑터 선택", @@ -38,7 +38,7 @@ pub fn choose_adapters_translation<'a>(language: Language) -> Text<'a, StyleType // Language::ES => "Protocolo de aplicación", // Language::PL => "Protokół aplikacji", // Language::DE => "Anwendungs-Protokoll", -// Language::UK => "Протокол аплікації", +// Language::UK => "Протокол застосування", // Language::ZH => "目标应用层协议", // Language::RO => "Protocol aplicație", // Language::KO => "어플리케이션 프로토콜", @@ -62,7 +62,7 @@ pub fn select_filters_translation<'a>(language: Language) -> Text<'a, StyleType> Language::ES => "Seleccionar los filtros que se aplicarán al tráfico de red", Language::PL => "Wybierz filtry, które mają być zastosowane na ruchu sieciowym", Language::DE => "Wähle die Filter, die auf den Netzwerkverkehr angewendet werden sollen", - Language::UK => "Вибрати фільтри, які мають бути застосовані до мережевого трафіку", + Language::UK => "Виберіть фільтри, які мають бути застосовані до мережевого руху", Language::ZH => "选择需要监控的目标", Language::RO => "Selectați filtre pentru traficul de rețea", Language::KO => "네트워크 트레픽에 적용할 필터 선택", @@ -322,7 +322,7 @@ pub fn ask_quit_translation<'a>(language: Language) -> Text<'a, StyleType> { Language::ES => "¿Estás seguro de que quieres dejar este análisis?", Language::PL => "Jesteś pewien, że chcesz zakończyć analizę?", Language::DE => "Bist du sicher, dass du diese Analyse beenden willst?", - Language::UK => "Чи справді хочеш закінчити аналіз?", + Language::UK => "Чи справді хочете закінчити аналіз?", Language::ZH => "您确定退出当前监控吗?", Language::RO => "Sunteți sigur că doriți să renunțați la această analiză?", Language::KO => "정말로 분석을 종료하겠습니까?", @@ -372,7 +372,7 @@ pub fn ask_clear_all_translation<'a>(language: Language) -> Text<'a, StyleType> Language::ES => "¿Seguro que quieres borrar las notificaciones?", Language::PL => "Czy na pewno chcesz wyczyścić powiadomienia?", Language::DE => "Bist du sicher, dass du alle Benachrichtigungen löschen willst?", - Language::UK => "Чи справді хочеш видалити всі повідомлення?", + Language::UK => "Чи справді хочете видалити всі повідомлення?", Language::ZH => "确定清除所有通知?", Language::RO => "Sigur doriți să ștergeți notificările?", Language::KO => "알림을 삭제하시겠습니까?", @@ -447,7 +447,7 @@ pub fn network_adapter_translation(language: Language) -> &'static str { Language::ES => "Adaptador de red", Language::PL => "Adapter sieciowy", Language::DE => "Netzwerkadapter", - Language::UK => "Мережквий адаптер", + Language::UK => "Мережевий адаптер", Language::ZH => "网络适配器", Language::RO => "Adaptor de rețea", Language::KO => "네트워크 어뎁터", @@ -484,9 +484,9 @@ pub fn no_addresses_translation<'a>(language: Language, adapter: &str) -> Text<' Language::DE => format!("Es kann kein Netzwerkverkehr beobachtet werden, weil der Adapter keine aktiven Adressen hat...\n\n\ {network_adapter_translation}: {adapter}\n\n\ Wenn du dir sicher bist, dass du mit dem Internet verbunden bist, probier einen anderen Adapter auszuwählen."), - Language::UK => format!("Не зафіксовано жодного мережевого трафіку тому що вибраний адаптер немає активних адрес... \n\n\ + Language::UK => format!("Не зафіксовано жодного мережевого руху, тому що вибраний адаптер не має активних адрес... \n\n\ {network_adapter_translation}: {adapter}\n\n\ - Якщо Ти впевнений, що підключений до інтернету, спробуй вибрати інший адаптер."), + Якщо ви впевнені, що підключені до інтернету, спробуйте вибрати інший адаптер."), Language::ZH => format!("您选择的网络适配器当前无活动网络...\n\n\ {network_adapter_translation}: {adapter}\n\n\ 如果您确信您已成功连接互联网, 请尝试选择其他网络适配器."), @@ -550,9 +550,9 @@ pub fn waiting_translation<'a>(language: Language, adapter: &str) -> Text<'a, St Language::DE => format!("Noch kein Netzwerkverkehr beobachtet. Warten auf Pakete...\n\n\ {network_adapter_translation}: {adapter}\n\n\ Bist du sicher, dass du mit dem Internet verbunden bist und den richtigen Adapter ausgewählt hast?"), - Language::UK => format!("Не зафіксовано жодного мережевого трафіку. Очікування на пакети...\n\n\ + Language::UK => format!("Не зафіксовано жодного мережевого руху. Очікування пакетів...\n\n\ {network_adapter_translation}: {adapter}\n\n\ - Чи Ти дійсно підключений до інтернету і вибрав відповідний мережевий адаптер?"), + Чи ви дійсно підключені до інтернету і вибрали відповідний мережевий адаптер?"), Language::ZH => format!("暂无流量数据. 等待网络活动中......\n\n\ {network_adapter_translation}: {adapter}\n\n\ 您确信您已成功连接到互联网, 并选择了当前正在使用的的网络适配器吗?"), @@ -617,7 +617,7 @@ pub fn some_observed_translation<'a>(language: Language, observed: u128) -> Text Gefilterte Pakete: 0\n\n\ Ein Paar Pakete wurden empfangen, aber es entsprechen noch keine den gewählten Filtern..."), Language::UK => format!("Сума перехоплених пакетів: {observed}\n\n\ - Відфільтровані пакеті: 0\n\n\ + Відфільтровані пакети: 0\n\n\ Деякі пакети були перехоплені, але жоден з них не був вибраний відповідно до вказаних фільтрів..."), Language::ZH => format!("监测到的数据包总数: {observed}\n\n\ 目标数据包总数: 0\n\n\ @@ -758,7 +758,7 @@ pub fn of_total_translation(language: Language, percentage: &str) -> String { // Language::ES => "Paquetes filtrados por protocolo de aplicación:", // Language::PL => "Przefiltrowane pakiety według protokołu aplikacji:", // Language::DE => "Gefilterte Pakete je Anwendungs-Protokoll:", -// Language::UK => "Відфільтровані пакети протоколу аплікації/програми:", +// Language::UK => "Кількість відфільтрованих пакетів на протокол програми:", // Language::ZH => "按应用层协议分类的目标数据包计数:", // Language::RO => "Pachete filtrate pe protocol de aplicație:", // Language::KO => "애플리케이션 프로토콜당 필터링된 패킷 수:", @@ -787,7 +787,7 @@ pub fn of_total_translation(language: Language, percentage: &str) -> String { // Language::DE => "Im Moment nichts zu zeigen.\n\ // Um eine Verbindung zu deinen Favoriten hinzuzufügen, klick das auf das Stern-Symbol neben der Verbindung.", // Language::UK => "Немає, що показати в цей момент.\n\ -// Щоб додати підключення до улюблених, натисни на іконку 'зірочки' біля підключення.", +// Щоб додати підключення до улюблених, натисніть на іконку 'зірочки' біля підключення.", // Language::ZH => "收藏夹还是空的.\n\ // 小贴士: 点击连接右侧的小星星即可收藏到这里哦.", // Language::RO => "Nimic de arătat în acest moment.\n\ @@ -838,7 +838,7 @@ pub fn error_translation(language: Language, error: &str) -> Text { {error}" ), Language::UK => format!( - "Виступила помилка! \n\n\ + "Зʼявилась помилка! \n\n\ {error}" ), Language::ZH => format!( @@ -931,6 +931,7 @@ pub fn error_translation(language: Language, error: &str) -> Text { // Language::FA => "همهٔ پیوندنامه ها", // Language::SE => "Alla protokoll", // Language::UZ => "Barcha protokollar" +// Language::UK => "Усі протоколи" // } // } @@ -989,7 +990,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::ES => "paquetes por segundo", Language::PL => "pakiety na sekundę", Language::DE => "Pakete pro Sekunde", - Language::UK => "пакети на секунду", + Language::UK => "пакети(ів) на секунду", Language::ZH => "数据包", Language::RO => "pachete pe secundă", Language::KO => "초당 패킷", @@ -1015,7 +1016,7 @@ pub fn bytes_translation(language: Language) -> &'static str { Language::IT => "byte", Language::FR => "octets", Language::PL => "bajty", - Language::UK => "байти", + Language::UK => "байти(ів)", Language::ZH => "网络流量", Language::RO => "octeți", Language::KO => "바이트", @@ -1035,7 +1036,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::ES | Language::PT => "bytes por segundo", Language::PL => "bajty na sekundę", Language::DE => "Bytes pro Sekunde", - Language::UK => "байти на секунду", + Language::UK => "байти(ів) на секунду", Language::ZH => "网络流量", Language::RO => "octeți pe secundă", Language::KO => "초당 바이트", @@ -1152,7 +1153,7 @@ pub fn notifications_title_translation<'a>(language: Language) -> Text<'a, Style Language::ES => "Personaliza tus notificaciones", Language::PL => "Dostosuj powiadomienia", Language::DE => "Stell deine Benachrichtigungen ein", - Language::UK => "Достосуй повідомлення", + Language::UK => "Налаштування повідомлень", Language::ZH => "自定义通知", Language::RO => "Personalizați-vă notificările", Language::KO => "사용자 지정 알림", @@ -1177,7 +1178,7 @@ pub fn appearance_title_translation<'a>(language: Language) -> Text<'a, StyleTyp Language::ES => "Elige tu tema favorito", Language::PL => "Wybierz swój ulubiony motyw", Language::DE => "Wähl dein Lieblingsdesign", - Language::UK => "Вибери улюблену тему", + Language::UK => "Виберіть улюблену тему", Language::ZH => "选择您喜欢的主题", Language::RO => "Selectați tema preferată", Language::KO => "태마를 선택하세요", @@ -1252,7 +1253,7 @@ pub fn yeti_night_translation(language: Language) -> &'static str { Language::ES => "Tema oscuro original de Sniffnet", Language::PL => "Oryginalny, ciemny motyw Sniffnet", Language::DE => "Sniffnets urspüngliches, dunkles Design", - Language::UK => "Оригінальний, темний мотив Sniffnet", + Language::UK => "Оригінальний, темний стиль Sniffnet-у", Language::ZH => "Sniffnet暗黑", Language::RO => "Tema întunecată originală Sniffnet", Language::KO => "Sniffnet의 기본 다크테마", @@ -1277,7 +1278,7 @@ pub fn yeti_day_translation(language: Language) -> &'static str { Language::ES | Language::PT => "Tema claro original de Sniffnet", Language::PL => "Oryginalny, jasny motyw Sniffnet", Language::DE => "Sniffnets urspüngliches, helles Design", - Language::UK => "Оригінальний, світлий мотив Sniffnet", + Language::UK => "Оригінальний, світлий стиль Sniffnet-у", Language::ZH => "Sniffnet浅色", Language::RO => "Tema deschisă originală Sniffnet", Language::KO => "Sniffnet의 기본 라이트테마", @@ -1494,7 +1495,7 @@ pub fn packets_threshold_translation(language: Language) -> &'static str { Language::ES => "Notificarme cuando se supere un límite de paquetes", Language::PL => "Powiadom mnie, gdy zostanie przekroczony próg pakietów", Language::DE => "Benachrichtige mich, wenn die Pakete eine Schwelle überschreiten", - Language::UK => "Повідом мене про переліміт пакетів", + Language::UK => "Повідом мене про перевищення ліміту пакетів", Language::ZH => "超过设定的数据包数量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de pachete", Language::KO => "패킷 임계값을 초과하면 알림", @@ -1519,7 +1520,7 @@ pub fn bytes_threshold_translation(language: Language) -> &'static str { Language::ES => "Notificarme cuando se exceda un límite de bytes", Language::PL => "Powiadom mnie, gdy zostanie przekroczony próg bajtów", Language::DE => "Benachrichtige mich, wenn die Bytes eine Schwelle überschreiten", - Language::UK => "Повідом мене про переліміт байтів", + Language::UK => "Повідом мене про перевищення ліміту байтів", Language::ZH => "超过设定的网络流量阈值时通知我", Language::RO => "Anunță-mă când este depășit un prag de octeți", Language::KO => "바이트 임계값을 초과하면 알림", @@ -1567,7 +1568,7 @@ pub fn specify_multiples_translation(language: Language) -> &'static str { Language::ES => "también puede especificar 'K', 'M' y 'G'", Language::PL => "możesz również określić 'K', 'M' i 'G'", Language::DE => "du kannst auch 'K', 'M' und 'G' verwenden", - Language::UK => "можеш також вибрати 'K', 'M' i 'G'", + Language::UK => "можете також вибрати 'K', 'M' i 'G'", Language::ZH => "您可指定 'K', 'M', 'G'", Language::RO => "puteți specifica 'K', 'M', 'G'", Language::KO => "지정 가능합니다 'K', 'M', 'G'", @@ -1850,8 +1851,8 @@ pub fn no_notifications_set_translation<'a>(language: Language) -> Text<'a, Styl Nachdem du sie aktiviert hast, wird diese Seite eine Liste deiner Benachrichtigungen anzeigen\n\n\ Du kannst die Benachrichtigungen in den Einstellungen aktivieren:", Language::UK => "Повідомлення не активовані!\n\n\ - Після їх активації, на цій сторінці побачиш список своїх повідомлень\n\n\ - Можеш вимкнути повідомлення в налаштуваннях:", + Після їх активації на цій сторінці побачите список своїх повідомлень\n\n\ + Можете вимкнути повідомлення в налаштуваннях:", Language::ZH => "您还没有设定任何通知!\n\n\ 启用它们后,此页面将显示您的通知日志\n\n\ 您可以从设置中设定:", @@ -1921,8 +1922,8 @@ pub fn no_notifications_received_translation<'a>(language: Language) -> Text<'a, Wenn du eine Benachrichtigung erhälst, wird sie hier angezeigt" } Language::UK => { - "Немає що показати в даний момент...\n\n\ - Коли отримаєш повідомлення, побачиш його тут" + "Немає що показати у цей момент...\n\n\ + Коли отримаєте повідомлення, побачите його тут" } Language::ZH => { "还没有任何通知...\n\n\ @@ -1987,7 +1988,7 @@ pub fn only_last_30_translation(language: Language) -> &'static str { Language::ES => "Sólo se muestran las últimas 30 notificaciones", Language::PL => "Wyświetlane jest tylko 30 ostatnich powiadomień", Language::DE => "Nur die letzten 30 Benachrichtigungen werden angezeigt", - Language::UK => "Можеш побачити лише 30 останніх повідомлень", + Language::UK => "Можете побачити лише 30 останніх повідомлень", Language::ZH => "仅显示最近 30 条通知", Language::RO => "Sunt afișate doar ultimele 30 de notificări", Language::KO => "최근 30개의 알림만 표시됩니다", diff --git a/src/translations/translations_2.rs b/src/translations/translations_2.rs index 535b017dc..0e2a2b98f 100644 --- a/src/translations/translations_2.rs +++ b/src/translations/translations_2.rs @@ -42,7 +42,7 @@ pub fn inspect_translation(language: Language) -> &'static str { // Language::FA => "بازرسی", Language::KO => "검사", Language::ZH => "检查", - Language::UK => "Інспектувати", + Language::UK => "Перевірити", Language::RO => "Inspectați", Language::JA => "検査", Language::UZ => "Tekshirish", @@ -115,7 +115,7 @@ pub fn data_representation_translation(language: Language) -> &'static str { Language::ES => "Representación de los datos", Language::KO => "데이터 단위", Language::ZH => "图表数据", - Language::UK => "Представлення даних", + Language::UK => "Відображення даних", Language::RO => "Reprezentarea datelor", Language::PL => "Reprezentacja danych", Language::FR => "Représentation de données", @@ -165,7 +165,7 @@ pub fn only_top_30_items_translation(language: Language) -> &'static str { Language::ES => "Aquí sólo se muestran los 30 primeros elementos", Language::KO => "상위 30개의 아이템만 노출됩니다", Language::ZH => "仅展示前 30 个项目", - Language::UK => "Лише верхні 30 елементи відображаються тут", + Language::UK => "Тут відображаються лише перші 30 елементів", Language::RO => "Doar primele 30 de articole sunt afișate aici", Language::PL => "Tylko 30 pierwszych rzeczy jest wyświetlanych", Language::FR => "Seuls les 30 premiers articles sont affichés ici", @@ -238,7 +238,7 @@ pub fn unknown_translation(language: Language) -> &'static str { Language::ES => "Ubicación desconocida", Language::KO => "알 수 없는 위치", Language::ZH => "未知", - Language::UK => "Невідома локація", + Language::UK => "Невідоме місцезнаходження", Language::RO => "Locație necunoscută", Language::PL => "Nieznana lokalizacja", Language::FR => "Localisation inconnue", @@ -509,7 +509,7 @@ pub fn only_show_favorites_translation(language: Language) -> &'static str { Language::ES => "Mostrar solo los favoritos", Language::KO => "즐겨찾기만 보기", Language::ZH => "仅显示收藏", - Language::UK => "Показувати лише обрані", + Language::UK => "Показувати лише улюблені", Language::RO => "Arată doar favorite", Language::PL => "Pokaż tylko ulubione", Language::FR => "Afficher uniquement les favoris", diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index 4b9514c00..619a5b1d5 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -127,6 +127,7 @@ impl Language { | Language::KO | Language::TR | Language::PT + | Language::UK ) } } From 294f22446735ff67151b3cd5849dfda15fc39714 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 1 Feb 2025 22:21:01 +0100 Subject: [PATCH 26/40] remove not anymore used character from subset --- resources/fonts/full/subset_characters.txt | 1 - .../subset/sarasa-mono-sc-bold.subset.ttf | Bin 194196 -> 194160 bytes .../subset/sarasa-mono-sc-regular.subset.ttf | Bin 196320 -> 196284 bytes 3 files changed, 1 deletion(-) diff --git a/resources/fonts/full/subset_characters.txt b/resources/fonts/full/subset_characters.txt index a8a6af047..f1651f7b0 100644 --- a/resources/fonts/full/subset_characters.txt +++ b/resources/fonts/full/subset_characters.txt @@ -197,7 +197,6 @@ z ό ύ ώ -І А Б В diff --git a/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-bold.subset.ttf index 9780b9df72004837b4b1621f9b2508ed3cd00017..0dab64e65f976f313e260c98a8b75b3e0cbb7048 100644 GIT binary patch delta 11163 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 diff --git a/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf b/resources/fonts/subset/sarasa-mono-sc-regular.subset.ttf index fb81133d40a916c9c3fe4970ee60324b1da7cd50..2764dfdebdb1d8c6116f293bfdb41a7e816f96de 100644 GIT binary patch delta 11143 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

b|W2o@F-k|G9GDpEaQ=0 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 From 9dd48fffb978be415f4d900d8f96989c605a1406 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sat, 1 Feb 2025 22:52:09 +0100 Subject: [PATCH 27/40] minor fix --- src/translations/translations.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/translations/translations.rs b/src/translations/translations.rs index ea5eacba5..763cd76b0 100644 --- a/src/translations/translations.rs +++ b/src/translations/translations.rs @@ -990,7 +990,7 @@ pub fn packets_chart_translation(language: Language) -> &'static str { Language::ES => "paquetes por segundo", Language::PL => "pakiety na sekundę", Language::DE => "Pakete pro Sekunde", - Language::UK => "пакети(ів) на секунду", + Language::UK => "пакети на секунду", Language::ZH => "数据包", Language::RO => "pachete pe secundă", Language::KO => "초당 패킷", @@ -1016,7 +1016,7 @@ pub fn bytes_translation(language: Language) -> &'static str { Language::IT => "byte", Language::FR => "octets", Language::PL => "bajty", - Language::UK => "байти(ів)", + Language::UK => "байти", Language::ZH => "网络流量", Language::RO => "octeți", Language::KO => "바이트", @@ -1036,7 +1036,7 @@ pub fn bytes_chart_translation(language: Language) -> &'static str { Language::ES | Language::PT => "bytes por segundo", Language::PL => "bajty na sekundę", Language::DE => "Bytes pro Sekunde", - Language::UK => "байти(ів) на секунду", + Language::UK => "байти на секунду", Language::ZH => "网络流量", Language::RO => "octeți pe secundă", Language::KO => "초당 바이트", From 779159ff801606b280b1258e9783f0f1b5e8c566 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 22:57:28 +0100 Subject: [PATCH 28/40] docs: add Kapelianovych as a contributor for translation (#693) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a18bffbef..983e6c85b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -556,6 +556,15 @@ "contributions": [ "translation" ] + }, + { + "login": "Kapelianovych", + "name": "Yevhen", + "avatar_url": "https://avatars.githubusercontent.com/u/28602579?v=4", + "profile": "https://github.com/Kapelianovych", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 176fc04b0..c7213f437 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -64,20 +64,21 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont Trịnh Duy Hưng
Trịnh Duy Hưng

🌍 Victor Nilsson
Victor Nilsson

🌍 Wang Zishi
Wang Zishi

🌍 + Yevhen
Yevhen

🌍 ZEROF
ZEROF

💵 clr
clr

📖 🌍 - ervinpopescu
ervinpopescu

🌍 + ervinpopescu
ervinpopescu

🌍 glitsj16
glitsj16

📦 guilherme-demarchi
guilherme-demarchi

🌍 hirotake111
hirotake111

🌍 luca3s
luca3s

🌍 pia
pia

🌍 pin
pin

📦 - starccy
starccy

💻 + starccy
starccy

💻 tiansheng li
tiansheng li

💵 vtiinanen
vtiinanen

🌍 yossarian
yossarian

🌍 From 530e31e5203d4929206530c1d2eab17620c94f35 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 09:46:24 +0100 Subject: [PATCH 29/40] docs: add shawnyeager as a contributor for financial (#694) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CONTRIBUTORS.md | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 983e6c85b..a8f888756 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -565,6 +565,15 @@ "contributions": [ "translation" ] + }, + { + "login": "shawnyeager", + "name": "Shawn Yeager", + "avatar_url": "https://avatars.githubusercontent.com/u/980297?v=4", + "profile": "http://shawnyeager.com", + "contributions": [ + "financial" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c7213f437..bde169191 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -60,24 +60,25 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont Safaraliev Maxim
Safaraliev Maxim

🌍 + Shawn Yeager
Shawn Yeager

💵 The Artifex
The Artifex

🌍 📦 Trịnh Duy Hưng
Trịnh Duy Hưng

🌍 Victor Nilsson
Victor Nilsson

🌍 Wang Zishi
Wang Zishi

🌍 Yevhen
Yevhen

🌍 ZEROF
ZEROF

💵 - clr
clr

📖 🌍 + clr
clr

📖 🌍 ervinpopescu
ervinpopescu

🌍 glitsj16
glitsj16

📦 guilherme-demarchi
guilherme-demarchi

🌍 hirotake111
hirotake111

🌍 luca3s
luca3s

🌍 pia
pia

🌍 - pin
pin

📦 + pin
pin

📦 starccy
starccy

💻 tiansheng li
tiansheng li

💵 vtiinanen
vtiinanen

🌍 From 1b2a6ba2548725fe9eec8b046f1306101f64ccc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 18:51:43 +0000 Subject: [PATCH 30/40] Bump openssl from 0.10.68 to 0.10.70 Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.68 to 0.10.70. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.68...openssl-v0.10.70) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a437c94fa..9366b9407 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3210,9 +3210,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3242,9 +3242,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", From fe98750352b2f40cc425fe0f23c388b488321e80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 03:41:54 +0000 Subject: [PATCH 31/40] Bump clap from 4.5.27 to 4.5.28 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.27 to 4.5.28. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.27...clap_complete-v4.5.28) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9366b9407..303cb6c99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -657,9 +657,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -679,9 +679,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 827a5b076..d0d10031a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ rfd = "0.15.2" phf = "0.11.3" phf_shared = "0.11.3" splines = "4.4.2" -clap = { version = "4.5.27", features = ["derive"] } +clap = { version = "4.5.28", features = ["derive"] } [target.'cfg(windows)'.dependencies] gag = "1.0.0" From ae81d9e43c565bf7ecb6d56a712feaaca97a7e2f Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Tue, 4 Feb 2025 10:31:08 +0100 Subject: [PATCH 32/40] update deps --- Cargo.lock | 566 ++++++++++++++++++++++++++++------------------------- 1 file changed, 303 insertions(+), 263 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a437c94fa..f6f5532b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,7 +39,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -51,7 +51,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -85,7 +85,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" dependencies = [ "alsa-sys", - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "libc", ] @@ -107,7 +107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.6.0", + "bitflags 2.8.0", "cc", "cesu8", "jni", @@ -183,11 +183,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -246,7 +247,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.2.0", + "zbus 5.3.1", ] [[package]] @@ -365,7 +366,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -394,13 +395,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -442,7 +443,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -451,7 +452,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -477,9 +478,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block" @@ -520,9 +521,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "by_address" @@ -547,7 +548,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -558,9 +559,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "calloop" @@ -568,7 +569,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "log", "polling", "rustix", @@ -590,9 +591,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.7" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" dependencies = [ "jobserver", "libc", @@ -657,9 +658,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -679,14 +680,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -863,7 +864,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types 0.5.0", @@ -887,7 +888,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation 0.10.0", "libc", ] @@ -918,7 +919,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "fontdb 0.16.2", "log", "rangemap", @@ -960,9 +961,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1003,9 +1004,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1045,7 +1046,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libloading 0.8.6", "winapi", ] @@ -1155,7 +1156,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -1209,7 +1210,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytemuck", "drm-ffi", "drm-fourcc", @@ -1265,9 +1266,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -1275,13 +1276,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -1329,9 +1330,9 @@ checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "etagere" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e2f1e3be19fb10f549be8c1bf013e8675b4066c445e36eb76d2ebb2f54ee495" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" dependencies = [ "euclid", "svg_fmt", @@ -1515,7 +1516,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -1590,9 +1591,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", @@ -1609,7 +1610,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -1687,10 +1688,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gif" version = "0.13.1" @@ -1757,7 +1770,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "gpu-alloc-types", ] @@ -1767,7 +1780,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -1789,7 +1802,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "gpu-descriptor-types", "hashbrown 0.14.5", ] @@ -1800,7 +1813,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -1873,7 +1886,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "com", "libc", "libloading 0.8.6", @@ -1954,15 +1967,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2074,7 +2087,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytes", "dark-light", "glam", @@ -2122,7 +2135,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytemuck", "cosmic-text", "half", @@ -2186,7 +2199,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytemuck", "futures", "glam", @@ -2353,7 +2366,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -2385,9 +2398,9 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2404,9 +2417,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "ipnetwork" @@ -2432,15 +2445,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -2495,9 +2499,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -2584,7 +2588,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", "redox_syscall 0.5.8", ] @@ -2619,9 +2623,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "lru" @@ -2741,7 +2745,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block", "core-graphics-types 0.1.3", "foreign-types 0.5.0", @@ -2764,9 +2768,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", "simd-adler32", @@ -2779,7 +2783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2790,7 +2794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" dependencies = [ "bit-set", - "bitflags 2.6.0", + "bitflags 2.8.0", "codespan-reporting", "hexf-parse", "indexmap", @@ -2805,9 +2809,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -2826,7 +2830,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys 0.5.0+25.2.9519653", @@ -2840,7 +2844,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -2879,7 +2883,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "cfg_aliases 0.2.1", "libc", @@ -2904,7 +2908,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -2945,7 +2949,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -2980,7 +2984,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -2996,7 +3000,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -3020,7 +3024,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3052,9 +3056,9 @@ dependencies = [ [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" @@ -3062,7 +3066,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "dispatch", "libc", @@ -3087,7 +3091,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3099,7 +3103,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3122,7 +3126,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-cloud-kit", @@ -3154,7 +3158,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -3210,11 +3214,11 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3231,20 +3235,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", @@ -3289,9 +3293,9 @@ dependencies = [ [[package]] name = "ouroboros" -version = "0.18.4" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944fa20996a25aded6b4795c6d63f10014a7a83f8be9828a11860b08c5fc4a67" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" dependencies = [ "aliasable", "ouroboros_macro", @@ -3300,16 +3304,15 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.18.4" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" dependencies = [ "heck 0.4.1", - "itertools 0.12.1", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -3342,7 +3345,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -3466,7 +3469,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -3486,22 +3489,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -3624,9 +3627,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -3639,7 +3642,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "version_check", "yansi", ] @@ -3652,9 +3655,9 @@ checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", ] @@ -3672,7 +3675,7 @@ dependencies = [ "rustc-hash 2.1.0", "rustls", "socket2", - "thiserror 2.0.10", + "thiserror 2.0.11", "tokio", "tracing", ] @@ -3684,14 +3687,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", - "getrandom", + "getrandom 0.2.15", "rand", "ring", "rustc-hash 2.1.0", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.10", + "thiserror 2.0.11", "tinyvec", "tracing", "web-time", @@ -3747,14 +3750,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] name = "range-alloc" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rangemap" @@ -3822,7 +3825,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -3831,7 +3834,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -3984,7 +3987,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -4033,7 +4036,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.95", + "syn 2.0.98", "unicode-ident", ] @@ -4076,11 +4079,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno 0.3.10", "libc", "linux-raw-sys 0.4.15", @@ -4089,9 +4092,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" dependencies = [ "once_cell", "ring", @@ -4112,9 +4115,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -4146,13 +4149,19 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "rustybuzz" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytemuck", "libm", "smallvec", @@ -4165,9 +4174,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -4233,7 +4242,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -4258,9 +4267,9 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" @@ -4279,14 +4288,14 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -4302,7 +4311,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -4355,7 +4364,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -4445,7 +4454,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "calloop", "calloop-wayland-source", "cursor-icon", @@ -4571,7 +4580,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -4621,9 +4630,9 @@ checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" [[package]] name = "svgtypes" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794de53cc48eaabeed0ab6a3404a65f40b3e38c067e4435883a65d2aa4ca000e" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ "kurbo 0.11.1", "siphasher", @@ -4702,9 +4711,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.95" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -4728,7 +4737,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -4746,7 +4755,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4763,13 +4772,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -4795,11 +4804,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ac7f54ca534db81081ef1c1e7f6ea8a3ef428d2fc069097c079443d24124d3" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.10", + "thiserror-impl 2.0.11", ] [[package]] @@ -4810,18 +4819,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] name = "thiserror-impl" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9465d30713b56a37ede7185763c3492a91be2f5fa68d958c44e41ab9248beb" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -4968,15 +4977,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.7.1", ] [[package]] @@ -5025,7 +5034,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -5098,9 +5107,9 @@ checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-linebreak" @@ -5259,36 +5268,46 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -5299,9 +5318,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5309,22 +5328,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-timer" @@ -5343,9 +5365,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", @@ -5357,11 +5379,11 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "rustix", "wayland-backend", "wayland-scanner", @@ -5373,16 +5395,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.7" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" +checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ "rustix", "wayland-client", @@ -5391,11 +5413,11 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.5" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5403,11 +5425,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" +checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5416,11 +5438,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5429,9 +5451,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", "quick-xml", @@ -5440,9 +5462,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ "dlib", "log", @@ -5452,9 +5474,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5472,9 +5494,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -5518,7 +5540,7 @@ checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg_aliases 0.1.1", "codespan-reporting", "indexmap", @@ -5546,7 +5568,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.6.0", + "bitflags 2.8.0", "block", "cfg_aliases 0.1.1", "core-graphics-types 0.1.3", @@ -5587,7 +5609,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "js-sys", "web-sys", ] @@ -5987,7 +6009,7 @@ dependencies = [ "ahash 0.8.11", "android-activity", "atomic-waker", - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "bytemuck", "calloop", @@ -6032,9 +6054,18 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.22" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] @@ -6057,6 +6088,15 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -6123,7 +6163,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "dlib", "log", "once_cell", @@ -6180,7 +6220,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "synstructure", ] @@ -6224,9 +6264,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb67eadba43784b6fb14857eba0d8fc518686d3ee537066eb6086dc318e2c8a1" +checksum = "2494e4b3f44d8363eef79a8a75fc0649efb710eef65a66b5e688a5eb4afe678a" dependencies = [ "async-broadcast", "async-executor", @@ -6251,11 +6291,11 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow", + "winnow 0.6.26", "xdg-home", - "zbus_macros 5.2.0", - "zbus_names 4.1.0", - "zvariant 5.1.0", + "zbus_macros 5.3.1", + "zbus_names 4.1.1", + "zvariant 5.2.0", ] [[package]] @@ -6267,23 +6307,23 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "zvariant_utils 2.1.0", ] [[package]] name = "zbus_macros" -version = "5.2.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d49ebc960ceb660f2abe40a5904da975de6986f2af0d7884b39eec6528c57" +checksum = "445efc01929302aee95e2b25bbb62a301ea8a6369466e4278e58e7d1dfb23631" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.95", - "zbus_names 4.1.0", - "zvariant 5.1.0", - "zvariant_utils 3.0.2", + "syn 2.0.98", + "zbus_names 4.1.1", + "zvariant 5.2.0", + "zvariant_utils 3.1.0", ] [[package]] @@ -6299,14 +6339,14 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.1.0" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b" +checksum = "519629a3f80976d89c575895b05677cbc45eaf9f70d62a364d819ba646409cc8" dependencies = [ "serde", "static_assertions", - "winnow", - "zvariant 5.1.0", + "winnow 0.6.26", + "zvariant 5.2.0", ] [[package]] @@ -6333,7 +6373,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -6353,7 +6393,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "synstructure", ] @@ -6382,7 +6422,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] @@ -6400,18 +6440,18 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f" +checksum = "55e6b9b5f1361de2d5e7d9fd1ee5f6f7fcb6060618a1f82f3472f58f2b8d4be9" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", "url", - "winnow", - "zvariant_derive 5.1.0", - "zvariant_utils 3.0.2", + "winnow 0.6.26", + "zvariant_derive 5.2.0", + "zvariant_utils 3.1.0", ] [[package]] @@ -6423,21 +6463,21 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", "zvariant_utils 2.1.0", ] [[package]] name = "zvariant_derive" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916" +checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.95", - "zvariant_utils 3.0.2", + "syn 2.0.98", + "zvariant_utils 3.1.0", ] [[package]] @@ -6448,19 +6488,19 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.98", ] [[package]] name = "zvariant_utils" -version = "3.0.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6" +checksum = "ddd46446ea2a1f353bfda53e35f17633afa79f4fe290a611c94645c69fe96a50" dependencies = [ "proc-macro2", "quote", "serde", "static_assertions", - "syn 2.0.95", - "winnow", + "syn 2.0.98", + "winnow 0.6.26", ] From fff21c22f4a10d264f3b31db1c99c433975b8e2c Mon Sep 17 00:00:00 2001 From: Luz Paz Date: Wed, 5 Feb 2025 08:43:46 -0500 Subject: [PATCH 33/40] fix various typos Found via `codespell -q 3 -S "*.pdf,*.rtf,./src/translations" -L aas,aci,daa,fo,ser` --- src/gui/styles/types/color_remote.rs | 4 ++-- src/secondary_threads/parse_packets.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/styles/types/color_remote.rs b/src/gui/styles/types/color_remote.rs index 3f186eb7f..c9763f4c0 100644 --- a/src/gui/styles/types/color_remote.rs +++ b/src/gui/styles/types/color_remote.rs @@ -1,4 +1,4 @@ -//! Remote implemention of [`serde::Deserialize`] and [`serde::Serialize`] for [`iced::Color`]. +//! Remote implementation of [`serde::Deserialize`] and [`serde::Serialize`] for [`iced::Color`]. //! //! This implementation deserializes hexadecimal RGB(A) as string to float RGB(A) and back. //! NOTE: The alpha channel is optional and defaults to #ff or 1.0. @@ -39,7 +39,7 @@ where })? // Iterating over bytes is safe because hex is ASCII. // If the hex is not ASCII or invalid hex, then the iterator will short circuit and fail on `from_str_radix` - // TODO: This can be cleaned up when `iter_array_chunks` is stablized (https://github.com/rust-lang/rust/issues/100450) + // TODO: This can be cleaned up when `iter_array_chunks` is stabilized (https://github.com/rust-lang/rust/issues/100450) .bytes() .step_by(2) // Step by every first hex char of the two char sequence .zip(hex.bytes().skip(2).step_by(2)) // Step by every second hex char diff --git a/src/secondary_threads/parse_packets.rs b/src/secondary_threads/parse_packets.rs index fdc1a67d3..41a215ca7 100644 --- a/src/secondary_threads/parse_packets.rs +++ b/src/secondary_threads/parse_packets.rs @@ -239,7 +239,7 @@ fn from_null(packet: &[u8]) -> Result { let h = &packet[..4]; let b = [h[0], h[1], h[2], h[3]]; // check both big endian and little endian representations - // as some OS'es use native endianess and others use big endian + // as some OS'es use native endianness and others use big endian matches(u32::from_le_bytes(b)) || matches(u32::from_be_bytes(b)) }; From 8b03e30a404e5adf0e9c52a9e1defbb35f7012cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 03:21:38 +0000 Subject: [PATCH 34/40] Bump toml from 0.8.19 to 0.8.20 Bumps [toml](https://github.com/toml-rs/toml) from 0.8.19 to 0.8.20. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.19...toml-v0.8.20) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6f5532b8..38f19f2ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -816,7 +816,7 @@ dependencies = [ "directories", "serde", "thiserror 1.0.69", - "toml 0.8.19", + "toml 0.8.20", ] [[package]] @@ -4522,7 +4522,7 @@ dependencies = [ "serde_test", "serial_test", "splines", - "toml 0.8.19", + "toml 0.8.20", "winres", ] @@ -4956,9 +4956,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", diff --git a/Cargo.toml b/Cargo.toml index d0d10031a..091378538 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ confy = "0.6.1" serde = { version = "1.0.217", default-features = false, features = ["derive"] } rodio = { version = "0.20.1", default-features = false, features = ["mp3"] } dns-lookup = "2.0.4" -toml = "0.8.19" +toml = "0.8.20" once_cell = "1.20.2" ctrlc = { version = "3.4.5", features = ["termination"] } rfd = "0.15.2" From c57dfcc21f4415610b4a9f636959f1d492d68787 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 03:25:42 +0000 Subject: [PATCH 35/40] Bump once_cell from 1.20.2 to 1.20.3 Bumps [once_cell](https://github.com/matklad/once_cell) from 1.20.2 to 1.20.3. - [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md) - [Commits](https://github.com/matklad/once_cell/compare/v1.20.2...v1.20.3) --- updated-dependencies: - dependency-name: once_cell dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38f19f2ad..a25002a66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3208,9 +3208,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" diff --git a/Cargo.toml b/Cargo.toml index 091378538..5ffe45b22 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ serde = { version = "1.0.217", default-features = false, features = ["derive"] } rodio = { version = "0.20.1", default-features = false, features = ["mp3"] } dns-lookup = "2.0.4" toml = "0.8.20" -once_cell = "1.20.2" +once_cell = "1.20.3" ctrlc = { version = "3.4.5", features = ["termination"] } rfd = "0.15.2" phf = "0.11.3" @@ -77,7 +77,7 @@ serial_test = { version = "3.2.0", default-features = false } phf_codegen = "0.11.3" phf_shared = "0.11.2" rustrict = { version = "0.7.33", default-features = false, features = ["censor"] } -once_cell = "1.20.2" +once_cell = "1.20.3" [target."cfg(windows)".build-dependencies] winres = "0.1.12" From 261e650680294681b0cc144e1e7ab7e40389c407 Mon Sep 17 00:00:00 2001 From: ZeroDot1 Date: Fri, 7 Feb 2025 17:42:19 +0100 Subject: [PATCH 36/40] Create the new theme sniff_oled.toml Hello everyone,, I have created a new theme for visually impaired people and at the same time compatible with OLED screens. I hope this will help to improve the usability of the program for visually impaired people (I am visually impaired myself). --- resources/themes/sniff_oled.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 resources/themes/sniff_oled.toml diff --git a/resources/themes/sniff_oled.toml b/resources/themes/sniff_oled.toml new file mode 100644 index 000000000..775354e7a --- /dev/null +++ b/resources/themes/sniff_oled.toml @@ -0,0 +1,9 @@ +# OLED-optimized color scheme (v2.1) +# Designed for deep blacks & high contrast + +primary = "#000000" # Pure black (turns off OLED pixels) +secondary = "#934900" # Muted copper orange (+53% red component vs original) +outgoing = "#F0F0F0" # Soft white (7% brightness reduction for night use) +text_body = "#fcfaf0" # Warm paper white (RGB 252,250,240 - reduces eye strain) +text_headers = "#E0E0E0" # Ice gray (15% brighter than standard UI gray) +starred = "#FFFF00" # Pure signal yellow (alpha removed for cleaner rendering) From 00ea18c0262a644bd31c59336c857c2948d56d68 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Fri, 7 Feb 2025 23:22:38 +0100 Subject: [PATCH 37/40] add OLED (Night) and OLED (Day) palettes in-app --- src/gui/styles/custom_themes/mod.rs | 1 + src/gui/styles/custom_themes/oled.rs | 34 ++++++++++++++++++++++++++ src/gui/styles/types/custom_palette.rs | 14 +++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/gui/styles/custom_themes/oled.rs diff --git a/src/gui/styles/custom_themes/mod.rs b/src/gui/styles/custom_themes/mod.rs index 1ccee9527..315b99570 100644 --- a/src/gui/styles/custom_themes/mod.rs +++ b/src/gui/styles/custom_themes/mod.rs @@ -1,4 +1,5 @@ pub mod dracula; pub mod gruvbox; pub mod nord; +pub mod oled; pub mod solarized; diff --git a/src/gui/styles/custom_themes/oled.rs b/src/gui/styles/custom_themes/oled.rs new file mode 100644 index 000000000..c5f6bd1ec --- /dev/null +++ b/src/gui/styles/custom_themes/oled.rs @@ -0,0 +1,34 @@ +#![allow(clippy::unreadable_literal)] + +//! Themes optimized for OLED displays and visually impaired users +//! + +use iced::color; +use once_cell::sync::Lazy; + +use crate::gui::styles::types::palette::Palette; +use crate::gui::styles::types::palette_extension::PaletteExtension; + +pub static OLED_DARK_PALETTE: Lazy = Lazy::new(|| Palette { + primary: color!(0x000000), + secondary: color!(0x934900), + outgoing: color!(0xF0F0F0), + starred: color!(0xFFFF00), + text_headers: color!(0xE0E0E0), + text_body: color!(0xfcfaf0), +}); + +pub static OLED_DARK_PALETTE_EXTENSION: Lazy = + Lazy::new(|| OLED_DARK_PALETTE.generate_palette_extension()); + +pub static OLED_LIGHT_PALETTE: Lazy = Lazy::new(|| Palette { + primary: color!(0xFFFFFF), + secondary: color!(0x6CB6FF), + outgoing: color!(0x0F0F0F), + starred: color!(0x0000FF), + text_headers: color!(0x1F1F1F), + text_body: color!(0x03050F), +}); + +pub static OLED_LIGHT_PALETTE_EXTENSION: Lazy = + Lazy::new(|| OLED_LIGHT_PALETTE.generate_palette_extension()); diff --git a/src/gui/styles/types/custom_palette.rs b/src/gui/styles/types/custom_palette.rs index 7b14bd601..baa1252bb 100644 --- a/src/gui/styles/types/custom_palette.rs +++ b/src/gui/styles/types/custom_palette.rs @@ -15,6 +15,10 @@ use crate::gui::styles::custom_themes::nord::{ NORD_DARK_PALETTE, NORD_DARK_PALETTE_EXTENSION, NORD_LIGHT_PALETTE, NORD_LIGHT_PALETTE_EXTENSION, }; +use crate::gui::styles::custom_themes::oled::{ + OLED_DARK_PALETTE, OLED_DARK_PALETTE_EXTENSION, OLED_LIGHT_PALETTE, + OLED_LIGHT_PALETTE_EXTENSION, +}; use crate::gui::styles::custom_themes::solarized::{ SOLARIZED_DARK_PALETTE, SOLARIZED_DARK_PALETTE_EXTENSION, SOLARIZED_LIGHT_PALETTE, SOLARIZED_LIGHT_PALETTE_EXTENSION, @@ -51,6 +55,8 @@ pub enum ExtraStyles { NordLight, SolarizedDark, SolarizedLight, + OledDark, + OledLight, CustomToml(CustomPalette), } @@ -66,6 +72,8 @@ impl ExtraStyles { ExtraStyles::NordLight => *NORD_LIGHT_PALETTE, ExtraStyles::SolarizedDark => *SOLARIZED_DARK_PALETTE, ExtraStyles::SolarizedLight => *SOLARIZED_LIGHT_PALETTE, + ExtraStyles::OledDark => *OLED_DARK_PALETTE, + ExtraStyles::OledLight => *OLED_LIGHT_PALETTE, ExtraStyles::CustomToml(custom_palette) => custom_palette.palette, } } @@ -81,6 +89,8 @@ impl ExtraStyles { ExtraStyles::NordLight => *NORD_LIGHT_PALETTE_EXTENSION, ExtraStyles::SolarizedDark => *SOLARIZED_DARK_PALETTE_EXTENSION, ExtraStyles::SolarizedLight => *SOLARIZED_LIGHT_PALETTE_EXTENSION, + ExtraStyles::OledDark => *OLED_DARK_PALETTE_EXTENSION, + ExtraStyles::OledLight => *OLED_LIGHT_PALETTE_EXTENSION, ExtraStyles::CustomToml(custom_palette) => custom_palette.extension, } } @@ -96,6 +106,8 @@ impl ExtraStyles { ExtraStyles::NordLight, ExtraStyles::SolarizedDark, ExtraStyles::SolarizedLight, + ExtraStyles::OledDark, + ExtraStyles::OledLight, ] } } @@ -111,6 +123,8 @@ impl fmt::Display for ExtraStyles { ExtraStyles::NordDark => write!(f, "Nord (Night)"), ExtraStyles::SolarizedLight => write!(f, "Solarized (Day)"), ExtraStyles::SolarizedDark => write!(f, "Solarized (Night)"), + ExtraStyles::OledLight => write!(f, "OLED (Day)"), + ExtraStyles::OledDark => write!(f, "OLED (Night)"), // Custom style names aren't used anywhere so this shouldn't be reached ExtraStyles::CustomToml(_) => unreachable!(), } From c2bcbd54d58c5ccd39e1a929bf3bad2bf44bd1c5 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Fri, 7 Feb 2025 23:32:23 +0100 Subject: [PATCH 38/40] update CHANGELOG --- CHANGELOG.md | 1 + resources/themes/sniff_oled.toml | 9 --------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 resources/themes/sniff_oled.toml diff --git a/CHANGELOG.md b/CHANGELOG.md index 7433fcd3c..e0fa843e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All Sniffnet releases with the relative changes are documented in this file. - Updated some of the existing translations to v1.3: - Portuguese ([#690](https://github.com/GyulyVGC/sniffnet/pull/690)) - Ukrainian ([#692](https://github.com/GyulyVGC/sniffnet/pull/692)) +- Added new themes _OLED (Night)_ and _OLED (Day)_ based on palettes optimized for OLED displays and users with visual impairments ([#708](https://github.com/GyulyVGC/sniffnet/pull/708)) ## [1.3.2] - 2025-01-06 - Dropdown menus for network host filters ([#659](https://github.com/GyulyVGC/sniffnet/pull/659) — fixes [#354](https://github.com/GyulyVGC/sniffnet/issues/354)) diff --git a/resources/themes/sniff_oled.toml b/resources/themes/sniff_oled.toml deleted file mode 100644 index 775354e7a..000000000 --- a/resources/themes/sniff_oled.toml +++ /dev/null @@ -1,9 +0,0 @@ -# OLED-optimized color scheme (v2.1) -# Designed for deep blacks & high contrast - -primary = "#000000" # Pure black (turns off OLED pixels) -secondary = "#934900" # Muted copper orange (+53% red component vs original) -outgoing = "#F0F0F0" # Soft white (7% brightness reduction for night use) -text_body = "#fcfaf0" # Warm paper white (RGB 252,250,240 - reduces eye strain) -text_headers = "#E0E0E0" # Ice gray (15% brighter than standard UI gray) -starred = "#FFFF00" # Pure signal yellow (alpha removed for cleaner rendering) From 219ac11edf5adc0b2e0538fcef427cbac56b9d89 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 23:40:17 +0100 Subject: [PATCH 39/40] docs: add ZeroDot1 as a contributor for design, and a11y (#710) * docs: update CONTRIBUTORS.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ CONTRIBUTORS.md | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a8f888756..a09b86d09 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -574,6 +574,16 @@ "contributions": [ "financial" ] + }, + { + "login": "ZeroDot1", + "name": "ZeroDot1", + "avatar_url": "https://avatars.githubusercontent.com/u/28985171?v=4", + "profile": "http://bit.ly/cBWeb", + "contributions": [ + "design", + "a11y" + ] } ], "contributorsPerLine": 7, diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bde169191..d7182bae4 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -69,15 +69,16 @@ A big shout-out to all the contributors of Sniffnet ([emoji key](https://allcont ZEROF
ZEROF

💵 + ZeroDot1
ZeroDot1

🎨 ️️️️♿️ clr
clr

📖 🌍 ervinpopescu
ervinpopescu

🌍 glitsj16
glitsj16

📦 guilherme-demarchi
guilherme-demarchi

🌍 hirotake111
hirotake111

🌍 luca3s
luca3s

🌍 - pia
pia

🌍 + pia
pia

🌍 pin
pin

📦 starccy
starccy

💻 tiansheng li
tiansheng li

💵 From f55f3a44902040e474382b7da6e4f4a0d41810b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 03:35:26 +0000 Subject: [PATCH 40/40] Bump clap from 4.5.28 to 4.5.29 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.28 to 4.5.29. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.28...clap_complete-v4.5.29) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a25002a66..98ce96295 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -658,9 +658,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.28" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", "clap_derive", @@ -668,9 +668,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", diff --git a/Cargo.toml b/Cargo.toml index 5ffe45b22..b9b5dd03f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ rfd = "0.15.2" phf = "0.11.3" phf_shared = "0.11.3" splines = "4.4.2" -clap = { version = "4.5.28", features = ["derive"] } +clap = { version = "4.5.29", features = ["derive"] } [target.'cfg(windows)'.dependencies] gag = "1.0.0"