bump Rust edition and update deps

This commit is contained in:
GyulyVGC
2025-04-11 15:49:56 +02:00
parent d49302aee3
commit 4c5239b643
69 changed files with 1132 additions and 842 deletions

676
Cargo.lock generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
name = "sniffnet"
version = "1.3.2"
authors = ["Giuliano Bellini <gyulyvgc99@gmail.com>"]
edition = "2021"
edition = "2024"
description = "Application to comfortably monitor your network traffic"
readme = "README.md"
homepage = "https://sniffnet.net"
@@ -43,28 +43,27 @@ chrono = { version = "0.4.40", default-features = false, features = ["clock"] }
plotters = { version = "0.3.7", default-features = false, features = ["area_series", "line_series"] }
iced = { version = "0.13.1", features = ["tokio", "svg", "advanced", "lazy", "image"] }
plotters-iced = "0.11.0"
maxminddb = "0.25.0"
maxminddb = "0.26.0"
confy = "0.6.1"
serde = { version = "1.0.219", 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.21.1"
ctrlc = { version = "3.4.5", features = ["termination"] }
ctrlc = { version = "3.4.6", features = ["termination"] }
rfd = "0.15.3"
phf = "0.11.3"
phf_shared = "0.11.3"
splines = "4.4.2"
clap = { version = "4.5.32", features = ["derive"] }
clap = { version = "4.5.35", features = ["derive"] }
[target.'cfg(windows)'.dependencies]
gag = "1.0.0"
[target.'cfg(not(target_arch = "powerpc64"))'.dependencies]
reqwest = { version = "0.12.14", default-features = false, features = ["json", "blocking", "rustls-tls"] }
reqwest = { version = "0.12.15", default-features = false, features = ["json", "blocking", "rustls-tls"] }
[target.'cfg(target_arch = "powerpc64")'.dependencies]
reqwest = { version = "0.12.14", features = ["json", "blocking"] }
reqwest = { version = "0.12.15", features = ["json", "blocking"] }
#───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@@ -79,7 +78,6 @@ serial_test = { version = "3.2.0", default-features = false }
phf_codegen = "0.11.3"
phf_shared = "0.11.3"
rustrict = { version = "0.7.34", default-features = false, features = ["censor"] }
once_cell = "1.21.1"
[target."cfg(windows)".build-dependencies]
winres = "0.1.12"

194
build.rs
View File

@@ -6,7 +6,6 @@
use std::io::{BufRead, BufReader, BufWriter, Write};
use std::path::Path;
use once_cell::sync::Lazy;
use rustrict::{Censor, Trie, Type};
include!("./src/networking/types/service_query.rs");
@@ -99,99 +98,100 @@ fn get_valid_service_query(s: &str) -> ServiceQuery {
ServiceQuery(port, protocol)
}
pub static SAFE_WORDS_FOR_SERVICE_NAME: Lazy<Trie> = Lazy::new(|| {
let mut safe_words = Trie::default();
for word in [
"npp",
"emfis-cntl",
"ardus-cntl",
"pmip6-cntl",
"mpp",
"ipp",
"vpp",
"epp",
"kink",
"kvm-via-ip",
"dpp",
"slinkysearch",
"alta-ana-lm",
"vpps-qua",
"vpps-via",
"ibm-pps",
"ppsms",
"ppsuitemsg",
"icpps",
"rap-listen",
"cadabra-lm",
"pay-per-view",
"sixtrak",
"cvmon",
"houdini-lm",
"dic-aida",
"p2pq",
"bigbrother",
"bintec-admin",
"zymed-zpp",
"cvmmon",
"btpp2sectrans",
"conclave-cpp",
"btpp2audctr1",
"tclprodebugger",
"bintec-capi",
"bintec-tapi",
"dicom-iscl",
"dicom-tls",
"nmsigport",
"ppp",
"tl1-telnet",
"opcon-xps",
"netwatcher-mon",
"netwatcher-db",
"xnm-ssl",
"edm-mgr-cntrl",
"isoft-p2p",
"must-p2p",
"p2pgroup",
"quasar-server",
"int-rcv-cntrl",
"faxstfx-port",
"sunlps-http",
"fagordnc",
"p2pcommunity",
"minger",
"assuria-slm",
"wcpp",
"plcy-net-svcs",
"assyst-dr",
"mobile-p2p",
"assuria-ins",
"taep-as-svc",
"nlg-data",
"dj-ice",
"x500ms",
"X11:7",
"p2p-sip",
"p4p-portal",
"bmc-perf-agent",
"ntz-p2p-storage",
"citrixupp",
"freezexservice",
"p2pevolvenet",
"papachi-p2p-srv",
"espeasy-p2p",
"pim-port",
"vp2p",
"dicom",
"icpp",
"sauterdongle",
"vocaltec-hos",
"BackOrifice",
"dhanalakshmi",
"3gpp-w1ap",
"pmsm-webrctl",
"bif-p2p",
] {
safe_words.set(word, Type::SAFE);
}
safe_words
});
pub static SAFE_WORDS_FOR_SERVICE_NAME: std::sync::LazyLock<Trie> =
std::sync::LazyLock::new(|| {
let mut safe_words = Trie::default();
for word in [
"npp",
"emfis-cntl",
"ardus-cntl",
"pmip6-cntl",
"mpp",
"ipp",
"vpp",
"epp",
"kink",
"kvm-via-ip",
"dpp",
"slinkysearch",
"alta-ana-lm",
"vpps-qua",
"vpps-via",
"ibm-pps",
"ppsms",
"ppsuitemsg",
"icpps",
"rap-listen",
"cadabra-lm",
"pay-per-view",
"sixtrak",
"cvmon",
"houdini-lm",
"dic-aida",
"p2pq",
"bigbrother",
"bintec-admin",
"zymed-zpp",
"cvmmon",
"btpp2sectrans",
"conclave-cpp",
"btpp2audctr1",
"tclprodebugger",
"bintec-capi",
"bintec-tapi",
"dicom-iscl",
"dicom-tls",
"nmsigport",
"ppp",
"tl1-telnet",
"opcon-xps",
"netwatcher-mon",
"netwatcher-db",
"xnm-ssl",
"edm-mgr-cntrl",
"isoft-p2p",
"must-p2p",
"p2pgroup",
"quasar-server",
"int-rcv-cntrl",
"faxstfx-port",
"sunlps-http",
"fagordnc",
"p2pcommunity",
"minger",
"assuria-slm",
"wcpp",
"plcy-net-svcs",
"assyst-dr",
"mobile-p2p",
"assuria-ins",
"taep-as-svc",
"nlg-data",
"dj-ice",
"x500ms",
"X11:7",
"p2p-sip",
"p4p-portal",
"bmc-perf-agent",
"ntz-p2p-storage",
"citrixupp",
"freezexservice",
"p2pevolvenet",
"papachi-p2p-srv",
"espeasy-p2p",
"pim-port",
"vp2p",
"dicom",
"icpp",
"sauterdongle",
"vocaltec-hos",
"BackOrifice",
"dhanalakshmi",
"3gpp-w1ap",
"pmsm-webrctl",
"bif-p2p",
] {
safe_words.set(word, Type::SAFE);
}
safe_words
});

View File

@@ -1,5 +1,5 @@
use crate::translations::translations::{bytes_translation, packets_translation};
use crate::Language;
use crate::translations::translations::{bytes_translation, packets_translation};
/// Enum representing the possible kind of chart displayed.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]

View File

@@ -5,8 +5,8 @@
use iced::alignment::{Horizontal, Vertical};
use iced::widget::canvas::path::Arc;
use iced::widget::canvas::{Frame, Text};
use iced::widget::{canvas, Canvas};
use iced::{mouse, Font, Radians, Renderer};
use iced::widget::{Canvas, canvas};
use iced::{Font, Radians, Renderer, mouse};
use std::f32::consts;
pub struct DonutChart {

View File

@@ -3,8 +3,8 @@
use std::cmp::min;
use std::ops::Range;
use iced::widget::Container;
use iced::Element;
use iced::widget::Container;
use plotters::prelude::*;
use plotters::series::LineSeries;
use plotters_iced::{Chart, ChartBuilder, ChartWidget, DrawingBackend};
@@ -282,7 +282,7 @@ fn sample_spline(spline: &Spline<f32, f32>) -> Vec<(f32, f32)> {
mod tests {
use splines::{Interpolation, Key, Spline};
use crate::chart::types::traffic_chart::{sample_spline, PTS};
use crate::chart::types::traffic_chart::{PTS, sample_spline};
#[test]
fn test_spline_samples() {

View File

@@ -1,11 +1,11 @@
use clap::Parser;
use iced::{window, Task};
use iced::{Task, window};
use crate::CONFIGS;
use crate::Configs;
use crate::SNIFFNET_LOWERCASE;
use crate::gui::types::message::Message;
use crate::utils::formatted_strings::APP_VERSION;
use crate::Configs;
use crate::CONFIGS;
use crate::SNIFFNET_LOWERCASE;
#[derive(Parser, Debug)]
#[command(

View File

@@ -6,10 +6,10 @@
use pcap::{Device, DeviceFlags};
use serde::{Deserialize, Serialize};
use crate::networking::types::my_device::MyDevice;
use crate::networking::types::my_link_type::MyLinkType;
#[cfg(not(test))]
use crate::SNIFFNET_LOWERCASE;
use crate::networking::types::my_device::MyDevice;
use crate::networking::types::my_link_type::MyLinkType;
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
pub struct ConfigDevice {

View File

@@ -3,10 +3,10 @@
use serde::{Deserialize, Serialize};
use crate::gui::styles::types::gradient_type::GradientType;
use crate::notifications::types::notifications::Notifications;
#[cfg(not(test))]
use crate::SNIFFNET_LOWERCASE;
use crate::gui::styles::types::gradient_type::GradientType;
use crate::notifications::types::notifications::Notifications;
use crate::{Language, StyleType};
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]

View File

@@ -1,8 +1,6 @@
use once_cell::sync::Lazy;
use crate::{ConfigDevice, ConfigSettings, ConfigWindow};
pub static CONFIGS: Lazy<Configs> = Lazy::new(Configs::load);
pub static CONFIGS: std::sync::LazyLock<Configs> = std::sync::LazyLock::new(Configs::load);
#[derive(Default, Clone, PartialEq, Debug)]
pub struct Configs {

View File

@@ -1,8 +1,8 @@
use iced::Font;
use iced::widget::Tooltip;
use iced::widget::svg::Handle;
use iced::widget::tooltip::Position;
use iced::widget::Tooltip;
use iced::widget::{Svg, Text};
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,

View File

@@ -2,7 +2,7 @@
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{button, Row, Text, Tooltip};
use iced::widget::{Row, Text, Tooltip, button};
use iced::{Alignment, Font};
use crate::gui::styles::container::ContainerType;

View File

@@ -4,8 +4,8 @@
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{button, rich_text, span, Column, Container, Row, Text, Tooltip};
use iced::widget::{horizontal_space, Space};
use iced::widget::{Column, Container, Row, Text, Tooltip, button, rich_text, span};
use iced::widget::{Space, horizontal_space};
use iced::{Alignment, Font, Length, Padding};
use crate::gui::components::button::row_open_link_tooltip;

View File

@@ -2,7 +2,7 @@
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{button, horizontal_space, Container, Row, Space, Text, Tooltip};
use iced::widget::{Container, Row, Space, Text, Tooltip, button, horizontal_space};
use iced::{Alignment, Font, Length};
use crate::configs::types::config_settings::ConfigSettings;
@@ -17,7 +17,7 @@
use crate::translations::translations::{quit_analysis_translation, settings_translation};
use crate::translations::translations_3::thumbnail_mode_translation;
use crate::utils::types::icon::Icon;
use crate::{Language, StyleType, SNIFFNET_TITLECASE};
use crate::{Language, SNIFFNET_TITLECASE, StyleType};
pub fn header(sniffer: &Sniffer) -> Container<Message, StyleType> {
let thumbnail = sniffer.thumbnail;

View File

@@ -1,7 +1,7 @@
use iced::alignment::Alignment;
use iced::widget::{
button, center, horizontal_space, mouse_area, opaque, stack, Column, Container, Row, Space,
Text,
Column, Container, Row, Space, Text, button, center, horizontal_space, mouse_area, opaque,
stack,
};
use iced::{Element, Font, Length};

View File

@@ -1,8 +1,8 @@
//! Tab buttons to be used in the various pages just under the header
use iced::widget::text::LineHeight;
use iced::widget::{button, horizontal_space, Button, Container, Row, Space, Text};
use iced::{alignment, Alignment, Font, Length};
use iced::widget::{Button, Container, Row, Space, Text, button, horizontal_space};
use iced::{Alignment, Font, Length, alignment};
use crate::gui::pages::types::settings_page::SettingsPage;
use crate::gui::styles::button::ButtonType;

View File

@@ -2,8 +2,8 @@
use iced::widget::scrollable::Direction;
use iced::widget::tooltip::Position;
use iced::widget::{button, horizontal_space, lazy, vertical_space, Rule, Scrollable};
use iced::widget::{Column, Container, Row, Text, Tooltip};
use iced::widget::{Rule, Scrollable, button, horizontal_space, lazy, vertical_space};
use iced::{Alignment, Font, Length, Padding};
use crate::countries::country_utils::{get_computer_tooltip, get_flag_tooltip};

View File

@@ -3,15 +3,16 @@
//! It contains elements to select network adapter and traffic filters.
use std::collections::HashSet;
use std::fmt::Write;
use iced::Length::FillPortion;
use iced::widget::scrollable::Direction;
use iced::widget::tooltip::Position;
use iced::widget::{
button, Button, Checkbox, Column, Container, Row, Rule, Scrollable, Space, Text, TextInput,
Tooltip,
Button, Checkbox, Column, Container, Row, Rule, Scrollable, Space, Text, TextInput, Tooltip,
button,
};
use iced::Length::FillPortion;
use iced::{alignment, Alignment, Font, Length, Padding};
use iced::{Alignment, Font, Length, Padding, alignment};
use pcap::Device;
use crate::gui::components::button::button_open_file;
@@ -302,7 +303,7 @@ fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column<Message, StyleType>
}
Some(description) => {
#[cfg(not(target_os = "windows"))]
dev_str.push_str(&format!("{name}\n"));
let _ = writeln!(dev_str, "{name}");
dev_str.push_str(&description);
}
}
@@ -310,16 +311,16 @@ fn get_col_adapter(sniffer: &Sniffer, font: Font) -> Column<Message, StyleType>
match num_addresses {
0 => {}
1 => {
dev_str.push_str(&format!("\n{}:", address_translation(language)));
let _ = write!(dev_str, "\n{}:", address_translation(language));
}
_ => {
dev_str.push_str(&format!("\n{}:", addresses_translation(language)));
let _ = write!(dev_str, "\n{}:", addresses_translation(language));
}
}
for addr in dev.addresses {
let address_string = addr.addr.to_string();
dev_str.push_str(&format!("\n {address_string}"));
let _ = write!(dev_str, "\n {address_string}");
}
dev_str_list.push((name, dev_str));
}

View File

@@ -4,12 +4,12 @@
use iced::widget::text::LineHeight;
use iced::widget::text_input::Side;
use iced::widget::tooltip::Position;
use iced::widget::{Button, Column, Container, Row, Scrollable, Text, TextInput, lazy};
use iced::widget::{
button, combo_box, horizontal_space, text_input, vertical_space, ComboBox, Rule, Space,
Toggler, Tooltip,
ComboBox, Rule, Space, Toggler, Tooltip, button, combo_box, horizontal_space, text_input,
vertical_space,
};
use iced::widget::{lazy, Button, Column, Container, Row, Scrollable, Text, TextInput};
use iced::{alignment, Alignment, Font, Length, Padding, Pixels};
use iced::{Alignment, Font, Length, Padding, Pixels, alignment};
use crate::chart::types::chart_type::ChartType;
use crate::gui::components::tab::get_pages_tabs;

View File

@@ -1,10 +1,11 @@
use iced::Length::FillPortion;
use iced::widget::scrollable::Direction;
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{button, vertical_space, Space};
use iced::widget::{lazy, Column, Container, Row, Scrollable, Text, Tooltip};
use iced::Length::FillPortion;
use iced::widget::{Column, Container, Row, Scrollable, Text, Tooltip, lazy};
use iced::widget::{Space, button, vertical_space};
use iced::{Alignment, Font, Length};
use std::fmt::Write;
use crate::countries::country_utils::get_flag_tooltip;
use crate::gui::components::header::get_button_settings;
@@ -232,7 +233,7 @@ fn bytes_notification_log<'a>(
(logged_notification.threshold).into(),
));
threshold_str.push_str(&format!(" {}", per_second_translation(language)));
let _ = write!(threshold_str, " {}", per_second_translation(language));
let mut incoming_str = " - ".to_string();
incoming_str.push_str(incoming_translation(language));
incoming_str.push_str(": ");
@@ -314,7 +315,7 @@ fn favorite_notification_log<'a>(
let mut domain_asn_str = logged_notification.host.domain;
if !asn.name.is_empty() {
domain_asn_str.push_str(&format!(" - {}", asn.name));
let _ = write!(domain_asn_str, " - {}", asn.name);
}
let row_flag_details = Row::new()

View File

@@ -38,16 +38,17 @@
use crate::utils::formatted_strings::get_active_filters_string;
use crate::utils::types::icon::Icon;
use crate::{ByteMultiple, ChartType, ConfigSettings, Language, RunningPage, StyleType};
use iced::Length::{Fill, FillPortion};
use iced::alignment::{Horizontal, Vertical};
use iced::widget::scrollable::Direction;
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{
button, horizontal_space, lazy, vertical_space, Button, Column, Container, Row, Rule,
Scrollable, Space, Text, Tooltip,
Button, Column, Container, Row, Rule, Scrollable, Space, Text, Tooltip, button,
horizontal_space, lazy, vertical_space,
};
use iced::Length::{Fill, FillPortion};
use iced::{Alignment, Font, Length, Padding, Shrink};
use std::fmt::Write;
/// Computes the body of gui overview page
pub fn overview_page(sniffer: &Sniffer) -> Container<Message, StyleType> {
@@ -145,7 +146,11 @@ fn body_no_packets<'a>(
) -> Column<'a, Message, StyleType> {
let link_type = device.link_type;
let mut adapter_info = device.name.clone();
adapter_info.push_str(&format!("\n{}", link_type.full_print_on_one_line(language)));
let _ = write!(
adapter_info,
"\n{}",
link_type.full_print_on_one_line(language)
);
let (icon_text, nothing_to_see_text) = if !link_type.is_supported() {
(
Icon::Warning.to_text().size(60),
@@ -885,7 +890,7 @@ fn sort_arrows<'a>(
#[cfg(test)]
mod tests {
use crate::chart::types::chart_type::ChartType;
use crate::gui::pages::overview_page::{get_bars_length, MIN_BARS_LENGTH};
use crate::gui::pages::overview_page::{MIN_BARS_LENGTH, get_bars_length};
use crate::networking::types::data_info::DataInfo;
#[test]

View File

@@ -1,7 +1,7 @@
use iced::widget::text::LineHeight;
use iced::widget::tooltip::Position;
use iced::widget::{
button, vertical_space, Column, Container, PickList, Row, Rule, Slider, Space, Text, Tooltip,
Column, Container, PickList, Row, Rule, Slider, Space, Text, Tooltip, button, vertical_space,
};
use iced::{Alignment, Font, Length};

View File

@@ -1,5 +1,5 @@
use iced::widget::scrollable::Direction;
use iced::widget::{horizontal_space, Button, Slider};
use iced::widget::{Button, Slider, horizontal_space};
use iced::widget::{Checkbox, Column, Container, Row, Scrollable, Space, Text, TextInput};
use iced::{Alignment, Font, Length, Padding};

View File

@@ -1,8 +1,9 @@
use iced::widget::scrollable::Direction;
use iced::widget::{button, lazy, Rule, Space};
use iced::widget::{Button, Column, Container, Row, Scrollable, Text};
use iced::widget::{Rule, Space, button, lazy};
use iced::{Alignment, Color, Element, Font, Length, Padding};
use crate::StyleType::{Day, DeepSea, MonAmour, Night};
use crate::gui::components::button::button_open_file;
use crate::gui::components::tab::get_settings_tabs;
use crate::gui::pages::settings_notifications_page::settings_header;
@@ -26,7 +27,6 @@
use crate::utils::formatted_strings::get_path_termination_string;
use crate::utils::types::file_info::FileInfo;
use crate::utils::types::icon::Icon;
use crate::StyleType::{Day, DeepSea, MonAmour, Night};
use crate::{ConfigSettings, Language, Sniffer, StyleType};
pub fn settings_style_page(sniffer: &Sniffer) -> Container<Message, StyleType> {

View File

@@ -2,7 +2,7 @@
use std::net::IpAddr;
use std::sync::Mutex;
use iced::widget::{lazy, vertical_space, Column, Container, Row, Rule, Space, Text};
use iced::widget::{Column, Container, Row, Rule, Space, Text, lazy, vertical_space};
use iced::{Alignment, Font, Length};
use crate::chart::types::chart_type::ChartType;
@@ -155,7 +155,7 @@ fn clip_text(text: &str, max_chars: usize) -> String {
#[cfg(test)]
mod tests {
use crate::gui::pages::thumbnail_page::{
clip_text, host_text, MAX_CHARS_HOST, MAX_CHARS_SERVICE,
MAX_CHARS_HOST, MAX_CHARS_SERVICE, clip_text, host_text,
};
use crate::networking::types::asn::Asn;
use crate::networking::types::host::Host;

View File

@@ -6,13 +6,13 @@
use std::thread;
use std::time::Duration;
use iced::Event::{Keyboard, Window};
use iced::keyboard::key::Named;
use iced::keyboard::{Event, Key, Modifiers};
use iced::mouse::Event::ButtonPressed;
use iced::widget::Column;
use iced::window::{Id, Level};
use iced::Event::{Keyboard, Window};
use iced::{window, Element, Point, Size, Subscription, Task};
use iced::{Element, Point, Size, Subscription, Task, window};
use pcap::Device;
use rfd::FileHandle;
@@ -53,7 +53,7 @@
use crate::networking::types::port_collection::PortCollection;
use crate::notifications::notify_and_log::notify_and_log;
use crate::notifications::types::notifications::Notification;
use crate::notifications::types::sound::{play, Sound};
use crate::notifications::types::sound::{Sound, play};
use crate::report::get_report_entries::get_searched_entries;
use crate::report::types::report_sort_type::ReportSortType;
use crate::report::types::search_parameters::SearchParameters;

View File

@@ -7,12 +7,12 @@
use iced::widget::button::{Catalog, Status, Style};
use iced::{Background, Border, Color, Shadow, Vector};
use crate::StyleType;
use crate::gui::styles::style_constants::{ALERT_RED_COLOR, BORDER_BUTTON_RADIUS, BORDER_WIDTH};
use crate::gui::styles::types::gradient_type::{
get_gradient_buttons, get_gradient_hovered_buttons, GradientType,
GradientType, get_gradient_buttons, get_gradient_hovered_buttons,
};
use crate::gui::styles::types::palette::mix_colors;
use crate::StyleType;
#[derive(Default)]
pub enum ButtonType {

View File

@@ -5,8 +5,8 @@
use iced::widget::checkbox::{Catalog, Status, Style};
use iced::{Background, Border};
use crate::gui::styles::style_constants::BORDER_WIDTH;
use crate::StyleType;
use crate::gui::styles::style_constants::BORDER_WIDTH;
#[derive(Default)]
pub enum CheckboxType {

View File

@@ -6,9 +6,9 @@
use iced::widget::container::{Catalog, Style};
use iced::{Background, Border, Color, Shadow};
use crate::gui::styles::style_constants::{BORDER_ROUNDED_RADIUS, BORDER_WIDTH};
use crate::gui::styles::types::gradient_type::{get_gradient_headers, GradientType};
use crate::StyleType;
use crate::gui::styles::style_constants::{BORDER_ROUNDED_RADIUS, BORDER_WIDTH};
use crate::gui::styles::types::gradient_type::{GradientType, get_gradient_headers};
#[derive(Default)]
pub enum ContainerType {

View File

@@ -4,12 +4,11 @@
//! <https://github.com/GyulyVGC/sniffnet/pull/708>
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 A11Y_DARK_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
pub static A11Y_DARK_PALETTE: std::sync::LazyLock<Palette> = std::sync::LazyLock::new(|| Palette {
primary: color!(0x000000),
secondary: color!(0x934900),
outgoing: color!(0xF0F0F0),
@@ -18,17 +17,18 @@
text_body: color!(0xfcfaf0),
});
pub static A11Y_DARK_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| A11Y_DARK_PALETTE.generate_palette_extension());
pub static A11Y_DARK_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| A11Y_DARK_PALETTE.generate_palette_extension());
pub static A11Y_LIGHT_PALETTE: Lazy<Palette> = 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 A11Y_LIGHT_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0xFFFFFF),
secondary: color!(0x6CB6FF),
outgoing: color!(0x0F0F0F),
starred: color!(0x0000FF),
text_headers: color!(0x1F1F1F),
text_body: color!(0x03050F),
});
pub static A11Y_LIGHT_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| A11Y_LIGHT_PALETTE.generate_palette_extension());
pub static A11Y_LIGHT_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| A11Y_LIGHT_PALETTE.generate_palette_extension());

View File

@@ -4,32 +4,33 @@
//! <https://draculatheme.com/>
//! Light style from: <https://github.com/AshGrowem/Dracula.min/>
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 DRACULA_DARK_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0x282a36), // Background
secondary: color!(0xff79c6), // Pink
outgoing: color!(0x8be9fd), // Cyan
starred: color!(0xf1fa8c, 0.7),
text_headers: color!(0x282a36), // Background
text_body: color!(0xf8f8f2), // Foreground
});
pub static DRACULA_DARK_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0x282a36), // Background
secondary: color!(0xff79c6), // Pink
outgoing: color!(0x8be9fd), // Cyan
starred: color!(0xf1fa8c, 0.7),
text_headers: color!(0x282a36), // Background
text_body: color!(0xf8f8f2), // Foreground
});
pub static DRACULA_DARK_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| DRACULA_DARK_PALETTE.generate_palette_extension());
pub static DRACULA_DARK_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| DRACULA_DARK_PALETTE.generate_palette_extension());
// Light Darker variant
pub static DRACULA_LIGHT_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0xf8f8f2),
secondary: color!(0x9f1670),
outgoing: color!(0x005d6f),
starred: color!(0xffb86c),
text_headers: color!(0xf8f8f2),
text_body: color!(0x282a36),
});
pub static DRACULA_LIGHT_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0xf8f8f2),
secondary: color!(0x9f1670),
outgoing: color!(0x005d6f),
starred: color!(0xffb86c),
text_headers: color!(0xf8f8f2),
text_body: color!(0x282a36),
});
pub static DRACULA_LIGHT_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| DRACULA_LIGHT_PALETTE.generate_palette_extension());
pub static DRACULA_LIGHT_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| DRACULA_LIGHT_PALETTE.generate_palette_extension());

View File

@@ -4,33 +4,34 @@
//! <https://github.com/morhetz/gruvbox>
use iced::color;
use once_cell::sync::Lazy;
use crate::gui::styles::types::palette::Palette;
use crate::gui::styles::types::palette_extension::PaletteExtension;
/// Gruvbox (night style)
pub static GRUVBOX_DARK_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0x282828), // bg
secondary: color!(0xfe8019), // orange
outgoing: color!(0x8ec07c), // aqua
starred: color!(0xd79921, 0.8),
text_headers: color!(0x1d2021), // bg0_h
text_body: color!(0xebdbb2), // fg
});
pub static GRUVBOX_DARK_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0x282828), // bg
secondary: color!(0xfe8019), // orange
outgoing: color!(0x8ec07c), // aqua
starred: color!(0xd79921, 0.8),
text_headers: color!(0x1d2021), // bg0_h
text_body: color!(0xebdbb2), // fg
});
pub static GRUVBOX_DARK_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| GRUVBOX_DARK_PALETTE.generate_palette_extension());
pub static GRUVBOX_DARK_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| GRUVBOX_DARK_PALETTE.generate_palette_extension());
/// Gruvbox (day style)
pub static GRUVBOX_LIGHT_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0xfbf1c7), // bg
secondary: color!(0xd65d0e), // orange
outgoing: color!(0x689d6a), // aqua
starred: color!(0xd79921, 0.9), // yellow
text_headers: color!(0xf9f5d7), // bg0_h
text_body: color!(0x282828), // fg
});
pub static GRUVBOX_LIGHT_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0xfbf1c7), // bg
secondary: color!(0xd65d0e), // orange
outgoing: color!(0x689d6a), // aqua
starred: color!(0xd79921, 0.9), // yellow
text_headers: color!(0xf9f5d7), // bg0_h
text_body: color!(0x282828), // fg
});
pub static GRUVBOX_LIGHT_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| GRUVBOX_LIGHT_PALETTE.generate_palette_extension());
pub static GRUVBOX_LIGHT_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| GRUVBOX_LIGHT_PALETTE.generate_palette_extension());

View File

@@ -3,12 +3,11 @@
//! Nord theme
//! <https://www.nordtheme.com/docs/colors-and-palettes>
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 NORD_DARK_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
pub static NORD_DARK_PALETTE: std::sync::LazyLock<Palette> = std::sync::LazyLock::new(|| Palette {
primary: color!(0x2e3440), // nord0
secondary: color!(0x88c0d0), // nord8
outgoing: color!(0xB48EAD), // nord15
@@ -17,17 +16,18 @@
text_body: color!(0xd8dee9), // nord4
});
pub static NORD_DARK_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| NORD_DARK_PALETTE.generate_palette_extension());
pub static NORD_DARK_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| NORD_DARK_PALETTE.generate_palette_extension());
pub static NORD_LIGHT_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0xeceff4), // nord6
secondary: color!(0x05e81ac), // nord10
outgoing: color!(0xb48ead), // nord15
starred: color!(0xD08770, 0.8), // nord12
text_headers: color!(0xeceff4), // nord6
text_body: color!(0x2e3440), // nord0
});
pub static NORD_LIGHT_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0xeceff4), // nord6
secondary: color!(0x05e81ac), // nord10
outgoing: color!(0xb48ead), // nord15
starred: color!(0xD08770, 0.8), // nord12
text_headers: color!(0xeceff4), // nord6
text_body: color!(0x2e3440), // nord0
});
pub static NORD_LIGHT_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| NORD_LIGHT_PALETTE.generate_palette_extension());
pub static NORD_LIGHT_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| NORD_LIGHT_PALETTE.generate_palette_extension());

View File

@@ -3,33 +3,34 @@
//! Solarized
//! <https://ethanschoonover.com/solarized/>
use iced::color;
use once_cell::sync::Lazy;
use crate::gui::styles::types::palette::Palette;
use crate::gui::styles::types::palette_extension::PaletteExtension;
/// Solarized light (Day style)
pub static SOLARIZED_LIGHT_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0xfdf6e3), // base3
secondary: color!(0x859900), // green
outgoing: color!(0x268bd2), // blue
starred: color!(0xb58900, 0.9), // yellow
text_headers: color!(0xfdf6e3), // base3
text_body: color!(0x002b36), // base03
});
pub static SOLARIZED_LIGHT_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0xfdf6e3), // base3
secondary: color!(0x859900), // green
outgoing: color!(0x268bd2), // blue
starred: color!(0xb58900, 0.9), // yellow
text_headers: color!(0xfdf6e3), // base3
text_body: color!(0x002b36), // base03
});
pub static SOLARIZED_LIGHT_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| SOLARIZED_LIGHT_PALETTE.generate_palette_extension());
pub static SOLARIZED_LIGHT_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| SOLARIZED_LIGHT_PALETTE.generate_palette_extension());
/// Solarized dark (Night style)
pub static SOLARIZED_DARK_PALETTE: Lazy<Palette> = Lazy::new(|| Palette {
primary: color!(0x002b36), // base03
secondary: color!(0x859900), // green
outgoing: color!(0x268bd2), // blue
starred: color!(0xb58900), // yellow
text_headers: color!(0x002b36), // base03
text_body: color!(0xeee8d5), // base2
});
pub static SOLARIZED_DARK_PALETTE: std::sync::LazyLock<Palette> =
std::sync::LazyLock::new(|| Palette {
primary: color!(0x002b36), // base03
secondary: color!(0x859900), // green
outgoing: color!(0x268bd2), // blue
starred: color!(0xb58900), // yellow
text_headers: color!(0x002b36), // base03
text_body: color!(0xeee8d5), // base2
});
pub static SOLARIZED_DARK_PALETTE_EXTENSION: Lazy<PaletteExtension> =
Lazy::new(|| SOLARIZED_DARK_PALETTE.generate_palette_extension());
pub static SOLARIZED_DARK_PALETTE_EXTENSION: std::sync::LazyLock<PaletteExtension> =
std::sync::LazyLock::new(|| SOLARIZED_DARK_PALETTE.generate_palette_extension());

View File

@@ -5,9 +5,9 @@
use iced::widget::pick_list::{Catalog, Status, Style};
use iced::{Background, Border, Color};
use crate::StyleType;
use crate::gui::styles::style_constants::BORDER_WIDTH;
use crate::gui::styles::types::palette::mix_colors;
use crate::StyleType;
#[derive(Default)]
pub enum PicklistType {

View File

@@ -2,10 +2,10 @@
#![allow(clippy::module_name_repetitions)]
use crate::gui::styles::style_constants::ALERT_RED_COLOR;
use crate::StyleType;
use iced::widget::rule::{Catalog, FillMode, Style};
use crate::gui::styles::style_constants::ALERT_RED_COLOR;
use iced::Color;
use iced::widget::rule::{Catalog, FillMode, Style};
#[derive(Default)]
pub enum RuleType {

View File

@@ -7,9 +7,9 @@
use iced::widget::scrollable::{Scrollbar, Scroller};
use iced::{Background, Border, Color};
use crate::StyleType;
use crate::gui::styles::style_constants::BORDER_ROUNDED_RADIUS;
use crate::gui::styles::types::palette::mix_colors;
use crate::StyleType;
#[derive(Default)]
pub enum ScrollbarType {

View File

@@ -6,9 +6,9 @@
use iced::widget::slider::{Catalog, Handle, HandleShape, Rail, Status};
use iced::{Background, Border};
use crate::StyleType;
use crate::gui::styles::style_constants::{BORDER_ROUNDED_RADIUS, BORDER_WIDTH};
use crate::gui::styles::types::palette::mix_colors;
use crate::StyleType;
#[derive(Default)]
pub enum SliderType {

View File

@@ -2,9 +2,9 @@
#![allow(clippy::module_name_repetitions)]
use crate::StyleType;
use crate::gui::styles::style_constants::ALERT_RED_COLOR;
use crate::gui::types::message::Message;
use crate::StyleType;
use iced::widget::text::{Catalog, Style};
use iced::widget::{Column, Text};
use iced::{Color, Font};

View File

@@ -5,8 +5,8 @@
use iced::widget::text_input::{Catalog, Status, Style};
use iced::{Background, Border, Color};
use crate::gui::styles::style_constants::{ALERT_RED_COLOR, BORDER_WIDTH};
use crate::StyleType;
use crate::gui::styles::style_constants::{ALERT_RED_COLOR, BORDER_WIDTH};
#[derive(Default)]
pub enum TextInputType {

View File

@@ -2,11 +2,11 @@
#![allow(clippy::module_name_repetitions)]
use iced::widget::toggler::{Catalog, Status, Style};
use iced::Color;
use iced::widget::toggler::{Catalog, Status, Style};
use crate::gui::styles::style_constants::BORDER_WIDTH;
use crate::StyleType;
use crate::gui::styles::style_constants::BORDER_WIDTH;
#[derive(Default)]
pub enum TogglerType {

View File

@@ -9,8 +9,8 @@
use iced::Color;
use serde::{
de::{Error as DeErrorTrait, Unexpected},
Deserialize, Deserializer, Serializer,
de::{Error as DeErrorTrait, Unexpected},
};
// #aabbcc is seven bytes long
@@ -109,7 +109,7 @@ pub(super) fn serialize_color<S>(color: &Color, serializer: S) -> Result<S::Ok,
mod tests {
use iced::Color;
use serde::{Deserialize, Serialize};
use serde_test::{assert_de_tokens_error, assert_tokens, Token};
use serde_test::{Token, assert_de_tokens_error, assert_tokens};
use super::{deserialize_color, serialize_color};

View File

@@ -1,7 +1,7 @@
use iced::{Color, Degrees, Gradient};
use serde::{Deserialize, Serialize};
use crate::gui::styles::types::palette::{mix_colors, Palette};
use crate::gui::styles::types::palette::{Palette, mix_colors};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default, Serialize, Deserialize)]
pub enum GradientType {

View File

@@ -197,8 +197,8 @@ fn default() -> Self {
#[cfg(test)]
mod tests {
use iced::color;
use iced::Color;
use iced::color;
use crate::gui::styles::style_constants::{SARASA_MONO, SARASA_MONO_BOLD};
use crate::gui::styles::types::palette_extension::PaletteExtension;

View File

@@ -86,7 +86,7 @@ pub(super) fn serialize_font<S>(font: &Font, serializer: S) -> Result<S::Ok, S::
#[cfg(test)]
mod tests {
use iced::Color;
use serde_test::{assert_tokens, Token};
use serde_test::{Token, assert_tokens};
use crate::gui::styles::style_constants::{SARASA_MONO, SARASA_MONO_BOLD};
use crate::gui::styles::types::palette_extension::PaletteExtension;

View File

@@ -70,12 +70,12 @@ pub fn get_font_weight(self) -> FontStyle {
#[cfg(test)]
mod tests {
use iced::{color, Color};
use serde_test::{assert_tokens, Token};
use iced::{Color, color};
use serde_test::{Token, assert_tokens};
use crate::StyleType;
use crate::gui::styles::types::custom_palette::{CustomPalette, ExtraStyles};
use crate::gui::styles::types::palette::Palette;
use crate::StyleType;
// test if deserializing and serializing a StyleType works n.1
// simple case: one of the default themes

View File

@@ -9,7 +9,7 @@
use iced::advanced::graphics::image::image_rs::ImageFormat;
#[cfg(target_os = "linux")]
use iced::window::settings::PlatformSpecific;
use iced::{application, window, Font, Pixels, Settings};
use iced::{Font, Pixels, Settings, application, window};
use chart::types::chart_type::ChartType;
use chart::types::traffic_chart::TrafficChart;
@@ -31,7 +31,7 @@
use utils::formatted_strings::print_cli_welcome_message;
use crate::configs::types::config_window::{ConfigWindow, ToPosition, ToSize};
use crate::configs::types::configs::{Configs, CONFIGS};
use crate::configs::types::configs::{CONFIGS, Configs};
use crate::gui::sniffer::FONT_FAMILY_NAME;
use crate::gui::styles::style_constants::{ICONS_BYTES, SARASA_MONO_BOLD_BYTES, SARASA_MONO_BYTES};
use crate::secondary_threads::check_updates::set_newer_release_status;

View File

@@ -6,7 +6,7 @@
#[allow(clippy::module_name_repetitions)]
pub fn get_asn(address: &str, asn_db_reader: &MmdbReader) -> Asn {
if let Ok(res) = asn_db_reader.lookup::<MmdbAsnEntry>(address.parse().unwrap()) {
if let Ok(Some(res)) = asn_db_reader.lookup::<MmdbAsnEntry>(address.parse().unwrap()) {
return res.get_asn();
}
Asn::default()
@@ -14,7 +14,7 @@ pub fn get_asn(address: &str, asn_db_reader: &MmdbReader) -> Asn {
#[cfg(test)]
mod tests {
use crate::mmdb::asn::{get_asn, ASN_MMDB};
use crate::mmdb::asn::{ASN_MMDB, get_asn};
use crate::mmdb::types::mmdb_reader::MmdbReader;
#[test]

View File

@@ -6,7 +6,7 @@
#[allow(clippy::module_name_repetitions)]
pub fn get_country(address: &str, country_db_reader: &MmdbReader) -> Country {
if let Ok(res) = country_db_reader.lookup::<MmdbCountryEntry>(address.parse().unwrap()) {
if let Ok(Some(res)) = country_db_reader.lookup::<MmdbCountryEntry>(address.parse().unwrap()) {
return res.get_country();
}
Country::ZZ // unknown
@@ -15,7 +15,7 @@ pub fn get_country(address: &str, country_db_reader: &MmdbReader) -> Country {
#[cfg(test)]
mod tests {
use crate::countries::types::country::Country;
use crate::mmdb::country::{get_country, COUNTRY_MMDB};
use crate::mmdb::country::{COUNTRY_MMDB, get_country};
use crate::mmdb::types::mmdb_reader::MmdbReader;
#[test]

View File

@@ -1,7 +1,7 @@
use std::net::IpAddr;
use std::sync::Arc;
use maxminddb::{MaxMindDBError, Reader};
use maxminddb::{MaxMindDbError, Reader};
use serde::Deserialize;
#[derive(Clone)]
@@ -24,7 +24,10 @@ pub fn from(mmdb_path: &String, default_mmdb: &'static [u8]) -> MmdbReader {
MmdbReader::Default(default_reader)
}
pub fn lookup<'a, T: Deserialize<'a>>(&'a self, ip: IpAddr) -> Result<T, MaxMindDBError> {
pub fn lookup<'a, T: Deserialize<'a>>(
&'a self,
ip: IpAddr,
) -> Result<Option<T>, MaxMindDbError> {
match self {
MmdbReader::Default(reader) => reader.lookup(ip),
MmdbReader::Custom(reader) => reader.lookup(ip),

View File

@@ -8,6 +8,7 @@
use etherparse::{EtherType, LaxPacketHeaders, LinkHeader, NetHeaders, TransportHeader};
use pcap::{Address, Device};
use crate::IpVersion::{IPv4, IPv6};
use crate::mmdb::asn::get_asn;
use crate::mmdb::country::get_country;
use crate::mmdb::types::mmdb_reader::MmdbReaders;
@@ -26,8 +27,8 @@
use crate::networking::types::traffic_direction::TrafficDirection;
use crate::networking::types::traffic_type::TrafficType;
use crate::utils::formatted_strings::get_domain_from_r_dns;
use crate::IpVersion::{IPv4, IPv6};
use crate::{InfoTraffic, IpVersion, Protocol};
use std::fmt::Write;
include!(concat!(env!("OUT_DIR"), "/services.rs"));
@@ -296,7 +297,7 @@ pub fn modify_or_insert_in_map(
);
// determine upper layer service
service = get_service(key, traffic_direction);
};
}
let mut info_traffic = info_traffic_mutex
.lock()
@@ -633,7 +634,7 @@ pub fn is_my_address(local_address: &String, my_interface_addresses: &Vec<Addres
fn mac_from_dec_to_hex(mac_dec: [u8; 6]) -> String {
let mut mac_hex = String::new();
for n in &mac_dec {
mac_hex.push_str(&format!("{n:02x}:"));
let _ = write!(mac_hex, "{n:02x}:");
}
mac_hex.pop();
mac_hex
@@ -653,6 +654,8 @@ mod tests {
use pcap::Address;
use crate::Protocol;
use crate::Service;
use crate::networking::manage_packets::{
get_service, get_traffic_direction, get_traffic_type, is_local_connection,
mac_from_dec_to_hex,
@@ -661,8 +664,6 @@ mod tests {
use crate::networking::types::service_query::ServiceQuery;
use crate::networking::types::traffic_direction::TrafficDirection;
use crate::networking::types::traffic_type::TrafficType;
use crate::Protocol;
use crate::Service;
include!(concat!(env!("OUT_DIR"), "/services.rs"));
@@ -1134,9 +1135,11 @@ fn is_local_connection_ipv6_link_local_test() {
fn test_get_service_simple_only_one_valid() {
let unknown_port = Some(65000);
for p in [Protocol::TCP, Protocol::UDP] {
assert!(SERVICES
.get(&ServiceQuery(unknown_port.unwrap(), p))
.is_none());
assert!(
SERVICES
.get(&ServiceQuery(unknown_port.unwrap(), p))
.is_none()
);
for d in [TrafficDirection::Incoming, TrafficDirection::Outgoing] {
let key = AddressPortPair::new(
String::new(),
@@ -1347,12 +1350,16 @@ fn test_get_service_unknown() {
let unknown_port_1 = Some(39332);
let unknown_port_2 = Some(23679);
for p in [Protocol::TCP, Protocol::UDP] {
assert!(SERVICES
.get(&ServiceQuery(unknown_port_1.unwrap(), p))
.is_none());
assert!(SERVICES
.get(&ServiceQuery(unknown_port_2.unwrap(), p))
.is_none());
assert!(
SERVICES
.get(&ServiceQuery(unknown_port_1.unwrap(), p))
.is_none()
);
assert!(
SERVICES
.get(&ServiceQuery(unknown_port_2.unwrap(), p))
.is_none()
);
for d in [TrafficDirection::Incoming, TrafficDirection::Outgoing] {
for (p1, p2) in [
(unknown_port_1, unknown_port_2),

View File

@@ -2,6 +2,7 @@
use std::fmt::{Display, Formatter};
use etherparse::ArpOperation;
use std::fmt::Write;
#[derive(Copy, Clone, PartialEq, Eq, Hash, Default)]
pub enum ArpType {
@@ -27,7 +28,7 @@ pub fn pretty_print_types(map: &HashMap<ArpType, usize>) -> String {
vec.sort_by(|(_, a), (_, b)| b.cmp(a));
for (arp_type, n) in vec {
ret_val.push_str(&format!(" {arp_type} ({n})\n"));
let _ = writeln!(ret_val, " {arp_type} ({n})");
}
ret_val
}

View File

@@ -1,5 +1,4 @@
use crate::networking::types::ip_collection::AddressCollection;
use once_cell::sync::Lazy;
use std::net::IpAddr;
use std::str::FromStr;
@@ -10,12 +9,12 @@ pub struct Bogon {
// IPv4 bogons
static THIS_NETWORK: Lazy<Bogon> = Lazy::new(|| Bogon {
static THIS_NETWORK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("0.0.0.0-0.255.255.255").unwrap(),
description: "\"this\" network",
});
static PRIVATE_USE: Lazy<Bogon> = Lazy::new(|| Bogon {
static PRIVATE_USE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::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",
)
@@ -23,84 +22,84 @@ pub struct Bogon {
description: "private-use",
});
static CARRIER_GRADE: Lazy<Bogon> = Lazy::new(|| Bogon {
static CARRIER_GRADE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("100.64.0.0-100.127.255.255").unwrap(),
description: "carrier-grade NAT",
});
static LOOPBACK: Lazy<Bogon> = Lazy::new(|| Bogon {
static LOOPBACK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("127.0.0.0-127.255.255.255").unwrap(),
description: "loopback",
});
static LINK_LOCAL: Lazy<Bogon> = Lazy::new(|| Bogon {
static LINK_LOCAL: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("169.254.0.0-169.254.255.255").unwrap(),
description: "link local",
});
static IETF_PROTOCOL: Lazy<Bogon> = Lazy::new(|| Bogon {
static IETF_PROTOCOL: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("192.0.0.0-192.0.0.255").unwrap(),
description: "IETF protocol assignments",
});
static TEST_NET_1: Lazy<Bogon> = Lazy::new(|| Bogon {
static TEST_NET_1: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("192.0.2.0-192.0.2.255").unwrap(),
description: "TEST-NET-1",
});
static NETWORK_INTERCONNECT: Lazy<Bogon> = Lazy::new(|| Bogon {
static NETWORK_INTERCONNECT: std::sync::LazyLock<Bogon> = std::sync::LazyLock::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<Bogon> = Lazy::new(|| Bogon {
static TEST_NET_2: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("198.51.100.0-198.51.100.255").unwrap(),
description: "TEST-NET-2",
});
static TEST_NET_3: Lazy<Bogon> = Lazy::new(|| Bogon {
static TEST_NET_3: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("203.0.113.0-203.0.113.255").unwrap(),
description: "TEST-NET-3",
});
static FUTURE_USE: Lazy<Bogon> = Lazy::new(|| Bogon {
static FUTURE_USE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("240.0.0.0-255.255.255.255").unwrap(),
description: "future use",
});
// IPv6 bogons
static NODE_SCOPE_UNSPECIFIED: Lazy<Bogon> = Lazy::new(|| Bogon {
static NODE_SCOPE_UNSPECIFIED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("::").unwrap(),
description: "node-scope unicast unspecified",
});
static NODE_SCOPE_LOOPBACK: Lazy<Bogon> = Lazy::new(|| Bogon {
static NODE_SCOPE_LOOPBACK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("::1").unwrap(),
description: "node-scope unicast loopback",
});
static IPV4_MAPPED: Lazy<Bogon> = Lazy::new(|| Bogon {
static IPV4_MAPPED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("::ffff:0.0.0.0-::ffff:255.255.255.255").unwrap(),
description: "IPv4-mapped",
});
static IPV4_COMPATIBLE: Lazy<Bogon> = Lazy::new(|| Bogon {
static IPV4_COMPATIBLE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("::-::255.255.255.255").unwrap(),
description: "IPv4-compatible",
});
static REMOTELY_TRIGGERED: Lazy<Bogon> = Lazy::new(|| Bogon {
static REMOTELY_TRIGGERED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("100::-100::ffff:ffff:ffff:ffff").unwrap(),
description: "remotely triggered black hole",
});
static ORCHID: Lazy<Bogon> = Lazy::new(|| Bogon {
static ORCHID: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("2001:10::-2001:1f:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(),
description: "ORCHID",
});
static DOCUMENTATION_PREFIX: Lazy<Bogon> = Lazy::new(|| {
static DOCUMENTATION_PREFIX: std::sync::LazyLock<Bogon> = std::sync::LazyLock::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(),
@@ -108,24 +107,24 @@ pub struct Bogon {
}
});
static ULA: Lazy<Bogon> = Lazy::new(|| Bogon {
static ULA: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(),
description: "ULA",
});
static LINK_LOCAL_UNICAST: Lazy<Bogon> = Lazy::new(|| Bogon {
static LINK_LOCAL_UNICAST: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(),
description: "link-local unicast",
});
static SITE_LOCAL_UNICAST: Lazy<Bogon> = Lazy::new(|| Bogon {
static SITE_LOCAL_UNICAST: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon {
range: AddressCollection::new("fec0::-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(),
description: "site-local unicast",
});
// all bogons
static BOGONS: Lazy<Vec<&'static Bogon>> = Lazy::new(|| {
static BOGONS: std::sync::LazyLock<Vec<&'static Bogon>> = std::sync::LazyLock::new(|| {
vec![
&THIS_NETWORK,
&PRIVATE_USE,

View File

@@ -2,6 +2,7 @@
use std::fmt::{Display, Formatter};
use etherparse::{Icmpv4Type, Icmpv6Type};
use std::fmt::Write;
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum IcmpType {
@@ -17,7 +18,7 @@ pub fn pretty_print_types(map: &HashMap<IcmpType, usize>) -> String {
vec.sort_by(|(_, a), (_, b)| b.cmp(a));
for (icmp_type, n) in vec {
ret_val.push_str(&format!(" {icmp_type} ({n})\n"));
let _ = writeln!(ret_val, " {icmp_type} ({n})");
}
ret_val
}

View File

@@ -5,10 +5,10 @@
use chrono::{DateTime, Local};
use crate::Service;
use crate::networking::types::arp_type::ArpType;
use crate::networking::types::icmp_type::IcmpType;
use crate::networking::types::traffic_direction::TrafficDirection;
use crate::Service;
/// Struct useful to format the output report file and to keep track of statistics about the sniffed traffic.
///

View File

@@ -3,13 +3,13 @@
use std::collections::{HashMap, HashSet};
use crate::Service;
use crate::networking::types::address_port_pair::AddressPortPair;
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::Service;
/// Struct to be shared between the threads in charge of parsing packets and update reports.
pub struct InfoTraffic {

View File

@@ -101,13 +101,19 @@ fn test_default_collection_contains_everything() {
assert!(collection.contains(&IpAddr::from_str("0.0.0.0").unwrap()));
assert!(collection.contains(&IpAddr::from_str("255.255.255.255").unwrap()));
assert!(collection.contains(&IpAddr::from_str("192.168.1.1").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("0000:0000:0000:0000:0000:0000:0000:0000").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap()));
assert!(
collection
.contains(&IpAddr::from_str("0000:0000:0000:0000:0000:0000:0000:0000").unwrap())
);
assert!(
collection
.contains(&IpAddr::from_str("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap())
);
assert!(collection.contains(&IpAddr::from_str("88::02").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:eeee").unwrap()));
assert!(
collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:eeee").unwrap())
);
}
#[test]
@@ -275,22 +281,36 @@ fn test_ip_collection_contains() {
fn test_ip_collection_contains_ipv6() {
let collection =
AddressCollection::new( "2001:db8:1234:0000:0000:0000:0000:0000-2001:db8:1234:ffff:ffff:ffff:ffff:ffff,daa::aad,caa::aac").unwrap();
assert!(collection
.contains(&IpAddr::from_str("2001:db8:1234:0000:0000:0000:0000:0000").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:ffff").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:eeee").unwrap()));
assert!(collection
.contains(&IpAddr::from_str("2001:db8:1234:aaaa:ffff:ffff:ffff:eeee").unwrap()));
assert!(
collection
.contains(&IpAddr::from_str("2001:db8:1234:0000:0000:0000:0000:0000").unwrap())
);
assert!(
collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:ffff").unwrap())
);
assert!(
collection
.contains(&IpAddr::from_str("2001:db8:1234:ffff:ffff:ffff:ffff:eeee").unwrap())
);
assert!(
collection
.contains(&IpAddr::from_str("2001:db8:1234:aaaa:ffff:ffff:ffff:eeee").unwrap())
);
assert!(collection.contains(&IpAddr::from_str("daa::aad").unwrap()));
assert!(collection.contains(&IpAddr::from_str("caa::aac").unwrap()));
assert!(!collection
.contains(&IpAddr::from_str("2000:db8:1234:0000:0000:0000:0000:0000").unwrap()));
assert!(!collection
.contains(&IpAddr::from_str("2001:db8:1235:ffff:ffff:ffff:ffff:ffff").unwrap()));
assert!(!collection
.contains(&IpAddr::from_str("2001:eb8:1234:ffff:ffff:ffff:ffff:eeee").unwrap()));
assert!(
!collection
.contains(&IpAddr::from_str("2000:db8:1234:0000:0000:0000:0000:0000").unwrap())
);
assert!(
!collection
.contains(&IpAddr::from_str("2001:db8:1235:ffff:ffff:ffff:ffff:ffff").unwrap())
);
assert!(
!collection
.contains(&IpAddr::from_str("2001:eb8:1234:ffff:ffff:ffff:ffff:eeee").unwrap())
);
assert!(!collection.contains(&IpAddr::from_str("da::aad").unwrap()));
assert!(!collection.contains(&IpAddr::from_str("caa::aab").unwrap()));

View File

@@ -1,5 +1,5 @@
use iced::widget::Column;
use iced::Font;
use iced::widget::Column;
use pcap::Linktype;
use crate::gui::styles::text::TextType;

View File

@@ -6,7 +6,7 @@
BytesThresholdExceeded, FavoriteTransmitted, LoggedNotification, PacketsThresholdExceeded,
};
use crate::notifications::types::notifications::Notifications;
use crate::notifications::types::sound::{play, Sound};
use crate::notifications::types::sound::{Sound, play};
use crate::{InfoTraffic, RunTimeData};
/// Checks if one or more notifications have to be emitted and logs them.

View File

@@ -1,7 +1,7 @@
use serde::{Deserialize, Serialize};
use crate::notifications::types::sound::Sound;
use crate::ByteMultiple;
use crate::notifications::types::sound::Sound;
/// Used to contain the notifications configuration set by the user
#[derive(Clone, Serialize, Deserialize, Copy, PartialEq, Debug)]

View File

@@ -6,10 +6,10 @@
use rodio::{Decoder, OutputStream, Sink};
use serde::{Deserialize, Serialize};
use crate::StyleType;
use crate::gui::styles::style_constants::FONT_SIZE_FOOTER;
use crate::notifications::types::sound::Sound::{Gulp, Pop, Swhoosh};
use crate::utils::types::icon::Icon;
use crate::StyleType;
/// Enum representing the possible notification sounds.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]

View File

@@ -1,3 +1,4 @@
use crate::ByteMultiple;
use crate::networking::types::address_port_pair::AddressPortPair;
use crate::networking::types::info_address_port_pair::InfoAddressPortPair;
use crate::report::types::search_parameters::FilterInputType;
@@ -7,7 +8,6 @@
use crate::translations::translations_2::{destination_translation, source_translation};
use crate::translations::translations_3::{port_translation, service_translation};
use crate::translations::types::language::Language;
use crate::ByteMultiple;
// total width: 1012.0

View File

@@ -4,8 +4,8 @@
use serde::Deserialize;
use crate::utils::formatted_strings::APP_VERSION;
use crate::SNIFFNET_LOWERCASE;
use crate::utils::formatted_strings::APP_VERSION;
#[derive(Deserialize, Debug)]
struct AppVersion {

View File

@@ -9,6 +9,7 @@
use etherparse::{LaxPacketHeaders, LenSource};
use pcap::Packet;
use crate::InfoTraffic;
use crate::mmdb::types::mmdb_reader::MmdbReaders;
use crate::networking::manage_packets::{
analyze_headers, get_address_to_lookup, modify_or_insert_in_map, reverse_dns_lookup,
@@ -23,7 +24,6 @@
use crate::networking::types::my_device::MyDevice;
use crate::networking::types::my_link_type::MyLinkType;
use crate::networking::types::packet_filters_fields::PacketFiltersFields;
use crate::InfoTraffic;
/// The calling thread enters a loop in which it waits for network packets, parses them according
/// to the user specified filters, and inserts them into the shared map variable.
@@ -47,7 +47,6 @@ pub fn parse_packets(
if *current_capture_id.lock().unwrap() != capture_id {
return;
}
continue;
}
Ok(packet) => {
if *current_capture_id.lock().unwrap() != capture_id {

View File

@@ -2,8 +2,8 @@
use iced::widget::Text;
use crate::translations::types::language::Language;
use crate::StyleType;
use crate::translations::types::language::Language;
pub fn choose_adapters_translation<'a>(language: Language) -> Text<'a, StyleType> {
Text::new(match language {
@@ -466,199 +466,311 @@ pub fn network_adapter_translation(language: Language) -> &'static str {
pub fn no_addresses_translation<'a>(language: Language, adapter: &str) -> Text<'a, StyleType> {
let network_adapter_translation = network_adapter_translation(language);
Text::new(match language {
Language::EN => format!("No traffic can be observed because the adapter you selected has no active addresses...\n\n\
Language::EN => format!(
"No traffic can be observed because the adapter you selected has no active addresses...\n\n\
{network_adapter_translation}: {adapter}\n\n\
If you are sure you are connected to the internet, try choosing a different adapter."),
Language::IT => format!("Non è osservabile alcun traffico perché l'adattatore di rete selezionato non ha indirizzi attivi...\n\n\
If you are sure you are connected to the internet, try choosing a different adapter."
),
Language::IT => format!(
"Non è osservabile alcun traffico perché l'adattatore di rete selezionato non ha indirizzi attivi...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Se sei sicuro di essere connesso ad internet, prova a scegliere un adattatore diverso."),
Language::FR => format!("Aucun trafic ne peut être observé, car la carte réseau que vous avez saisie n'a pas d'adresse...\n\n\
Se sei sicuro di essere connesso ad internet, prova a scegliere un adattatore diverso."
),
Language::FR => format!(
"Aucun trafic ne peut être observé, car la carte réseau que vous avez saisie n'a pas d'adresse...\n\n\
{network_adapter_translation} : {adapter}\n\n\
Si vous êtes sûr d'être connecté à internet, essayez une autre carte."),
Language::ES => format!("No se puede observar ningún tráfico porque el adaptador seleccionado no tiene direcciones activas...\n\n\
Si vous êtes sûr d'être connecté à internet, essayez une autre carte."
),
Language::ES => format!(
"No se puede observar ningún tráfico porque el adaptador seleccionado no tiene direcciones activas...\n\n\
{network_adapter_translation} : {adapter}\n\n\
Si estás seguro de que estás conectado a Internet, prueba a elegir otro adaptador."),
Language::PL => format!("Nie można zaobserwować żadnego ruchu, ponieważ wybrany adapter nie ma aktywnych adresów...\n\n\
Si estás seguro de que estás conectado a Internet, prueba a elegir otro adaptador."
),
Language::PL => format!(
"Nie można zaobserwować żadnego ruchu, ponieważ wybrany adapter nie ma aktywnych adresów...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Jeśli jesteś pewien, że jesteś podłączony do internetu, spróbuj wybrać inny adapter."),
Language::DE => format!("Es kann kein Netzwerkverkehr beobachtet werden, weil der Adapter keine aktiven Adressen hat...\n\n\
Jeśli jesteś pewien, że jesteś podłączony do internetu, spróbuj wybrać inny adapter."
),
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\
Wenn du dir sicher bist, dass du mit dem Internet verbunden bist, probier einen anderen Adapter auszuwählen."
),
Language::UK => format!(
"Не зафіксовано жодного мережевого руху, тому що вибраний адаптер не має активних адрес... \n\n\
{network_adapter_translation}: {adapter}\n\n\
Якщо ви впевнені, що підключені до інтернету, спробуйте вибрати інший адаптер."),
Language::ZH => format!("您选择的网络适配器当前无活动网络...\n\n\
Якщо ви впевнені, що підключені до інтернету, спробуйте вибрати інший адаптер."
),
Language::ZH => format!(
"您选择的网络适配器当前无活动网络...\n\n\
{network_adapter_translation}: {adapter}\n\n\
, ."),
Language::RO => format!("Niciun trafic nu poate fi observat deoarece adaptorul selectat nu are adrese active...\n\n\
, ."
),
Language::RO => format!(
"Niciun trafic nu poate fi observat deoarece adaptorul selectat nu are adrese active...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Dacă sunteți sigur sunteți conectat la internet, încercați alegeți un alt adaptor."),
Language::KO => format!("선택한 어댑터에 유효한 주소가 없기 때문에 트래픽을 확인할 수 없습니다...\n\n\
Dacă sunteți sigur sunteți conectat la internet, încercați alegeți un alt adaptor."
),
Language::KO => format!(
"선택한 어댑터에 유효한 주소가 없기 때문에 트래픽을 확인할 수 없습니다...\n\n\
{network_adapter_translation}: {adapter}\n\n\
."),
Language::TR => format!("Seçtiğiniz adaptör aktif bir adrese sahip olmadığı için hiç bir trafik izlenemez...\n\n\
."
),
Language::TR => format!(
"Seçtiğiniz adaptör aktif bir adrese sahip olmadığı için hiç bir trafik izlenemez...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Eğer gerçekten internete bağlı olduğunuza eminseniz, başka bir adaptör seçmeyi deneyiniz."),
Language::RU => format!("Наблюдение за трафиком не возможно, потому что Вы выбрали интерфейс без активного адреса...\n\n\
Eğer gerçekten internete bağlı olduğunuza eminseniz, başka bir adaptör seçmeyi deneyiniz."
),
Language::RU => format!(
"Наблюдение за трафиком не возможно, потому что Вы выбрали интерфейс без активного адреса...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Если Вы уверены, что подключены к Интернету, попробуйте выбрать другой интерфейс."),
Language::PT => format!("Não é possível observar tráfego porque o adaptador que selecionou não tem endereços ativos...\n\n\
Если Вы уверены, что подключены к Интернету, попробуйте выбрать другой интерфейс."
),
Language::PT => format!(
"Não é possível observar tráfego porque o adaptador que selecionou não tem endereços ativos...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Se tiver a certeza que está ligado à internet, tente escolher um adaptador diferente."),
Language::EL => format!("Δεν μπορεί να ανιχνευθεί κίνηση επειδή ο προσαρμογέας που επέλεξες δεν έχει ενεργές διευθύνσεις...\n\n\
Se tiver a certeza que está ligado à internet, tente escolher um adaptador diferente."
),
Language::EL => format!(
"Δεν μπορεί να ανιχνευθεί κίνηση επειδή ο προσαρμογέας που επέλεξες δεν έχει ενεργές διευθύνσεις...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Αν είσαι σίγουρος ότι είσαι συνδεδεμένος στο διαδίκτυο, δοκίμασε αν επιλέξεις έναν διαφορετικό προσαρμογέα."),
Αν είσαι σίγουρος ότι είσαι συνδεδεμένος στο διαδίκτυο, δοκίμασε αν επιλέξεις έναν διαφορετικό προσαρμογέα."
),
// Language::FA => format!("هیچ آمد و شدی قابل مشاهده نیست چون مبدلی که انتخاب کرده اید هیچ نشانی فعالی ندارد...\n\n\
// مبدل شبکه: {adapter}\n\n\
// اگر مطمئن هستید به اینترنت وصل هستید، سعی کنید مبدل متفاوتی را انتخاب کنید."),
Language::SV => format!("Det går inte att observa någon trafik eftersom den valda adaptern inte har några aktiva adresser ...\n\n\
Language::SV => format!(
"Det går inte att observa någon trafik eftersom den valda adaptern inte har några aktiva adresser ...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Om du är säker att du är ansluten till internet, testa att välja en annan adapter."),
Language::FI => format!("Liikennettä ei voitu havainnoida, koska valitulla sovittimella ei ole aktiivista osoitetta...\n\n\
Om du är säker att du är ansluten till internet, testa att välja en annan adapter."
),
Language::FI => format!(
"Liikennettä ei voitu havainnoida, koska valitulla sovittimella ei ole aktiivista osoitetta...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Jos olet varma että sinulla on internet-yhteys, kokeile valita toinen verkkosovitin."),
Language::JA => format!("選択されたアダプターが有効なアドレスを持っていないため、トラフィックを観測できていません...\n\n\
Jos olet varma että sinulla on internet-yhteys, kokeile valita toinen verkkosovitin."
),
Language::JA => format!(
"選択されたアダプターが有効なアドレスを持っていないため、トラフィックを観測できていません...\n\n\
{network_adapter_translation}: {adapter}\n\n\
"),
Language::UZ => format!("Trafik kuzatilmaydi, chunki siz tanlagan adapterda faol manzillar yo'q...\n\n\
"
),
Language::UZ => format!(
"Trafik kuzatilmaydi, chunki siz tanlagan adapterda faol manzillar yo'q...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Internetga ulanganingizga ishonchingiz komil bo'lsa, boshqa adapterni tanlashga harakat qiling"),
Language::VI => format!("Không thể quan sát lưu lượng nào vì adapter mà bạn chọn không địa chỉ hoạt động...\n\n\
Internetga ulanganingizga ishonchingiz komil bo'lsa, boshqa adapterni tanlashga harakat qiling"
),
Language::VI => format!(
"Không thể quan sát lưu lượng nào vì adapter mà bạn chọn không địa chỉ hoạt động...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Nếu bạn đã chắc chắn kết nối với internet, hãy thử chọn network adapter khác."),
Nếu bạn đã chắc chắn kết nối với internet, hãy thử chọn network adapter khác."
),
})
}
pub fn waiting_translation<'a>(language: Language, adapter: &str) -> Text<'a, StyleType> {
let network_adapter_translation = network_adapter_translation(language);
Text::new(match language {
Language::EN => format!("No traffic has been observed yet. Waiting for network packets...\n\n\
Language::EN => format!(
"No traffic has been observed yet. Waiting for network packets...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Are you sure you are connected to the internet and you have selected the correct adapter?"),
Language::IT => format!("Nessun tipo di traffico è stato osservato finora. Attendo pacchetti di rete...\n\n\
Are you sure you are connected to the internet and you have selected the correct adapter?"
),
Language::IT => format!(
"Nessun tipo di traffico è stato osservato finora. Attendo pacchetti di rete...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Sei sicuro di esser connesso ad internet e di aver selezionato l'adattatore corretto?"),
Language::FR => format!("Aucun trafic n'a été capturé pour le moment. En attente de paquets...\n\n\
Sei sicuro di esser connesso ad internet e di aver selezionato l'adattatore corretto?"
),
Language::FR => format!(
"Aucun trafic n'a été capturé pour le moment. En attente de paquets...\n\n\
{network_adapter_translation} : {adapter}\n\n\
Êtes-vous sûr d'être connecté à internet et d'avoir selectionné la bonne carte réseau ?"),
Language::ES => format!("Aún no se ha captado tráfico. Esperando paquetes...\n\n\
Êtes-vous sûr d'être connecté à internet et d'avoir selectionné la bonne carte réseau ?"
),
Language::ES => format!(
"Aún no se ha captado tráfico. Esperando paquetes...\n\n\
{network_adapter_translation} : {adapter}\n\n\
¿Está seguro de que está conectado a Internet y ha seleccionado la tarjeta de red correcta?"),
Language::PL => format!("Nie zaobserowano żadnego ruchu sieciowego. Oczekiwanie na pakiety...\n\n\
¿Está seguro de que está conectado a Internet y ha seleccionado la tarjeta de red correcta?"
),
Language::PL => format!(
"Nie zaobserowano żadnego ruchu sieciowego. Oczekiwanie na pakiety...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Czy na pewno jesteś podłączony do internetu i wybrałeś właściwy adapter?"),
Language::DE => format!("Noch kein Netzwerkverkehr beobachtet. Warten auf Pakete...\n\n\
Czy na pewno jesteś podłączony do internetu i wybrałeś właściwy adapter?"
),
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\
Bist du sicher, dass du mit dem Internet verbunden bist und den richtigen Adapter ausgewählt hast?"
),
Language::UK => format!(
"Не зафіксовано жодного мережевого руху. Очікування пакетів...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Чи ви дійсно підключені до інтернету і вибрали відповідний мережевий адаптер?"),
Language::ZH => format!("暂无流量数据. 等待网络活动中......\n\n\
Чи ви дійсно підключені до інтернету і вибрали відповідний мережевий адаптер?"
),
Language::ZH => format!(
"暂无流量数据. 等待网络活动中......\n\n\
{network_adapter_translation}: {adapter}\n\n\
, 使?"),
Language::RO => format!("Nu a fost observat încă trafic. Se așteaptă pachetele de rețea...\n\n\
, 使?"
),
Language::RO => format!(
"Nu a fost observat încă trafic. Se așteaptă pachetele de rețea...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Ești sigur ești conectat la internet și ai selectat adaptorul corect?"),
Language::KO => format!("아직 트래픽이 관찰되지 않았습니다. 네트워크 패킷 대기 중...\n\n\
Ești sigur ești conectat la internet și ai selectat adaptorul corect?"
),
Language::KO => format!(
"아직 트래픽이 관찰되지 않았습니다. 네트워크 패킷 대기 중...\n\n\
{network_adapter_translation}: {adapter}\n\n\
?"),
Language::TR => format!("Henüz bir trafik algılanamadı. Ağ paketleri için bekleniyor...\n\n\
?"
),
Language::TR => format!(
"Henüz bir trafik algılanamadı. Ağ paketleri için bekleniyor...\n\n\
{network_adapter_translation}: {adapter}\n\n\
İnternete bağlı olduğunuza ve doğru adaptörü seçtiğinize emin misiniz?"),
Language::RU => format!("Трафик не обнаружен. Ожидаем сетевые пакеты...\n\n\
İnternete bağlı olduğunuza ve doğru adaptörü seçtiğinize emin misiniz?"
),
Language::RU => format!(
"Трафик не обнаружен. Ожидаем сетевые пакеты...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Вы уверены, что подключены к Интернету и выбрали правильный интерфейс?"),
Language::PT => format!("Ainda não foi observado tráfego. Aguardando por pacotes...\n\n\
Вы уверены, что подключены к Интернету и выбрали правильный интерфейс?"
),
Language::PT => format!(
"Ainda não foi observado tráfego. Aguardando por pacotes...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Tem a certeza de que está ligado à internet e selecionou o adaptador correto?"),
Language::EL => format!("Δεν έχει παρατηρηθεί κίνηση μέχρι στιγμής. Ανέμενε για πακέτα δικτύου...\n\n\
Tem a certeza de que está ligado à internet e selecionou o adaptador correto?"
),
Language::EL => format!(
"Δεν έχει παρατηρηθεί κίνηση μέχρι στιγμής. Ανέμενε για πακέτα δικτύου...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Είσαι σίγουρος ότι είσαι συνδεδεμένος στο διαδίκτυο και ότι έχεις επιλέξει τον σωστό προσαρμογέα;"),
Είσαι σίγουρος ότι είσαι συνδεδεμένος στο διαδίκτυο και ότι έχεις επιλέξει τον σωστό προσαρμογέα;"
),
// Language::FA => format!("هنوز هیچ آمد و شدی مشاهده نشده است. در حال انتظار برای بسته های شبکه...\n\n
// مبدل شبکه: {adapter}\n\n
// آیا مطمئن هستید به اینترنت وصل هستید و مبدل درست را انتخاب کرده اید؟"),
Language::SV => format!("Ingen trafik har observerats ännu. Väntar på paket ...\n\n\
Language::SV => format!(
"Ingen trafik har observerats ännu. Väntar på paket ...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Är du säker att du är ansluten till internet och att du har valt rätt adapter?"),
Language::FI => format!("Ei vielä havaittua liikennettä. Odotetaan verkkopaketteja...\n\n\
Är du säker att du är ansluten till internet och att du har valt rätt adapter?"
),
Language::FI => format!(
"Ei vielä havaittua liikennettä. Odotetaan verkkopaketteja...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Onhan sinulla varmasti internet-yhteys ja olet valinnut oikean verkkosovittimen."),
Language::JA => format!("トラフィックがまだ観測できていません。ネットワーク パケットを待っています...\n\n\
Onhan sinulla varmasti internet-yhteys ja olet valinnut oikean verkkosovittimen."
),
Language::JA => format!(
"トラフィックがまだ観測できていません。ネットワーク パケットを待っています...\n\n\
{network_adapter_translation}: {adapter}\n\n\
?"),
?"
),
Language::UZ => format!(
"Hali hech qanday trafik aniqlanmadi. Tarmoq paketlari kutilmoqda...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Internetga ulanganingizga va to'g'ri adapterni tanlaganingizga ishonchingiz komilmi?"),
Language::VI => format!("Chưa có lưu lượng để quan sát. Đang đợi các gói tin...\n\n\
Internetga ulanganingizga va to'g'ri adapterni tanlaganingizga ishonchingiz komilmi?"
),
Language::VI => format!(
"Chưa có lưu lượng để quan sát. Đang đợi các gói tin...\n\n\
{network_adapter_translation}: {adapter}\n\n\
Bạn chắc đã kết nối với internet đã chọn đúng network adapter?"),
Bạn chắc đã kết nối với internet đã chọn đúng network adapter?"
),
})
}
pub fn some_observed_translation<'a>(language: Language, observed: u128) -> Text<'a, StyleType> {
Text::new(match language {
Language::EN => format!("Total intercepted packets: {observed}\n\n\
Language::EN => format!(
"Total intercepted packets: {observed}\n\n\
Filtered packets: 0\n\n\
Some packets have been intercepted, but still none has been selected according to the filters you specified..."),
Language::IT => format!("Totale pacchetti intercettati: {observed}\n\n\
Some packets have been intercepted, but still none has been selected according to the filters you specified..."
),
Language::IT => format!(
"Totale pacchetti intercettati: {observed}\n\n\
Pacchetti filtrati: 0\n\n\
Alcuni pacchetti sono stati intercettati, ma ancora nessuno è stato selezionato secondo i filtri specificati..."),
Language::FR => format!("Total des paquets interceptés: {observed}\n\n\
Alcuni pacchetti sono stati intercettati, ma ancora nessuno è stato selezionato secondo i filtri specificati..."
),
Language::FR => format!(
"Total des paquets interceptés: {observed}\n\n\
Paquets filtrés: 0\n\n\
Certains paquets ont é interceptés, mais aucun ne satisfait les critères des filtres sélectionnés..."),
Language::ES => format!("Total de paquetes interceptados: {observed}\n\n\
Certains paquets ont é interceptés, mais aucun ne satisfait les critères des filtres sélectionnés..."
),
Language::ES => format!(
"Total de paquetes interceptados: {observed}\n\n\
Paquetes filtrados: 0\n\n\
Se interceptaron algunos paquetes, pero ninguno de ellos cumplía los criterios de los filtros seleccionados..."),
Language::PL => format!("Suma przechwyconych pakietów: {observed}\n\n\
Se interceptaron algunos paquetes, pero ninguno de ellos cumplía los criterios de los filtros seleccionados..."
),
Language::PL => format!(
"Suma przechwyconych pakietów: {observed}\n\n\
Przefiltrowane pakiety: 0\n\n\
Niektóre pakiety zostały przechwycone, ale żaden nie został wybrany zgodnie z wskazanymi filtrami..."),
Language::DE => format!("Anzahl der empfangenen Pakete: {observed}\n\n\
Niektóre pakiety zostały przechwycone, ale żaden nie został wybrany zgodnie z wskazanymi filtrami..."
),
Language::DE => format!(
"Anzahl der empfangenen Pakete: {observed}\n\n\
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\
Ein Paar Pakete wurden empfangen, aber es entsprechen noch keine den gewählten Filtern..."
),
Language::UK => format!(
"Сума перехоплених пакетів: {observed}\n\n\
Відфільтровані пакети: 0\n\n\
Деякі пакети були перехоплені, але жоден з них не був вибраний відповідно до вказаних фільтрів..."),
Language::ZH => format!("监测到的数据包总数: {observed}\n\n\
Деякі пакети були перехоплені, але жоден з них не був вибраний відповідно до вказаних фільтрів..."
),
Language::ZH => format!(
"监测到的数据包总数: {observed}\n\n\
: 0\n\n\
, ......"),
Language::RO => format!("Total pachete interceptate: {observed}\n\n\
, ......"
),
Language::RO => format!(
"Total pachete interceptate: {observed}\n\n\
Pachete filtrate: 0\n\n\
Unele pachete au fost interceptate, dar încă niciunul nu a fost selectat conform filtrelor pe care le-ați specificat..."),
Language::KO => format!("감지한 총 패킷: {observed}\n\n\
Unele pachete au fost interceptate, dar încă niciunul nu a fost selectat conform filtrelor pe care le-ați specificat..."
),
Language::KO => format!(
"감지한 총 패킷: {observed}\n\n\
: 0\n\n\
, ..."),
Language::TR => format!("Toplam yakalanan paketler: {observed}\n\n\
, ..."
),
Language::TR => format!(
"Toplam yakalanan paketler: {observed}\n\n\
Filterelenen paketler: 0\n\n\
Bazı paketler yakalandı, fakat belirttiğiniz filtrelere göre hiç biri seçilmedi..."),
Language::RU => format!("Всего пакетов перехвачено: {observed}\n\n\
Bazı paketler yakalandı, fakat belirttiğiniz filtrelere göre hiç biri seçilmedi..."
),
Language::RU => format!(
"Всего пакетов перехвачено: {observed}\n\n\
Фильтровано пакетов: 0\n\n\
Сетевые пакеты были перехвачены, но ни один из них не соответствует заданным фильтрам..."),
Language::PT => format!("Total de pacotes interceptados: {observed}\n\n\
Сетевые пакеты были перехвачены, но ни один из них не соответствует заданным фильтрам..."
),
Language::PT => format!(
"Total de pacotes interceptados: {observed}\n\n\
Pacotes filtrados: 0\n\n\
Alguns pacotes foram interceptados, mas nenhum deles foi selecionado de acordo com os filtros especificados..."),
Language::EL => format!("Συνολικά αναχαιτισμένα πακέτα: {observed}\n\n\
Alguns pacotes foram interceptados, mas nenhum deles foi selecionado de acordo com os filtros especificados..."
),
Language::EL => format!(
"Συνολικά αναχαιτισμένα πακέτα: {observed}\n\n\
Φιλτραρισμένα πακέτα: 0\n\n\
Κάποια από τα πακέτα έχουν αναχαιτιστεί, αλλά κανένα ακόμη δεν έχει επιλεγεί σύμφωνα με τα φίλτρα που επέλεξες..."),
Κάποια από τα πακέτα έχουν αναχαιτιστεί, αλλά κανένα ακόμη δεν έχει επιλεγεί σύμφωνα με τα φίλτρα που επέλεξες..."
),
// Language::FA => format!("مجموع بسته های رهگیری شده: {observed}\n\n\
// بسته های صاف شده: 0\n\n\
// شماری از بسته ها رهگیری شده اند، ولی هنوز هیچ کدام بر اساس صافی تعیین شده شما انتخاب نشده اند..."),
Language::SV => format!("Antal fångade paket: {observed}\n\n\
Language::SV => format!(
"Antal fångade paket: {observed}\n\n\
Filtrerade paket: 0\n\n\
Några paket har fångats, men än har inget valts enligt de angivna filtren ..."),
Language::FI => format!("Siepattuja paketteja yhteensä: {observed}\n\n\
Några paket har fångats, men än har inget valts enligt de angivna filtren ..."
),
Language::FI => format!(
"Siepattuja paketteja yhteensä: {observed}\n\n\
Suodatettuja paketteja: 0\n\n\
Joitakin paketteja on siepattu, mutta yhtäkään ei ole valittu määrittämiesi suodattimien mukaan..."),
Language::JA => format!("取得したパケット数: {observed}\n\n\
Joitakin paketteja on siepattu, mutta yhtäkään ei ole valittu määrittämiesi suodattimien mukaan..."
),
Language::JA => format!(
"取得したパケット数: {observed}\n\n\
: 0\n\n\
..."),
..."
),
Language::UZ => format!(
"Jami ushlangan paketlar: {observed}\n\n\
Filtrlangan paketlar: 0\n\n\
Tarmoq paketlari ushlandi, lekin ularning hech biri belgilangan filtrlarga mos kelmadi..."),
Language::VI => format!("Tổng số gói tin bị chặn: {observed}\n\n\
Tarmoq paketlari ushlandi, lekin ularning hech biri belgilangan filtrlarga mos kelmadi..."
),
Language::VI => format!(
"Tổng số gói tin bị chặn: {observed}\n\n\
Các gói tin đã lọc: 0\n\n\
Một số gói đã bị chặn, nhưng vẫn chưa gói tin nào đưc bắt theo bộ lọc bạn đã chọn..."),
Một số gói đã bị chặn, nhưng vẫn chưa gói tin nào đưc bắt theo bộ lọc bạn đã chọn..."
),
})
}
@@ -1832,66 +1944,104 @@ pub fn favorite_transmitted_translation(language: Language) -> &'static str {
pub fn no_notifications_set_translation<'a>(language: Language) -> Text<'a, StyleType> {
Text::new(match language {
Language::EN => "You haven't enabled notifications yet!\n\n\
Language::EN => {
"You haven't enabled notifications yet!\n\n\
After enabling them, this page will display a log of your notifications\n\n\
You can enable notifications from settings:",
Language::IT => "Non hai ancora abilitato le notifiche!\n\n\
You can enable notifications from settings:"
}
Language::IT => {
"Non hai ancora abilitato le notifiche!\n\n\
Dopo che le avrai abilitate, questa pagina mostrerà una collezione delle tue notifiche\n\n\
Puoi abilitare le notifiche dalle impostazioni:",
Language::FR => "Vous n'avez pas activé les notifications!\n\n\
Puoi abilitare le notifiche dalle impostazioni:"
}
Language::FR => {
"Vous n'avez pas activé les notifications!\n\n\
Une fois activées, cette page affichera le journal des notifications\n\n\
Vous pouvez les activer dans les paramètres:",
Language::ES => "¡Aún no has activado las notificaciones!\n\n\
Vous pouvez les activer dans les paramètres:"
}
Language::ES => {
"¡Aún no has activado las notificaciones!\n\n\
Después de activarlas, esta página mostrará un registro de sus notificaciones\n\n\
Puedes activar las notificaciones desde los ajustes:",
Language::PL => "Nie włączyłeś jeszcze powiadomień!\n\n\
Puedes activar las notificaciones desde los ajustes:"
}
Language::PL => {
"Nie włączyłeś jeszcze powiadomień!\n\n\
Po ich włączeniu, ta strona wyświetli dziennik twoich powiadomień\n\n\
Możesz włączyć powiadomienia w ustawieniach:",
Language::DE => "Benachrichtigungen wurden noch nicht aktiviert!\n\n\
Możesz włączyć powiadomienia w ustawieniach:"
}
Language::DE => {
"Benachrichtigungen wurden noch nicht aktiviert!\n\n\
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\
Du kannst die Benachrichtigungen in den Einstellungen aktivieren:"
}
Language::UK => {
"Повідомлення не активовані!\n\n\
Після їх активації на цій сторінці побачите список своїх повідомлень\n\n\
Можете вимкнути повідомлення в налаштуваннях:",
Language::ZH => "您还没有设定任何通知!\n\n\
Можете вимкнути повідомлення в налаштуваннях:"
}
Language::ZH => {
"您还没有设定任何通知!\n\n\
\n\n\
:",
Language::RO => "Încă nu ați activat notificările!\n\n\
:"
}
Language::RO => {
"Încă nu ați activat notificările!\n\n\
După ce le veți activa, această pagină va afișa un jurnal al notificărilor dvs\n\n\
Puteți activa notificările din setări:",
Language::KO => "아직 알림을 활성화하지 않았습니다!\n\n\
Puteți activa notificările din setări:"
}
Language::KO => {
"아직 알림을 활성화하지 않았습니다!\n\n\
\n\n\
:",
Language::TR => "Henüz bildirimleri etkinleştirmedin!\n\n\
:"
}
Language::TR => {
"Henüz bildirimleri etkinleştirmedin!\n\n\
Etkinleştirdikten sonra bu sayfada bildirimlerine ait kütüğü görebilirsin\n\n\
Bildirimleri, ayarlardan etkinleştirebilirsin:",
Language::RU => "Уведомления пока не настроены!\n\n\
Bildirimleri, ayarlardan etkinleştirebilirsin:"
}
Language::RU => {
"Уведомления пока не настроены!\n\n\
После настройки, эта страница будет показывать журнал уведомлений\n\n\
Вы можете включить уведомления в настройках:",
Language::PT => "Ainda não ativou as notificações!\n\n\
Вы можете включить уведомления в настройках:"
}
Language::PT => {
"Ainda não ativou as notificações!\n\n\
Depois de ativá-las, esta página irá mostrar um registo das suas notificações\n\n\
Pode ativar as notificações nas definições:",
Language::EL => "Δεν έχεις ενεργοποιήσει τις ειδοποιήσεις ακόμη!\n\n\
Pode ativar as notificações nas definições:"
}
Language::EL => {
"Δεν έχεις ενεργοποιήσει τις ειδοποιήσεις ακόμη!\n\n\
Αφότου τις ενεργοποιήσεις, αυτή η σελίδα θα απεικονίσει μια καταγραφή των ειδοποιήσεών σου\n\n\
Μπορείς να ενεργοποιήσεις τις ειδοποιήσεις από τις ρυθμίσεις:",
Μπορείς να ενεργοποιήσεις τις ειδοποιήσεις από τις ρυθμίσεις:"
}
// Language::FA => "شما هنوز اعلان ها را فعال نکرده اید!\n\n\
// پس از آنکه آن ها را فعال کنید، این صفحه یک کارنامه از اعلان های شما را نمایش خواهد داد\n\n
// شما می توانید اعلان ها را از پیکربندی فعال کنید:",
Language::SV => "Du har inte aktiverat notifikationer än!\n\n\
Language::SV => {
"Du har inte aktiverat notifikationer än!\n\n\
Efter att du aktiverat dem kommer denna sida att visa en logg av dina notifikationer\n\n\
Du kan aktivera notifikationer i inställingarna",
Language::FI => "Et ole vielä ottanut ilmoituksia käyttöön!\n\n\
Du kan aktivera notifikationer i inställingarna"
}
Language::FI => {
"Et ole vielä ottanut ilmoituksia käyttöön!\n\n\
Kun olet ottanut ne käyttöön, tällä sivulla näkyy loki ilmoituksistasi\n\n\
Voit ottaa ilmoitukset käyttöön asetuksista:",
Language::JA => "まだ通知を有効にしていません!\n\n\
Voit ottaa ilmoitukset käyttöön asetuksista:"
}
Language::JA => {
"まだ通知を有効にしていません!\n\n\
\n\n\
:",
Language::UZ => "Siz hali bildirishnomalarni yoqmagansiz!\n\n\
:"
}
Language::UZ => {
"Siz hali bildirishnomalarni yoqmagansiz!\n\n\
Ularni faollashtirgandan so'ng, bu sahifada bildirishnomalaringiz jurnali ko'rsatiladi\n\n\
Sozlamalardan bildirishnomalarni yoqishingiz mumkin:",
Language::VI => "Bạn chưa bật tính năng thông báo!\n\n\
Sozlamalardan bildirishnomalarni yoqishingiz mumkin:"
}
Language::VI => {
"Bạn chưa bật tính năng thông báo!\n\n\
au khi bật, trang này sẽ hiển thị thông báo\n\n\
Hãy bật thông báo trong phần cài đt:",
Hãy bật thông báo trong phần cài đt:"
}
})
}

View File

@@ -244,24 +244,50 @@ pub fn unsupported_link_type_translation<'a>(
adapter: &str,
) -> Text<'a, StyleType> {
let translation = match language {
Language::EN => "The link type associated with this adapter is not supported by Sniffnet yet...",
Language::EN => {
"The link type associated with this adapter is not supported by Sniffnet yet..."
}
// Language::FA => "نوع پیوند مرتبط با این مبدل هنوز توسط Sniffnet پشتیبانی نمی شود...",
Language::ES => "La conexión asociada con este adaptador aún no esta implementada en Sniffnet...",
Language::IT => "Il tipo di collegamento associato a questo adattatore di rete non è ancora supportato da Sniffnet...",
Language::FR => "Le type de connexion associé à cet adaptateur n'est pas encore supporté par Sniffnet...",
Language::DE => "Die Verbindungsart dieses Adapters wird noch nicht von Sniffnet unterstützt...",
Language::PL => "Rodzaj połączenia powiązany z tym adapterem nie jest jeszcze obsługiwany przez Sniffnet...",
Language::RU => "Тип соединения, связанный с этим адаптером, пока не поддерживается Sniffnet...",
Language::RO => "Tipul conexiunii asociate acestui adaptor de rețea nu este încă suportat de Sniffnet...",
Language::JA => "このアダプターのリンク タイプは Sniffnet ではまだサポートされていません...",
Language::UZ => "Ushbu adapter bilan bog'langan havola turi hozircha Sniffnet tomonidan qo'llab quvvatlanmaydi...",
Language::ES => {
"La conexión asociada con este adaptador aún no esta implementada en Sniffnet..."
}
Language::IT => {
"Il tipo di collegamento associato a questo adattatore di rete non è ancora supportato da Sniffnet..."
}
Language::FR => {
"Le type de connexion associé à cet adaptateur n'est pas encore supporté par Sniffnet..."
}
Language::DE => {
"Die Verbindungsart dieses Adapters wird noch nicht von Sniffnet unterstützt..."
}
Language::PL => {
"Rodzaj połączenia powiązany z tym adapterem nie jest jeszcze obsługiwany przez Sniffnet..."
}
Language::RU => {
"Тип соединения, связанный с этим адаптером, пока не поддерживается Sniffnet..."
}
Language::RO => {
"Tipul conexiunii asociate acestui adaptor de rețea nu este încă suportat de Sniffnet..."
}
Language::JA => {
"このアダプターのリンク タイプは Sniffnet ではまだサポートされていません..."
}
Language::UZ => {
"Ushbu adapter bilan bog'langan havola turi hozircha Sniffnet tomonidan qo'llab quvvatlanmaydi..."
}
Language::SV => "Länktypen associerad med denna adapter stöds inte av Sniffnet än...",
Language::VI => "Loại liên kết được gắn với adapter này chưa được Sniffnet hỗ trợ...",
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...",
Language::UK => "Різновид зʼєднання, повʼязаний з даним адаптером, ще не підтримується 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...",
};

View File

@@ -1,13 +1,13 @@
use std::fmt;
use iced::widget::svg::Handle;
use iced::widget::Svg;
use iced::widget::svg::Handle;
use serde::{Deserialize, Serialize};
use crate::StyleType;
use crate::countries::flags_pictures::{
CN, DE, ES, FI, FLAGS_WIDTH_BIG, FR, GB, GR, IT, JP, KR, PL, PT, RO, RU, SE, TR, UA, UZ, VN,
};
use crate::StyleType;
/// This enum defines the available languages.
#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize, Hash)]

View File

@@ -1,13 +1,13 @@
use std::cmp::min;
use std::net::IpAddr;
use crate::Language;
use crate::networking::types::filters::Filters;
use crate::translations::translations::{
address_translation, ip_version_translation, protocol_translation,
};
use crate::translations::translations_3::{invalid_filters_translation, port_translation};
use crate::Language;
use std::fmt::Write;
/// Application version number (to be displayed in gui footer)
pub const APP_VERSION: &str = env!("CARGO_PKG_VERSION");
@@ -27,16 +27,16 @@
pub fn get_invalid_filters_string(filters: &Filters, language: Language) -> String {
let mut ret_val = format!("{}:", invalid_filters_translation(language));
if !filters.ip_version_valid() {
ret_val.push_str(&format!("\n{}", ip_version_translation(language)));
let _ = write!(ret_val, "\n • {}", ip_version_translation(language));
}
if !filters.protocol_valid() {
ret_val.push_str(&format!("\n{}", protocol_translation(language)));
let _ = write!(ret_val, "\n • {}", protocol_translation(language));
}
if !filters.address_valid() {
ret_val.push_str(&format!("\n{}", address_translation(language)));
let _ = write!(ret_val, "\n • {}", address_translation(language));
}
if !filters.port_valid() {
ret_val.push_str(&format!("\n{}", port_translation(language)));
let _ = write!(ret_val, "\n • {}", port_translation(language));
}
ret_val
}
@@ -45,32 +45,36 @@ pub fn get_invalid_filters_string(filters: &Filters, language: Language) -> Stri
pub fn get_active_filters_string(filters: &Filters, language: Language) -> String {
let mut filters_string = String::new();
if filters.ip_version_active() {
filters_string.push_str(&format!(
"• {}: {}\n",
let _ = writeln!(
filters_string,
"• {}: {}",
ip_version_translation(language),
filters.pretty_print_ip()
));
);
}
if filters.protocol_active() {
filters_string.push_str(&format!(
"• {}: {}\n",
let _ = writeln!(
filters_string,
"• {}: {}",
protocol_translation(language),
filters.pretty_print_protocol()
));
);
}
if filters.address_active() {
filters_string.push_str(&format!(
"• {}: {}\n",
let _ = writeln!(
filters_string,
"• {}: {}",
address_translation(language),
filters.address_str
));
);
}
if filters.port_active() {
filters_string.push_str(&format!(
"• {}: {}\n",
let _ = writeln!(
filters_string,
"• {}: {}",
port_translation(language),
filters.port_str
));
);
}
filters_string
}
@@ -177,8 +181,8 @@ pub fn get_logs_file_path() -> Option<String> {
}
#[cfg(all(windows, not(debug_assertions)))]
pub fn redirect_stdout_stderr_to_file(
) -> Option<(gag::Redirect<std::fs::File>, gag::Redirect<std::fs::File>)> {
pub fn redirect_stdout_stderr_to_file()
-> Option<(gag::Redirect<std::fs::File>, gag::Redirect<std::fs::File>)> {
if let Ok(logs_file) = std::fs::OpenOptions::new()
.create(true)
.append(true)

View File

@@ -1,7 +1,7 @@
use iced::widget::Text;
use crate::gui::styles::style_constants::ICONS;
use crate::StyleType;
use crate::gui::styles::style_constants::ICONS;
pub enum Icon {
ArrowBack,