From a8b08d8a60655fefe8e084bd738fe0155dd10d79 Mon Sep 17 00:00:00 2001
From: Giuliano Bellini s294739
Date: Sat, 13 May 2023 17:45:18 +0200
Subject: [PATCH] update CHANGELOG and repo pictures
---
CHANGELOG.md | 19 +++++
Cargo.lock | 74 ++++++++++--------
Cargo.toml | 2 +-
README.md | 6 +-
resources/countries_flags/4x3/usa.svg | 1 +
resources/repository/pages/initial_page.png | Bin 77762 -> 0 bytes
resources/repository/pages/inspect_page.png | Bin 0 -> 185164 bytes
.../repository/pages/notifications_page.png | Bin 109769 -> 133175 bytes
resources/repository/pages/overview_page.png | Bin 140179 -> 153924 bytes
resources/repository/pages/settings_page.png | Bin 136918 -> 0 bytes
src/gui/pages/settings_language_page.rs | 2 +-
src/utils/countries.rs | 2 +-
12 files changed, 66 insertions(+), 40 deletions(-)
create mode 100644 resources/countries_flags/4x3/usa.svg
delete mode 100644 resources/repository/pages/initial_page.png
create mode 100644 resources/repository/pages/inspect_page.png
delete mode 100644 resources/repository/pages/settings_page.png
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a90ef666..20944969 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,25 @@
All Sniffnet releases with the relative changes are documented in this file.
+## [1.2.0] - 2023-05-xx
+
+- Introduced host-based analysis: instead of just showing IP addresses, now host names and network providers are available for a quicker and more meaningful traffic interpretation
+ * Added rDNS (reverse DNS) lookups to find out network host names
+ * Added ASN (Autonomous System name and number) lookups to find out the entity managing a given IP address
+- Individual connections identified by IP addresses remain available and can now be filtered and further inspected through a simple click
+- Support for identification of addresses in the local network
+- Support for data link layer MAC addresses
+- Full support for broadcast traffic recognition (added directed broadcast identification)
+- Added dropped packets number (packets dropped because there was no room in the operating system’s buffer when they arrived, because they weren't being read fast enough)
+- Changed favorites management: instead of referring to single IP addresses, favorites are now related to network hosts
+- Do not open terminal window when starting the application on Windows systems
+- Keep the active addresses of the selected network adapter up to date during analysis
+- Changed shortcut to interrupt analysis from `backspace` to `ctrl+backspace`
+- Images have been replaced with SVGs
+- Added unit tests for `chart` and started unit tests for `gui` modules
+- Fixed problem that let users switch page pressing the tab key even if no packets were received
+
+
## [1.1.4] - 2023-04-18
- Added new translations of the GUI:
diff --git a/Cargo.lock b/Cargo.lock
index 491bcc05..a3fc862a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -10,9 +10,9 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
[[package]]
name = "ab_glyph"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe21446ad43aa56417a767f3e2f3d7c4ca522904de1dd640529a76e9c5c3b33c"
+checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39"
dependencies = [
"ab_glyph_rasterizer",
"owned_ttf_parser",
@@ -557,9 +557,9 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.6"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
dependencies = [
"cfg-if",
"crossbeam-utils",
@@ -567,9 +567,9 @@ dependencies = [
[[package]]
name = "crossbeam-deque"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
dependencies = [
"cfg-if",
"crossbeam-epoch",
@@ -578,22 +578,22 @@ dependencies = [
[[package]]
name = "crossbeam-epoch"
-version = "0.9.13"
+version = "0.9.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
- "memoffset 0.7.1",
+ "memoffset 0.8.0",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.14"
+version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
dependencies = [
"cfg-if",
]
@@ -980,7 +980,7 @@ dependencies = [
"fontconfig-parser",
"log",
"memmap2",
- "ttf-parser",
+ "ttf-parser 0.18.1",
]
[[package]]
@@ -2008,9 +2008,9 @@ dependencies = [
[[package]]
name = "memoffset"
-version = "0.7.1"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
dependencies = [
"autocfg",
]
@@ -2401,9 +2401,9 @@ dependencies = [
[[package]]
name = "ordered-float"
-version = "3.4.0"
+version = "3.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d84eb1409416d254e4a9c8fa56cc24701755025b458f0fcd8e59e1f5f40c23bf"
+checksum = "2fc2dbde8f8a79f2102cc474ceb0ad68e3b80b85289ea62389b60e66777e4213"
dependencies = [
"num-traits",
]
@@ -2434,11 +2434,11 @@ dependencies = [
[[package]]
name = "owned_ttf_parser"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e25e9fb15717794fae58ab55c26e044103aad13186fbb625893f9a3bbcc24228"
+checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4"
dependencies = [
- "ttf-parser",
+ "ttf-parser 0.19.0",
]
[[package]]
@@ -2778,9 +2778,9 @@ dependencies = [
[[package]]
name = "rayon"
-version = "1.6.1"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
dependencies = [
"either",
"rayon-core",
@@ -2788,9 +2788,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.10.2"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
@@ -2907,7 +2907,7 @@ dependencies = [
"rgb",
"svgfilters",
"svgtypes 0.10.0",
- "tiny-skia 0.8.3",
+ "tiny-skia 0.8.4",
"usvg",
"usvg-text-layout",
]
@@ -3023,7 +3023,7 @@ dependencies = [
"bitflags",
"bytemuck",
"smallvec",
- "ttf-parser",
+ "ttf-parser 0.18.1",
"unicode-bidi-mirroring",
"unicode-ccc",
"unicode-general-category",
@@ -3262,7 +3262,7 @@ dependencies = [
[[package]]
name = "sniffnet"
-version = "1.1.4"
+version = "1.2.0"
dependencies = [
"chrono",
"confy",
@@ -3509,16 +3509,16 @@ dependencies = [
[[package]]
name = "tiny-skia"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfef3412c6975196fdfac41ef232f910be2bb37b9dd3313a49a1a6bc815a5bdb"
+checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67"
dependencies = [
"arrayref",
"arrayvec 0.7.2",
"bytemuck",
"cfg-if",
"png",
- "tiny-skia-path 0.8.3",
+ "tiny-skia-path 0.8.4",
]
[[package]]
@@ -3533,9 +3533,9 @@ dependencies = [
[[package]]
name = "tiny-skia-path"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4b5edac058fc98f51c935daea4d805b695b38e2f151241cad125ade2a2ac20d"
+checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c"
dependencies = [
"arrayref",
"bytemuck",
@@ -3661,6 +3661,12 @@ version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633"
+[[package]]
+name = "ttf-parser"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44dcf002ae3b32cd25400d6df128c5babec3927cd1eb7ce813cfff20eb6c3746"
+
[[package]]
name = "twox-hash"
version = "1.6.3"
@@ -4011,7 +4017,7 @@ dependencies = [
"js-sys",
"log",
"naga",
- "parking_lot 0.12.1",
+ "parking_lot 0.11.2",
"profiling",
"raw-window-handle 0.5.0",
"smallvec",
@@ -4037,7 +4043,7 @@ dependencies = [
"fxhash",
"log",
"naga",
- "parking_lot 0.12.1",
+ "parking_lot 0.11.2",
"profiling",
"raw-window-handle 0.5.0",
"smallvec",
@@ -4076,7 +4082,7 @@ dependencies = [
"metal",
"naga",
"objc",
- "parking_lot 0.12.1",
+ "parking_lot 0.11.2",
"profiling",
"range-alloc",
"raw-window-handle 0.5.0",
diff --git a/Cargo.toml b/Cargo.toml
index 89b3c17f..1a84cfa1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "sniffnet"
-version = "1.1.4"
+version = "1.2.0"
authors = ["Giuliano Bellini"]
edition = "2021"
description = "Application to comfortably monitor your network traffic"
diff --git a/README.md b/README.md
index 5c12680d..aec2f554 100644
--- a/README.md
+++ b/README.md
@@ -24,11 +24,11 @@ Graphical interface translated in:
-
+
diff --git a/resources/countries_flags/4x3/usa.svg b/resources/countries_flags/4x3/usa.svg
new file mode 100644
index 00000000..e26a949c
--- /dev/null
+++ b/resources/countries_flags/4x3/usa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/repository/pages/initial_page.png b/resources/repository/pages/initial_page.png
deleted file mode 100644
index 494c8a296d83d45f96fb2b02eeabc3ffa28c0af6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 77762
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