From 74fefeb01a06b2a24ec4d3498ac2fd4792da60f3 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Wed, 29 Oct 2025 19:43:12 +0100 Subject: [PATCH] Update On Wed Oct 29 19:43:11 CET 2025 --- .github/update.log | 1 + clash-nyanpasu/backend/Cargo.lock | 6 +- clash-nyanpasu/frontend/nyanpasu/package.json | 6 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 4 +- clash-nyanpasu/pnpm-lock.yaml | 284 +++++++++--------- lede/package/libs/mbedtls/Config.in | 65 +++- lede/package/libs/mbedtls/Makefile | 45 ++- .../mbedtls/patches/100-fix-gcc14-build.patch | 11 + .../100-x509-crt-verify-SAN-iPAddress.patch | 197 ------------ .../mbedtls/patches/101-remove-test.patch | 4 +- mieru/Makefile | 3 +- mieru/apis/internal/early_conn.go | 2 +- .../cmd/exampleapiclient/exampleapiclient.go | 35 ++- .../cmd/exampleapiserver/exampleapiserver.go | 101 +++++++ openwrt-packages/ddns-go/Makefile | 4 +- openwrt-packages/luci-app-amlogic/Makefile | 2 +- .../model/cbi/amlogic/amlogic_config.lua | 96 ++++-- .../luci-app-amlogic/po/zh-cn/amlogic.po | 63 ++-- .../luci-app-amlogic/root/etc/config/amlogic | 1 + .../share/amlogic/amlogic_check_firmware.sh | 5 +- .../usr/share/amlogic/amlogic_check_kernel.sh | 54 ++-- .../usr/share/amlogic/amlogic_check_plugin.sh | 5 +- .../workflows/build-nightly-release.yml | 6 +- v2rayn/.github/workflows/build-linux.yml | 89 ++++-- v2rayn/package-rhel.sh | 17 ++ v2rayn/v2rayN/ServiceLib/Common/JsonUtils.cs | 14 +- v2rayn/v2rayN/ServiceLib/Common/Utils.cs | 8 +- v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx | 44 +-- v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs | 8 +- v2rayn/v2rayN/v2rayN.Desktop/Program.cs | 21 +- 31 files changed, 664 insertions(+), 541 deletions(-) create mode 100644 lede/package/libs/mbedtls/patches/100-fix-gcc14-build.patch delete mode 100644 lede/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch create mode 100644 mieru/test/cmd/exampleapiserver/exampleapiserver.go diff --git a/.github/update.log b/.github/update.log index b9676f128c..901447bc9b 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1165,3 +1165,4 @@ Update On Sat Oct 25 20:37:45 CEST 2025 Update On Sun Oct 26 19:35:56 CET 2025 Update On Mon Oct 27 19:43:18 CET 2025 Update On Tue Oct 28 19:41:08 CET 2025 +Update On Wed Oct 29 19:43:03 CET 2025 diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index c585387c49..cef22bd405 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -2018,11 +2018,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "dispatch", + "dispatch2", "nix 0.30.1", "windows-sys 0.61.2", ] diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index dcba54d823..a4ff8bf25a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -59,9 +59,9 @@ "@iconify/json": "2.2.401", "@monaco-editor/react": "4.7.0", "@tanstack/react-query": "5.90.5", - "@tanstack/react-router": "1.133.32", - "@tanstack/react-router-devtools": "1.133.34", - "@tanstack/router-plugin": "1.133.32", + "@tanstack/react-router": "1.133.36", + "@tanstack/react-router-devtools": "1.133.36", + "@tanstack/router-plugin": "1.133.36", "@tauri-apps/plugin-clipboard-manager": "2.3.0", "@tauri-apps/plugin-dialog": "2.4.0", "@tauri-apps/plugin-fs": "2.4.2", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index e037807d1c..1f0095f866 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.15", - "mihomo_alpha": "alpha-ff62386", + "mihomo_alpha": "alpha-6bffbdd", "clash_rs": "v0.9.1", "clash_premium": "2023-09-05-gdcc8d87", "clash_rs_alpha": "0.9.1-alpha+sha.643fb1b" @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-10-27T22:20:58.070Z" + "updated_at": "2025-10-28T22:21:24.305Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 1c839c4a4d..9f8644be87 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -85,7 +85,7 @@ "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "7.0.1", "globals": "16.4.0", - "knip": "5.66.3", + "knip": "5.66.4", "lint-staged": "16.2.6", "neostandard": "0.12.2", "npm-run-all2": "8.0.4", @@ -112,7 +112,7 @@ }, "packageManager": "pnpm@10.18.3", "engines": { - "node": "22.20.0" + "node": "22.21.1" }, "pnpm": { "overrides": { diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 3bc3671ce1..e3381a0429 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -104,8 +104,8 @@ importers: specifier: 16.4.0 version: 16.4.0 knip: - specifier: 5.66.3 - version: 5.66.3(@types/node@24.8.1)(typescript@5.9.3) + specifier: 5.66.4 + version: 5.66.4(@types/node@24.8.1)(typescript@5.9.3) lint-staged: specifier: 16.2.6 version: 16.2.6 @@ -253,7 +253,7 @@ importers: version: 4.1.16 '@tanstack/router-zod-adapter': specifier: 1.81.5 - version: 1.81.5(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12) + version: 1.81.5(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12) '@tauri-apps/api': specifier: 2.8.0 version: 2.8.0 @@ -355,14 +355,14 @@ importers: specifier: 5.90.5 version: 5.90.5(react@19.2.0) '@tanstack/react-router': - specifier: 1.133.32 - version: 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 1.133.36 + version: 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': - specifier: 1.133.34 - version: 1.133.34(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + specifier: 1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': - specifier: 1.133.32 - version: 1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: 1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.0 version: 2.3.0 @@ -2103,8 +2103,8 @@ packages: '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@napi-rs/wasm-runtime@1.0.5': - resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2375,98 +2375,98 @@ packages: '@oxc-project/types@0.74.0': resolution: {integrity: sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ==} - '@oxc-resolver/binding-android-arm-eabi@11.8.3': - resolution: {integrity: sha512-er6onTUX8NMF5kBNGHCF8S6vxWVJS5BKO6SmLRW5nfZgHDHWsESH1YgyKpO6n6HBd/x58+7r9/1fxF3N8z911A==} + '@oxc-resolver/binding-android-arm-eabi@11.12.0': + resolution: {integrity: sha512-/IfGWLNdmS1kVYM2g+Xw4qXNWtCPZ/i5YMprflA8FC3vAjT4N0VucQcDxUPHxatQwre4qnhbFFWqRa1mz6Cgkw==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.8.3': - resolution: {integrity: sha512-VJMGaFYTu5YoZ0kpRhQQQoqNsYuAbPEHb/b/gEqpNpl/zHtvLWha8fYqTGtH7Wu9ajA2ESdWVqOzbBRMjQ/5qA==} + '@oxc-resolver/binding-android-arm64@11.12.0': + resolution: {integrity: sha512-H3Ehyinfx2VO8F5TwdaD/WY686Ia6J1H3LP0tgpNjlPGH2TrTniPERiwjqtOm/xHEef0KJvb/yfmUKLbHudhCA==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.8.3': - resolution: {integrity: sha512-IipM4uDZNZ4GEvmq0g5iRS4Di3YoEhf/BdkvqIFq35rZA9EvYn/csxAJb05H7HDzbLENIUfMvP18eyHt3juU+A==} + '@oxc-resolver/binding-darwin-arm64@11.12.0': + resolution: {integrity: sha512-hmm+A/0WdEtIeBrPtUHoSTzJefrZkhGSrmv5pwELKiqNqd+/gctzmTlt6wWrU8BMIryDMT9fWqLSQ3+NYfqAEA==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.8.3': - resolution: {integrity: sha512-gJQnRKe60CNyx+KE7ffKouG15hIoV0mnM3fGGbXRUXW7hVYv2WIiKAJeNn/o/EQhT5i1GrfvskVZCHTwHljuxQ==} + '@oxc-resolver/binding-darwin-x64@11.12.0': + resolution: {integrity: sha512-g1tVu53EMfuRKs67o0PZR0+y/WXl/Tfn3d2ggjK3Hj17pQPcb9x1+Y6W7n4EjIDttwLZbCPCEr06X+aC03I45A==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.8.3': - resolution: {integrity: sha512-UphzSWPIHKuVt6zDoNBzj03SfQIk73cBjfzQXK33asriLMv9kPrt2k5Aaea/ZB2bphv5MAf1BxyacYgT0hjBuA==} + '@oxc-resolver/binding-freebsd-x64@11.12.0': + resolution: {integrity: sha512-TiMatzvcVMSOiAx8sbnAw7UCfQpZDlm91ItywZrSHlQIJqDBipOmjIEYUMc2p823Y+fJ2ADL5UBjUB2kfqpedw==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.3': - resolution: {integrity: sha512-kjVGH0BIJTCefpNWcD9PrHYzXLMeofHzHqykgPc+OIBdv7KKjtE2FPeQ6PAJFzsB1BbwK0AOtKppajwfpyt1jw==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.12.0': + resolution: {integrity: sha512-zU+9UgxPIvfReqmRr/dqZt3387HPgcH0hA4u0QGE+280EFjBYYL2rxGDxK0L+keO6vc2+ITWVDXm9KIj+alofg==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.8.3': - resolution: {integrity: sha512-e+BDNYfkOKQSSF8KMrD7FwbBzbN+9mn14pCJk5pLLH9Mtxv5EHB6LrVqLS4nbQt3ZxLwG6WWWlMPv1sdQhxNNQ==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.12.0': + resolution: {integrity: sha512-dfO1rrOeELYWD/BewMCp81k1I3pOdtAi2VCKg/A1I8z0uI4OR6cThb5dV9fpHkj7zlb0Y5iZFPe+NTbI/u1MgQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.8.3': - resolution: {integrity: sha512-LD97VZB8KxJGEDSh4bzNExBK32nOAIPnmaKUU1bl6L3nd8YnhwK/l7RZPRsz//At/+0MGjf0Pg/fxYdW7OARjQ==} + '@oxc-resolver/binding-linux-arm64-gnu@11.12.0': + resolution: {integrity: sha512-JJNyN1ueryETKTUsG57+u0GDbtHKVcwcUoC6YyJmDdWE0o/3twXtHuS+F/121a2sVK8PKlROqGAev+STx3AuuQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.8.3': - resolution: {integrity: sha512-K9AUdi2Fd8RL4j5j2pACUcHbOawamt7nVn7yRI5+eOEfyn7bBsFvCVdKN4aKBLQxdAOFURK+uRWrVfR2xUkjww==} + '@oxc-resolver/binding-linux-arm64-musl@11.12.0': + resolution: {integrity: sha512-rQHoxL0H0WwYUuukPUscLyzWwTl/hyogptYsY+Ye6AggJEOuvgJxMum2glY7etGIGOXxrfjareHnNO1tNY7WYg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-ppc64-gnu@11.8.3': - resolution: {integrity: sha512-Ur5+jodHcL1lHlt7zye5K709qX4hagOdKequxrQYLaOC9zFJtpu+967PYw6bmedtnQERhyaGSfPzZ8u/TUgqWw==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.12.0': + resolution: {integrity: sha512-XPUZSctO+FrC0314Tcth+GrTtzy2yaYqyl8weBMAbKFMwuV8VnR2SHg9dmtI9vkukmM3auOLj0Kqjpl3YXwXiw==} cpu: [ppc64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.8.3': - resolution: {integrity: sha512-RgJHdrTTONup/55Y/eqyrIw2R3hG/1vBMI7+WGLjiF5zxJmVO8tLYcQklV92MKDxrLL7O36GZTZ6mPk57TVf9w==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.12.0': + resolution: {integrity: sha512-AmMjcP+6zHLF1JNq/p3yPEcXmZW/Xw5Xl19Zd0eBCSyGORJRuUOkcnyC8bwMO43b/G7PtausB83fclnFL5KZ3w==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-musl@11.8.3': - resolution: {integrity: sha512-zni4rfmy+JoR1ubY2puIgwR+3ATpmsIsZR8dzskKRuy+i4ghwo6uOQn3wXcMBiuY4yJ0XsOZBZe1OoAl1/rELw==} + '@oxc-resolver/binding-linux-riscv64-musl@11.12.0': + resolution: {integrity: sha512-K2/yFBqFQOKyVwQxYDAKqDtk2kS4g58aGyj/R1bvYPr2P7v7971aUG/5m2WD5u2zSqWBfu1o4PdhX0lsqvA3vQ==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.8.3': - resolution: {integrity: sha512-7u96LbjV6cGcvfGopwDHiuhrasE+0YZPshZFDyEO4QGm8rc+R9XgSsvUUCspRTuwc/J70u7c0cxONm6TYECkyA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.12.0': + resolution: {integrity: sha512-uSl4jo78tONGZtwsOA4ldT/OI7/hoHJhSMlGYE4Z/lzwMjkAaBdX4soAK5P/rL+U2yCJlRMnnoUckhXlZvDbSw==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.8.3': - resolution: {integrity: sha512-zgOg25vdttzLz1uCP/5hyMlLgczPSct8lBI8oBhh+oTjEmDTJdqWnjXgk/ugrQGw66j8Ud9eAZL+IWkHaaLSxA==} + '@oxc-resolver/binding-linux-x64-gnu@11.12.0': + resolution: {integrity: sha512-YjL8VAkbPyQ1kUuR6pOBk1O+EkxOoLROTa+ia1/AmFLuXYNltLGI1YxOY14i80cKpOf0Z59IXnlrY3coAI9NDQ==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.8.3': - resolution: {integrity: sha512-xac1SimfZ8grHyn3V3RTptDhQ8sSVdF0j1CsGGpG6ODyku+LcNvhwy6fjxuaT3Z+Zgsi1wchXQNDA62YkDUvZQ==} + '@oxc-resolver/binding-linux-x64-musl@11.12.0': + resolution: {integrity: sha512-qpHPU0qqeJXh7cPzA+I+WWA6RxtRArfmSrhTXidbiQ08G5A1e55YQwExWkitB2rSqN6YFxnpfhHKo9hyhpyfSg==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@11.8.3': - resolution: {integrity: sha512-zt2+ohZbPg0M9cADMLnImVRXXBJVd5tlOqzH9z4wdFTA1mHojIeSrHaW8c30ZzopbFIER0GTyY+YxAsf0bhIeQ==} + '@oxc-resolver/binding-wasm32-wasi@11.12.0': + resolution: {integrity: sha512-oqg80bERZAagWLqYmngnesE0/2miv4lST7+wiiZniD6gyb1SoRckwEkbTsytGutkudFtw7O61Pon6pNlOvyFaA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.8.3': - resolution: {integrity: sha512-je6MDeDP9PI4TGG3mcQ1ELzA4Y1O7+Dwxnc4sCxm6MkAiCi6G5UMSKsXp1f/UlcTdQn3hOJOv7d1KK8MbvRpPw==} + '@oxc-resolver/binding-win32-arm64-msvc@11.12.0': + resolution: {integrity: sha512-qKH816ycEN9yR/TX91CP1/i6xyVNHKX9VEOYa3XzQROPVtcYG2F6A3ng/PhwpJvS1cmL/DlilhglZe9KWkhNjg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.8.3': - resolution: {integrity: sha512-9GtBrZgJw3+dP0x/FHh/viiaQ+kgnVJr5jLG0ZDEci9vFOdc/XJkNXYs84mBlZcWK1HCj80VDBqqNGm4zYYIXA==} + '@oxc-resolver/binding-win32-ia32-msvc@11.12.0': + resolution: {integrity: sha512-3bgxubTlhzF6BwBnhGz5BTboarl1upuanEr6i0dncjfEcU+Z9xAOgbtA7Ip3G3EKDjE1objRKK+ny8PKJZ3b7Q==} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.8.3': - resolution: {integrity: sha512-MoathdI2zWifsGPsgnZjYplEm2NJ4pZxu8eSCYCe+8TToDRpQ+D8BTcr8Fox2AyNEQdT57l/0LzID4812+3f/A==} + '@oxc-resolver/binding-win32-x64-msvc@11.12.0': + resolution: {integrity: sha512-rbiWYQWxwy+x7+KgNAoAGYIPB3xUclQlFVV3L5lwfsbp4PQPomJohHowlWgi3GRAEybM5+ZL9xny0YfpJOsthA==} cpu: [x64] os: [win32] @@ -3104,23 +3104,23 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.133.34': - resolution: {integrity: sha512-4Vlx2uHdCINLM47xtNR37B0yLGpoN4sOz0aQWmXfP6o3nj8MYvOjYEZIwA+JZ643PckgAstpLfGZmkh/eWgE/Q==} + '@tanstack/react-router-devtools@1.133.36': + resolution: {integrity: sha512-il+DNzc8Ia54N+HOmIlY10NBk7rp0N7Nyysk8eeC1ZSIXImC3MPchdAspwioE6DI7WfK+MfpTav2m9zoOL8wSQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.133.32 + '@tanstack/react-router': ^1.133.36 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.133.32': - resolution: {integrity: sha512-UqakhaFJ+r5S+b4/AvLux70Hk+1MpmwfKwbdV7vuM2bVRUSztM8xtcttVpzZwRV45Ls8YsStY58prEVdCpvkNg==} + '@tanstack/react-router@1.133.36': + resolution: {integrity: sha512-pT4d2uEucDQ3SAIQ0pLUw6RUKwkB5pHzpBB6otaoKpO0cAwHkRPi+p59DivuzSANJLHLVEiXyJCCk72EeHMRxA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-store@0.7.0': - resolution: {integrity: sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==} + '@tanstack/react-store@0.8.0': + resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} 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 @@ -3138,15 +3138,15 @@ packages: 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/router-core@1.133.28': - resolution: {integrity: sha512-HErb1X9F+u4VzguJKafX1p5fSnNnfo7aK8Xxh5cICFMShPBxt9i1K45nUbQaRkf45N1tg4gJ3l8mlmwWRm9WWA==} + '@tanstack/router-core@1.133.36': + resolution: {integrity: sha512-VJ9kFduePsxgjhDW+uKxL6ol9ZpJlaUO2EI9Zmq8AA6uhW/LRg+0/365OZOZaVqNqvx2eKt3MZKHLN+29jd5Uw==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.133.34': - resolution: {integrity: sha512-NYjrYV/Gt8GlD72uIZakv9a2Z2O31n4J/7uOCU0K9pzSMNa0rmYSYHeaB9vzI9Ksv944mvvmOpDnGUpUhwNXAw==} + '@tanstack/router-devtools-core@1.133.36': + resolution: {integrity: sha512-jgXSCfWPLukcjXDf4thpk/0QgLXv61mrvmfh9xc8+xeC5TMeLyz2xBaTghniD2PtdF6eII3vMaTWOpMHj4+cVQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.133.28 + '@tanstack/router-core': ^1.133.36 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -3154,16 +3154,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.133.29': - resolution: {integrity: sha512-Nngp1i7ch22qqLkjsQwoyos8mawL5bG2GjHg8IMOzFbMR+dVQfh9gSkpkhUbLMv8TMb8Na31tyR0/tDr+E/NCA==} + '@tanstack/router-generator@1.133.36': + resolution: {integrity: sha512-3+pJBqkm95/zV7INyhbr688lp1PklZT3wtNNwW9oIxmsBiUJg5hqHWh7z4JgP9E+0D0KAwT535wncWUFfMMZwA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.133.32': - resolution: {integrity: sha512-4YtRrGs5nq/sZmwwT/jmS1LiucEevsWjxzTEilHRBtjeMgFbrhnQ7jBHHRPym71C40W/9tEgzcQS3dGq5LC5+g==} + '@tanstack/router-plugin@1.133.36': + resolution: {integrity: sha512-y0vttpDRFbniPk2EOS93wxfNA0SqvD/anj6kXTIl/3caW0rvOC4MzMXV09atJ+3jMSOgHFniljKQj/66AY5dZg==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.133.32 + '@tanstack/react-router': ^1.133.36 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -3190,8 +3190,8 @@ packages: '@tanstack/react-router': '>=1.43.2' zod: '>=3' - '@tanstack/store@0.7.0': - resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + '@tanstack/store@0.8.0': + resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} '@tanstack/table-core@8.21.3': resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} @@ -6036,10 +6036,6 @@ packages: javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - jiti@2.6.0: - resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -6161,8 +6157,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - knip@5.66.3: - resolution: {integrity: sha512-BEe9ZCI8fm4TJzehnrCt+L/Faqu6qfMH6VrwSfck+lCGotQzf0jh5dVXysPWjWqMpdUSr6+MpMu9JW/G6wiAcQ==} + knip@5.66.4: + resolution: {integrity: sha512-HmTnxdmoHAvwKmFktRGY1++tXRI8J36eVrOpfj/ybTVVT1QBKBlbBEN1s3cJBx9UL+hXTZDNQif+gs7fUKldbw==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -6810,8 +6806,8 @@ packages: resolution: {integrity: sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw==} engines: {node: '>=20.0.0'} - oxc-resolver@11.8.3: - resolution: {integrity: sha512-wPY3eiw24QOiNqArh5FWRrKYr1Yuxya8bE8CV7yBfz7jodCrg0HqBu6cvHHSicxFug7D4TN6ox1hysA9arHTqw==} + oxc-resolver@11.12.0: + resolution: {integrity: sha512-zmS2q2txiB+hS2u0aiIwmvITIJN8c8ThlWoWB762Wx5nUw8WBlttp0rzt8nnuP1cGIq9YJ7sGxfsgokm+SQk5Q==} p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} @@ -10577,7 +10573,7 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@napi-rs/wasm-runtime@1.0.5': + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -10858,63 +10854,63 @@ snapshots: '@oxc-project/types@0.74.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.8.3': + '@oxc-resolver/binding-android-arm-eabi@11.12.0': optional: true - '@oxc-resolver/binding-android-arm64@11.8.3': + '@oxc-resolver/binding-android-arm64@11.12.0': optional: true - '@oxc-resolver/binding-darwin-arm64@11.8.3': + '@oxc-resolver/binding-darwin-arm64@11.12.0': optional: true - '@oxc-resolver/binding-darwin-x64@11.8.3': + '@oxc-resolver/binding-darwin-x64@11.12.0': optional: true - '@oxc-resolver/binding-freebsd-x64@11.8.3': + '@oxc-resolver/binding-freebsd-x64@11.12.0': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.3': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.12.0': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.8.3': + '@oxc-resolver/binding-linux-arm-musleabihf@11.12.0': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.8.3': + '@oxc-resolver/binding-linux-arm64-gnu@11.12.0': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.8.3': + '@oxc-resolver/binding-linux-arm64-musl@11.12.0': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.8.3': + '@oxc-resolver/binding-linux-ppc64-gnu@11.12.0': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.8.3': + '@oxc-resolver/binding-linux-riscv64-gnu@11.12.0': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.8.3': + '@oxc-resolver/binding-linux-riscv64-musl@11.12.0': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.8.3': + '@oxc-resolver/binding-linux-s390x-gnu@11.12.0': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.8.3': + '@oxc-resolver/binding-linux-x64-gnu@11.12.0': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.8.3': + '@oxc-resolver/binding-linux-x64-musl@11.12.0': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.8.3': + '@oxc-resolver/binding-wasm32-wasi@11.12.0': dependencies: - '@napi-rs/wasm-runtime': 1.0.5 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.8.3': + '@oxc-resolver/binding-win32-arm64-msvc@11.12.0': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.8.3': + '@oxc-resolver/binding-win32-ia32-msvc@11.12.0': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.8.3': + '@oxc-resolver/binding-win32-x64-msvc@11.12.0': optional: true '@parcel/watcher-android-arm64@2.4.1': @@ -11447,10 +11443,10 @@ snapshots: '@tanstack/query-core': 5.90.5 react: 19.2.0 - '@tanstack/react-router-devtools@1.133.34(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.133.34(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-devtools-core': 1.133.36(@tanstack/router-core@1.133.36)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) vite: 7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1) @@ -11471,20 +11467,20 @@ snapshots: - tsx - yaml - '@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/history': 1.133.28 - '@tanstack/react-store': 0.7.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.133.28 + '@tanstack/react-store': 0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.36 isbot: 5.1.28 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-store@0.7.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-store@0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/store': 0.7.0 + '@tanstack/store': 0.8.0 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) @@ -11501,19 +11497,19 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@tanstack/router-core@1.133.28': + '@tanstack/router-core@1.133.36': dependencies: '@tanstack/history': 1.133.28 - '@tanstack/store': 0.7.0 + '@tanstack/store': 0.8.0 cookie-es: 2.0.0 seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.133.34(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.133.36(@tanstack/router-core@1.133.36)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.133.28 + '@tanstack/router-core': 1.133.36 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.5 @@ -11534,9 +11530,9 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.133.29': + '@tanstack/router-generator@1.133.36': dependencies: - '@tanstack/router-core': 1.133.28 + '@tanstack/router-core': 1.133.36 '@tanstack/router-utils': 1.133.19 '@tanstack/virtual-file-routes': 1.133.19 prettier: 3.6.2 @@ -11547,7 +11543,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11555,8 +11551,8 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.133.28 - '@tanstack/router-generator': 1.133.29 + '@tanstack/router-core': 1.133.36 + '@tanstack/router-generator': 1.133.36 '@tanstack/router-utils': 1.133.19 '@tanstack/virtual-file-routes': 1.133.19 babel-dead-code-elimination: 1.0.10 @@ -11564,7 +11560,7 @@ snapshots: unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) vite: 7.1.10(@types/node@24.8.1)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11582,12 +11578,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)': + '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)': dependencies: - '@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) zod: 4.1.12 - '@tanstack/store@0.7.0': {} + '@tanstack/store@0.8.0': {} '@tanstack/table-core@8.21.3': {} @@ -12894,7 +12890,7 @@ snapshots: dependencies: '@types/node': 24.8.1 cosmiconfig: 9.0.0(typescript@5.9.3) - jiti: 2.6.0 + jiti: 2.6.1 typescript: 5.9.3 cosmiconfig@7.1.0: @@ -14866,8 +14862,6 @@ snapshots: javascript-natural-sort@0.7.1: optional: true - jiti@2.6.0: {} - jiti@2.6.1: {} jju@1.4.0: {} @@ -14954,16 +14948,16 @@ snapshots: kind-of@6.0.3: {} - knip@5.66.3(@types/node@24.8.1)(typescript@5.9.3): + knip@5.66.4(@types/node@24.8.1)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.8.1 fast-glob: 3.3.3 formatly: 0.3.0 - jiti: 2.6.0 + jiti: 2.6.1 js-yaml: 4.1.0 minimist: 1.2.8 - oxc-resolver: 11.8.3 + oxc-resolver: 11.12.0 picocolors: 1.1.1 picomatch: 4.0.3 smol-toml: 1.4.2 @@ -15779,29 +15773,27 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc': 0.74.0 '@oxc-parser/binding-win32-x64-msvc': 0.74.0 - oxc-resolver@11.8.3: - dependencies: - napi-postinstall: 0.3.0 + oxc-resolver@11.12.0: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.8.3 - '@oxc-resolver/binding-android-arm64': 11.8.3 - '@oxc-resolver/binding-darwin-arm64': 11.8.3 - '@oxc-resolver/binding-darwin-x64': 11.8.3 - '@oxc-resolver/binding-freebsd-x64': 11.8.3 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.8.3 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.8.3 - '@oxc-resolver/binding-linux-arm64-gnu': 11.8.3 - '@oxc-resolver/binding-linux-arm64-musl': 11.8.3 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.8.3 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.8.3 - '@oxc-resolver/binding-linux-riscv64-musl': 11.8.3 - '@oxc-resolver/binding-linux-s390x-gnu': 11.8.3 - '@oxc-resolver/binding-linux-x64-gnu': 11.8.3 - '@oxc-resolver/binding-linux-x64-musl': 11.8.3 - '@oxc-resolver/binding-wasm32-wasi': 11.8.3 - '@oxc-resolver/binding-win32-arm64-msvc': 11.8.3 - '@oxc-resolver/binding-win32-ia32-msvc': 11.8.3 - '@oxc-resolver/binding-win32-x64-msvc': 11.8.3 + '@oxc-resolver/binding-android-arm-eabi': 11.12.0 + '@oxc-resolver/binding-android-arm64': 11.12.0 + '@oxc-resolver/binding-darwin-arm64': 11.12.0 + '@oxc-resolver/binding-darwin-x64': 11.12.0 + '@oxc-resolver/binding-freebsd-x64': 11.12.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.12.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.12.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.12.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.12.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.12.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.12.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.12.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.12.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.12.0 + '@oxc-resolver/binding-linux-x64-musl': 11.12.0 + '@oxc-resolver/binding-wasm32-wasi': 11.12.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.12.0 + '@oxc-resolver/binding-win32-ia32-msvc': 11.12.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.12.0 p-cancelable@2.1.1: {} diff --git a/lede/package/libs/mbedtls/Config.in b/lede/package/libs/mbedtls/Config.in index ffabd799d3..2009d5db96 100644 --- a/lede/package/libs/mbedtls/Config.in +++ b/lede/package/libs/mbedtls/Config.in @@ -8,6 +8,10 @@ config MBEDTLS_AES_C bool "MBEDTLS_AES_C" default y +config MBEDTLS_ARIA_C + bool "MBEDTLS_ARIA_C" + default n + config MBEDTLS_CAMELLIA_C bool "MBEDTLS_CAMELLIA_C" default n @@ -36,10 +40,6 @@ config MBEDTLS_RIPEMD160_C bool "MBEDTLS_RIPEMD160_C" default n -config MBEDTLS_XTEA_C - bool "MBEDTLS_XTEA_C" - default n - config MBEDTLS_RSA_NO_CRT bool "MBEDTLS_RSA_NO_CRT" default y @@ -84,6 +84,10 @@ config MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED bool "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED" default n +config MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED + bool "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED" + default n + comment "Curves - unselect old or less-used curves to reduce binary size" config MBEDTLS_ECP_DP_SECP192R1_ENABLED @@ -104,7 +108,7 @@ config MBEDTLS_ECP_DP_SECP384R1_ENABLED config MBEDTLS_ECP_DP_SECP521R1_ENABLED bool "MBEDTLS_ECP_DP_SECP521R1_ENABLED" - default n + default y config MBEDTLS_ECP_DP_SECP192K1_ENABLED bool "MBEDTLS_ECP_DP_SECP192K1_ENABLED" @@ -140,10 +144,6 @@ config MBEDTLS_ECP_DP_CURVE448_ENABLED comment "Build Options - unselect features to reduce binary size" -config MBEDTLS_CERTS_C - bool "MBEDTLS_CERTS_C" - default n - config MBEDTLS_CIPHER_MODE_OFB bool "MBEDTLS_CIPHER_MODE_OFB" default n @@ -168,9 +168,12 @@ config MBEDTLS_SELF_TEST bool "MBEDTLS_SELF_TEST" default n -config MBEDTLS_SSL_TRUNCATED_HMAC - bool "MBEDTLS_SSL_TRUNCATED_HMAC" - default n +config MBEDTLS_THREADING_C + bool "MBEDTLS_THREADING_C" + default y + +config MBEDTLS_THREADING_PTHREAD + def_bool MBEDTLS_THREADING_C config MBEDTLS_VERSION_C bool "MBEDTLS_VERSION_C" @@ -180,6 +183,43 @@ config MBEDTLS_VERSION_FEATURES bool "MBEDTLS_VERSION_FEATURES" default n +config MBEDTLS_PSA_CRYPTO_CLIENT + bool "MBEDTLS_PSA_CRYPTO_CLIENT" + +config MBEDTLS_DEPRECATED_WARNING + bool "MBEDTLS_DEPRECATED_WARNING" + default n + +config MBEDTLS_SSL_PROTO_TLS1_2 + bool "MBEDTLS_SSL_PROTO_TLS1_2" + default y + +config MBEDTLS_SSL_PROTO_TLS1_3 + bool "MBEDTLS_SSL_PROTO_TLS1_3" + select MBEDTLS_PSA_CRYPTO_CLIENT + select MBEDTLS_HKDF_C + default y + +config MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE + bool "MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE" + depends on MBEDTLS_SSL_PROTO_TLS1_3 + default y + +config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED + bool "MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED" + depends on MBEDTLS_SSL_PROTO_TLS1_3 + default y + +config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED + bool "MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED" + depends on MBEDTLS_SSL_PROTO_TLS1_3 + default y + +config MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED + bool "MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED" + depends on MBEDTLS_SSL_PROTO_TLS1_3 + default y + comment "Build Options" config MBEDTLS_ENTROPY_FORCE_SHA256 @@ -188,6 +228,7 @@ config MBEDTLS_ENTROPY_FORCE_SHA256 config MBEDTLS_SSL_RENEGOTIATION bool "MBEDTLS_SSL_RENEGOTIATION" + depends on MBEDTLS_SSL_PROTO_TLS1_2 default n endif diff --git a/lede/package/libs/mbedtls/Makefile b/lede/package/libs/mbedtls/Makefile index 4e0a4a034f..7122f5a5b3 100644 --- a/lede/package/libs/mbedtls/Makefile +++ b/lede/package/libs/mbedtls/Makefile @@ -8,16 +8,16 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mbedtls -PKG_VERSION:=2.28.5 +PKG_VERSION:=3.6.5 PKG_RELEASE:=1 PKG_USE_MIPS16:=0 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/ARMmbed/mbedtls/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=849e86b626e42ded6bf67197b64aa771daa54e2a7e2868dc67e1e4711959e5e3 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL=https://github.com/Mbed-TLS/$(PKG_NAME)/releases/download/$(PKG_NAME)-$(PKG_VERSION) +PKG_HASH:=4a11f1777bb95bf4ad96721cac945a26e04bf19f57d905f241fe77ebeddf46d8 PKG_LICENSE:=GPL-2.0-or-later -PKG_LICENSE_FILES:=gpl-2.0.txt +PKG_LICENSE_FILES:=LICENSE PKG_CPE_ID:=cpe:/a:arm:mbed_tls MBEDTLS_BUILD_OPTS_CURVES= \ @@ -37,6 +37,7 @@ MBEDTLS_BUILD_OPTS_CURVES= \ MBEDTLS_BUILD_OPTS_CIPHERS= \ CONFIG_MBEDTLS_AES_C \ + CONFIG_MBEDTLS_ARIA_C \ CONFIG_MBEDTLS_CAMELLIA_C \ CONFIG_MBEDTLS_CCM_C \ CONFIG_MBEDTLS_CMAC_C \ @@ -52,15 +53,17 @@ MBEDTLS_BUILD_OPTS_CIPHERS= \ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED \ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED \ CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED \ + CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED \ CONFIG_MBEDTLS_NIST_KW_C \ CONFIG_MBEDTLS_RIPEMD160_C \ CONFIG_MBEDTLS_RSA_NO_CRT \ - CONFIG_MBEDTLS_XTEA_C + CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED \ + CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED \ + CONFIG_MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED MBEDTLS_BUILD_OPTS= \ $(MBEDTLS_BUILD_OPTS_CURVES) \ $(MBEDTLS_BUILD_OPTS_CIPHERS) \ - CONFIG_MBEDTLS_CERTS_C \ CONFIG_MBEDTLS_CIPHER_MODE_OFB \ CONFIG_MBEDTLS_CIPHER_MODE_XTS \ CONFIG_MBEDTLS_DEBUG_C \ @@ -69,9 +72,15 @@ MBEDTLS_BUILD_OPTS= \ CONFIG_MBEDTLS_PLATFORM_C \ CONFIG_MBEDTLS_SELF_TEST \ CONFIG_MBEDTLS_SSL_RENEGOTIATION \ - CONFIG_MBEDTLS_SSL_TRUNCATED_HMAC \ + CONFIG_MBEDTLS_THREADING_C \ + CONFIG_MBEDTLS_THREADING_PTHREAD \ CONFIG_MBEDTLS_VERSION_C \ - CONFIG_MBEDTLS_VERSION_FEATURES + CONFIG_MBEDTLS_VERSION_FEATURES \ + CONFIG_MBEDTLS_PSA_CRYPTO_CLIENT \ + CONFIG_MBEDTLS_DEPRECATED_WARNING \ + CONFIG_MBEDTLS_SSL_PROTO_TLS1_2 \ + CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 \ + CONFIG_MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE PKG_CONFIG_DEPENDS := $(MBEDTLS_BUILD_OPTS) @@ -80,7 +89,7 @@ include $(INCLUDE_DIR)/cmake.mk define Package/mbedtls/Default TITLE:=Embedded SSL - URL:=https://tls.mbed.org + URL:=https://www.trustedfirmware.org/projects/mbed-tls/ endef define Package/mbedtls/Default/description @@ -94,7 +103,7 @@ $(call Package/mbedtls/Default) CATEGORY:=Libraries SUBMENU:=SSL TITLE+= (library) - ABI_VERSION:=12 + ABI_VERSION:=21 MENU:=1 endef @@ -136,16 +145,26 @@ define Build/Prepare $(if $(strip $(foreach opt,$(MBEDTLS_BUILD_OPTS),$($(opt)))), $(foreach opt,$(MBEDTLS_BUILD_OPTS), $(PKG_BUILD_DIR)/scripts/config.py \ - -f $(PKG_BUILD_DIR)/include/mbedtls/config.h \ + -f $(PKG_BUILD_DIR)/include/mbedtls/mbedtls_config.h \ $(if $($(opt)),set,unset) $(patsubst CONFIG_%,%,$(opt))),) endef define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include - $(CP) $(PKG_INSTALL_DIR)/usr/include/mbedtls $(1)/usr/include/ + $(CP) \ + $(PKG_INSTALL_DIR)/usr/include/mbedtls \ + $(PKG_INSTALL_DIR)/usr/include/psa \ + $(1)/usr/include/ $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib*.so* $(1)/usr/lib/ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib*.a $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/cmake $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mbedcrypto.pc \ + $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mbedtls.pc \ + $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mbedx509.pc \ + $(1)/usr/lib/pkgconfig/ endef define Package/libmbedtls/install diff --git a/lede/package/libs/mbedtls/patches/100-fix-gcc14-build.patch b/lede/package/libs/mbedtls/patches/100-fix-gcc14-build.patch new file mode 100644 index 0000000000..656e605814 --- /dev/null +++ b/lede/package/libs/mbedtls/patches/100-fix-gcc14-build.patch @@ -0,0 +1,11 @@ +--- a/library/common.h ++++ b/library/common.h +@@ -199,7 +199,7 @@ static inline void mbedtls_xor(unsigned + uint8x16_t x = veorq_u8(v1, v2); + vst1q_u8(r + i, x); + } +-#if defined(__IAR_SYSTEMS_ICC__) ++#if defined(__IAR_SYSTEMS_ICC__) || (defined(MBEDTLS_COMPILER_IS_GCC) && MBEDTLS_GCC_VERSION >= 140100) + /* This if statement helps some compilers (e.g., IAR) optimise out the byte-by-byte tail case + * where n is a constant multiple of 16. + * For other compilers (e.g. recent gcc and clang) it makes no difference if n is a compile-time diff --git a/lede/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch b/lede/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch deleted file mode 100644 index 4ad2e8c7db..0000000000 --- a/lede/package/libs/mbedtls/patches/100-x509-crt-verify-SAN-iPAddress.patch +++ /dev/null @@ -1,197 +0,0 @@ -From eb9d4fdf1846e688d51d86a9a50f0312aca2af25 Mon Sep 17 00:00:00 2001 -From: Glenn Strauss -Date: Sun, 23 Oct 2022 19:48:18 -0400 -Subject: [PATCH] x509 crt verify SAN iPAddress - -Signed-off-by: Glenn Strauss ---- - include/mbedtls/x509_crt.h | 2 +- - library/x509_crt.c | 126 ++++++++++++++++++++++++++++++------- - 2 files changed, 103 insertions(+), 25 deletions(-) - ---- a/include/mbedtls/x509_crt.h -+++ b/include/mbedtls/x509_crt.h -@@ -608,7 +608,7 @@ int mbedtls_x509_crt_verify_info(char *b - * \param cn The expected Common Name. This will be checked to be - * present in the certificate's subjectAltNames extension or, - * if this extension is absent, as a CN component in its -- * Subject name. Currently only DNS names are supported. This -+ * Subject name. DNS names and IP addresses are supported. This - * may be \c NULL if the CN need not be verified. - * \param flags The address at which to store the result of the verification. - * If the verification couldn't be completed, the flag value is ---- a/library/x509_crt.c -+++ b/library/x509_crt.c -@@ -57,6 +57,10 @@ - - #if defined(MBEDTLS_HAVE_TIME) - #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) -+#define WIN32_LEAN_AND_MEAN -+#ifndef _WIN32_WINNT -+#define _WIN32_WINNT 0x0600 -+#endif - #include - #else - #include -@@ -3002,6 +3006,61 @@ find_parent: - } - } - -+#ifdef _WIN32 -+#ifdef _MSC_VER -+#pragma comment(lib, "ws2_32.lib") -+#include -+#include -+#elif (defined(__MINGW32__) || defined(__MINGW64__)) && _WIN32_WINNT >= 0x0600 -+#include -+#include -+#endif -+#elif defined(__sun) -+/* Solaris requires -lsocket -lnsl for inet_pton() */ -+#elif defined(__has_include) -+#if __has_include() -+#include -+#endif -+#if __has_include() -+#include -+#endif -+#endif -+ -+/* Use whether or not AF_INET6 is defined to indicate whether or not to use -+ * the platform inet_pton() or a local implementation (below). The local -+ * implementation may be used even in cases where the platform provides -+ * inet_pton(), e.g. when there are different includes required and/or the -+ * platform implementation requires dependencies on additional libraries. -+ * Specifically, Windows requires custom includes and additional link -+ * dependencies, and Solaris requires additional link dependencies. -+ * Also, as a coarse heuristic, use the local implementation if the compiler -+ * does not support __has_include(), or if the definition of AF_INET6 is not -+ * provided by headers included (or not) via __has_include() above. */ -+#ifndef AF_INET6 -+ -+#define x509_cn_inet_pton(cn, dst) (0) -+ -+#else -+ -+static int x509_inet_pton_ipv6(const char *src, void *dst) -+{ -+ return inet_pton(AF_INET6, src, dst) == 1 ? 0 : -1; -+} -+ -+static int x509_inet_pton_ipv4(const char *src, void *dst) -+{ -+ return inet_pton(AF_INET, src, dst) == 1 ? 0 : -1; -+} -+ -+#endif /* AF_INET6 */ -+ -+static size_t x509_cn_inet_pton(const char *cn, void *dst) -+{ -+ return strchr(cn, ':') == NULL -+ ? x509_inet_pton_ipv4(cn, dst) == 0 ? 4 : 0 -+ : x509_inet_pton_ipv6(cn, dst) == 0 ? 16 : 0; -+} -+ - /* - * Check for CN match - */ -@@ -3022,24 +3081,51 @@ static int x509_crt_check_cn(const mbedt - return -1; - } - -+static int x509_crt_check_san_ip(const mbedtls_x509_sequence *san, -+ const char *cn, size_t cn_len) -+{ -+ uint32_t ip[4]; -+ cn_len = x509_cn_inet_pton(cn, ip); -+ if (cn_len == 0) { -+ return -1; -+ } -+ -+ for (const mbedtls_x509_sequence *cur = san; cur != NULL; cur = cur->next) { -+ const unsigned char san_type = (unsigned char) cur->buf.tag & -+ MBEDTLS_ASN1_TAG_VALUE_MASK; -+ if (san_type == MBEDTLS_X509_SAN_IP_ADDRESS && -+ cur->buf.len == cn_len && memcmp(cur->buf.p, ip, cn_len) == 0) { -+ return 0; -+ } -+ } -+ -+ return -1; -+} -+ - /* - * Check for SAN match, see RFC 5280 Section 4.2.1.6 - */ --static int x509_crt_check_san(const mbedtls_x509_buf *name, -+static int x509_crt_check_san(const mbedtls_x509_sequence *san, - const char *cn, size_t cn_len) - { -- const unsigned char san_type = (unsigned char) name->tag & -- MBEDTLS_ASN1_TAG_VALUE_MASK; -- -- /* dNSName */ -- if (san_type == MBEDTLS_X509_SAN_DNS_NAME) { -- return x509_crt_check_cn(name, cn, cn_len); -+ int san_ip = 0; -+ for (const mbedtls_x509_sequence *cur = san; cur != NULL; cur = cur->next) { -+ switch ((unsigned char) cur->buf.tag & MBEDTLS_ASN1_TAG_VALUE_MASK) { -+ case MBEDTLS_X509_SAN_DNS_NAME: /* dNSName */ -+ if (x509_crt_check_cn(&cur->buf, cn, cn_len) == 0) { -+ return 0; -+ } -+ break; -+ case MBEDTLS_X509_SAN_IP_ADDRESS: /* iPAddress */ -+ san_ip = 1; -+ break; -+ /* (We may handle other types here later.) */ -+ default: /* Unrecognized type */ -+ break; -+ } - } - -- /* (We may handle other types here later.) */ -- -- /* Unrecognized type */ -- return -1; -+ return san_ip ? x509_crt_check_san_ip(san, cn, cn_len) : -1; - } - - /* -@@ -3050,31 +3136,23 @@ static void x509_crt_verify_name(const m - uint32_t *flags) - { - const mbedtls_x509_name *name; -- const mbedtls_x509_sequence *cur; - size_t cn_len = strlen(cn); - - if (crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME) { -- for (cur = &crt->subject_alt_names; cur != NULL; cur = cur->next) { -- if (x509_crt_check_san(&cur->buf, cn, cn_len) == 0) { -- break; -- } -- } -- -- if (cur == NULL) { -- *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; -+ if (x509_crt_check_san(&crt->subject_alt_names, cn, cn_len) == 0) { -+ return; - } - } else { - for (name = &crt->subject; name != NULL; name = name->next) { - if (MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0 && - x509_crt_check_cn(&name->val, cn, cn_len) == 0) { -- break; -+ return; - } - } - -- if (name == NULL) { -- *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; -- } - } -+ -+ *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; - } - - /* diff --git a/lede/package/libs/mbedtls/patches/101-remove-test.patch b/lede/package/libs/mbedtls/patches/101-remove-test.patch index e43f8757d7..e584a8036c 100644 --- a/lede/package/libs/mbedtls/patches/101-remove-test.patch +++ b/lede/package/libs/mbedtls/patches/101-remove-test.patch @@ -1,7 +1,9 @@ --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt -@@ -1,12 +1,8 @@ +@@ -3,14 +3,10 @@ add_custom_target(${programs_target}) + add_subdirectory(aes) + add_subdirectory(cipher) -if (NOT WIN32) - add_subdirectory(fuzz) -endif() diff --git a/mieru/Makefile b/mieru/Makefile index b651cfa7c5..b25be1cbdd 100644 --- a/mieru/Makefile +++ b/mieru/Makefile @@ -366,6 +366,7 @@ test-binary: CGO_ENABLED=1 go build -race -ldflags="-X 'github.com/enfein/mieru/v3/pkg/log.LogPrefix=C2'" -o mieru2 cmd/mieru/mieru.go CGO_ENABLED=1 go build -race -ldflags="-X 'github.com/enfein/mieru/v3/pkg/log.LogPrefix=S2'" -o mita2 cmd/mita/mita.go CGO_ENABLED=0 go build test/cmd/exampleapiclient/exampleapiclient.go + CGO_ENABLED=0 go build test/cmd/exampleapiserver/exampleapiserver.go CGO_ENABLED=0 go build test/cmd/httpserver/httpserver.go CGO_ENABLED=0 go build test/cmd/sockshttpclient/sockshttpclient.go CGO_ENABLED=0 go build test/cmd/socksudpclient/socksudpclient.go @@ -379,7 +380,7 @@ test-container-image: test-binary docker build -t mieru_apiclient:${SHORT_SHA} -f test/deploy/apiclient/Dockerfile . docker build -t mieru_proxychain:${SHORT_SHA} -f test/deploy/proxychain/Dockerfile . fi - rm -f exampleapiclient mieru mieru2 mita mita2 httpserver sockshttpclient socksudpclient udpserver + rm -f exampleapiclient exampleapiserver mieru mieru2 mita mita2 httpserver sockshttpclient socksudpclient udpserver # Run docker integration tests. .PHONY: run-container-test diff --git a/mieru/apis/internal/early_conn.go b/mieru/apis/internal/early_conn.go index 5923b325bd..d8d78c1978 100644 --- a/mieru/apis/internal/early_conn.go +++ b/mieru/apis/internal/early_conn.go @@ -30,7 +30,7 @@ import ( // EarlyConn implements net.Conn interface. // When the Write() method on the net.Conn is called for the first time, // it performs the initial handshake and writes -// the request or response to the peer. +// the request or response to the peer within the same network packet. type EarlyConn struct { net.Conn request atomic.Pointer[model.Request] diff --git a/mieru/test/cmd/exampleapiclient/exampleapiclient.go b/mieru/test/cmd/exampleapiclient/exampleapiclient.go index c2e8ceecaf..632109f9ca 100644 --- a/mieru/test/cmd/exampleapiclient/exampleapiclient.go +++ b/mieru/test/cmd/exampleapiclient/exampleapiclient.go @@ -125,6 +125,7 @@ func main() { panic(err) } fmt.Printf("API client is listening to %v\n", l.Addr()) + for { conn, err := l.Accept() if err != nil { @@ -146,32 +147,30 @@ func handleOneSocks5Conn(c client.Client, conn net.Conn) { } // Find destination. - socks5Header := make([]byte, 3) - if _, err := io.ReadFull(conn, socks5Header); err != nil { - panic(fmt.Sprintf("Read socks5 header failed: %v", err)) - } - netAddr := model.NetAddrSpec{} - var isTCP, isUDP bool - if socks5Header[1] == constant.Socks5ConnectCmd { - netAddr.Net = "tcp" - isTCP = true - } else if socks5Header[1] == constant.Socks5UDPAssociateCmd { - netAddr.Net = "udp" - isUDP = true - } else { - panic(fmt.Sprintf("Socks5 command %d is invalid", socks5Header[1])) - } - if err := netAddr.ReadFromSocks5(conn); err != nil { + var req model.Request + if err := req.ReadFromSocks5(conn); err != nil { panic(fmt.Sprintf("ReadFromSocks5() failed: %v", err)) } + var isTCP, isUDP bool + switch req.Command { + case constant.Socks5ConnectCmd: + isTCP = true + case constant.Socks5UDPAssociateCmd: + isUDP = true + default: + panic(fmt.Sprintf("Invalid socks5 command %d", req.Command)) + } + netAddr, err := req.ToNetAddrSpec() + if err != nil { + panic(fmt.Sprintf("ToNetAddrSpec() failed: %v", err)) + } if *debug { - fmt.Printf("Destination network: %v, address: %v\n", netAddr.Network(), netAddr.String()) + fmt.Printf("Destination address: %v\n", req.DstAddr) } // Dial to proxy server and do handshake. ctx := context.Background() var proxyConn net.Conn - var err error proxyConn, err = c.DialContext(ctx, netAddr) if err != nil { panic(fmt.Sprintf("DialContext() failed: %v", err)) diff --git a/mieru/test/cmd/exampleapiserver/exampleapiserver.go b/mieru/test/cmd/exampleapiserver/exampleapiserver.go new file mode 100644 index 0000000000..446b5bfd27 --- /dev/null +++ b/mieru/test/cmd/exampleapiserver/exampleapiserver.go @@ -0,0 +1,101 @@ +// Copyright (C) 2025 mieru authors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package main + +import ( + "flag" + "fmt" + "net" + + "github.com/enfein/mieru/v3/apis/model" + "github.com/enfein/mieru/v3/apis/server" + "github.com/enfein/mieru/v3/pkg/appctl/appctlpb" + "google.golang.org/protobuf/proto" +) + +var ( + port = flag.Int("port", 0, "mieru API server proxy port to listen") + protocol = flag.String("protocol", "TCP", "Proxy transport protocol: TCP or UDP") + username = flag.String("username", "", "mieru username") + password = flag.String("password", "", "mieru password") + useEarlyConn = flag.Bool("use_early_conn", false, "Reply and payload use the same network packet") + debug = flag.Bool("debug", false, "Display debug messages") +) + +func main() { + flag.Parse() + if *port < 1 || *port > 65535 { + panic(fmt.Sprintf("port %d is invalid", *port)) + } + var transportProtocol *appctlpb.TransportProtocol + switch *protocol { + case "TCP": + transportProtocol = appctlpb.TransportProtocol_TCP.Enum() + case "UDP": + transportProtocol = appctlpb.TransportProtocol_UDP.Enum() + default: + panic(fmt.Sprintf("Transport protocol %q is invalid", *protocol)) + } + if *username == "" { + panic("username is not set") + } + if *password == "" { + panic("password is not set") + } + + s := server.NewServer() + if err := s.Store(&server.ServerConfig{ + Config: &appctlpb.ServerConfig{ + PortBindings: []*appctlpb.PortBinding{ + { + Port: proto.Int32(int32(*port)), + Protocol: transportProtocol, + }, + }, + Users: []*appctlpb.User{ + { + Name: username, + Password: password, + AllowPrivateIP: proto.Bool(true), + AllowLoopbackIP: proto.Bool(true), + }, + }, + }, + }); err != nil { + panic(err) + } + if _, err := s.Load(); err != nil { + panic(err) + } + + if err := s.Start(); err != nil { + panic(err) + } + if !s.IsRunning() { + panic("server is not running after start") + } + fmt.Printf("API server is listening to %s port %d\n", *protocol, *port) + + for { + conn, req, err := s.Accept() + if err != nil { + panic(err) + } + handleOneProxyConn(s, conn, req) + } +} + +func handleOneProxyConn(s server.Server, conn net.Conn, req *model.Request) {} diff --git a/openwrt-packages/ddns-go/Makefile b/openwrt-packages/ddns-go/Makefile index 8511b6a009..ddda923fa2 100644 --- a/openwrt-packages/ddns-go/Makefile +++ b/openwrt-packages/ddns-go/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-go -PKG_VERSION:=6.13.0 +PKG_VERSION:=6.13.1 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=e1d2201d5b237ad55de8cfe3451705fc75a9deeb9765637cfe8c2c362216b4ba +PKG_HASH:=3f71e243d93b19b9e08d1205a4e0868bf41cf70a18a029d1175a076ff8408169 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE diff --git a/openwrt-packages/luci-app-amlogic/Makefile b/openwrt-packages/luci-app-amlogic/Makefile index decb3c02e1..e9805d6310 100644 --- a/openwrt-packages/luci-app-amlogic/Makefile +++ b/openwrt-packages/luci-app-amlogic/Makefile @@ -16,7 +16,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-amlogic -PKG_VERSION:=3.1.273 +PKG_VERSION:=3.1.276 PKG_RELEASE:=1 PKG_LICENSE:=GPL-2.0 License diff --git a/openwrt-packages/luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua b/openwrt-packages/luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua index b58287a031..8e2dd4cddf 100644 --- a/openwrt-packages/luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua +++ b/openwrt-packages/luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua @@ -1,15 +1,15 @@ --Remove the spaces in the string function trim(str) - --return (string.gsub(str, "^%s*(.-)%s*$", "%1")) - return (string.gsub(str, "%s+", "")) + --return (string.gsub(str, "^%s*(.-)%s*$", "%1")) + return (string.gsub(str, "%s+", "")) end --Auto-complete node local check_config_amlogic = luci.sys.exec("uci get amlogic.@amlogic[0].amlogic_firmware_repo 2>/dev/null") or "" if (trim(check_config_amlogic) == "") then - luci.sys.exec("uci delete amlogic.@amlogic[0] 2>/dev/null") - luci.sys.exec("uci set amlogic.config='amlogic' 2>/dev/null") - luci.sys.exec("uci commit amlogic 2>/dev/null") + luci.sys.exec("uci delete amlogic.@amlogic[0] 2>/dev/null") + luci.sys.exec("uci set amlogic.config='amlogic' 2>/dev/null") + luci.sys.exec("uci commit amlogic 2>/dev/null") end b = Map("amlogic") @@ -29,20 +29,20 @@ mydevice.default = "PLATFORM: " .. mydevice_platfrom mydevice.rmempty = false --2.Set OpenWrt Firmware Repository -firmware_repo = o:option(Value, "amlogic_firmware_repo", translate("Download repository of OpenWrt:")) -firmware_repo.description = translate("Set the download repository of the OpenWrt files on github.com in [Online Download Update].") +firmware_repo = o:option(Value, "amlogic_firmware_repo", translate("OpenWrt download repository:")) +firmware_repo.description = translate("Set the OpenWrt files download repository on github.com in [Online Download Update].") firmware_repo.default = "https://github.com/breakingbadboy/OpenWrt" firmware_repo.rmempty = false --3.Set OpenWrt Releases's Tag Keywords -firmware_tag = o:option(Value, "amlogic_firmware_tag", translate("Keywords of Tags in Releases:")) -firmware_tag.description = translate("Set the keywords of Tags in Releases of github.com in [Online Download Update].") +firmware_tag = o:option(Value, "amlogic_firmware_tag", translate("OpenWrt download tags keyword:")) +firmware_tag.description = translate("Set the OpenWrt files download tags keyword for github.com in [Online Download Update].") firmware_tag.default = "ARMv8" firmware_tag.rmempty = false --4.Set OpenWrt Firmware Suffix -firmware_suffix = o:option(Value, "amlogic_firmware_suffix", translate("Suffix of OpenWrt files:")) -firmware_suffix.description = translate("Set the suffix of the OpenWrt in Releases of github.com in [Online Download Update].") +firmware_suffix = o:option(Value, "amlogic_firmware_suffix", translate("OpenWrt files suffix:")) +firmware_suffix.description = translate("Set the OpenWrt files download suffix for github.com in [Online Download Update].") firmware_suffix:value(".7z", translate(".7z")) firmware_suffix:value(".zip", translate(".zip")) firmware_suffix:value(".img.gz", translate(".img.gz")) @@ -51,16 +51,76 @@ firmware_suffix.default = ".img.gz" firmware_suffix.rmempty = false --5.Set OpenWrt Kernel DownLoad Path -kernel_path = o:option(Value, "amlogic_kernel_path", translate("Download path of OpenWrt kernel:")) -kernel_path.description = translate("Set the download path of the kernel in the github.com repository in [Online Download Update].") +kernel_path = o:option(Value, "amlogic_kernel_path", translate("Kernel download repository:")) +kernel_path.description = translate("Set the kernel files download repository on github.com in [Online Download Update].") kernel_path:value("https://github.com/breakingbadboy/OpenWrt") kernel_path:value("https://github.com/ophub/kernel") kernel_path.default = "https://github.com/breakingbadboy/OpenWrt" kernel_path.rmempty = false ---6.Set kernel version branch +--6. Set OpenWrt Kernel Tags +-- Read the currently SAVED value of the kernel path. +local current_kernel_path = trim(luci.sys.exec("uci get amlogic.@amlogic[0].amlogic_kernel_path 2>/dev/null") or "") +-- If it's not set yet, use its default value for the logic below. +if current_kernel_path == "" then + current_kernel_path = kernel_path.default +end +-- Define the tag lists. +-- The base list, available for all repositories. +local known_tags = { + kernel_rk3588 = "kernel_rk3588 [Rockchip RK3588 Kernel]", + kernel_rk35xx = "kernel_rk35xx [Rockchip RK35xx Kernel]", + kernel_stable = "kernel_stable [Mainline Stable Kernel]", +} +-- Additional tags only available for the 'ophub/kernel' repository. +local ophub_extra_tags = { + kernel_flippy = "kernel_flippy [Mainline Stable Kernel by Flippy]", + kernel_h6 = "kernel_h6 [Allwinner H6 Kernel]", + kernel_dev = "kernel_dev [Development Kernel]", + kernel_beta = "kernel_beta [Beta Kernel]", +} +-- Conditionally add the extra tags to the list. +if (string.find(current_kernel_path, "ophub/kernel")) then + for value, display_name in pairs(ophub_extra_tags) do + known_tags[value] = display_name + end +end +-- Determine the default kernel tag based on existing config or system info. +local kernel_tagsname +local existing_tag = trim(luci.sys.exec("uci get amlogic.@amlogic[0].amlogic_kernel_tags 2>/dev/null") or "") +if existing_tag ~= "" then + kernel_tagsname = existing_tag +else + local kernel_release_info = trim(luci.sys.exec("uname -r 2>/dev/null")) or "" + + if (string.find(kernel_release_info, "-rk3588")) then + kernel_tagsname = "kernel_rk3588" + elseif (string.find(kernel_release_info, "-rk35xx")) then + kernel_tagsname = "kernel_rk35xx" + elseif (string.find(kernel_release_info, "-h6") or string.find(kernel_release_info, "-zicai")) then + kernel_tagsname = "kernel_h6" + else + kernel_tagsname = "kernel_stable" + end +end +-- Create the kernel tags option. +kernel_tags = o:option(Value, "amlogic_kernel_tags", translate("Kernel download tags:")) +kernel_tags.description = translate("Set the kernel files download tags on github.com in [Online Download Update].") +-- Populate the dropdown with the known tags. +for value, display_name in pairs(known_tags) do + kernel_tags:value(value, translate(display_name)) +end +-- Ensure the default tag is included in the options. +if not known_tags[kernel_tagsname] then + kernel_tags:value(kernel_tagsname, kernel_tagsname) +end +-- Set the default and other properties. +kernel_tags.default = kernel_tagsname +kernel_tags.rmempty = false + +--7.Set kernel version branch kernel_branch = o:option(Value, "amlogic_kernel_branch", translate("Set version branch:")) -kernel_branch.description = translate("Set the version branch of the openwrt firmware and kernel selected in [Online Download Update].") +kernel_branch.description = translate("Set the version branch of the OpenWrt files and kernel selected in [Online Download Update].") kernel_branch:value("5.4", translate("5.4")) kernel_branch:value("5.10", translate("5.10")) kernel_branch:value("5.15", translate("5.15")) @@ -71,19 +131,19 @@ local default_kernel_branch = luci.sys.exec("uname -r | grep -oE '^[1-9].[0-9]{1 kernel_branch.default = trim(default_kernel_branch) kernel_branch.rmempty = false ---7.Restore configuration +--8.Restore configuration firmware_config = o:option(Flag, "amlogic_firmware_config", translate("Keep config update:")) firmware_config.description = translate("Set whether to keep the current config during [Online Download Update] and [Manually Upload Update].") firmware_config.default = "1" firmware_config.rmempty = false ---8.Write bootloader +--9.Write bootloader write_bootloader = o:option(Flag, "amlogic_write_bootloader", translate("Auto write bootloader:")) write_bootloader.description = translate("[Recommended choice] Set whether to auto write bootloader during install and update OpenWrt.") write_bootloader.default = "0" write_bootloader.rmempty = false ---9.Set the file system type of the shared partition +--10.Set the file system type of the shared partition shared_fstype = o:option(ListValue, "amlogic_shared_fstype", translate("Set the file system type:")) shared_fstype.description = translate("[Default ext4] Set the file system type of the shared partition (/mnt/mmcblk*p4) when install OpenWrt.") shared_fstype:value("ext4", translate("ext4")) diff --git a/openwrt-packages/luci-app-amlogic/po/zh-cn/amlogic.po b/openwrt-packages/luci-app-amlogic/po/zh-cn/amlogic.po index 874e2150bf..14ec5f5b7d 100644 --- a/openwrt-packages/luci-app-amlogic/po/zh-cn/amlogic.po +++ b/openwrt-packages/luci-app-amlogic/po/zh-cn/amlogic.po @@ -368,35 +368,62 @@ msgstr "您可以自定义 [在线下载和更新] 中 OpenWrt 固件和内核 msgid "Tip: The same files as the current OpenWrt system's BOARD (such as rock5b) and kernel (such as 5.10) will be downloaded." msgstr "提示:将下载与当前 OpenWrt 系统的 BOARD(如:rock5b)和内核(如:5.10)相同的文件。" -msgid "Download repository of OpenWrt:" -msgstr "OpenWrt 固件的下载仓库:" +msgid "OpenWrt download repository:" +msgstr "OpenWrt 文件的下载仓库:" -msgid "Set the download repository of the OpenWrt files on github.com in [Online Download Update]." -msgstr "设置 [在线下载更新] 中 github.com 的 OpenWrt 固件的下载仓库。" +msgid "Set the OpenWrt files download repository on github.com in [Online Download Update]." +msgstr "设置 [在线下载更新] 中 github.com 的 OpenWrt 文件的下载仓库。" -msgid "Keywords of Tags in Releases:" -msgstr "Releases 里 Tags 的关键字:" +msgid "OpenWrt download tags keyword:" +msgstr "OpenWrt 下载标签关键字:" -msgid "Set the keywords of Tags in Releases of github.com in [Online Download Update]." -msgstr "设置 [在线下载更新] 中 github.com 的 Releases 里 Tags 的关键字。" +msgid "Set the OpenWrt files download tags keyword for github.com in [Online Download Update]." +msgstr "设置 [在线下载更新] 中 github.com 的 OpenWrt 文件下载标签关键字。" -msgid "Suffix of OpenWrt files:" -msgstr "OpenWrt 固件的后缀:" +msgid "OpenWrt files suffix:" +msgstr "OpenWrt 文件的后缀:" -msgid "Set the suffix of the OpenWrt in Releases of github.com in [Online Download Update]." -msgstr "设置 [在线下载更新] 中 github.com 的 Releases 里 OpenWrt 固件的后缀。" +msgid "Set the OpenWrt files download suffix for github.com in [Online Download Update]." +msgstr "设置 [在线下载更新] 中 github.com 的 OpenWrt 文件的后缀。" -msgid "Download path of OpenWrt kernel:" -msgstr "OpenWrt 内核的下载路径:" +msgid "Kernel download repository:" +msgstr "内核的下载仓库:" -msgid "Set the download path of the kernel in the github.com repository in [Online Download Update]." -msgstr "设置 [在线下载更新] 中 github.com 仓库里内核的下载路径。" +msgid "Set the kernel files download repository on github.com in [Online Download Update]." +msgstr "设置 [在线下载更新] 中 github.com 的内核文件下载仓库。" + +msgid "Kernel download tags:" +msgstr "内核的下载标签:" + +msgid "Set the kernel files download tags on github.com in [Online Download Update]." +msgstr "设置 [在线下载更新] 中 github.com 的内核文件下载标签。" + +msgid "kernel_rk3588 [Rockchip RK3588 Kernel]" +msgstr "kernel_rk3588 [Rockchip RK3588 内核]" + +msgid "kernel_rk35xx [Rockchip RK35xx Kernel]" +msgstr "kernel_rk35xx [Rockchip RK35xx 内核]" + +msgid "kernel_stable [Mainline Stable Kernel]" +msgstr "kernel_stable [主线稳定内核]" + +msgid "kernel_flippy [Mainline Stable Kernel by Flippy]" +msgstr "kernel_flippy [Flippy 的主线稳定内核]" + +msgid "kernel_h6 [Allwinner H6 Kernel]" +msgstr "kernel_h6 [Allwinner H6 内核]" + +msgid "kernel_dev [Development Kernel]" +msgstr "kernel_dev [开发版内核]" + +msgid "kernel_beta [Beta Kernel]" +msgstr "kernel_beta [测试版内核]" msgid "Set version branch:" msgstr "设置版本分支:" -msgid "Set the version branch of the openwrt firmware and kernel selected in [Online Download Update]." -msgstr "设置 [在线下载更新] 时 OpenWrt 固件与内核所选用的版本分支。" +msgid "Set the version branch of the OpenWrt files and kernel selected in [Online Download Update]." +msgstr "设置 [在线下载更新] 时 OpenWrt 文件与内核所选用的版本分支。" msgid "Keep config update:" msgstr "保留配置更新:" diff --git a/openwrt-packages/luci-app-amlogic/root/etc/config/amlogic b/openwrt-packages/luci-app-amlogic/root/etc/config/amlogic index 1e2895f33c..d7c13aa709 100644 --- a/openwrt-packages/luci-app-amlogic/root/etc/config/amlogic +++ b/openwrt-packages/luci-app-amlogic/root/etc/config/amlogic @@ -5,6 +5,7 @@ config amlogic 'config' option amlogic_firmware_tag 'ARMv8' option amlogic_firmware_suffix '.img.gz' option amlogic_kernel_path 'https://github.com/breakingbadboy/OpenWrt' + option amlogic_kernel_tags '' option amlogic_kernel_branch '' option amlogic_firmware_config '1' option amlogic_write_bootloader '0' diff --git a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh index 30a6a06983..1f61302397 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh +++ b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh @@ -93,13 +93,12 @@ FIRMWARE_DOWNLOAD_PATH="/mnt/${EMMC_NAME}${PARTITION_NAME}4" if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then source "${AMLOGIC_SOC_FILE}" 2>/dev/null PLATFORM="${PLATFORM}" - SOC="${SOC}" BOARD="${BOARD}" else tolog "${AMLOGIC_SOC_FILE} file is missing!" "1" fi -if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" || -z "${SOC}" || -z "${BOARD}" ]]; then - tolog "Missing [ PLATFORM / SOC / BOARD ] value in ${AMLOGIC_SOC_FILE} file." "1" +if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" || -z "${BOARD}" ]]; then + tolog "Missing [ PLATFORM / BOARD ] value in ${AMLOGIC_SOC_FILE} file." "1" fi tolog "PLATFORM: [ ${PLATFORM} ], BOARD: [ ${BOARD} ], Use in [ ${EMMC_NAME} ]" diff --git a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh index 248b395fb9..fec3989dce 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh +++ b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh @@ -91,16 +91,14 @@ KERNEL_DOWNLOAD_PATH="/mnt/${EMMC_NAME}${PARTITION_NAME}4" if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then source "${AMLOGIC_SOC_FILE}" 2>/dev/null PLATFORM="${PLATFORM}" - SOC="${SOC}" - KERNEL_TAGS="${KERNEL_TAGS}" else tolog "${AMLOGIC_SOC_FILE} file is missing!" "1" fi -if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" || -z "${SOC}" ]]; then +if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" ]]; then tolog "Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file." "1" fi -tolog "PLATFORM: [ ${PLATFORM} ], SOC: [ ${SOC} ], Use in [ ${EMMC_NAME} ]" +tolog "PLATFORM: [ ${PLATFORM} ], Use in [ ${EMMC_NAME} ]" sleep 2 # Step 1. Set the kernel query api @@ -119,40 +117,48 @@ fi # Convert kernel repo to api format [[ "${kernel_repo}" =~ ^https: ]] && kernel_repo="$(echo ${kernel_repo} | awk -F'/' '{print $4"/"$5}')" kernel_api="https://github.com/${kernel_repo}" -if [[ -n "${KERNEL_TAGS}" ]]; then - kernel_tag="${KERNEL_TAGS}" +tolog "01.03 Kernel repo: ${kernel_repo}" +# Get the current kernel uname +kernel_uname="$(uname -r 2>/dev/null)" +tolog "01.04 Current kernel uname: ${kernel_uname}" + +# Get the kernel tag from uci config +op_kernel_tags="$(uci get amlogic.config.amlogic_kernel_tags 2>/dev/null)" +# Determine the kernel tag +if [[ -n "${op_kernel_tags}" ]]; then + kernel_tag="${op_kernel_tags/kernel_/}" else - if [[ "${SOC}" == "rk3588" ]]; then + # Determine the kernel tag based on the current kernel uname + if [[ "${kernel_uname}" =~ -rk3588 ]]; then kernel_tag="rk3588" - elif [[ "${SOC}" == "rk3528" ]]; then + elif [[ "${kernel_uname}" =~ -rk35xx ]]; then kernel_tag="rk35xx" + elif [[ "${kernel_uname}" =~ -h6|-zicai ]]; then + kernel_tag="h6" else kernel_tag="stable" fi -fi -# Remove the kernel_ prefix -kernel_tag="${kernel_tag/kernel_/}" -# If the kernel tag is a number, it is converted to a stable branch -[[ "${kernel_tag}" =~ ^[1-9]+ ]] && kernel_tag="stable" + # Save the kernel tag to uci config + uci set amlogic.config.amlogic_kernel_tags="kernel_${kernel_tag}" 2>/dev/null + uci commit amlogic 2>/dev/null +fi +tolog "01.05 Kernel tag: kernel_${kernel_tag}" +sleep 2 # Step 2: Check if there is the latest kernel version check_kernel() { # 02. Query local version information tolog "02. Start checking the kernel version." - # 02.01 Query the current version - if [[ "${kernel_tag}" == "rk3588" || "${kernel_tag}" == "rk35xx" ]]; then - current_kernel_v=$(uname -r 2>/dev/null) - else - current_kernel_v=$(uname -r 2>/dev/null | grep -oE '^[1-9]\.[0-9]{1,2}\.[0-9]+') - fi - [[ -n "${current_kernel_v}" ]] || tolog "02.01 The current kernel version is not detected." "1" - tolog "02.01 current version: ${current_kernel_v}" + # 02.01 Get current kernel version + [[ ! "${kernel_tag}" =~ ^(rk3588|rk35xx)$ ]] && kernel_uname="$(echo "${kernel_uname}" | cut -d'-' -f1)" + [[ -n "${kernel_uname}" ]] || tolog "02.01 The current kernel version is not detected." "1" + tolog "02.01 current version: ${kernel_uname}" sleep 2 # 02.02 Version comparison - main_line_version="$(echo ${current_kernel_v} | awk -F '.' '{print $1"."$2}')" + main_line_version="$(echo ${kernel_uname} | awk -F '.' '{print $1"."$2}')" # 02.03 Query the selected branch in the settings server_kernel_branch="$(uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}')" @@ -178,7 +184,7 @@ check_kernel() { )" [[ -n "${latest_version}" ]] || tolog "02.03 No kernel available, please use another kernel branch." "1" - tolog "02.04 current version: ${current_kernel_v}, Latest version: ${latest_version}" + tolog "02.04 current version: ${kernel_uname}, Latest version: ${latest_version}" sleep 2 # Get the sha256 value of the latest version @@ -190,7 +196,7 @@ check_kernel() { )" [[ -n "${latest_kernel_sha256}" ]] && tolog "02.05 Kernel sha256: ${latest_kernel_sha256}" - if [[ "${latest_version}" == "${current_kernel_v}" ]]; then + if [[ "${latest_version}" == "${kernel_uname}" ]]; then tolog "02.06 Already the latest version, no need to update." "1" sleep 2 else diff --git a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh index d7ed6a59dd..dfaeec3066 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh +++ b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh @@ -54,15 +54,14 @@ fi if [[ -s "${AMLOGIC_SOC_FILE}" ]]; then source "${AMLOGIC_SOC_FILE}" 2>/dev/null PLATFORM="${PLATFORM}" - SOC="${SOC}" else tolog "${AMLOGIC_SOC_FILE} file is missing!" "1" fi -if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" || -z "${SOC}" ]]; then +if [[ -z "${PLATFORM}" || -z "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" ]]; then tolog "Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file." "1" fi -tolog "PLATFORM: [ ${PLATFORM} ], SOC: [ ${SOC} ]" +tolog "PLATFORM: [ ${PLATFORM} ]" sleep 2 # 01. Query local version information diff --git a/shadowsocks-rust/.github/workflows/build-nightly-release.yml b/shadowsocks-rust/.github/workflows/build-nightly-release.yml index 867c933b60..c9ed908ce4 100644 --- a/shadowsocks-rust/.github/workflows/build-nightly-release.yml +++ b/shadowsocks-rust/.github/workflows/build-nightly-release.yml @@ -97,7 +97,7 @@ jobs: ./build-release -t ${{ matrix.platform.target }} $compile_features $compile_compress $compile_nightly $compile_cargo_flags - name: Upload Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ matrix.platform.target }} path: build/release/* @@ -138,7 +138,7 @@ jobs: ./build/build-host-release -t ${{ matrix.target }} - name: Upload Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ matrix.target }} path: build/release/* @@ -164,7 +164,7 @@ jobs: pwsh ./build/build-host-release.ps1 "full winservice" - name: Upload Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: windows-native path: build/release/* diff --git a/v2rayn/.github/workflows/build-linux.yml b/v2rayn/.github/workflows/build-linux.yml index 3f858e309d..e030e4652b 100644 --- a/v2rayn/.github/workflows/build-linux.yml +++ b/v2rayn/.github/workflows/build-linux.yml @@ -9,6 +9,12 @@ on: push: branches: - master + tags: + - 'v*' + - 'V*' + +permissions: + contents: write env: OutputArch: "linux-64" @@ -21,7 +27,6 @@ jobs: strategy: matrix: configuration: [Release] - runs-on: ubuntu-24.04 steps: @@ -31,18 +36,18 @@ jobs: submodules: 'recursive' fetch-depth: '0' - - name: Setup + - name: Setup .NET uses: actions/setup-dotnet@v5.0.0 with: dotnet-version: '8.0.x' - name: Build run: | - cd v2rayN - dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64 --self-contained=true -o $OutputPath64 - dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 --self-contained=true -o $OutputPathArm64 - dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-x64 --self-contained=true -p:PublishTrimmed=true -o $OutputPath64 - dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-arm64 --self-contained=true -p:PublishTrimmed=true -o $OutputPathArm64 + cd v2rayN + dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-x64 --self-contained=true -o "$OutputPath64" + dotnet publish ./v2rayN.Desktop/v2rayN.Desktop.csproj -c Release -r linux-arm64 --self-contained=true -o "$OutputPathArm64" + dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-x64 --self-contained=true -p:PublishTrimmed=true -o "$OutputPath64" + dotnet publish ./AmazTool/AmazTool.csproj -c Release -r linux-arm64 --self-contained=true -p:PublishTrimmed=true -o "$OutputPathArm64" - name: Upload build artifacts uses: actions/upload-artifact@v5.0.0 @@ -56,8 +61,8 @@ jobs: if: github.event.inputs.release_tag != '' run: | chmod 755 package-debian.sh - ./package-debian.sh $OutputArch $OutputPath64 ${{ github.event.inputs.release_tag }} - ./package-debian.sh $OutputArchArm $OutputPathArm64 ${{ github.event.inputs.release_tag }} + ./package-debian.sh "$OutputArch" "$OutputPath64" "${{ github.event.inputs.release_tag }}" + ./package-debian.sh "$OutputArchArm" "$OutputPathArm64" "${{ github.event.inputs.release_tag }}" - name: Upload deb to release uses: svenstaro/upload-release-action@v2 @@ -73,8 +78,8 @@ jobs: if: github.event.inputs.release_tag != '' run: | chmod 755 package-release-zip.sh - ./package-release-zip.sh $OutputArch $OutputPath64 - ./package-release-zip.sh $OutputArchArm $OutputPathArm64 + ./package-release-zip.sh "$OutputArch" "$OutputPath64" + ./package-release-zip.sh "$OutputArchArm" "$OutputPathArm64" - name: Upload zip archive to release uses: svenstaro/upload-release-action@v2 @@ -85,36 +90,62 @@ jobs: file_glob: true prerelease: true - # release RHEL package - - name: Package RPM (RHEL-family) - if: github.event.inputs.release_tag != '' + rpm: + needs: build + if: | + (github.event_name == 'workflow_dispatch' && github.event.inputs.release_tag != '') || + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) + runs-on: ubuntu-24.04 + container: + image: quay.io/almalinuxorg/10-base:latest + options: --platform=linux/amd64/v2 + env: + RELEASE_TAG: ${{ github.event.inputs.release_tag != '' && github.event.inputs.release_tag || github.ref_name }} + + steps: + - name: Prepare tools (Red Hat) run: | - chmod 755 package-rhel.sh - # Build for both x86_64 and aarch64 in one go (explicit version passed; no --buildfrom) - ./package-rhel.sh "${{ github.event.inputs.release_tag }}" --arch all + dnf -y makecache + dnf -y install epel-release + dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core rsync findutils tar gzip unzip which + + - name: Checkout repo (for scripts) + uses: actions/checkout@v5.0.0 + with: + submodules: 'recursive' + fetch-depth: '0' + + - name: Restore build artifacts + uses: actions/download-artifact@v4 + with: + name: v2rayN-linux + path: ${{ github.workspace }}/v2rayN/Release + + - name: Ensure script permissions + run: chmod 755 package-rhel.sh + + - name: Package RPM (RHEL-family) + run: ./package-rhel.sh "${RELEASE_TAG}" --arch all - name: Collect RPMs into workspace - if: github.event.inputs.release_tag != '' run: | - mkdir -p "${{ github.workspace }}/dist/rpm" - rsync -av "$HOME/rpmbuild/RPMS/" "${{ github.workspace }}/dist/rpm/" - # Rename to requested filenames - find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.x86_64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-x64.rpm" \; || true - find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.aarch64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true + mkdir -p "$GITHUB_WORKSPACE/dist/rpm" + rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm/" || true + find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.x86_64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-64.rpm" \; || true + find "$GITHUB_WORKSPACE/dist/rpm" -name "v2rayN-*-1*.aarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true + echo "==== Dist tree ====" + ls -R "$GITHUB_WORKSPACE/dist/rpm" || true - name: Upload RPM artifacts - if: github.event.inputs.release_tag != '' uses: actions/upload-artifact@v5.0.0 with: name: v2rayN-rpm - path: | - ${{ github.workspace }}/dist/rpm/**/*.rpm + path: dist/rpm/**/*.rpm - name: Upload RPMs to release uses: svenstaro/upload-release-action@v2 - if: github.event.inputs.release_tag != '' with: - file: ${{ github.workspace }}/dist/rpm/**/*.rpm - tag: ${{ github.event.inputs.release_tag }} + file: dist/rpm/**/*.rpm + tag: ${{ env.RELEASE_TAG }} file_glob: true prerelease: true diff --git a/v2rayn/package-rhel.sh b/v2rayn/package-rhel.sh index 8384e765f9..b93ea82cdc 100644 --- a/v2rayn/package-rhel.sh +++ b/v2rayn/package-rhel.sh @@ -19,6 +19,23 @@ else exit 1 fi +# ======================== Kernel version check (require >= 6.11) ======================= +MIN_KERNEL_MAJOR=6 +MIN_KERNEL_MINOR=11 +KERNEL_FULL=$(uname -r) +KERNEL_MAJOR=$(echo "$KERNEL_FULL" | cut -d. -f1) +KERNEL_MINOR=$(echo "$KERNEL_FULL" | cut -d. -f2) + +echo "[INFO] Detected kernel version: $KERNEL_FULL" + +if (( KERNEL_MAJOR < MIN_KERNEL_MAJOR )) || { (( KERNEL_MAJOR == MIN_KERNEL_MAJOR )) && (( KERNEL_MINOR < MIN_KERNEL_MINOR )); }; then + echo "[ERROR] Kernel $KERNEL_FULL is too old. Requires Linux >= ${MIN_KERNEL_MAJOR}.${MIN_KERNEL_MINOR}." + echo "Please upgrade your system or use a newer container (e.g. Fedora 42+, RHEL 10+, Debian 13+)." + exit 1 +fi + +echo "[OK] Kernel version >= ${MIN_KERNEL_MAJOR}.${MIN_KERNEL_MINOR}." + # ===== Config & Parse arguments ========================================================= VERSION_ARG="${1:-}" # Pass version number like 7.13.8, or leave empty WITH_CORE="both" # Default: bundle both xray+sing-box diff --git a/v2rayn/v2rayN/ServiceLib/Common/JsonUtils.cs b/v2rayn/v2rayN/ServiceLib/Common/JsonUtils.cs index b5bcc7fedb..7e2b7f7882 100644 --- a/v2rayn/v2rayN/ServiceLib/Common/JsonUtils.cs +++ b/v2rayn/v2rayN/ServiceLib/Common/JsonUtils.cs @@ -35,9 +35,13 @@ public class JsonUtils /// /// /// - public static T DeepCopy(T obj) + public static T? DeepCopy(T? obj) { - return Deserialize(Serialize(obj, false))!; + if (obj is null) + { + return default; + } + return Deserialize(Serialize(obj, false)); } /// @@ -67,7 +71,7 @@ public class JsonUtils /// /// /// - public static JsonNode? ParseJson(string strJson) + public static JsonNode? ParseJson(string? strJson) { try { @@ -116,7 +120,7 @@ public class JsonUtils /// /// /// - public static string Serialize(object? obj, JsonSerializerOptions options) + public static string Serialize(object? obj, JsonSerializerOptions? options) { var result = string.Empty; try @@ -125,7 +129,7 @@ public class JsonUtils { return result; } - result = JsonSerializer.Serialize(obj, options); + result = JsonSerializer.Serialize(obj, options ?? _defaultSerializeOptions); } catch (Exception ex) { diff --git a/v2rayn/v2rayN/ServiceLib/Common/Utils.cs b/v2rayn/v2rayN/ServiceLib/Common/Utils.cs index 13e550f0a9..7f842ddfc0 100644 --- a/v2rayn/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayn/v2rayN/ServiceLib/Common/Utils.cs @@ -963,13 +963,13 @@ public class Utils #region Platform - public static bool IsWindows() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + public static bool IsWindows() => OperatingSystem.IsWindows(); - public static bool IsLinux() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + public static bool IsLinux() => OperatingSystem.IsLinux(); - public static bool IsOSX() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + public static bool IsOSX() => OperatingSystem.IsMacOS(); - public static bool IsNonWindows() => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + public static bool IsNonWindows() => !OperatingSystem.IsWindows(); public static string GetExeName(string name) { diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx index 2222d8c419..a56802e3ee 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx @@ -472,7 +472,7 @@ Langue (redémarrage requis) - Importer des liens depuis le presse-papiers (Ctrl+V) + Importer liens depuis le presse-papiers (Ctrl+V) Scanner le QR code à l’écran (Ctrl+S) @@ -619,7 +619,7 @@ Sécurité couche transport (TLS) - *tcp par défaut ; un mauvais choix empêchera la connexion + *tcp par défaut ; un mauvais choix bloque la connexion Type de Core @@ -652,7 +652,7 @@ Port Socks - *Valeur du port Socks pour la configuration personnalisée (facultatif). Si défini, Xray/sing-box (Tun) démarrera un service Socks en amont supplémentaire pour fournir le routage sélectif et l’affichage de la vitesse. + *Valeur du port Socks (config perso, optionnelle). Si défini, Xray/sing-box (Tun) démarre un service Socks en amont supplémentaire pour fournir le routage sélectif et l’affichage de la vitesse. Parcourir @@ -670,7 +670,7 @@ Masquer la fenêtre au démarrage - Intervalle de mise à jour automatique des fichiers Geo (heures) + Intervalle de mise à jour auto des fichiers Geo (heures) Core : paramètres de base @@ -691,7 +691,7 @@ domainStrategy de Freedom (sortant) - Auto-ajuster la largeur des colonnes après maj. des abonnements + Auto-ajuster la largeur des colonnes après maj. abonnements Vérifier les mises à jour pré-version (à activer avec prudence) @@ -724,7 +724,7 @@ Mot de passe d’authentification - DNS personnalisés (plusieurs possibles, séparés par des virgules) + DNS perso (plusieurs configurables, séparés par virgules) Lever la restriction de proxy en boucle locale pour les applications Win10 UWP @@ -865,7 +865,7 @@ Documentation détaillée des règles - Saisie de DnsObject prise en charge (format JSON), cliquer pour voir la documentation + Saisie DnsObject prise en charge (format JSON), cliquer pour doc Laissez vide pour les groupes ordinaires @@ -898,7 +898,7 @@ Filtrage par alias (regex) - Afficher les journaux + Afficher les logs Activer Tun @@ -979,7 +979,7 @@ En attente du test (appuyer sur Échap pour arrêter)... - Désactivez ceci en cas de coupures anormales + Désactiver cette option si coupure anormale Mise à jour désactivée, abonnement ignoré @@ -1009,10 +1009,10 @@ DNS personnalisé sing-box - Veuillez renseigner la structure JSON DNS ; cliquer pour voir la documentation + Saisissez la structure JSON DNS ; cliquez pour voir la doc. - Cliquez pour importer la configuration DNS par défaut + Cliquez pour importer la config DNS par défaut Stratégie résolution domaine (sing-box) @@ -1045,10 +1045,10 @@ Algo contrôle congestion - Alias de configuration du proxy amont + Alias de config du proxy amont - Alias de configuration du proxy aval + Alias de config du proxy aval Assurez-vous que l’alias config existe et est unique @@ -1114,7 +1114,7 @@ Activer le fragmentation (Fragment) - Activer le fichier de cache de sing-box (fichiers de reˋgles) + Activer le fichier de cache de sing-box (fichiers règles) Set de règles sing-box perso @@ -1207,7 +1207,7 @@ Stratégie de résolution par défaut des sortants - Orientation de la mise en page principale (redémarrage requis) + Orientation mise en page principale (redémarrage requis) Adresse de résolution de domaine pour sortants @@ -1330,7 +1330,7 @@ JSON brut XHTTP Extra, format : { XHTTPObject } - Masquer dans la barre d’état lors de la fermeture de la fenêtre + Masquer dans la barre d’état à la fermeture de la fenêtre Niveau de concurrence lors des tests multithread @@ -1351,7 +1351,7 @@ Thème - Copier la commande proxy terminal vers le presse-papiers + Copier la cmd proxy terminal dans le presse-papiers Recommencer le test des éléments échoués, {0} restants. Appuyez sur Échap pour arrêter... @@ -1369,7 +1369,7 @@ Plage de ports sautés - Écrase le port ; pour plusieurs groupes, séparez par des virgules (,) + Écrase le port ; pour plusieurs groupes, séparer par virgules (,) Générer un groupe de stratégie depuis plusieurs profils @@ -1447,7 +1447,7 @@ Valider les IP des domaines de la région concernée - Après configuration, les IP renvoyées pour les domaines régionaux (p. ex. geosite:cn) seront validées ; seules les IP attendues seront retournées + Après config, les IP renvoyées des domaines régionaux (ex. geosite:cn) seront vérifiées ; seules les IP attendues seront retournées. Activer le DNS personnalisé @@ -1471,7 +1471,7 @@ Modèle de configuration complet v2ray - Ajoute seulement la configuration sortante, routing.balancers et routing.rules.outboundTag. Voir la documentation. + Ajoute seulement la config sortante, routing.balancers et routing.rules.outboundTag. Voir la doc. N’ajoutez pas de sorties pour protocoles non-proxy. @@ -1492,10 +1492,10 @@ Début de l’analyse et du traitement du contenu d’abonnement - Sélectionner une configuration + Choisir une config. - Actif globalement par défaut, avec filtrage FakeIP intégré ; ne fonctionne que dans sing-box + Actif globalement par défaut, avec filtre FakeIP intégré ; ne fonctionne que dans sing-box Veuillez ajouter au moins une configuration diff --git a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs index 5da86c6ebd..35371f0f19 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs @@ -10,15 +10,17 @@ public partial class App : Application AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; - - DataContext = StatusBarViewModel.Instance; } public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - AppManager.Instance.InitComponents(); + if (!Design.IsDesignMode) + { + AppManager.Instance.InitComponents(); + DataContext = StatusBarViewModel.Instance; + } desktop.Exit += OnExit; desktop.MainWindow = new MainWindow(); diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Program.cs b/v2rayn/v2rayN/v2rayN.Desktop/Program.cs index 1a0ce38e48..70c431301d 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Program.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Program.cs @@ -54,12 +54,19 @@ internal class Program // Avalonia configuration, don't remove; also used by visual designer. public static AppBuilder BuildAvaloniaApp() { - return AppBuilder.Configure() - .UsePlatformDetect() - //.WithInterFont() - .WithFontByDefault() - .LogToTrace() - .UseReactiveUI() - .With(new MacOSPlatformOptions { ShowInDock = AppManager.Instance.Config.UiItem.MacOSShowInDock }); + var builder = AppBuilder.Configure() + .UsePlatformDetect() + //.WithInterFont() + .WithFontByDefault() + .LogToTrace() + .UseReactiveUI(); + + if (OperatingSystem.IsMacOS()) + { + var showInDock = Design.IsDesignMode || AppManager.Instance.Config.UiItem.MacOSShowInDock; + builder = builder.With(new MacOSPlatformOptions { ShowInDock = showInDock }); + } + + return builder; } }