From 014895308c3c2ed2d15e08c3c4a616d917aa4682 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 03:50:26 +0200 Subject: [PATCH 01/23] Fixed build and packaging issues --- .editorconfig | 6 + .gitattributes | 1 + .github/workflows/package.yml | 285 ++++++++-- Cargo.lock | 507 +++++++++++------- Cargo.toml | 139 +++-- build.rs | 12 + resources/Info.plist | 32 -- resources/logos/{ => raw}/icon.png | Bin resources/logos/{ => raw}/icon_macos.png | Bin resources/packaging/LICENSE | 236 ++++++++ resources/packaging/linux/description.txt | 18 + .../linux/graphics/sniffnet_1024x1024.png} | Bin .../linux/graphics/sniffnet_128x128.png} | Bin .../linux/graphics/sniffnet_160x160.png} | Bin .../linux/graphics/sniffnet_16x16.png} | Bin .../linux/graphics/sniffnet_192x192.png} | Bin .../linux/graphics/sniffnet_22x22.png} | Bin .../linux/graphics/sniffnet_24x24.png} | Bin .../linux/graphics/sniffnet_256x256.png} | Bin .../linux/graphics/sniffnet_32x32.png} | Bin .../linux/graphics/sniffnet_36x36.png} | Bin .../linux/graphics/sniffnet_384x384.png} | Bin .../linux/graphics/sniffnet_42x42.png} | Bin .../linux/graphics/sniffnet_48x48.png} | Bin .../linux/graphics/sniffnet_512x512.png} | Bin .../linux/graphics/sniffnet_64x64.png} | Bin .../linux/graphics/sniffnet_72x72.png} | Bin .../linux/graphics/sniffnet_8x8.png} | Bin .../linux/graphics/sniffnet_96x96.png} | Bin resources/packaging/linux/scripts/.gitkeep | 0 resources/packaging/linux/scripts/postinst | 5 + resources/packaging/linux/scripts/prerm | 5 + .../{ => packaging/linux}/sniffnet.desktop | 6 +- resources/packaging/macos/Info.plist | 19 + .../macos/graphics/dmg_bg.png} | Bin .../macos/graphics/sniffnet.icns} | Bin resources/packaging/macos/wrapper.sh | 2 + resources/packaging/windows/EULA.rtf | 68 +++ .../packaging/windows/graphics/banner.bmp | Bin 0 -> 86566 bytes .../packaging/windows/graphics/dialog.bmp | Bin 0 -> 462486 bytes .../windows/graphics/sniffnet.ico} | Bin .../windows/graphics/sniffnet_icon.png | Bin 0 -> 40011 bytes resources/packaging/windows/scripts/npcap.ps1 | 25 + resources/packaging/windows/scripts/wix.ps1 | 5 + resources/packaging/windows/setup.wxs | 195 +++++++ resources/wrapper.sh | 3 - src/main.rs | 19 +- wix/main.wxs | 301 ----------- 48 files changed, 1253 insertions(+), 636 deletions(-) create mode 100644 build.rs delete mode 100644 resources/Info.plist rename resources/logos/{ => raw}/icon.png (100%) rename resources/logos/{ => raw}/icon_macos.png (100%) create mode 100644 resources/packaging/LICENSE create mode 100644 resources/packaging/linux/description.txt rename resources/{icons/sniffnet-linux_1024x1024.png => packaging/linux/graphics/sniffnet_1024x1024.png} (100%) rename resources/{icons/sniffnet-linux_128x128.png => packaging/linux/graphics/sniffnet_128x128.png} (100%) rename resources/{icons/sniffnet-linux_160x160.png => packaging/linux/graphics/sniffnet_160x160.png} (100%) rename resources/{icons/sniffnet-linux_16x16.png => packaging/linux/graphics/sniffnet_16x16.png} (100%) rename resources/{icons/sniffnet-linux_192x192.png => packaging/linux/graphics/sniffnet_192x192.png} (100%) rename resources/{icons/sniffnet-linux_22x22.png => packaging/linux/graphics/sniffnet_22x22.png} (100%) rename resources/{icons/sniffnet-linux_24x24.png => packaging/linux/graphics/sniffnet_24x24.png} (100%) rename resources/{icons/sniffnet-linux_256x256.png => packaging/linux/graphics/sniffnet_256x256.png} (100%) rename resources/{icons/sniffnet-linux_32x32.png => packaging/linux/graphics/sniffnet_32x32.png} (100%) rename resources/{icons/sniffnet-linux_36x36.png => packaging/linux/graphics/sniffnet_36x36.png} (100%) rename resources/{icons/sniffnet-linux_384x384.png => packaging/linux/graphics/sniffnet_384x384.png} (100%) rename resources/{icons/sniffnet-linux_42x42.png => packaging/linux/graphics/sniffnet_42x42.png} (100%) rename resources/{icons/sniffnet-linux_48x48.png => packaging/linux/graphics/sniffnet_48x48.png} (100%) rename resources/{icons/sniffnet-linux_512x512.png => packaging/linux/graphics/sniffnet_512x512.png} (100%) rename resources/{icons/sniffnet-linux_64x64.png => packaging/linux/graphics/sniffnet_64x64.png} (100%) rename resources/{icons/sniffnet-linux_72x72.png => packaging/linux/graphics/sniffnet_72x72.png} (100%) rename resources/{icons/sniffnet-linux_8x8.png => packaging/linux/graphics/sniffnet_8x8.png} (100%) rename resources/{icons/sniffnet-linux_96x96.png => packaging/linux/graphics/sniffnet_96x96.png} (100%) create mode 100644 resources/packaging/linux/scripts/.gitkeep create mode 100644 resources/packaging/linux/scripts/postinst create mode 100644 resources/packaging/linux/scripts/prerm rename resources/{ => packaging/linux}/sniffnet.desktop (67%) create mode 100644 resources/packaging/macos/Info.plist rename resources/{logos/bg_dmg.png => packaging/macos/graphics/dmg_bg.png} (100%) rename resources/{icons/sniffnet-macos.icns => packaging/macos/graphics/sniffnet.icns} (100%) create mode 100755 resources/packaging/macos/wrapper.sh create mode 100644 resources/packaging/windows/EULA.rtf create mode 100644 resources/packaging/windows/graphics/banner.bmp create mode 100644 resources/packaging/windows/graphics/dialog.bmp rename resources/{icons/sniffnet-windows.ico => packaging/windows/graphics/sniffnet.ico} (100%) create mode 100644 resources/packaging/windows/graphics/sniffnet_icon.png create mode 100644 resources/packaging/windows/scripts/npcap.ps1 create mode 100644 resources/packaging/windows/scripts/wix.ps1 create mode 100644 resources/packaging/windows/setup.wxs delete mode 100755 resources/wrapper.sh delete mode 100644 wix/main.wxs diff --git a/.editorconfig b/.editorconfig index 5721b26e..4bb1cfa6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,12 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true +[*.{ps1,rtf}] +end_of_line = crlf + +[*.ps1] +indent_style = tab + [{.gitignore,*.desktop}] indent_size = 0 diff --git a/.gitattributes b/.gitattributes index a6efae89..cd335aad 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ * text eol=lf .* text eol=lf +*.bmp binary *.png binary *.icns binary *.ico binary diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index bad586b0..710ba9b9 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -2,6 +2,9 @@ name: Package on: workflow_dispatch: + secrets: + NPCAP_OEM_URL: + required: true workflow_call: secrets: NPCAP_OEM_URL: @@ -9,95 +12,281 @@ on: jobs: - package: - runs-on: ${{ matrix.os }} + build: + runs-on: ${{ matrix.os }}-latest strategy: + fail-fast: true matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + include: + - os: ubuntu + arch: amd64 + target: x86_64-unknown-linux-gnu + - os: ubuntu + arch: i386 + target: i686-unknown-linux-gnu + - os: ubuntu + arch: arm64 + target: aarch64-unknown-linux-gnu + - os: ubuntu + arch: armhf + target: armv7-unknown-linux-gnueabihf + - os: macos + arch: amd64 + target: x86_64-apple-darwin + - os: macos + arch: arm64 + target: aarch64-apple-darwin + - os: windows + arch: amd64 + target: x86_64-pc-windows-msvc + - os: windows + arch: i386 + target: i686-pc-windows-msvc steps: - name: Checkout repository uses: actions/checkout@v3 + - name: Install dependencies + if: ${{ matrix.os == 'windows' }} + shell: powershell + run: .\resources\packaging\windows\scripts\npcap.ps1 -ARCH ${{ matrix.arch }} -OEM "${{ secrets.NPCAP_OEM_URL }}" + - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal - components: rustfmt, clippy default: true - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-latest' - run: sudo apt-get install libpcap-dev libasound2-dev - - - name: Install Windows dependency - npcap sdk - if: matrix.os == 'windows-latest' + - name: Add build targets + if: ${{ matrix.os == 'macos' }} run: | - Invoke-WebRequest -Uri "https://npcap.com/dist/npcap-sdk-1.13.zip" -OutFile "C:/npcap-sdk.zip" - Expand-Archive -LiteralPath C:/npcap-sdk.zip -DestinationPath C:/npcap-sdk - echo "LIB=C:/npcap-sdk/Lib/x64" >> $env:GITHUB_ENV + rustup target add \ + x86_64-apple-darwin \ + aarch64-apple-darwin - - name: Install Windows dependency - npcap dll - if: matrix.os == 'windows-latest' + - name: Add build targets + if: ${{ matrix.os == 'windows' }} run: | - Invoke-WebRequest -Uri ${{secrets.NPCAP_OEM_URL}} -OutFile C:/npcap-oem.exe - C:/npcap-oem.exe /S + rustup target add ` + x86_64-pc-windows-msvc ` + i686-pc-windows-msvc + + - name: Install Cross + if: ${{ matrix.os == 'ubuntu' }} + run: cargo install cross --git https://github.com/cross-rs/cross - - name: Build + - name: Build binary + if: ${{ matrix.os == 'ubuntu' }} + run: cross build --release --target ${{ matrix.target }} + + - name: Build binary + if: ${{ matrix.os == 'macos' || matrix.os == 'windows' }} uses: actions-rs/cargo@v1 with: command: build - args: --release + args: --release --target ${{ matrix.target }} + + - name: Upload build artifacts + uses: actions/upload-artifact@v3 + with: + name: build-${{ matrix.os }} + path: | + target/*/release/sniffnet + target/*/release/sniffnet.exe + if-no-files-found: error + + deb: + runs-on: ubuntu-latest + container: + image: debian:latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install dependencies + run: apt update -y && apt install -y curl build-essential + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + default: true + + - name: Install packaging tools + run: cargo install cargo-deb + + - uses: actions/download-artifact@v3 + with: + name: build-ubuntu + path: target/ - name: Package for Debian-based Linux distros - if: matrix.os == 'ubuntu-latest' + shell: bash run: | - cargo install cargo-deb - cargo deb + targets=( + x86_64-unknown-linux-gnu + i686-unknown-linux-gnu + aarch64-unknown-linux-gnu + armv7-unknown-linux-gnueabihf + ) mkdir artifacts - mv target/debian/*.deb artifacts/ - -# doesn't work properly on ubuntu-latest! -# - name: Package for RPM-based Linux distros -# if: matrix.os == 'ubuntu-latest' -# run: | -# cargo install cargo-generate-rpm -# cargo generate-rpm -# mv target/generate-rpm/*.rpm artifacts/ - - - name: Package DMG for macOS - if: matrix.os == 'macOS-latest' + for target in "${targets[@]}"; do + cargo deb --no-build --no-strip --target $target + mv target/${target}/debian/*.deb artifacts/ + done + + - name: Upload package artifacts + uses: actions/upload-artifact@v3 + with: + name: deb + path: artifacts/ + + rpm: + runs-on: ubuntu-latest + container: + image: fedora:latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install dependencies + run: dnf update -y && dnf install -y @development-tools patchelf + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + default: true + + - name: Install packaging tools + run: cargo install cargo-generate-rpm + + - uses: actions/download-artifact@v3 + with: + name: build-ubuntu + path: target/ + + - name: Package for RPM-based Linux distros + shell: bash + run: | + targets=( + x86_64-unknown-linux-gnu + aarch64-unknown-linux-gnu + ) + mkdir artifacts + for target in "${targets[@]}"; do + patchelf --replace-needed libpcap.so.0.8 libpcap.so target/${target}/release/sniffnet + cargo generate-rpm --target $target + mv target/${target}/generate-rpm/*.rpm artifacts/ + done + + - name: Upload package artifacts + uses: actions/upload-artifact@v3 + with: + name: rpm + path: artifacts/ + + dmg: + runs-on: macos-latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + default: true + + - name: Install packaging tools run: | cargo install cargo-bundle - cargo bundle --release - rm target/release/bundle/osx/sniffnet.app/Contents/Info.plist - cp resources/Info.plist target/release/bundle/osx/sniffnet.app/Contents/Info.plist - cp resources/wrapper.sh target/release/bundle/osx/sniffnet.app/Contents/MacOS/wrapper.sh brew install create-dmg + + - uses: actions/download-artifact@v3 + with: + name: build-macos + path: target/ + + - name: Package for macOS + run: | + cargo bundle --release + lipo -create -output target/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet \ + target/x86_64-apple-darwin/release/sniffnet \ + target/aarch64-apple-darwin/release/sniffnet + cp resources/packaging/macos/wrapper.sh \ + target/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh + cp resources/packaging/macos/Info.plist \ + target/release/bundle/osx/Sniffnet.app/Contents/Info.plist mkdir artifacts create-dmg \ --volname "Sniffnet Installer" \ - --background "resources/logos/bg_dmg.png" \ + --background "resources/packaging/macos/graphics/dmg_bg.png" \ --window-pos 200 120 \ --window-size 900 450 \ --icon-size 100 \ --app-drop-link 620 240 \ --icon "Sniffnet.app" 300 240 \ --hide-extension "Sniffnet.app" \ - "artifacts/sniffnet.dmg" \ + "artifacts/sniffnet-universal.dmg" \ "target/release/bundle/osx/" - - name: Package MSI for Windows - if: matrix.os == 'windows-latest' + - name: Upload package artifacts + uses: actions/upload-artifact@v3 + with: + name: dmg + path: artifacts/ + + msi: + runs-on: windows-latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install dependencies + shell: powershell + run: .\resources\packaging\windows\scripts\wix.ps1 + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + default: true + + - name: Install packaging tools + run: cargo install cargo-wix + + - uses: actions/download-artifact@v3 + with: + name: build-windows + path: target/ + + - name: Package for Microsoft Windows + shell: powershell run: | - cargo install cargo-wix - cargo wix --nocapture - mkdir artifacts - mv target/wix/*.msi artifacts/ + $targets=@( + "x86_64-pc-windows-msvc", + "i686-pc-windows-msvc" + ) + New-Item -ItemType Directory -Path artifacts + foreach ($target in $targets) + { + cargo wix --no-build --nocapture --target $target + Move-Item -Path target\wix\*.msi -Destination .\artifacts\ + } - - name: Upload artifacts + - name: Upload package artifacts uses: actions/upload-artifact@v3 with: - name: ${{ matrix.os }}-artifacts + name: msi path: artifacts/ diff --git a/Cargo.lock b/Cargo.lock index d4a3ef24..a2763f63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -154,7 +154,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.6.2", "object", "rustc-demangle", ] @@ -200,6 +200,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -627,6 +633,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "cty" version = "0.2.2" @@ -860,17 +872,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "errno" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.45.0", -] - [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -920,12 +921,19 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "1.9.0" +name = "exr" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56" dependencies = [ - "instant", + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide 0.7.1", + "rayon-core", + "smallvec", + "zune-inflate", ] [[package]] @@ -944,7 +952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.6.2", ] [[package]] @@ -962,6 +970,19 @@ dependencies = [ "num-traits", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1184,8 +1205,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1371,6 +1394,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1404,12 +1436,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "hexf-parse" version = "0.2.1" @@ -1475,16 +1501,16 @@ dependencies = [ ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "hyper-rustls" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" dependencies = [ - "bytes", + "http", "hyper", - "native-tls", + "rustls", "tokio", - "tokio-native-tls", + "tokio-rustls", ] [[package]] @@ -1524,6 +1550,7 @@ dependencies = [ "iced_native", "iced_wgpu", "iced_winit", + "image", "thiserror", ] @@ -1578,6 +1605,8 @@ dependencies = [ "glam", "iced_native", "iced_style", + "image", + "kamadak-exif", "log", "lyon", "raw-window-handle 0.5.0", @@ -1675,6 +1704,25 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-rational", + "num-traits", + "png", + "qoi", + "tiff", +] + [[package]] name = "imagesize" version = "0.11.0" @@ -1703,17 +1751,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "io-lifetimes" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.45.0", -] - [[package]] name = "ipnet" version = "2.7.2" @@ -1783,6 +1820,9 @@ name = "jpeg-decoder" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +dependencies = [ + "rayon", +] [[package]] name = "js-sys" @@ -1793,6 +1833,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kamadak-exif" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +dependencies = [ + "mutate_once", +] + [[package]] name = "khronos-egl" version = "4.1.0" @@ -1834,6 +1883,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.144" @@ -1881,12 +1936,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" - [[package]] name = "lock_api" version = "0.4.9" @@ -2056,6 +2105,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.6" @@ -2068,6 +2126,12 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "mutate_once" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" + [[package]] name = "naga" version = "0.11.0" @@ -2089,21 +2153,12 @@ dependencies = [ ] [[package]] -name = "native-tls" -version = "0.2.11" +name = "nanorand" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "getrandom", ] [[package]] @@ -2232,6 +2287,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -2248,7 +2324,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] @@ -2350,51 +2426,6 @@ version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" -[[package]] -name = "openssl" -version = "0.10.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" -dependencies = [ - "autocfg", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "ordered-float" version = "3.7.0" @@ -2491,7 +2522,7 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", "winapi", ] @@ -2504,7 +2535,7 @@ checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", "windows-sys 0.45.0", ] @@ -2516,7 +2547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbaa01d616eb84eb35cd085fdeaa8671dc8d951bdc4a75bfc414466e76b039ce" dependencies = [ "bitflags", - "errno 0.2.8", + "errno", "libc", "libloading 0.6.7", "pkg-config", @@ -2584,6 +2615,26 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" +[[package]] +name = "pin-project" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.4", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -2641,7 +2692,7 @@ dependencies = [ "bitflags", "crc32fast", "flate2", - "miniz_oxide", + "miniz_oxide 0.6.2", ] [[package]] @@ -2699,6 +2750,15 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quote" version = "1.0.26" @@ -2809,15 +2869,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_users" version = "0.4.3" @@ -2825,7 +2876,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "redox_syscall", "thiserror", ] @@ -2867,25 +2918,27 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-tls", + "hyper-rustls", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg", ] @@ -2917,6 +2970,21 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "rodio" version = "0.17.1" @@ -2997,17 +3065,34 @@ dependencies = [ ] [[package]] -name = "rustix" -version = "0.37.3" +name = "rustls" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" +checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" dependencies = [ - "bitflags", - "errno 0.3.0", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.45.0", + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", ] [[package]] @@ -3050,15 +3135,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" -dependencies = [ - "windows-sys 0.42.0", -] - [[package]] name = "scoped-tls" version = "1.0.1" @@ -3077,6 +3153,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sctk-adwaita" version = "0.4.3" @@ -3089,29 +3175,6 @@ dependencies = [ "tiny-skia 0.7.0", ] -[[package]] -name = "security-framework" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys 0.8.3", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" -dependencies = [ - "core-foundation-sys 0.8.3", - "libc", -] - [[package]] name = "semver" version = "1.0.16" @@ -3188,6 +3251,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + [[package]] name = "simplecss" version = "0.2.1" @@ -3276,6 +3345,7 @@ dependencies = [ "rodio", "rstest", "serde", + "winres", ] [[package]] @@ -3298,6 +3368,21 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -3449,19 +3534,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tempfile" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix", - "windows-sys 0.45.0", -] - [[package]] name = "termcolor" version = "1.2.0" @@ -3491,6 +3563,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tiff" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "tiny-skia" version = "0.7.0" @@ -3573,12 +3656,12 @@ dependencies = [ ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "tokio-rustls" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "e0d409377ff5b1e3ca6437aa86c1eb7d40c134bfec254e44c830defa92669db5" dependencies = [ - "native-tls", + "rustls", "tokio", ] @@ -3746,6 +3829,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.3.1" @@ -3790,12 +3879,6 @@ dependencies = [ "usvg", ] -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "vec_map" version = "0.8.2" @@ -3999,6 +4082,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + [[package]] name = "weezl" version = "0.1.7" @@ -4199,21 +4301,6 @@ dependencies = [ "windows_x86_64_msvc 0.36.1", ] -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -4418,6 +4505,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] + [[package]] name = "wio" version = "0.2.2" @@ -4476,3 +4572,12 @@ name = "xmlparser" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index 9652a3f0..914a6186 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,9 @@ include = [ "resources/sounds/*" ] +[target."cfg(windows)"] +rustflags = ["-C", "target-feature=+crt-static"] + #═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ [profile.release] @@ -36,7 +39,7 @@ etherparse = "0.13.0" chrono = { version = "0.4.26", default_features = false, features = ["clock"] } indexmap = "1.9.3" plotters = { version = "0.3.4", default_features = false, features = ["area_series"] } -iced = { version = "0.9.0", features = ["tokio", "svg"] } +iced = { version = "0.9.0", features = ["tokio", "svg", "image"] } iced_native = "0.10.3" iced_lazy = "0.6.1" plotters-iced = "0.8.0" @@ -44,7 +47,7 @@ maxminddb = "0.23.0" confy = "0.5.1" serde = { version = "1.0.163", default_features = false, features = ["derive"] } rodio = { version = "0.17.1", default_features = false, features = ["mp3"] } -reqwest = { version = "0.11.18", features = ["json", "blocking"] } +reqwest = { version = "0.11.18", default-features = false, features = ["json", "blocking", "rustls-tls"] } dns-lookup = "2.0.2" #─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── @@ -52,70 +55,112 @@ dns-lookup = "2.0.2" [dev-dependencies] rstest = "0.17.0" +#─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +[target."cfg(windows)".build-dependencies] +winres = "0.1.12" + +#═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ + +[package.metadata.cross.target.x86_64-unknown-linux-gnu] +pre-build = [ + "dpkg --add-architecture amd64", + "apt update -y && apt install -y libfreetype6-dev:amd64 libexpat1-dev:amd64 libpcap-dev:amd64 libasound2-dev:amd64 libfontconfig1-dev:amd64" +] + +[package.metadata.cross.target.i686-unknown-linux-gnu] +pre-build = [ + "dpkg --add-architecture i386", + "apt update -y && apt install -y libfreetype6-dev:i386 libexpat1-dev:i386 libpcap-dev:i386 libasound2-dev:i386 libfontconfig1-dev:i386" +] + +[package.metadata.cross.target.aarch64-unknown-linux-gnu] +pre-build = [ + "dpkg --add-architecture arm64", + "apt update -y && apt install -y libfreetype6-dev:arm64 libexpat1-dev:arm64 libpcap-dev:arm64 libasound2-dev:arm64 libfontconfig1-dev:arm64" +] + +[package.metadata.cross.target.armv7-unknown-linux-gnueabihf] +pre-build = [ + "dpkg --add-architecture armhf", + "apt update -y && apt install -y libfreetype6-dev:armhf libexpat1-dev:armhf libpcap-dev:armhf libasound2-dev:armhf libfontconfig1-dev:armhf" +] + #═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ [package.metadata.deb] -depends = "libasound2-dev, libpcap-dev, libfontconfig1" +section="Network" +license-file="resources/packaging/LICENSE" +extended-description-file="resources/packaging/linux/description.txt" +maintainer-scripts="resources/packaging/linux/scripts/" +depends = "libasound2, libpcap0.8, libfontconfig1" assets = [ ["target/release/sniffnet", "/usr/bin/", "755"], - ["resources/sniffnet.desktop", "/usr/share/applications/", "644"], - ["resources/icons/sniffnet-linux_8x8.png", "/usr/share/icons/hicolor/8x8/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_16x16.png", "/usr/share/icons/hicolor/16x16/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_22x22.png", "/usr/share/icons/hicolor/22x22/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_24x24.png", "/usr/share/icons/hicolor/24x24/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_32x32.png", "/usr/share/icons/hicolor/32x32/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_36x36.png", "/usr/share/icons/hicolor/36x36/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_42x42.png", "/usr/share/icons/hicolor/42x42/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_48x48.png", "/usr/share/icons/hicolor/48x48/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_64x64.png", "/usr/share/icons/hicolor/64x64/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_72x72.png", "/usr/share/icons/hicolor/72x72/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_96x96.png", "/usr/share/icons/hicolor/96x96/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_128x128.png", "/usr/share/icons/hicolor/128x128/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_160x160.png", "/usr/share/icons/hicolor/160x160/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_192x192.png", "/usr/share/icons/hicolor/192x192/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_256x256.png", "/usr/share/icons/hicolor/256x256/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_384x384.png", "/usr/share/icons/hicolor/384x384/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_512x512.png", "/usr/share/icons/hicolor/512x512/apps/sniffnet.png", "644"], - ["resources/icons/sniffnet-linux_1024x1024.png", "/usr/share/icons/hicolor/1024x1024/apps/sniffnet.png", "644"] + ["resources/packaging/linux/sniffnet.desktop", "/usr/share/applications/", "644"], + ["resources/packaging/linux/graphics/sniffnet_8x8.png", "/usr/share/icons/hicolor/8x8/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_16x16.png", "/usr/share/icons/hicolor/16x16/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_22x22.png", "/usr/share/icons/hicolor/22x22/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_24x24.png", "/usr/share/icons/hicolor/24x24/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_32x32.png", "/usr/share/icons/hicolor/32x32/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_36x36.png", "/usr/share/icons/hicolor/36x36/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_42x42.png", "/usr/share/icons/hicolor/42x42/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_48x48.png", "/usr/share/icons/hicolor/48x48/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_64x64.png", "/usr/share/icons/hicolor/64x64/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_72x72.png", "/usr/share/icons/hicolor/72x72/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_96x96.png", "/usr/share/icons/hicolor/96x96/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_128x128.png", "/usr/share/icons/hicolor/128x128/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_160x160.png", "/usr/share/icons/hicolor/160x160/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_192x192.png", "/usr/share/icons/hicolor/192x192/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_256x256.png", "/usr/share/icons/hicolor/256x256/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_384x384.png", "/usr/share/icons/hicolor/384x384/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_512x512.png", "/usr/share/icons/hicolor/512x512/apps/sniffnet.png", "644"], + ["resources/packaging/linux/graphics/sniffnet_1024x1024.png", "/usr/share/icons/hicolor/1024x1024/apps/sniffnet.png", "644"] ] #─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── [package.metadata.generate-rpm] -auto-req = "no" +post_install_script = "setcap cap_net_raw,cap_net_admin=eip /usr/bin/sniffnet" +pre_uninstall_script = "setcap '' /usr/bin/sniffnet" assets = [ { source = "target/release/sniffnet", dest = "/usr/bin/", mode = "755" }, - { source = "resources/sniffnet.desktop", dest = "/usr/share/applications/", mode = "644" }, - { source = "resources/icons/sniffnet-linux_8x8.png", dest = "/usr/share/icons/hicolor/8x8/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_16x16.png", dest = "/usr/share/icons/hicolor/16x16/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_22x22.png", dest = "/usr/share/icons/hicolor/22x22/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_24x24.png", dest = "/usr/share/icons/hicolor/24x24/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_32x32.png", dest = "/usr/share/icons/hicolor/32x32/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_36x36.png", dest = "/usr/share/icons/hicolor/36x36/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_42x42.png", dest = "/usr/share/icons/hicolor/42x42/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_48x48.png", dest = "/usr/share/icons/hicolor/48x48/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_64x64.png", dest = "/usr/share/icons/hicolor/64x64/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_72x72.png", dest = "/usr/share/icons/hicolor/72x72/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_96x96.png", dest = "/usr/share/icons/hicolor/96x96/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_128x128.png", dest = "/usr/share/icons/hicolor/128x128/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_160x160.png", dest = "/usr/share/icons/hicolor/160x160/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_192x192.png", dest = "/usr/share/icons/hicolor/192x192/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_256x256.png", dest = "/usr/share/icons/hicolor/256x256/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_384x384.png", dest = "/usr/share/icons/hicolor/384x384/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_512x512.png", dest = "/usr/share/icons/hicolor/512x512/apps/sniffnet.png", mode = "644" }, - { source = "resources/icons/sniffnet-linux_1024x1024.png", dest = "/usr/share/icons/hicolor/1024x1024/apps/sniffnet.png", mode = "644" } + { source = "resources/packaging/linux/sniffnet.desktop", dest = "/usr/share/applications/", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_8x8.png", dest = "/usr/share/icons/hicolor/8x8/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_16x16.png", dest = "/usr/share/icons/hicolor/16x16/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_22x22.png", dest = "/usr/share/icons/hicolor/22x22/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_24x24.png", dest = "/usr/share/icons/hicolor/24x24/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_32x32.png", dest = "/usr/share/icons/hicolor/32x32/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_36x36.png", dest = "/usr/share/icons/hicolor/36x36/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_42x42.png", dest = "/usr/share/icons/hicolor/42x42/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_48x48.png", dest = "/usr/share/icons/hicolor/48x48/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_64x64.png", dest = "/usr/share/icons/hicolor/64x64/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_72x72.png", dest = "/usr/share/icons/hicolor/72x72/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_96x96.png", dest = "/usr/share/icons/hicolor/96x96/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_128x128.png", dest = "/usr/share/icons/hicolor/128x128/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_160x160.png", dest = "/usr/share/icons/hicolor/160x160/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_192x192.png", dest = "/usr/share/icons/hicolor/192x192/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_256x256.png", dest = "/usr/share/icons/hicolor/256x256/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_384x384.png", dest = "/usr/share/icons/hicolor/384x384/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_512x512.png", dest = "/usr/share/icons/hicolor/512x512/apps/sniffnet.png", mode = "644" }, + { source = "resources/packaging/linux/graphics/sniffnet_1024x1024.png", dest = "/usr/share/icons/hicolor/1024x1024/apps/sniffnet.png", mode = "644" } ] [package.metadata.generate-rpm.requires] -alsa-lib-devel = "*" -libpcap-devel = "*" -fontconfig-devel = "*" +alsa-lib = "*" +libpcap = "*" +fontconfig = "*" #─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── [package.metadata.bundle] name = "Sniffnet" -identifier = "gyulyvgc.sniffnet" +category = "Utilities" +identifier = "io.github.gyulyvgc.sniffnet" icon = [ - "resources/icons/sniffnet-macos.icns" + "resources/packaging/macos/graphics/sniffnet.icns" ] + +#─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + +[package.metadata.wix] +include = [".\\resources\\packaging\\windows\\setup.wxs"] diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..df4eea93 --- /dev/null +++ b/build.rs @@ -0,0 +1,12 @@ +#[cfg(windows)] +extern crate winres; + +#[cfg(windows)] +fn main() { + let mut res = winres::WindowsResource::new(); + res.set_icon("resources/packaging/windows/graphics/sniffnet.ico"); + res.compile().unwrap(); +} + +#[cfg(unix)] +fn main() {} diff --git a/resources/Info.plist b/resources/Info.plist deleted file mode 100644 index 5f36e107..00000000 --- a/resources/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - Sniffnet - CFBundleExecutable - wrapper.sh - CFBundleIconFile - sniffnet-macos.icns - CFBundleIdentifier - gyulyvgc.sniffnet - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Sniffnet - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0.0 - CFBundleVersion - 20221123.150927 - CSResourcesFileMapped - - LSRequiresCarbon - - NSHighResolutionCapable - - - diff --git a/resources/logos/icon.png b/resources/logos/raw/icon.png similarity index 100% rename from resources/logos/icon.png rename to resources/logos/raw/icon.png diff --git a/resources/logos/icon_macos.png b/resources/logos/raw/icon_macos.png similarity index 100% rename from resources/logos/icon_macos.png rename to resources/logos/raw/icon_macos.png diff --git a/resources/packaging/LICENSE b/resources/packaging/LICENSE new file mode 100644 index 00000000..e383d1a4 --- /dev/null +++ b/resources/packaging/LICENSE @@ -0,0 +1,236 @@ +******************************************************************************* + DUAL LICENSED SOFTWARE +******************************************************************************* + +The software in this project is dual licensed under the terms of the MIT License +and the Apache License 2.0. You may choose to use this software under either +license, at your discretion. + +------------------------------------------------------------------------------- +The MIT License +------------------------------------------------------------------------------- + +Copyright (c) 2022 - Bellini Giuliano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +------------------------------------------------------------------------------- +Apache License 2.0 +------------------------------------------------------------------------------- + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +******************************************************************************* diff --git a/resources/packaging/linux/description.txt b/resources/packaging/linux/description.txt new file mode 100644 index 00000000..4558398a --- /dev/null +++ b/resources/packaging/linux/description.txt @@ -0,0 +1,18 @@ +Features: +Choose a network adapter of your PC to inspect +Select a set of filters to apply to the observed traffic; +View overall statistics about your Internet traffic; +View real-time charts about traffic intensity (bytes and packets per second, incoming and outgoing); +Get details about domain names and network providers of the hosts you are exchanging traffic with; +Identify connections in your local network; +Get information about the country of the remote hosts (IP geolocation); +Save your favorite network hosts; +Set custom notifications to inform you when defined network events occur; +Choose the style that fits you the most from 4 different available themes; +Inspect each of your network connections in real time; +Save complete textual report with detailed information for each network connection: +Source and destination IP addresses, +Source and destination ports, +Carried protocols, +Amount of exchanged packets and bytes, +Initial and final timestamp of information exchange diff --git a/resources/icons/sniffnet-linux_1024x1024.png b/resources/packaging/linux/graphics/sniffnet_1024x1024.png similarity index 100% rename from resources/icons/sniffnet-linux_1024x1024.png rename to resources/packaging/linux/graphics/sniffnet_1024x1024.png diff --git a/resources/icons/sniffnet-linux_128x128.png b/resources/packaging/linux/graphics/sniffnet_128x128.png similarity index 100% rename from resources/icons/sniffnet-linux_128x128.png rename to resources/packaging/linux/graphics/sniffnet_128x128.png diff --git a/resources/icons/sniffnet-linux_160x160.png b/resources/packaging/linux/graphics/sniffnet_160x160.png similarity index 100% rename from resources/icons/sniffnet-linux_160x160.png rename to resources/packaging/linux/graphics/sniffnet_160x160.png diff --git a/resources/icons/sniffnet-linux_16x16.png b/resources/packaging/linux/graphics/sniffnet_16x16.png similarity index 100% rename from resources/icons/sniffnet-linux_16x16.png rename to resources/packaging/linux/graphics/sniffnet_16x16.png diff --git a/resources/icons/sniffnet-linux_192x192.png b/resources/packaging/linux/graphics/sniffnet_192x192.png similarity index 100% rename from resources/icons/sniffnet-linux_192x192.png rename to resources/packaging/linux/graphics/sniffnet_192x192.png diff --git a/resources/icons/sniffnet-linux_22x22.png b/resources/packaging/linux/graphics/sniffnet_22x22.png similarity index 100% rename from resources/icons/sniffnet-linux_22x22.png rename to resources/packaging/linux/graphics/sniffnet_22x22.png diff --git a/resources/icons/sniffnet-linux_24x24.png b/resources/packaging/linux/graphics/sniffnet_24x24.png similarity index 100% rename from resources/icons/sniffnet-linux_24x24.png rename to resources/packaging/linux/graphics/sniffnet_24x24.png diff --git a/resources/icons/sniffnet-linux_256x256.png b/resources/packaging/linux/graphics/sniffnet_256x256.png similarity index 100% rename from resources/icons/sniffnet-linux_256x256.png rename to resources/packaging/linux/graphics/sniffnet_256x256.png diff --git a/resources/icons/sniffnet-linux_32x32.png b/resources/packaging/linux/graphics/sniffnet_32x32.png similarity index 100% rename from resources/icons/sniffnet-linux_32x32.png rename to resources/packaging/linux/graphics/sniffnet_32x32.png diff --git a/resources/icons/sniffnet-linux_36x36.png b/resources/packaging/linux/graphics/sniffnet_36x36.png similarity index 100% rename from resources/icons/sniffnet-linux_36x36.png rename to resources/packaging/linux/graphics/sniffnet_36x36.png diff --git a/resources/icons/sniffnet-linux_384x384.png b/resources/packaging/linux/graphics/sniffnet_384x384.png similarity index 100% rename from resources/icons/sniffnet-linux_384x384.png rename to resources/packaging/linux/graphics/sniffnet_384x384.png diff --git a/resources/icons/sniffnet-linux_42x42.png b/resources/packaging/linux/graphics/sniffnet_42x42.png similarity index 100% rename from resources/icons/sniffnet-linux_42x42.png rename to resources/packaging/linux/graphics/sniffnet_42x42.png diff --git a/resources/icons/sniffnet-linux_48x48.png b/resources/packaging/linux/graphics/sniffnet_48x48.png similarity index 100% rename from resources/icons/sniffnet-linux_48x48.png rename to resources/packaging/linux/graphics/sniffnet_48x48.png diff --git a/resources/icons/sniffnet-linux_512x512.png b/resources/packaging/linux/graphics/sniffnet_512x512.png similarity index 100% rename from resources/icons/sniffnet-linux_512x512.png rename to resources/packaging/linux/graphics/sniffnet_512x512.png diff --git a/resources/icons/sniffnet-linux_64x64.png b/resources/packaging/linux/graphics/sniffnet_64x64.png similarity index 100% rename from resources/icons/sniffnet-linux_64x64.png rename to resources/packaging/linux/graphics/sniffnet_64x64.png diff --git a/resources/icons/sniffnet-linux_72x72.png b/resources/packaging/linux/graphics/sniffnet_72x72.png similarity index 100% rename from resources/icons/sniffnet-linux_72x72.png rename to resources/packaging/linux/graphics/sniffnet_72x72.png diff --git a/resources/icons/sniffnet-linux_8x8.png b/resources/packaging/linux/graphics/sniffnet_8x8.png similarity index 100% rename from resources/icons/sniffnet-linux_8x8.png rename to resources/packaging/linux/graphics/sniffnet_8x8.png diff --git a/resources/icons/sniffnet-linux_96x96.png b/resources/packaging/linux/graphics/sniffnet_96x96.png similarity index 100% rename from resources/icons/sniffnet-linux_96x96.png rename to resources/packaging/linux/graphics/sniffnet_96x96.png diff --git a/resources/packaging/linux/scripts/.gitkeep b/resources/packaging/linux/scripts/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/resources/packaging/linux/scripts/postinst b/resources/packaging/linux/scripts/postinst new file mode 100644 index 00000000..0791d87a --- /dev/null +++ b/resources/packaging/linux/scripts/postinst @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +setcap cap_net_raw,cap_net_admin=eip /usr/bin/sniffnet diff --git a/resources/packaging/linux/scripts/prerm b/resources/packaging/linux/scripts/prerm new file mode 100644 index 00000000..af71e5de --- /dev/null +++ b/resources/packaging/linux/scripts/prerm @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +setcap '' /usr/bin/sniffnet diff --git a/resources/sniffnet.desktop b/resources/packaging/linux/sniffnet.desktop similarity index 67% rename from resources/sniffnet.desktop rename to resources/packaging/linux/sniffnet.desktop index 6650acb2..e5216212 100644 --- a/resources/sniffnet.desktop +++ b/resources/packaging/linux/sniffnet.desktop @@ -3,8 +3,8 @@ Version=1.0 Type=Application Name=Sniffnet Comment=Application to comfortably monitor your network traffic -Categories=Network;Security;Utility; +Categories=Network; Icon=sniffnet -Exec=sudo /usr/bin/sniffnet +Exec=/usr/bin/sniffnet StartupWMClass=sniffnet -Terminal=true +Terminal=false diff --git a/resources/packaging/macos/Info.plist b/resources/packaging/macos/Info.plist new file mode 100644 index 00000000..d795c489 --- /dev/null +++ b/resources/packaging/macos/Info.plist @@ -0,0 +1,19 @@ + + + + + CFBundleDevelopmentRegionEnglish + CFBundleDisplayNameSniffnet + CFBundleExecutablewrapper.sh + CFBundleIconFilesniffnet.icns + CFBundleIdentifierio.github.gyulyvgc.sniffnet + CFBundleInfoDictionaryVersion6.0 + CFBundleNameSniffnet + CFBundlePackageTypeAPPL + CFBundleShortVersionString1.0.0 + CFBundleVersion20221123.150927 + CSResourcesFileMapped + LSRequiresCarbon + NSHighResolutionCapable + + diff --git a/resources/logos/bg_dmg.png b/resources/packaging/macos/graphics/dmg_bg.png similarity index 100% rename from resources/logos/bg_dmg.png rename to resources/packaging/macos/graphics/dmg_bg.png diff --git a/resources/icons/sniffnet-macos.icns b/resources/packaging/macos/graphics/sniffnet.icns similarity index 100% rename from resources/icons/sniffnet-macos.icns rename to resources/packaging/macos/graphics/sniffnet.icns diff --git a/resources/packaging/macos/wrapper.sh b/resources/packaging/macos/wrapper.sh new file mode 100755 index 00000000..e8478f3a --- /dev/null +++ b/resources/packaging/macos/wrapper.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env zsh +osacompile -e "do shell script \"/Applications/Sniffnet.app/Contents/MacOS/sniffnet >/dev/null 2>&1 &\" with administrator privileges" \ No newline at end of file diff --git a/resources/packaging/windows/EULA.rtf b/resources/packaging/windows/EULA.rtf new file mode 100644 index 00000000..a901a2eb --- /dev/null +++ b/resources/packaging/windows/EULA.rtf @@ -0,0 +1,68 @@ +{\rtf1\ansi\deff4\adeflang1025 +{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Times New Roman;}{\f5\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f6\froman\fprq2\fcharset0 Calibri;}{\f7\froman\fprq2\fcharset0 Calibri Light;}{\f8\fnil\fprq2\fcharset0 Noto Sans CJK SC;}{\f9\fnil\fprq2\fcharset0 Calibri;}{\f10\fnil\fprq2\fcharset0 Times New Roman;}{\f11\fnil\fprq2\fcharset0 Lucida Sans;}{\f12\fswiss\fprq0\fcharset128 Lucida Sans;}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red47\green84\blue150;\red31\green55\blue99;} +{\stylesheet{\s0\snext0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033 Normal;} +{\s1\sbasedon0\snext0\rtlch\af9\afs48\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb240\sa0\keepn\ltrpar\cf17\f6\fs48\i0\b\kerning1\dbch\af9 Heading 1;} +{\s2\sbasedon0\snext0\rtlch\af9\afs36\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs36\i0\b\dbch\af9 Heading 2;} +{\s3\sbasedon0\snext0\rtlch\af9\afs28\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf18\f6\fs28\i0\b\dbch\af9 Heading 3;} +{\s4\sbasedon0\snext0\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9 Heading 4;} +{\s5\sbasedon0\snext0\rtlch\af9\afs20\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs20\i0\b\dbch\af9 Heading 5;} +{\s6\sbasedon0\snext0\rtlch\af9\afs16\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf18\f6\fs16\i0\b\dbch\af9 Heading 6;} +{\*\cs15\snext15 Default Paragraph Font;} +{\*\cs16\sbasedon15\snext16\rtlch\af10\afs32 \ltrch\hich\af7\loch\cf17\f7\fs32\dbch\af10 Heading 1 Char;} +{\*\cs17\sbasedon15\snext17\rtlch\af10\afs26 \ltrch\hich\af7\loch\cf17\f7\fs26\dbch\af10 Heading 2 Char;} +{\*\cs18\sbasedon15\snext18\rtlch\af10\afs24 \ltrch\hich\af7\loch\cf18\f7\fs24\dbch\af10 Heading 3 Char;} +{\*\cs19\sbasedon15\snext19\rtlch\af10\ai \ltrch\hich\af7\loch\cf17\f7\i\dbch\af10 Heading 4 Char;} +{\*\cs20\sbasedon15\snext20\rtlch\af10 \ltrch\hich\af7\loch\cf17\f7\dbch\af10 Heading 5 Char;} +{\*\cs21\sbasedon15\snext21\rtlch\af10 \ltrch\hich\af7\loch\cf18\f7\dbch\af10 Heading 6 Char;} +{\s22\sbasedon0\snext23\rtlch\af11\afs28 \ltrch\hich\af5\loch\ql\widctlpar\sb240\sa120\keepn\ltrpar\f5\fs28\dbch\af8 Heading;} +{\s23\sbasedon0\snext23\rtlch\afs24 \ltrch\loch\sl276\slmult1\ql\widctlpar\sb0\sa140\ltrpar\fs24 Text Body;} +{\s24\sbasedon23\snext24\rtlch\af12\afs24 \ltrch\loch\sl276\slmult1\ql\widctlpar\sb0\sa140\ltrpar\fs24 List;} +{\s25\sbasedon0\snext25\rtlch\af12\afs24\ai \ltrch\loch\ql\widctlpar\sb120\sa120\noline\ltrpar\fs24\i Caption;} +{\s26\sbasedon0\snext26\rtlch\af12\afs24 \ltrch\loch\ql\widctlpar\sb0\sa0\noline\ltrpar\fs24 Index;} +}{\*\generator LibreOffice/7.3.7.2$Linux_X86_64 LibreOffice_project/30$Build-2}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2023\mo5\dy5\hr12\min34}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops{\propname AppVersion}\proptype30{\staticval 12.0000}}\deftab720 +\hyphauto1\viewscale100 +{\*\pgdsctbl +{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\pgdscnxt0 Default Page Style;}} +\formshade\paperh15840\paperw12240\margl1440\margr1440\margt1440\margb1440\sectd\sbknone\pgndec\sftnnar\saftnnrlc\sectunlocked1\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc\htmautsp +{\*\ftnsep\chftnsep}\pgndec\pard\plain \s3\rtlch\af9\afs28\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf18\f6\fs28\i0\b\dbch\af9\sb0\sa281{\rtlch\af10 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +END-USER LICENSE AGREEMENT (EULA) FOR SNIFFNET} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240\loch + +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\rtlch\ab \ltrch\loch\b\loch +Effective Date: 2022-08-05} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +PLEASE READ THIS END-USER LICENSE AGREEMENT ("EULA") CAREFULLY BEFORE USING THE SNIFFNET SOFTWARE ("SOFTWARE"). BY USING THE SOFTWARE, YOU AGREE TO BE BOUND BY THE TERMS OF THIS EULA. IF YOU DO NOT AGREE TO THE TERMS OF THIS EULA, DO NOT USE THE SOFTWARE.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +1. License Grant} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +This EULA grants you, the end-user, a non-exclusive, non-transferable, non-sublicensable license to use the Software, subject to the terms and conditions of this EULA. The Software is dual-licensed under the MIT License and the Apache License 2.0. You may choose to use the Software under either of these licenses.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +2. Restrictions} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +There are no restrictions on how you can use the Software, as long as your use complies with the terms of the chosen license (MIT License or Apache License 2.0).} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +3. No Warranty} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +The Software is provided "AS IS," without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the Software or the use or other dealings in the Software.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9{\loch +4. Limitation of Liability} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +In no event shall the authors or copyright holders be liable for any damages whatsoever, including but not limited to, any direct, indirect, incidental, special, exemplary, or consequential damages, arising out of or in connection with the use, performance, or inability to use the Software, even if the authors or copyright holders have been advised of the possibility of such damages.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +5. Termination} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +This EULA is effective until terminated. Your rights under this EULA will terminate automatically without notice from the authors or copyright holders if you fail to comply with any term(s) of this EULA.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +6. Export Compliance} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +The Software is not subject to any export laws or restrictions.} +\par \pard\plain \s4\rtlch\af9\afs24\ai\ab \ltrch\hich\af6\loch\ql\keep\widctlpar\sb40\sa0\keepn\ltrpar\cf17\f6\fs24\i0\b\dbch\af9\sb319\sa319{\rtlch\af10\ai0 \ltrch\hich\af4\loch\cf0\i0\f4\dbch\af10\loch +7. Governing Law} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +This EULA and any disputes arising from or relating to this EULA or the use of the Software shall be governed by and construed under the laws of the jurisdiction in which the open-source project is maintained.} +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240\loch + +\par \pard\plain \s0\rtlch\afs24\af11\alang1025 \ltrch\lang1033\langfe1033\hich\af4\loch\ql\widctlpar\sb0\sa0\ltrpar\hyphpar0\fs24\cf0\f4\lang1033\kerning0\dbch\af13\langfe1033\sb240\sa240{\loch +By using the Software, you agree to the terms of this EULA. If you have any questions or concerns about the EULA or the Software, please contact the project maintainer.} +\par } \ No newline at end of file diff --git a/resources/packaging/windows/graphics/banner.bmp b/resources/packaging/windows/graphics/banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba56740a270c6257ec558e54a0be0d99eb1c9421 GIT binary patch literal 86566 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 literal 0 HcmV?d00001 diff --git a/resources/packaging/windows/graphics/dialog.bmp b/resources/packaging/windows/graphics/dialog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c59e515538ed0f887316b2835359cfa272542647 GIT binary patch literal 462486 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 GQU3svfd)kY literal 0 HcmV?d00001 diff --git a/resources/packaging/windows/scripts/npcap.ps1 b/resources/packaging/windows/scripts/npcap.ps1 new file mode 100644 index 00000000..4b21c567 --- /dev/null +++ b/resources/packaging/windows/scripts/npcap.ps1 @@ -0,0 +1,25 @@ +[CmdletBinding()] +param ( + [Parameter(Mandatory)] + [ValidateSet("amd64", "i386", "arm64")] + [string]$ARCH, + [Parameter(Mandatory)] + [string]$OEM +) + +Write-Host "::group::Npcap SDK" +Invoke-WebRequest -Uri "https://npcap.com/dist/npcap-sdk-1.13.zip" -OutFile "$env:TEMP\\npcap-sdk.zip" -Verbose +Expand-Archive -LiteralPath "$env:TEMP\\npcap-sdk.zip" -DestinationPath "$env:TEMP\\npcap-sdk" -Verbose +$LibPath = switch ($ARCH) +{ + "amd64" { "Lib\\x64" } + "i386" { "Lib" } + "arm64" { "Lib\\ARM64" } +} +Add-Content -Path "$env:GITHUB_ENV" -Value "LIB=$env:TEMP\\npcap-sdk\\$LibPath" +Write-Host "::endgroup::" + +Write-Host "::group::Npcap DLL" +Invoke-WebRequest -Uri "$OEM" -OutFile "$env:TEMP\\npcap-oem.exe" -Verbose +Start-Process -FilePath "$env:TEMP\\npcap-oem.exe" -ArgumentList "/S" -Wait +Write-Host "::endgroup::" diff --git a/resources/packaging/windows/scripts/wix.ps1 b/resources/packaging/windows/scripts/wix.ps1 new file mode 100644 index 00000000..24a310d5 --- /dev/null +++ b/resources/packaging/windows/scripts/wix.ps1 @@ -0,0 +1,5 @@ +Write-Host "::group::WiX Toolset" +Invoke-WebRequest -Uri "https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip" -OutFile "$env:TEMP\\wix-binaries.zip" -Verbose +Expand-Archive -LiteralPath "$env:TEMP\\wix-binaries.zip" -DestinationPath "$env:TEMP\\wix" -Verbose +Set-Item -Path env:Path -Value "$env:Path;$env:TEMP\\wix" +Write-Host "::endgroup::" diff --git a/resources/packaging/windows/setup.wxs b/resources/packaging/windows/setup.wxs new file mode 100644 index 00000000..95f94019 --- /dev/null +++ b/resources/packaging/windows/setup.wxs @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed + + + + + + + + + + + diff --git a/resources/wrapper.sh b/resources/wrapper.sh deleted file mode 100755 index 45febf2d..00000000 --- a/resources/wrapper.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -osascript \ - -e "do shell script \"/*/Sniffnet.app/Contents/MacOS/sniffnet > /dev/null 2>&1 & \" with administrator privileges" diff --git a/src/main.rs b/src/main.rs index 23430ad9..141c271b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,9 +2,11 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +// use std::path::Path; // TODO: Uncomment to set window icon use std::sync::{Arc, Condvar, Mutex}; use std::{panic, process, thread}; +// use iced::window::icon; // TODO: Uncomment to set window icon use iced::window::{PlatformSpecific, Position}; use iced::{window, Application, Settings}; @@ -96,6 +98,13 @@ pub fn main() -> iced::Result { print_cli_welcome_message(); + // TODO: Uncomment to set window icon + // let icon_path = "resources/packaging/windows/graphics/sniffnet_icon.png"; + // let icon = match get_icon(icon_path) { + // Ok(icon) => icon, + // Err(err) => panic!("Error: {:?}", err) + // }; + Sniffer::run(Settings { id: None, window: window::Settings { @@ -108,7 +117,7 @@ pub fn main() -> iced::Result { decorations: true, transparent: false, always_on_top: false, - icon: None, + icon: None, // TODO: Replace with 'Some(icon)' to set window icon platform_specific: PlatformSpecific::default(), }, flags: Sniffer::new( @@ -129,3 +138,11 @@ pub fn main() -> iced::Result { try_opengles_first: false, }) } + +// TODO: Uncomment to set window icon +// fn get_icon(file_path: &str) -> Result> { +// let icon_path = Path::new(file_path); +// let icon = icon::from_file(icon_path)?; +// +// Ok(icon) +// } diff --git a/wix/main.wxs b/wix/main.wxs deleted file mode 100644 index 3bd580d5..00000000 --- a/wix/main.wxs +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 1 - - - - - - - - - - - - - - - - From c8e123f52163f226a90263d488ee659e0ed3cc12 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 14:54:03 +0200 Subject: [PATCH 02/23] Fixed a mistake --- resources/packaging/macos/wrapper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/packaging/macos/wrapper.sh b/resources/packaging/macos/wrapper.sh index e8478f3a..ad2d0214 100755 --- a/resources/packaging/macos/wrapper.sh +++ b/resources/packaging/macos/wrapper.sh @@ -1,2 +1,2 @@ #!/usr/bin/env zsh -osacompile -e "do shell script \"/Applications/Sniffnet.app/Contents/MacOS/sniffnet >/dev/null 2>&1 &\" with administrator privileges" \ No newline at end of file +osascript -e "do shell script \"/Applications/Sniffnet.app/Contents/MacOS/sniffnet >/dev/null 2>&1 &\" with administrator privileges" \ No newline at end of file From d7d72117572146095a72700df05789f7129273a6 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 14:55:43 +0200 Subject: [PATCH 03/23] Used the correct version for macOS package --- .github/workflows/package.yml | 11 +++++++---- resources/packaging/macos/Info.plist | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 710ba9b9..a1ac57c8 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -208,7 +208,7 @@ jobs: - name: Install packaging tools run: | - cargo install cargo-bundle + cargo install cargo-bundle toml-cli brew install create-dmg - uses: actions/download-artifact@v3 @@ -218,14 +218,17 @@ jobs: - name: Package for macOS run: | + VERSION=$(toml get Cargo.toml package.version --raw) cargo bundle --release lipo -create -output target/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet \ target/x86_64-apple-darwin/release/sniffnet \ target/aarch64-apple-darwin/release/sniffnet - cp resources/packaging/macos/wrapper.sh \ - target/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh + chmod +x target/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet + sed -i "s/0\.0\.0/${VERSION}/g" resources/packaging/macos/Info.plist cp resources/packaging/macos/Info.plist \ target/release/bundle/osx/Sniffnet.app/Contents/Info.plist + cp resources/packaging/macos/wrapper.sh \ + target/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh mkdir artifacts create-dmg \ --volname "Sniffnet Installer" \ @@ -236,7 +239,7 @@ jobs: --app-drop-link 620 240 \ --icon "Sniffnet.app" 300 240 \ --hide-extension "Sniffnet.app" \ - "artifacts/sniffnet-universal.dmg" \ + "artifacts/sniffnet-${VERSION}-universal.dmg" \ "target/release/bundle/osx/" - name: Upload package artifacts diff --git a/resources/packaging/macos/Info.plist b/resources/packaging/macos/Info.plist index d795c489..95b1be7a 100644 --- a/resources/packaging/macos/Info.plist +++ b/resources/packaging/macos/Info.plist @@ -10,7 +10,7 @@ CFBundleInfoDictionaryVersion6.0 CFBundleNameSniffnet CFBundlePackageTypeAPPL - CFBundleShortVersionString1.0.0 + CFBundleShortVersionString0.0.0 CFBundleVersion20221123.150927 CSResourcesFileMapped LSRequiresCarbon From 01e6d64ba9207c80cbefbd7a96128246689256ab Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 17:46:42 +0200 Subject: [PATCH 04/23] Replaced universal macOS package with specific platforms --- .github/workflows/package.yml | 46 ++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index a1ac57c8..e24a1f04 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -217,30 +217,36 @@ jobs: path: target/ - name: Package for macOS + shell: bash run: | VERSION=$(toml get Cargo.toml package.version --raw) + sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" resources/packaging/macos/Info.plist cargo bundle --release - lipo -create -output target/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet \ - target/x86_64-apple-darwin/release/sniffnet \ - target/aarch64-apple-darwin/release/sniffnet - chmod +x target/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet - sed -i "s/0\.0\.0/${VERSION}/g" resources/packaging/macos/Info.plist - cp resources/packaging/macos/Info.plist \ - target/release/bundle/osx/Sniffnet.app/Contents/Info.plist - cp resources/packaging/macos/wrapper.sh \ - target/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh + targets=( + x86_64-apple-darwin + aarch64-apple-darwin + ) mkdir artifacts - create-dmg \ - --volname "Sniffnet Installer" \ - --background "resources/packaging/macos/graphics/dmg_bg.png" \ - --window-pos 200 120 \ - --window-size 900 450 \ - --icon-size 100 \ - --app-drop-link 620 240 \ - --icon "Sniffnet.app" 300 240 \ - --hide-extension "Sniffnet.app" \ - "artifacts/sniffnet-${VERSION}-universal.dmg" \ - "target/release/bundle/osx/" + for target in "${targets[@]}"; do + cp -R target/release/bundle target/${target}/release + cp -f target/${target}/release/sniffnet \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet + cp resources/packaging/macos/wrapper.sh \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh + cp resources/packaging/macos/Info.plist \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/Info.plist + create-dmg \ + --volname "Sniffnet Installer" \ + --background "resources/packaging/macos/graphics/dmg_bg.png" \ + --window-pos 200 120 \ + --window-size 900 450 \ + --icon-size 100 \ + --app-drop-link 620 240 \ + --icon "Sniffnet.app" 300 240 \ + --hide-extension "Sniffnet.app" \ + "artifacts/sniffnet-${VERSION}-${target%%-*}.dmg" \ + "target/${target}/release/bundle/osx/" + done - name: Upload package artifacts uses: actions/upload-artifact@v3 From 854315607f1d5f4a6a38ec8390cbaa1d0fe651f9 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 18:30:38 +0200 Subject: [PATCH 05/23] Fixed the launch path on macOS for localization compatibility --- resources/packaging/macos/wrapper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/packaging/macos/wrapper.sh b/resources/packaging/macos/wrapper.sh index ad2d0214..20ab4ddc 100755 --- a/resources/packaging/macos/wrapper.sh +++ b/resources/packaging/macos/wrapper.sh @@ -1,2 +1,2 @@ #!/usr/bin/env zsh -osascript -e "do shell script \"/Applications/Sniffnet.app/Contents/MacOS/sniffnet >/dev/null 2>&1 &\" with administrator privileges" \ No newline at end of file +osascript -e "do shell script \"/*/Sniffnet.app/Contents/MacOS/sniffnet >/dev/null 2>&1 &\" with administrator privileges" \ No newline at end of file From 33c753b895c1b39892425e3d95591f563f6380e7 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 18:48:57 +0200 Subject: [PATCH 06/23] Removed window icon setting --- Cargo.toml | 2 +- .../windows/graphics/sniffnet_icon.png | Bin 40011 -> 0 bytes src/main.rs | 19 +----------------- 3 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 resources/packaging/windows/graphics/sniffnet_icon.png diff --git a/Cargo.toml b/Cargo.toml index 914a6186..4c1e8e26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ etherparse = "0.13.0" chrono = { version = "0.4.26", default_features = false, features = ["clock"] } indexmap = "1.9.3" plotters = { version = "0.3.4", default_features = false, features = ["area_series"] } -iced = { version = "0.9.0", features = ["tokio", "svg", "image"] } +iced = { version = "0.9.0", features = ["tokio", "svg"] } iced_native = "0.10.3" iced_lazy = "0.6.1" plotters-iced = "0.8.0" diff --git a/resources/packaging/windows/graphics/sniffnet_icon.png b/resources/packaging/windows/graphics/sniffnet_icon.png deleted file mode 100644 index 9b17dbcbecd1e8ed1da121f9f22605510ee1fe04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40011 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 GQU3svfd)kY diff --git a/src/main.rs b/src/main.rs index 141c271b..23430ad9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,9 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -// use std::path::Path; // TODO: Uncomment to set window icon use std::sync::{Arc, Condvar, Mutex}; use std::{panic, process, thread}; -// use iced::window::icon; // TODO: Uncomment to set window icon use iced::window::{PlatformSpecific, Position}; use iced::{window, Application, Settings}; @@ -98,13 +96,6 @@ pub fn main() -> iced::Result { print_cli_welcome_message(); - // TODO: Uncomment to set window icon - // let icon_path = "resources/packaging/windows/graphics/sniffnet_icon.png"; - // let icon = match get_icon(icon_path) { - // Ok(icon) => icon, - // Err(err) => panic!("Error: {:?}", err) - // }; - Sniffer::run(Settings { id: None, window: window::Settings { @@ -117,7 +108,7 @@ pub fn main() -> iced::Result { decorations: true, transparent: false, always_on_top: false, - icon: None, // TODO: Replace with 'Some(icon)' to set window icon + icon: None, platform_specific: PlatformSpecific::default(), }, flags: Sniffer::new( @@ -138,11 +129,3 @@ pub fn main() -> iced::Result { try_opengles_first: false, }) } - -// TODO: Uncomment to set window icon -// fn get_icon(file_path: &str) -> Result> { -// let icon_path = Path::new(file_path); -// let icon = icon::from_file(icon_path)?; -// -// Ok(icon) -// } From b768094330519608063e13f8afaaf5fee32ed58e Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Tue, 6 Jun 2023 21:34:49 +0200 Subject: [PATCH 07/23] use commit hash for CFBundleVersion field --- .github/workflows/package.yml | 4 +++- resources/packaging/macos/Info.plist | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index e24a1f04..03fdbc2e 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -2,6 +2,7 @@ name: Package on: workflow_dispatch: + push: secrets: NPCAP_OEM_URL: required: true @@ -220,7 +221,8 @@ jobs: shell: bash run: | VERSION=$(toml get Cargo.toml package.version --raw) - sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" resources/packaging/macos/Info.plist + GIT_HASH=$(git rev-parse --short "$GITHUB_SHA") + sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" -e "s/fffffff/${GIT_HASH}/g" resources/packaging/macos/Info.plist cargo bundle --release targets=( x86_64-apple-darwin diff --git a/resources/packaging/macos/Info.plist b/resources/packaging/macos/Info.plist index 95b1be7a..d0066964 100644 --- a/resources/packaging/macos/Info.plist +++ b/resources/packaging/macos/Info.plist @@ -11,7 +11,7 @@ CFBundleNameSniffnet CFBundlePackageTypeAPPL CFBundleShortVersionString0.0.0 - CFBundleVersion20221123.150927 + CFBundleVersionfffffff CSResourcesFileMapped LSRequiresCarbon NSHighResolutionCapable From 5158158369a0616c69ade53d217e6bb0078b84d2 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Tue, 6 Jun 2023 22:15:31 +0200 Subject: [PATCH 08/23] Fixed the commit hash shortener --- .github/workflows/package.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 03fdbc2e..5288ed64 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -221,8 +221,7 @@ jobs: shell: bash run: | VERSION=$(toml get Cargo.toml package.version --raw) - GIT_HASH=$(git rev-parse --short "$GITHUB_SHA") - sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" -e "s/fffffff/${GIT_HASH}/g" resources/packaging/macos/Info.plist + sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" -e "s/fffffff/${GITHUB_SHA:0:7}/g" resources/packaging/macos/Info.plist cargo bundle --release targets=( x86_64-apple-darwin From bacd8d183d2ecc9154e35f978d9e7b3531be0b8f Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 11:16:44 +0200 Subject: [PATCH 09/23] Embedded PS1 scripts into the workflow --- .editorconfig | 5 +--- .github/workflows/package.yml | 28 +++++++++++++++++-- resources/packaging/windows/scripts/npcap.ps1 | 25 ----------------- resources/packaging/windows/scripts/wix.ps1 | 5 ---- 4 files changed, 27 insertions(+), 36 deletions(-) delete mode 100644 resources/packaging/windows/scripts/npcap.ps1 delete mode 100644 resources/packaging/windows/scripts/wix.ps1 diff --git a/.editorconfig b/.editorconfig index 4bb1cfa6..2315b117 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,12 +8,9 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true -[*.{ps1,rtf}] +[*.rtf] end_of_line = crlf -[*.ps1] -indent_style = tab - [{.gitignore,*.desktop}] indent_size = 0 diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 5288ed64..7560acf9 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -51,7 +51,24 @@ jobs: - name: Install dependencies if: ${{ matrix.os == 'windows' }} shell: powershell - run: .\resources\packaging\windows\scripts\npcap.ps1 -ARCH ${{ matrix.arch }} -OEM "${{ secrets.NPCAP_OEM_URL }}" + run: | + Write-Host "::group::Npcap SDK" + $ARCH = "${{ matrix.arch }}" + Invoke-WebRequest -Uri "https://npcap.com/dist/npcap-sdk-1.13.zip" -OutFile "$env:TEMP\npcap-sdk.zip" -Verbose + Expand-Archive -LiteralPath "$env:TEMP\npcap-sdk.zip" -DestinationPath "$env:TEMP\npcap-sdk" -Verbose + $LibPath = switch ($ARCH) + { + "i386" { "Lib" } + "amd64" { "Lib\x64" } + "arm64" { "Lib\ARM64" } + default { throw "$ARCH is not supported!" } + } + Add-Content -Path "$env:GITHUB_ENV" -Value "LIB=$env:TEMP\npcap-sdk\$LibPath" + Write-Host "::endgroup::" + Write-Host "::group::Npcap DLL" + Invoke-WebRequest -Uri "${{ secrets.NPCAP_OEM_URL }}" -OutFile "$env:TEMP\npcap-oem.exe" -Verbose + Start-Process -FilePath "$env:TEMP\npcap-oem.exe" -ArgumentList "/S" -Wait + Write-Host "::endgroup::" - name: Install Rust uses: actions-rs/toolchain@v1 @@ -264,7 +281,14 @@ jobs: - name: Install dependencies shell: powershell - run: .\resources\packaging\windows\scripts\wix.ps1 + run: | + Write-Host "::group::WiX Toolset" + Invoke-WebRequest ` + -Uri "https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip" ` + -OutFile "$env:TEMP\wix-binaries.zip" -Verbose + Expand-Archive -LiteralPath "$env:TEMP\wix-binaries.zip" -DestinationPath "$env:TEMP\wix" -Verbose + Set-Item -Path env:Path -Value "$env:Path;$env:TEMP\wix" + Write-Host "::endgroup::" - name: Install Rust uses: actions-rs/toolchain@v1 diff --git a/resources/packaging/windows/scripts/npcap.ps1 b/resources/packaging/windows/scripts/npcap.ps1 deleted file mode 100644 index 4b21c567..00000000 --- a/resources/packaging/windows/scripts/npcap.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -[CmdletBinding()] -param ( - [Parameter(Mandatory)] - [ValidateSet("amd64", "i386", "arm64")] - [string]$ARCH, - [Parameter(Mandatory)] - [string]$OEM -) - -Write-Host "::group::Npcap SDK" -Invoke-WebRequest -Uri "https://npcap.com/dist/npcap-sdk-1.13.zip" -OutFile "$env:TEMP\\npcap-sdk.zip" -Verbose -Expand-Archive -LiteralPath "$env:TEMP\\npcap-sdk.zip" -DestinationPath "$env:TEMP\\npcap-sdk" -Verbose -$LibPath = switch ($ARCH) -{ - "amd64" { "Lib\\x64" } - "i386" { "Lib" } - "arm64" { "Lib\\ARM64" } -} -Add-Content -Path "$env:GITHUB_ENV" -Value "LIB=$env:TEMP\\npcap-sdk\\$LibPath" -Write-Host "::endgroup::" - -Write-Host "::group::Npcap DLL" -Invoke-WebRequest -Uri "$OEM" -OutFile "$env:TEMP\\npcap-oem.exe" -Verbose -Start-Process -FilePath "$env:TEMP\\npcap-oem.exe" -ArgumentList "/S" -Wait -Write-Host "::endgroup::" diff --git a/resources/packaging/windows/scripts/wix.ps1 b/resources/packaging/windows/scripts/wix.ps1 deleted file mode 100644 index 24a310d5..00000000 --- a/resources/packaging/windows/scripts/wix.ps1 +++ /dev/null @@ -1,5 +0,0 @@ -Write-Host "::group::WiX Toolset" -Invoke-WebRequest -Uri "https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311-binaries.zip" -OutFile "$env:TEMP\\wix-binaries.zip" -Verbose -Expand-Archive -LiteralPath "$env:TEMP\\wix-binaries.zip" -DestinationPath "$env:TEMP\\wix" -Verbose -Set-Item -Path env:Path -Value "$env:Path;$env:TEMP\\wix" -Write-Host "::endgroup::" From 5fb9bbb2b6d9090b0756679861ad2361f4485ddb Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 11:39:20 +0200 Subject: [PATCH 10/23] Fixed the workflow trigger on push --- .github/workflows/package.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 7560acf9..5d9c7033 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -1,15 +1,14 @@ name: Package on: - workflow_dispatch: push: - secrets: - NPCAP_OEM_URL: - required: true + tags: + - v* workflow_call: secrets: NPCAP_OEM_URL: required: true + workflow_dispatch: jobs: From 61b93bb27f2b972a4ed094df64439bed361ccb1e Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 12:20:10 +0200 Subject: [PATCH 11/23] Secured the secret usage --- .github/workflows/package.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 5d9c7033..15b84019 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -4,10 +4,6 @@ on: push: tags: - v* - workflow_call: - secrets: - NPCAP_OEM_URL: - required: true workflow_dispatch: jobs: @@ -49,6 +45,8 @@ jobs: - name: Install dependencies if: ${{ matrix.os == 'windows' }} + env: + NPCAP_OEM_URL: ${{ secrets.NPCAP_OEM_URL }} shell: powershell run: | Write-Host "::group::Npcap SDK" @@ -57,7 +55,7 @@ jobs: Expand-Archive -LiteralPath "$env:TEMP\npcap-sdk.zip" -DestinationPath "$env:TEMP\npcap-sdk" -Verbose $LibPath = switch ($ARCH) { - "i386" { "Lib" } + "i386" { "Lib" } "amd64" { "Lib\x64" } "arm64" { "Lib\ARM64" } default { throw "$ARCH is not supported!" } @@ -65,7 +63,7 @@ jobs: Add-Content -Path "$env:GITHUB_ENV" -Value "LIB=$env:TEMP\npcap-sdk\$LibPath" Write-Host "::endgroup::" Write-Host "::group::Npcap DLL" - Invoke-WebRequest -Uri "${{ secrets.NPCAP_OEM_URL }}" -OutFile "$env:TEMP\npcap-oem.exe" -Verbose + Invoke-WebRequest -Uri "$env:NPCAP_OEM_URL" -OutFile "$env:TEMP\npcap-oem.exe" -Verbose Start-Process -FilePath "$env:TEMP\npcap-oem.exe" -ArgumentList "/S" -Wait Write-Host "::endgroup::" From ca11098c9bdb2d9ed0cdf42d7c052bdf73f90205 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 14:19:51 +0200 Subject: [PATCH 12/23] Final adjustments --- .github/workflows/package.yml | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 15b84019..8c583f9f 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -14,30 +14,30 @@ jobs: fail-fast: true matrix: include: - - os: ubuntu - arch: amd64 - target: x86_64-unknown-linux-gnu - os: ubuntu arch: i386 target: i686-unknown-linux-gnu - - os: ubuntu - arch: arm64 - target: aarch64-unknown-linux-gnu - os: ubuntu arch: armhf target: armv7-unknown-linux-gnueabihf + - os: ubuntu + arch: amd64 + target: x86_64-unknown-linux-gnu + - os: ubuntu + arch: arm64 + target: aarch64-unknown-linux-gnu - os: macos arch: amd64 target: x86_64-apple-darwin - os: macos arch: arm64 target: aarch64-apple-darwin - - os: windows - arch: amd64 - target: x86_64-pc-windows-msvc - os: windows arch: i386 target: i686-pc-windows-msvc + - os: windows + arch: amd64 + target: x86_64-pc-windows-msvc steps: - name: Checkout repository @@ -57,7 +57,6 @@ jobs: { "i386" { "Lib" } "amd64" { "Lib\x64" } - "arm64" { "Lib\ARM64" } default { throw "$ARCH is not supported!" } } Add-Content -Path "$env:GITHUB_ENV" -Value "LIB=$env:TEMP\npcap-sdk\$LibPath" @@ -85,8 +84,8 @@ jobs: if: ${{ matrix.os == 'windows' }} run: | rustup target add ` - x86_64-pc-windows-msvc ` - i686-pc-windows-msvc + i686-pc-windows-msvc ` + x86_64-pc-windows-msvc - name: Install Cross if: ${{ matrix.os == 'ubuntu' }} @@ -143,10 +142,10 @@ jobs: shell: bash run: | targets=( - x86_64-unknown-linux-gnu i686-unknown-linux-gnu - aarch64-unknown-linux-gnu armv7-unknown-linux-gnueabihf + x86_64-unknown-linux-gnu + aarch64-unknown-linux-gnu ) mkdir artifacts for target in "${targets[@]}"; do @@ -196,7 +195,7 @@ jobs: ) mkdir artifacts for target in "${targets[@]}"; do - patchelf --replace-needed libpcap.so.0.8 libpcap.so target/${target}/release/sniffnet + patchelf --replace-needed libpcap.so.0.8 libpcap.so.1 target/${target}/release/sniffnet cargo generate-rpm --target $target mv target/${target}/generate-rpm/*.rpm artifacts/ done @@ -306,8 +305,8 @@ jobs: shell: powershell run: | $targets=@( - "x86_64-pc-windows-msvc", - "i686-pc-windows-msvc" + "i686-pc-windows-msvc", + "x86_64-pc-windows-msvc" ) New-Item -ItemType Directory -Path artifacts foreach ($target in $targets) From 62b7b7e4b1f7b44ca4c2af29ee849e393a5dbfb8 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Wed, 7 Jun 2023 16:47:34 +0200 Subject: [PATCH 13/23] rename windows artifacts --- .github/workflows/package.yml | 7 +- Cargo.lock | 792 +++++++++++++--------------------- README.md | 25 +- 3 files changed, 316 insertions(+), 508 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 8c583f9f..afc09c23 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -1,9 +1,6 @@ name: Package on: - push: - tags: - - v* workflow_dispatch: jobs: @@ -304,6 +301,7 @@ jobs: - name: Package for Microsoft Windows shell: powershell run: | + $VERSION=(toml get Cargo.toml package.version --raw) $targets=@( "i686-pc-windows-msvc", "x86_64-pc-windows-msvc" @@ -312,7 +310,8 @@ jobs: foreach ($target in $targets) { cargo wix --no-build --nocapture --target $target - Move-Item -Path target\wix\*.msi -Destination .\artifacts\ + Move-Item -Path target\wix\sniffnet-$VERSION-x86.msi -Destination .\artifacts\Sniffnet_Windows_32-bit.msi + Move-Item -Path target\wix\sniffnet-$VERSION-x86_64.msi -Destination .\artifacts\Sniffnet_Windows_64-bit.msi } - name: Upload package artifacts diff --git a/Cargo.lock b/Cargo.lock index 4df3605e..f631d4f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -131,9 +131,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "ash" -version = "0.37.2+1.3.238" +version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bf19c1f0a470be5fbf7522a308a05df06610252c5bcf5143e1b23f629a9a03" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ "libloading 0.7.4", ] @@ -161,15 +161,15 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bindgen" -version = "0.61.0" +version = "0.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a022e58a142a46fea340d68012b9201c094e93ec3d033a944a24f8fd4a4f09a" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" dependencies = [ "bitflags", "cexpr", @@ -200,12 +200,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - [[package]] name = "bitflags" version = "1.3.2" @@ -220,28 +214,28 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytemuck" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", ] [[package]] @@ -258,10 +252,11 @@ checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "calloop" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a59225be45a478d772ce015d9743e49e92798ece9e34eda9a6aa2a6a7f40192" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" dependencies = [ + "bitflags", "log", "nix 0.25.1", "slotmap", @@ -313,9 +308,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ed9a53e5d4d9c573ae844bfac6872b159cb1d1585a83b29e7a64b7eef7332a" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", @@ -365,9 +360,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.49" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db34956e100b30725f2eb215f90d4871051239535632f84fea3bc92722c66b7c" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ "cc", ] @@ -390,9 +385,9 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" dependencies = [ "bitflags", "block", @@ -449,9 +444,9 @@ dependencies = [ [[package]] name = "const_panic" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58baae561b85ca19b3122a9ddd35c8ec40c3bcd14fe89921824eae73f7baffbf" +checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" [[package]] name = "core-foundation" @@ -459,7 +454,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "libc", ] @@ -471,9 +466,9 @@ checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "core-graphics" @@ -525,37 +520,36 @@ dependencies = [ [[package]] name = "coreaudio-sys" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9444b94b8024feecc29e01a9706c69c1e26bfee480221c90764200cfd778fb" +checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" dependencies = [ "bindgen", ] [[package]] name = "cpal" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34fa7b20adf588f73f094cd9b1d944977c686e37a2759ea217ab174f017e10a" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" dependencies = [ "alsa", - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "coreaudio-rs", "dasp_sample", "jni 0.19.0", "js-sys", "libc", - "mach", + "mach2", "ndk", "ndk-context", "oboe", "once_cell", "parking_lot 0.12.1", - "thiserror", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows", + "windows 0.46.0", ] [[package]] @@ -618,7 +612,7 @@ checksum = "21fd3add36ea31aba1520aa5288714dd63be506106753226d0eb387a93bc9c45" dependencies = [ "cocoa", "core-foundation", - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "core-graphics", "core-text", "dwrote", @@ -633,62 +627,12 @@ dependencies = [ "winapi", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "cty" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" -[[package]] -name = "cxx" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d3488e7665a7a483b57e25bdd90d0aeb2bc7608c8d0346acf2ad3f1caf1d62" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fcaf066a053a41a81dfb14d57d99738b767febb8b735c3016e469fac5da690" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 1.0.109", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef98b8b717a829ca5603af80e1f9e2e48013ab227b68ef37872ef84ee479bf" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "d3d12" version = "0.6.0" @@ -775,11 +719,11 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dlib" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.7.4", + "libloading 0.8.0", ] [[package]] @@ -903,9 +847,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.7" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade" +checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" dependencies = [ "num-traits", ] @@ -921,19 +865,12 @@ dependencies = [ ] [[package]] -name = "exr" -version = "1.6.4" +name = "fdeflate" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" dependencies = [ - "bit_field", - "flume", - "half", - "lebe", - "miniz_oxide 0.7.1", - "rayon-core", - "smallvec", - "zune-inflate", + "simd-adler32", ] [[package]] @@ -947,12 +884,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide 0.6.2", + "miniz_oxide 0.7.1", ] [[package]] @@ -970,19 +907,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", - "spin 0.9.8", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1031,13 +955,13 @@ dependencies = [ [[package]] name = "foreign-types-macros" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8469d0d40519bc608ec6863f1cc88f3f1deee15913f2f3b3e573d81ed38cccc" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", ] [[package]] @@ -1054,9 +978,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -1085,9 +1009,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -1100,9 +1024,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -1110,15 +1034,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -1128,32 +1052,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", ] [[package]] name = "futures-sink" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-timer" @@ -1163,9 +1087,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -1200,15 +1124,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -1253,9 +1175,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e007a07a24de5ecae94160f141029e9a347282cfe25d1d58d85d845cf3130f1" +checksum = "807edf58b70c0b5b2181dd39fe1839dbdb3ba02645630dc5f753e23da307f762" dependencies = [ "js-sys", "slotmap", @@ -1315,9 +1237,9 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" dependencies = [ "bitflags", "gpu-alloc-types", @@ -1342,7 +1264,7 @@ dependencies = [ "log", "thiserror", "winapi", - "windows", + "windows 0.44.0", ] [[package]] @@ -1377,9 +1299,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -1394,15 +1316,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" -dependencies = [ - "crunchy", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1478,9 +1391,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.25" +version = "0.14.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" dependencies = [ "bytes", "futures-channel", @@ -1515,26 +1428,25 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows 0.48.0", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -1550,7 +1462,6 @@ dependencies = [ "iced_native", "iced_wgpu", "iced_winit", - "image", "thiserror", ] @@ -1605,11 +1516,9 @@ dependencies = [ "glam", "iced_native", "iced_style", - "image", - "kamadak-exif", "log", "lyon", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "resvg", "thiserror", ] @@ -1666,7 +1575,7 @@ dependencies = [ "iced_graphics", "iced_native", "log", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "wgpu", "wgpu_glyph", ] @@ -1696,33 +1605,14 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", ] -[[package]] -name = "image" -version = "0.24.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-rational", - "num-traits", - "png", - "qoi", - "tiff", -] - [[package]] name = "imagesize" version = "0.11.0" @@ -1808,9 +1698,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" dependencies = [ "libc", ] @@ -1820,28 +1710,16 @@ name = "jpeg-decoder" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] -[[package]] -name = "kamadak-exif" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" -dependencies = [ - "mutate_once", -] - [[package]] name = "khronos-egl" version = "4.1.0" @@ -1864,9 +1742,9 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a2d0c1781729f69dbea30f968608cadfaeb6582e5ce903a167a5216b53cd0f" +checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" dependencies = [ "arrayvec 0.7.2", ] @@ -1883,17 +1761,11 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - [[package]] name = "libc" -version = "0.2.144" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libloading" @@ -1916,19 +1788,20 @@ dependencies = [ ] [[package]] -name = "libm" -version = "0.2.6" +name = "libloading" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] [[package]] -name = "link-cplusplus" -version = "1.0.8" +name = "libm" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "linked-hash-map" @@ -1938,9 +1811,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1948,12 +1821,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "lyon" @@ -2008,10 +1878,10 @@ dependencies = [ ] [[package]] -name = "mach" -version = "0.3.2" +name = "mach2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" dependencies = [ "libc", ] @@ -2112,31 +1982,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", + "simd-adler32", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] -[[package]] -name = "mutate_once" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" - [[package]] name = "naga" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5" +checksum = "6c3d4269bcb7d50121097702fde1afb75f4ea8083aeb7a55688dcf289a853271" dependencies = [ "bit-set", "bitflags", @@ -2152,15 +2017,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "ndk" version = "0.7.0" @@ -2171,7 +2027,7 @@ dependencies = [ "jni-sys", "ndk-sys", "num_enum", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "thiserror", ] @@ -2267,15 +2123,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nom8" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" -dependencies = [ - "memchr", -] - [[package]] name = "num-derive" version = "0.3.3" @@ -2287,27 +2134,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.15" @@ -2390,9 +2216,9 @@ dependencies = [ [[package]] name = "object" -version = "0.30.3" +version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" dependencies = [ "memchr", ] @@ -2422,9 +2248,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "ordered-float" @@ -2510,7 +2336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.7", + "parking_lot_core 0.9.8", ] [[package]] @@ -2522,22 +2348,22 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi", ] [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", - "windows-sys 0.45.0", + "windows-targets 0.48.0", ] [[package]] @@ -2563,9 +2389,9 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phf" @@ -2615,26 +2441,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" -[[package]] -name = "pin-project" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.4", -] - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -2649,9 +2455,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "plotters" @@ -2685,14 +2491,15 @@ dependencies = [ [[package]] name = "png" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" +checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" dependencies = [ "bitflags", "crc32fast", + "fdeflate", "flate2", - "miniz_oxide 0.6.2", + "miniz_oxide 0.7.1", ] [[package]] @@ -2703,9 +2510,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", "toml_edit", @@ -2737,33 +2544,24 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.52" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" - -[[package]] -name = "qoi" -version = "0.4.1" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] +checksum = "332cd62e95873ea4f41f3dfd6bbbfc5b52aec892d7e8d534197c4720a0bbbab2" [[package]] name = "quote" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -2825,12 +2623,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" -dependencies = [ - "cty", -] +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" @@ -2869,6 +2664,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -2876,15 +2680,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.16", "thiserror", ] [[package]] name = "regex" -version = "1.7.1" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", @@ -2893,9 +2697,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "renderdoc-sys" @@ -2979,7 +2783,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin 0.5.2", + "spin", "untrusted", "web-sys", "winapi", @@ -3045,9 +2849,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -3147,12 +2951,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scratch" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" - [[package]] name = "sct" version = "0.7.0" @@ -3177,9 +2975,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" @@ -3198,14 +2996,14 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.4", + "syn 2.0.18", ] [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -3374,15 +3172,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -3413,9 +3202,9 @@ checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "strict-num" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df65f20698aeed245efdde3628a6b559ea1239bbb871af1b6e3b58c413b2bd1" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" dependencies = [ "float-cmp", ] @@ -3458,15 +3247,15 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ffacedcdcf1da6579c907279b4f3c5492fbce99fbbf227f5ed270a589c2765" dependencies = [ - "kurbo 0.9.3", + "kurbo 0.9.5", "siphasher", ] [[package]] name = "symphonia" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3671dd6f64f4f9d5c87179525054cfc1f60de23ba1f193bd6ceab812737403f1" +checksum = "62e48dba70095f265fdb269b99619b95d04c89e619538138383e63310b14d941" dependencies = [ "lazy_static", "symphonia-bundle-mp3", @@ -3476,9 +3265,9 @@ dependencies = [ [[package]] name = "symphonia-bundle-mp3" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a0846e7a2c9a8081ff799fc83a975170417ad2a143f644a77ec2e3e82a2b73" +checksum = "0f31d7fece546f1e6973011a9eceae948133bbd18fd3d52f6073b1e38ae6368a" dependencies = [ "bitflags", "lazy_static", @@ -3489,9 +3278,9 @@ dependencies = [ [[package]] name = "symphonia-core" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9567e2d8a5f866b2f94f5d366d811e0c6826babcff6d37de9e1a6690d38869" +checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142" dependencies = [ "arrayvec 0.7.2", "bitflags", @@ -3502,9 +3291,9 @@ dependencies = [ [[package]] name = "symphonia-metadata" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd35c263223ef6161000be79b124a75de3e065eea563bf3ef169b3e94c7bb2e" +checksum = "89c3e1937e31d0e068bbe829f66b2f2bfaa28d056365279e0ef897172c3320c0" dependencies = [ "encoding_rs", "lazy_static", @@ -3525,9 +3314,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.4" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c622ae390c9302e214c31013517c2061ecb2699935882c60a9b37f82f8625ae" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -3545,33 +3334,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", -] - -[[package]] -name = "tiff" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", + "syn 2.0.18", ] [[package]] @@ -3641,9 +3419,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", @@ -3652,7 +3430,7 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2 0.4.9", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -3667,9 +3445,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -3690,19 +3468,19 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" [[package]] name = "toml_edit" -version = "0.18.1" +version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ "indexmap", - "nom8", "toml_datetime", + "winnow", ] [[package]] @@ -3724,9 +3502,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -3786,9 +3564,9 @@ checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" @@ -3837,9 +3615,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -3856,7 +3634,7 @@ dependencies = [ "data-url", "flate2", "imagesize", - "kurbo 0.9.3", + "kurbo 0.9.5", "log", "rctree", "rosvgtree", @@ -3870,7 +3648,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "195386e01bc35f860db024de275a76e7a31afdf975d18beb6d0e44764118b4db" dependencies = [ "fontdb", - "kurbo 0.9.3", + "kurbo 0.9.5", "log", "rustybuzz", "unicode-bidi", @@ -3893,12 +3671,11 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", - "winapi", "winapi-util", ] @@ -3920,9 +3697,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3930,24 +3707,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" dependencies = [ "cfg-if", "js-sys", @@ -3957,9 +3734,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3967,22 +3744,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-timer" @@ -4074,9 +3851,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -4120,7 +3897,7 @@ dependencies = [ "naga", "parking_lot 0.12.1", "profiling", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "smallvec", "static_assertions", "wasm-bindgen", @@ -4146,7 +3923,7 @@ dependencies = [ "naga", "parking_lot 0.12.1", "profiling", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "smallvec", "thiserror", "web-sys", @@ -4170,7 +3947,7 @@ dependencies = [ "d3d12", "foreign-types 0.3.2", "fxhash", - "glow 0.12.1", + "glow 0.12.2", "gpu-alloc", "gpu-allocator", "gpu-descriptor", @@ -4186,7 +3963,7 @@ dependencies = [ "parking_lot 0.12.1", "profiling", "range-alloc", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "renderdoc-sys", "smallvec", "thiserror", @@ -4285,7 +4062,25 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" dependencies = [ - "windows-targets 0.42.1", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -4301,15 +4096,6 @@ dependencies = [ "windows_x86_64_msvc 0.36.1", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.1", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4321,17 +4107,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -4351,9 +4137,9 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" @@ -4369,9 +4155,9 @@ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" @@ -4387,9 +4173,9 @@ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" @@ -4405,9 +4191,9 @@ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" @@ -4423,9 +4209,9 @@ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" @@ -4435,9 +4221,9 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" @@ -4453,9 +4239,9 @@ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" @@ -4485,7 +4271,7 @@ dependencies = [ "parking_lot 0.12.1", "percent-encoding", "raw-window-handle 0.4.3", - "raw-window-handle 0.5.0", + "raw-window-handle 0.5.2", "sctk-adwaita", "smithay-client-toolkit", "wasm-bindgen", @@ -4496,6 +4282,15 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "winnow" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -4572,12 +4367,3 @@ name = "xmlparser" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] diff --git a/README.md b/README.md index 31f7a5e3..8a237cfc 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,34 @@ You can install Sniffnet in one of the following ways: You can install Sniffnet through the installers available in the [latest release](https://github.com/GyulyVGC/sniffnet/releases).
Choose from a Windows installer, a macOS disk image, a DEB package, or an RPM package (depending on your operating system).
Here for your convenience you can find the direct link to the downloads: + - [Windows](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows.msi) (13.1 MB) - [macOS](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_MacOS.dmg) (12.4 MB) - [Linux (DEB)](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux.deb) (9.2 MB) - [Linux (RPM)](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux.rpm) (11.4 MB) + ### Windows + + - [Windows 64-bit](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows_64-bit.msi) + - [Windows 32-bit](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows_32-bit.msi) + + ### macOS + + - [macOS Intel](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_Intel.dmg) + - [macOS Apple Silicon](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_AppleSilicon.msi) + + ### Linux Debian-based + + - [Linux amd64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_amd64.deb) + - [Linux arm64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_arm64.deb) + - [Linux i386](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_i386.deb) + - [Linux armhf](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_armhf.deb) + +### Linux RPM-based + + - [Linux x86_64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_x86_64.rpm) + - [Linux aarch64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_aarch64.rpm) + @@ -128,7 +151,7 @@ Depending on your operating system, you may need to install some dependencies to - Download the [Npcap SDK](https://npcap.com/#download). - - Add the SDK's ```/Lib/x64``` folder to your ```LIB``` environment variable. + - Add the SDK's ```/Lib/x64``` (or ```/Lib```) folder to your ```LIB``` environment variable. From 51f87e67e4556467e0efe82e5f50928b98b3ab8c Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Wed, 7 Jun 2023 17:23:55 +0200 Subject: [PATCH 14/23] correct windows artifact names --- .github/workflows/package.yml | 5 ++--- README.md | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index afc09c23..3bc8ab1b 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -301,7 +301,6 @@ jobs: - name: Package for Microsoft Windows shell: powershell run: | - $VERSION=(toml get Cargo.toml package.version --raw) $targets=@( "i686-pc-windows-msvc", "x86_64-pc-windows-msvc" @@ -310,8 +309,8 @@ jobs: foreach ($target in $targets) { cargo wix --no-build --nocapture --target $target - Move-Item -Path target\wix\sniffnet-$VERSION-x86.msi -Destination .\artifacts\Sniffnet_Windows_32-bit.msi - Move-Item -Path target\wix\sniffnet-$VERSION-x86_64.msi -Destination .\artifacts\Sniffnet_Windows_64-bit.msi + Move-Item -Path target\wix\sniffnet-*-x86.msi -Destination .\artifacts\Sniffnet_Windows_32-bit.msi + Move-Item -Path target\wix\sniffnet-*-x86_64.msi -Destination .\artifacts\Sniffnet_Windows_64-bit.msi } - name: Upload package artifacts diff --git a/README.md b/README.md index 8a237cfc..8fdc9cee 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ You can install Sniffnet in one of the following ways: ### macOS - [macOS Intel](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_Intel.dmg) - - [macOS Apple Silicon](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_AppleSilicon.msi) + - [macOS Apple Silicon](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_AppleSilicon.dmg) ### Linux Debian-based From a2953dd5cd04e0546d853d67f7237042a1af91e7 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Wed, 7 Jun 2023 17:35:25 +0200 Subject: [PATCH 15/23] rename macOS artifacts --- .github/workflows/package.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 3bc8ab1b..7cb3efd9 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -255,9 +255,11 @@ jobs: --app-drop-link 620 240 \ --icon "Sniffnet.app" 300 240 \ --hide-extension "Sniffnet.app" \ - "artifacts/sniffnet-${VERSION}-${target%%-*}.dmg" \ + "artifacts/sniffnet-${target%%-*}.dmg" \ "target/${target}/release/bundle/osx/" done + mv artifacts/sniffnet-x86_64.dmg artifacts/Sniffnet_macOS_Intel.dmg + mv artifacts/sniffnet-aarch64.dmg artifacts/Sniffnet_macOS_AppleSilicon.dmg - name: Upload package artifacts uses: actions/upload-artifact@v3 From 929ea298c5cb558b2013ffd9c1d644ebc39f28cb Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Wed, 7 Jun 2023 18:53:50 +0200 Subject: [PATCH 16/23] rename Linux artifacts --- .github/workflows/package.yml | 6 ++++++ README.md | 16 ++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 7cb3efd9..47d79fef 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -149,6 +149,10 @@ jobs: cargo deb --no-build --no-strip --target $target mv target/${target}/debian/*.deb artifacts/ done + mv artifacts/sniffnet*amd64.deb artifacts/Sniffnet_LinuxDEB_amd64.deb + mv artifacts/sniffnet*arm64.deb artifacts/Sniffnet_LinuxDEB_arm64.deb + mv artifacts/sniffnet*i386.deb artifacts/Sniffnet_LinuxDEB_i386.deb + mv artifacts/sniffnet*armhf.deb artifacts/Sniffnet_LinuxDEB_armhf.deb - name: Upload package artifacts uses: actions/upload-artifact@v3 @@ -196,6 +200,8 @@ jobs: cargo generate-rpm --target $target mv target/${target}/generate-rpm/*.rpm artifacts/ done + mv artifacts/sniffnet-*x86_64.rpm artifacts/Sniffnet_LinuxRPM_x86_64.rpm + mv artifacts/sniffnet-*aarch64.rpm artifacts/Sniffnet_LinuxRPM_aarch64.rpm - name: Upload package artifacts uses: actions/upload-artifact@v3 diff --git a/README.md b/README.md index 8fdc9cee..537de76e 100644 --- a/README.md +++ b/README.md @@ -83,17 +83,17 @@ You can install Sniffnet in one of the following ways: - [macOS Intel](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_Intel.dmg) - [macOS Apple Silicon](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_macOS_AppleSilicon.dmg) - ### Linux Debian-based + ### Linux DEB-based - - [Linux amd64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_amd64.deb) - - [Linux arm64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_arm64.deb) - - [Linux i386](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_i386.deb) - - [Linux armhf](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_armhf.deb) + - [Linux amd64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_amd64.deb) + - [Linux arm64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_arm64.deb) + - [Linux i386](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_i386.deb) + - [Linux armhf](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_armhf.deb) ### Linux RPM-based - - [Linux x86_64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_x86_64.rpm) - - [Linux aarch64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux_aarch64.rpm) + - [Linux x86_64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxRPM_x86_64.rpm) + - [Linux aarch64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxRPM_aarch64.rpm) @@ -160,7 +160,7 @@ Depending on your operating system, you may need to install some dependencies to Linux dependencies  - - On [Debian-based](https://en.wikipedia.org/wiki/List_of_Linux_distributions#Debian-based) distributions: + - On [DEB-based](https://en.wikipedia.org/wiki/List_of_Linux_distributions#Debian-based) distributions: - `libpcap-dev` - `libasound2-dev` - `libfontconfig1` From 99c7b7e0638937bbf5cb1d750824fa56214148b6 Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 20:25:20 +0200 Subject: [PATCH 17/23] Optimized macOS packaging --- .github/workflows/package.yml | 17 +++++++++-------- Cargo.toml | 10 ---------- resources/packaging/macos/Info.plist | 1 + 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 8c583f9f..e1e7267f 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -222,7 +222,7 @@ jobs: - name: Install packaging tools run: | - cargo install cargo-bundle toml-cli + cargo install toml-cli brew install create-dmg - uses: actions/download-artifact@v3 @@ -235,20 +235,21 @@ jobs: run: | VERSION=$(toml get Cargo.toml package.version --raw) sed -i'.bak' -e "s/0\.0\.0/${VERSION}/g" -e "s/fffffff/${GITHUB_SHA:0:7}/g" resources/packaging/macos/Info.plist - cargo bundle --release targets=( x86_64-apple-darwin aarch64-apple-darwin ) mkdir artifacts for target in "${targets[@]}"; do - cp -R target/release/bundle target/${target}/release - cp -f target/${target}/release/sniffnet \ - target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/sniffnet - cp resources/packaging/macos/wrapper.sh \ - target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/wrapper.sh + mkdir -p target/${target}/release/bundle/osx/Sniffnet.app/Contents/{MacOS,Resources} cp resources/packaging/macos/Info.plist \ - target/${target}/release/bundle/osx/Sniffnet.app/Contents/Info.plist + target/${target}/release/bundle/osx/Sniffnet.app/Contents/ + cp resources/packaging/macos/graphics/sniffnet.icns \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/Resources/ + cp target/${target}/release/sniffnet \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/ + cp resources/packaging/macos/wrapper.sh \ + target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/ create-dmg \ --volname "Sniffnet Installer" \ --background "resources/packaging/macos/graphics/dmg_bg.png" \ diff --git a/Cargo.toml b/Cargo.toml index 4c1e8e26..c0ace2f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -152,15 +152,5 @@ fontconfig = "*" #─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -[package.metadata.bundle] -name = "Sniffnet" -category = "Utilities" -identifier = "io.github.gyulyvgc.sniffnet" -icon = [ - "resources/packaging/macos/graphics/sniffnet.icns" -] - -#─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - [package.metadata.wix] include = [".\\resources\\packaging\\windows\\setup.wxs"] diff --git a/resources/packaging/macos/Info.plist b/resources/packaging/macos/Info.plist index d0066964..e7a4b7ee 100644 --- a/resources/packaging/macos/Info.plist +++ b/resources/packaging/macos/Info.plist @@ -13,6 +13,7 @@ CFBundleShortVersionString0.0.0 CFBundleVersionfffffff CSResourcesFileMapped + LSApplicationCategoryTypepublic.app-category.utilities LSRequiresCarbon NSHighResolutionCapable From a34835fa46c72fa3cb6ee7b1031fdc5faa806b3c Mon Sep 17 00:00:00 2001 From: "The Artifex (4r7if3x)" Date: Wed, 7 Jun 2023 18:37:49 +0200 Subject: [PATCH 18/23] Adjusted .desktop file --- resources/packaging/linux/sniffnet.desktop | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/packaging/linux/sniffnet.desktop b/resources/packaging/linux/sniffnet.desktop index e5216212..d15e41ca 100644 --- a/resources/packaging/linux/sniffnet.desktop +++ b/resources/packaging/linux/sniffnet.desktop @@ -3,8 +3,8 @@ Version=1.0 Type=Application Name=Sniffnet Comment=Application to comfortably monitor your network traffic -Categories=Network; +Categories=Network;Utility; Icon=sniffnet -Exec=/usr/bin/sniffnet +Exec=sniffnet StartupWMClass=sniffnet Terminal=false From 91a99e557b86fef25d36b890f2b8582a8cc2a1cd Mon Sep 17 00:00:00 2001 From: Giuliano Bellini <100347457+GyulyVGC@users.noreply.github.com> Date: Wed, 7 Jun 2023 22:37:43 +0200 Subject: [PATCH 19/23] Update sniffnet.desktop --- resources/packaging/linux/sniffnet.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/packaging/linux/sniffnet.desktop b/resources/packaging/linux/sniffnet.desktop index d15e41ca..aa20a3ae 100644 --- a/resources/packaging/linux/sniffnet.desktop +++ b/resources/packaging/linux/sniffnet.desktop @@ -5,6 +5,6 @@ Name=Sniffnet Comment=Application to comfortably monitor your network traffic Categories=Network;Utility; Icon=sniffnet -Exec=sniffnet +Exec=/usr/bin/sniffnet StartupWMClass=sniffnet Terminal=false From cda78943944397da3cb82edde7ad8d2344faab1e Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 8 Jun 2023 10:55:14 +0200 Subject: [PATCH 20/23] update version, CHANGELOG, and docs --- .github/workflows/package.yml | 12 ++++++------ CHANGELOG.md | 10 ++++++---- Cargo.lock | 14 +++++++------- Cargo.toml | 2 +- README.md | 15 +++++---------- 5 files changed, 25 insertions(+), 28 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index b1df2235..925f4065 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -200,8 +200,8 @@ jobs: cargo generate-rpm --target $target mv target/${target}/generate-rpm/*.rpm artifacts/ done - mv artifacts/sniffnet-*x86_64.rpm artifacts/Sniffnet_LinuxRPM_x86_64.rpm - mv artifacts/sniffnet-*aarch64.rpm artifacts/Sniffnet_LinuxRPM_aarch64.rpm + mv artifacts/sniffnet*x86_64.rpm artifacts/Sniffnet_LinuxRPM_x86_64.rpm + mv artifacts/sniffnet*aarch64.rpm artifacts/Sniffnet_LinuxRPM_aarch64.rpm - name: Upload package artifacts uses: actions/upload-artifact@v3 @@ -265,8 +265,8 @@ jobs: "artifacts/sniffnet-${target%%-*}.dmg" \ "target/${target}/release/bundle/osx/" done - mv artifacts/sniffnet-x86_64.dmg artifacts/Sniffnet_macOS_Intel.dmg - mv artifacts/sniffnet-aarch64.dmg artifacts/Sniffnet_macOS_AppleSilicon.dmg + mv artifacts/sniffnet*x86_64.dmg artifacts/Sniffnet_macOS_Intel.dmg + mv artifacts/sniffnet*aarch64.dmg artifacts/Sniffnet_macOS_AppleSilicon.dmg - name: Upload package artifacts uses: actions/upload-artifact@v3 @@ -318,8 +318,8 @@ jobs: foreach ($target in $targets) { cargo wix --no-build --nocapture --target $target - Move-Item -Path target\wix\sniffnet-*-x86.msi -Destination .\artifacts\Sniffnet_Windows_32-bit.msi - Move-Item -Path target\wix\sniffnet-*-x86_64.msi -Destination .\artifacts\Sniffnet_Windows_64-bit.msi + Move-Item -Path target\wix\sniffnet*x86.msi -Destination .\artifacts\Sniffnet_Windows_32-bit.msi + Move-Item -Path target\wix\sniffnet*x86_64.msi -Destination .\artifacts\Sniffnet_Windows_64-bit.msi } - name: Upload package artifacts diff --git a/CHANGELOG.md b/CHANGELOG.md index 21badab9..2e254c55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,16 @@ All Sniffnet releases with the relative changes are documented in this file. -## UNRELEASED +## [1.2.1] - 2023-06-xx +- Considerably improved the app packaging strategy (see [#246](https://github.com/GyulyVGC/sniffnet/pull/246) for more details), fixing various related issues ([#199](https://github.com/GyulyVGC/sniffnet/issues/199), [#220](https://github.com/GyulyVGC/sniffnet/issues/220), [#223](https://github.com/GyulyVGC/sniffnet/issues/223), [#224](https://github.com/GyulyVGC/sniffnet/issues/224), [#225](https://github.com/GyulyVGC/sniffnet/issues/225), [#242](https://github.com/GyulyVGC/sniffnet/issues/242)) - Added Swedish translation 🇸🇪 ([#213](https://github.com/GyulyVGC/sniffnet/pull/213)) -- URLs update... -- Updated existing translations to v1.2 (German, Spanish, Persian, Korean, Russian, Turkish, Ukrainian, and Chinese) +- Updated existing translations to v1.2 (German - [#191](https://github.com/GyulyVGC/sniffnet/pull/191), Spanish - [#203](https://github.com/GyulyVGC/sniffnet/pull/203), Persian - [#193](https://github.com/GyulyVGC/sniffnet/pull/193), Korean - [#205](https://github.com/GyulyVGC/sniffnet/pull/205), Polish - [#244](https://github.com/GyulyVGC/sniffnet/pull/244), Romanian - [#241](https://github.com/GyulyVGC/sniffnet/pull/241), Russian - [#187](https://github.com/GyulyVGC/sniffnet/pull/187), Turkish - [#192](https://github.com/GyulyVGC/sniffnet/pull/192), Ukrainian - [#216](https://github.com/GyulyVGC/sniffnet/pull/216), and Chinese - [#214](https://github.com/GyulyVGC/sniffnet/pull/214)) - Renamed "Administrative entity" to "Autonomous System name" to avoid confusion - Improved filter columns relative width to avoid the "Application protocol" label being cut when displayed in Swedish -- Updated docs including installation instruction for Aarch Linux +- Footer URLs have been updated to include links to Sniffnet's official website and GitHub Sponsor page +- Updated docs including installation instruction for Aarch Linux ([#185](https://github.com/GyulyVGC/sniffnet/pull/185)) +- Minor improvements to code readability ([#248](https://github.com/GyulyVGC/sniffnet/pull/248)) and docs (([#235](https://github.com/GyulyVGC/sniffnet/pull/235))) ## [1.2.0] - 2023-05-18 diff --git a/Cargo.lock b/Cargo.lock index f631d4f6..6bfd984c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2544,9 +2544,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] @@ -2981,18 +2981,18 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", @@ -3125,7 +3125,7 @@ dependencies = [ [[package]] name = "sniffnet" -version = "1.2.0" +version = "1.2.1" dependencies = [ "chrono", "confy", diff --git a/Cargo.toml b/Cargo.toml index c0ace2f7..318af2a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sniffnet" -version = "1.2.0" +version = "1.2.1" authors = [ "Giuliano Bellini" ] edition = "2021" description = "Application to comfortably monitor your network traffic" diff --git a/README.md b/README.md index 537de76e..9a8504e4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Multithreaded, cross-platform, reliable
Graphical interface translated in:
-🇬🇧  🇩🇪  🇬🇷  🇪🇦  🇮🇷  🇫🇷  🇮🇹  🇰🇷  🇵🇱  🇵🇹  🇷🇴  🇷🇺  🇹🇷  🇺🇦  🇨🇳
+🇬🇧  🇩🇪  🇬🇷  🇪🇦  🇮🇷  🇫🇷  🇮🇹  🇰🇷  🇵🇱  🇵🇹  🇷🇴  🇷🇺  🇸🇪  🇹🇷  🇺🇦  🇨🇳
@@ -68,15 +68,10 @@ You can install Sniffnet in one of the following ways: Choose from a Windows installer, a macOS disk image, a DEB package, or an RPM package (depending on your operating system).
Here for your convenience you can find the direct link to the downloads: - - [Windows](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows.msi) (13.1 MB) - - [macOS](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_MacOS.dmg) (12.4 MB) - - [Linux (DEB)](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux.deb) (9.2 MB) - - [Linux (RPM)](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Linux.rpm) (11.4 MB) - ### Windows - [Windows 64-bit](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows_64-bit.msi) - - [Windows 32-bit](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows_32-bit.msi) + - [Windows 32-bit](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_Windows_32-bit.msi) (only for older architectures) ### macOS @@ -87,8 +82,8 @@ You can install Sniffnet in one of the following ways: - [Linux amd64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_amd64.deb) - [Linux arm64](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_arm64.deb) - - [Linux i386](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_i386.deb) - - [Linux armhf](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_armhf.deb) + - [Linux i386](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_i386.deb) (only for older architectures) + - [Linux armhf](https://github.com/GyulyVGC/sniffnet/releases/latest/download/Sniffnet_LinuxDEB_armhf.deb) (only for older architectures) ### Linux RPM-based @@ -163,7 +158,7 @@ Depending on your operating system, you may need to install some dependencies to - On [DEB-based](https://en.wikipedia.org/wiki/List_of_Linux_distributions#Debian-based) distributions: - `libpcap-dev` - `libasound2-dev` - - `libfontconfig1` + - `libfontconfig1-dev` - On [RPM-based](https://en.wikipedia.org/wiki/List_of_Linux_distributions#RPM-based) distributions: - `libpcap-devel` - `alsa-lib-devel` From e74e6ec76568dfb15e95c0ef29f31c1ad3fd6cd2 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 8 Jun 2023 12:05:22 +0200 Subject: [PATCH 21/23] update docs --- CHANGELOG.md | 21 ++++++++++++++++++--- README.md | 4 ++-- src/countries/country_utils.rs | 13 +++++++------ src/notifications/types/notifications.rs | 16 ++++++++-------- src/translations/types/language.rs | 7 ++++--- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e254c55..c5bf7d0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,14 +5,29 @@ All Sniffnet releases with the relative changes are documented in this file. ## [1.2.1] - 2023-06-xx -- Considerably improved the app packaging strategy (see [#246](https://github.com/GyulyVGC/sniffnet/pull/246) for more details), fixing various related issues ([#199](https://github.com/GyulyVGC/sniffnet/issues/199), [#220](https://github.com/GyulyVGC/sniffnet/issues/220), [#223](https://github.com/GyulyVGC/sniffnet/issues/223), [#224](https://github.com/GyulyVGC/sniffnet/issues/224), [#225](https://github.com/GyulyVGC/sniffnet/issues/225), [#242](https://github.com/GyulyVGC/sniffnet/issues/242)) +- Considerably refined the app packaging strategy (see [#246](https://github.com/GyulyVGC/sniffnet/pull/246) for more details), fixing various related issues ([#199](https://github.com/GyulyVGC/sniffnet/issues/199), [#220](https://github.com/GyulyVGC/sniffnet/issues/220), [#223](https://github.com/GyulyVGC/sniffnet/issues/223), [#224](https://github.com/GyulyVGC/sniffnet/issues/224), [#225](https://github.com/GyulyVGC/sniffnet/issues/225), [#242](https://github.com/GyulyVGC/sniffnet/issues/242)) +- Added button to clear all the current search filters quickly in inspect page - Added Swedish translation 🇸🇪 ([#213](https://github.com/GyulyVGC/sniffnet/pull/213)) -- Updated existing translations to v1.2 (German - [#191](https://github.com/GyulyVGC/sniffnet/pull/191), Spanish - [#203](https://github.com/GyulyVGC/sniffnet/pull/203), Persian - [#193](https://github.com/GyulyVGC/sniffnet/pull/193), Korean - [#205](https://github.com/GyulyVGC/sniffnet/pull/205), Polish - [#244](https://github.com/GyulyVGC/sniffnet/pull/244), Romanian - [#241](https://github.com/GyulyVGC/sniffnet/pull/241), Russian - [#187](https://github.com/GyulyVGC/sniffnet/pull/187), Turkish - [#192](https://github.com/GyulyVGC/sniffnet/pull/192), Ukrainian - [#216](https://github.com/GyulyVGC/sniffnet/pull/216), and Chinese - [#214](https://github.com/GyulyVGC/sniffnet/pull/214)) +- Updated most of the existing translations to v1.2: + - German - [#191](https://github.com/GyulyVGC/sniffnet/pull/191) + - Spanish - [#203](https://github.com/GyulyVGC/sniffnet/pull/203) + - Persian - [#193](https://github.com/GyulyVGC/sniffnet/pull/193) + - Korean - [#205](https://github.com/GyulyVGC/sniffnet/pull/205) + - Polish - [#244](https://github.com/GyulyVGC/sniffnet/pull/244) + - Romanian - [#241](https://github.com/GyulyVGC/sniffnet/pull/241) + - Russian - [#187](https://github.com/GyulyVGC/sniffnet/pull/187) + - Turkish - [#192](https://github.com/GyulyVGC/sniffnet/pull/192) + - Ukrainian - [#216](https://github.com/GyulyVGC/sniffnet/pull/216) + - Chinese - [#214](https://github.com/GyulyVGC/sniffnet/pull/214) - Renamed "Administrative entity" to "Autonomous System name" to avoid confusion - Improved filter columns relative width to avoid the "Application protocol" label being cut when displayed in Swedish - Footer URLs have been updated to include links to Sniffnet's official website and GitHub Sponsor page - Updated docs including installation instruction for Aarch Linux ([#185](https://github.com/GyulyVGC/sniffnet/pull/185)) -- Minor improvements to code readability ([#248](https://github.com/GyulyVGC/sniffnet/pull/248)) and docs (([#235](https://github.com/GyulyVGC/sniffnet/pull/235))) +- Minor improvements to packets and bytes number format +- Minor improvements to: + - code readability ([#248](https://github.com/GyulyVGC/sniffnet/pull/248)) + - docs ([#235](https://github.com/GyulyVGC/sniffnet/pull/235)) +- Solved a minor problem that caused flags to be slightly misaligned in inspect page table ## [1.2.0] - 2023-05-18 diff --git a/README.md b/README.md index 9a8504e4..994ba1d6 100644 --- a/README.md +++ b/README.md @@ -64,9 +64,9 @@ You can install Sniffnet in one of the following ways: from GitHub releases  - You can install Sniffnet through the installers available in the [latest release](https://github.com/GyulyVGC/sniffnet/releases).
+ You can install Sniffnet through the installers available in the [latest release](https://github.com/GyulyVGC/sniffnet/releases/latest).
Choose from a Windows installer, a macOS disk image, a DEB package, or an RPM package (depending on your operating system).
- Here for your convenience you can find the direct link to the downloads: + Below, for your convenience, you can find the direct link to the downloads. ### Windows diff --git a/src/countries/country_utils.rs b/src/countries/country_utils.rs index 224f4821..decd1367 100644 --- a/src/countries/country_utils.rs +++ b/src/countries/country_utils.rs @@ -1,3 +1,10 @@ +use iced::widget::Tooltip; +use iced::{Length, Renderer}; +use iced_native::svg::Handle; +use iced_native::widget::tooltip::Position; +use iced_native::widget::Svg; +use maxminddb::{geoip2, MaxMindDBError, Reader}; + use crate::countries::flags_pictures::{ AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BROADCAST, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, @@ -22,12 +29,6 @@ use crate::translations::translations_2::{ local_translation, unknown_translation, your_network_adapter_translation, }; use crate::{Language, StyleType}; -use iced::widget::Tooltip; -use iced::{Length, Renderer}; -use iced_native::svg::Handle; -use iced_native::widget::tooltip::Position; -use iced_native::widget::Svg; -use maxminddb::{geoip2, MaxMindDBError, Reader}; pub const COUNTRY_MMDB: &[u8] = include_bytes!("../../resources/DB/GeoLite2-Country.mmdb"); diff --git a/src/notifications/types/notifications.rs b/src/notifications/types/notifications.rs index 24d66b6b..e3eff629 100644 --- a/src/notifications/types/notifications.rs +++ b/src/notifications/types/notifications.rs @@ -179,17 +179,17 @@ mod tests { use super::*; #[rstest] - #[case("123", BytesNotification { + #[case("123", BytesNotification { previous_threshold: 123, threshold: Some(123), byte_multiple: ByteMultiple::B, ..BytesNotification::default() })] - #[case("500k", BytesNotification { + #[case("500k", BytesNotification { previous_threshold: 500_000, threshold: Some(500_000),byte_multiple: ByteMultiple::KB, ..BytesNotification::default() })] - #[case("420 m", BytesNotification { + #[case("420 m", BytesNotification { previous_threshold: 420_000_000, threshold: Some(420_000_000),byte_multiple: ByteMultiple::MB, ..BytesNotification::default() })] #[case("foob@r", BytesNotification{ threshold: Some(800000), ..Default::default() })] - #[case(" 888 g", BytesNotification { + #[case(" 888 g", BytesNotification { previous_threshold: 888_000_000_000, threshold: Some(888_000_000_000),byte_multiple: ByteMultiple::GB, ..BytesNotification::default() })] fn test_can_instantiate_bytes_notification_from_string( #[case] input: &str, @@ -252,18 +252,18 @@ mod tests { } #[rstest] - #[case("123", PacketsNotification { + #[case("123", PacketsNotification { previous_threshold: 123, threshold: Some(123), ..PacketsNotification::default() })] - #[case("8888", PacketsNotification { + #[case("8888", PacketsNotification { previous_threshold: 8888, threshold: Some(8888), ..PacketsNotification::default() })] - #[case("420 m", PacketsNotification { + #[case("420 m", PacketsNotification { threshold: Some(750), ..PacketsNotification::default() })] - #[case("foob@r", PacketsNotification { + #[case("foob@r", PacketsNotification { threshold: Some(750), ..PacketsNotification::default() })] fn test_can_instantiate_packet_notification_from_string( diff --git a/src/translations/types/language.rs b/src/translations/types/language.rs index d2bb9deb..4e3554bc 100644 --- a/src/translations/types/language.rs +++ b/src/translations/types/language.rs @@ -1,11 +1,12 @@ -use crate::countries::flags_pictures::{ - CN, DE, ES, FLAGS_WIDTH_SMALL, FR, GB, GR, IR, IT, KR, PL, PT, RO, RU, SE, TR, UA, -}; use iced::{Length, Renderer}; use iced_native::svg::Handle; use iced_native::widget::Svg; use serde::{Deserialize, Serialize}; +use crate::countries::flags_pictures::{ + CN, DE, ES, FLAGS_WIDTH_SMALL, FR, GB, GR, IR, IT, KR, PL, PT, RO, RU, SE, TR, UA, +}; + /// This enum defines the available languages. #[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize, Hash)] pub enum Language { From 492b154266d625ae3eb696b663e3cbe1fe267ec3 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 8 Jun 2023 14:41:28 +0200 Subject: [PATCH 22/23] preparing for v1.2.1 release --- CHANGELOG.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5bf7d0c..0ebc6347 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All Sniffnet releases with the relative changes are documented in this file. -## [1.2.1] - 2023-06-xx +## [1.2.1] - 2023-06-08 - Considerably refined the app packaging strategy (see [#246](https://github.com/GyulyVGC/sniffnet/pull/246) for more details), fixing various related issues ([#199](https://github.com/GyulyVGC/sniffnet/issues/199), [#220](https://github.com/GyulyVGC/sniffnet/issues/220), [#223](https://github.com/GyulyVGC/sniffnet/issues/223), [#224](https://github.com/GyulyVGC/sniffnet/issues/224), [#225](https://github.com/GyulyVGC/sniffnet/issues/225), [#242](https://github.com/GyulyVGC/sniffnet/issues/242)) - Added button to clear all the current search filters quickly in inspect page diff --git a/README.md b/README.md index 994ba1d6..797f457c 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ You can install Sniffnet in one of the following ways: You can install Sniffnet through the installers available in the [latest release](https://github.com/GyulyVGC/sniffnet/releases/latest).
Choose from a Windows installer, a macOS disk image, a DEB package, or an RPM package (depending on your operating system).
- Below, for your convenience, you can find the direct link to the downloads. + Below, for your convenience, you can find the direct links to the downloads. ### Windows From 614db99e919486d17276a4ca6d3e4e72f6289547 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 Date: Thu, 8 Jun 2023 15:32:42 +0200 Subject: [PATCH 23/23] chmod +x is needed for macOS bundle --- .github/workflows/package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 925f4065..c74d0b56 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -249,6 +249,7 @@ jobs: target/${target}/release/bundle/osx/Sniffnet.app/Contents/ cp resources/packaging/macos/graphics/sniffnet.icns \ target/${target}/release/bundle/osx/Sniffnet.app/Contents/Resources/ + chmod +x target/${target}/release/sniffnet cp target/${target}/release/sniffnet \ target/${target}/release/bundle/osx/Sniffnet.app/Contents/MacOS/ cp resources/packaging/macos/wrapper.sh \