From a9792cd781f8784c25fa80f8f32d992dc54ec163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Tue, 30 Jun 2026 13:07:56 +0200 Subject: [PATCH 01/12] Build for macOS installer --- package.json | 24 +- pnpm-lock.yaml | 551 +++++++++--------- src-tauri/Cargo.lock | 27 +- src-tauri/Cargo.toml | 1 + src-tauri/Installer.entitlements | 24 + src-tauri/build.rs | 6 + src-tauri/src/bin/defguard-client.rs | 7 + src-tauri/src/commands.rs | 1 + src-tauri/src/lib.rs | 2 + src-tauri/src/system_extension.rs | 120 ++++ src-tauri/tauri.pkg.conf.json | 11 + .../VPNExtension.xcodeproj/project.pbxproj | 147 ++++- ...ion.entitlements => AppStore.entitlements} | 0 .../VPNExtension/Installer.entitlements | 18 + 14 files changed, 633 insertions(+), 306 deletions(-) create mode 100644 src-tauri/Installer.entitlements create mode 100644 src-tauri/src/system_extension.rs create mode 100644 src-tauri/tauri.pkg.conf.json rename swift/extension/VPNExtension/{VPNExtension.entitlements => AppStore.entitlements} (100%) create mode 100644 swift/extension/VPNExtension/Installer.entitlements diff --git a/package.json b/package.json index 4b621c503..69d6679f3 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "@react-hook/resize-observer": "^2.0.2", "@stablelib/base64": "^2.0.1", "@stablelib/x25519": "^2.0.1", - "@tanstack/query-core": "^5.101.1", - "@tanstack/react-virtual": "^3.14.3", + "@tanstack/query-core": "^5.101.2", + "@tanstack/react-virtual": "^3.14.4", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-deep-link": "^2.4.9", @@ -69,11 +69,11 @@ "get-text-width": "^1.0.3", "html-react-parser": "^6.1.3", "itertools": "^2.7.1", - "js-base64": "^3.7.8", + "js-base64": "^3.8.0", "lodash-es": "^4.18.1", "merge-refs": "^2.0.0", "millify": "^6.1.0", - "motion": "^12.41.0", + "motion": "^12.42.0", "p-timeout": "^7.0.1", "prop-types": "^15.8.1", "radash": "^12.1.1", @@ -82,7 +82,7 @@ "react-click-away-listener": "^2.4.2", "react-dom": "^19.2.7", "react-hook-form": "^7.80.0", - "react-hotkeys-hook": "^5.3.2", + "react-hotkeys-hook": "^5.3.3", "react-loading-skeleton": "^3.5.0", "react-markdown": "^10.1.0", "react-qr-code": "^2.2.0", @@ -100,9 +100,9 @@ "@biomejs/biome": "2.4.16", "@hookform/devtools": "^4.4.0", "@svgr/cli": "^8.1.0", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", - "@tauri-apps/cli": "^2.11.3", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", + "@tauri-apps/cli": "^2.11.4", "@types/file-saver": "^2.0.7", "@types/lodash-es": "^4.17.12", "@types/node": "^25.9.4", @@ -110,15 +110,15 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.2.0", "@vitejs/plugin-react-swc": "^4.3.1", - "autoprefixer": "^10.5.1", + "autoprefixer": "^10.5.2", "npm-run-all": "^4.1.5", - "postcss": "^8.5.15", - "prettier": "^3.8.4", + "postcss": "^8.5.16", + "prettier": "^3.9.1", "sass": "~1.92.1", "typedoc": "^0.28.19", "typesafe-i18n": "^5.27.1", "typescript": "^6.0.3", - "vite": "^7.3.5" + "vite": "^7.3.6" }, "volta": { "node": "20.5.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 042e995dd..8944e9d6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,11 +24,11 @@ importers: specifier: ^2.0.1 version: 2.0.1 '@tanstack/query-core': - specifier: ^5.101.1 - version: 5.101.1 + specifier: ^5.101.2 + version: 5.101.2 '@tanstack/react-virtual': - specifier: ^3.14.3 - version: 3.14.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^3.14.4 + version: 3.14.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tauri-apps/api': specifier: ^2.11.1 version: 2.11.1 @@ -108,8 +108,8 @@ importers: specifier: ^2.7.1 version: 2.7.1 js-base64: - specifier: ^3.7.8 - version: 3.7.8 + specifier: ^3.8.0 + version: 3.8.0 lodash-es: specifier: ^4.18.1 version: 4.18.1 @@ -120,8 +120,8 @@ importers: specifier: ^6.1.0 version: 6.1.0 motion: - specifier: ^12.41.0 - version: 12.41.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^12.42.0 + version: 12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) p-timeout: specifier: ^7.0.1 version: 7.0.1 @@ -147,8 +147,8 @@ importers: specifier: ^7.80.0 version: 7.80.0(react@19.2.7) react-hotkeys-hook: - specifier: ^5.3.2 - version: 5.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^5.3.3 + version: 5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react-loading-skeleton: specifier: ^3.5.0 version: 3.5.0(react@19.2.7) @@ -196,14 +196,14 @@ importers: specifier: ^8.1.0 version: 8.1.0(typescript@6.0.3) '@tanstack/react-query': - specifier: ^5.101.1 - version: 5.101.1(react@19.2.7) + specifier: ^5.101.2 + version: 5.101.2(react@19.2.7) '@tanstack/react-query-devtools': - specifier: ^5.101.1 - version: 5.101.1(@tanstack/react-query@5.101.1(react@19.2.7))(react@19.2.7) + specifier: ^5.101.2 + version: 5.101.2(@tanstack/react-query@5.101.2(react@19.2.7))(react@19.2.7) '@tauri-apps/cli': - specifier: ^2.11.3 - version: 2.11.3 + specifier: ^2.11.4 + version: 2.11.4 '@types/file-saver': specifier: ^2.0.7 version: 2.0.7 @@ -221,22 +221,22 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^5.2.0 - version: 5.2.0(vite@7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0)) + version: 5.2.0(vite@7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0)) '@vitejs/plugin-react-swc': specifier: ^4.3.1 - version: 4.3.1(vite@7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0)) + version: 4.3.1(vite@7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0)) autoprefixer: - specifier: ^10.5.1 - version: 10.5.1(postcss@8.5.15) + specifier: ^10.5.2 + version: 10.5.2(postcss@8.5.16) npm-run-all: specifier: ^4.1.5 version: 4.1.5 postcss: - specifier: ^8.5.15 - version: 8.5.15 + specifier: ^8.5.16 + version: 8.5.16 prettier: - specifier: ^3.8.4 - version: 3.8.4 + specifier: ^3.9.1 + version: 3.9.1 sass: specifier: ~1.92.1 version: 1.92.1 @@ -250,8 +250,8 @@ importers: specifier: ^6.0.3 version: 6.0.3 vite: - specifier: ^7.3.5 - version: 7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) + specifier: ^7.3.6 + version: 7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) packages: @@ -453,158 +453,158 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1145,108 +1145,108 @@ packages: '@swc/types@0.1.27': resolution: {integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==} - '@tanstack/query-core@5.101.1': - resolution: {integrity: sha512-Y6Y92dkXtNqx67m2pMSxUsA3zOCwv862JexZRP8/EPwvKXMPu9m8rv43spiXWzOUIggQ3SQApttALStzhA8B4g==} + '@tanstack/query-core@5.101.2': + resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==} - '@tanstack/query-devtools@5.101.1': - resolution: {integrity: sha512-37RQ9U2PxlXQiv1era2t+uHgVhmiyvxqTMu30+KoVf0rufiucu6rpGRKFJk61Wh5OAZFKqCQd6lxTzFWfLZiuQ==} + '@tanstack/query-devtools@5.101.2': + resolution: {integrity: sha512-o+wHcqgN7Pp0s8v1i0UGq/ZrrEKrxdIiMQmKRdYb2w7NPtylYSJ4+wg/tIn71m9DLstwUwdEGAvROdly6HXP6w==} - '@tanstack/react-query-devtools@5.101.1': - resolution: {integrity: sha512-OXFR9XKdEslraq3cpl3kCUeNvTIq/xGWEZiFZdn2bLB/q4WxSALMEDKYZ5yYjMQytsfnQxwQYqV4qtVEf0nuog==} + '@tanstack/react-query-devtools@5.101.2': + resolution: {integrity: sha512-eU7HctdA9gDjqoERoEdzLbw9DiqnBDfh5+Hu0u26gjqoHJezOpQAuiesDL2VvkU+2cPV76zgv0tMZsOrI4LjnQ==} peerDependencies: - '@tanstack/react-query': ^5.101.1 + '@tanstack/react-query': ^5.101.2 react: ^18 || ^19 - '@tanstack/react-query@5.101.1': - resolution: {integrity: sha512-ZnONUuQKJe1bJMStXUL1s5uKN9FcfC28j5cK+iDZcdSHtUv1wtin1cGc/Oewhf2Oc4eKY7lggtpvT/AbMmhHew==} + '@tanstack/react-query@5.101.2': + resolution: {integrity: sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.14.3': - resolution: {integrity: sha512-k/cnHPVaOfn46hSbiY6n4Dzf4QjCGWSF40zR5QIIYUqPAjpA6TN7InfYmcMiDVQGP2iUn9xsRbAl8u1v3UmeVQ==} + '@tanstack/react-virtual@3.14.4': + resolution: {integrity: sha512-dZzAQP2uCDAd+9sAehqmx/DcU+B91Q4Gb0aDSM7t9bJvWDyGF9sapFNW5r1gNLsHs4wTb6ScZENJeYaHxJLiOw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.17.1': - resolution: {integrity: sha512-VZyW2Uiml5tmBZwPGrSD3Sz73OxzljQMCmzYHsUTPEuTsERf5xwa+uWb01xEzkz3ZSYTjj8NEb/mKHvgKxyZdA==} + '@tanstack/virtual-core@3.17.2': + resolution: {integrity: sha512-w43MvWvmShpb6kIC9MOoLyUkLmRTLPjt61bHWs+X29hACSpX+n8DvgZ3qM7cUfflKlRRcHR9KVJE6TmcqnQvcA==} '@tauri-apps/api@2.11.1': resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} - '@tauri-apps/cli-darwin-arm64@2.11.3': - resolution: {integrity: sha512-BxpaM8bsCoXs3wd4WKYhas/G1gs7+r7B+e4WnyRk2GEoVOouJB1hoL6E6YLXZDXbYci6VFdrNnobQwd2uVL4ew==} + '@tauri-apps/cli-darwin-arm64@2.11.4': + resolution: {integrity: sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.11.3': - resolution: {integrity: sha512-DbZYuPB1ZEzcAHYeyCvo3ltzM27+aXwPloCrtexPnmgPgulYJm3TOq6aC4S+wPhSXteddg8zImtNkvx/gQzmwg==} + '@tauri-apps/cli-darwin-x64@2.11.4': + resolution: {integrity: sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.3': - resolution: {integrity: sha512-741NduqBmz1XkdU8yz3OI/kBZtqHbvxo9F9ytIeWYU69/Ba9dcZEbqOU++Dp0G/XU8vAI0TfTywEl+p+BbLvaA==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': + resolution: {integrity: sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.11.3': - resolution: {integrity: sha512-RWAXT8pTqIczXcoic+LXlo6uEbAXGB0cgh6Pg7Y9xVnEbzryQ1JHtRGj9SxzrKSemBIDBH6Qc24kK2G69i8ofA==} + '@tauri-apps/cli-linux-arm64-gnu@2.11.4': + resolution: {integrity: sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@tauri-apps/cli-linux-arm64-musl@2.11.3': - resolution: {integrity: sha512-qomqYS+yAkd0gXMRmhguWXc7RfVN+XKKXaEwbf5QmKURwydLFOTldd6F8/WoZDSsBMrV8dpNxz0YneGLmobiSA==} + '@tauri-apps/cli-linux-arm64-musl@2.11.4': + resolution: {integrity: sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@tauri-apps/cli-linux-riscv64-gnu@2.11.3': - resolution: {integrity: sha512-jOCXbDqeDj5XcclsOBAaXjtTgwZCVg8zEZ+dbPUCoADOgljFgL0rOkYTc96vUYgOrYEfuHYihWMxIDGaD6GwJw==} + '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': + resolution: {integrity: sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@tauri-apps/cli-linux-x64-gnu@2.11.3': - resolution: {integrity: sha512-+u3HO/F3gHwL48t9gWN/urqZvpaEJzBFmTaq5eSIhvy8TOvnhb+LgJr3Q3BG+5JxuBrCUjqtOEz6gMttdJFSBA==} + '@tauri-apps/cli-linux-x64-gnu@2.11.4': + resolution: {integrity: sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@tauri-apps/cli-linux-x64-musl@2.11.3': - resolution: {integrity: sha512-spr5Jpr6KF/vehkLwJ0YmdGv8QwpWU+uw7J8bgijO0sox6ZCYsSNMbcsQjTqPi4xl+p0woIYpWXgChgHYpAc8g==} + '@tauri-apps/cli-linux-x64-musl@2.11.4': + resolution: {integrity: sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@tauri-apps/cli-win32-arm64-msvc@2.11.3': - resolution: {integrity: sha512-abkoRQih5xBa3vz2spWaex0kP/MzVzVPQHom2f8jnCq46R/luOD6Uy85EMU9/bfzf6ZzdorWJsgO+OMX90Fx2w==} + '@tauri-apps/cli-win32-arm64-msvc@2.11.4': + resolution: {integrity: sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.11.3': - resolution: {integrity: sha512-Vy6AvzFm1G40hg3r+OYDB3jkuu7R4wnMzbQBKuun9v6Cgg8IierpLL7toMzrZKs/8NlG8Sg4x1iLFR52oknyHg==} + '@tauri-apps/cli-win32-ia32-msvc@2.11.4': + resolution: {integrity: sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.11.3': - resolution: {integrity: sha512-GlciF75GdbseajOyib2aCHwE3BXIqZ1liGKWLFRvCdN5wm8h8hFssEVKQ/6E+2jsMLg9v7LCTb983YFnn0QSww==} + '@tauri-apps/cli-win32-x64-msvc@2.11.4': + resolution: {integrity: sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.11.3': - resolution: {integrity: sha512-EElQe8z8uD7Pi5++tJ/UfEwWuK08rd3oCDYdeIbJAb6pZRrxlqmoF5gh5H5YvzmUPhS4IRCaLSsQhvWkrfK+GQ==} + '@tauri-apps/cli@2.11.4': + resolution: {integrity: sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==} engines: {node: '>= 10'} hasBin: true @@ -1425,8 +1425,8 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - autoprefixer@10.5.1: - resolution: {integrity: sha512-jwM2pcTuCWUoN70FEvf5XrXyDbUgRURK4FnU8v0jWZZYU/KkVvN9T33mu1sVLFY9JW3kTWzKheEpn6xYLRc/VA==} + autoprefixer@10.5.2: + resolution: {integrity: sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1450,8 +1450,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.38: - resolution: {integrity: sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==} + baseline-browser-mapping@2.10.40: + resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} engines: {node: '>=6.0.0'} hasBin: true @@ -1464,8 +1464,8 @@ packages: brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} browserslist@4.28.4: @@ -1762,8 +1762,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.378: - resolution: {integrity: sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==} + electron-to-chromium@1.5.380: + resolution: {integrity: sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1803,15 +1803,15 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.1: - resolution: {integrity: sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - es-toolkit@1.48.1: - resolution: {integrity: sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==} + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -1861,8 +1861,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.41.0: - resolution: {integrity: sha512-OHAMNiCEON1RDBlRGuulsN5AD8ptMjvk5QWfFmYmBLPZ3zFGIJe60kQucQQf4cez1OzQmjYBWDY+dYfISkUdqg==} + framer-motion@12.42.0: + resolution: {integrity: sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2007,8 +2007,8 @@ packages: immer@11.1.8: resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} - immutable@5.1.7: - resolution: {integrity: sha512-47Xb+LFbZ/ZIjQMj6Q5J3IfK7PJFuqRdFOC9FpGgRTK6U2dAEVmkR9hp58qU4FpYux5YXpneDwkj2EP6lppzFA==} + immutable@5.1.8: + resolution: {integrity: sha512-TM5YqrGeTsVIPPpILzeqZ8D2Zc2TvNgSDi88zPF2a4cyqQdWV/wVWBDRDbNzzrLeRWScrFcOX9lW2iX6GOtUDw==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -2165,14 +2165,14 @@ packages: resolution: {integrity: sha512-xrbTDDdUfkJhM4EzYOwwzEf2ksPT5WLgQ5i2X9X5yUpcmXJPEjeAnpMl1tIrYDzuCD19/AEH+cbLunQHGn8v7w==} engines: {node: '>=22'} - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-base64@3.8.0: + resolution: {integrity: sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true jsesc@3.1.0: @@ -2359,14 +2359,14 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} - motion-dom@12.41.0: - resolution: {integrity: sha512-Lk3J39fOGg6xNr1KRZsN6usDyBf8aP7MEbUPez1VCughHt79OrP7VGqNrPyFL0riaT7WS8t9DRw1M3BHtM/xKw==} + motion-dom@12.42.0: + resolution: {integrity: sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==} motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - motion@12.41.0: - resolution: {integrity: sha512-avEDKE22rFPJqDr3Ttk7gMQpeaOmNik60NoJ5T0tj+RBCNvz21D3ArY3l4uitoeQ7eIpDqueWaO3pPYFv8JOVA==} + motion@12.42.0: + resolution: {integrity: sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2396,8 +2396,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.49: - resolution: {integrity: sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==} + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} normalize-package-data@2.5.0: @@ -2491,8 +2491,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -2500,8 +2500,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.4: - resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} + prettier@3.9.1: + resolution: {integrity: sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==} engines: {node: '>=14'} hasBin: true @@ -2546,8 +2546,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-hotkeys-hook@5.3.2: - resolution: {integrity: sha512-DDDy9xK6mbTQ6aPlQvIl0dA/a90T/AWml4Rm21JXFDLlRHalIg4/Rv3equUQYs5xPTWq+oEl6RD7mi/nBpU3Uw==} + react-hotkeys-hook@5.3.3: + resolution: {integrity: sha512-aswgyWUnE25hmhzHTfKDmKzsaSE5DJ4LKaU/o6rQSXkDd/1Bh9TfAFQbHkf6fLy11HvlYkp+cDDarGdhmCDhoQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -2738,8 +2738,8 @@ packages: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} - shell-quote@1.8.4: - resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} engines: {node: '>= 0.4'} side-channel-list@1.0.1: @@ -2973,8 +2973,8 @@ packages: victory-vendor@37.3.6: resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - vite@7.3.5: - resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3322,82 +3322,82 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.28.1': optional: true '@floating-ui/core@1.7.5': @@ -3852,77 +3852,77 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tanstack/query-core@5.101.1': {} + '@tanstack/query-core@5.101.2': {} - '@tanstack/query-devtools@5.101.1': {} + '@tanstack/query-devtools@5.101.2': {} - '@tanstack/react-query-devtools@5.101.1(@tanstack/react-query@5.101.1(react@19.2.7))(react@19.2.7)': + '@tanstack/react-query-devtools@5.101.2(@tanstack/react-query@5.101.2(react@19.2.7))(react@19.2.7)': dependencies: - '@tanstack/query-devtools': 5.101.1 - '@tanstack/react-query': 5.101.1(react@19.2.7) + '@tanstack/query-devtools': 5.101.2 + '@tanstack/react-query': 5.101.2(react@19.2.7) react: 19.2.7 - '@tanstack/react-query@5.101.1(react@19.2.7)': + '@tanstack/react-query@5.101.2(react@19.2.7)': dependencies: - '@tanstack/query-core': 5.101.1 + '@tanstack/query-core': 5.101.2 react: 19.2.7 - '@tanstack/react-virtual@3.14.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@tanstack/react-virtual@3.14.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@tanstack/virtual-core': 3.17.1 + '@tanstack/virtual-core': 3.17.2 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@tanstack/virtual-core@3.17.1': {} + '@tanstack/virtual-core@3.17.2': {} '@tauri-apps/api@2.11.1': {} - '@tauri-apps/cli-darwin-arm64@2.11.3': + '@tauri-apps/cli-darwin-arm64@2.11.4': optional: true - '@tauri-apps/cli-darwin-x64@2.11.3': + '@tauri-apps/cli-darwin-x64@2.11.4': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.3': + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.11.3': + '@tauri-apps/cli-linux-arm64-gnu@2.11.4': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.11.3': + '@tauri-apps/cli-linux-arm64-musl@2.11.4': optional: true - '@tauri-apps/cli-linux-riscv64-gnu@2.11.3': + '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.11.3': + '@tauri-apps/cli-linux-x64-gnu@2.11.4': optional: true - '@tauri-apps/cli-linux-x64-musl@2.11.3': + '@tauri-apps/cli-linux-x64-musl@2.11.4': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.11.3': + '@tauri-apps/cli-win32-arm64-msvc@2.11.4': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.11.3': + '@tauri-apps/cli-win32-ia32-msvc@2.11.4': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.11.3': + '@tauri-apps/cli-win32-x64-msvc@2.11.4': optional: true - '@tauri-apps/cli@2.11.3': + '@tauri-apps/cli@2.11.4': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.11.3 - '@tauri-apps/cli-darwin-x64': 2.11.3 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.3 - '@tauri-apps/cli-linux-arm64-gnu': 2.11.3 - '@tauri-apps/cli-linux-arm64-musl': 2.11.3 - '@tauri-apps/cli-linux-riscv64-gnu': 2.11.3 - '@tauri-apps/cli-linux-x64-gnu': 2.11.3 - '@tauri-apps/cli-linux-x64-musl': 2.11.3 - '@tauri-apps/cli-win32-arm64-msvc': 2.11.3 - '@tauri-apps/cli-win32-ia32-msvc': 2.11.3 - '@tauri-apps/cli-win32-x64-msvc': 2.11.3 + '@tauri-apps/cli-darwin-arm64': 2.11.4 + '@tauri-apps/cli-darwin-x64': 2.11.4 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.4 + '@tauri-apps/cli-linux-arm64-gnu': 2.11.4 + '@tauri-apps/cli-linux-arm64-musl': 2.11.4 + '@tauri-apps/cli-linux-riscv64-gnu': 2.11.4 + '@tauri-apps/cli-linux-x64-gnu': 2.11.4 + '@tauri-apps/cli-linux-x64-musl': 2.11.4 + '@tauri-apps/cli-win32-arm64-msvc': 2.11.4 + '@tauri-apps/cli-win32-ia32-msvc': 2.11.4 + '@tauri-apps/cli-win32-x64-msvc': 2.11.4 '@tauri-apps/plugin-clipboard-manager@2.3.2': dependencies: @@ -4072,15 +4072,15 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.7 - '@vitejs/plugin-react-swc@4.3.1(vite@7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0))': + '@vitejs/plugin-react-swc@4.3.1(vite@7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 '@swc/core': 1.15.43 - vite: 7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) + vite: 7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.2.0(vite@7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(vite@7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) @@ -4088,7 +4088,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) + vite: 7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -4121,13 +4121,13 @@ snapshots: async-function@1.0.0: {} - autoprefixer@10.5.1(postcss@8.5.15): + autoprefixer@10.5.2(postcss@8.5.16): dependencies: browserslist: 4.28.4 caniuse-lite: 1.0.30001799 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.15 + postcss: 8.5.16 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -4146,7 +4146,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.38: {} + baseline-browser-mapping@2.10.40: {} boolbase@1.0.0: {} @@ -4159,16 +4159,16 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.6: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 browserslist@4.28.4: dependencies: - baseline-browser-mapping: 2.10.38 + baseline-browser-mapping: 2.10.40 caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.378 - node-releases: 2.0.49 + electron-to-chromium: 1.5.380 + node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) byte-size@9.0.1: {} @@ -4268,7 +4268,7 @@ snapshots: cosmiconfig@8.3.6(typescript@6.0.3): dependencies: import-fresh: 3.3.1 - js-yaml: 4.2.0 + js-yaml: 4.3.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -4452,7 +4452,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.378: {} + electron-to-chromium@1.5.380: {} emoji-regex@8.0.0: {} @@ -4485,7 +4485,7 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.1 + es-to-primitive: 1.3.4 function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 @@ -4543,44 +4543,45 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 - es-to-primitive@1.3.1: + es-to-primitive@1.3.4: dependencies: es-abstract-get: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.48.1: {} + es-toolkit@1.49.0: {} - esbuild@0.27.7: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 escalade@3.2.0: {} @@ -4610,9 +4611,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.41.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + framer-motion@12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.41.0 + motion-dom: 12.42.0 motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: @@ -4778,7 +4779,7 @@ snapshots: immer@11.1.8: {} - immutable@5.1.7: {} + immutable@5.1.8: {} import-fresh@3.3.1: dependencies: @@ -4937,11 +4938,11 @@ snapshots: itertools@2.7.1: {} - js-base64@3.7.8: {} + js-base64@3.8.0: {} js-tokens@4.0.0: {} - js-yaml@4.2.0: + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -5241,7 +5242,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.6 + brace-expansion: 5.0.7 minimatch@3.1.5: dependencies: @@ -5251,15 +5252,15 @@ snapshots: dependencies: brace-expansion: 2.1.1 - motion-dom@12.41.0: + motion-dom@12.42.0: dependencies: motion-utils: 12.39.0 motion-utils@12.39.0: {} - motion@12.41.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + motion@12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - framer-motion: 12.41.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + framer-motion: 12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.4.0 @@ -5280,7 +5281,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.49: {} + node-releases@2.0.50: {} normalize-package-data@2.5.0: dependencies: @@ -5298,7 +5299,7 @@ snapshots: minimatch: 3.1.5 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.4 + shell-quote: 1.9.0 string.prototype.padend: 3.1.6 nth-check@2.1.1: @@ -5380,7 +5381,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.15: + postcss@8.5.16: dependencies: nanoid: 3.3.15 picocolors: 1.1.1 @@ -5388,7 +5389,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.4: {} + prettier@3.9.1: {} prop-types@15.8.1: dependencies: @@ -5422,7 +5423,7 @@ snapshots: dependencies: react: 19.2.7 - react-hotkeys-hook@5.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + react-hotkeys-hook@5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) @@ -5508,7 +5509,7 @@ snapshots: '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7) clsx: 2.1.1 decimal.js-light: 2.5.1 - es-toolkit: 1.48.1 + es-toolkit: 1.49.0 eventemitter3: 5.0.4 immer: 10.2.0 react: 19.2.7 @@ -5641,7 +5642,7 @@ snapshots: sass@1.92.1: dependencies: chokidar: 4.0.3 - immutable: 5.1.7 + immutable: 5.1.8 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -5682,7 +5683,7 @@ snapshots: shebang-regex@1.0.0: {} - shell-quote@1.8.4: {} + shell-quote@1.9.0: {} side-channel-list@1.0.1: dependencies: @@ -5988,12 +5989,12 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@7.3.5(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0): + vite@7.3.6(@types/node@25.9.4)(sass@1.92.1)(yaml@2.9.0): dependencies: - esbuild: 0.27.7 + esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.15 + postcss: 8.5.16 rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6126e6676..a0c61d37a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arbitrary" @@ -861,9 +861,9 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-unit" -version = "5.2.3" +version = "5.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bcaa4a0975bed4a760af3efe4368825098ce5f9d37a30c5a021d635dc63d8f" +checksum = "4a813de7f2bbedb7dce265b64f1cf5908ebe4d56281ece8d847e98113788b9b0" dependencies = [ "rust_decimal", "schemars 1.2.1", @@ -947,9 +947,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce8d3bd5823c7504d3f579f13e7b2f3da252fcb938c594d5680ee508bf846f" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" dependencies = [ "serde_core", ] @@ -3180,9 +3180,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "typenum", ] @@ -4715,14 +4715,13 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "open" -version = "5.3.5" +version = "5.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a" dependencies = [ "dunce", "is-wsl", "libc", - "pathdiff", ] [[package]] @@ -4906,12 +4905,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - [[package]] name = "pem-rfc7468" version = "0.7.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 371d6696c..13f1313d0 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -187,6 +187,7 @@ wmi = {version = "0.18", default-features = false} # If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. # DO NOT REMOVE!! custom-protocol = ["tauri/custom-protocol"] +macos_installer = [] [dev-dependencies] tokio = { version = "1", features = ["full"] } diff --git a/src-tauri/Installer.entitlements b/src-tauri/Installer.entitlements new file mode 100644 index 000000000..97655ee4c --- /dev/null +++ b/src-tauri/Installer.entitlements @@ -0,0 +1,24 @@ + + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.application-identifier + 82GZ7KN29J.net.defguard + com.apple.developer.team-identifier + 82GZ7KN29J + com.apple.security.application-groups + + group.net.defguard + + + diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 7ab8755b3..02c6245a7 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -13,6 +13,12 @@ fn main() -> Result<(), Box> { let git2 = Git2Builder::default().branch(true).sha(true).build()?; Emitter::default().add_instructions(&git2)?.emit()?; + if std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default() == "macos" + && std::env::var("CARGO_FEATURE_MACOS_INSTALLER").is_ok() + { + println!("cargo:rustc-link-lib=framework=SystemExtensions"); + } + tauri_build::build(); Ok(()) } diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index 637f4bfa9..4e66d8eac 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -39,6 +39,10 @@ use defguard_client::{ connection::apple::{observer_thread, spawn_runloop_and_wait_for}, database::models::get_all_tunnels_locations, }; +#[cfg(all(target_os = "macos", feature = "macos_installer"))] +use defguard_client::{ + connection::apple::PLUGIN_BUNDLE_ID, system_extension::activate_system_extension, +}; use defguard_client_core::connection::active_connections::close_all_connections; #[cfg(target_os = "macos")] use defguard_client_core::connection::sync_locations_and_tunnels; @@ -93,6 +97,9 @@ async fn startup(app_handle: &AppHandle) { } }; } + #[cfg(all(target_os = "macos", feature = "macos_installer"))] + activate_system_extension(PLUGIN_BUNDLE_ID); + #[cfg(target_os = "macos")] { let semaphore = Arc::new(AtomicBool::new(false)); diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 4711a9a99..6e3e397f5 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -17,6 +17,7 @@ use defguard_client_proto::defguard::{ client_types::DeviceConfigResponse, enterprise::posture::v2::DevicePostureData, }; use defguard_client_provisioning::ProvisioningConfig; +#[cfg(not(target_os = "macos"))] use defguard_client_service_locations::to_service_location; use serde::{Deserialize, Serialize}; use struct_patch::Patch; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 477c3cb68..56296a0af 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,8 @@ #[cfg(target_os = "macos")] pub mod apple; +#[cfg(all(target_os = "macos", feature = "macos_installer"))] +pub mod system_extension; pub mod appstate; pub mod commands; pub mod events; diff --git a/src-tauri/src/system_extension.rs b/src-tauri/src/system_extension.rs new file mode 100644 index 000000000..d749a5600 --- /dev/null +++ b/src-tauri/src/system_extension.rs @@ -0,0 +1,120 @@ +use std::sync::{LazyLock, Mutex}; + +use objc2::{define_class, msg_send, rc::Retained, runtime::AnyObject, AnyThread}; +use objc2_foundation::{NSError, NSObject, NSString}; + +// OSSystemExtensionRequest.delegate is a `weak` property, so we must keep our delegate alive +// for the duration of the activation handshake. +static DELEGATE: LazyLock>>> = + LazyLock::new(|| Mutex::new(None)); + +define_class!( + #[unsafe(super(NSObject))] + #[name = "DefguardSystemExtensionDelegate"] + struct SystemExtensionDelegate; + + impl SystemExtensionDelegate { + /// The extension is waiting for user approval in System Settings > Privacy & Security. + #[unsafe(method(requestNeedsUserApproval:))] + fn request_needs_user_approval(&self, _request: &AnyObject) { + info!( + "VPN system extension requires user approval — open \ + System Settings > Privacy & Security to enable it." + ); + } + + /// Activation finished (or will finish after reboot). + #[unsafe(method(request:didFinishWithResult:))] + fn request_did_finish(&self, _request: &AnyObject, result: isize) { + // OSSystemExtensionResult::WillCompleteAfterReboot == 1 + if result == 1 { + info!("VPN system extension installed; activation will complete after reboot."); + } else { + info!("VPN system extension activated successfully."); + } + } + + /// Activation failed. + #[unsafe(method(request:didFailWithError:))] + fn request_did_fail(&self, _request: &AnyObject, error: &NSError) { + error!( + "VPN system extension activation failed: {}", + error.localizedDescription() + ); + } + + /// A newer version of the extension is being installed; always replace. + #[unsafe(method(request:actionForReplacingExtension:withExtension:))] + fn action_for_replacing( + &self, + _request: &AnyObject, + _old: &AnyObject, + _new: &AnyObject, + ) -> isize { + 1 // OSSystemExtensionReplacementAction::Replace + } + } +); + +impl SystemExtensionDelegate { + fn new() -> Retained { + let this = Self::alloc().set_ivars(()); + unsafe { msg_send![super(this), init] } + } +} + +/// Submit a system extension activation request for `bundle_id` to +/// `OSSystemExtensionManager`. Safe to call on every launch — the OS ignores duplicate +/// requests for extensions that are already active. Callbacks arrive asynchronously on the +/// main queue via the embedded delegate. +/// +/// Silently skips when `OSSystemExtensionRequest` is absent from the ObjC runtime, which +/// happens for App Store builds (no `packet-tunnel-provider-systemextension` entitlement) +/// or when `SystemExtensions.framework` is not linked. +pub fn activate_system_extension(bundle_id: &str) { + use objc2::runtime::AnyClass; + + let Some(req_class) = AnyClass::get(c"OSSystemExtensionRequest") else { + debug!( + "OSSystemExtensionRequest not found in ObjC runtime — \ + skipping system extension activation." + ); + return; + }; + let Some(mgr_class) = AnyClass::get(c"OSSystemExtensionManager") else { + warn!("OSSystemExtensionManager not found — skipping system extension activation."); + return; + }; + + let ext_id = NSString::from_str(bundle_id); + let delegate = SystemExtensionDelegate::new(); + + unsafe { + // Passing nil for the queue uses the main queue (documented behaviour). + let queue: *mut std::ffi::c_void = std::ptr::null_mut(); + + let request: Option> = msg_send![ + req_class, + activationRequestForExtensionWithIdentifier: &*ext_id, + queue: queue + ]; + let Some(request) = request else { + error!("Failed to create system extension activation request for {bundle_id}."); + return; + }; + + // Set our delegate (weak reference on the request side — strong ref kept in DELEGATE). + let delegate_ns: &NSObject = &*delegate; + let _: () = msg_send![&*request, setDelegate: delegate_ns]; + + let manager: Retained = msg_send![mgr_class, sharedManager]; + let _: () = msg_send![&*manager, submitRequest: &*request]; + } + + info!("Submitted system extension activation request for {bundle_id}."); + + // Keep the delegate alive until the asynchronous callbacks are delivered. + if let Ok(mut guard) = DELEGATE.lock() { + *guard = Some(delegate); + } +} diff --git a/src-tauri/tauri.pkg.conf.json b/src-tauri/tauri.pkg.conf.json new file mode 100644 index 000000000..3dbd2ca5b --- /dev/null +++ b/src-tauri/tauri.pkg.conf.json @@ -0,0 +1,11 @@ +{ + "bundle": { + "macOS": { + "entitlements": "Installer.entitlements", + "files": { + "embedded.provisionprofile": "Defguard_Client_Mac_DeveloperID.provisionprofile", + "SystemExtensions/net.defguard.VPNExtension.systemextension": "../swift/extension/build/Installer/VPNExtension.appex" + } + } + } +} diff --git a/swift/extension/VPNExtension.xcodeproj/project.pbxproj b/swift/extension/VPNExtension.xcodeproj/project.pbxproj index 04aa0ecb5..d20973c5b 100644 --- a/swift/extension/VPNExtension.xcodeproj/project.pbxproj +++ b/swift/extension/VPNExtension.xcodeproj/project.pbxproj @@ -8,11 +8,15 @@ /* Begin PBXBuildFile section */ 66CABCD82EA76D070057D1AF /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66CABCD72EA76D060057D1AF /* NetworkExtension.framework */; }; + 66D5E7352FF2810E0023CD03 /* AppStore.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 66D5E7342FF2810E0023CD03 /* AppStore.xcconfig */; }; + 66D5E7372FF2813B0023CD03 /* Installer.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 66D5E7362FF2813B0023CD03 /* Installer.xcconfig */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 66CABCD42EA76D060057D1AF /* VPNExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = VPNExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 66CABCD72EA76D060057D1AF /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; + 66D5E7342FF2810E0023CD03 /* AppStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppStore.xcconfig; sourceTree = ""; }; + 66D5E7362FF2813B0023CD03 /* Installer.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Installer.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -62,6 +66,8 @@ 66CABCC92EA76CD80057D1AF = { isa = PBXGroup; children = ( + 66D5E7342FF2810E0023CD03 /* AppStore.xcconfig */, + 66D5E7362FF2813B0023CD03 /* Installer.xcconfig */, 660FE50B2EA77C68006A7447 /* BoringTun */, 660FE5002EA779E8006A7447 /* Defguard */, 66CABCD92EA76D070057D1AF /* VPNExtension */, @@ -152,6 +158,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 66D5E7352FF2810E0023CD03 /* AppStore.xcconfig in Resources */, + 66D5E7372FF2813B0023CD03 /* Installer.xcconfig in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -189,6 +197,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = VPNExtension/AppStore.entitlements; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 82GZ7KN29J; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -227,6 +236,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = VPNExtension/AppStore.entitlements; CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 82GZ7KN29J; @@ -277,7 +287,6 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = VPNExtension/VPNExtension.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = "@BUILD_NUMBER@"; @@ -375,7 +384,6 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = VPNExtension/VPNExtension.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; @@ -437,6 +445,139 @@ }; name = Release; }; + 66D5E73F2FF284DF0023CD03 /* Installer */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = VPNExtension/Installer.entitlements; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 82GZ7KN29J; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + OTHER_CODE_SIGN_FLAGS = "--timestamp"; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/BoringTun/defguard_boringtunFFI.h"; + }; + name = Installer; + }; + 66D5E7402FF284DF0023CD03 /* Installer */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: defguard sp. z o.o. (82GZ7KN29J)"; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "@BUILD_NUMBER@"; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=macosx*]" = 82GZ7KN29J; + ENABLE_APP_SANDBOX = NO; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_INCOMING_NETWORK_CONNECTIONS = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 13.5; + MARKETING_VERSION = 2.1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = net.defguard.VPNExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "Defguard VPNExtension Mac DeveloperID"; + REGISTER_APP_GROUPS = YES; + SDKROOT = macosx; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Installer; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -445,6 +586,7 @@ buildConfigurations = ( 66CABCCE2EA76CD80057D1AF /* Debug */, 66CABCCF2EA76CD80057D1AF /* Release */, + 66D5E73F2FF284DF0023CD03 /* Installer */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -454,6 +596,7 @@ buildConfigurations = ( 66CABCE02EA76D070057D1AF /* Debug */, 66CABCE12EA76D070057D1AF /* Release */, + 66D5E7402FF284DF0023CD03 /* Installer */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/swift/extension/VPNExtension/VPNExtension.entitlements b/swift/extension/VPNExtension/AppStore.entitlements similarity index 100% rename from swift/extension/VPNExtension/VPNExtension.entitlements rename to swift/extension/VPNExtension/AppStore.entitlements diff --git a/swift/extension/VPNExtension/Installer.entitlements b/swift/extension/VPNExtension/Installer.entitlements new file mode 100644 index 000000000..ea517b80e --- /dev/null +++ b/swift/extension/VPNExtension/Installer.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider-systemextension + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + group.net.defguard + + com.apple.security.network.client + + + From 343a9b847c569e31621d54dbbca0e543b3317cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Wed, 1 Jul 2026 16:46:53 +0200 Subject: [PATCH 02/12] Fix system extension --- src-tauri/Installer.entitlements | 2 ++ src-tauri/src/system_extension.rs | 4 +-- src-tauri/tauri.pkg.conf.json | 2 +- .../VPNExtension.xcodeproj/project.pbxproj | 28 +++++++++---------- .../{Info.plist => Info-AppExt.plist} | 0 .../extension/VPNExtension/Info-SysExt.plist | 18 ++++++++++++ swift/extension/VPNExtension/main.swift | 4 +++ 7 files changed, 40 insertions(+), 18 deletions(-) rename swift/extension/VPNExtension/{Info.plist => Info-AppExt.plist} (100%) create mode 100644 swift/extension/VPNExtension/Info-SysExt.plist diff --git a/src-tauri/Installer.entitlements b/src-tauri/Installer.entitlements index a4410b8c5..44b8ff5ca 100644 --- a/src-tauri/Installer.entitlements +++ b/src-tauri/Installer.entitlements @@ -6,6 +6,8 @@ packet-tunnel-provider-systemextension + com.apple.developer.system-extension.install + com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write diff --git a/src-tauri/src/system_extension.rs b/src-tauri/src/system_extension.rs index 87d758539..dd32ec446 100644 --- a/src-tauri/src/system_extension.rs +++ b/src-tauri/src/system_extension.rs @@ -41,8 +41,8 @@ define_class!( #[unsafe(method(requestNeedsUserApproval:))] fn request_needs_user_approval(&self, _request: &OSSystemExtensionRequest) { info!( - "VPN system extension requires user approval — open System Settings > \ - Privacy & Security to enable it." + "VPN system extension requires user approval — open System Settings > General > \ + Login Items & Extensions > Network Extensions to enable it." ); } diff --git a/src-tauri/tauri.pkg.conf.json b/src-tauri/tauri.pkg.conf.json index 4c706cd96..6296eef55 100644 --- a/src-tauri/tauri.pkg.conf.json +++ b/src-tauri/tauri.pkg.conf.json @@ -10,7 +10,7 @@ "entitlements": "Installer.entitlements", "files": { "embedded.provisionprofile": "Defguard_Client_Mac_DeveloperID.provisionprofile", - "SystemExtensions/net.defguard.VPNExtension.systemextension": "../swift/extension/build/Installer/VPNExtension.appex" + "Library/SystemExtensions/net.defguard.VPNExtension.systemextension": "../swift/extension/build/Installer/VPNSystemExtension.systemextension" } } } diff --git a/swift/extension/VPNExtension.xcodeproj/project.pbxproj b/swift/extension/VPNExtension.xcodeproj/project.pbxproj index 1b343e502..a78710548 100644 --- a/swift/extension/VPNExtension.xcodeproj/project.pbxproj +++ b/swift/extension/VPNExtension.xcodeproj/project.pbxproj @@ -21,14 +21,15 @@ 66C2A3292FF503FA00A2A8F7 /* Exceptions for "VPNExtension" folder in "VPNSystemExtension" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - Info.plist, + "Info-SysExt.plist", ); target = 66C2A31C2FF503F900A2A8F7 /* VPNSystemExtension */; }; 66CABCDE2EA76D070057D1AF /* Exceptions for "VPNExtension" folder in "VPNExtension" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - Info.plist, + "Info-AppExt.plist", + "Info-SysExt.plist", main.swift, ); target = 66CABCD32EA76D060057D1AF /* VPNExtension */; @@ -165,7 +166,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 2600; - LastUpgradeCheck = 2610; + LastUpgradeCheck = 2660; TargetAttributes = { 66C2A31C2FF503F900A2A8F7 = { CreatedOnToolsVersion = 26.0.1; @@ -297,9 +298,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-SysExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -388,9 +388,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-SysExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -480,9 +479,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-SysExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -542,6 +540,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; ONLY_ACTIVE_ARCH = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/BoringTun/defguard_boringtunFFI.h"; @@ -581,6 +580,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; OTHER_CODE_SIGN_FLAGS = "--timestamp"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/BoringTun/defguard_boringtunFFI.h"; @@ -654,9 +654,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-AppExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -745,9 +744,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-AppExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -807,6 +805,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; OTHER_CODE_SIGN_FLAGS = "--timestamp"; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/BoringTun/defguard_boringtunFFI.h"; @@ -876,9 +875,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPNExtension/Info.plist; + INFOPLIST_FILE = "VPNExtension/Info-AppExt.plist"; INFOPLIST_KEY_CFBundleDisplayName = VPNExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", diff --git a/swift/extension/VPNExtension/Info.plist b/swift/extension/VPNExtension/Info-AppExt.plist similarity index 100% rename from swift/extension/VPNExtension/Info.plist rename to swift/extension/VPNExtension/Info-AppExt.plist diff --git a/swift/extension/VPNExtension/Info-SysExt.plist b/swift/extension/VPNExtension/Info-SysExt.plist new file mode 100644 index 000000000..6de031b78 --- /dev/null +++ b/swift/extension/VPNExtension/Info-SysExt.plist @@ -0,0 +1,18 @@ + + + + + NetworkExtension + + NEMachServiceName + group.net.defguard + NEProviderClasses + + com.apple.networkextension.packet-tunnel + $(PRODUCT_MODULE_NAME).PacketTunnelProvider + + + NSSystemExtensionUsageDescription + Defguard uses a system extension to establish and manage secure VPN connections. + + diff --git a/swift/extension/VPNExtension/main.swift b/swift/extension/VPNExtension/main.swift index 2fbd69de1..b34a7c35f 100644 --- a/swift/extension/VPNExtension/main.swift +++ b/swift/extension/VPNExtension/main.swift @@ -3,3 +3,7 @@ import NetworkExtension autoreleasepool { NEProvider.startSystemExtensionMode() } + +// A system extension is a standalone executable: keep the process alive so the registered +// provider can service requests. Without this the process exits immediately after registering. +dispatchMain() From e0a8f31cfc59f08079176e38f36d6a649dc2082d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Wed, 1 Jul 2026 16:47:14 +0200 Subject: [PATCH 03/12] Defguard_Client_Mac_App_Store.provisionprofile --- ...uard_Client_Mac_App_Store.provisionprofile | Bin 13173 -> 13320 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src-tauri/Defguard_Client_Mac_App_Store.provisionprofile b/src-tauri/Defguard_Client_Mac_App_Store.provisionprofile index 7eaff6cd7e3a35a410c8d4a87939131e6b3c810e..e756dc93f88d8747f3ef0c654510185d103310ad 100644 GIT binary patch delta 4649 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 ItiShv0ER+v8vp-FY5AlE3-% z{jT@-{$Baw;)jKm$fUoq?}8IAVlVpmfLZ&^UO(yA;nLZ&XU#$vA`AANH@bMv?4|Se zK_*8Q{(al5^^?bZK6mn%Pky;FGiwRH0!3C}!8D4Vf+MHkp^Z1px@G?1LeNs9v6{ve zJB9#6gRF6!;P*(9GMfW?|7FJ{+JseZ6w4(h>>>o=GL~f}3IxYd6^|hSZVYbR|66^L z0(Ci;K^=t&^SP|%0E+`*4@eX!iaJ9hS|!}m(}1Rckd#r&jksO(={~)MclvWpE^y(dt^3b1C4)5>%AU*k(L!b9l-I1!zRpGIT3l zp<9~hrZq;XXnv(=R7A`0gEq(3EWL+!;?sL^I?obyqe8Fo;ZxX=VGqf$~X%P?3svdgR~?O|5Ly7i&kTm&tu zJ%TV;V99=|V^m}}=DPYYM>^x!YF4W2SRaold?nHnY!OktXhrpm0Pl$b zo@(;6EIDRHY3hE$G0K8tRHeGsuS|R57#=7QBtg|GiB^D)2E-KVV>_)%CfthAt|g;m zqbgtQk%>YfAt?ccNRuQmc%F((JCEp$(i%o>_~E)9A%V!amc=xNhB-#)=qbEtutZba zb2*FmoLc0djb>fvh zA}ir-Ei3tTe{?*T!K>5HvnEV`%gM8nqgMr(_JC`tE+47Teb*pS7uGzGPfcI3Tt;#X z%gsUquq-e-5*^|Jfe>sNY_wxmAS|;SPgjYeinX9~C}L)y(Tuy-|H+KhHhR0x7F}Lr za4((}9Fv80ub3VMl%AG3y<5yf+?v^FGY)aCLl2G8UXF-4CJfU`bfBT3qcaZLu$xF> zaOnX{`&G$NGe~Rbw>~Us#Tokll~y6*6sg!chP2gb{K;(tQ*3CqZnEWFYhPkA(9--c z&Me{aBnOjZ_H@7E{zD-kM2GEI+})3*K!YbOo*rg8Bh=K4(~f6oTg4O)CZY;`M-7&D zDQo7zJ)eX8#U&{SoiYz$!$xa>hY;dOlJwI)&Q5jZwlaA2>l=H>Va>F@F@uRgr*6p&6O)2jBoIJ?O+$(+zOXb3J1lDU@|8#i3AyPmodZc!&48X0 z7DLUnXtEK17Rxz!KC64Q5lpqsd=CV%xFciAm{zCi5@|EGXcK@Z5C)*KNm*is7;HW0 zh(1UXmY}c_Pk=%wLZkr&MApZHz|1~3Lik)U0$do74Pu04?FtZ5xhvEFML58Y0Bf{L zbO|lbI0(WB)mG3aH7Sc=QbD`WEUQvi^o8+igRkYZaj(fyXw*Z?Aq{EwnejrS#4Eri zT3W3p_FAHVMtp)T^P?@UZr9U7JAnCfbkHobp<+7Psc>pl#L2Fy_fV!rB`g(;=1a|z z1?w2E@Ek|#IT(ZmDZ#QlDjy7VkZuj~@!rmRM3tAC?qI``i*%5uU8E~`pvT+X@Z<4z zGzZt<6|SWreqgjbMdWyv>qc!*9_9>YlV{}_Lf~itH~g?4QbZK?gah$BGj~b^C8hu} zIBS#z3ehl|5Ncy72Gs?H(#ol3Mb1U5W4#nH8t5o074}NGc2kpj zp?1(~mw_%45kv}QO1V}o>ei#`xPx0-C++X%Y5~^Ib1cGx&~(`%Gi9TBSa4WYmvvQ2 zkr12c6P8QYfZPsJ`I=&RrD&sEs#o)!asT*ucsw4BHC@S4xtOaGgebE>j6@PPfOM`h zB-vzuDAR-oh+?T;gS_GBNPYPjL= z8zj#}JT4ij`+OCaZv^T+Mhu(PmQ)uwGVaffs$@(Gnev!v_K-kRZ8)7ELz>-KIxLq% zNiWv4A#1q?M0>2Yo3)5MXi!o`ON_^PP=lpvFeyF|h7cw9g6!!353?oR7Q1|!gV^Vx zZV}N;(GYms>hg93nduAO&DcbOPu1KQfTa*ciX!Q(f=DTjCLoV%bpwO?tKzh^9F%Z6Sa-S|ksi(3-h3VM{WMT-xnR`e_1|?b`64oT0YO=CIg*1Ozv!Y69 z)Gk$%dSo<>Nw7c+)QQ6h@RbHo{;v(-4W)+wn*r*Q%rx1i zK*Umqil7NU7DJ|BwK(0cVj>OFL_f&0<-Z$qIS3hq&!JK+m*p)u+ER_bt(FIfy$ z4C_lM+z2<(ZH)|fjM7k24uupkR0Fn_6+A7=xAz()M7l0F145I}aZE*twWCeR_OS+A zHe@K76Vp+Pp_vf_F-Zh~OSxaZQJA&{-1P3o>+d;ZEP;caM}txX1o1{FnfO2E|$AI#rgSk1m!6? zFnD}fa8wAYfnxBN*}rLK`m}sV!J?nDx-1KX{$re8Mqn zTJNVi-eB%YYrh#lQ4B?KB!G-*haP~1;I}Y_An4$xle+y!Uhk93q&qi18AQVC-ni{g zKSp0nu6Xstr&p~z^Jqog{?}7JyG&|sKo+f2=&XC!8OM#>&&<8;{+CPs+&Rx&w&eD= zUroLB)>Cf|r~?l8;Zuu#6}bKnC)~64`L!q8M}2V3U$%|D^1`ZH*S|3F8~P_l-9C@F z`Gqx)l|Fvs({~2fZn=A^{fIbqNdKh+H%;7o?g{_%*yqm_-rRbjd6W0ne;@Vr@qgX- zM(L%o!lv%C<43a(PW-s@$0Mgk^N(LKF?jsk*vs{)b$_mY^1-%MiCX8q-)?%WFn0aD ztIv4+?8#@ZQ15*zb>A-rlylb0-w)k!-NL;2EjzZJJ(!w z)?l0bms=L?m~+U*4{loh)cat^;{Mse9fyGrmTw;U=Y>&Y;)8uYyLG`UCyJ}_wXeT( zU}N&aNA(xEH;=r06hV~|7*vu<5%sw@urWT zdNft|-Q|6>bl&Q#eb2qyWMAoiw*CG3YxIp)?e)p0eWh6|j#zc-+EtgmwD`y~zeu0> z`8gx^-E*n?#UBryJoTqf=Y7xNPi)z;bYjbQfbUx$UGl^otKPnRD*vu^gcuN$<`@BSmQ7GkHMIErAwA+&I)5s%&dQ^kV0=pl0t z`faZ8Q1%jEuhF=BuxWX7b^XelwLu5FvVZ0C?@eyMLwRu@ta$ltcb&4D{*RH(zj7a% z8VNo}9CyL1?6EKYe9JTbZC7oZxaJq1Ucd0Q)fc?EdfVyVxj#Mc;)A!8AG+Y$&f5Lv zAAgT={KpG^w)FESZ@yxD-Nu8xQby@2}W5fK} HxrzS;y|Rz* From 03a79a6dc9d4c3bdb0ae0a337dc4c5a35341b1b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Wed, 1 Jul 2026 16:51:35 +0200 Subject: [PATCH 04/12] Remove --- ...fguard_Client_Mac_App_Store.provisionprofile | Bin 13320 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src-tauri/Defguard_Client_Mac_App_Store.provisionprofile diff --git a/src-tauri/Defguard_Client_Mac_App_Store.provisionprofile b/src-tauri/Defguard_Client_Mac_App_Store.provisionprofile deleted file mode 100644 index e756dc93f88d8747f3ef0c654510185d103310ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13320 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 J|MAB2{{_SciE#h` From 2afe5a93aab31c3fdff859b00538dfacb0d83794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 10:11:15 +0200 Subject: [PATCH 05/12] Build dmg --- .github/workflows/build-macos.yaml | 4 +- .github/workflows/release-macos.yaml | 83 +++++++++++++++++++ .github/workflows/release.yaml | 40 +++++---- .github/workflows/test.yml | 2 +- new-ui/package.json | 4 +- new-ui/pnpm-lock.yaml | 78 ++++++++--------- package.json | 6 +- pnpm-lock.yaml | 79 +++++++++--------- src-tauri/Cargo.lock | 14 ++-- src-tauri/tauri.app.conf.json | 14 ++++ src-tauri/tauri.conf.json | 13 --- ...auri.pkg.conf.json => tauri.dmg.conf.json} | 10 ++- src-tauri/tauri.linux.conf.json | 5 +- src-tauri/tauri.macos.conf.json | 6 ++ src-tauri/tauri.windows.conf.json | 4 +- 15 files changed, 228 insertions(+), 134 deletions(-) create mode 100644 .github/workflows/release-macos.yaml create mode 100644 src-tauri/tauri.app.conf.json rename src-tauri/{tauri.pkg.conf.json => tauri.dmg.conf.json} (83%) diff --git a/.github/workflows/build-macos.yaml b/.github/workflows/build-macos.yaml index 6f5acaf02..650679c3c 100644 --- a/.github/workflows/build-macos.yaml +++ b/.github/workflows/build-macos.yaml @@ -73,11 +73,11 @@ jobs: pnpm build - name: Build app - uses: tauri-apps/tauri-action@v0 + uses: tauri-apps/tauri-action@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - args: --target universal-apple-darwin + args: --config src-tauri/tauri.app.conf.json --target universal-apple-darwin # - name: Bundle Defguard CLI # env: diff --git a/.github/workflows/release-macos.yaml b/.github/workflows/release-macos.yaml new file mode 100644 index 000000000..24a02f445 --- /dev/null +++ b/.github/workflows/release-macos.yaml @@ -0,0 +1,83 @@ +name: Build macOS dmg +on: + workflow_call: + inputs: + upload_url: + description: 'Upload URL for release' + required: true + type: string + +env: + SQLX_OFFLINE: "1" + +jobs: + build-macos-dmg: + runs-on: + - self-hosted + - macOS + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + + - name: Write release version + run: | + VERSION=$(echo ${GITHUB_REF_NAME#v} | cut -d '-' -f1) + echo Version: $VERSION + echo "VERSION=$VERSION" >> ${GITHUB_ENV} + if [ "${GITHUB_REF_TYPE}" = "tag" ]; then + echo "DEFGUARD_CLIENT_BUILD_VERSION=${GITHUB_REF_NAME#v}" >> ${GITHUB_ENV} + fi + + - uses: actions/setup-node@v6 + with: + node-version: 26 + + - uses: pnpm/action-setup@v6 + with: + cache: true + version: 11 + + - name: Install Node dependencies for New UI + run: | + cd new-ui + pnpm install --no-frozen-lockfile + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-darwin,x86_64-apple-darwin + + - name: Set build number + run: | + sed -i '' "s,@BUILD_NUMBER@,${{ github.run_number }}," swift/extension/VPNExtension.xcodeproj/project.pbxproj + sed -i '' "s,@BUILD_NUMBER@,${{ github.run_number }}," src-tauri/tauri.macos.conf.json + sed -i '' "s,@BUILD_NUMBER@,${{ github.run_number }}," src-tauri/client-cli/Info.plist + + - name: Unlock keychain + run: security -v unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" login.keychain + + - name: Build new UI + run: | + cd new-ui + pnpm build + + - name: Build app + uses: tauri-apps/tauri-action@v1 + env: + APPLE_API_ISSUER: ${{ secrets.APPLE_API_KEY }} + APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} + APPLE_SIGNING_IDENTITY: "Apple Distribution: defguard sp. z o.o. (82GZ7KN29J)" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: --config src-tauri/tauri.dmg.conf.json --target universal-apple-darwin + + - name: Upload DMG + uses: shogo82148/actions-upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ inputs.upload_url }} + asset_path: src-tauri/target/universal-apple-darwin/release/bundle/dmg/Defguard_${{ env.VERSION }}_universal.dmg + asset_content_type: application/x-apple-diskimage + overwrite: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2b4d815f1..376203ccb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -15,7 +15,7 @@ jobs: steps: - name: Create GitHub release id: release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: draft: true generate_release_notes: true @@ -113,7 +113,7 @@ jobs: args: "--bundles deb" - name: Upload DEB - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -132,13 +132,12 @@ jobs: fpm_opts: "--architecture ${{ matrix.binary_arch }} --debug --output-type deb --version ${{ env.VERSION }} --package dg-linux-${{ env.VERSION }}_${{ matrix.deb_arch }}_ubuntu-22-04-lts.deb" - name: Upload DEB - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: dg-linux-${{ env.VERSION }}_${{ matrix.deb_arch }}_ubuntu-22-04-lts.deb - asset_name: dg-linux-${{ env.VERSION }}_${{ matrix.deb_arch }}_ubuntu-22-04-lts.deb asset_content_type: application/octet-stream build-linux: @@ -227,23 +226,21 @@ jobs: echo "deb_sha256_${{ matrix.deb_arch }}=$DEB_SHA256" >> ${GITHUB_OUTPUT} - name: Upload RPM - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: src-tauri/target/release/bundle/rpm/defguard-client-${{ env.VERSION }}-1.${{ matrix.binary_arch }}.rpm - asset_name: defguard-client-${{ env.VERSION }}-1.${{ matrix.binary_arch }}.rpm asset_content_type: application/octet-stream - name: Upload DEB - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: src-tauri/target/release/bundle/deb/defguard-client_${{ env.VERSION }}_${{ matrix.deb_arch }}.deb - asset_name: defguard-client_${{ env.VERSION }}_${{ matrix.deb_arch }}.deb asset_content_type: application/octet-stream - name: Rename and tar client binary @@ -253,13 +250,12 @@ jobs: defguard-client-linux-${{ matrix.binary_arch }}-${{ github.ref_name }} - name: Upload client archive - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: defguard-client-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz - asset_name: defguard-client-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz asset_content_type: application/octet-stream - name: Rename and tar daemon binary @@ -269,13 +265,12 @@ jobs: defguard-service-linux-${{ matrix.binary_arch }}-${{ github.ref_name }} - name: Upload daemon archive - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: defguard-service-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz - asset_name: defguard-service-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz asset_content_type: application/octet-stream - name: Rename and tar defguard-cli binary @@ -285,13 +280,12 @@ jobs: defguard-cli-linux-${{ matrix.binary_arch }}-${{ github.ref_name }} - name: Upload defguard-cli archive - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: defguard-cli-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz - asset_name: defguard-cli-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz asset_content_type: application/octet-stream - name: Rename and tar dg binary @@ -301,13 +295,12 @@ jobs: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }} - name: Upload dg archive - uses: actions/upload-release-asset@v1 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz - asset_name: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.tar.gz asset_content_type: application/octet-stream - name: Build dg deb @@ -317,13 +310,12 @@ jobs: fpm_opts: "--architecture ${{ matrix.binary_arch }} --debug --output-type deb --version ${{ env.VERSION }} --package dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.deb" - name: Upload DEB - uses: actions/upload-release-asset@v1.0.2 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.deb - asset_name: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.deb asset_content_type: application/octet-stream - name: Build dg rpm @@ -333,15 +325,21 @@ jobs: fpm_opts: "--architecture ${{ matrix.binary_arch }} --debug --output-type rpm --version ${{ env.VERSION }} --package dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.rpm" - name: Upload RPM - uses: actions/upload-release-asset@v1.0.2 + uses: shogo82148/actions-upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.rpm - asset_name: dg-linux-${{ matrix.binary_arch }}-${{ github.ref_name }}.rpm asset_content_type: application/octet-stream + build-macos: + needs: + - create-release + uses: ./.github/workflows/sbom.yml + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + # Builds Windows MSI and uploads it as artifact # build-windows: # needs: @@ -423,7 +421,7 @@ jobs: # - name: Sign bundle # run: osslsigncode sign -pkcs11module /srv/codesign/certum/sc30pkcs11-3.0.6.72-MS.so -pkcs11cert ${{ secrets.CODESIGN_KEYID }} -key ${{ secrets.CODESIGN_KEYID }} -pass ${{ secrets.CODESIGN_PIN }} -h sha256 -t http://time.certum.pl/ -in Defguard_${{ env.VERSION }}_${{ matrix.cpu }}_en-US.msi -out Defguard-signed.msi # - name: Upload installer asset - # uses: actions/upload-release-asset@v1 + # uses: shogo82148/actions-upload-release-asset@v1 # env: # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c9809695c..8792dac77 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -45,7 +45,7 @@ jobs: submodules: recursive - name: Scan code with Trivy - uses: aquasecurity/trivy-action@0.35.0 + uses: aquasecurity/trivy-action@0.36.0 env: TRIVY_SHOW_SUPPRESSED: 1 TRIVY_IGNOREFILE: "./.trivyignore.yaml" diff --git a/new-ui/package.json b/new-ui/package.json index 9f1a1a996..976c6d699 100644 --- a/new-ui/package.json +++ b/new-ui/package.json @@ -34,7 +34,7 @@ "chart.js": "^4.5.1", "clsx": "^2.1.1", "dayjs": "^1.11.21", - "motion": "^12.42.0", + "motion": "^12.42.2", "p-timeout": "^7.0.1", "prettier": "^3.9.4", "qrcode.react": "^4.2.0", @@ -62,6 +62,6 @@ "stylelint-config-standard-scss": "^17.0.0", "stylelint-scss": "^7.2.0", "typescript": "~6.0.3", - "vite": "^8.1.0" + "vite": "^8.1.2" } } diff --git a/new-ui/pnpm-lock.yaml b/new-ui/pnpm-lock.yaml index fa50734ce..8ac123eb6 100644 --- a/new-ui/pnpm-lock.yaml +++ b/new-ui/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: version: 1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-plugin': specifier: ^1.168.18 - version: 1.168.18(@tanstack/react-router@1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) + version: 1.168.18(@tanstack/react-router@1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.3)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) '@tauri-apps/api': specifier: ^2.11.1 version: 2.11.1 @@ -72,8 +72,8 @@ importers: specifier: ^1.11.21 version: 1.11.21 motion: - specifier: ^12.42.0 - version: 12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^12.42.2 + version: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) p-timeout: specifier: ^7.0.1 version: 7.0.1 @@ -116,7 +116,7 @@ importers: devDependencies: '@tanstack/devtools-vite': specifier: ^0.8.1 - version: 0.8.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) + version: 0.8.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) '@types/byte-size': specifier: ^8.1.2 version: 8.1.2 @@ -131,7 +131,7 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: ^6.0.3 - version: 6.0.3(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) + version: 6.0.3(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) autoprefixer: specifier: ^10.5.2 version: 10.5.2(postcss@8.5.16) @@ -151,8 +151,8 @@ importers: specifier: ~6.0.3 version: 6.0.3 vite: - specifier: ^8.1.0 - version: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) + specifier: ^8.1.2 + version: 8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) packages: @@ -1025,8 +1025,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1133,8 +1133,8 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} - electron-to-chromium@1.5.381: - resolution: {integrity: sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==} + electron-to-chromium@1.5.383: + resolution: {integrity: sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1198,8 +1198,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.42.0: - resolution: {integrity: sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1579,14 +1579,14 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - motion-dom@12.42.0: - resolution: {integrity: sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - motion@12.42.0: - resolution: {integrity: sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==} + motion@12.42.2: + resolution: {integrity: sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1994,8 +1994,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.1.0: - resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + vite@8.1.2: + resolution: {integrity: sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -2578,7 +2578,7 @@ snapshots: '@tanstack/devtools-event-client@0.5.0': {} - '@tanstack/devtools-vite@0.8.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': + '@tanstack/devtools-vite@0.8.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': dependencies: '@tanstack/devtools-client': 0.0.8 '@tanstack/devtools-event-bus': 0.4.2 @@ -2587,7 +2587,7 @@ snapshots: magic-string: 0.30.21 oxc-parser: 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) picomatch: 4.0.4 - vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) + vite: 8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -2662,7 +2662,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': + '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.3)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -2671,11 +2671,11 @@ snapshots: '@tanstack/router-generator': 1.167.17 '@tanstack/router-utils': 1.162.2 chokidar: 5.0.0 - unplugin: 3.3.0(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) + unplugin: 3.3.0(rolldown@1.1.3)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)) zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) + vite: 8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -2785,10 +2785,10 @@ snapshots: '@ungap/structured-clone@1.3.2': {} - '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': + '@vitejs/plugin-react@6.0.3(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) + vite: 8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) ajv@8.20.0: dependencies: @@ -2814,7 +2814,7 @@ snapshots: autoprefixer@10.5.2(postcss@8.5.16): dependencies: browserslist: 4.28.4 - caniuse-lite: 1.0.30001799 + caniuse-lite: 1.0.30001800 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.16 @@ -2840,8 +2840,8 @@ snapshots: browserslist@4.28.4: dependencies: baseline-browser-mapping: 2.10.40 - caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.381 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.383 node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) @@ -2857,7 +2857,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001799: {} + caniuse-lite@1.0.30001800: {} ccount@2.0.1: {} @@ -2935,7 +2935,7 @@ snapshots: diff@8.0.4: {} - electron-to-chromium@1.5.381: {} + electron-to-chromium@1.5.383: {} emoji-regex@8.0.0: {} @@ -2991,9 +2991,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.42.0 + motion-dom: 12.42.2 motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: @@ -3447,15 +3447,15 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - motion-dom@12.42.0: + motion-dom@12.42.2: dependencies: motion-utils: 12.39.0 motion-utils@12.39.0: {} - motion@12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - framer-motion: 12.42.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) tslib: 2.8.1 optionalDependencies: react: 19.2.7 @@ -3881,14 +3881,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unplugin@3.3.0(rolldown@1.1.3)(vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)): + unplugin@3.3.0(rolldown@1.1.3)(vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 optionalDependencies: rolldown: 1.1.3 - vite: 8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) + vite: 8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0) update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: @@ -3912,7 +3912,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.1.0(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0): + vite@8.1.2(@types/node@26.0.1)(jiti@2.7.0)(sass@1.101.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 diff --git a/package.json b/package.json index d7d5699f6..9cd965f11 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@stablelib/base64": "^2.0.1", "@stablelib/x25519": "^2.0.1", "@tanstack/query-core": "^5.101.2", - "@tanstack/react-virtual": "^3.14.4", + "@tanstack/react-virtual": "^3.14.5", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-deep-link": "^2.4.9", @@ -73,7 +73,7 @@ "lodash-es": "^4.18.1", "merge-refs": "^2.0.0", "millify": "^6.1.0", - "motion": "^12.42.0", + "motion": "^12.42.2", "p-timeout": "^7.0.1", "prop-types": "^15.8.1", "radash": "^12.1.1", @@ -89,7 +89,7 @@ "react-router-dom": "^6.30.4", "react-use-websocket": "^4.13.0", "react-virtualized-auto-sizer": "^1.0.26", - "recharts": "^3.9.0", + "recharts": "^3.9.1", "rehype-sanitize": "^6.0.0", "rxjs": "^7.8.2", "use-breakpoint": "^4.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ea977540..d4b9b7197 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: ^5.101.2 version: 5.101.2 '@tanstack/react-virtual': - specifier: ^3.14.4 - version: 3.14.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^3.14.5 + version: 3.14.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tauri-apps/api': specifier: ^2.11.1 version: 2.11.1 @@ -120,8 +120,8 @@ importers: specifier: ^6.1.0 version: 6.1.0 motion: - specifier: ^12.42.0 - version: 12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + specifier: ^12.42.2 + version: 12.42.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) p-timeout: specifier: ^7.0.1 version: 7.0.1 @@ -168,8 +168,8 @@ importers: specifier: ^1.0.26 version: 1.0.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) recharts: - specifier: ^3.9.0 - version: 3.9.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@16.13.1)(react@19.2.7)(redux@5.0.1) + specifier: ^3.9.1 + version: 3.9.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@16.13.1)(react@19.2.7)(redux@5.0.1) rehype-sanitize: specifier: ^6.0.0 version: 6.0.0 @@ -1162,14 +1162,14 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.14.4': - resolution: {integrity: sha512-dZzAQP2uCDAd+9sAehqmx/DcU+B91Q4Gb0aDSM7t9bJvWDyGF9sapFNW5r1gNLsHs4wTb6ScZENJeYaHxJLiOw==} + '@tanstack/react-virtual@3.14.5': + resolution: {integrity: sha512-4EKRXh7zBLkbKbFmG3AUVkircuHd+7OdT1pocJSepxtfBd3qnrJgJ5rtPkRYyo9fmyVb2+pI2xPy5oYvMLQy6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.17.2': - resolution: {integrity: sha512-w43MvWvmShpb6kIC9MOoLyUkLmRTLPjt61bHWs+X29hACSpX+n8DvgZ3qM7cUfflKlRRcHR9KVJE6TmcqnQvcA==} + '@tanstack/virtual-core@3.17.3': + resolution: {integrity: sha512-8Np/TFELpI0ySuJoVmjvOrQYXH/8sTX0Biv9szhFhY39xOdAAY+smrMxjxOum/ux3eM8MUJQsEJ0/R0UpvC8dw==} '@tauri-apps/api@2.11.1': resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} @@ -1502,8 +1502,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1762,8 +1762,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.381: - resolution: {integrity: sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==} + electron-to-chromium@1.5.383: + resolution: {integrity: sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1861,8 +1861,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.42.0: - resolution: {integrity: sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2001,9 +2001,6 @@ packages: resolution: {integrity: sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==} engines: {node: '>=20.19.0'} - immer@10.2.0: - resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - immer@11.1.8: resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} @@ -2359,14 +2356,14 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} - motion-dom@12.42.0: - resolution: {integrity: sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} motion-utils@12.39.0: resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - motion@12.42.0: - resolution: {integrity: sha512-Qhwvu9sVl5/URSq5CNzwMCpSKK8Uhnrwb6VO977kZyj/wOCS7mWebJUnBoHx5cZU1Zv8a9BD5CSICWKAlrLJgA==} + motion@12.42.2: + resolution: {integrity: sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2629,8 +2626,8 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recharts@3.9.0: - resolution: {integrity: sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==} + recharts@3.9.1: + resolution: {integrity: sha512-WMcwlXcB7l+BbxiEdyClkG+1sxrMHNZpzT577LEvU4+rXPd8oTAy1wXk72hnk2KOOmxuLvw3z5DtXT7HEAydtg==} engines: {node: '>=18'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3867,13 +3864,13 @@ snapshots: '@tanstack/query-core': 5.101.2 react: 19.2.7 - '@tanstack/react-virtual@3.14.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@tanstack/react-virtual@3.14.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@tanstack/virtual-core': 3.17.2 + '@tanstack/virtual-core': 3.17.3 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@tanstack/virtual-core@3.17.2': {} + '@tanstack/virtual-core@3.17.3': {} '@tauri-apps/api@2.11.1': {} @@ -4124,7 +4121,7 @@ snapshots: autoprefixer@10.5.2(postcss@8.5.16): dependencies: browserslist: 4.28.4 - caniuse-lite: 1.0.30001799 + caniuse-lite: 1.0.30001800 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.16 @@ -4166,8 +4163,8 @@ snapshots: browserslist@4.28.4: dependencies: baseline-browser-mapping: 2.10.40 - caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.381 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.383 node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) @@ -4194,7 +4191,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001799: {} + caniuse-lite@1.0.30001800: {} ccount@2.0.1: {} @@ -4452,7 +4449,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.381: {} + electron-to-chromium@1.5.383: {} emoji-regex@8.0.0: {} @@ -4611,9 +4608,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + framer-motion@12.42.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.42.0 + motion-dom: 12.42.2 motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: @@ -4775,8 +4772,6 @@ snapshots: domutils: 4.0.2 entities: 8.0.0 - immer@10.2.0: {} - immer@11.1.8: {} immutable@5.1.9: {} @@ -5252,15 +5247,15 @@ snapshots: dependencies: brace-expansion: 2.1.1 - motion-dom@12.42.0: + motion-dom@12.42.2: dependencies: motion-utils: 12.39.0 motion-utils@12.39.0: {} - motion@12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + motion@12.42.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - framer-motion: 12.42.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + framer-motion: 12.42.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.4.0 @@ -5504,14 +5499,14 @@ snapshots: readdirp@4.1.2: {} - recharts@3.9.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@16.13.1)(react@19.2.7)(redux@5.0.1): + recharts@3.9.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@16.13.1)(react@19.2.7)(redux@5.0.1): dependencies: '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.49.0 eventemitter3: 5.0.4 - immer: 10.2.0 + immer: 11.1.8 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) react-is: 16.13.1 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index efeb70599..485c0695a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3876,14 +3876,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "bitflags 2.13.0", "libc", "plain", - "redox_syscall 0.8.1", + "redox_syscall 0.9.0", ] [[package]] @@ -5646,9 +5646,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" dependencies = [ "bitflags 2.13.0", ] @@ -7095,9 +7095,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.11.3" +version = "2.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2616f96cb644bf2c5c456d9de4d5d5100e592d7424c74d8b55c5cb96e359e93" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" dependencies = [ "anyhow", "bytes", diff --git a/src-tauri/tauri.app.conf.json b/src-tauri/tauri.app.conf.json new file mode 100644 index 000000000..658809e1d --- /dev/null +++ b/src-tauri/tauri.app.conf.json @@ -0,0 +1,14 @@ +{ + "bundle": { + "macOS": { + "entitlements": "./Client.entitlements", + "files": { + "embedded.provisionprofile": "Defguard_Client_Mac_App_Store.provisionprofile", + "PlugIns/VPNExtension.appex": "../swift/extension/build/Release/VPNExtension.appex" + }, + }, + "targets": [ + "app" + ] + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 23f210085..3267942f7 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,10 +8,6 @@ "active": true, "category": "Utility", "copyright": "Defguard", - "targets": [ - "deb", - "app" - ], "externalBin": [], "icon": [ "icons/32x32.png", @@ -41,15 +37,6 @@ "template": "./resources-windows/msi/main.wxs" } }, - "macOS": { - "bundleVersion": "@BUILD_NUMBER@", - "entitlements": "./Client.entitlements", - "files": { - "embedded.provisionprofile": "Defguard_Client_Mac_App_Store.provisionprofile", - "PlugIns/VPNExtension.appex": "../swift/extension/build/Release/VPNExtension.appex" - }, - "minimumSystemVersion": "13.5" - }, "resources": [ "resources/icons/tray/*" ], diff --git a/src-tauri/tauri.pkg.conf.json b/src-tauri/tauri.dmg.conf.json similarity index 83% rename from src-tauri/tauri.pkg.conf.json rename to src-tauri/tauri.dmg.conf.json index 6296eef55..4857edc90 100644 --- a/src-tauri/tauri.pkg.conf.json +++ b/src-tauri/tauri.dmg.conf.json @@ -3,7 +3,10 @@ "beforeBundleCommand": { "cwd": "../swift", "script": "./build.sh VPNSystemExtension Installer" - } + }, + "features": [ + "macos_installer" + ] }, "bundle": { "macOS": { @@ -12,6 +15,9 @@ "embedded.provisionprofile": "Defguard_Client_Mac_DeveloperID.provisionprofile", "Library/SystemExtensions/net.defguard.VPNExtension.systemextension": "../swift/extension/build/Installer/VPNSystemExtension.systemextension" } - } + }, + "targets": [ + "dmg" + ] } } diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index c2753d760..ef71faf7b 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -1,6 +1,9 @@ { "productName": "defguard-client", "bundle": { - "longDescription": "IMPORTANT: Reboot or Re-login Required\nOn initial install the user is added to the defguard group.\nA reboot or logging out and back in is required for group membership changes to take effect.\nThis is not required on subsequent updates." + "longDescription": "IMPORTANT: Reboot or Re-login Required\nOn initial install the user is added to the defguard group.\nA reboot or logging out and back in is required for group membership changes to take effect.\nThis is not required on subsequent updates.", + "targets": [ + "deb" + ] } } diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 39e50dd04..6cecab224 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -4,5 +4,11 @@ "cwd": "../swift", "script": "./build.sh" } + }, + "bundle": { + "macOS": { + "bundleVersion": "@BUILD_NUMBER@", + "minimumSystemVersion": "13.5" + } } } diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 1644c0a1c..3865b5ce5 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,11 +6,13 @@ } }, "bundle": { - "targets": ["msi"], "resources": [ "resources-windows/binaries/*", "resources-windows/scripts/*", "resources/icons/tray/*" + ], + "targets": [ + "msi" ] } } From f48d36bacd39501fd0a2cffcdde27ebcf38ab649 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:17:40 +0000 Subject: [PATCH 06/12] chore(nix): update pnpm and new-ui pnpm deps hash --- nix/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/package.nix b/nix/package.nix index f5d7c5c4f..91c24103a 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -90,7 +90,7 @@ inherit pname version pnpm; src = ../.; fetcherVersion = 3; - hash = "sha256-fGsjHg4FfjlH1yNzdZaXWjn07gV4j/mxv32t45RAyzM="; + hash = "sha256-vqBzk7E++I1A/dyOSBhzNTd1VkyVi4TMKBOMlAr0+T4="; }; # Prefetch pnpm dependencies for the new UI (separate pnpm project). @@ -99,7 +99,7 @@ inherit version pnpm; src = ../new-ui; fetcherVersion = 3; - hash = "sha256-k2trjKO1SQB7VR2da2SwXk9D032bGQOcqcPXoBdC8hs="; + hash = "sha256-stgsXNlTLKkEFAf6xkMn5UXNbKGEZBWUaRFdH/iJwkM="; }; # Pre-build the new UI frontend so Tauri can serve it as WebviewUrl::App("compact/") and "full/". From aaa5af0ea43255e38324102831c0f09b4a5fc65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 10:17:50 +0200 Subject: [PATCH 07/12] Bump aquasecurity/trivy-action --- .github/workflows/sbom.yml | 4 ++-- .github/workflows/test.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml index 64db1184b..1fae9ef4b 100644 --- a/.github/workflows/sbom.yml +++ b/.github/workflows/sbom.yml @@ -32,7 +32,7 @@ jobs: submodules: recursive - name: Create SBOM with Trivy - uses: aquasecurity/trivy-action@0.35.0 + uses: aquasecurity/trivy-action@v0.36.0 env: TRIVY_SHOW_SUPPRESSED: 1 TRIVY_IGNOREFILE: "./.trivyignore.yaml" @@ -45,7 +45,7 @@ jobs: scanners: "vuln" - name: Create security advisory file with Trivy - uses: aquasecurity/trivy-action@0.35.0 + uses: aquasecurity/trivy-action@v0.36.0 env: TRIVY_SHOW_SUPPRESSED: 1 TRIVY_IGNOREFILE: "./.trivyignore.yaml" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8792dac77..420d90616 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -45,7 +45,7 @@ jobs: submodules: recursive - name: Scan code with Trivy - uses: aquasecurity/trivy-action@0.36.0 + uses: aquasecurity/trivy-action@v0.36.0 env: TRIVY_SHOW_SUPPRESSED: 1 TRIVY_IGNOREFILE: "./.trivyignore.yaml" From e02f9b5319bd8388858529fcf13e7ee7177f1753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 10:23:47 +0200 Subject: [PATCH 08/12] fmt --- src-tauri/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 56296a0af..d8e0a064f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,8 +3,6 @@ #[cfg(target_os = "macos")] pub mod apple; -#[cfg(all(target_os = "macos", feature = "macos_installer"))] -pub mod system_extension; pub mod appstate; pub mod commands; pub mod events; @@ -13,6 +11,8 @@ pub mod periodic; pub mod provisioning; pub mod service; pub mod session_state; +#[cfg(all(target_os = "macos", feature = "macos_installer"))] +pub mod system_extension; pub mod tray; pub mod utils; pub mod window_manager; From 3cfc3a40a26a2204393ba32c7203a3e4a7763343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 10:28:05 +0200 Subject: [PATCH 09/12] clippy --- src-tauri/client-cli/src/monitor.rs | 2 +- src-tauri/src/commands.rs | 25 +++++++++++++------------ src-tauri/src/periodic/config.rs | 22 ++++++---------------- src-tauri/tauri.app.conf.json | 2 +- 4 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src-tauri/client-cli/src/monitor.rs b/src-tauri/client-cli/src/monitor.rs index 2c59266d2..d11fec626 100644 --- a/src-tauri/client-cli/src/monitor.rs +++ b/src-tauri/client-cli/src/monitor.rs @@ -65,7 +65,7 @@ pub async fn tear_down_stale_connections(state: &State) { semaphore_clone.store(true, Ordering::Release); }); spawn_runloop_and_wait_for(&semaphore); - let _ = handle.await.unwrap(); + let () = handle.await.unwrap(); } #[cfg(not(target_os = "macos"))] diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 5fb225d04..197e37fbf 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -51,6 +51,7 @@ use crate::{ }, periodic::config::{do_update_instance, poll_instance_with_events}, proxy::construct_platform_header, + tauri_err_to_app_err, tray::{configure_tray_icon, reload_tray_menu}, utils::{ get_location_interface_details, get_tunnel_interface_details, get_tunnel_or_location_name, @@ -173,7 +174,7 @@ pub async fn disconnect( ); handle .emit(EventKey::ConnectionChanged.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; debug!("Event emitted successfully"); stop_log_watcher_task(&handle, &connection.interface_name)?; reload_tray_menu(&handle).await; @@ -285,7 +286,7 @@ pub async fn disconnect_locations(location_ids: Vec, handle: AppHandle) -> R if any_disconnected { handle .emit(EventKey::ConnectionChanged.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; reload_tray_menu(&handle).await; configure_tray_icon(&handle).await?; } @@ -313,7 +314,7 @@ async fn maybe_update_instance_config(location_id: Id, handle: &AppHandle) -> Re transaction.commit().await?; handle .emit(EventKey::InstanceUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } @@ -404,7 +405,7 @@ pub async fn save_device_config( handle .emit(EventKey::InstanceUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; let res = SaveDeviceConfigResponse { locations, instance, @@ -672,7 +673,7 @@ pub async fn update_instance( } app_handle .emit(EventKey::InstanceUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; reload_tray_menu(&app_handle).await; Ok(()) } else { @@ -820,7 +821,7 @@ pub async fn update_location_routing( debug!("Location routing updated for location {name}(ID: {location_id})"); handle .emit(EventKey::LocationUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } ConnectionType::Tunnel => { @@ -830,7 +831,7 @@ pub async fn update_location_routing( info!("Tunnel routing updated for tunnel {location_id}"); handle .emit(EventKey::LocationUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } else { error!("Couldn't update tunnel routing: tunnel with id {location_id} not found."); @@ -851,7 +852,7 @@ pub async fn set_location_mfa_method( debug!("MFA method updated for location (ID: {location_id})"); handle .emit(EventKey::LocationUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } @@ -898,7 +899,7 @@ pub async fn delete_instance(instance_id: Id, handle: AppHandle) -> Result<(), E handle .emit(EventKey::InstanceUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; info!("Successfully deleted instance {instance}."); Ok(()) } @@ -975,7 +976,7 @@ pub async fn delete_instance(instance_id: Id, handle: AppHandle) -> Result<(), E handle .emit(EventKey::InstanceUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; info!("Successfully deleted instance {instance}."); Ok(()) } @@ -998,7 +999,7 @@ pub async fn update_tunnel(mut tunnel: Tunnel, handle: AppHandle) -> Result< info!("The tunnel {tunnel} configuration has been updated."); handle .emit(EventKey::LocationUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } @@ -1009,7 +1010,7 @@ pub async fn save_tunnel(tunnel: Tunnel, handle: AppHandle) -> Result<(), info!("The tunnel {tunnel} configuration has been saved."); handle .emit(EventKey::LocationUpdate.into(), ()) - .map_err(crate::tauri_err_to_app_err)?; + .map_err(tauri_err_to_app_err)?; Ok(()) } diff --git a/src-tauri/src/periodic/config.rs b/src-tauri/src/periodic/config.rs index b56593248..fb6d9a2de 100644 --- a/src-tauri/src/periodic/config.rs +++ b/src-tauri/src/periodic/config.rs @@ -80,26 +80,22 @@ pub async fn poll_config(handle: AppHandle) { emit_version_mismatch(&handle, instance_id, version_mismatch(&result)); emit_poll_result_events(&handle, instance_id, &instance_name, result); debug!( - "Finished processing configuration polling request for instance {}(ID: {})", - instance_name, instance_id + "Finished processing configuration polling request for instance {instance_name}(ID: {instance_id})" ); } Err(Error::CoreNotEnterprise) => { debug!( - "Tried to contact core for instance {}(ID: {}) config but it's not enterprise, can't retrieve config", - instance_name, instance_id + "Tried to contact core for instance {instance_name}(ID: {instance_id}) config but it's not enterprise, can't retrieve config" ); } Err(Error::NoToken) => { debug!( - "Instance {}(ID: {}) has no token, can't retrieve its config from the core", - instance_name, instance_id, + "Instance {instance_name}(ID: {instance_id}) has no token, can't retrieve its config from the core", ); } Err(err) => { error!( - "Failed to retrieve instance {}(ID: {}) config from core: {err}", - instance_name, instance_id + "Failed to retrieve instance {instance_name}(ID: {instance_id}) config from core: {err}" ); } } @@ -175,15 +171,9 @@ fn emit_poll_result_events( } } PollInstanceResult::ChangedWhileActive { .. } => { - debug!( - "Emitting config-changed event for instance {}({})", - instance_name, instance_id, - ); + debug!("Emitting config-changed event for instance {instance_name}({instance_id})",); let _ = handle.emit(EventKey::ConfigChanged.into(), instance_name); - info!( - "Emitted config-changed event for instance {}({})", - instance_name, instance_id, - ); + info!("Emitted config-changed event for instance {instance_name}({instance_id})",); } } } diff --git a/src-tauri/tauri.app.conf.json b/src-tauri/tauri.app.conf.json index 658809e1d..32fbe8657 100644 --- a/src-tauri/tauri.app.conf.json +++ b/src-tauri/tauri.app.conf.json @@ -5,7 +5,7 @@ "files": { "embedded.provisionprofile": "Defguard_Client_Mac_App_Store.provisionprofile", "PlugIns/VPNExtension.appex": "../swift/extension/build/Release/VPNExtension.appex" - }, + } }, "targets": [ "app" From 8d750f431ac5f70b22996960e16c14ffbf90318f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 10:43:27 +0200 Subject: [PATCH 10/12] deny.toml --- src-tauri/deny.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/src-tauri/deny.toml b/src-tauri/deny.toml index 5a77da65d..6b7ace2cf 100644 --- a/src-tauri/deny.toml +++ b/src-tauri/deny.toml @@ -90,6 +90,7 @@ ignore = [ { id = "RUSTSEC-2025-0081", reason = "Tauri v2 dependency (unmaintained)" }, { id = "RUSTSEC-2025-0098", reason = "Tauri v2 dependency (unmaintained)" }, { id = "RUSTSEC-2025-0100", reason = "Tauri v2 dependency (unmaintained)" }, + { id = "RUSTSEC-2026-0194", reason = "Tauri v2 dependency (unmaintained)" }, ] # If this is true, then cargo deny will use the git executable to fetch advisory database. # If this is false, then it uses a built-in git library. From 6df47be933c89ea4eba920fc739dacb34aae9824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Thu, 2 Jul 2026 12:19:15 +0200 Subject: [PATCH 11/12] Use external provisin profiles --- .gitignore | 1 - ..._VPNExtension_Mac_App_Store.provisionprofile | Bin 13249 -> 0 bytes src-tauri/tauri.app.conf.json | 2 +- src-tauri/tauri.dmg.conf.json | 2 +- .../VPNExtension.xcodeproj/project.pbxproj | 1 + 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 src-tauri/Defguard_VPNExtension_Mac_App_Store.provisionprofile diff --git a/.gitignore b/.gitignore index 9688945cc..95eef0d0f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,6 @@ dist-ssr *.db *.db-shm *.db-wal -*.provisionprofile src-tauri/gen/ diff --git a/src-tauri/Defguard_VPNExtension_Mac_App_Store.provisionprofile b/src-tauri/Defguard_VPNExtension_Mac_App_Store.provisionprofile deleted file mode 100644 index c762e5212fe1322a2221a20680f843c42328ccab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13249 zcmdUW2bdexwZC`0?v3KuG-G)&5LnilQCkTc<7pa=q>(i08o)uC8I8)QtlCH-81E9C zU?+iqNx{aLl28I9K!5}Y!N3b(0@!qeaY6|sm>v>`nDWj@t1a04llQ*=m-n8(Z!O(B zckVs6oZtDKbFPqK38b)mD68B?e9&7ItR)Ralc zaBpO+S=ZL#UPsSxFS+9MdQQ>Rq*6Iu$e-4WE<<{CQeG&C>AZYeZzyQ*xAvaCa^{L9 zq?ZWBe3Y)Jq{|hZFNC`pLf6}`*JH(^BI)&Hkkt9yOdzO(KJDb#!T8LNR5hF_ZN;;XAO1_em zOxH*Ii>}lcA1xRIh^gTX6^g8% zRVl93r~82M{HjW~*Vjejo-7~X^J2u_;0e4b5GGkl<285AT4lMiO0@f+Db>jZNrJ!v zj7oAbr>np-u%aG}qi~$VNLi+QnD(425bzzxJOQ5+RXCwSAgG8iR8YmKMzC&)7c%-f zTc(oPMqiSNWXpX-A{EKx%yE*<6y&BkV=D`WihzeDpNbTvL{iD6(%zUvm!biJCaQi; z)E6=VyW3r_lHsB$-teG$iuXq7u*n?>R4iC6$rkedY9-(ZBVx=W4;JiwqU=d0N|6xn z&oq=ld#R81BnM1=sw874d%IG zNby^3hUS1cP<3accr6=pRpSXWp0LDfxrW1u76Znjh&Tk)S4UHbDwM1xeV&e%!|{@( z&(#pjAp%n=42ydSEF-J3%pfeLYG+xbR0`Lt9Km9k>d?-TAIadjtlA4$h)51#cAhks z44f;Qa+#g!REBgW%f$gk6|flNQe&`(AqVUw#gllNB@mh*$~4A>?06F+QfYfZbof0}7R*MeJfDL4g~f^i^QV2}zf3ws$*jU-l%dS#>xp#05GB$is(>N*^LgfQwae$n(lF?*nzX$70E4g^YlY&oe z4yur|XW+XwCv7~0kDy8-?{B&@m=Txd5-wAAoD&GlA1lQjenfDv+S$C6fxBr(^xzDcZ!iLK|HiL%RFNDg{qs+Z@Y3aYmt4K9FK z_y`$gNH^exhBbb~hj9))fINxG62{^zO{7Qn5zd;>8V8d@2YJSgJ;TQKp9Jh7)DVW5 zz{YS`P4Fkltg4oq6|0c1yK^P8z2VFnyh<{jXb^#voJyyI44KjUDwy5pZ5kR)lh@CR zbu%3x1AcQh&qXa(E;Ufi$+>L6Ggy?t$Jm#`WQo%?YSQ~FGIjZIXS1gd`o7u3HDE4uMaDcW29MXUbVZ%ftY-px< z6X#cv2x851Y|&tIVNy9O5^mX%u@G^k>O)+CL4OD|%8ME7QHrMAKFO_A2eYbS(5@$v zQPs{SICoe|1sqO?(?=L6=r|Km^d##Hru{5xN%%c@*+?o_F=(gUoH669G>v6yP+^lK zUmvhmQA@!ndaC*wlg10xJ`S_SD0|9O4NGBqFx8?Oag7Fa2+IiTASr)8r4c<2cM zOe+(JON#|~Np-xX5QqZ9cr`0QCRNa6s!j$mH!dr3Dl6kW$5NO~f#&X?wn~=0 zdYoa%YLh0g0YN1JA1Wqs}%GWc~0NIwIkS(<6W;TRzCFvY_eNC4LaWS+nh`6#P0GADBuXQm|K0g0k2$@;(m56cxu2_U{y z%aM#AXYxi+XUWcK7RmwVt8Uk17lAQ?wWx}~%4C`DgL90R!D3aKI71S6CSgFvkhf(y zTb4&-b(Q$|`O9k7OFA8qjOY$#7;_+PuJTb1EXU}6R1eq>#sMm2n=l5nA7#hxoLLba zBCy{|F_9Chi5##Z1E9QN++JlsNK6fA*32En8wq2|-2UW&ZHF5qE<*oi?F=Ap*q?;M zuLx-rERoHi$uG!iL;y<(eIo9tA5FlR31Y%?&;@g|(>JVJHj!s50=r^i$_~5 z-VBTs6>@4tJG*d}8WZKf3kjpYDbO|;N0YNHA4^g!W6;=yIo0+SG$zv7YX)=>bS!{s za~ajg1I`y!W}T4%}H zsZMOfTfotd2QooNG~NG#Ck5UR)%K)h)z#@c0Bp;h8S}F66ibA|tm;S!9yZ9SprItCat#%#uUMlP@qoxYuk9Q#F&Cmd?x1{TL?ya7ywHQ7L~X*^KHaSTgi1_r~O znWDRiV!~jsl5IE}vY!R0CBjxAk_qM=f*nurWHpk*14UrSm1HoJ30CWMsuIQ4iPLzkQTu~*%ebf8suUI$yl?|su!bpch%F^@TVMhQg6&j zg+{8Ft9ez~7s~r0!FoPmidXsunL6}Aqq%g7bfK6r6to&VT+@Q2b6$lt3}g~wAzCqT z$%dWH^~F+Yk<7a7Xw4mp%d7>LNwdY(aA}@qH3nGgtQ0U7xC8^Fg7pm4()u7RSHCDb zOAB?niSg~T!m?Dy%eOmg2_xV>Ldos`?qHi#jwQHGbU^H!X-@NcCbDoGymG)IXHj%y z{~Hkm%E*#TgUx7vY=c#_2m*YPOkGocSZ$TH7gQlLCJ*TEs5~K~0?a=Qx~pi|23XXI zbbxM<+`mIFc#Xl2*Ne_s0T0!IA)p%=Un<)9T9UWs5y5206q!W0jD|cpzpKIf3%O*; z$v6hmwy^9odYyxoy5ev*25MdlhgUEv=y%lP&Ow8mC$dVq8qMK3n=fe}%*aVWm6Mzb z+*0!@f^DxNq{6u131Z2%*TPaXiA7{QFi`ebQW4V2erO*T~xsf0zdRtOfvUr(7*h$H0f7#HNsTZUim7;)agQs|ktwE}8ja+#)57;bsU!m2ydOhhl8pEmjF*J?^d( z(WacMdP-%-%Ct0|KlJPof41rL&04)WnimW{QqF z8Z4qlcQ9Q~4@UImnA1oVeP|%4>e;~t*g6u|Y#p3|ktiZ#HxUI7&1WrTh)hkebr8w; zU#lya)bbNZstyrDm2EO$@4|7d&P!4au!(J*Z{l&5GSyuftkA(JCJZQJXJn1bi#esm zzvB^ep0NY>F#r$KY`HrYKEqF*aEj!6z0XzfTI1Le|G}iHD z#SD*yaMn>)rEz0vQKtk~FNNt;5u!f8>Bgea5UJ7XkVFGd!*_`MgtH99D`SQ_d{;EC z4iPB6CZzG42>hw#r{!50_F9V~RbvqqqE6P9FV)&}&9`%eGZ2ZBA-a`y1D^+O*5*GB z?Q8%CGQwZOG?5#4l|WNAsP%#z=R7(^zENM? z;K`D>=A$2g8w7>`H=sfU!;!UIsV)}m#ax08n43W>NAB|Lh(!kT4|?z@6ZmDZtG;ku#0&BL4=i3#ktY8zlWX-dlofLzyNb1RcQa z3I-8cEKcC&rj`{L%X|xB1kl1k$Q?)L*-R2!~jtV}t?KC@GeNG$5~&}<`Ss%88#6VCbh zv}~=CcwpijtaX17Cr51xL}*Elb!g|R#SPkJLW{w`xq{4(hBvLu4@3kR9GqzfE{95_ z%t9XGz~?~LwFu-0Mrlz*Kf_Wn?aY-GS297xEm5DlCh!C!*o!3zqHuOJ;^ZL=$xx<9 zKsEF!CXPvAF0qkJH|xHXQJ=AL6<4f`#f_D)81VZHN}m|xtj=asP+W);QfjS)*320b z{%OTlF45=Xh?FE`M-yS4q}fP}jDiGVMUirlC>%?cjU*$Xk5;#>jv%i&lHn9PiMC~V zsiGE2Sx8NGzDi?R$#&{;#){F*8%Q*gsf0{vf3Z}kH?;q2X;CVT%l&DRkF*mCc}Q|r z`XO>xkxKuhaWO7rrAmLLn$JthKWQuG%WVM;KCbq-ELAEnF<6w*^y)atN|F+99Q;wW zr2K0FrwWyFu~0dvsH34w81tZ;P?m&hDP3u__GBd8+b@?2)#B(j9(3tjO|;!wCXOVN z4?c^rjPSCP$G7;Wf@xXsjy$llBl+jf@f+RRas7`MX4#iywkNCtoGc*~Pv`sNf*_U4 z|H`z-4fkK0&e&nENby|%zci!q>!n4d$LIE`dNE!4@;thw9~tOJ3_--E<j+W@2Wbuh6y$4gf( zF4Hx2g=K|h<2%vNA(+ld!Gb$o8w<;)LE&Yov=UOuEA*Yh2vmha4B0tH9SP$JBVtOJ zk^TXbG1+f24%qr_W>dW1Y_bRg1Ev88>6*ScY`A?BWVEZ!FzC1uJDavb-@2}`a_jKi z>yY7|5HdXZw5^l7ySlsQFJH5E=DSaKU-ib@Fa2QG_M5)C`GfREWX|aQldf5CAtlke zpE5brGxhN9Pyjs~Idm!%W*$BhwnmY3OkP-qo`5XXDrX(Os9iaBeF1K8=&))fRnQb2 zU4YEj+D$%uPP?7IP^jpD)*QQVjsZaps0Fndt!4|qaE?(cBJF=XQbkDwZ@oEtdHc;s zp`?f^9A(|;oe7;E08P6xQr3Oh_}WbyP0rcfw0U$Uv&YY5q(y74$Z%Kh_|@o|GHLQ~ z*F3nR(>1euxT|Z@m1n)Uc>h1{-Qnt8@$hpe{A1z1kFGp+rFdxa^7mHX_fylaZ#-p5 z{<&i}F1g^8%C@p&tCMbhH2LWx>lf_2t!KsX-D{Os zKc89Jd(&sj3y%A?Y&ev??A+VVxme$QjOP>PzUK>fc<-zK_QgH7J^tvf9U!tM#|c=jmk@Tohlciiwg2p|uRCo2 z`w8#VH{ClI@5*g?r~G1l$($>SyX=vRzb1cUTUniXeIjw^EyZ>BRFAvx=EmRNxb~S( z&p*L1bNSLs&d^=8d8dBu5u09KG3(7cK7D&_WZuFpr}usH#C!I2Pwtx3b-?t-8Z>-Ju?4#^=maY29KAJsm`f7xn zI=ydd*OV#Ky1II-hy^iq%1GC`uZ~a0 zWUlsjo;H&n(2}XhAya3zu5Ah8)b6gHZcvGd8UkmcYZCvE`RZM7%-rI?deU&O`gloy z@yESCn}7W8Zk&mqeaQpAt}fc^-u{(8uF0-CWcB_tsLGu8o9BM(dr#~UHsBXNb;R$n z+oM~iPXDIk&y+`f9f#ht_`!k`~1qc3tcxp z!BS_x^o_w};*Up4$m8ojrvm%)`@f|U4?2X8_i?wERySS^KY8yx-}sf4uitX0!+*~l z^M;Lkepk6X^;hQXjW>OG{q0{_ckzzjA;h|;|5)tielc|a^*?y#t+#&u?HQ}yvtD}J zb@ z509UGcjzMatT`Wu=HtHN`buok?Hl*~ZS$5VeRpq*`s9nI|3bI#v71iO6^eJB-i3Vo zF5<~~SDf~jKIW@OJ@VNTcl>JZuGPmp_t3q+)TkD7iH0toZ|I6~xI(Fmm&?_hRMu&PuUKinlZ1C9 z?Juv>#sJQl0FzpVr=oU65*&scypR`l;6;e(wrwjUb=9(T%7lT61$b8*3|fwkubJLr zDK1pfARhEtX?sY^zMz^d_&U?_BX@uOu6Mq@Y4=~$O&`{tQW5XA#TT4^!O=fDjUM>$ zhE1!!d&)DnUVPXK_kC2}^zKvQyvG_|(+gLx{J8#k_K|6CpKCjRLqPYm^`TpTbGdhB z_Vd0^V%JTX@%4qP!iOGPdHSvm$1SI?dA6|h)xA6KD*k>R^~#CcKgiYJdGn5i3$Ne3 zrq{gv_-A*`doKIT)k}{%bl+7sT~r=A`?p7*F++dJZGR^n@1Jem@|C}yc7m*1Z_MnQ zGyLS9z1QeJ4rI;{?-z{fzEh{265jjbyd`sAyt{m)_l{kb^R|66wClPb{mOvvf8p7| zEo-jw-*xn_FU6N0cJjmX7Tw8iUM)Q0TD#D9fqK$Ev;R$1y4{bXje#dfwZiZ|37e`hhI65INE>b{Z9@c zwoR|y^um?sE?@uePu_Xvrd7Id?47@y`j3nJ}`m58I_HLtlZrZjxZH%A& z)J2EfviJ9aH{RIs`laNYIX~Pn`xmBbe|O@&8=l*+EVKBd%U^!0Z_o2*-njMopcmOmCs~{;%)e zp0r$h-`dk3TRr^r_hR?$2>j;fmy*g^yEj_zxN4RpKDqPqOU`oNaGd_AqdjC{dfm5y zyYanux%U=ktwVqN!>1#F)@?#QRvnK%JXI})l+5a~| z&eB;Mfc29P4(nr3DaAW33W8`mxVYye1nA^epp)wsclKcdnH<@LiFDFzopRQL7ev=Q z%HF*7kf-sQe*>h0I<+wo{1`M|~Jq3LtieqaC0 zdu7L-`ajM3WV}9bzH;)>6^Bhe7)xTZ%#2shuy}0+P{d0f&r{%gkPXDAfH2If9r?GWtH*&A8R@fr4Ry{IdyvbhbEJ!!SU;S@9yrNv=%JcSh;HzGOhi~lW7y{ zzdGLF!4QBJlcs&>kw3fgrU!<8$!u-Rxp|7T=&=6G!``3WFva)OF@OKlw)AxNmiyi> zNH=f1=jCV5NzZp*f81GXpWe3Y$E$8xv*Xe0W(kXLe00j6w|CvpT)OA5z1I&fesD_k zs5QGc?A-ptAxqcIA52Q0v*Y^j=yv{X`j20JVbbnbKaIck$YtNc-#zNc{7cif@18mL zm+w=?ne$(H-xz)6cvtsflLou9n?G5#Wd6;$&q8aSTyxzMOTCFpUa(|VOx?WT_@`Gs z;C%2M`47jQ#PKtSv2! Date: Thu, 2 Jul 2026 12:25:31 +0200 Subject: [PATCH 12/12] deny.toml --- src-tauri/deny.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/src-tauri/deny.toml b/src-tauri/deny.toml index 6b7ace2cf..697ab75f7 100644 --- a/src-tauri/deny.toml +++ b/src-tauri/deny.toml @@ -91,6 +91,7 @@ ignore = [ { id = "RUSTSEC-2025-0098", reason = "Tauri v2 dependency (unmaintained)" }, { id = "RUSTSEC-2025-0100", reason = "Tauri v2 dependency (unmaintained)" }, { id = "RUSTSEC-2026-0194", reason = "Tauri v2 dependency (unmaintained)" }, + { id = "RUSTSEC-2026-0195", reason = "Tauri v2 dependency (unmaintained)" }, ] # If this is true, then cargo deny will use the git executable to fetch advisory database. # If this is false, then it uses a built-in git library.