From 9e1e8267516659141cc586979bcde234c55f270e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:39:45 +0000 Subject: [PATCH 001/232] Update dependency @vue/tsconfig to ^0.6.0 (#719) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/webui/package.json b/webui/package.json index 8c79b42faa..311df3189d 100644 --- a/webui/package.json +++ b/webui/package.json @@ -54,7 +54,7 @@ "@types/uuid": "^10.0.0", "@typescript-eslint/parser": "^8.13.0", "@vitejs/plugin-vue": "^5.1.4", - "@vue/tsconfig": "^0.5.1", + "@vue/tsconfig": "^0.6.0", "eslint": "^9.14.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-vue": "^9.30.0", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 6bcebc08c1..b06334e9cc 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -126,8 +126,8 @@ importers: specifier: ^5.1.4 version: 5.1.4(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) '@vue/tsconfig': - specifier: ^0.5.1 - version: 0.5.1 + specifier: ^0.6.0 + version: 0.6.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) eslint: specifier: ^9.14.0 version: 9.14.0 @@ -1002,8 +1002,16 @@ packages: '@vue/shared@3.5.12': resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} - '@vue/tsconfig@0.5.1': - resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} + '@vue/tsconfig@0.6.0': + resolution: {integrity: sha512-MHXNd6lzugsEHvuA6l1GqrF5jROqUon8sP/HInLPnthJiYvB0VvpHMywg7em1dBZfFZNBSkR68qH37zOdRHmCw==} + peerDependencies: + typescript: 5.x + vue: ^3.3.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true '@vueuse/core@11.2.0': resolution: {integrity: sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA==} @@ -3472,7 +3480,10 @@ snapshots: '@vue/shared@3.5.12': {} - '@vue/tsconfig@0.5.1': {} + '@vue/tsconfig@0.6.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))': + optionalDependencies: + typescript: 5.6.3 + vue: 3.5.12(typescript@5.6.3) '@vueuse/core@11.2.0(vue@3.5.12(typescript@5.6.3))': dependencies: From 82af80e9768dd78dd2d2dad6d7d0c9512f516191 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 04:00:46 +0000 Subject: [PATCH 002/232] Update dependency @vitejs/plugin-vue to v5.1.5 (#720) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index b06334e9cc..bfb06cdb97 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.1.4 - version: 5.1.4(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) + version: 5.1.5(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) @@ -916,8 +916,8 @@ packages: resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-vue@5.1.4': - resolution: {integrity: sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==} + '@vitejs/plugin-vue@5.1.5': + resolution: {integrity: sha512-dlnib73G05CDBAUR/YpuZcQQ47fpjihnnNouAAqN62z+oqSsWJ+kh52GRzIxpkgFG3q11eXK7Di7RMmoCwISZA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 @@ -3333,7 +3333,7 @@ snapshots: '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.5(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': dependencies: vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) vue: 3.5.12(typescript@5.6.3) From 3501497494ae672a73a0a90daaecbc7eeda8946a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 06:25:38 +0000 Subject: [PATCH 003/232] Update dependency uuid to v11.0.3 (#721) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index bfb06cdb97..9664bc8931 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -75,7 +75,7 @@ importers: version: 5.0.0 uuid: specifier: ^11.0.2 - version: 11.0.2 + version: 11.0.3 vue: specifier: ^3.5.12 version: 3.5.12(typescript@5.6.3) @@ -2403,8 +2403,8 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@11.0.2: - resolution: {integrity: sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==} + uuid@11.0.3: + resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} hasBin: true vite-bundle-analyzer@0.13.0: @@ -4962,7 +4962,7 @@ snapshots: is-typed-array: 1.1.13 which-typed-array: 1.1.15 - uuid@11.0.2: {} + uuid@11.0.3: {} vite-bundle-analyzer@0.13.0: {} From f943c1c9411ff923bd0faf14686918e940a61a43 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 21:21:43 +0000 Subject: [PATCH 004/232] Update all devDependencies (#726) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 385 ++++++++++++++++++++++--------------------- 1 file changed, 199 insertions(+), 186 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 9664bc8931..ba55568b3e 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -121,10 +121,10 @@ importers: version: 10.0.0 '@typescript-eslint/parser': specifier: ^8.13.0 - version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) + version: 8.14.0(eslint@9.14.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.1.4 - version: 5.1.5(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) + version: 5.1.5(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) @@ -157,22 +157,22 @@ importers: version: 5.6.3 typescript-eslint: specifier: ^8.13.0 - version: 8.13.0(eslint@9.14.0)(typescript@5.6.3) + version: 8.14.0(eslint@9.14.0)(typescript@5.6.3) vite: specifier: ^5.4.10 - version: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + version: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.0 version: 0.13.0 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) + version: 0.22.0(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.2 - version: 7.6.3(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) + version: 7.6.4(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.14.0) @@ -737,83 +737,93 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.24.0': - resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} + '@rollup/rollup-android-arm-eabi@4.25.0': + resolution: {integrity: sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.0': - resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} + '@rollup/rollup-android-arm64@4.25.0': + resolution: {integrity: sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.0': - resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} + '@rollup/rollup-darwin-arm64@4.25.0': + resolution: {integrity: sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.0': - resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} + '@rollup/rollup-darwin-x64@4.25.0': + resolution: {integrity: sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': - resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} + '@rollup/rollup-freebsd-arm64@4.25.0': + resolution: {integrity: sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.25.0': + resolution: {integrity: sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.25.0': + resolution: {integrity: sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.0': - resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} + '@rollup/rollup-linux-arm-musleabihf@4.25.0': + resolution: {integrity: sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.0': - resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} + '@rollup/rollup-linux-arm64-gnu@4.25.0': + resolution: {integrity: sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.0': - resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} + '@rollup/rollup-linux-arm64-musl@4.25.0': + resolution: {integrity: sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': - resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.25.0': + resolution: {integrity: sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.0': - resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} + '@rollup/rollup-linux-riscv64-gnu@4.25.0': + resolution: {integrity: sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.0': - resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} + '@rollup/rollup-linux-s390x-gnu@4.25.0': + resolution: {integrity: sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.0': - resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} + '@rollup/rollup-linux-x64-gnu@4.25.0': + resolution: {integrity: sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.0': - resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} + '@rollup/rollup-linux-x64-musl@4.25.0': + resolution: {integrity: sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.0': - resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} + '@rollup/rollup-win32-arm64-msvc@4.25.0': + resolution: {integrity: sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.0': - resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} + '@rollup/rollup-win32-ia32-msvc@4.25.0': + resolution: {integrity: sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.0': - resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} + '@rollup/rollup-win32-x64-msvc@4.25.0': + resolution: {integrity: sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==} cpu: [x64] os: [win32] @@ -859,8 +869,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@typescript-eslint/eslint-plugin@8.13.0': - resolution: {integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==} + '@typescript-eslint/eslint-plugin@8.14.0': + resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -870,8 +880,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.13.0': - resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} + '@typescript-eslint/parser@8.14.0': + resolution: {integrity: sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -880,12 +890,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.13.0': - resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} + '@typescript-eslint/scope-manager@8.14.0': + resolution: {integrity: sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.13.0': - resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} + '@typescript-eslint/type-utils@8.14.0': + resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -893,12 +903,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.13.0': - resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} + '@typescript-eslint/types@8.14.0': + resolution: {integrity: sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.13.0': - resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} + '@typescript-eslint/typescript-estree@8.14.0': + resolution: {integrity: sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -906,14 +916,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.13.0': - resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} + '@typescript-eslint/utils@8.14.0': + resolution: {integrity: sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.13.0': - resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} + '@typescript-eslint/visitor-keys@8.14.0': + resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.1.5': @@ -966,16 +976,16 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-core@7.6.3': - resolution: {integrity: sha512-C7FOuh3Z+EmXXzDU9eRjHQL7zW7/CFovM6yCNNpUb+zXxhrn4fiqTum+a3gNau9DuzYfEtQXwZ9F7MeK0JKYVw==} + '@vue/devtools-core@7.6.4': + resolution: {integrity: sha512-blSwGVYpb7b5TALMjjoBiAl5imuBF7WEOAtaJaBMNikR8SQkm6mkUt4YlIKh9874/qoimwmpDOm+GHBZ4Y5m+g==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.3': - resolution: {integrity: sha512-ETsFc8GlOp04rSFN79tB2TpVloWfsSx9BoCSElV3w3CaJTSBfz42KsIi5Ka+dNTJs1jY7QVLTDeoBmUGgA9h2A==} + '@vue/devtools-kit@7.6.4': + resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} - '@vue/devtools-shared@7.6.3': - resolution: {integrity: sha512-wJW5QF27i16+sNQIaes8QoEZg1eqEgF83GkiPUlEQe9k7ZoHXHV7PRrnrxOKem42sIHPU813J2V/ZK1uqTJe6g==} + '@vue/devtools-shared@7.6.4': + resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} '@vue/language-core@2.1.10': resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} @@ -1168,8 +1178,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001678: - resolution: {integrity: sha512-RR+4U/05gNtps58PEBDZcPWTgEO2MBeoPZ96aQcjmfkBWRIDfN451fW2qyDA9/+HohLLIL5GqiMwA+IB1pWarw==} + caniuse-lite@1.0.30001680: + resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1335,8 +1345,8 @@ packages: echarts@5.5.1: resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} - electron-to-chromium@1.5.55: - resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} + electron-to-chromium@1.5.56: + resolution: {integrity: sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==} elliptic@6.6.0: resolution: {integrity: sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==} @@ -2019,9 +2029,6 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2066,8 +2073,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.4.48: + resolution: {integrity: sha512-GCRK8F6+Dl7xYniR5a4FYbpBzU8XnZVeowqsQFYdcXuSbChgiks7qybSkbvnaeqv0G0B+dd9/jJgH8kkLDQeEA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2156,8 +2163,8 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.24.0: - resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} + rollup@4.25.0: + resolution: {integrity: sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2354,8 +2361,8 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@8.13.0: - resolution: {integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==} + typescript-eslint@8.14.0: + resolution: {integrity: sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2433,8 +2440,8 @@ packages: vite-plugin-remove-console@2.2.0: resolution: {integrity: sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==} - vite-plugin-vue-devtools@7.6.3: - resolution: {integrity: sha512-p1rZMKzreWqxj9U05RaxY1vDoOhGYhA6iX8vKfo4nD6jqTmVoGjjk+U1g5HYwwTCdr/eck3kzO2f4gnPCjqVKA==} + vite-plugin-vue-devtools@7.6.4: + resolution: {integrity: sha512-jxSsLyuETfmZ1OSrmnDp28BG6rmURrP7lkeyHW2gBFDyo+4dUcqVeQNMhbV7uKZn80mDdv06Mysw/5AdGxDvJQ==} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 @@ -2444,8 +2451,8 @@ packages: peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 - vite@5.4.10: - resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3142,76 +3149,82 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-inject@5.0.5(rollup@4.24.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.25.0)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.25.0) estree-walker: 2.0.2 magic-string: 0.30.9 optionalDependencies: - rollup: 4.24.0 + rollup: 4.25.0 - '@rollup/pluginutils@5.1.0(rollup@4.24.0)': + '@rollup/pluginutils@5.1.0(rollup@4.25.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.24.0 + rollup: 4.25.0 - '@rollup/pluginutils@5.1.3(rollup@4.24.0)': + '@rollup/pluginutils@5.1.3(rollup@4.25.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.24.0 + rollup: 4.25.0 - '@rollup/rollup-android-arm-eabi@4.24.0': + '@rollup/rollup-android-arm-eabi@4.25.0': optional: true - '@rollup/rollup-android-arm64@4.24.0': + '@rollup/rollup-android-arm64@4.25.0': optional: true - '@rollup/rollup-darwin-arm64@4.24.0': + '@rollup/rollup-darwin-arm64@4.25.0': optional: true - '@rollup/rollup-darwin-x64@4.24.0': + '@rollup/rollup-darwin-x64@4.25.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + '@rollup/rollup-freebsd-arm64@4.25.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.0': + '@rollup/rollup-freebsd-x64@4.25.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.0': + '@rollup/rollup-linux-arm-gnueabihf@4.25.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.0': + '@rollup/rollup-linux-arm-musleabihf@4.25.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + '@rollup/rollup-linux-arm64-gnu@4.25.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.0': + '@rollup/rollup-linux-arm64-musl@4.25.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.25.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.0': + '@rollup/rollup-linux-riscv64-gnu@4.25.0': optional: true - '@rollup/rollup-linux-x64-musl@4.24.0': + '@rollup/rollup-linux-s390x-gnu@4.25.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.0': + '@rollup/rollup-linux-x64-gnu@4.25.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.0': + '@rollup/rollup-linux-x64-musl@4.25.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.0': + '@rollup/rollup-win32-arm64-msvc@4.25.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.25.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.25.0': optional: true '@rushstack/eslint-patch@1.10.4': {} @@ -3252,14 +3265,14 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/type-utils': 8.14.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 eslint: 9.14.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -3270,12 +3283,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.3.7 eslint: 9.14.0 optionalDependencies: @@ -3283,15 +3296,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.13.0': + '@typescript-eslint/scope-manager@8.14.0': dependencies: - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 - '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.14.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: @@ -3300,12 +3313,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.13.0': {} + '@typescript-eslint/types@8.14.0': {} - '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.14.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -3317,25 +3330,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.13.0(eslint@9.14.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.14.0(eslint@9.14.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) eslint: 9.14.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.13.0': + '@typescript-eslint/visitor-keys@8.14.0': dependencies: - '@typescript-eslint/types': 8.13.0 + '@typescript-eslint/types': 8.14.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-vue@5.1.5(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.5(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) vue: 3.5.12(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3402,7 +3415,7 @@ snapshots: '@vue/shared': 3.5.12 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.47 + postcss: 8.4.48 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.12': @@ -3417,21 +3430,21 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.3(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': dependencies: - '@vue/devtools-kit': 7.6.3 - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-kit': 7.6.4 + '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) vue: 3.5.12(typescript@5.6.3) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.3': + '@vue/devtools-kit@7.6.4': dependencies: - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-shared': 7.6.4 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -3439,7 +3452,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.3': + '@vue/devtools-shared@7.6.4': dependencies: rfdc: 1.4.1 @@ -3649,8 +3662,8 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001678 - electron-to-chromium: 1.5.55 + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.56 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -3677,7 +3690,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001678: {} + caniuse-lite@1.0.30001680: {} chalk@2.4.2: dependencies: @@ -3869,7 +3882,7 @@ snapshots: tslib: 2.3.0 zrender: 5.6.0 - electron-to-chromium@1.5.55: {} + electron-to-chromium@1.5.56: {} elliptic@6.6.0: dependencies: @@ -4590,8 +4603,6 @@ snapshots: perfect-debounce@1.0.0: {} - picocolors@1.1.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4622,10 +4633,10 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.47: + postcss@8.4.48: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -4716,26 +4727,28 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 - rollup@4.24.0: + rollup@4.25.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.0 - '@rollup/rollup-android-arm64': 4.24.0 - '@rollup/rollup-darwin-arm64': 4.24.0 - '@rollup/rollup-darwin-x64': 4.24.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 - '@rollup/rollup-linux-arm-musleabihf': 4.24.0 - '@rollup/rollup-linux-arm64-gnu': 4.24.0 - '@rollup/rollup-linux-arm64-musl': 4.24.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 - '@rollup/rollup-linux-riscv64-gnu': 4.24.0 - '@rollup/rollup-linux-s390x-gnu': 4.24.0 - '@rollup/rollup-linux-x64-gnu': 4.24.0 - '@rollup/rollup-linux-x64-musl': 4.24.0 - '@rollup/rollup-win32-arm64-msvc': 4.24.0 - '@rollup/rollup-win32-ia32-msvc': 4.24.0 - '@rollup/rollup-win32-x64-msvc': 4.24.0 + '@rollup/rollup-android-arm-eabi': 4.25.0 + '@rollup/rollup-android-arm64': 4.25.0 + '@rollup/rollup-darwin-arm64': 4.25.0 + '@rollup/rollup-darwin-x64': 4.25.0 + '@rollup/rollup-freebsd-arm64': 4.25.0 + '@rollup/rollup-freebsd-x64': 4.25.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.25.0 + '@rollup/rollup-linux-arm-musleabihf': 4.25.0 + '@rollup/rollup-linux-arm64-gnu': 4.25.0 + '@rollup/rollup-linux-arm64-musl': 4.25.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.25.0 + '@rollup/rollup-linux-riscv64-gnu': 4.25.0 + '@rollup/rollup-linux-s390x-gnu': 4.25.0 + '@rollup/rollup-linux-x64-gnu': 4.25.0 + '@rollup/rollup-linux-x64-musl': 4.25.0 + '@rollup/rollup-win32-arm64-msvc': 4.25.0 + '@rollup/rollup-win32-ia32-msvc': 4.25.0 + '@rollup/rollup-win32-x64-msvc': 4.25.0 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -4914,11 +4927,11 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.13.0(eslint@9.14.0)(typescript@5.6.3): + typescript-eslint@8.14.0(eslint@9.14.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0)(typescript@5.6.3))(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0)(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -4966,14 +4979,14 @@ snapshots: vite-bundle-analyzer@0.13.0: {} - vite-hot-client@0.2.3(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): dependencies: - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.3(rollup@4.24.0) + '@rollup/pluginutils': 5.1.3(rollup@4.25.0) debug: 4.3.7 error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 @@ -4981,38 +4994,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.25.0) node-stdlib-browser: 1.2.0 - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.3(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.3(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) - '@vue/devtools-kit': 7.6.3 - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) + '@vue/devtools-kit': 7.6.4 + '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5023,15 +5036,15 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.10(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8): + vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.0 + postcss: 8.4.48 + rollup: 4.25.0 optionalDependencies: '@types/node': 22.9.0 fsevents: 2.3.3 From 405f89fecb9f8447dd8e3804bafc95149351f682 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 04:08:13 +0000 Subject: [PATCH 005/232] Update dependency eslint-plugin-vue to v9.31.0 (#727) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index ba55568b3e..1d7097d089 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -136,7 +136,7 @@ importers: version: 9.1.0(eslint@9.14.0) eslint-plugin-vue: specifier: ^9.30.0 - version: 9.30.0(eslint@9.14.0) + version: 9.31.0(eslint@9.14.0) husky: specifier: ^9.1.6 version: 9.1.6 @@ -1393,8 +1393,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-vue@9.30.0: - resolution: {integrity: sha512-CyqlRgShvljFkOeYK8wN5frh/OGTvkj1S7wlr2Q2pUvwq+X5VYiLd6ZjujpgSgLnys2W8qrBLkXQ41SUYaoPIQ==} + eslint-plugin-vue@9.31.0: + resolution: {integrity: sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -3945,7 +3945,7 @@ snapshots: dependencies: eslint: 9.14.0 - eslint-plugin-vue@9.30.0(eslint@9.14.0): + eslint-plugin-vue@9.31.0(eslint@9.14.0): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0) eslint: 9.14.0 From 609ae57dd012ed623162f02e5efe1c1613b7571f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:57:55 +0000 Subject: [PATCH 006/232] Update dependency @vitejs/plugin-vue to v5.2.0 --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 1d7097d089..19dc998113 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 8.14.0(eslint@9.14.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.1.4 - version: 5.1.5(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) + version: 5.2.0(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) @@ -926,8 +926,8 @@ packages: resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-vue@5.1.5': - resolution: {integrity: sha512-dlnib73G05CDBAUR/YpuZcQQ47fpjihnnNouAAqN62z+oqSsWJ+kh52GRzIxpkgFG3q11eXK7Di7RMmoCwISZA==} + '@vitejs/plugin-vue@5.2.0': + resolution: {integrity: sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 @@ -3346,7 +3346,7 @@ snapshots: '@typescript-eslint/types': 8.14.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-vue@5.1.5(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8))(vue@3.5.12(typescript@5.6.3))': dependencies: vite: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) vue: 3.5.12(typescript@5.6.3) From 98b410d23a13ab040ec60e6631c75d6c3473bd3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 20:20:13 +0000 Subject: [PATCH 007/232] Update dependency vite-bundle-analyzer to v0.13.1 (#731) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 19dc998113..287f2e6291 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -163,7 +163,7 @@ importers: version: 5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.0 - version: 0.13.0 + version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 version: 0.22.0(rollup@4.25.0)(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)) @@ -2414,8 +2414,8 @@ packages: resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} hasBin: true - vite-bundle-analyzer@0.13.0: - resolution: {integrity: sha512-59ScOf+dCf6EmPpBiQawHf2vGVm8+kaiEwDQkMoMWMNweD4VWtxpU+voPe78z74YrIuP19RCaNCAfjP+0NOJ+A==} + vite-bundle-analyzer@0.13.1: + resolution: {integrity: sha512-471KXy0cq8L9voQnkLwintkDewhUDxSOUfUq5qgCXalORVmMt4W5JbcLVR6ybEHG6K83afs9/pD7LAlnJYS4mQ==} vite-hot-client@0.2.3: resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} @@ -4977,7 +4977,7 @@ snapshots: uuid@11.0.3: {} - vite-bundle-analyzer@0.13.0: {} + vite-bundle-analyzer@0.13.1: {} vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.0)(less@4.2.0)(sass@1.77.8)): dependencies: From 5f379b735fa023f89cc5c5b9094306a8cf09565c Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Thu, 14 Nov 2024 18:01:03 +0800 Subject: [PATCH 008/232] add charts option --- webui/src/stores/userStore.ts | 20 ++++- webui/src/views/charts/grid.vue | 57 ++++++++++++ webui/src/views/charts/index.vue | 117 +++++++++---------------- webui/src/views/charts/locale/en-US.ts | 4 +- webui/src/views/charts/locale/zh-CN.ts | 4 +- 5 files changed, 124 insertions(+), 78 deletions(-) create mode 100644 webui/src/views/charts/grid.vue diff --git a/webui/src/stores/userStore.ts b/webui/src/stores/userStore.ts index 6873f983f9..217db76e55 100644 --- a/webui/src/stores/userStore.ts +++ b/webui/src/stores/userStore.ts @@ -4,12 +4,30 @@ import { defineStore } from 'pinia' export const useUserStore = defineStore('userStore', () => { const licenseVersion = useStorage('userStore.licenseVersion', 0) const scriptWarningConfirmed = useStorage('userStore.scriptWarningConfirmed', false) + const showCharts = useStorage('userStore.showCharts', { + banTrends: true, + fieldPie: true, + ispPie: true, + traffic: true, + trends: true + }) const confirmScriptWarning = () => { scriptWarningConfirmed.value = true } + const setShowCharts = (v: { + banTrends: boolean + fieldPie: boolean + ispPie: boolean + traffic: boolean + trends: boolean + }) => { + showCharts.value = v + } return { licenseVersion, scriptWarningConfirm: scriptWarningConfirmed, - confirmScriptWarning + showCharts, + confirmScriptWarning, + setShowCharts } }) diff --git a/webui/src/views/charts/grid.vue b/webui/src/views/charts/grid.vue new file mode 100644 index 0000000000..456acdbebe --- /dev/null +++ b/webui/src/views/charts/grid.vue @@ -0,0 +1,57 @@ + + diff --git a/webui/src/views/charts/index.vue b/webui/src/views/charts/index.vue index af2e2a196d..fccce2ab79 100644 --- a/webui/src/views/charts/index.vue +++ b/webui/src/views/charts/index.vue @@ -1,90 +1,57 @@ From bf9318c0f8f43d67a912d156f17e5a737ccc84f3 Mon Sep 17 00:00:00 2001 From: CreeperAWA Date: Fri, 22 Nov 2024 23:20:25 +0800 Subject: [PATCH 044/232] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20README.EN=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=8B=BC=E5=86=99=E3=80=81=E8=AF=AD=E6=B3=95?= =?UTF-8?q?=E9=94=99=E8=AF=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正了 README.EN 中的拼写、语法错误 更正了 "Multi-dail ban" 为 "Multi-dial ban" 更正了 "a mordern WebUI" 为 "A modern WebUI" 更正了 "deprected" 为 "deprecated" 更正了 "submit issue" 为 "submitting an issue" --- README.EN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.EN.md b/README.EN.md index 29f13db833..a79ad8e392 100644 --- a/README.EN.md +++ b/README.EN.md @@ -13,11 +13,11 @@ Following function are provided by PeerBanHelper: - [IP/GeoIP/IP type Blacklist](https://docs.pbh-btn.com/en/docs/module/ip-address-blocker) - [Fake progress checker (heuristic client detection)](https://docs.pbh-btn.com/en/docs/module/progress-cheat-blocker) - [Auto range ban](https://docs.pbh-btn.com/en/docs/module/auto-range-ban) -- [Multi-dail ban](https://docs.pbh-btn.com/en/docs/module/multi-dial) +- [Multi-dial ban](https://docs.pbh-btn.com/en/docs/module/multi-dial) - Peer ID/Client Name camouflage check, powered by [AviatorScript Engine](https://docs.pbh-btn.com/en/docs/module/expression-engine) - [Active monitoring(data analysis)](https://docs.pbh-btn.com/en/docs/module/active-monitoring) - [IP set subscribe](https://docs.pbh-btn.com/en/docs/module/ip-address-blocker-rules) -- a mordern WebUI +- A mordern WebUI In addition, PeerBanHelper downloads the GeoIP library at startup, and supports the following functions once it successful loaded: - View IP address attribution, AS information (ASN, ISP, AS name, etc.), network type information (broadband, base station, IoT, data center, etc.) in the blocking list. @@ -34,7 +34,7 @@ In addition, PeerBanHelper downloads the GeoIP library at startup, and supports - BiglyBT([plugin](https://github.com/PBH-BTN/PBH-Adapter-BiglyBT) is required) - Deluge([plugin](https://github.com/PBH-BTN/PBH-Adapter-Deluge) is required) - Azureus(Vuze)([plugin](https://github.com/PBH-BTN/PBH-Adapter-Azureus) is required) -- Transmission **(deprected;3.00-20 or higher)** +- Transmission **(deprecated;3.00-20 or higher)** - BitComet **v2.10 Beta6 [20240928] or higher** @@ -51,7 +51,7 @@ Please read the [docs](https://docs.pbh-btn.com/en/docs/category/%E5%AE%89%E8%A3 ## FAQ -Before submit issue, please read the [FAQ](https://docs.pbh-btn.com/en/docs/faq) +Before submitting an issue, please read the [FAQ](https://docs.pbh-btn.com/en/docs/faq) ## Support Consider join our [Telegram](https://t.me/+_t3Nt5GZ6bJmYjBl) group. From 0d0c64f2ea6a8aea4b439182614a4c8630a78a95 Mon Sep 17 00:00:00 2001 From: CreeperAWA Date: Fri, 22 Nov 2024 23:36:03 +0800 Subject: [PATCH 045/232] Update README.EN.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 发现 modern 忘改了( --- README.EN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.EN.md b/README.EN.md index a79ad8e392..1be582f3b1 100644 --- a/README.EN.md +++ b/README.EN.md @@ -17,7 +17,7 @@ Following function are provided by PeerBanHelper: - Peer ID/Client Name camouflage check, powered by [AviatorScript Engine](https://docs.pbh-btn.com/en/docs/module/expression-engine) - [Active monitoring(data analysis)](https://docs.pbh-btn.com/en/docs/module/active-monitoring) - [IP set subscribe](https://docs.pbh-btn.com/en/docs/module/ip-address-blocker-rules) -- A mordern WebUI +- A modern WebUI In addition, PeerBanHelper downloads the GeoIP library at startup, and supports the following functions once it successful loaded: - View IP address attribution, AS information (ASN, ISP, AS name, etc.), network type information (broadband, base station, IoT, data center, etc.) in the blocking list. From 1ce919f3952fd188b9f84f28204663aa2915d47b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 23 Nov 2024 03:44:34 +0000 Subject: [PATCH 046/232] Update all devDependencies (#766) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 54 ++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 683979e66a..4e1e24131b 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 14.1.2 '@types/node': specifier: ^22.9.0 - version: 22.9.1 + version: 22.9.2 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 @@ -124,7 +124,7 @@ importers: version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -160,19 +160,19 @@ importers: version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + version: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)) + version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -850,8 +850,8 @@ packages: '@types/node@16.18.119': resolution: {integrity: sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ==} - '@types/node@22.9.1': - resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==} + '@types/node@22.9.2': + resolution: {integrity: sha512-wwuxAVEbsRvDD9x7buvAl7DyQ7Oj+va/d/Veug7higYzp9MF0CINbfWTBgDFMpcVwcdUiYuNmX2KfnvY3N70mw==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -3259,7 +3259,7 @@ snapshots: '@types/node@16.18.119': {} - '@types/node@22.9.1': + '@types/node@22.9.2': dependencies: undici-types: 6.19.8 @@ -3349,9 +3349,9 @@ snapshots: '@typescript-eslint/types': 8.15.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3463,14 +3463,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -5007,11 +5007,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): dependencies: - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.24.0) @@ -5022,38 +5022,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) node-stdlib-browser: 1.2.0 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5064,17 +5064,17 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@22.9.1)(less@4.2.0)(sass@1.77.8): + vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: - '@types/node': 22.9.1 + '@types/node': 22.9.2 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.8 From 814c7ca4c2011b356f81643941f7f0b64aac7945 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Sat, 23 Nov 2024 12:01:53 +0800 Subject: [PATCH 047/232] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/views/settings/components/config/locale/en-US.ts | 2 +- webui/src/views/settings/components/config/locale/zh-CN.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/src/views/settings/components/config/locale/en-US.ts b/webui/src/views/settings/components/config/locale/en-US.ts index 002a05e536..448c1cd2e9 100644 --- a/webui/src/views/settings/components/config/locale/en-US.ts +++ b/webui/src/views/settings/components/config/locale/en-US.ts @@ -51,7 +51,7 @@ export default { 'Are you sure you want to enable submit?', 'page.settings.tab.config.btn.allowScript': 'Allow BTN server push scripts', 'page.settings.tab.config.btn.allowScript.warning': - 'Warning, this means that the remote server can execute any code on your device, please enable with caution!', + 'Warning: this means that the remote server can execute any code on your device, please enable with caution!', 'page.settings.tab.config.btn.allowScript.tips': 'This option will allow BTN server push scripts to your device, this may increase the accuracy of the ban', diff --git a/webui/src/views/settings/components/config/locale/zh-CN.ts b/webui/src/views/settings/components/config/locale/zh-CN.ts index e2847b050c..ae138ab8dc 100644 --- a/webui/src/views/settings/components/config/locale/zh-CN.ts +++ b/webui/src/views/settings/components/config/locale/zh-CN.ts @@ -50,7 +50,7 @@ export default { 'page.settings.tab.config.btn.enableSubmit.modal.content3': '确定要开启提交吗?', 'page.settings.tab.config.btn.allowScript': '允许 BTN 服务器下发脚本', 'page.settings.tab.config.btn.allowScript.warning': - '警告,这意味着远程服务器可以在你的设备上执行任意代码,请谨慎开启', + '警告:这意味着远程服务器可以在你的设备上执行任意代码,请谨慎开启', 'page.settings.tab.config.btn.allowScript.tips': '打开此选项后将允许 PeerBanHelper 接收并执行来自 BTN 服务器的动态脚本,这有助于提高反吸血精确度和反吸血效果。', From 95425974baabb1042ae82d2d94775cfaa9f5d88a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 04:26:41 +0000 Subject: [PATCH 048/232] Update dependency com.zaxxer:HikariCP to v6.2.1 (#769) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca36c6d72b..7fbac56cbf 100644 --- a/pom.xml +++ b/pom.xml @@ -310,7 +310,7 @@ com.zaxxer HikariCP - 6.2.0 + 6.2.1 com.github.mizosoft.methanol From 7cef4d002bfe419d59a4e0b9d85aa0b2a6bde4de Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 25 Nov 2024 16:19:52 +0800 Subject: [PATCH 049/232] update md --- README.EN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.EN.md b/README.EN.md index 1be582f3b1..184b270182 100644 --- a/README.EN.md +++ b/README.EN.md @@ -35,7 +35,7 @@ In addition, PeerBanHelper downloads the GeoIP library at startup, and supports - Deluge([plugin](https://github.com/PBH-BTN/PBH-Adapter-Deluge) is required) - Azureus(Vuze)([plugin](https://github.com/PBH-BTN/PBH-Adapter-Azureus) is required) - Transmission **(deprecated;3.00-20 or higher)** -- BitComet **v2.10 Beta6 [20240928] or higher** +- BitComet **v2.10 Beta6 [20240928] or higher** (P2SP LTSeed mode is not supported) # Screenshots From a0e825aeba142e852e4e01353acee0a137604e21 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 17:23:40 +0000 Subject: [PATCH 050/232] Update dependency vue-router to v4.5.0 --- webui/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 3f4d3daf8a..1a10207f26 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -90,7 +90,7 @@ importers: version: 2.0.4(patch_hash=imva7qnbqmkxs76or73cwn5jom)(vue@3.5.13(typescript@5.6.3)) vue-router: specifier: ^4.4.5 - version: 4.4.5(vue@3.5.13(typescript@5.6.3)) + version: 4.5.0(vue@3.5.13(typescript@5.6.3)) devDependencies: '@arco-plugins/vite-vue': specifier: ^1.4.5 @@ -2550,8 +2550,8 @@ packages: '@vue/composition-api': optional: true - vue-router@4.4.5: - resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==} + vue-router@4.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} peerDependencies: vue: ^3.2.0 @@ -5126,7 +5126,7 @@ snapshots: vue: 3.5.13(typescript@5.6.3) vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) - vue-router@4.4.5(vue@3.5.13(typescript@5.6.3)): + vue-router@4.5.0(vue@3.5.13(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.6.3) From 547954c3e8b7ac0416f8e48e92eddad157f608f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 00:36:27 +0000 Subject: [PATCH 051/232] Update all devDependencies (#767) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 201 +++++++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 103 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 3f4d3daf8a..fd17f01094 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -115,16 +115,16 @@ importers: version: 14.1.2 '@types/node': specifier: ^22.9.0 - version: 22.9.2 + version: 22.9.4 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 '@typescript-eslint/parser': specifier: ^8.14.0 - version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) + version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -142,7 +142,7 @@ importers: version: 9.1.7 less: specifier: ^4.2.0 - version: 4.2.0 + version: 4.2.1 monaco-editor: specifier: ^0.52.0 version: 0.52.0 @@ -157,22 +157,22 @@ importers: version: 5.6.3 typescript-eslint: specifier: ^8.14.0 - version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) + version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + version: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) + version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -847,11 +847,11 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@16.18.119': - resolution: {integrity: sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ==} + '@types/node@16.18.120': + resolution: {integrity: sha512-Dmi4bhZ7CHyD4sv4awCZx9RBxWOXSejxTF6B5WQ5UzfLcyEg7JqdDDsjvdMRYES9EcTWHlHZe01PInSj18yP2A==} - '@types/node@22.9.2': - resolution: {integrity: sha512-wwuxAVEbsRvDD9x7buvAl7DyQ7Oj+va/d/Veug7higYzp9MF0CINbfWTBgDFMpcVwcdUiYuNmX2KfnvY3N70mw==} + '@types/node@22.9.4': + resolution: {integrity: sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -859,8 +859,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -870,8 +870,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -880,12 +880,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -894,12 +894,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -907,8 +907,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -917,8 +917,8 @@ packages: typescript: optional: true - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.2.0': @@ -1799,8 +1799,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - less@4.2.0: - resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + less@4.2.1: + resolution: {integrity: sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==} engines: {node: '>=6'} hasBin: true @@ -2196,8 +2196,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} scroll-into-view-if-needed@2.2.31: resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} @@ -2342,8 +2342,8 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + ts-api-utils@1.4.1: + resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2351,9 +2351,6 @@ packages: tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2368,8 +2365,8 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@8.15.0: - resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + typescript-eslint@8.16.0: + resolution: {integrity: sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2637,7 +2634,7 @@ snapshots: '@babel/parser': 7.24.4 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 - '@types/node': 16.18.119 + '@types/node': 16.18.120 transitivePeerDependencies: - supports-color @@ -3257,9 +3254,9 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@16.18.119': {} + '@types/node@16.18.120': {} - '@types/node@22.9.2': + '@types/node@22.9.4': dependencies: undici-types: 6.19.8 @@ -3267,30 +3264,30 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 eslint: 9.15.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.6.3) + ts-api-utils: 1.4.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 eslint: 9.15.0 optionalDependencies: @@ -3298,60 +3295,60 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) debug: 4.3.7 eslint: 9.15.0 - ts-api-utils: 1.4.0(typescript@5.6.3) + ts-api-utils: 1.4.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.6.3) + ts-api-utils: 1.4.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) eslint: 9.15.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3463,14 +3460,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -4361,11 +4358,11 @@ snapshots: kolorist@1.8.0: {} - less@4.2.0: + less@4.2.1: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.2 + tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -4479,7 +4476,7 @@ snapshots: needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.3.0 + sax: 1.4.1 optional: true node-releases@2.0.18: {} @@ -4799,7 +4796,7 @@ snapshots: source-map-js: 1.2.1 optional: true - sax@1.3.0: + sax@1.4.1: optional: true scroll-into-view-if-needed@2.2.31: @@ -4937,14 +4934,12 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.4.0(typescript@5.6.3): + ts-api-utils@1.4.1(typescript@5.6.3): dependencies: typescript: 5.6.3 tslib@2.3.0: {} - tslib@2.6.2: {} - tslib@2.8.1: {} tty-browserify@0.0.1: {} @@ -4955,11 +4950,11 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.15.0(eslint@9.15.0)(typescript@5.6.3): + typescript-eslint@8.16.0(eslint@9.15.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0)(typescript@5.6.3) eslint: 9.15.0 optionalDependencies: typescript: 5.6.3 @@ -5007,11 +5002,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.24.0) @@ -5022,38 +5017,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) node-stdlib-browser: 1.2.0 - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5064,19 +5059,19 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8) + vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@22.9.2)(less@4.2.0)(sass@1.77.8): + vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: - '@types/node': 22.9.2 + '@types/node': 22.9.4 fsevents: 2.3.3 - less: 4.2.0 + less: 4.2.1 sass: 1.77.8 vm-browserify@1.1.2: {} From f5a64a83a3e9782d7d1ae1baa1fa5c7ef4fe7b1f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 08:02:33 +0000 Subject: [PATCH 052/232] Update all devDependencies (#771) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 70 ++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index fd17f01094..7902173864 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 14.1.2 '@types/node': specifier: ^22.9.0 - version: 22.9.4 + version: 22.10.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 @@ -124,7 +124,7 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -151,7 +151,7 @@ importers: version: 7.0.1 prettier: specifier: ^3.3.3 - version: 3.3.3 + version: 3.4.0 typescript: specifier: ~5.6.3 version: 5.6.3 @@ -160,19 +160,19 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + version: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) + version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -850,8 +850,8 @@ packages: '@types/node@16.18.120': resolution: {integrity: sha512-Dmi4bhZ7CHyD4sv4awCZx9RBxWOXSejxTF6B5WQ5UzfLcyEg7JqdDDsjvdMRYES9EcTWHlHZe01PInSj18yP2A==} - '@types/node@22.9.4': - resolution: {integrity: sha512-d9RWfoR7JC/87vj7n+PVTzGg9hDyuFjir3RxUHbjFSKNd9mpxbxwMEyaCim/ddCmy4IuW7HjTzF3g9p3EtWEOg==} + '@types/node@22.10.0': + resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -2088,8 +2088,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.0: + resolution: {integrity: sha512-/OXNZcLyWkfo13ofOW5M7SLh+k5pnIs07owXK2teFpnfaOEcycnSy7HQxldaVX1ZP/7Q8oO1eDuQJNwbomQq5Q==} engines: {node: '>=14'} hasBin: true @@ -2383,8 +2383,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} universal-user-agent@7.0.2: resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} @@ -3256,9 +3256,9 @@ snapshots: '@types/node@16.18.120': {} - '@types/node@22.9.4': + '@types/node@22.10.0': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/uuid@10.0.0': {} @@ -3346,9 +3346,9 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3460,14 +3460,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -4668,7 +4668,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.3.3: {} + prettier@3.4.0: {} process-nextick-args@2.0.1: {} @@ -4965,7 +4965,7 @@ snapshots: uc.micro@2.1.0: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} universal-user-agent@7.0.2: {} @@ -5002,11 +5002,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.24.0) @@ -5017,38 +5017,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) node-stdlib-browser: 1.2.0 - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5059,17 +5059,17 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8) + vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@22.9.4)(less@4.2.1)(sass@1.77.8): + vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: - '@types/node': 22.9.4 + '@types/node': 22.10.0 fsevents: 2.3.3 less: 4.2.1 sass: 1.77.8 From f47b01077dc61b96e831a149f16aa0eb55c0fdc5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:37:19 +0000 Subject: [PATCH 053/232] Update docker/build-push-action action to v6.10.0 --- .github/workflows/jvm-ci.yml | 2 +- .github/workflows/jvm-release.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/jvm-ci.yml b/.github/workflows/jvm-ci.yml index a3f16b14d1..770fc5576f 100644 --- a/.github/workflows/jvm-ci.yml +++ b/.github/workflows/jvm-ci.yml @@ -63,7 +63,7 @@ jobs: type=raw,ci type=sha - name: Build and push Docker image - uses: docker/build-push-action@v6.9.0 + uses: docker/build-push-action@v6.10.0 with: context: . file: ./Dockerfile diff --git a/.github/workflows/jvm-release.yml b/.github/workflows/jvm-release.yml index ca2c485755..ac9fb8e2df 100644 --- a/.github/workflows/jvm-release.yml +++ b/.github/workflows/jvm-release.yml @@ -132,7 +132,7 @@ jobs: type=raw,latest type=sha - name: Build and push Docker image - uses: docker/build-push-action@v6.9.0 + uses: docker/build-push-action@v6.10.0 with: context: . file: ./Dockerfile @@ -170,7 +170,7 @@ jobs: type=raw,latest type=sha - name: Build and push Aliyun ACR - uses: docker/build-push-action@v6.9.0 + uses: docker/build-push-action@v6.10.0 with: context: . file: ./Dockerfile-Release From f10ce704e097c7838634a290070b37d88c26e7fc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:08:12 +0000 Subject: [PATCH 054/232] Update dependency vite to v6 (#776) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 329 ++++++++++++++++++++++--------------------- 2 files changed, 170 insertions(+), 161 deletions(-) diff --git a/webui/package.json b/webui/package.json index 84a4701824..098ac95a0d 100644 --- a/webui/package.json +++ b/webui/package.json @@ -65,7 +65,7 @@ "prettier": "^3.3.3", "typescript": "~5.6.3", "typescript-eslint": "^8.14.0", - "vite": "^5.4.11", + "vite": "^6.0.0", "vite-bundle-analyzer": "^0.13.1", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-remove-console": "^2.2.0", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 7902173864..77a53ac835 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -159,20 +159,20 @@ importers: specifier: ^8.14.0 version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vite: - specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + specifier: ^6.0.0 + version: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + version: 0.22.0(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -413,141 +413,147 @@ packages: '@dzangolab/flag-icon-css@3.4.5': resolution: {integrity: sha512-XqVAi0O/KITtznpMK5TP4D+rWfwst5lrsbPbes5c5SPMGjwK7fuvlTdEmG2XUrxzYqDTIPshywyzdVYKooGdGA==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1376,9 +1382,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -2076,10 +2082,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -2456,22 +2458,27 @@ packages: peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 - vite@5.4.11: - resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.0.0: + resolution: {integrity: sha512-Q2+5yQV79EdnpbNxjD3/QHVMCBaQ3Kpd4/uL51UGuh38bIIM+s4o3FqyCzRvTRwFb+cWIUeZvaWwS9y2LD2qeQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2486,6 +2493,10 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} @@ -2916,73 +2927,76 @@ snapshots: '@dzangolab/flag-icon-css@3.4.5': {} - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.24.0': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.24.0': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.24.0': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.24.0': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.24.0': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.24.0': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.24.0': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.24.0': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.24.0': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.24.0': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.24.0': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.24.0': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.24.0': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.24.0': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.24.0': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.24.0': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.24.0': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.0': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.24.0': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-x64@0.24.0': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/sunos-x64@0.24.0': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-arm64@0.24.0': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.24.0': optional: true '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0)': @@ -3346,9 +3360,9 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3428,7 +3442,7 @@ snapshots: '@vue/shared': 3.5.12 estree-walker: 2.0.2 magic-string: 0.30.12 - postcss: 8.4.47 + postcss: 8.4.49 source-map-js: 1.2.1 '@vue/compiler-sfc@3.5.13': @@ -3460,14 +3474,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -3935,31 +3949,32 @@ snapshots: es-errors@1.3.0: {} - esbuild@0.21.5: + esbuild@0.24.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 escalade@3.2.0: {} @@ -4654,12 +4669,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.47: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.4.49: dependencies: nanoid: 3.3.7 @@ -5002,11 +5011,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.24.0) @@ -5017,38 +5026,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) node-stdlib-browser: 1.2.0 - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5059,14 +5068,14 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@5.4.11(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): + vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 + esbuild: 0.24.0 + postcss: 8.4.49 rollup: 4.24.0 optionalDependencies: '@types/node': 22.10.0 From 489d4f297bc20e9c39eb501aa79f843edbf1c308 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:41:51 +0000 Subject: [PATCH 055/232] Update all devDependencies (#772) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 77a53ac835..a9fae23b38 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -151,7 +151,7 @@ importers: version: 7.0.1 prettier: specifier: ^3.3.3 - version: 3.4.0 + version: 3.4.1 typescript: specifier: ~5.6.3 version: 5.6.3 @@ -927,11 +927,11 @@ packages: resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-vue@5.2.0': - resolution: {integrity: sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==} + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 '@volar/language-core@2.4.8': @@ -2090,8 +2090,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.0: - resolution: {integrity: sha512-/OXNZcLyWkfo13ofOW5M7SLh+k5pnIs07owXK2teFpnfaOEcycnSy7HQxldaVX1ZP/7Q8oO1eDuQJNwbomQq5Q==} + prettier@3.4.1: + resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} engines: {node: '>=14'} hasBin: true @@ -3360,7 +3360,7 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) @@ -4677,7 +4677,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.0: {} + prettier@3.4.1: {} process-nextick-args@2.0.1: {} From cb6dc0162ea1e6cc54f7245d90ec8d66cf7b4e57 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:10:28 +0000 Subject: [PATCH 056/232] Update all devDependencies (#780) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 229 ++++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 102 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index a9fae23b38..bbf8e4b8b9 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.1(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -160,19 +160,19 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^6.0.0 - version: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + version: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + version: 0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -743,83 +743,93 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.24.0': - resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} + '@rollup/rollup-android-arm-eabi@4.27.4': + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.0': - resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} + '@rollup/rollup-android-arm64@4.27.4': + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.0': - resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} + '@rollup/rollup-darwin-arm64@4.27.4': + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.0': - resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} + '@rollup/rollup-darwin-x64@4.27.4': + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': - resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} + '@rollup/rollup-freebsd-arm64@4.27.4': + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.4': + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.0': - resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.0': - resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} + '@rollup/rollup-linux-arm64-gnu@4.27.4': + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.0': - resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': - resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.0': - resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.0': - resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.0': - resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.0': - resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.0': - resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.0': - resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.0': - resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} cpu: [x64] os: [win32] @@ -1916,6 +1926,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2172,8 +2187,8 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.24.0: - resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2458,8 +2473,8 @@ packages: peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 - vite@6.0.0: - resolution: {integrity: sha512-Q2+5yQV79EdnpbNxjD3/QHVMCBaQ3Kpd4/uL51UGuh38bIIM+s4o3FqyCzRvTRwFb+cWIUeZvaWwS9y2LD2qeQ==} + vite@6.0.1: + resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3168,76 +3183,82 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-inject@5.0.5(rollup@4.24.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) estree-walker: 2.0.2 magic-string: 0.30.9 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 - '@rollup/pluginutils@5.1.0(rollup@4.24.0)': + '@rollup/pluginutils@5.1.0(rollup@4.27.4)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 - '@rollup/pluginutils@5.1.3(rollup@4.24.0)': + '@rollup/pluginutils@5.1.3(rollup@4.27.4)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 + + '@rollup/rollup-android-arm-eabi@4.27.4': + optional: true - '@rollup/rollup-android-arm-eabi@4.24.0': + '@rollup/rollup-android-arm64@4.27.4': optional: true - '@rollup/rollup-android-arm64@4.24.0': + '@rollup/rollup-darwin-arm64@4.27.4': optional: true - '@rollup/rollup-darwin-arm64@4.24.0': + '@rollup/rollup-darwin-x64@4.27.4': optional: true - '@rollup/rollup-darwin-x64@4.24.0': + '@rollup/rollup-freebsd-arm64@4.27.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + '@rollup/rollup-freebsd-x64@4.27.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.0': + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.0': + '@rollup/rollup-linux-arm-musleabihf@4.27.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.0': + '@rollup/rollup-linux-arm64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + '@rollup/rollup-linux-arm64-musl@4.27.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.0': + '@rollup/rollup-linux-riscv64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.0': + '@rollup/rollup-linux-s390x-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-musl@4.24.0': + '@rollup/rollup-linux-x64-gnu@4.27.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.0': + '@rollup/rollup-linux-x64-musl@4.27.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.0': + '@rollup/rollup-win32-arm64-msvc@4.27.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.0': + '@rollup/rollup-win32-ia32-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.4': optional: true '@rushstack/eslint-patch@1.10.4': {} @@ -3360,9 +3381,9 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.1(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3474,14 +3495,14 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.3(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite @@ -4486,6 +4507,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@3.3.8: {} + natural-compare@1.4.0: {} needle@3.3.1: @@ -4671,7 +4694,7 @@ snapshots: postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4763,26 +4786,28 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 - rollup@4.24.0: + rollup@4.27.4: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.0 - '@rollup/rollup-android-arm64': 4.24.0 - '@rollup/rollup-darwin-arm64': 4.24.0 - '@rollup/rollup-darwin-x64': 4.24.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 - '@rollup/rollup-linux-arm-musleabihf': 4.24.0 - '@rollup/rollup-linux-arm64-gnu': 4.24.0 - '@rollup/rollup-linux-arm64-musl': 4.24.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 - '@rollup/rollup-linux-riscv64-gnu': 4.24.0 - '@rollup/rollup-linux-s390x-gnu': 4.24.0 - '@rollup/rollup-linux-x64-gnu': 4.24.0 - '@rollup/rollup-linux-x64-musl': 4.24.0 - '@rollup/rollup-win32-arm64-msvc': 4.24.0 - '@rollup/rollup-win32-ia32-msvc': 4.24.0 - '@rollup/rollup-win32-x64-msvc': 4.24.0 + '@rollup/rollup-android-arm-eabi': 4.27.4 + '@rollup/rollup-android-arm64': 4.27.4 + '@rollup/rollup-darwin-arm64': 4.27.4 + '@rollup/rollup-darwin-x64': 4.27.4 + '@rollup/rollup-freebsd-arm64': 4.27.4 + '@rollup/rollup-freebsd-x64': 4.27.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 + '@rollup/rollup-linux-arm-musleabihf': 4.27.4 + '@rollup/rollup-linux-arm64-gnu': 4.27.4 + '@rollup/rollup-linux-arm64-musl': 4.27.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 + '@rollup/rollup-linux-riscv64-gnu': 4.27.4 + '@rollup/rollup-linux-s390x-gnu': 4.27.4 + '@rollup/rollup-linux-x64-gnu': 4.27.4 + '@rollup/rollup-linux-x64-musl': 4.27.4 + '@rollup/rollup-win32-arm64-msvc': 4.27.4 + '@rollup/rollup-win32-ia32-msvc': 4.27.4 + '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -5011,14 +5036,14 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.3(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.3(rollup@4.24.0) + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) debug: 4.3.7 error-stack-parser-es: 0.1.5 fs-extra: 11.2.0 @@ -5026,38 +5051,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.24.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.27.4) node-stdlib-browser: 1.2.0 - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-core': 7.6.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-kit': 7.6.4 '@vue/devtools-shared': 7.6.4 execa: 8.0.1 sirv: 3.0.0 - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.24.0)(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.2.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.2.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5068,15 +5093,15 @@ snapshots: '@vue/compiler-dom': 3.5.12 kolorist: 1.8.0 magic-string: 0.30.12 - vite: 6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@6.0.0(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): + vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): dependencies: esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.24.0 + rollup: 4.27.4 optionalDependencies: '@types/node': 22.10.0 fsevents: 2.3.3 From 36620fda082e5009d2e4d1e83ce03cce135e191e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:11:30 +0000 Subject: [PATCH 057/232] Update dependency @vueuse/core to v12 --- webui/package.json | 2 +- webui/pnpm-lock.yaml | 36 +++++++++++++++++------------------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/webui/package.json b/webui/package.json index 098ac95a0d..d9ba45b278 100644 --- a/webui/package.json +++ b/webui/package.json @@ -21,7 +21,7 @@ "@guolao/vue-monaco-editor": "^1.5.4", "@octokit/core": "^6.1.2", "@octokit/request-error": "^6.1.5", - "@vueuse/core": "^11.2.0", + "@vueuse/core": "^12.0.0", "antlr4": "^4.13.2", "compare-versions": "^6.1.1", "copy-to-clipboard": "^3.3.3", diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index bbf8e4b8b9..a582a26f2c 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -32,8 +32,8 @@ importers: specifier: ^6.1.5 version: 6.1.5 '@vueuse/core': - specifier: ^11.2.0 - version: 11.3.0(vue@3.5.13(typescript@5.6.3)) + specifier: ^12.0.0 + version: 12.0.0(typescript@5.6.3) antlr4: specifier: ^4.13.2 version: 4.13.2 @@ -1049,14 +1049,14 @@ packages: vue: optional: true - '@vueuse/core@11.3.0': - resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + '@vueuse/core@12.0.0': + resolution: {integrity: sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==} - '@vueuse/metadata@11.3.0': - resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + '@vueuse/metadata@12.0.0': + resolution: {integrity: sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==} - '@vueuse/shared@11.3.0': - resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@vueuse/shared@12.0.0': + resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3565,24 +3565,22 @@ snapshots: typescript: 5.6.3 vue: 3.5.13(typescript@5.6.3) - '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.6.3))': + '@vueuse/core@12.0.0(typescript@5.6.3)': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 11.3.0 - '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + '@vueuse/metadata': 12.0.0 + '@vueuse/shared': 12.0.0(typescript@5.6.3) + vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/metadata@11.3.0': {} + '@vueuse/metadata@12.0.0': {} - '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.6.3))': + '@vueuse/shared@12.0.0(typescript@5.6.3)': dependencies: - vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) + vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript acorn-jsx@5.3.2(acorn@8.12.1): dependencies: From ce5d3f2c5ac5df6804f8b0b2b3c6d9101a170b63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:34:16 +0000 Subject: [PATCH 058/232] Update all devDependencies (#781) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 171 +++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 105 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index bbf8e4b8b9..7a74873e2f 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -172,7 +172,7 @@ importers: version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.5(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -294,10 +294,6 @@ packages: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -402,10 +398,6 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.7': - resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} @@ -981,15 +973,9 @@ packages: '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.5.12': - resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} - '@vue/compiler-sfc@3.5.13': resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - '@vue/compiler-ssr@3.5.12': - resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} - '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} @@ -999,16 +985,16 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-core@7.6.4': - resolution: {integrity: sha512-blSwGVYpb7b5TALMjjoBiAl5imuBF7WEOAtaJaBMNikR8SQkm6mkUt4YlIKh9874/qoimwmpDOm+GHBZ4Y5m+g==} + '@vue/devtools-core@7.6.5': + resolution: {integrity: sha512-PKTEZVzY4Ef6G8LnbACKkPDOcdr2snFn3Xk8YqyFgugmogDrA3cyYVQ58CS0XTO9AYUXU9E5FFt5JJf22kXF2w==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.4': - resolution: {integrity: sha512-Zs86qIXXM9icU0PiGY09PQCle4TI750IPLmAJzW5Kf9n9t5HzSYf6Rz6fyzSwmfMPiR51SUKJh9sXVZu78h2QA==} + '@vue/devtools-kit@7.6.5': + resolution: {integrity: sha512-fLQhUwmUbtEDHW1SEiHUF5k2Ptw816As5ZUVb/SzrqkrJzXI8xjEIo8suNBe/N+ewdz/9m5ayeFH8fmcVIbr4Q==} - '@vue/devtools-shared@7.6.4': - resolution: {integrity: sha512-nD6CUvBEel+y7zpyorjiUocy0nh77DThZJ0k1GRnJeOmY3ATq2fWijEp7wk37gb023Cb0R396uYh5qMSBQ5WFg==} + '@vue/devtools-shared@7.6.5': + resolution: {integrity: sha512-szsXQ0jlpjuFfmxb6F40qkSF4gtLC1W+dKRh/UiTulC+RekZsjqcN/qnVFkzqOO1YnzzShinZwfmv+MbfPJnpw==} '@vue/language-core@2.1.10': resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} @@ -1204,8 +1190,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001678: - resolution: {integrity: sha512-RR+4U/05gNtps58PEBDZcPWTgEO2MBeoPZ96aQcjmfkBWRIDfN451fW2qyDA9/+HohLLIL5GqiMwA+IB1pWarw==} + caniuse-lite@1.0.30001684: + resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1296,6 +1282,10 @@ packages: resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} @@ -1367,8 +1357,8 @@ packages: echarts@5.5.1: resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} - electron-to-chromium@1.5.55: - resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} + electron-to-chromium@1.5.65: + resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} elliptic@6.6.0: resolution: {integrity: sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==} @@ -1843,6 +1833,9 @@ packages: magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.9: resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} engines: {node: '>=12'} @@ -1921,11 +1914,6 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2270,10 +2258,6 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sirv@3.0.0: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} @@ -2439,13 +2423,13 @@ packages: vite-bundle-analyzer@0.13.1: resolution: {integrity: sha512-471KXy0cq8L9voQnkLwintkDewhUDxSOUfUq5qgCXalORVmMt4W5JbcLVR6ybEHG6K83afs9/pD7LAlnJYS4mQ==} - vite-hot-client@0.2.3: - resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + vite-hot-client@0.2.4: + resolution: {integrity: sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==} peerDependencies: - vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 - vite-plugin-inspect@0.8.7: - resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + vite-plugin-inspect@0.8.8: + resolution: {integrity: sha512-aZlBuXsWUPJFmMK92GIv6lH7LrwG2POu4KJ+aEdcqnu92OAf+rhBnfMDQvxIJPEB7hE2t5EyY/PMgf5aDLT8EA==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -2462,14 +2446,14 @@ packages: vite-plugin-remove-console@2.2.0: resolution: {integrity: sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==} - vite-plugin-vue-devtools@7.6.4: - resolution: {integrity: sha512-jxSsLyuETfmZ1OSrmnDp28BG6rmURrP7lkeyHW2gBFDyo+4dUcqVeQNMhbV7uKZn80mDdv06Mysw/5AdGxDvJQ==} + vite-plugin-vue-devtools@7.6.5: + resolution: {integrity: sha512-5ISMSoLMrOl/77suAC3DigbuI4oSsWW7fgwdAoKbKvtY6+L3Jv51mjCnirzRog2uP0K59iIXwHHtORUg1aBQ2A==} engines: {node: '>=v14.21.3'} peerDependencies: - vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 - vite-plugin-vue-inspector@5.2.0: - resolution: {integrity: sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==} + vite-plugin-vue-inspector@5.3.0: + resolution: {integrity: sha512-F6JNRUOrZl8FaUCTxPhsOLn2ka7N7Sz9ppxmmEwpybVBDYnhelbNnnlZpeFPc4ULnxbitSi8b0V2C0KT3CjReg==} peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 @@ -2803,8 +2787,6 @@ snapshots: '@babel/helper-string-parser@7.24.1': {} - '@babel/helper-string-parser@7.25.7': {} - '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.22.20': {} @@ -2833,7 +2815,7 @@ snapshots: '@babel/parser@7.25.7': dependencies: - '@babel/types': 7.25.7 + '@babel/types': 7.26.0 '@babel/parser@7.26.2': dependencies: @@ -2929,12 +2911,6 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - '@babel/types@7.25.7': - dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - to-fast-properties: 2.0.0 - '@babel/types@7.26.0': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -3424,13 +3400,13 @@ snapshots: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/parser': 7.26.2 - '@vue/compiler-sfc': 3.5.12 + '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.12': dependencies: - '@babel/parser': 7.25.7 + '@babel/parser': 7.26.2 '@vue/shared': 3.5.12 entities: 4.5.0 estree-walker: 2.0.2 @@ -3454,18 +3430,6 @@ snapshots: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.5.12': - dependencies: - '@babel/parser': 7.26.2 - '@vue/compiler-core': 3.5.12 - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-ssr': 3.5.12 - '@vue/shared': 3.5.12 - estree-walker: 2.0.2 - magic-string: 0.30.12 - postcss: 8.4.49 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.26.2 @@ -3478,11 +3442,6 @@ snapshots: postcss: 8.4.49 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.12': - dependencies: - '@vue/compiler-dom': 3.5.12 - '@vue/shared': 3.5.12 - '@vue/compiler-ssr@3.5.13': dependencies: '@vue/compiler-dom': 3.5.13 @@ -3495,21 +3454,21 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.5(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - '@vue/devtools-kit': 7.6.4 - '@vue/devtools-shared': 7.6.4 + '@vue/devtools-kit': 7.6.5 + '@vue/devtools-shared': 7.6.5 mitt: 3.0.1 - nanoid: 3.3.7 + nanoid: 3.3.8 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.4': + '@vue/devtools-kit@7.6.5': dependencies: - '@vue/devtools-shared': 7.6.4 + '@vue/devtools-shared': 7.6.5 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -3517,7 +3476,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.4': + '@vue/devtools-shared@7.6.5': dependencies: rfdc: 1.4.1 @@ -3729,8 +3688,8 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001678 - electron-to-chromium: 1.5.55 + caniuse-lite: 1.0.30001684 + electron-to-chromium: 1.5.65 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -3757,7 +3716,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001678: {} + caniuse-lite@1.0.30001684: {} chalk@2.4.2: dependencies: @@ -3872,6 +3831,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 @@ -3943,7 +3908,7 @@ snapshots: tslib: 2.3.0 zrender: 5.6.0 - electron-to-chromium@1.5.55: {} + electron-to-chromium@1.5.65: {} elliptic@6.6.0: dependencies: @@ -4109,7 +4074,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.5 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -4433,6 +4398,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.14: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.9: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -4505,8 +4474,6 @@ snapshots: muggle-string@0.4.1: {} - nanoid@3.3.7: {} - nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -4883,12 +4850,6 @@ snapshots: dependencies: is-arrayish: 0.3.2 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.28 - mrmime: 2.0.0 - totalist: 3.0.1 - sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.28 @@ -5036,11 +4997,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.3(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -5050,7 +5011,7 @@ snapshots: open: 10.1.0 perfect-debounce: 1.0.0 picocolors: 1.1.1 - sirv: 2.0.4 + sirv: 3.0.0 vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup @@ -5066,23 +5027,23 @@ snapshots: vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.4(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.5(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) - '@vue/devtools-kit': 7.6.4 - '@vue/devtools-shared': 7.6.4 + '@vue/devtools-core': 7.6.5(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-kit': 7.6.5 + '@vue/devtools-shared': 7.6.5 execa: 8.0.1 sirv: 3.0.0 vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.2.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.3.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.2.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.3.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5090,9 +5051,9 @@ snapshots: '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0) - '@vue/compiler-dom': 3.5.12 + '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 - magic-string: 0.30.12 + magic-string: 0.30.14 vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color From df4956e25395225fc1dd6fee17376b91bd1a398d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 19:07:43 +0000 Subject: [PATCH 059/232] Update all devDependencies (#783) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 262 ++++++++++++++++++++++++++----------------- 1 file changed, 157 insertions(+), 105 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index 7a74873e2f..da19ff0503 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 14.1.2 '@types/node': specifier: ^22.9.0 - version: 22.10.0 + version: 22.10.1 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 @@ -124,7 +124,7 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^5.2.0 - version: 5.2.1(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.6.0 version: 0.6.0(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) @@ -160,19 +160,19 @@ importers: version: 8.16.0(eslint@9.15.0)(typescript@5.6.3) vite: specifier: ^6.0.0 - version: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + version: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) vite-bundle-analyzer: specifier: ^0.13.1 version: 0.13.1 vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + version: 0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) vite-plugin-remove-console: specifier: ^2.2.0 version: 2.2.0 vite-plugin-vue-devtools: specifier: ^7.6.4 - version: 7.6.5(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + version: 7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.15.0) @@ -828,6 +828,13 @@ packages: '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@tsconfig/node20@20.1.4': resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} @@ -855,11 +862,11 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@16.18.120': - resolution: {integrity: sha512-Dmi4bhZ7CHyD4sv4awCZx9RBxWOXSejxTF6B5WQ5UzfLcyEg7JqdDDsjvdMRYES9EcTWHlHZe01PInSj18yP2A==} + '@types/node@16.18.121': + resolution: {integrity: sha512-Gk/pOy8H0cvX8qNrwzElYIECpcUn87w4EAEFXFvPJ8qsP9QR/YqukUORSy0zmyDyvdo149idPpy4W6iC5aSbQA==} - '@types/node@22.10.0': - resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} + '@types/node@22.10.1': + resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -985,16 +992,16 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-core@7.6.5': - resolution: {integrity: sha512-PKTEZVzY4Ef6G8LnbACKkPDOcdr2snFn3Xk8YqyFgugmogDrA3cyYVQ58CS0XTO9AYUXU9E5FFt5JJf22kXF2w==} + '@vue/devtools-core@7.6.7': + resolution: {integrity: sha512-6fW8Q0H1NHDXdEcuV6dylT5U2Yxg3SdMnVCey99Y6S4R2PNgFL2vC+VU9U9rHIiaoEUkeza42S7FfHxV4VI3Jg==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.6.5': - resolution: {integrity: sha512-fLQhUwmUbtEDHW1SEiHUF5k2Ptw816As5ZUVb/SzrqkrJzXI8xjEIo8suNBe/N+ewdz/9m5ayeFH8fmcVIbr4Q==} + '@vue/devtools-kit@7.6.7': + resolution: {integrity: sha512-V8/jrXY/swHgnblABG9U4QCbE60c6RuPasmv2d9FvVqc5d94t1vDiESuvRmdNJBdWz4/D3q6ffgyAfRVjwHYEw==} - '@vue/devtools-shared@7.6.5': - resolution: {integrity: sha512-szsXQ0jlpjuFfmxb6F40qkSF4gtLC1W+dKRh/UiTulC+RekZsjqcN/qnVFkzqOO1YnzzShinZwfmv+MbfPJnpw==} + '@vue/devtools-shared@7.6.7': + resolution: {integrity: sha512-QggO6SviAsolrePAXZ/sA1dSicSPt4TueZibCvydfhNDieL1lAuyMTgQDGst7TEvMGb4vgYv2I+1sDkO4jWNnw==} '@vue/language-core@2.1.10': resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} @@ -1357,8 +1364,8 @@ packages: echarts@5.5.1: resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} - electron-to-chromium@1.5.65: - resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} + electron-to-chromium@1.5.66: + resolution: {integrity: sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==} elliptic@6.6.0: resolution: {integrity: sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==} @@ -1471,9 +1478,9 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@9.5.1: + resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} + engines: {node: ^18.19.0 || >=20.5.0} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1491,6 +1498,10 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1537,9 +1548,9 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1625,9 +1636,9 @@ packages: https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} @@ -1724,18 +1735,26 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-regexp@3.1.0: resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} engines: {node: '>=12'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -1858,9 +1877,6 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1878,10 +1894,6 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -1919,6 +1931,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + engines: {node: ^18 || >=20} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1950,9 +1967,9 @@ packages: engines: {node: ^18.17.0 || >=20.5.0, npm: '>= 9'} hasBin: true - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1975,10 +1992,6 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -2009,6 +2022,10 @@ packages: resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} engines: {node: '>= 0.10'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -2098,6 +2115,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2289,9 +2310,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -2387,6 +2408,10 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + universal-user-agent@7.0.2: resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} @@ -2446,16 +2471,16 @@ packages: vite-plugin-remove-console@2.2.0: resolution: {integrity: sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==} - vite-plugin-vue-devtools@7.6.5: - resolution: {integrity: sha512-5ISMSoLMrOl/77suAC3DigbuI4oSsWW7fgwdAoKbKvtY6+L3Jv51mjCnirzRog2uP0K59iIXwHHtORUg1aBQ2A==} + vite-plugin-vue-devtools@7.6.7: + resolution: {integrity: sha512-H1ZyjtpWjP5mHA5R15sQeYgAARuh2Myg3TDFXWZK6QOQRy8s3XjTIt319DogVjU/x3rC3L/jJQjIasRU04mWXA==} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 - vite-plugin-vue-inspector@5.3.0: - resolution: {integrity: sha512-F6JNRUOrZl8FaUCTxPhsOLn2ka7N7Sz9ppxmmEwpybVBDYnhelbNnnlZpeFPc4ULnxbitSi8b0V2C0KT3CjReg==} + vite-plugin-vue-inspector@5.3.1: + resolution: {integrity: sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==} peerDependencies: - vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 vite@6.0.1: resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} @@ -2609,6 +2634,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + zrender@5.6.0: resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} @@ -2644,7 +2673,7 @@ snapshots: '@babel/parser': 7.24.4 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 - '@types/node': 16.18.120 + '@types/node': 16.18.121 transitivePeerDependencies: - supports-color @@ -3239,6 +3268,10 @@ snapshots: '@rushstack/eslint-patch@1.10.4': {} + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@tsconfig/node20@20.1.4': {} '@types/eslint@9.6.1': @@ -3265,9 +3298,9 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@16.18.120': {} + '@types/node@16.18.121': {} - '@types/node@22.10.0': + '@types/node@22.10.1': dependencies: undici-types: 6.20.0 @@ -3357,9 +3390,9 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.1(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.8': @@ -3454,21 +3487,21 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.6.5(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': + '@vue/devtools-core@7.6.7(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3))': dependencies: - '@vue/devtools-kit': 7.6.5 - '@vue/devtools-shared': 7.6.5 + '@vue/devtools-kit': 7.6.7 + '@vue/devtools-shared': 7.6.7 mitt: 3.0.1 - nanoid: 3.3.8 + nanoid: 5.0.9 pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite-hot-client: 0.2.4(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) vue: 3.5.13(typescript@5.6.3) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.6.5': + '@vue/devtools-kit@7.6.7': dependencies: - '@vue/devtools-shared': 7.6.5 + '@vue/devtools-shared': 7.6.7 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -3476,7 +3509,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.6.5': + '@vue/devtools-shared@7.6.7': dependencies: rfdc: 1.4.1 @@ -3689,7 +3722,7 @@ snapshots: browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001684 - electron-to-chromium: 1.5.65 + electron-to-chromium: 1.5.66 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -3908,7 +3941,7 @@ snapshots: tslib: 2.3.0 zrender: 5.6.0 - electron-to-chromium@1.5.65: {} + electron-to-chromium@1.5.66: {} elliptic@6.6.0: dependencies: @@ -4072,17 +4105,20 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 - execa@8.0.1: + execa@9.5.1: dependencies: + '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 fast-deep-equal@3.1.3: {} @@ -4102,6 +4138,10 @@ snapshots: dependencies: reusify: 1.0.4 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4149,7 +4189,10 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 glob-parent@5.1.2: dependencies: @@ -4225,7 +4268,7 @@ snapshots: https-browserify@1.0.0: {} - human-signals@5.0.0: {} + human-signals@8.0.0: {} husky@9.1.7: {} @@ -4303,14 +4346,18 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-regexp@3.1.0: {} - is-stream@3.0.0: {} + is-stream@4.0.1: {} is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 + is-unicode-supported@2.1.0: {} + is-what@3.14.1: {} is-what@4.1.16: {} @@ -4431,8 +4478,6 @@ snapshots: memorystream@0.3.1: {} - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -4448,8 +4493,6 @@ snapshots: mime@1.6.0: optional: true - mimic-fn@4.0.0: {} - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -4476,6 +4519,8 @@ snapshots: nanoid@3.3.8: {} + nanoid@5.0.9: {} + natural-compare@1.4.0: {} needle@3.3.1: @@ -4534,9 +4579,10 @@ snapshots: shell-quote: 1.8.1 which: 5.0.0 - npm-run-path@5.3.0: + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 + unicorn-magic: 0.3.0 nth-check@2.1.1: dependencies: @@ -4560,10 +4606,6 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - open@10.1.0: dependencies: default-browser: 5.2.1 @@ -4605,6 +4647,8 @@ snapshots: pbkdf2: 3.1.2 safe-buffer: 5.2.1 + parse-ms@4.0.0: {} + parse-node-version@1.0.1: {} path-browserify@1.0.1: {} @@ -4669,6 +4713,10 @@ snapshots: prettier@3.4.1: {} + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -4885,7 +4933,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} @@ -4962,6 +5010,8 @@ snapshots: undici-types@6.20.0: {} + unicorn-magic@0.3.0: {} + universal-user-agent@7.0.2: {} universalify@2.0.1: {} @@ -4997,11 +5047,11 @@ snapshots: vite-bundle-analyzer@0.13.1: {} - vite-hot-client@0.2.4(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-hot-client@0.2.4(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): dependencies: - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-inspect@0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -5012,38 +5062,38 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 3.0.0 - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color - vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-node-polyfills@0.22.0(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.27.4) node-stdlib-browser: 1.2.0 - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - rollup vite-plugin-remove-console@2.2.0: {} - vite-plugin-vue-devtools@7.6.5(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): + vite-plugin-vue-devtools@7.6.7(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)): dependencies: - '@vue/devtools-core': 7.6.5(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) - '@vue/devtools-kit': 7.6.5 - '@vue/devtools-shared': 7.6.5 - execa: 8.0.1 + '@vue/devtools-core': 7.6.7(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8))(vue@3.5.13(typescript@5.6.3)) + '@vue/devtools-kit': 7.6.7 + '@vue/devtools-shared': 7.6.7 + execa: 9.5.1 sirv: 3.0.0 - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) - vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) - vite-plugin-vue-inspector: 5.3.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) + vite-plugin-inspect: 0.8.8(rollup@4.27.4)(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) + vite-plugin-vue-inspector: 5.3.1(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.3.0(vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8)): + vite-plugin-vue-inspector@5.3.1(vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8)): dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -5054,17 +5104,17 @@ snapshots: '@vue/compiler-dom': 3.5.13 kolorist: 1.8.0 magic-string: 0.30.14 - vite: 6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8) + vite: 6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - vite@6.0.1(@types/node@22.10.0)(less@4.2.1)(sass@1.77.8): + vite@6.0.1(@types/node@22.10.1)(less@4.2.1)(sass@1.77.8): dependencies: esbuild: 0.24.0 postcss: 8.4.49 rollup: 4.27.4 optionalDependencies: - '@types/node': 22.10.0 + '@types/node': 22.10.1 fsevents: 2.3.3 less: 4.2.1 sass: 1.77.8 @@ -5164,6 +5214,8 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors@2.1.1: {} + zrender@5.6.0: dependencies: tslib: 2.3.0 From 3071492d13eafdfde6a4ffac576657a4cc206475 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 09:30:11 +0000 Subject: [PATCH 060/232] Update all devDependencies (#785) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- webui/pnpm-lock.yaml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/webui/pnpm-lock.yaml b/webui/pnpm-lock.yaml index da19ff0503..6a0c309d20 100644 --- a/webui/pnpm-lock.yaml +++ b/webui/pnpm-lock.yaml @@ -97,7 +97,7 @@ importers: version: 1.4.5 '@eslint/js': specifier: ^9.14.0 - version: 9.15.0 + version: 9.16.0 '@rushstack/eslint-patch': specifier: ^1.10.4 version: 1.10.4 @@ -136,7 +136,7 @@ importers: version: 9.1.0(eslint@9.15.0) eslint-plugin-vue: specifier: ^9.31.0 - version: 9.31.0(eslint@9.15.0) + version: 9.32.0(eslint@9.15.0) husky: specifier: ^9.1.6 version: 9.1.7 @@ -575,6 +575,10 @@ packages: resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.16.0': + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1412,8 +1416,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-vue@9.31.0: - resolution: {integrity: sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==} + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -3052,6 +3056,8 @@ snapshots: '@eslint/js@9.15.0': {} + '@eslint/js@9.16.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.3': @@ -4005,7 +4011,7 @@ snapshots: dependencies: eslint: 9.15.0 - eslint-plugin-vue@9.31.0(eslint@9.15.0): + eslint-plugin-vue@9.32.0(eslint@9.15.0): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) eslint: 9.15.0 From 7565151eed904f8316433493546300872b462eb0 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 30 Nov 2024 19:16:43 +0800 Subject: [PATCH 061/232] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 ++++ .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- .../peerbanhelper/util/PBHPortMapper.java | 115 ++++++++++++++++++ src/main/resources/lang/messages_fallback.yml | 4 +- 4 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java diff --git a/pom.xml b/pom.xml index 7ca46f82d7..a0de329f37 100644 --- a/pom.xml +++ b/pom.xml @@ -440,6 +440,17 @@ bcprov-jdk18on 1.79 + + + org.bouncycastle + bcpg-jdk18on + 1.79 + + + name.neuhalfen.projects.crypto.bouncycastle.openpgp + bouncy-gpg + 2.3.0 + com.vdurmont semver4j @@ -490,6 +501,16 @@ flatlaf-extras 3.5.2 + + com.github.Peergos + nabu + v0.8.0 + + + com.offbynull.portmapper + portmapper + 2.0.6 + diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index 6d88cc35a2..f038292ada 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -434,7 +434,7 @@ public enum Lang { BTN_RULES_SCRIPT_COMPILING, BTN_RULES_SCRIPT_COMPILED, BTN_SERVICES_NEED_RESTART, - EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS; + EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED; public String getKey() { return name(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java new file mode 100644 index 0000000000..c7dea10482 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java @@ -0,0 +1,115 @@ +package com.ghostchu.peerbanhelper.util; + +import com.ghostchu.peerbanhelper.text.Lang; +import com.offbynull.portmapper.PortMapperFactory; +import com.offbynull.portmapper.gateway.Bus; +import com.offbynull.portmapper.gateways.network.NetworkGateway; +import com.offbynull.portmapper.gateways.network.internalmessages.KillNetworkRequest; +import com.offbynull.portmapper.gateways.process.ProcessGateway; +import com.offbynull.portmapper.gateways.process.internalmessages.KillProcessRequest; +import com.offbynull.portmapper.mapper.MappedPort; +import com.offbynull.portmapper.mapper.PortMapper; +import com.offbynull.portmapper.mapper.PortType; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; + +@Component +@Slf4j +public class PBHPortMapper { + private final NetworkGateway network; + private final ProcessGateway process; + private final Bus networkBus; + private final Bus processBus; + private final Map originalToRefreshedPortMap = Collections.synchronizedMap(new HashMap<>()); + private ScheduledExecutorService sched = Executors.newScheduledThreadPool(16, Thread.ofVirtual().factory()); + + public PBHPortMapper() { + this.network = NetworkGateway.create(); + this.process = ProcessGateway.create(); + this.networkBus = network.getBus(); + this.processBus = process.getBus(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + List mappers = PortMapperFactory.discover(networkBus, processBus); + if (mappers.isEmpty()) { + return; + } + var mapper = mappers.getFirst(); + var it = originalToRefreshedPortMap.entrySet().iterator(); + List> futures = new ArrayList<>(); + while (it.hasNext()) { + var set = it.next(); + futures.add(unmapPort(mapper, set.getKey())); + it.remove(); + } + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + networkBus.send(new KillNetworkRequest()); + processBus.send(new KillProcessRequest()); + })); + } + + public CompletableFuture unmapPort(PortMapper mapper, MappedPort mappedPort) { + return CompletableFuture.supplyAsync(() -> { + try { + mapper.unmapPort(originalToRefreshedPortMap.get(mappedPort)); + mapper.unmapPort(mappedPort); + originalToRefreshedPortMap.remove(mappedPort); + } catch (InterruptedException ignored) { + } + return null; + }); + } + + @Nullable + public CompletableFuture mapPort(PortMapper mapper, PortType portType, int localPort) { + try { + return CompletableFuture.supplyAsync(() -> { + try { + MappedPort mappedPort = mapper.mapPort(portType, localPort, localPort, Integer.MAX_VALUE); + originalToRefreshedPortMap.put(mappedPort, mappedPort); + sched.scheduleWithFixedDelay(() -> { + try { + var newMapperPort = mapper.refreshPort(mappedPort, Integer.MAX_VALUE); + originalToRefreshedPortMap.put(mappedPort, newMapperPort); + } catch (Exception e) { + log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, mappedPort.getInternalPort(), mappedPort.getPortType().name()), e); + } + }, mappedPort.getLifetime() / 2, mappedPort.getLifetime() / 2, TimeUnit.SECONDS); + log.info(tlUI(Lang.PORT_MAPPER_PORT_MAPPED, mapper.getSourceAddress().getHostAddress(), mappedPort.getInternalPort(), mappedPort.getPortType().name(), mappedPort.getExternalPort(), mappedPort.getExternalAddress().getHostAddress(), mappedPort.getLifetime())); + return mappedPort; + } catch (InterruptedException e) { + log.error("Unable to mapPort", e); + return null; + } + }); + } catch (Exception e) { + log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, mapper.getSourceAddress().getHostAddress(), localPort, portType.name()), e); + return CompletableFuture.completedFuture(null); + } + } + + @Nullable + public PortMapper getPortMapper() { + try { + List mappers = PortMapperFactory.discover(networkBus, processBus); + if (mappers.isEmpty()) { + return null; + } + return mappers.getFirst(); + } catch (InterruptedException e) { + return null; + } + } +} diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 40e311874f..9c357b5bf5 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -496,4 +496,6 @@ GUI_MENU_QUICK_OPERATIONS: "快速操作" GUI_MENU_SHOW_WINDOW: "打开主窗口" GUI_MENU_STATS: "统计数据" GUI_MENU_STATS_BANNED: "已封禁 {} 个 Peer ({} 个 IP 地址)" -GUI_MENU_STATS_DOWNLOADER: "已连接 {}/{} 个下载器" \ No newline at end of file +GUI_MENU_STATS_DOWNLOADER: "已连接 {}/{} 个下载器" +PORT_MAPPER_PORT_MAPPED: "[PortMapper] 已在网卡 {} 的网关上上为本地端口 {}/{} 创建了一个端口映射,外部端口为:{} (位于 {});TTL:{} 秒" +PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败" \ No newline at end of file From c8d3ab1dea755cbdd18d273d6b1fdaa550ae0d2a Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 30 Nov 2024 20:44:59 +0800 Subject: [PATCH 062/232] checkpoint --- pom.xml | 13 +- .../peerbanhelper/PeerBanHelperServer.java | 3 + .../database/dao/impl/DHTRecordDao.java | 113 +++++++++++++++++ .../database/table/DHTRecordEntity.java | 27 ++++ .../decentralized/DecentralizedManager.java | 116 ++++++++++++++++++ .../decentralized/HybirdDHTRecordStore.java | 78 ++++++++++++ .../peerbanhelper/lab/Experiment.java | 15 +++ .../peerbanhelper/lab/Experiments.java | 18 +++ .../peerbanhelper/lab/Laboratory.java | 84 +++++++++++++ .../module/impl/webapi/PBHLabController.java | 5 + .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- .../peerbanhelper/util/PBHPortMapper.java | 82 ++++++++----- src/main/resources/lang/messages_fallback.yml | 10 +- src/main/resources/logback.xml | 2 + 14 files changed, 528 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java diff --git a/pom.xml b/pom.xml index a0de329f37..4b1dd892be 100644 --- a/pom.xml +++ b/pom.xml @@ -506,10 +506,15 @@ nabu v0.8.0 - - com.offbynull.portmapper - portmapper - 2.0.6 + + + + + + + org.bitlet + weupnp + 0.1.2 diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 98e0df040b..e40f347c1d 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -23,6 +23,7 @@ import com.ghostchu.peerbanhelper.invoker.impl.IPFilterInvoker; import com.ghostchu.peerbanhelper.ipdb.IPDB; import com.ghostchu.peerbanhelper.ipdb.IPGeoData; +import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.metric.BasicMetrics; import com.ghostchu.peerbanhelper.module.*; import com.ghostchu.peerbanhelper.module.impl.rule.*; @@ -141,6 +142,8 @@ public class PeerBanHelperServer implements Reloadable { private AlertManager alertManager; @Autowired private BanListDao banListDao; + @Autowired + private Laboratory laboratory; public PeerBanHelperServer() { reloadConfig(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java b/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java new file mode 100644 index 0000000000..4fc1515756 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java @@ -0,0 +1,113 @@ +package com.ghostchu.peerbanhelper.database.dao.impl; + +import com.ghostchu.peerbanhelper.database.Database; +import com.ghostchu.peerbanhelper.database.dao.AbstractPBHDao; +import com.ghostchu.peerbanhelper.database.table.DHTRecordEntity; +import io.ipfs.multibase.binary.Base32; +import io.ipfs.multihash.Multihash; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.peergos.protocol.dht.RecordStore; +import org.peergos.protocol.ipns.IpnsRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Deque; +import java.util.Optional; + +@Component +@Slf4j +public class DHTRecordDao extends AbstractPBHDao implements RecordStore { + private final int SIZE_OF_VAL = 10240; + private final int SIZE_OF_PEERID = 100; + + public DHTRecordDao(@Autowired Database database) throws SQLException { + super(database.getDataSource(), DHTRecordEntity.class); + } + + @Override + public void close() throws Exception { + + } + + @SneakyThrows + public void batchSave(Deque tasks) { + callBatchTasks(() -> { + while (!tasks.isEmpty()) { + var task = tasks.pop(); + try { + if (task.delete()) { + remove(task.key); + } else { + put(task.key, task.value); + } + } catch (Exception e) { + log.warn("Unable save {} to DHT records database", task); + } + } + return null; + }); + } + + private String hashToKey(Multihash hash) { + String padded = new Base32().encodeAsString(hash.toBytes()); + int padStart = padded.indexOf("="); + return padStart > 0 ? padded.substring(0, padStart) : padded; + } + + @Override + public Optional get(Multihash peerId) { + try { + var entity = queryForId(hashToKey(peerId)); + if (entity == null) return Optional.empty(); + return Optional.of( + new IpnsRecord( + entity.getRaw(), + entity.getSequence(), + entity.getTtlNanos(), + LocalDateTime.ofEpochSecond(entity.getExpiryUTC(), 0, ZoneOffset.UTC), + entity.getVal().getBytes() + ) + ); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } + + @Override + public void put(Multihash peerId, IpnsRecord record) { + try { + createOrUpdate(new DHTRecordEntity( + hashToKey(peerId), + record.raw, + record.sequence, + record.ttlNanos, + record.expiry.toEpochSecond(ZoneOffset.UTC), + new String(record.value.length > SIZE_OF_VAL ? + Arrays.copyOfRange(record.value, 0, SIZE_OF_VAL) : record.value) + )); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } + + @Override + public void remove(Multihash peerId) { + try { + delete(queryForEq("peerId", hashToKey(peerId))); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } + + public record PersistTask( + boolean delete, + Multihash key, + IpnsRecord value + ) { + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java b/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java new file mode 100644 index 0000000000..e3a7bdab2c --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java @@ -0,0 +1,27 @@ +package com.ghostchu.peerbanhelper.database.table; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@DatabaseTable(tableName = "dht_records") +public final class DHTRecordEntity { + @DatabaseField(id = true, index = true, canBeNull = false, columnDefinition = "VARCHAR(100)") + private String peerId; + @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY) + private byte[] raw; + @DatabaseField(canBeNull = false) + private long sequence; + @DatabaseField(canBeNull = false) + private long ttlNanos; + @DatabaseField(canBeNull = false) + private long expiryUTC; + @DatabaseField(canBeNull = false, columnDefinition = "VARCHAR(10240)") + private String val; +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java new file mode 100644 index 0000000000..9b98b55abf --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -0,0 +1,116 @@ +package com.ghostchu.peerbanhelper.decentralized; + +import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.database.dao.impl.DHTRecordDao; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.util.PBHPortMapper; +import com.offbynull.portmapper.mapper.PortType; +import io.ipfs.cid.Cid; +import io.ipfs.multiaddr.MultiAddress; +import io.libp2p.core.PeerId; +import io.libp2p.core.crypto.PrivKey; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.peergos.*; +import org.peergos.blockstore.FileBlockstore; +import org.peergos.config.IdentitySection; +import org.peergos.protocol.http.HttpProtocol; +import org.peergos.util.Logging; +import org.slf4j.LoggerFactory; +import org.slf4j.event.Level; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; + +@Component +@Slf4j +public class DecentralizedManager { + private final File directory; + private final int listeningPort; + private final boolean runNoBootstrap; + private final @NotNull List bootstrapNodes; + private final File ipfsDirectory; + private final PBHPortMapper pbhPortMapper; + private final DHTRecordDao dhtRecordDao; + private EmbeddedIpfs ipfs; + + public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordDao) { + this.pbhPortMapper = pbhPortMapper; + this.dhtRecordDao = dhtRecordDao; + this.directory = new File(Main.getDataDirectory(), "decentralized"); + if (!this.directory.exists()) { + this.directory.mkdirs(); + } + this.ipfsDirectory = new File(directory, "ipfs-blockstore"); + if (!this.ipfsDirectory.exists()) { + this.ipfsDirectory.mkdirs(); + } + this.listeningPort = Main.getMainConfig().getInt("decentralized.port", 9897); + this.runNoBootstrap = Main.getMainConfig().getBoolean("decentralized.no-bootstrap", false); + this.bootstrapNodes = Main.getMainConfig().getStringList("decentralized.bootstrap-nodes"); + Thread.startVirtualThread(this::startupNabu); + } + + private void startupNabu() { + List swarmAddresses = List.of(new MultiAddress("/ip6/::/tcp/" + listeningPort)); + List bootstrapAddresses = List.of(new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa")); + BlockRequestAuthoriser authoriser = (cid, peerid, auth) -> CompletableFuture.completedFuture(true); + HostBuilder builder = new HostBuilder().generateIdentity(); + PrivKey privKey = builder.getPrivateKey(); + PeerId peerId = builder.getPeerId(); + IdentitySection identity = new IdentitySection(privKey.bytes(), peerId); + boolean provideBlocks = true; + + SocketAddress httpTarget = new InetSocketAddress("localhost", 10000); + Optional httpProxyTarget = + Optional.of((s, req, h) -> HttpProtocol.proxyRequest(req, httpTarget, h)); + Logging.LOG().setFilter(record -> { + Level slf4jLevel = switch (record.getLevel().intValue()) { + case 1000 -> Level.TRACE; + case 900 -> Level.DEBUG; + case 800 -> Level.INFO; + case 700 -> Level.WARN; + case 500 -> Level.ERROR; + default -> Level.INFO; + }; + LoggerFactory.getLogger(record.getLoggerName()) + .makeLoggingEventBuilder(slf4jLevel) + .addArgument(record.getParameters()) + .log(record.getMessage(), record.getThrown()); + return false; + }); + this.ipfs = EmbeddedIpfs.build(new HybirdDHTRecordStore(dhtRecordDao), + new FileBlockstore(ipfsDirectory.toPath()), + provideBlocks, + swarmAddresses, + bootstrapAddresses, + identity, + authoriser, + httpProxyTarget + ); + ipfs.start(); + + var mapper = pbhPortMapper.getPortMapper(); + if (mapper != null) { + pbhPortMapper.mapPort(mapper, PortType.TCP, listeningPort).thenAccept(mappedPort -> { + if (mappedPort != null) { + log.info(tlUI(Lang.DECENTRALIZED_PORT_FORWARDED, mappedPort.getInternalPort(), mappedPort.getExternalPort(), mappedPort.getExternalAddress().getHostAddress())); + } + }); + } + + List wants = List.of(new Want(Cid.decode("zdpuAwfJrGYtiGFDcSV3rDpaUrqCtQZRxMjdC6Eq9PNqLqTGg"))); + Set retrieveFrom = Set.of(PeerId.fromBase58("QmVdFZgHnEgcedCS2G2ZNiEN59LuVrnRm7z3yXtEBv2XiF")); + boolean addToLocal = true; + List blocks = ipfs.getBlocks(wants, retrieveFrom, addToLocal); + byte[] data = blocks.get(0).block; + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java new file mode 100644 index 0000000000..b0af2651b4 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java @@ -0,0 +1,78 @@ +package com.ghostchu.peerbanhelper.decentralized; + +import com.ghostchu.peerbanhelper.database.dao.impl.DHTRecordDao; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalCause; +import io.ipfs.multihash.Multihash; +import org.peergos.protocol.dht.RecordStore; +import org.peergos.protocol.ipns.IpnsRecord; +import org.springframework.stereotype.Component; + +import java.util.Deque; +import java.util.Optional; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +public class HybirdDHTRecordStore implements RecordStore { + private final Deque persistTasks = new ConcurrentLinkedDeque<>(); + private final Cache records = CacheBuilder + .newBuilder() + .expireAfterAccess(30, TimeUnit.MINUTES) + .maximumSize(200) + .removalListener(notification -> { + if (notification.getCause() != RemovalCause.EXPLICIT) { + Multihash key = (Multihash) notification.getKey(); + IpnsRecord value = (IpnsRecord) notification.getValue(); + persistTasks.offer(new DHTRecordDao.PersistTask(false, key, value)); + } + }) + .build(); + private final DHTRecordDao dhtRecordDao; + private final ScheduledExecutorService scheduled; + + public HybirdDHTRecordStore(DHTRecordDao dhtRecordDao) { + this.dhtRecordDao = dhtRecordDao; + this.scheduled = Executors.newScheduledThreadPool(1, Thread.ofVirtual().factory()); + this.scheduled.scheduleWithFixedDelay(this::flush, 5, 5, TimeUnit.MINUTES); + } + + @Override + public void put(Multihash multihash, IpnsRecord ipnsRecord) { + records.put(multihash, ipnsRecord); + } + + @Override + public Optional get(Multihash multihash) { + var record = records.getIfPresent(multihash); + if (record == null) { + record = dhtRecordDao.get(multihash).orElse(null); + } + if (record != null) { + records.put(multihash, record); + } + return Optional.ofNullable(record); + } + + @Override + public void remove(Multihash multihash) { + //dhtRecordDao.remove(multihash); + persistTasks.offer(new DHTRecordDao.PersistTask(true, multihash, null)); + records.invalidate(multihash); + } + + private void flush() { + dhtRecordDao.batchSave(persistTasks); + } + + @Override + public void close() throws Exception { + scheduled.shutdownNow(); + records.asMap().forEach((hash, record) -> persistTasks.offer(new DHTRecordDao.PersistTask(false, hash, record))); + records.invalidateAll(); + flush(); + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java new file mode 100644 index 0000000000..2bbfc3c28f --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java @@ -0,0 +1,15 @@ +package com.ghostchu.peerbanhelper.lab; + +import com.ghostchu.peerbanhelper.text.TranslationComponent; +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Experiment { + + private final String id; + private final int group; + private TranslationComponent title; + private TranslationComponent description; +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java new file mode 100644 index 0000000000..ba947c1eb1 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java @@ -0,0 +1,18 @@ +package com.ghostchu.peerbanhelper.lab; + +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.text.TranslationComponent; + +public enum Experiments { + IPFS(new Experiment("ipfs", 0, new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))); + + private final Experiment experiment; + + Experiments(Experiment experiment) { + this.experiment = experiment; + } + + public Experiment getExperiment() { + return experiment; + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java new file mode 100644 index 0000000000..dc107a6ec8 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java @@ -0,0 +1,84 @@ +package com.ghostchu.peerbanhelper.lab; + +import com.ghostchu.peerbanhelper.Main; +import lombok.extern.slf4j.Slf4j; +import org.bspfsystems.yamlconfiguration.file.YamlConfiguration; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; + +@Component +@Slf4j +public class Laboratory { + // can be 0,1,2,3,4 + private final int experimentalGroup; + private final YamlConfiguration labConfig; + private final File labConfigFile; + + public Laboratory() throws IOException { + String installationId = Main.getMainConfig().getString("installation-id", "???"); + int hashCode = installationId.hashCode(); + // Generate a number from hashCode in range 0-4 + this.experimentalGroup = Math.abs(hashCode % 5); + this.labConfigFile = new File(Main.getConfigDirectory(), "laboratory.yml"); + if (!labConfigFile.exists()) { + labConfigFile.createNewFile(); + } + this.labConfig = new YamlConfiguration(); + for (Experiments value : Experiments.values()) { + isExperimentActivated(value.getExperiment()); // 生成配置文件 + } + } + + public boolean isExperimentActivated(Experiment experiment) { + var value = labConfig.getString(experiment.getId()); + if (value == null) { + labConfig.set(experiment.getId(), "default"); + value = "default"; + List comments = new ArrayList<>(); + comments.addAll(Arrays.stream(tlUI(experiment.getTitle()).split("\n")).toList()); + comments.addAll(Arrays.stream(tlUI(experiment.getDescription()).split("\n")).toList()); + labConfig.setComments(experiment.getId(), comments); + saveLabConfig(); + } + if ("default".equals(value)) { + return isExperimentalGroup(experiment.getGroup()); + } else { + return Boolean.parseBoolean(value); + } + } + + public void setExperimentActivated(String id, boolean activated) throws IllegalArgumentException{ + for (Experiments value : Experiments.values()) { + if(!value.getExperiment().getId().equals(id)){ + continue; + } + labConfig.set(value.getExperiment().getId(), activated); + saveLabConfig(); + return; + } + throw new IllegalArgumentException("Invalid experiment id: "+id+", it's not exists in Experiments registry"); + } + + private void saveLabConfig() { + try { + labConfig.save(this.labConfigFile); + } catch (IOException e) { + log.info("Unable to save laboratory configuration", e); + } + } + + public int getExperimentalGroup() { + return experimentalGroup; + } + + public boolean isExperimentalGroup(int group) { + return experimentalGroup == group; + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java new file mode 100644 index 0000000000..25f547f3b7 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java @@ -0,0 +1,5 @@ +package com.ghostchu.peerbanhelper.module.impl.webapi; + +public class PBHLabController { + +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index f038292ada..5a4f1a4148 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -434,7 +434,7 @@ public enum Lang { BTN_RULES_SCRIPT_COMPILING, BTN_RULES_SCRIPT_COMPILED, BTN_SERVICES_NEED_RESTART, - EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED; + EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED, DECENTRALIZED_PORT_FORWARDED, LAB_EXPERIMENT_IPFS_TITLE, LAB_EXPERIMENT_IPFS_DESCRIPTION, PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS, PORT_MAPPER_PORT_MAPPING; public String getKey() { return name(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java index c7dea10482..d4129d0ef3 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java @@ -43,12 +43,11 @@ public PBHPortMapper() { if (mappers.isEmpty()) { return; } - var mapper = mappers.getFirst(); var it = originalToRefreshedPortMap.entrySet().iterator(); List> futures = new ArrayList<>(); while (it.hasNext()) { var set = it.next(); - futures.add(unmapPort(mapper, set.getKey())); + futures.add(unmapPort(mappers, set.getKey())); it.remove(); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); @@ -57,57 +56,74 @@ public PBHPortMapper() { } networkBus.send(new KillNetworkRequest()); processBus.send(new KillProcessRequest()); + sched.shutdown(); })); } - public CompletableFuture unmapPort(PortMapper mapper, MappedPort mappedPort) { + public CompletableFuture unmapPort(List mappers, MappedPort mappedPort) { return CompletableFuture.supplyAsync(() -> { - try { - mapper.unmapPort(originalToRefreshedPortMap.get(mappedPort)); - mapper.unmapPort(mappedPort); - originalToRefreshedPortMap.remove(mappedPort); - } catch (InterruptedException ignored) { + for (PortMapper mapper : mappers) { + try { + mapper.unmapPort(originalToRefreshedPortMap.get(mappedPort)); + mapper.unmapPort(mappedPort); + originalToRefreshedPortMap.remove(mappedPort); + } catch (InterruptedException ignored) { + } } return null; }); } - @Nullable - public CompletableFuture mapPort(PortMapper mapper, PortType portType, int localPort) { + public CompletableFuture<@Nullable MappedPort> mapPort(List mappers, PortType portType, int localPort) { try { return CompletableFuture.supplyAsync(() -> { - try { - MappedPort mappedPort = mapper.mapPort(portType, localPort, localPort, Integer.MAX_VALUE); - originalToRefreshedPortMap.put(mappedPort, mappedPort); - sched.scheduleWithFixedDelay(() -> { - try { - var newMapperPort = mapper.refreshPort(mappedPort, Integer.MAX_VALUE); - originalToRefreshedPortMap.put(mappedPort, newMapperPort); - } catch (Exception e) { - log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, mappedPort.getInternalPort(), mappedPort.getPortType().name()), e); - } - }, mappedPort.getLifetime() / 2, mappedPort.getLifetime() / 2, TimeUnit.SECONDS); - log.info(tlUI(Lang.PORT_MAPPER_PORT_MAPPED, mapper.getSourceAddress().getHostAddress(), mappedPort.getInternalPort(), mappedPort.getPortType().name(), mappedPort.getExternalPort(), mappedPort.getExternalAddress().getHostAddress(), mappedPort.getLifetime())); - return mappedPort; - } catch (InterruptedException e) { - log.error("Unable to mapPort", e); - return null; + log.info(tlUI(Lang.PORT_MAPPER_PORT_MAPPING, localPort, portType.name())); + Map mappedPorts = new LinkedHashMap<>(); + for (PortMapper mapper : mappers) { + try { + MappedPort mappedPort = mapper.mapPort(portType, localPort, localPort, 600); + originalToRefreshedPortMap.put(mappedPort, mappedPort); + sched.scheduleWithFixedDelay(() -> { + try { + var newMapperPort = mapper.refreshPort(mappedPort, 600); + originalToRefreshedPortMap.put(mappedPort, newMapperPort); + } catch (Exception e) { + if(System.getProperty("pbh.portMapper.disableRefreshFailRetry", "false").equals("true")) { + return; + } + log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, mapper.getSourceAddress().getHostAddress(), mappedPort.getPortType().name(), mappedPort.getInternalPort()), e); + mapPort(mappers, portType, localPort); + } + }, mappedPort.getLifetime() / 2, mappedPort.getLifetime() / 2, TimeUnit.SECONDS); + mappedPorts.put(mapper, mappedPort); + } catch (Exception ignored) { + + } + } + boolean anyExternal = false; + for (var entry : mappedPorts.entrySet()) { + var inetAddress = entry.getValue().getExternalAddress(); + if (!(inetAddress.isLoopbackAddress() || inetAddress.isLinkLocalAddress() || inetAddress.isSiteLocalAddress())) { + anyExternal = true; + } + var mappedPort = entry.getValue(); + log.info(tlUI(Lang.PORT_MAPPER_PORT_MAPPED, entry.getKey().getSourceAddress().getHostAddress(), mappedPort.getInternalPort(), mappedPort.getPortType().name(), mappedPort.getExternalPort(), mappedPort.getExternalAddress().getHostAddress(), mappedPort.getLifetime())); } + if (!anyExternal) { + log.warn(tlUI(Lang.PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS)); + } + return mappedPorts.values().stream().findFirst().orElse(null); }); } catch (Exception e) { - log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, mapper.getSourceAddress().getHostAddress(), localPort, portType.name()), e); + log.error(tlUI(Lang.PORT_MAPPER_PORT_MAPPING_FAILED, "N/A", localPort, portType.name()), e); return CompletableFuture.completedFuture(null); } } @Nullable - public PortMapper getPortMapper() { + public List getPortMapper() { try { - List mappers = PortMapperFactory.discover(networkBus, processBus); - if (mappers.isEmpty()) { - return null; - } - return mappers.getFirst(); + return PortMapperFactory.discover(networkBus, processBus); } catch (InterruptedException e) { return null; } diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 9c357b5bf5..5cdaf07f51 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -497,5 +497,11 @@ GUI_MENU_SHOW_WINDOW: "打开主窗口" GUI_MENU_STATS: "统计数据" GUI_MENU_STATS_BANNED: "已封禁 {} 个 Peer ({} 个 IP 地址)" GUI_MENU_STATS_DOWNLOADER: "已连接 {}/{} 个下载器" -PORT_MAPPER_PORT_MAPPED: "[PortMapper] 已在网卡 {} 的网关上上为本地端口 {}/{} 创建了一个端口映射,外部端口为:{} (位于 {});TTL:{} 秒" -PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败" \ No newline at end of file +PORT_MAPPER_PORT_MAPPING: "[PortMapper] 正在尝试为端口 {}/{} 创建自动端口映射……" +PORT_MAPPER_PORT_MAPPED: "[PortMapper] 已在网卡 {} 的网关上上为本地端口 {}/{} 创建了一个端口映射,外部端口为:{} (外部 IP: {});TTL:{} 秒" +PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS: "[PortMapper] 需要注意!尽管 PortMapper 已成功创建了一个或者多个端口映射,但它们的外部地址似乎都是专用 IP 地址,这通常意味着您处于双层 NAT 之后(例如:您的设备连接者一台路由器,但这台路由器处于同为路由模式的光猫之下),端口映射可能不起作用。" +PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败,正在重试;如果频繁出现此提示,请检查是否设备接入了多个网络(如:Tailscale)" +DECENTRALIZED_PORT_FORWARDED: "[Decentralized] 自动端口映射成功:{} -> {} (外部 IP: {})" + +LAB_EXPERIMENT_IPFS_TITLE: "IPFS (*星际文件系统*) 去中心化网络" +LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 IPFS (星际文件系统)去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 1731eafe80..90c171fd78 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -20,6 +20,8 @@ + + From 5049e80f3d3ef9e634810617b418e036f6e3a308 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 30 Nov 2024 22:26:06 +0800 Subject: [PATCH 063/232] checkpoint --- .../decentralized/DecentralizedManager.java | 67 ++++-- .../module/impl/rule/IPBlackRuleList.java | 212 +++++++++++------- 2 files changed, 183 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index 9b98b55abf..67e82d59be 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -7,11 +7,15 @@ import com.offbynull.portmapper.mapper.PortType; import io.ipfs.cid.Cid; import io.ipfs.multiaddr.MultiAddress; +import io.ipfs.multihash.Multihash; import io.libp2p.core.PeerId; import io.libp2p.core.crypto.PrivKey; +import io.libp2p.crypto.keys.Ed25519Kt; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.peergos.*; +import org.peergos.BlockRequestAuthoriser; +import org.peergos.EmbeddedIpfs; +import org.peergos.HostBuilder; +import org.peergos.Want; import org.peergos.blockstore.FileBlockstore; import org.peergos.config.IdentitySection; import org.peergos.protocol.http.HttpProtocol; @@ -21,11 +25,12 @@ import org.springframework.stereotype.Component; import java.io.File; +import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.nio.file.Files; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.concurrent.CompletableFuture; import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; @@ -35,14 +40,15 @@ public class DecentralizedManager { private final File directory; private final int listeningPort; - private final boolean runNoBootstrap; - private final @NotNull List bootstrapNodes; private final File ipfsDirectory; private final PBHPortMapper pbhPortMapper; private final DHTRecordDao dhtRecordDao; private EmbeddedIpfs ipfs; + private PrivKey privKey; + private PeerId peerId; + private IdentitySection identity; - public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordDao) { + public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordDao) throws IOException { this.pbhPortMapper = pbhPortMapper; this.dhtRecordDao = dhtRecordDao; this.directory = new File(Main.getDataDirectory(), "decentralized"); @@ -54,21 +60,17 @@ public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordD this.ipfsDirectory.mkdirs(); } this.listeningPort = Main.getMainConfig().getInt("decentralized.port", 9897); - this.runNoBootstrap = Main.getMainConfig().getBoolean("decentralized.no-bootstrap", false); - this.bootstrapNodes = Main.getMainConfig().getStringList("decentralized.bootstrap-nodes"); - Thread.startVirtualThread(this::startupNabu); + this.privKey = getPrivKey(); + this.peerId = PeerId.fromPubKey(privKey.publicKey()); + this.identity = new IdentitySection(privKey.bytes(), peerId); + this.startupNabu(); } private void startupNabu() { List swarmAddresses = List.of(new MultiAddress("/ip6/::/tcp/" + listeningPort)); List bootstrapAddresses = List.of(new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa")); BlockRequestAuthoriser authoriser = (cid, peerid, auth) -> CompletableFuture.completedFuture(true); - HostBuilder builder = new HostBuilder().generateIdentity(); - PrivKey privKey = builder.getPrivateKey(); - PeerId peerId = builder.getPeerId(); - IdentitySection identity = new IdentitySection(privKey.bytes(), peerId); boolean provideBlocks = true; - SocketAddress httpTarget = new InetSocketAddress("localhost", 10000); Optional httpProxyTarget = Optional.of((s, req, h) -> HttpProtocol.proxyRequest(req, httpTarget, h)); @@ -106,11 +108,38 @@ private void startupNabu() { } }); } + } + + public void publishValue(byte[] data, long seq, int hoursTTL){; + ipfs.publishValue(privKey,data,seq,hoursTTL); + } - List wants = List.of(new Want(Cid.decode("zdpuAwfJrGYtiGFDcSV3rDpaUrqCtQZRxMjdC6Eq9PNqLqTGg"))); - Set retrieveFrom = Set.of(PeerId.fromBase58("QmVdFZgHnEgcedCS2G2ZNiEN59LuVrnRm7z3yXtEBv2XiF")); - boolean addToLocal = true; - List blocks = ipfs.getBlocks(wants, retrieveFrom, addToLocal); - byte[] data = blocks.get(0).block; + public void publishValueToIpns(Multihash ipns, byte[] data, long seq, int hoursTTL){ + // WTF? + } + + public PrivKey getPrivKey() throws IOException { + File privKey = new File(directory, "ipfs.key"); + if (!privKey.exists()) { + HostBuilder builder = new HostBuilder().generateIdentity(); + Files.write(privKey.toPath(), builder.getPrivateKey().bytes()); + } + return Ed25519Kt.unmarshalEd25519PrivateKey(Files.readAllBytes(privKey.toPath())); + } + + public CompletableFuture getBlockFromIPNS(Cid ipnsPointerCid) { + return CompletableFuture.supplyAsync(() -> { + var future = ipfs.dht.resolveIpnsValue(ipnsPointerCid, ipfs.node, 1); + String contentCid = future.join(); + return getBlockFromCid(Cid.decode(contentCid)).join(); + }); + } + + public CompletableFuture getBlockFromCid(Cid cid) { + return CompletableFuture.supplyAsync(() -> { + var blocks = ipfs.getBlocks(List.of(new Want(cid)), null, true); + // there have multiple blocks, we need connect all byte[] + return blocks.getFirst().block; + }); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 24a0b13096..4b4ba25522 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -4,6 +4,7 @@ import com.ghostchu.peerbanhelper.database.dao.impl.RuleSubLogsDao; import com.ghostchu.peerbanhelper.database.table.RuleSubInfoEntity; import com.ghostchu.peerbanhelper.database.table.RuleSubLogEntity; +import com.ghostchu.peerbanhelper.decentralized.DecentralizedManager; import com.ghostchu.peerbanhelper.downloader.Downloader; import com.ghostchu.peerbanhelper.module.AbstractRuleFeatureModule; import com.ghostchu.peerbanhelper.module.CheckResult; @@ -31,8 +32,10 @@ import com.google.common.io.Files; import com.j256.ormlite.stmt.SelectArg; import inet.ipaddr.IPAddress; +import io.ipfs.cid.Cid; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; @@ -41,11 +44,12 @@ import java.io.IOException; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -65,14 +69,16 @@ public class IPBlackRuleList extends AbstractRuleFeatureModule implements Reloadable { private final RuleSubLogsDao ruleSubLogsDao; private final ModuleMatchCache moduleMatchCache; + private final DecentralizedManager decentralizedManager; private List ipBanMatchers; private long checkInterval = 86400000; // 默认24小时检查一次 private long banDuration; - public IPBlackRuleList(RuleSubLogsDao ruleSubLogsDao, ModuleMatchCache moduleMatchCache) { + public IPBlackRuleList(RuleSubLogsDao ruleSubLogsDao, ModuleMatchCache moduleMatchCache, DecentralizedManager decentralizedManager) { super(); this.ruleSubLogsDao = ruleSubLogsDao; this.moduleMatchCache = moduleMatchCache; + this.decentralizedManager = decentralizedManager; } @Override @@ -116,7 +122,7 @@ public ReloadResult reloadModule() throws Exception { long t1 = System.currentTimeMillis(); String ip = peer.getPeerAddress().getIp(); List results = new ArrayList<>(); - ipBanMatchers.forEach(rule-> results.add(new IPBanResult(rule.getRuleName(), rule.match(ip)))); + ipBanMatchers.forEach(rule -> results.add(new IPBanResult(rule.getRuleName(), rule.match(ip)))); AtomicReference matchRule = new AtomicReference<>(); boolean mr = results.stream().anyMatch(ipBanResult -> { try { @@ -193,92 +199,115 @@ public StdResp updateRule(String locale, @NotNull ConfigurationSection rule, IPB String ruleFileName = ruleId + ".txt"; File dir = new File(Main.getDataDirectory(), "/sub"); dir.mkdirs(); - File tempFile = new File(dir, "temp_" + ruleFileName); File ruleFile = new File(dir, ruleFileName); List ipAddresses = new ArrayList<>(); - HTTPUtil.retryableSend(HTTPUtil.getHttpClient(false, null), MutableRequest.GET(url), HttpResponse.BodyHandlers.ofFile(Path.of(tempFile.getPath()))).whenComplete((pathHttpResponse, throwable) -> { - if (throwable != null) { - tempFile.delete(); - // 加载远程订阅文件出错,尝试从本地缓存中加载 - if (ruleFile.exists()) { - // 如果一致,但ipBanMatchers没有对应的规则内容,则加载内容 - if (ipBanMatchers.stream().noneMatch(ele -> ele.getRuleId().equals(ruleId))) { - try { - fileToIPList(ruleFile, ipAddresses); - ipBanMatchers.add(new IPMatcher(ruleId, name, ipAddresses)); - log.warn(tlUI(Lang.IP_BAN_RULE_USE_CACHE, name)); - result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_USE_CACHE, name), null)); - } catch (IOException ex) { - log.error(tlUI(Lang.IP_BAN_RULE_LOAD_FAILED, name), ex); + getResource(url) + .whenComplete((dataUpdateResult, throwable) -> { + if (throwable != null) { + // 加载远程订阅文件出错,尝试从本地缓存中加载 + if (ruleFile.exists()) { + // 如果一致,但ipBanMatchers没有对应的规则内容,则加载内容 + if (ipBanMatchers.stream().noneMatch(ele -> ele.getRuleId().equals(ruleId))) { + try { + fileToIPList(ruleFile, ipAddresses); + ipBanMatchers.add(new IPMatcher(ruleId, name, ipAddresses)); + log.warn(tlUI(Lang.IP_BAN_RULE_USE_CACHE, name)); + result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_USE_CACHE, name), null)); + } catch (IOException ex) { + log.error(tlUI(Lang.IP_BAN_RULE_LOAD_FAILED, name), ex); + result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_LOAD_FAILED, name), null)); + } + } else { + result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_UPDATE_FAILED, name), null)); + } + } else { + // log.error(Lang.IP_BAN_RULE_LOAD_FAILED, name, throwable); result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_LOAD_FAILED, name), null)); } - } else { - result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_UPDATE_FAILED, name), null)); + throw new RuntimeException(throwable); } - } else { - // log.error(Lang.IP_BAN_RULE_LOAD_FAILED, name, throwable); - result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_LOAD_FAILED, name), null)); - } - throw new RuntimeException(throwable); - } - try { - HashCode ruleHash = null; - HashCode tempHash = Files.asByteSource(tempFile).hash(Hashing.sha256()); - if (ruleFile.exists()) { - ruleHash = Files.asByteSource(ruleFile).hash(Hashing.sha256()); - } - int ent_count = 0; - if (!tempHash.equals(ruleHash)) { - // 规则文件不存在或者规则文件与临时文件sha256不一致则需要更新 - ent_count = fileToIPList(tempFile, ipAddresses); - // 更新后重命名临时文件 - ruleFile.delete(); - tempFile.renameTo(ruleFile); - } else { - // 如果一致,但ipBanMatchers没有对应的规则内容,则加载内容 - if (ipBanMatchers.stream().noneMatch(ele -> ele.getRuleId().equals(ruleId))) { - ent_count = fileToIPList(tempFile, ipAddresses); - } else { - log.info(tlUI(Lang.IP_BAN_RULE_NO_UPDATE, name)); - result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_NO_UPDATE, name), null)); - } - tempFile.delete(); - } - if (ent_count > 0) { - // 如果已经存在则更新,否则添加 - ipBanMatchers.stream().filter(ele -> ele.getRuleId().equals(ruleId)).findFirst().ifPresentOrElse(ele -> { - ele.setData(name, ipAddresses); - moduleMatchCache.invalidateAll(); - log.info(tlUI(Lang.IP_BAN_RULE_UPDATE_SUCCESS, name)); - result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_UPDATE_SUCCESS, name), null)); - }, () -> { - ipBanMatchers.add(new IPMatcher(ruleId, name, ipAddresses)); - log.info(tlUI(Lang.IP_BAN_RULE_LOAD_SUCCESS, name)); - result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_LOAD_SUCCESS, name), null)); - }); - // 更新日志 try { - ruleSubLogsDao.create(new RuleSubLogEntity(null, ruleId, System.currentTimeMillis(), ent_count, updateType)); - result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_UPDATED, name), null)); - } catch (SQLException e) { - log.error(tlUI(Lang.IP_BAN_RULE_UPDATE_LOG_ERROR, ruleId), e); - result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_UPDATE_LOG_ERROR, name), null)); + HashCode ruleHash = null; + HashCode tempHash = Hashing.sha256().hashBytes(dataUpdateResult.data()); + if (ruleFile.exists()) { + ruleHash = Files.asByteSource(ruleFile).hash(Hashing.sha256()); + } + int ent_count = 0; + if (!tempHash.equals(ruleHash)) { + // 规则文件不存在或者规则文件与临时文件sha256不一致则需要更新 + ent_count = stringToIPList(new String(dataUpdateResult.data(), StandardCharsets.UTF_8), ipAddresses); + // 更新后重命名临时文件 + Files.write(dataUpdateResult.data(), ruleFile); + } else { + // 如果一致,但ipBanMatchers没有对应的规则内容,则加载内容 + if (ipBanMatchers.stream().noneMatch(ele -> ele.getRuleId().equals(ruleId))) { + ent_count = stringToIPList(new String(dataUpdateResult.data(), StandardCharsets.UTF_8), ipAddresses); + } else { + log.info(tlUI(Lang.IP_BAN_RULE_NO_UPDATE, name)); + result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_NO_UPDATE, name), null)); + } + } + if (ent_count > 0) { + // 如果已经存在则更新,否则添加 + ipBanMatchers.stream().filter(ele -> ele.getRuleId().equals(ruleId)).findFirst().ifPresentOrElse(ele -> { + ele.setData(name, ipAddresses); + moduleMatchCache.invalidateAll(); + log.info(tlUI(Lang.IP_BAN_RULE_UPDATE_SUCCESS, name)); + result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_UPDATE_SUCCESS, name), null)); + }, () -> { + ipBanMatchers.add(new IPMatcher(ruleId, name, ipAddresses)); + log.info(tlUI(Lang.IP_BAN_RULE_LOAD_SUCCESS, name)); + result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_LOAD_SUCCESS, name), null)); + }); + // 更新日志 + try { + ruleSubLogsDao.create(new RuleSubLogEntity(null, ruleId, System.currentTimeMillis(), ent_count, updateType)); + result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_UPDATED, name), null)); + } catch (SQLException e) { + log.error(tlUI(Lang.IP_BAN_RULE_UPDATE_LOG_ERROR, ruleId), e); + result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_UPDATE_LOG_ERROR, name), null)); + } + } else { + result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_NO_UPDATE, name), null)); + } + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + moduleMatchCache.invalidateAll(); } - } else { - result.set(new StdResp(true, tl(locale, Lang.IP_BAN_RULE_NO_UPDATE, name), null)); - } - } catch (IOException e) { - throw new RuntimeException(e); - }finally { - moduleMatchCache.invalidateAll(); - } - }).join(); + }).join(); } else { result.set(new StdResp(false, tl(locale, Lang.IP_BAN_RULE_URL_WRONG, name), null)); } return result.get(); } + private CompletableFuture getResource(String url) { + return CompletableFuture.supplyAsync(() -> { + if (url.startsWith("http")) { + var response = HTTPUtil.retryableSend(HTTPUtil.getHttpClient(false, null), + MutableRequest.GET(url), HttpResponse.BodyHandlers.ofString()).join(); + return new DataUpdateResult(response.statusCode(), null, response.body().getBytes()); + } + // IPNS + if (url.startsWith("/ipfs/")) { + var ipnsCid = StringUtils.substringAfter(url, "/ipfs/"); + Cid cid = Cid.decode(ipnsCid); + var bytes = decentralizedManager.getBlockFromIPNS(cid).join(); + return new DataUpdateResult(200, "Data get from IPFS via IPNS", bytes); + } + // 用户直接塞了个 CID + try { + Cid cid = Cid.decode(url); + var bytes = decentralizedManager.getBlockFromCid(cid).join(); + return new DataUpdateResult(200, "Data get from IPFS", bytes); + } catch (Exception ignored) { + } + throw new IllegalArgumentException("Invalid URL"); + }); + } + + /** * 读取规则文件并转为IpList * @@ -305,6 +334,32 @@ private int fileToIPList(File ruleFile, List ips) throws IOException return count.get(); } + /** + * 读取规则文本并转为IpList + * + * @param data 规则文本 + * @param ips ip列表 + * @return 加载的行数 + */ + private int stringToIPList(String data, List ips) throws IOException { + AtomicInteger count = new AtomicInteger(); + Arrays.stream(data.split("\n")).filter(s -> !s.isBlank()).forEach(ele -> { + if (ele.startsWith("#")) { + return; // 注释 + } + try { + var parsedIp = parseRuleLine(ele); + if (parsedIp != null) { + count.getAndIncrement(); + ips.add(parsedIp); + } + } catch (Exception e) { + log.error("Unable parse rule: {}", ele, e); + } + }); + return count.get(); + } + private IPAddress parseRuleLine(String ele) { // 注释? if (ele.startsWith("#")) return null; @@ -368,7 +423,7 @@ public RuleSubInfoEntity getRuleSubInfo(String ruleId) throws SQLException { public ConfigurationSection saveRuleSubInfo(@NotNull RuleSubInfoEntity ruleSubInfo) throws IOException { ConfigurationSection rules = getRuleSubsConfig(); String ruleId = ruleSubInfo.getRuleId().trim(); - if(ruleId.contains(".")){ + if (ruleId.contains(".")) { throw new IllegalArgumentException("Character '.' is not allowed."); } rules.set(ruleId + ".enabled", ruleSubInfo.isEnabled()); @@ -436,6 +491,9 @@ public void changeCheckInterval(long checkInterval) throws IOException { record IPBanResult(String ruleName, MatchResult matchResult) { } + + record DataUpdateResult(int code, String message, byte[] data) { + } } From d398988e69b79f4a9466de5151a366282ea3112d Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 30 Nov 2024 23:15:12 +0800 Subject: [PATCH 064/232] checkpoint --- .../database/DatabaseHelper.java | 1 + .../DecentralizedBanListSharing.java | 52 +++++++++++++++++++ .../decentralized/DecentralizedManager.java | 31 ++++++++--- 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java b/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java index b43c691878..f70d29096f 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java +++ b/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java @@ -41,6 +41,7 @@ private void createTables() throws SQLException { TableUtils.createTableIfNotExists(database.getDataSource(), ProgressCheatBlockerPersistEntity.class); TableUtils.createTableIfNotExists(database.getDataSource(), TrafficJournalEntity.class); TableUtils.createTableIfNotExists(database.getDataSource(), AlertEntity.class); + TableUtils.createTableIfNotExists(database.getDataSource(), DHTRecordEntity.class); } private void performUpgrade() throws SQLException { diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java new file mode 100644 index 0000000000..9c99ebbd34 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java @@ -0,0 +1,52 @@ +package com.ghostchu.peerbanhelper.decentralized; + +import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.PeerBanHelperServer; +import com.ghostchu.peerbanhelper.event.PeerBanEvent; +import com.ghostchu.peerbanhelper.event.PeerUnbanEvent; +import com.ghostchu.peerbanhelper.util.json.JsonUtil; +import com.google.common.eventbus.Subscribe; +import io.ipfs.multihash.Multihash; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; + +@Component +public class DecentralizedBanListSharing { + private final DecentralizedManager decentralizedManager; + private final PeerBanHelperServer peerBanHelperServer; + + public DecentralizedBanListSharing(DecentralizedManager decentralizedManager, PeerBanHelperServer peerBanHelperServer) { + this.decentralizedManager = decentralizedManager; + this.peerBanHelperServer = peerBanHelperServer; + Main.getEventBus().register(this); + onPeerUpdate(); + } + + @Subscribe + public void onPeerBanEvent(PeerBanEvent event){ + onPeerUpdate(); + } + + @Subscribe + public void onPeerUnBanEvent(PeerUnbanEvent event){ + onPeerUpdate(); + } + + private void onPeerUpdate() { + var peerId = decentralizedManager.getPeerId(); + decentralizedManager.publishValueToIpns( + Multihash.deserialize(peerId.getBytes()), + JsonUtil.standard().toJson(peerBanHelperServer.getBannedPeers()).getBytes(StandardCharsets.UTF_8), + System.currentTimeMillis() / 1000,1000*60*60*24*7); + Thread.startVirtualThread(()->{ + try { + Thread.sleep(1000*30); + System.out.println(new String(decentralizedManager.getBlockFromIPNS(Multihash.deserialize(peerId.getBytes())).join(), StandardCharsets.UTF_8)); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + } + +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index 67e82d59be..ff52274d5e 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -3,6 +3,7 @@ import com.ghostchu.peerbanhelper.Main; import com.ghostchu.peerbanhelper.database.dao.impl.DHTRecordDao; import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.util.ByteUtil; import com.ghostchu.peerbanhelper.util.PBHPortMapper; import com.offbynull.portmapper.mapper.PortType; import io.ipfs.cid.Cid; @@ -19,6 +20,7 @@ import org.peergos.blockstore.FileBlockstore; import org.peergos.config.IdentitySection; import org.peergos.protocol.http.HttpProtocol; +import org.peergos.protocol.ipns.IPNS; import org.peergos.util.Logging; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; @@ -29,6 +31,8 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.file.Files; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -68,7 +72,15 @@ public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordD private void startupNabu() { List swarmAddresses = List.of(new MultiAddress("/ip6/::/tcp/" + listeningPort)); - List bootstrapAddresses = List.of(new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa")); + List bootstrapAddresses = List.of( + new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa"), + new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"), + new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa"), + new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb"), + new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt"), + new MultiAddress("/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ") + + ); BlockRequestAuthoriser authoriser = (cid, peerid, auth) -> CompletableFuture.completedFuture(true); boolean provideBlocks = true; SocketAddress httpTarget = new InetSocketAddress("localhost", 10000); @@ -99,7 +111,6 @@ private void startupNabu() { httpProxyTarget ); ipfs.start(); - var mapper = pbhPortMapper.getPortMapper(); if (mapper != null) { pbhPortMapper.mapPort(mapper, PortType.TCP, listeningPort).thenAccept(mappedPort -> { @@ -108,14 +119,16 @@ private void startupNabu() { } }); } - } + Thread.startVirtualThread(()->{ - public void publishValue(byte[] data, long seq, int hoursTTL){; - ipfs.publishValue(privKey,data,seq,hoursTTL); + }); } - public void publishValueToIpns(Multihash ipns, byte[] data, long seq, int hoursTTL){ + public void publishValueToIpns(Multihash ipns, byte[] data, long seq, long ttlMilis){ // WTF? + long ttlNanos = ttlMilis * 1000000; + ipfs.publishPresignedRecord(ipns, IPNS.createSignedRecord(data, LocalDateTime.now().plus(1, ChronoUnit.HOURS),seq, ttlNanos,privKey)); + log.info("[IPFS] Publishing IPNS {} ({})", ipns.toBase58(), ByteUtil.bytesToHex(IPNS.getKey(ipns))); } public PrivKey getPrivKey() throws IOException { @@ -127,7 +140,7 @@ public PrivKey getPrivKey() throws IOException { return Ed25519Kt.unmarshalEd25519PrivateKey(Files.readAllBytes(privKey.toPath())); } - public CompletableFuture getBlockFromIPNS(Cid ipnsPointerCid) { + public CompletableFuture getBlockFromIPNS(Multihash ipnsPointerCid) { return CompletableFuture.supplyAsync(() -> { var future = ipfs.dht.resolveIpnsValue(ipnsPointerCid, ipfs.node, 1); String contentCid = future.join(); @@ -142,4 +155,8 @@ public CompletableFuture getBlockFromCid(Cid cid) { return blocks.getFirst().block; }); } + + public PeerId getPeerId() { + return peerId; + } } From 7782c6ea6a19fc6ecfde67baeae9213a4c6e9455 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 01:38:49 +0800 Subject: [PATCH 065/232] =?UTF-8?q?=E6=94=AF=E6=8C=81=20IPFS=20=E8=AE=A2?= =?UTF-8?q?=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: IPFS 禁用支持 --- pom.xml | 24 ++- .../peerbanhelper/PeerBanHelperServer.java | 4 + .../database/DatabaseHelper.java | 1 - .../database/dao/impl/DHTRecordDao.java | 113 ------------ .../database/table/DHTRecordEntity.java | 27 --- .../DecentralizedBanListSharing.java | 52 ------ .../decentralized/DecentralizedManager.java | 161 ++---------------- .../decentralized/HybirdDHTRecordStore.java | 78 --------- .../decentralized/IPFSBanListShare.java | 106 ++++++++++++ .../module/impl/rule/IPBlackRuleList.java | 39 +++-- .../com/ghostchu/peerbanhelper/text/Lang.java | 2 +- .../peerbanhelper/util/PBHPortMapper.java | 37 +++- src/main/resources/config.yml | 10 ++ src/main/resources/lang/messages_fallback.yml | 8 +- 14 files changed, 213 insertions(+), 449 deletions(-) delete mode 100644 src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java delete mode 100644 src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java delete mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java delete mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java create mode 100644 src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java diff --git a/pom.xml b/pom.xml index 4b1dd892be..6de1ae6d19 100644 --- a/pom.xml +++ b/pom.xml @@ -502,21 +502,19 @@ 3.5.2 - com.github.Peergos - nabu - v0.8.0 + com.offbynull.portmapper + portmapper + 2.0.6 - - - - - - org.bitlet - weupnp - 0.1.2 + com.github.ipfs + java-ipfs-http-client + 1.4.4 + + + com.github.multiformats + java-multiaddr + v1.4.12 - - diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index e40f347c1d..6096f35cb4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -4,6 +4,7 @@ import com.ghostchu.peerbanhelper.alert.AlertManager; import com.ghostchu.peerbanhelper.database.Database; import com.ghostchu.peerbanhelper.database.dao.impl.BanListDao; +import com.ghostchu.peerbanhelper.decentralized.IPFSBanListShare; import com.ghostchu.peerbanhelper.downloader.Downloader; import com.ghostchu.peerbanhelper.downloader.DownloaderLastStatus; import com.ghostchu.peerbanhelper.downloader.DownloaderLoginResult; @@ -144,6 +145,8 @@ public class PeerBanHelperServer implements Reloadable { private BanListDao banListDao; @Autowired private Laboratory laboratory; + @Autowired + private IPFSBanListShare share; public PeerBanHelperServer() { reloadConfig(); @@ -426,6 +429,7 @@ private void saveBanList() { } try { int count = banListDao.saveBanList(BAN_LIST); + share.publishUpdate(); log.info(tlUI(Lang.SAVED_BANLIST, count)); } catch (Exception e) { log.error(tlUI(Lang.SAVE_BANLIST_FAILED), e); diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java b/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java index f70d29096f..b43c691878 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java +++ b/src/main/java/com/ghostchu/peerbanhelper/database/DatabaseHelper.java @@ -41,7 +41,6 @@ private void createTables() throws SQLException { TableUtils.createTableIfNotExists(database.getDataSource(), ProgressCheatBlockerPersistEntity.class); TableUtils.createTableIfNotExists(database.getDataSource(), TrafficJournalEntity.class); TableUtils.createTableIfNotExists(database.getDataSource(), AlertEntity.class); - TableUtils.createTableIfNotExists(database.getDataSource(), DHTRecordEntity.class); } private void performUpgrade() throws SQLException { diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java b/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java deleted file mode 100644 index 4fc1515756..0000000000 --- a/src/main/java/com/ghostchu/peerbanhelper/database/dao/impl/DHTRecordDao.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.ghostchu.peerbanhelper.database.dao.impl; - -import com.ghostchu.peerbanhelper.database.Database; -import com.ghostchu.peerbanhelper.database.dao.AbstractPBHDao; -import com.ghostchu.peerbanhelper.database.table.DHTRecordEntity; -import io.ipfs.multibase.binary.Base32; -import io.ipfs.multihash.Multihash; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.peergos.protocol.dht.RecordStore; -import org.peergos.protocol.ipns.IpnsRecord; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.sql.SQLException; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.Arrays; -import java.util.Deque; -import java.util.Optional; - -@Component -@Slf4j -public class DHTRecordDao extends AbstractPBHDao implements RecordStore { - private final int SIZE_OF_VAL = 10240; - private final int SIZE_OF_PEERID = 100; - - public DHTRecordDao(@Autowired Database database) throws SQLException { - super(database.getDataSource(), DHTRecordEntity.class); - } - - @Override - public void close() throws Exception { - - } - - @SneakyThrows - public void batchSave(Deque tasks) { - callBatchTasks(() -> { - while (!tasks.isEmpty()) { - var task = tasks.pop(); - try { - if (task.delete()) { - remove(task.key); - } else { - put(task.key, task.value); - } - } catch (Exception e) { - log.warn("Unable save {} to DHT records database", task); - } - } - return null; - }); - } - - private String hashToKey(Multihash hash) { - String padded = new Base32().encodeAsString(hash.toBytes()); - int padStart = padded.indexOf("="); - return padStart > 0 ? padded.substring(0, padStart) : padded; - } - - @Override - public Optional get(Multihash peerId) { - try { - var entity = queryForId(hashToKey(peerId)); - if (entity == null) return Optional.empty(); - return Optional.of( - new IpnsRecord( - entity.getRaw(), - entity.getSequence(), - entity.getTtlNanos(), - LocalDateTime.ofEpochSecond(entity.getExpiryUTC(), 0, ZoneOffset.UTC), - entity.getVal().getBytes() - ) - ); - } catch (SQLException e) { - throw new IllegalStateException(e); - } - } - - @Override - public void put(Multihash peerId, IpnsRecord record) { - try { - createOrUpdate(new DHTRecordEntity( - hashToKey(peerId), - record.raw, - record.sequence, - record.ttlNanos, - record.expiry.toEpochSecond(ZoneOffset.UTC), - new String(record.value.length > SIZE_OF_VAL ? - Arrays.copyOfRange(record.value, 0, SIZE_OF_VAL) : record.value) - )); - } catch (SQLException e) { - throw new IllegalStateException(e); - } - } - - @Override - public void remove(Multihash peerId) { - try { - delete(queryForEq("peerId", hashToKey(peerId))); - } catch (SQLException e) { - throw new IllegalStateException(e); - } - } - - public record PersistTask( - boolean delete, - Multihash key, - IpnsRecord value - ) { - } -} diff --git a/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java b/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java deleted file mode 100644 index e3a7bdab2c..0000000000 --- a/src/main/java/com/ghostchu/peerbanhelper/database/table/DHTRecordEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ghostchu.peerbanhelper.database.table; - -import com.j256.ormlite.field.DataType; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@AllArgsConstructor -@NoArgsConstructor -@Data -@DatabaseTable(tableName = "dht_records") -public final class DHTRecordEntity { - @DatabaseField(id = true, index = true, canBeNull = false, columnDefinition = "VARCHAR(100)") - private String peerId; - @DatabaseField(canBeNull = false, dataType = DataType.BYTE_ARRAY) - private byte[] raw; - @DatabaseField(canBeNull = false) - private long sequence; - @DatabaseField(canBeNull = false) - private long ttlNanos; - @DatabaseField(canBeNull = false) - private long expiryUTC; - @DatabaseField(canBeNull = false, columnDefinition = "VARCHAR(10240)") - private String val; -} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java deleted file mode 100644 index 9c99ebbd34..0000000000 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedBanListSharing.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ghostchu.peerbanhelper.decentralized; - -import com.ghostchu.peerbanhelper.Main; -import com.ghostchu.peerbanhelper.PeerBanHelperServer; -import com.ghostchu.peerbanhelper.event.PeerBanEvent; -import com.ghostchu.peerbanhelper.event.PeerUnbanEvent; -import com.ghostchu.peerbanhelper.util.json.JsonUtil; -import com.google.common.eventbus.Subscribe; -import io.ipfs.multihash.Multihash; -import org.springframework.stereotype.Component; - -import java.nio.charset.StandardCharsets; - -@Component -public class DecentralizedBanListSharing { - private final DecentralizedManager decentralizedManager; - private final PeerBanHelperServer peerBanHelperServer; - - public DecentralizedBanListSharing(DecentralizedManager decentralizedManager, PeerBanHelperServer peerBanHelperServer) { - this.decentralizedManager = decentralizedManager; - this.peerBanHelperServer = peerBanHelperServer; - Main.getEventBus().register(this); - onPeerUpdate(); - } - - @Subscribe - public void onPeerBanEvent(PeerBanEvent event){ - onPeerUpdate(); - } - - @Subscribe - public void onPeerUnBanEvent(PeerUnbanEvent event){ - onPeerUpdate(); - } - - private void onPeerUpdate() { - var peerId = decentralizedManager.getPeerId(); - decentralizedManager.publishValueToIpns( - Multihash.deserialize(peerId.getBytes()), - JsonUtil.standard().toJson(peerBanHelperServer.getBannedPeers()).getBytes(StandardCharsets.UTF_8), - System.currentTimeMillis() / 1000,1000*60*60*24*7); - Thread.startVirtualThread(()->{ - try { - Thread.sleep(1000*30); - System.out.println(new String(decentralizedManager.getBlockFromIPNS(Multihash.deserialize(peerId.getBytes())).join(), StandardCharsets.UTF_8)); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - }); - } - -} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index ff52274d5e..0b06583851 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -1,162 +1,35 @@ package com.ghostchu.peerbanhelper.decentralized; -import com.ghostchu.peerbanhelper.Main; -import com.ghostchu.peerbanhelper.database.dao.impl.DHTRecordDao; import com.ghostchu.peerbanhelper.text.Lang; -import com.ghostchu.peerbanhelper.util.ByteUtil; -import com.ghostchu.peerbanhelper.util.PBHPortMapper; -import com.offbynull.portmapper.mapper.PortType; -import io.ipfs.cid.Cid; -import io.ipfs.multiaddr.MultiAddress; -import io.ipfs.multihash.Multihash; -import io.libp2p.core.PeerId; -import io.libp2p.core.crypto.PrivKey; -import io.libp2p.crypto.keys.Ed25519Kt; +import io.ipfs.api.IPFS; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.peergos.BlockRequestAuthoriser; -import org.peergos.EmbeddedIpfs; -import org.peergos.HostBuilder; -import org.peergos.Want; -import org.peergos.blockstore.FileBlockstore; -import org.peergos.config.IdentitySection; -import org.peergos.protocol.http.HttpProtocol; -import org.peergos.protocol.ipns.IPNS; -import org.peergos.util.Logging; -import org.slf4j.LoggerFactory; -import org.slf4j.event.Level; +import org.jetbrains.annotations.Nullable; import org.springframework.stereotype.Component; -import java.io.File; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.file.Files; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; @Component @Slf4j -public class DecentralizedManager { - private final File directory; - private final int listeningPort; - private final File ipfsDirectory; - private final PBHPortMapper pbhPortMapper; - private final DHTRecordDao dhtRecordDao; - private EmbeddedIpfs ipfs; - private PrivKey privKey; - private PeerId peerId; - private IdentitySection identity; - - public DecentralizedManager(PBHPortMapper pbhPortMapper, DHTRecordDao dhtRecordDao) throws IOException { - this.pbhPortMapper = pbhPortMapper; - this.dhtRecordDao = dhtRecordDao; - this.directory = new File(Main.getDataDirectory(), "decentralized"); - if (!this.directory.exists()) { - this.directory.mkdirs(); - } - this.ipfsDirectory = new File(directory, "ipfs-blockstore"); - if (!this.ipfsDirectory.exists()) { - this.ipfsDirectory.mkdirs(); - } - this.listeningPort = Main.getMainConfig().getInt("decentralized.port", 9897); - this.privKey = getPrivKey(); - this.peerId = PeerId.fromPubKey(privKey.publicKey()); - this.identity = new IdentitySection(privKey.bytes(), peerId); - this.startupNabu(); - } - - private void startupNabu() { - List swarmAddresses = List.of(new MultiAddress("/ip6/::/tcp/" + listeningPort)); - List bootstrapAddresses = List.of( - new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa"), - new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN"), - new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa"), - new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb"), - new MultiAddress("/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt"), - new MultiAddress("/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ") - - ); - BlockRequestAuthoriser authoriser = (cid, peerid, auth) -> CompletableFuture.completedFuture(true); - boolean provideBlocks = true; - SocketAddress httpTarget = new InetSocketAddress("localhost", 10000); - Optional httpProxyTarget = - Optional.of((s, req, h) -> HttpProtocol.proxyRequest(req, httpTarget, h)); - Logging.LOG().setFilter(record -> { - Level slf4jLevel = switch (record.getLevel().intValue()) { - case 1000 -> Level.TRACE; - case 900 -> Level.DEBUG; - case 800 -> Level.INFO; - case 700 -> Level.WARN; - case 500 -> Level.ERROR; - default -> Level.INFO; - }; - LoggerFactory.getLogger(record.getLoggerName()) - .makeLoggingEventBuilder(slf4jLevel) - .addArgument(record.getParameters()) - .log(record.getMessage(), record.getThrown()); - return false; - }); - this.ipfs = EmbeddedIpfs.build(new HybirdDHTRecordStore(dhtRecordDao), - new FileBlockstore(ipfsDirectory.toPath()), - provideBlocks, - swarmAddresses, - bootstrapAddresses, - identity, - authoriser, - httpProxyTarget - ); - ipfs.start(); - var mapper = pbhPortMapper.getPortMapper(); - if (mapper != null) { - pbhPortMapper.mapPort(mapper, PortType.TCP, listeningPort).thenAccept(mappedPort -> { - if (mappedPort != null) { - log.info(tlUI(Lang.DECENTRALIZED_PORT_FORWARDED, mappedPort.getInternalPort(), mappedPort.getExternalPort(), mappedPort.getExternalAddress().getHostAddress())); - } - }); - } - Thread.startVirtualThread(()->{ - - }); - } - - public void publishValueToIpns(Multihash ipns, byte[] data, long seq, long ttlMilis){ - // WTF? - long ttlNanos = ttlMilis * 1000000; - ipfs.publishPresignedRecord(ipns, IPNS.createSignedRecord(data, LocalDateTime.now().plus(1, ChronoUnit.HOURS),seq, ttlNanos,privKey)); - log.info("[IPFS] Publishing IPNS {} ({})", ipns.toBase58(), ByteUtil.bytesToHex(IPNS.getKey(ipns))); +public class DecentralizedManager implements AutoCloseable{ + @Getter + @Nullable + private IPFS ipfs; + public DecentralizedManager() { + startupIPFS(); } - public PrivKey getPrivKey() throws IOException { - File privKey = new File(directory, "ipfs.key"); - if (!privKey.exists()) { - HostBuilder builder = new HostBuilder().generateIdentity(); - Files.write(privKey.toPath(), builder.getPrivateKey().bytes()); + private void startupIPFS() { + try { + this.ipfs = new IPFS("/ip4/127.0.0.1/tcp/5001"); + log.info(tlUI(Lang.IPFS_INIT_WELCOME, ipfs.version())); + }catch (Exception e){ + log.error(tlUI(Lang.IPFS_INIT_FAILED), e); } - return Ed25519Kt.unmarshalEd25519PrivateKey(Files.readAllBytes(privKey.toPath())); } - public CompletableFuture getBlockFromIPNS(Multihash ipnsPointerCid) { - return CompletableFuture.supplyAsync(() -> { - var future = ipfs.dht.resolveIpnsValue(ipnsPointerCid, ipfs.node, 1); - String contentCid = future.join(); - return getBlockFromCid(Cid.decode(contentCid)).join(); - }); - } - - public CompletableFuture getBlockFromCid(Cid cid) { - return CompletableFuture.supplyAsync(() -> { - var blocks = ipfs.getBlocks(List.of(new Want(cid)), null, true); - // there have multiple blocks, we need connect all byte[] - return blocks.getFirst().block; - }); - } + @Override + public void close() throws Exception { - public PeerId getPeerId() { - return peerId; } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java deleted file mode 100644 index b0af2651b4..0000000000 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/HybirdDHTRecordStore.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.ghostchu.peerbanhelper.decentralized; - -import com.ghostchu.peerbanhelper.database.dao.impl.DHTRecordDao; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.RemovalCause; -import io.ipfs.multihash.Multihash; -import org.peergos.protocol.dht.RecordStore; -import org.peergos.protocol.ipns.IpnsRecord; -import org.springframework.stereotype.Component; - -import java.util.Deque; -import java.util.Optional; -import java.util.concurrent.ConcurrentLinkedDeque; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -@Component -public class HybirdDHTRecordStore implements RecordStore { - private final Deque persistTasks = new ConcurrentLinkedDeque<>(); - private final Cache records = CacheBuilder - .newBuilder() - .expireAfterAccess(30, TimeUnit.MINUTES) - .maximumSize(200) - .removalListener(notification -> { - if (notification.getCause() != RemovalCause.EXPLICIT) { - Multihash key = (Multihash) notification.getKey(); - IpnsRecord value = (IpnsRecord) notification.getValue(); - persistTasks.offer(new DHTRecordDao.PersistTask(false, key, value)); - } - }) - .build(); - private final DHTRecordDao dhtRecordDao; - private final ScheduledExecutorService scheduled; - - public HybirdDHTRecordStore(DHTRecordDao dhtRecordDao) { - this.dhtRecordDao = dhtRecordDao; - this.scheduled = Executors.newScheduledThreadPool(1, Thread.ofVirtual().factory()); - this.scheduled.scheduleWithFixedDelay(this::flush, 5, 5, TimeUnit.MINUTES); - } - - @Override - public void put(Multihash multihash, IpnsRecord ipnsRecord) { - records.put(multihash, ipnsRecord); - } - - @Override - public Optional get(Multihash multihash) { - var record = records.getIfPresent(multihash); - if (record == null) { - record = dhtRecordDao.get(multihash).orElse(null); - } - if (record != null) { - records.put(multihash, record); - } - return Optional.ofNullable(record); - } - - @Override - public void remove(Multihash multihash) { - //dhtRecordDao.remove(multihash); - persistTasks.offer(new DHTRecordDao.PersistTask(true, multihash, null)); - records.invalidate(multihash); - } - - private void flush() { - dhtRecordDao.batchSave(persistTasks); - } - - @Override - public void close() throws Exception { - scheduled.shutdownNow(); - records.asMap().forEach((hash, record) -> persistTasks.offer(new DHTRecordDao.PersistTask(false, hash, record))); - records.invalidateAll(); - flush(); - } -} diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java new file mode 100644 index 0000000000..a5b4556b16 --- /dev/null +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java @@ -0,0 +1,106 @@ +package com.ghostchu.peerbanhelper.decentralized; + +import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.PeerBanHelperServer; +import com.ghostchu.peerbanhelper.module.impl.rule.IPBlackRuleList; +import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.peerbanhelper.wrapper.BanMetadata; +import com.ghostchu.peerbanhelper.wrapper.PeerAddress; +import com.ghostchu.simplereloadlib.ReloadResult; +import com.ghostchu.simplereloadlib.ReloadStatus; +import com.ghostchu.simplereloadlib.Reloadable; +import io.ipfs.api.IPFS; +import io.ipfs.api.KeyInfo; +import io.ipfs.api.MerkleNode; +import io.ipfs.api.NamedStreamable; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.Map; +import java.util.Optional; +import java.util.StringJoiner; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static com.ghostchu.peerbanhelper.text.TextManager.tlUI; + +@Component +@Slf4j +public class IPFSBanListShare implements Reloadable { + private final PeerBanHelperServer peerBanHelperServer; + @Nullable + private final IPFS ipfs; + @Getter + private final String banlistId; + private ScheduledExecutorService sched; + + public IPFSBanListShare(DecentralizedManager manager, PeerBanHelperServer peerBanHelperServer) throws IOException { + this.peerBanHelperServer = peerBanHelperServer; + this.ipfs = manager.getIpfs(); + var pbhId = Main.getMainConfig().getString("installation-id"); + this.banlistId = "peerbanhelper-banlist-" + pbhId; + Main.getReloadManager().register(this); + reloadConfig(); + } + + public void reloadConfig() { + long interval = Main.getMainConfig().getLong("decentralized.features.publish-banlist.interval", 3600000); + if (sched != null) { + sched.shutdown(); + } + if (interval > 0) { + sched = Executors.newScheduledThreadPool(4, Thread.ofVirtual().factory()); + sched.scheduleWithFixedDelay(this::publishUpdate, interval, interval, TimeUnit.MILLISECONDS); + } else { + sched = null; + } + } + + public void publishUpdate() { + if(this.ipfs == null) return; + try { + StringJoiner joiner = new StringJoiner("\n"); + joiner.add("# Generated at " + new Date()); + for (Map.Entry entry : peerBanHelperServer.getBannedPeers().entrySet()) { + if (!entry.getValue().getContext().equals(IPBlackRuleList.class.getName())) { + joiner.add("# BanAt=" + entry.getValue().getBanAt() + " UnBanAt=" + entry.getValue().getUnbanAt() + " Context=" + entry.getValue().getContext() + " Rule=" + tlUI(entry.getValue().getRule()) + " Description=" + tlUI(entry.getValue().getDescription())); + joiner.add(entry.getKey().getIp()); + } + } + + MerkleNode node = ipfs.add(new NamedStreamable.ByteArrayWrapper(Optional.of("PeerBanHelper Banlist"), joiner.toString().getBytes(StandardCharsets.UTF_8))).get(0); + KeyInfo publishKey = null; + for (KeyInfo keyInfo : ipfs.key.list()) { + if (keyInfo.name.equals(banlistId)) { + publishKey = keyInfo; + break; + } + } + if (publishKey == null) { + publishKey = ipfs.key.gen(banlistId, Optional.empty(), Optional.empty()); + } + KeyInfo finalPublishKey = publishKey; + Thread.startVirtualThread(() -> { + try { + var map = ipfs.name.publish(node.hash, Optional.of(finalPublishKey.name)); + log.info(tlUI(Lang.IPFS_BANLIST_PUBLISHED)); + } catch (IOException ignored) { + } + }); + } catch (Exception e) { + log.error("Unable to publish/republish the banlist to IPFS", e); + } + } + + @Override + public ReloadResult reloadModule() throws Exception { + reloadConfig(); + return new ReloadResult(ReloadStatus.SUCCESS, null, null); + } +} diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 4b4ba25522..a470fa2944 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -194,7 +194,7 @@ public StdResp updateRule(String locale, @NotNull ConfigurationSection rule, IPB return new StdResp(false, tl(locale, Lang.IP_BAN_RULE_DISABLED, ruleId), null); } String url = rule.getString("url"); - if (null != url && url.startsWith("http")) { + if (null != url) { // 解析远程订阅 String ruleFileName = ruleId + ".txt"; File dir = new File(Main.getDataDirectory(), "/sub"); @@ -290,18 +290,33 @@ private CompletableFuture getResource(String url) { return new DataUpdateResult(response.statusCode(), null, response.body().getBytes()); } // IPNS - if (url.startsWith("/ipfs/")) { - var ipnsCid = StringUtils.substringAfter(url, "/ipfs/"); - Cid cid = Cid.decode(ipnsCid); - var bytes = decentralizedManager.getBlockFromIPNS(cid).join(); - return new DataUpdateResult(200, "Data get from IPFS via IPNS", bytes); + if (url.startsWith("/ipns/")) { + var ipnsCid = StringUtils.substringAfter(url, "/ipns/"); + var ipfs = decentralizedManager.getIpfs(); + if (ipfs == null) { + throw new IllegalStateException("IPFS not available"); + } + try { + var cid = ipfs.name.resolve(Cid.decode(ipnsCid), true); + var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"/ipfs/"))); + return new DataUpdateResult(200, "Data get from IPFS via IPNS", data); + } catch (IOException e) { + throw new RuntimeException(e); + } } - // 用户直接塞了个 CID - try { - Cid cid = Cid.decode(url); - var bytes = decentralizedManager.getBlockFromCid(cid).join(); - return new DataUpdateResult(200, "Data get from IPFS", bytes); - } catch (Exception ignored) { + // IPNS + if (url.startsWith("/ipfs/")) { + var cid = StringUtils.substringAfter(url, "/ipfs/"); + var ipfs = decentralizedManager.getIpfs(); + if (ipfs == null) { + throw new IllegalStateException("IPFS not available"); + } + try { + var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"/ipfs/"))); + return new DataUpdateResult(200, "Data get from IPFS via IPNS", data); + } catch (IOException e) { + throw new RuntimeException(e); + } } throw new IllegalArgumentException("Invalid URL"); }); diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index 5a4f1a4148..1b51fe28cd 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -434,7 +434,7 @@ public enum Lang { BTN_RULES_SCRIPT_COMPILING, BTN_RULES_SCRIPT_COMPILED, BTN_SERVICES_NEED_RESTART, - EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED, DECENTRALIZED_PORT_FORWARDED, LAB_EXPERIMENT_IPFS_TITLE, LAB_EXPERIMENT_IPFS_DESCRIPTION, PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS, PORT_MAPPER_PORT_MAPPING; + EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED, DECENTRALIZED_PORT_FORWARDED, LAB_EXPERIMENT_IPFS_TITLE, LAB_EXPERIMENT_IPFS_DESCRIPTION, PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS, PORT_MAPPER_PORT_MAPPING, IPFS_INIT_FAILED, IPFS_INIT_WELCOME, IPFS_BANLIST_PUBLISHED; public String getKey() { return name(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java index d4129d0ef3..59637b87ac 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java +++ b/src/main/java/com/ghostchu/peerbanhelper/util/PBHPortMapper.java @@ -30,6 +30,8 @@ public class PBHPortMapper { private final Bus networkBus; private final Bus processBus; private final Map originalToRefreshedPortMap = Collections.synchronizedMap(new HashMap<>()); + private List mappers = null; + private final Object scanMappersLock = new Object(); private ScheduledExecutorService sched = Executors.newScheduledThreadPool(16, Thread.ofVirtual().factory()); public PBHPortMapper() { @@ -37,10 +39,15 @@ public PBHPortMapper() { this.process = ProcessGateway.create(); this.networkBus = network.getBus(); this.processBus = process.getBus(); + Thread.startVirtualThread(()->{ + scanMappers(); + }); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { - List mappers = PortMapperFactory.discover(networkBus, processBus); - if (mappers.isEmpty()) { + if(originalToRefreshedPortMap.isEmpty()){ + return; + } + if(mappers == null || mappers.isEmpty()){ return; } var it = originalToRefreshedPortMap.entrySet().iterator(); @@ -51,15 +58,31 @@ public PBHPortMapper() { it.remove(); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); - } catch (InterruptedException e) { - throw new RuntimeException(e); + } finally { + networkBus.send(new KillNetworkRequest()); + processBus.send(new KillProcessRequest()); + sched.shutdown(); } - networkBus.send(new KillNetworkRequest()); - processBus.send(new KillProcessRequest()); - sched.shutdown(); })); } + private void scanMappers() { + synchronized (scanMappersLock) { + try { + this.mappers = PortMapperFactory.discover(networkBus, processBus); + } catch (InterruptedException exception) { + log.warn("Unable to lookup port mappers", exception); + } + } + } + + public List getMappers(){ + if(mappers == null){ + scanMappers(); + } + return mappers; + } + public CompletableFuture unmapPort(List mappers, MappedPort mappedPort) { return CompletableFuture.supplyAsync(() -> { for (PortMapper mapper : mappers) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a86f3ea351..82b4ab7f3a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -155,6 +155,16 @@ performance: # https://devblogs.microsoft.com/performance-diagnostics/introducing-ecoqos/ windows-ecoqos-api: true +# PeerBanHelper 去中心化网络服务 - Decentralized network service +# 请配置一个可用的 Kubo IPFS 节点 - Please configure an available Kubo IPFS node +decentralized: + enabled: true + # Kubo RPC MultiAddr + rpc-url: "/ip4/127.0.0.1/tcp/5001" + features: + # 发布当前封禁列表到 IPFS 以允许它人订阅您的封禁列表内容,时间单位:毫秒,设置为 -1 以禁用 + # Publish current banlist to IPFS to allow others subscribe your banlist, time unit: milliseconds, set to -1 to disable + publish-banlist: 3600000 push-notification: # 邮件推送服务 - Email push notification email-example: diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 5cdaf07f51..06b0265b5f 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -504,4 +504,10 @@ PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端 DECENTRALIZED_PORT_FORWARDED: "[Decentralized] 自动端口映射成功:{} -> {} (外部 IP: {})" LAB_EXPERIMENT_IPFS_TITLE: "IPFS (*星际文件系统*) 去中心化网络" -LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 IPFS (星际文件系统)去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" \ No newline at end of file +LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 IPFS (星际文件系统)去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" + +IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行。查看错误信息以了解更多。" +IPFS_INIT_WELCOME: | + [IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。欢迎来到未来的互联网!您现在已经成为分布式网络上不可或缺的一部分。 + PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能。 +IPFS_BANLIST_PUBLISHED: "[IPFS] 已更新封禁列表到 IPFS,并一同更新了 IPNS 记录" \ No newline at end of file From dd5973fb3abb566b151c0ffc1920879f03f0877a Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 01:44:38 +0800 Subject: [PATCH 066/232] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20://=20=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/rule/IPBlackRuleList.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index a470fa2944..4ce32c06b2 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -290,8 +290,8 @@ private CompletableFuture getResource(String url) { return new DataUpdateResult(response.statusCode(), null, response.body().getBytes()); } // IPNS - if (url.startsWith("/ipns/")) { - var ipnsCid = StringUtils.substringAfter(url, "/ipns/"); + if (url.startsWith("ipns://")) { + var ipnsCid = StringUtils.substringAfter(url, "ipns://"); var ipfs = decentralizedManager.getIpfs(); if (ipfs == null) { throw new IllegalStateException("IPFS not available"); @@ -304,16 +304,16 @@ private CompletableFuture getResource(String url) { throw new RuntimeException(e); } } - // IPNS - if (url.startsWith("/ipfs/")) { - var cid = StringUtils.substringAfter(url, "/ipfs/"); + // IPFS + if (url.startsWith("ipfs://")) { + var cid = StringUtils.substringAfter(url, "ipfs://"); var ipfs = decentralizedManager.getIpfs(); if (ipfs == null) { throw new IllegalStateException("IPFS not available"); } try { - var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"/ipfs/"))); - return new DataUpdateResult(200, "Data get from IPFS via IPNS", data); + var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"ipfs://"))); + return new DataUpdateResult(200, "Data get from IPFS", data); } catch (IOException e) { throw new RuntimeException(e); } From 4e0831b890e827a1b02cb38c2475fc070e52675b Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 01:47:38 +0800 Subject: [PATCH 067/232] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20URI=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/impl/rule/IPBlackRuleList.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java index 4ce32c06b2..07fab606c4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/rule/IPBlackRuleList.java @@ -42,6 +42,8 @@ import java.io.File; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.sql.SQLException; @@ -284,14 +286,20 @@ public StdResp updateRule(String locale, @NotNull ConfigurationSection rule, IPB private CompletableFuture getResource(String url) { return CompletableFuture.supplyAsync(() -> { - if (url.startsWith("http")) { + URI uri; + try { + uri = new URI(url); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + if (uri.getScheme().startsWith("http")) { var response = HTTPUtil.retryableSend(HTTPUtil.getHttpClient(false, null), MutableRequest.GET(url), HttpResponse.BodyHandlers.ofString()).join(); return new DataUpdateResult(response.statusCode(), null, response.body().getBytes()); } // IPNS - if (url.startsWith("ipns://")) { - var ipnsCid = StringUtils.substringAfter(url, "ipns://"); + if (uri.getScheme().equalsIgnoreCase("ipns")) { + var ipnsCid = uri.getHost(); var ipfs = decentralizedManager.getIpfs(); if (ipfs == null) { throw new IllegalStateException("IPFS not available"); @@ -305,14 +313,14 @@ private CompletableFuture getResource(String url) { } } // IPFS - if (url.startsWith("ipfs://")) { - var cid = StringUtils.substringAfter(url, "ipfs://"); + if (uri.getScheme().equalsIgnoreCase("ipfs")) { + var cid = uri.getHost(); var ipfs = decentralizedManager.getIpfs(); if (ipfs == null) { throw new IllegalStateException("IPFS not available"); } try { - var data = ipfs.cat(Cid.decode(StringUtils.substringAfter(cid,"ipfs://"))); + var data = ipfs.cat(Cid.decode(cid)); return new DataUpdateResult(200, "Data get from IPFS", data); } catch (IOException e) { throw new RuntimeException(e); From 4a3d2fcd3829f2aac0f86f136a64f195cb88aabb Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 01:48:52 +0800 Subject: [PATCH 068/232] =?UTF-8?q?=E6=8B=A6=E6=88=AA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/decentralized/IPFSBanListShare.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java index a5b4556b16..748309b7e7 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/IPFSBanListShare.java @@ -90,10 +90,10 @@ public void publishUpdate() { try { var map = ipfs.name.publish(node.hash, Optional.of(finalPublishKey.name)); log.info(tlUI(Lang.IPFS_BANLIST_PUBLISHED)); - } catch (IOException ignored) { + } catch (Throwable ignored) { } }); - } catch (Exception e) { + } catch (Throwable e) { log.error("Unable to publish/republish the banlist to IPFS", e); } } From 7707cc891751bd81a4c0000a012fd8364483edb3 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 12:47:28 +0800 Subject: [PATCH 069/232] =?UTF-8?q?=E5=85=81=E8=AE=B8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A7=E5=88=B6=20IPFS=20=E5=90=AF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/Main.java | 1 - .../decentralized/DecentralizedManager.java | 20 ++++++++++++++++--- .../com/ghostchu/peerbanhelper/text/Lang.java | 18 ++++++++++++++++- src/main/resources/lang/messages_fallback.yml | 6 ++---- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index bba39f93ba..8fcace8042 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -54,7 +54,6 @@ public class Main { @Getter private static File configDirectory; private static File pluginDirectory; - private static File libraryDirectory; @Getter private static File debugDirectory; @Getter diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index 0b06583851..eec3db8feb 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -1,6 +1,9 @@ package com.ghostchu.peerbanhelper.decentralized; +import com.ghostchu.peerbanhelper.Main; import com.ghostchu.peerbanhelper.text.Lang; +import com.ghostchu.simplereloadlib.ReloadResult; +import com.ghostchu.simplereloadlib.Reloadable; import io.ipfs.api.IPFS; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -11,19 +14,30 @@ @Component @Slf4j -public class DecentralizedManager implements AutoCloseable{ +public class DecentralizedManager implements AutoCloseable, Reloadable { @Getter @Nullable private IPFS ipfs; + public DecentralizedManager() { startupIPFS(); } + @Override + public ReloadResult reloadModule() throws Exception { + startupIPFS(); + return Reloadable.super.reloadModule(); + } + private void startupIPFS() { + if (Main.getMainConfig().getBoolean("decentralized.enabled", false)) { + this.ipfs = null; + return; + } try { - this.ipfs = new IPFS("/ip4/127.0.0.1/tcp/5001"); + this.ipfs = new IPFS(Main.getMainConfig().getString("decentralized.kubo-rpc", "/ip4/127.0.0.1/tcp/5001")); log.info(tlUI(Lang.IPFS_INIT_WELCOME, ipfs.version())); - }catch (Exception e){ + } catch (Exception e) { log.error(tlUI(Lang.IPFS_INIT_FAILED), e); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java index 1b51fe28cd..6df493ebf4 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java +++ b/src/main/java/com/ghostchu/peerbanhelper/text/Lang.java @@ -434,7 +434,23 @@ public enum Lang { BTN_RULES_SCRIPT_COMPILING, BTN_RULES_SCRIPT_COMPILED, BTN_SERVICES_NEED_RESTART, - EXPRESS_RULE_ENGINE_SAVED, GUI_MENU_SHOW_WINDOW, GUI_MENU_STATS_BANNED, GUI_MENU_STATS_DOWNLOADER, GUI_MENU_QUICK_OPERATIONS, GUI_MENU_STATS, KADEMLIA_STARTUP_ERROR, PORT_MAPPER_PORT_MAPPED, PORT_MAPPER_PORT_MAPPING_FAILED, DECENTRALIZED_PORT_FORWARDED, LAB_EXPERIMENT_IPFS_TITLE, LAB_EXPERIMENT_IPFS_DESCRIPTION, PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS, PORT_MAPPER_PORT_MAPPING, IPFS_INIT_FAILED, IPFS_INIT_WELCOME, IPFS_BANLIST_PUBLISHED; + EXPRESS_RULE_ENGINE_SAVED, + GUI_MENU_SHOW_WINDOW, + GUI_MENU_STATS_BANNED, + GUI_MENU_STATS_DOWNLOADER, + GUI_MENU_QUICK_OPERATIONS, + GUI_MENU_STATS, + KADEMLIA_STARTUP_ERROR, + PORT_MAPPER_PORT_MAPPED, + PORT_MAPPER_PORT_MAPPING_FAILED, + DECENTRALIZED_PORT_FORWARDED, + LAB_EXPERIMENT_IPFS_TITLE, + LAB_EXPERIMENT_IPFS_DESCRIPTION, + PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS, + PORT_MAPPER_PORT_MAPPING, + IPFS_INIT_FAILED, + IPFS_INIT_WELCOME, + IPFS_BANLIST_PUBLISHED; public String getKey() { return name(); diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 06b0265b5f..eb5c723dbe 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -506,8 +506,6 @@ DECENTRALIZED_PORT_FORWARDED: "[Decentralized] 自动端口映射成功:{} -> LAB_EXPERIMENT_IPFS_TITLE: "IPFS (*星际文件系统*) 去中心化网络" LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 IPFS (星际文件系统)去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" -IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行。查看错误信息以了解更多。" -IPFS_INIT_WELCOME: | - [IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。欢迎来到未来的互联网!您现在已经成为分布式网络上不可或缺的一部分。 - PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能。 +IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行" +IPFS_INIT_WELCOME: "[IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能" IPFS_BANLIST_PUBLISHED: "[IPFS] 已更新封禁列表到 IPFS,并一同更新了 IPNS 记录" \ No newline at end of file From af992288665e9785bdc1cf436612990a41f15265 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 12:48:37 +0800 Subject: [PATCH 070/232] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AE=9E=E9=AA=8C?= =?UTF-8?q?=E5=AE=A4=E6=8E=A7=E5=88=B6=E5=99=A8=E5=86=B3=E5=AE=9A=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=90=AF=E7=94=A8=20IPFS=20=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../decentralized/DecentralizedManager.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index eec3db8feb..dfe9b50430 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -1,6 +1,8 @@ package com.ghostchu.peerbanhelper.decentralized; import com.ghostchu.peerbanhelper.Main; +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.simplereloadlib.ReloadResult; import com.ghostchu.simplereloadlib.Reloadable; @@ -15,11 +17,13 @@ @Component @Slf4j public class DecentralizedManager implements AutoCloseable, Reloadable { + private final Laboratory laboratory; @Getter @Nullable private IPFS ipfs; - public DecentralizedManager() { + public DecentralizedManager(Laboratory laboratory) { + this.laboratory = laboratory; startupIPFS(); } @@ -30,7 +34,8 @@ public ReloadResult reloadModule() throws Exception { } private void startupIPFS() { - if (Main.getMainConfig().getBoolean("decentralized.enabled", false)) { + if (Main.getMainConfig().getBoolean("decentralized.enabled", false) + || !laboratory.isExperimentActivated(Experiments.IPFS.getExperiment())) { this.ipfs = null; return; } From 9da8c561dbc6b5942073783097197d5337286cca Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 12:52:23 +0800 Subject: [PATCH 071/232] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/config/MainConfigUpdateScript.java | 6 ++++++ src/main/resources/config.yml | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java index 348853e2fa..47c51ad941 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java +++ b/src/main/java/com/ghostchu/peerbanhelper/config/MainConfigUpdateScript.java @@ -28,6 +28,12 @@ private void validate() { // log.info(tlUI(Lang.TOO_WEAK_TOKEN)); // } } + @UpdateScript(version = 24) + public void decentralizedConfiguration() { + conf.set("decentralized.enabled", true); + conf.set("decentralized.kubo-rpc", "/ip4/127.0.0.1/tcp/5001"); + conf.set("decentralized.features.publish-banlist", 3600000); + } @UpdateScript(version = 23) public void btnScriptExecuteSwitch() { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 82b4ab7f3a..fc595fd66f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,4 @@ -config-version: 23 +config-version: 24 # 设置程序语言 # Set the program language # default 跟随操作系统 (Follow the operating system) @@ -160,7 +160,7 @@ performance: decentralized: enabled: true # Kubo RPC MultiAddr - rpc-url: "/ip4/127.0.0.1/tcp/5001" + kubo-rpc: "/ip4/127.0.0.1/tcp/5001" features: # 发布当前封禁列表到 IPFS 以允许它人订阅您的封禁列表内容,时间单位:毫秒,设置为 -1 以禁用 # Publish current banlist to IPFS to allow others subscribe your banlist, time unit: milliseconds, set to -1 to disable From f19fb59457f2cf6f52da103fc7c857dd8230c60c Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 13:22:20 +0800 Subject: [PATCH 072/232] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=81=B0=E5=BA=A6?= =?UTF-8?q?=E7=9A=84=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/PeerBanHelperServer.java | 1 + .../decentralized/DecentralizedManager.java | 6 +- .../peerbanhelper/lab/Experiment.java | 4 +- .../peerbanhelper/lab/Experiments.java | 4 +- .../peerbanhelper/lab/Laboratory.java | 8 +- .../module/impl/webapi/PBHLabController.java | 114 +++++++++++++++++- src/main/resources/lang/messages_fallback.yml | 4 +- 7 files changed, 131 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java index 6096f35cb4..6a6a2af25a 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java +++ b/src/main/java/com/ghostchu/peerbanhelper/PeerBanHelperServer.java @@ -756,6 +756,7 @@ private void registerModules() { moduleManager.register(PBHAlertController.class); moduleManager.register(PBHLogsController.class); moduleManager.register(PBHPushController.class); + moduleManager.register(PBHLabController.class); } public Map>> collectPeers() { diff --git a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java index dfe9b50430..046bed8ec9 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java +++ b/src/main/java/com/ghostchu/peerbanhelper/decentralized/DecentralizedManager.java @@ -40,7 +40,11 @@ private void startupIPFS() { return; } try { - this.ipfs = new IPFS(Main.getMainConfig().getString("decentralized.kubo-rpc", "/ip4/127.0.0.1/tcp/5001")); + var ipfsRpc = Main.getMainConfig().getString("decentralized.kubo-rpc", "/ip4/127.0.0.1/tcp/5001"); + if (System.getProperty("pbh.kuboRPC") != null) { + ipfsRpc = System.getProperty("pbh.kuboRPC"); + } + this.ipfs = new IPFS(ipfsRpc); log.info(tlUI(Lang.IPFS_INIT_WELCOME, ipfs.version())); } catch (Exception e) { log.error(tlUI(Lang.IPFS_INIT_FAILED), e); diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java index 2bbfc3c28f..35886a7ea1 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiment.java @@ -4,12 +4,14 @@ import lombok.AllArgsConstructor; import lombok.Data; +import java.util.List; + @AllArgsConstructor @Data public class Experiment { private final String id; - private final int group; + private final List group; private TranslationComponent title; private TranslationComponent description; } diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java index ba947c1eb1..2734edd79c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Experiments.java @@ -3,8 +3,10 @@ import com.ghostchu.peerbanhelper.text.Lang; import com.ghostchu.peerbanhelper.text.TranslationComponent; +import java.util.List; + public enum Experiments { - IPFS(new Experiment("ipfs", 0, new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))); + IPFS(new Experiment("ipfs", List.of(0), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_TITLE), new TranslationComponent(Lang.LAB_EXPERIMENT_IPFS_DESCRIPTION))); private final Experiment experiment; diff --git a/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java index dc107a6ec8..33c8e84bcc 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java +++ b/src/main/java/com/ghostchu/peerbanhelper/lab/Laboratory.java @@ -54,12 +54,12 @@ public boolean isExperimentActivated(Experiment experiment) { } } - public void setExperimentActivated(String id, boolean activated) throws IllegalArgumentException{ + public void setExperimentActivated(String id, Boolean activated) throws IllegalArgumentException{ for (Experiments value : Experiments.values()) { if(!value.getExperiment().getId().equals(id)){ continue; } - labConfig.set(value.getExperiment().getId(), activated); + labConfig.set(value.getExperiment().getId(), activated == null ? "default" : activated); saveLabConfig(); return; } @@ -78,7 +78,7 @@ public int getExperimentalGroup() { return experimentalGroup; } - public boolean isExperimentalGroup(int group) { - return experimentalGroup == group; + public boolean isExperimentalGroup(List group) { + return group.contains(experimentalGroup); } } diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java index 25f547f3b7..9b231b7dfe 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHLabController.java @@ -1,5 +1,117 @@ package com.ghostchu.peerbanhelper.module.impl.webapi; -public class PBHLabController { +import com.ghostchu.peerbanhelper.lab.Experiments; +import com.ghostchu.peerbanhelper.lab.Laboratory; +import com.ghostchu.peerbanhelper.module.AbstractFeatureModule; +import com.ghostchu.peerbanhelper.util.context.IgnoreScan; +import com.ghostchu.peerbanhelper.web.JavalinWebContainer; +import com.ghostchu.peerbanhelper.web.Role; +import com.ghostchu.peerbanhelper.web.wrapper.StdResp; +import io.javalin.http.Context; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + +import static com.ghostchu.peerbanhelper.text.TextManager.tl; + +@Slf4j +@Component +@IgnoreScan +public class PBHLabController extends AbstractFeatureModule { + + private final JavalinWebContainer javalinWebContainer; + private final Laboratory laboratory; + + public PBHLabController(JavalinWebContainer javalinWebContainer, Laboratory laboratory) { + super(); + this.javalinWebContainer = javalinWebContainer; + this.laboratory = laboratory; + } + + @Override + public boolean isConfigurable() { + return false; + } + + @Override + public @NotNull String getName() { + return "WebAPI - Laboratory"; + } + + @Override + public @NotNull String getConfigName() { + return "webapi-laboratory"; + } + + @Override + public void onEnable() { + javalinWebContainer.javalin() + .get("/api/laboratory/experiments", this::handleExperiments, Role.USER_READ) + .get("/api/laboratory/isExperimentActivated", this::handleExperimentActivated, Role.USER_READ) + .put("/api/laboratory/experiment/{id}", this::handleExperimentSet, Role.USER_WRITE); + } + + private void handleExperimentSet(@NotNull Context context) { + var id = context.pathParam("id"); + var activated = context.bodyAsClass(ExperimentPutBody.class); + Boolean bool = null; + if(activated.getStatus().equalsIgnoreCase("true")){ + bool = true; + } else if(activated.getStatus().equalsIgnoreCase("false")){ + bool = false; + } + laboratory.setExperimentActivated(id, bool); + context.json(new StdResp(true, null, activated.getStatus())); + } + + private void handleExperimentActivated(@NotNull Context context) { + var id = context.queryParam("id"); + for (Experiments value : Experiments.values()) { + if (value.getExperiment().getId().equalsIgnoreCase(id)) { + context.json(new StdResp(true, null, laboratory.isExperimentActivated(value.getExperiment()))); + return; + } + } + context.json(new StdResp(false, "Experiment not found", null)); + } + + private void handleExperiments(@NotNull Context context) { + List availableExperiments = new ArrayList<>(); + for (Experiments value : Experiments.values()) { + var record = new ExperimentRecord( + value.getExperiment().getId(), + laboratory.isExperimentActivated(value.getExperiment()), + value.getExperiment().getGroup(), + tl(locale(context), value.getExperiment().getTitle()), + tl(locale(context), value.getExperiment().getDescription()) + ); + availableExperiments.add(record); + } + context.json(new StdResp(true, null, availableExperiments)); + } + + @Override + public void onDisable() { + + } + + @AllArgsConstructor + @Data + static class ExperimentPutBody { + private String status; + } + + record ExperimentRecord( + String id, + boolean activated, + List targetGroups, + String title, + String description + ) { + } } diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index eb5c723dbe..62d0c92d95 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -503,8 +503,8 @@ PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS: "[PortMapper] 需要注意!尽 PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败,正在重试;如果频繁出现此提示,请检查是否设备接入了多个网络(如:Tailscale)" DECENTRALIZED_PORT_FORWARDED: "[Decentralized] 自动端口映射成功:{} -> {} (外部 IP: {})" -LAB_EXPERIMENT_IPFS_TITLE: "IPFS (*星际文件系统*) 去中心化网络" -LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 IPFS (星际文件系统)去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" +LAB_EXPERIMENT_IPFS_TITLE: "IPFS 去中心化网络" +LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 [IPFS (星际文件系统)](https://ipfs.tech/) 去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行" IPFS_INIT_WELCOME: "[IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能" From 96021d42c65f0e64495e7a3def02ccd71926e229 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sun, 1 Dec 2024 13:27:03 +0800 Subject: [PATCH 073/232] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/lang/en_us/messages.yml | 12 +++++++++++- src/main/resources/lang/messages_fallback.yml | 3 --- src/main/resources/lang/zh_cn/messages.yml | 11 ++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index 5ae92f9791..539ff96e4c 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -498,4 +498,14 @@ GUI_MENU_QUICK_OPERATIONS: "Quick Actions" GUI_MENU_SHOW_WINDOW: "Open Window" GUI_MENU_STATS: "Statistics" GUI_MENU_STATS_BANNED: "Banned {} peers ({} IP addresses)" -GUI_MENU_STATS_DOWNLOADER: "Connected {}/{} downloader" \ No newline at end of file +GUI_MENU_STATS_DOWNLOADER: "Connected {}/{} downloader" + +PORT_MAPPER_PORT_MAPPING: "[PortMapper] Try to create port forwarding for port {}/{} ..." +PORT_MAPPER_PORT_MAPPED: "[PortMapper] Successfully create a port forwarding on interface {} 's gateway for {}/{}, External Port: {} (External IP: {});TTL:{} seconds." +PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS: "[PortMapper] Need Attention! Although PortMapper successfully created one or more port forwarding, However, their external addresses appear to be dedicated IP addresses, which usually means that you are behind a two-tier NAT (e.g., your device is connected to a router that is under an optical cat that is also in routing mode), and port mapping may not work." +PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] Failed to create/update port forwarding on interface {} for port {}/{}, re-trying; If this prompt appears frequently, check if the device is connected to multiple networks (e.g. Tailscale)" +LAB_EXPERIMENT_IPFS_TITLE: "IPFS Decentralized Network" +LAB_EXPERIMENT_IPFS_DESCRIPTION: "After participating in this experiment, the beta [IPFS (Interplanetary File System)](https://ipfs.tech/) decentralized network will be enabled on PeerBanHelper. \nIPFS (Interstellar File System) is a distributed network with no centralized servers, where each computer is a node in the IPFS network. IPFS is flexible and resilient, you can store and find files and pass data or resources through IPFS, and speed and accessibility improve automatically as resources become progressively more popular. When a piece of data is no longer needed by any node (and no one is keeping it), it is automatically eliminated from the network over time." +IPFS_INIT_FAILED: "[IPFS] Initializing Kubo IPFS RPC fails, IPFS functionality will not be available, make sure Kubo IPFS is running!" +IPFS_INIT_WELCOME: "[IPFS] Successfully connected to Kubo IPFS RPC, version {}. PeerBanHelper has successfully connected to the IPFS network via Kubo and provides extended functionality" +IPFS_BANLIST_PUBLISHED: "[IPFS] The block list has been updated to IPFS, along with the IPNS record." \ No newline at end of file diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index 62d0c92d95..26edaf0f24 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -501,11 +501,8 @@ PORT_MAPPER_PORT_MAPPING: "[PortMapper] 正在尝试为端口 {}/{} 创建自动 PORT_MAPPER_PORT_MAPPED: "[PortMapper] 已在网卡 {} 的网关上上为本地端口 {}/{} 创建了一个端口映射,外部端口为:{} (外部 IP: {});TTL:{} 秒" PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS: "[PortMapper] 需要注意!尽管 PortMapper 已成功创建了一个或者多个端口映射,但它们的外部地址似乎都是专用 IP 地址,这通常意味着您处于双层 NAT 之后(例如:您的设备连接者一台路由器,但这台路由器处于同为路由模式的光猫之下),端口映射可能不起作用。" PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败,正在重试;如果频繁出现此提示,请检查是否设备接入了多个网络(如:Tailscale)" -DECENTRALIZED_PORT_FORWARDED: "[Decentralized] 自动端口映射成功:{} -> {} (外部 IP: {})" - LAB_EXPERIMENT_IPFS_TITLE: "IPFS 去中心化网络" LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 [IPFS (星际文件系统)](https://ipfs.tech/) 去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" - IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行" IPFS_INIT_WELCOME: "[IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能" IPFS_BANLIST_PUBLISHED: "[IPFS] 已更新封禁列表到 IPFS,并一同更新了 IPNS 记录" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 30ceb790e2..4ad73b8b05 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -496,4 +496,13 @@ GUI_MENU_QUICK_OPERATIONS: "快速操作" GUI_MENU_SHOW_WINDOW: "打开主窗口" GUI_MENU_STATS: "统计数据" GUI_MENU_STATS_BANNED: "已封禁 {} 个 Peer ({} 个 IP 地址)" -GUI_MENU_STATS_DOWNLOADER: "已连接 {}/{} 个下载器" \ No newline at end of file +GUI_MENU_STATS_DOWNLOADER: "已连接 {}/{} 个下载器" +PORT_MAPPER_PORT_MAPPING: "[PortMapper] 正在尝试为端口 {}/{} 创建自动端口映射……" +PORT_MAPPER_PORT_MAPPED: "[PortMapper] 已在网卡 {} 的网关上上为本地端口 {}/{} 创建了一个端口映射,外部端口为:{} (外部 IP: {});TTL:{} 秒" +PORT_MAPPER_PORT_MAPPED_BUT_INTERNAL_ADDRESS: "[PortMapper] 需要注意!尽管 PortMapper 已成功创建了一个或者多个端口映射,但它们的外部地址似乎都是专用 IP 地址,这通常意味着您处于双层 NAT 之后(例如:您的设备连接者一台路由器,但这台路由器处于同为路由模式的光猫之下),端口映射可能不起作用。" +PORT_MAPPER_PORT_MAPPING_FAILED: "[PortMapper] 在网卡 {} 上创建/更新端口映射 {}/{} 失败,正在重试;如果频繁出现此提示,请检查是否设备接入了多个网络(如:Tailscale)" +LAB_EXPERIMENT_IPFS_TITLE: "IPFS 去中心化网络" +LAB_EXPERIMENT_IPFS_DESCRIPTION: "参与此实验后,测试版 [IPFS (星际文件系统)](https://ipfs.tech/) 去中心化网络将在 PeerBanHelper 上启用。\nIPFS (星际文件系统) 是一个无中心服务器的分布式网络,每一台计算机都是 IPFS 网络中的一个节点。IPFS 灵活且富有弹性,您可以通过 IPFS 存储和查找文件和传递数据或资源,并且随着资源变得逐渐热门,速度和可访问性都会自动改善。当一个数据不再被任何节点需要(且无人刻意保留它)时,它也会随着时间推移而从网络中自动淘汰移除。" +IPFS_INIT_FAILED: "[IPFS] 初始化 Kubo IPFS RPC 失败,IPFS 功能将不可用,请确保 Kubo IPFS 正在运行" +IPFS_INIT_WELCOME: "[IPFS] 已成功连接到 Kubo IPFS RPC,版本 {}。PeerBanHelper 已成功通过 Kubo 连接 IPFS 网络,并提供扩展功能" +IPFS_BANLIST_PUBLISHED: "[IPFS] 已更新封禁列表到 IPFS,并一同更新了 IPNS 记录" \ No newline at end of file From 449cb107203edb848c124321bd107e377e482737 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Sun, 1 Dec 2024 13:30:21 +0800 Subject: [PATCH 074/232] =?UTF-8?q?=E6=94=AF=E6=8C=81ipfs://?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/subscribe/editRuleItemModal.vue | 17 +++++++++++++---- .../components/subscribe/locale/en-US.ts | 1 + .../components/subscribe/locale/zh-CN.ts | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/webui/src/views/rule-management/components/subscribe/editRuleItemModal.vue b/webui/src/views/rule-management/components/subscribe/editRuleItemModal.vue index e174c47514..7ed350d7e7 100644 --- a/webui/src/views/rule-management/components/subscribe/editRuleItemModal.vue +++ b/webui/src/views/rule-management/components/subscribe/editRuleItemModal.vue @@ -38,11 +38,11 @@ diff --git a/webui/src/views/settings/components/config/components/push/editPush.vue b/webui/src/views/settings/components/config/components/push/editPush.vue new file mode 100644 index 0000000000..65ecc5e26b --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/editPush.vue @@ -0,0 +1,172 @@ + + + diff --git a/webui/src/views/settings/components/config/components/push/forms/mailForm.vue b/webui/src/views/settings/components/config/components/push/forms/mailForm.vue new file mode 100644 index 0000000000..5e9c918082 --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/forms/mailForm.vue @@ -0,0 +1,84 @@ + + diff --git a/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue b/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue new file mode 100644 index 0000000000..463b72a01c --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue b/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue new file mode 100644 index 0000000000..79dca5075c --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue @@ -0,0 +1,16 @@ + + diff --git a/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue b/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue new file mode 100644 index 0000000000..a3fb22370a --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue @@ -0,0 +1,13 @@ + + diff --git a/webui/src/views/settings/components/config/components/push/pushCard.vue b/webui/src/views/settings/components/config/components/push/pushCard.vue new file mode 100644 index 0000000000..74c367aec0 --- /dev/null +++ b/webui/src/views/settings/components/config/components/push/pushCard.vue @@ -0,0 +1,98 @@ + + + diff --git a/webui/src/views/settings/components/config/index.vue b/webui/src/views/settings/components/config/index.vue index 9887ef437c..73c4344c27 100644 --- a/webui/src/views/settings/components/config/index.vue +++ b/webui/src/views/settings/components/config/index.vue @@ -55,6 +55,8 @@ + +
@@ -83,6 +85,7 @@ import lookup from './components/lookup.vue' import performance from './components/performance.vue' import persist from './components/persist.vue' import proxy from './components/proxy.vue' +import push from './components/push.vue' import webui from './components/webui.vue' const endpointStore = useEndpointStore() diff --git a/webui/src/views/settings/components/config/locale/en-US.ts b/webui/src/views/settings/components/config/locale/en-US.ts index 448c1cd2e9..7e2f105e5f 100644 --- a/webui/src/views/settings/components/config/locale/en-US.ts +++ b/webui/src/views/settings/components/config/locale/en-US.ts @@ -75,5 +75,44 @@ export default { 'page.settings.tab.config.performance.title': 'Performance', 'page.settings.tab.config.performance.useEcoQOS': 'Use Windows EcoQos API', 'page.settings.tab.config.performance.useEcoQOS.tips': - 'Enable {link} on Windows Platform for power saving, the program performance will reduce and cronjobs may delay' + 'Enable {link} on Windows Platform for power saving, the program performance will reduce and cronjobs may delay', + + 'page.settings.tab.config.push.title': 'Message Push', + 'page.settings.tab.config.push.description': + 'By configuring message push, you can receive message push from PBH', + 'page.settings.tab.config.push.add': 'New', + 'page.settings.tab.config.push.edit': 'Edit', + 'page.settings.tab.config.push.deleteConfirm': 'Are you sure to delete?', + 'page.settings.tab.config.push.form.title.new': 'New push channel', + 'page.settings.tab.config.push.form.title.edit': 'Edit push channel', + 'page.settings.tab.config.push.form.name': 'Name', + 'page.settings.tab.config.push.form.name.placeholder': 'Enter a unique name', + 'page.settings.tab.config.push.form.type': 'Type', + 'page.settings.tab.config.push.form.type.smtp': 'E-Mail', + 'page.settings.tab.config.push.form.type.pushplus': 'Push+', + 'page.settings.tab.config.push.form.type.serverchan': 'ServerChan', + 'page.settings.tab.config.push.form.type.telegram': 'Telegram', + + 'page.settings.tab.config.push.form.stmp.host': 'Host', + 'page.settings.tab.config.push.form.stmp.port': 'Port', + 'page.settings.tab.config.push.form.stmp.sender': 'Sender', + 'page.settings.tab.config.push.form.stmp.senderName': 'Sender Name', + 'page.settings.tab.config.push.form.stmp.auth': 'Enable Auth', + 'page.settings.tab.config.push.form.stmp.authInfo': 'Auth Info', + 'page.settings.tab.config.push.form.stmp.username': 'Username', + 'page.settings.tab.config.push.form.stmp.password': 'Password', + 'page.settings.tab.config.push.form.stmp.encryption': 'Encryption', + 'page.settings.tab.config.push.form.stmp.receivers': 'Receivers', + 'page.settings.tab.config.push.form.stmp.receivers.placeholder': + "Enter one receivers, then press 'Enter'", + 'page.settings.tab.config.push.form.stmp.sendPartial': 'Send Partial', + + 'page.settings.tab.config.push.form.pushplus.token': 'Token', + 'page.settings.tab.config.push.form.pushplus.topic': 'Topic', + 'page.settings.tab.config.push.form.pushplus.template': 'Template', + 'page.settings.tab.config.push.form.pushplus.channel': 'Channel', + + 'page.settings.tab.config.push.form.action.ok': 'Ok', + 'page.settings.tab.config.push.form.action.cancel': 'Cancel', + 'page.settings.tab.config.push.form.action.test': 'Test' } diff --git a/webui/src/views/settings/components/config/locale/zh-CN.ts b/webui/src/views/settings/components/config/locale/zh-CN.ts index ae138ab8dc..6eef7f33b1 100644 --- a/webui/src/views/settings/components/config/locale/zh-CN.ts +++ b/webui/src/views/settings/components/config/locale/zh-CN.ts @@ -74,5 +74,43 @@ export default { 'page.settings.tab.config.performance.title': '性能', 'page.settings.tab.config.performance.useEcoQOS': '使用 Windows EcoQos API', 'page.settings.tab.config.performance.useEcoQOS.tips': - '启用 Windows 平台上的 {link}以节约能源消耗,程序运行速度将降低,定时任务可能推迟' + '启用 Windows 平台上的 {link}以节约能源消耗,程序运行速度将降低,定时任务可能推迟', + + 'page.settings.tab.config.push.title': '消息通知', + 'page.settings.tab.config.push.description': + '配置消息通知,当有新的事件发生时,将会通过消息通知的方式通知您', + 'page.settings.tab.config.push.add': '新增', + 'page.settings.tab.config.push.edit': '编辑', + 'page.settings.tab.config.push.deleteConfirm': '确定删除?', + 'page.settings.tab.config.push.form.title.new': '新增推送渠道', + 'page.settings.tab.config.push.form.title.edit': '编辑推送渠道', + 'page.settings.tab.config.push.form.name': '名称', + 'page.settings.tab.config.push.form.name.placeholder': '请输入唯一名称', + 'page.settings.tab.config.push.form.type': '类型', + 'page.settings.tab.config.push.form.type.smtp': '邮件', + 'page.settings.tab.config.push.form.type.pushplus': 'Push+', + 'page.settings.tab.config.push.form.type.serverchan': 'Server酱', + 'page.settings.tab.config.push.form.type.telegram': 'Telegram', + + 'page.settings.tab.config.push.form.stmp.host': '主机', + 'page.settings.tab.config.push.form.stmp.port': '端口号', + 'page.settings.tab.config.push.form.stmp.sender': '发件人', + 'page.settings.tab.config.push.form.stmp.senderName': '发件人名称', + 'page.settings.tab.config.push.form.stmp.auth': '启用认证', + 'page.settings.tab.config.push.form.stmp.authInfo': '认证信息', + 'page.settings.tab.config.push.form.stmp.username': '用户名', + 'page.settings.tab.config.push.form.stmp.password': '密码', + 'page.settings.tab.config.push.form.stmp.encryption': '加密方式', + 'page.settings.tab.config.push.form.stmp.receivers': '收件人', + 'page.settings.tab.config.push.form.stmp.receivers.placeholder': '输入一个按回车输入下一个', + 'page.settings.tab.config.push.form.stmp.sendPartial': '分片发送', + + 'page.settings.tab.config.push.form.pushplus.token': 'Token', + 'page.settings.tab.config.push.form.pushplus.topic': 'Topic', + 'page.settings.tab.config.push.form.pushplus.template': '模版', + 'page.settings.tab.config.push.form.pushplus.channel': 'Channel', + + 'page.settings.tab.config.push.form.action.ok': '确定', + 'page.settings.tab.config.push.form.action.cancel': '取消', + 'page.settings.tab.config.push.form.action.test': '测试' } From 9a930f5b115ac47bed75e788480233ed0c4598ec Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Thu, 5 Dec 2024 18:35:49 +0800 Subject: [PATCH 148/232] =?UTF-8?q?test=20=E5=A2=9E=E5=8A=A0loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/components/push/editPush.vue | 8 ++-- .../config/components/push/forms/mailForm.vue | 16 +++++-- .../components/push/forms/pushplusForm.vue | 48 ++++++++++++------- .../components/push/forms/serverchanForm.vue | 2 +- .../components/push/forms/telegramForm.vue | 2 +- .../settings/components/config/index.vue | 2 +- 6 files changed, 51 insertions(+), 27 deletions(-) diff --git a/webui/src/views/settings/components/config/components/push/editPush.vue b/webui/src/views/settings/components/config/components/push/editPush.vue index 65ecc5e26b..ec96a0e935 100644 --- a/webui/src/views/settings/components/config/components/push/editPush.vue +++ b/webui/src/views/settings/components/config/components/push/editPush.vue @@ -14,7 +14,7 @@ > \ No newline at end of file +const model = defineModel({ required: true }) + diff --git a/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue b/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue index 79dca5075c..0cd0af9b44 100644 --- a/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue +++ b/webui/src/views/settings/components/config/components/push/forms/serverchanForm.vue @@ -10,7 +10,7 @@ diff --git a/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue b/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue index a3fb22370a..cef1e17fd4 100644 --- a/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue +++ b/webui/src/views/settings/components/config/components/push/forms/telegramForm.vue @@ -7,7 +7,7 @@ diff --git a/webui/src/views/settings/components/config/index.vue b/webui/src/views/settings/components/config/index.vue index 73c4344c27..7a01c9f20e 100644 --- a/webui/src/views/settings/components/config/index.vue +++ b/webui/src/views/settings/components/config/index.vue @@ -56,7 +56,7 @@ - +
From 250a923d3794254d33e564ac53fa8da7973454a7 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Thu, 5 Dec 2024 18:41:47 +0800 Subject: [PATCH 149/232] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=B9=9F=E5=A5=BD?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/components/push/editPush.vue | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/webui/src/views/settings/components/config/components/push/editPush.vue b/webui/src/views/settings/components/config/components/push/editPush.vue index ec96a0e935..1dfb128938 100644 --- a/webui/src/views/settings/components/config/components/push/editPush.vue +++ b/webui/src/views/settings/components/config/components/push/editPush.vue @@ -35,8 +35,13 @@ allow-clear /> - - + + {{ t('page.settings.tab.config.push.form.type.' + PushType.Email) @@ -59,7 +64,7 @@ diff --git a/webui/src/locale/en-US/plus.ts b/webui/src/locale/en-US/plus.ts index 72129d72e6..9ec5029ef7 100644 --- a/webui/src/locale/en-US/plus.ts +++ b/webui/src/locale/en-US/plus.ts @@ -2,8 +2,12 @@ export default { 'plus.status': 'Status', 'plus.subscription': 'Subscription', 'plus.status.activated': 'Activated, thanks for supporting us :)', + 'plus.status.activated.local': 'Activated', 'plus.status.inactive': 'Inactive', 'plus.key': 'License', + 'plus.type': 'Type', + 'plus.type.local': 'Local', + 'plus.type.aifadian': 'Aifadian', 'plus.licenseTo': 'License to', 'plus.startAt': 'Issued on', 'plus.expireAt': 'Expire on', @@ -11,5 +15,8 @@ export default { 'plus.begging': "PeerBanHelper is an open source project that a group of like-minded people use to support PeerBanHelper's development. In order to better support the development of PeerBanHelper, some advanced features need to be unlocked after donation. Please buy us a cup of coffee!", 'plus.activeTips': 'Already donated? Input your license here to activate your subscription', - 'plus.activeSuccess': 'Activation successful' + 'plus.activeSuccess': 'Activation successful', + + 'plus.or': 'Or', + 'plus.try': 'Try it now for 15 days!' } diff --git a/webui/src/locale/zh-CN/plus.ts b/webui/src/locale/zh-CN/plus.ts index 9adf338f35..a0aed09ff5 100644 --- a/webui/src/locale/zh-CN/plus.ts +++ b/webui/src/locale/zh-CN/plus.ts @@ -2,8 +2,12 @@ export default { 'plus.status': '状态', 'plus.subscription': '当前订阅', 'plus.status.activated': '已激活,感谢支持 :)', + 'plus.status.activated.local': '已激活', 'plus.status.inactive': '未激活', 'plus.key': '许可证', + 'plus.type': '类型', + 'plus.type.local': '本地', + 'plus.type.aifadian': '爱发电', 'plus.licenseTo': '授权给', 'plus.startAt': '开始时间', 'plus.expireAt': '过期时间', @@ -11,5 +15,8 @@ export default { 'plus.begging': 'PeerBanHelper 是一群志同道合的人共同用爱发电的一个开源项目,为了更好地支持 PeerBanHelper 的发展,部分高级功能需要捐赠后解锁,请给我们买一杯咖啡吧!', 'plus.activeTips': '已经捐赠?在这里输入您的许可证以激活您的订阅', - 'plus.activeSuccess': '激活成功' + 'plus.activeSuccess': '激活成功', + + 'plus.or': '或者', + 'plus.try': '立即体验15天!' } diff --git a/webui/src/service/version.ts b/webui/src/service/version.ts index c3dae70202..7db9826cf0 100644 --- a/webui/src/service/version.ts +++ b/webui/src/service/version.ts @@ -55,6 +55,20 @@ export function setPHBPlusKey(key: string): Promise { }) } +export function obtainFreeTrial(): Promise { + const url = new URL( + urlJoin(useEndpointStore().endpoint, 'api/pbhplus/renewFreeLicense'), + location.href + ) + return fetch(url, { + method: 'POST', + headers: getCommonHeader() + }).then((res) => { + useEndpointStore().assertResponseLogin(res) + return res.json() + }) +} + export function getManifest(endpoint = useEndpointStore().endpoint): Promise { const url = new URL(urlJoin(endpoint, '/api/metadata/manifest'), location.href) return ( diff --git a/webui/src/stores/endpoint.ts b/webui/src/stores/endpoint.ts index a19485ff2f..d97c2d0c72 100644 --- a/webui/src/stores/endpoint.ts +++ b/webui/src/stores/endpoint.ts @@ -185,6 +185,7 @@ export const useEndpointStore = defineStore('endpoint', () => { setAuthToken, plusStatus, setPlusKey, + getPlusStatus, emitter: emitter, assertResponseLogin: (res: Response) => { if (res.status === 403) { From fbef1df8fcf238101970a1442b42ba8c13b43af0 Mon Sep 17 00:00:00 2001 From: Gaojianli <823805669hehe@gmail.com> Date: Fri, 6 Dec 2024 01:58:26 +0800 Subject: [PATCH 170/232] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=88=B1=E5=8F=91?= =?UTF-8?q?=E7=94=B5=E5=90=A7=E5=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/components/plusModal.vue | 10 ++++++++-- webui/src/locale/en-US/plus.ts | 2 ++ webui/src/locale/zh-CN/plus.ts | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/webui/src/components/plusModal.vue b/webui/src/components/plusModal.vue index d48d8f3160..834e15f417 100644 --- a/webui/src/components/plusModal.vue +++ b/webui/src/components/plusModal.vue @@ -54,12 +54,18 @@ - {{ t('plus.begging') }} + {{ + t( + status?.keyData?.type === LicenseType.LicenseLocal + ? 'plug.begging.local' + : 'plus.begging' + ) + }} support us! diff --git a/webui/src/locale/en-US/plus.ts b/webui/src/locale/en-US/plus.ts index 9ec5029ef7..cd6d82a41d 100644 --- a/webui/src/locale/en-US/plus.ts +++ b/webui/src/locale/en-US/plus.ts @@ -14,6 +14,8 @@ export default { 'plus.description': 'Description', 'plus.begging': "PeerBanHelper is an open source project that a group of like-minded people use to support PeerBanHelper's development. In order to better support the development of PeerBanHelper, some advanced features need to be unlocked after donation. Please buy us a cup of coffee!", + 'plug.begging.local': + ' PeerBanHelper is a non-profit, open-source free software. The free license authorizes personal use on this computer. You may not resell it or use it to violate the terms of service. If PeerBanHelper has been helpful to you, please consider supporting us on Afdian', 'plus.activeTips': 'Already donated? Input your license here to activate your subscription', 'plus.activeSuccess': 'Activation successful', diff --git a/webui/src/locale/zh-CN/plus.ts b/webui/src/locale/zh-CN/plus.ts index a0aed09ff5..589bcfc02e 100644 --- a/webui/src/locale/zh-CN/plus.ts +++ b/webui/src/locale/zh-CN/plus.ts @@ -14,6 +14,8 @@ export default { 'plus.description': '说明', 'plus.begging': 'PeerBanHelper 是一群志同道合的人共同用爱发电的一个开源项目,为了更好地支持 PeerBanHelper 的发展,部分高级功能需要捐赠后解锁,请给我们买一杯咖啡吧!', + 'plug.begging.local': + 'PeerBanHelper 是一个非营利,开放源代码的免费软件。免费许可证授权这台计算机的个人用途,您不得重新出售或者用于违反服务条款的用途。如果 PeerBanHelper 帮助到了你,请考虑在爱发电上捐赠支持我们:', 'plus.activeTips': '已经捐赠?在这里输入您的许可证以激活您的订阅', 'plus.activeSuccess': '激活成功', From 0aaca3a9b2718c87f9ece284d6a8f4cd08ed95d1 Mon Sep 17 00:00:00 2001 From: Gaojianli <823805669hehe@gmail.com> Date: Fri, 6 Dec 2024 02:01:27 +0800 Subject: [PATCH 171/232] fix lint --- webui/src/components/plusModal.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/src/components/plusModal.vue b/webui/src/components/plusModal.vue index 834e15f417..cc2c355f86 100644 --- a/webui/src/components/plusModal.vue +++ b/webui/src/components/plusModal.vue @@ -87,7 +87,7 @@ {{ t('plus.or') }}   - {{ t('plus.try') }} + {{ t('plus.try') }} From a2689eb6aef985a04de2e9370b325721a05db750 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Fri, 6 Dec 2024 02:03:01 +0800 Subject: [PATCH 172/232] =?UTF-8?q?=E6=8D=A2=E6=8D=A2=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/lang/en_us/messages.yml | 2 +- src/main/resources/lang/messages_fallback.yml | 2 +- src/main/resources/lang/zh_cn/messages.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/lang/en_us/messages.yml b/src/main/resources/lang/en_us/messages.yml index 725e946375..d13ae17fbc 100644 --- a/src/main/resources/lang/en_us/messages.yml +++ b/src/main/resources/lang/en_us/messages.yml @@ -529,4 +529,4 @@ FREE_LICENSE_RENEW_SUCCESS: "A new license has been generated and activated." FREE_LICENSE_RENEW_STILL_ACTIVE: "The current license is still active and does not need to be regenerated." FREE_LICENSE_SOURCE: "Locally generated free license." FREE_LICENSE_LICENSE_TO: "{} for personal use." -FREE_LICENSE_DESCRIPTION: "PeerBanHelper is a non-profit, open-source free software. The free license authorizes personal use on this computer. You may not resell it or use it to violate the terms of service. If PeerBanHelper has been helpful to you, please consider [supporting us on Afdian](https://afdian.com/a/Ghost_chu)." +FREE_LICENSE_DESCRIPTION: "Local generated renewable free license, for personal use only." diff --git a/src/main/resources/lang/messages_fallback.yml b/src/main/resources/lang/messages_fallback.yml index bba7f4c7b8..16b32cf518 100644 --- a/src/main/resources/lang/messages_fallback.yml +++ b/src/main/resources/lang/messages_fallback.yml @@ -527,4 +527,4 @@ FREE_LICENSE_RENEW_SUCCESS: "新的许可证已生成并激活" FREE_LICENSE_RENEW_STILL_ACTIVE: "当前许可证仍在有效期内,无需重新生成" FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" -FREE_LICENSE_DESCRIPTION: "PeerBanHelper 是一个非营利,开放源代码的免费软件。免费许可证授权这台计算机的个人用途,您不得重新出售或者用于违反服务条款的用途。如果 PeerBanHelper 帮助到了你,请考虑[在爱发电上捐赠支持我们](https://afdian.com/a/Ghost_chu)。" \ No newline at end of file +FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" \ No newline at end of file diff --git a/src/main/resources/lang/zh_cn/messages.yml b/src/main/resources/lang/zh_cn/messages.yml index 71cb7ee173..0de7a2100c 100644 --- a/src/main/resources/lang/zh_cn/messages.yml +++ b/src/main/resources/lang/zh_cn/messages.yml @@ -525,4 +525,4 @@ FREE_LICENSE_RENEW_SUCCESS: "新的许可证已生成并激活" FREE_LICENSE_RENEW_STILL_ACTIVE: "当前许可证仍在有效期内,无需重新生成" FREE_LICENSE_SOURCE: "本地生成的免费许可证" FREE_LICENSE_LICENSE_TO: "{} 用于个人用途" -FREE_LICENSE_DESCRIPTION: "PeerBanHelper 是一个非营利,开放源代码的免费软件。免费许可证授权这台计算机的个人用途,您不得重新出售或者用于违反服务条款的用途。如果 PeerBanHelper 帮助到了你,请考虑[在爱发电上捐赠支持我们](https://afdian.com/a/Ghost_chu)。" \ No newline at end of file +FREE_LICENSE_DESCRIPTION: "本地生成的循环免费许可证,仅用于个人用途" \ No newline at end of file From e35695186d8ecb70caf916f98da467b8b43175e6 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 6 Dec 2024 13:21:13 +0800 Subject: [PATCH 173/232] =?UTF-8?q?=E6=88=91=E4=B8=8D=E6=83=B3=E6=8D=90?= =?UTF-8?q?=E8=B5=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/locale/en-US/plus.ts | 2 +- webui/src/locale/zh-CN/plus.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/src/locale/en-US/plus.ts b/webui/src/locale/en-US/plus.ts index cd6d82a41d..feb8fd487d 100644 --- a/webui/src/locale/en-US/plus.ts +++ b/webui/src/locale/en-US/plus.ts @@ -20,5 +20,5 @@ export default { 'plus.activeSuccess': 'Activation successful', 'plus.or': 'Or', - 'plus.try': 'Try it now for 15 days!' + 'plus.try': "I don't want to donate" } diff --git a/webui/src/locale/zh-CN/plus.ts b/webui/src/locale/zh-CN/plus.ts index 589bcfc02e..ad6e0f6dc9 100644 --- a/webui/src/locale/zh-CN/plus.ts +++ b/webui/src/locale/zh-CN/plus.ts @@ -20,5 +20,5 @@ export default { 'plus.activeSuccess': '激活成功', 'plus.or': '或者', - 'plus.try': '立即体验15天!' + 'plus.try': '我不想捐赠' } From b406ac5aafe55b20e59b1becf725925a8141fa5e Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Fri, 6 Dec 2024 13:31:48 +0800 Subject: [PATCH 174/232] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E8=AE=B8=E5=8F=AF?= =?UTF-8?q?=E8=AF=81=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=B3=A8=E5=86=8C=E7=88=B1?= =?UTF-8?q?=E5=8F=91=E7=94=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/components/plusModal.vue | 13 +++++++++---- webui/src/locale/en-US/plus.ts | 2 +- webui/src/locale/zh-CN/plus.ts | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/webui/src/components/plusModal.vue b/webui/src/components/plusModal.vue index cc2c355f86..1b2af27483 100644 --- a/webui/src/components/plusModal.vue +++ b/webui/src/components/plusModal.vue @@ -14,7 +14,7 @@ style="padding-left: 30px; padding-right: 30px" size="large" > - + {{ @@ -71,7 +71,12 @@ support us! - + - - - - {{ t('page.settings.tab.config.plus.button') }} - - import type { Config } from '@/api/model/config' import { GetConfig, SaveConfig } from '@/service/settings' -import { useEndpointStore } from '@/stores/endpoint' import { reactive, ref } from 'vue' import { useI18n } from 'vue-i18n' import { useRequest } from 'vue-request' @@ -88,7 +82,6 @@ import proxy from './components/proxy.vue' import push from './components/push.vue' import webui from './components/webui.vue' -const endpointStore = useEndpointStore() const { t } = useI18n() const form = reactive({ server: {}, diff --git a/webui/src/views/settings/locale/en-US.ts b/webui/src/views/settings/locale/en-US.ts index 46bb63465a..74e5ce89c2 100644 --- a/webui/src/views/settings/locale/en-US.ts +++ b/webui/src/views/settings/locale/en-US.ts @@ -1,6 +1,6 @@ import ConfigLocale from '../components/config/locale/en-US' import InfoLocale from '../components/info/locale/en-US' -import LabsLocalel from '../components/labs/locale/en-US' +import LabsLocale from '../components/labs/locale/en-US' import ProfileLocale from '../components/profile/locale/en-US' export default { 'page.settings.tab.config': 'Settings', @@ -8,5 +8,5 @@ export default { ...ProfileLocale, ...ConfigLocale, ...InfoLocale, - ...LabsLocalel + ...LabsLocale } diff --git a/webui/src/views/settings/locale/zh-CN.ts b/webui/src/views/settings/locale/zh-CN.ts index cb86eee840..8723d0afd1 100644 --- a/webui/src/views/settings/locale/zh-CN.ts +++ b/webui/src/views/settings/locale/zh-CN.ts @@ -1,6 +1,6 @@ import ConfigLocale from '../components/config/locale/zh-CN' import InfoLocale from '../components/info/locale/zh-CN' -import LabsLocalel from '../components/labs/locale/zh-CN' +import LabsLocale from '../components/labs/locale/zh-CN' import ProfileLocale from '../components/profile/locale/zh-CN' export default { 'page.settings.tab.config': '基础设置', @@ -8,5 +8,5 @@ export default { ...ProfileLocale, ...ConfigLocale, ...InfoLocale, - ...LabsLocalel + ...LabsLocale } From e65b93ed3370c3b1b8e31b0cc171d3e02b0040b2 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Sat, 7 Dec 2024 14:50:03 +0800 Subject: [PATCH 187/232] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghostchu/peerbanhelper/push/impl/PushPlusPushProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/PushPlusPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/PushPlusPushProvider.java index 38617ecde3..09bbe58005 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/PushPlusPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/PushPlusPushProvider.java @@ -39,7 +39,6 @@ public ConfigurationSection saveYaml() { section.set("type", "pushplus"); section.set("token", config.getToken()); section.set("topic", config.getTopic()); - section.set("template", config.getTemplate()); section.set("channel", config.getChannel()); return section; } From bec90ec2c3bc462446763c5bbdda11978f108985 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Sat, 7 Dec 2024 16:58:45 +0800 Subject: [PATCH 188/232] =?UTF-8?q?=E6=8E=A8=E9=80=81+=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E4=BA=86md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/api/model/push.ts | 1 - .../config/components/push/forms/pushplusForm.vue | 10 ++-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/webui/src/api/model/push.ts b/webui/src/api/model/push.ts index 49c7fee1cf..fa7a49bc87 100644 --- a/webui/src/api/model/push.ts +++ b/webui/src/api/model/push.ts @@ -43,7 +43,6 @@ export interface ServerChanConfig { export interface PushPlusConfig { token: string topic: string - template: string channel: string } diff --git a/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue b/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue index 35feb752dc..f94ba55556 100644 --- a/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue +++ b/webui/src/views/settings/components/config/components/push/forms/pushplusForm.vue @@ -6,12 +6,6 @@ > - - - @@ -23,8 +17,8 @@ diff --git a/webui/src/views/settings/components/labs/locale/en-US.ts b/webui/src/views/settings/components/labs/locale/en-US.ts index 0a93d918b2..ceef2a975d 100644 --- a/webui/src/views/settings/components/labs/locale/en-US.ts +++ b/webui/src/views/settings/components/labs/locale/en-US.ts @@ -1,5 +1,8 @@ export default { 'page.settings.tab.labs': 'Labs', + 'page.settings.tab.labs.enable': 'Enable experimental features', + 'page.settings.tab.labs.enable.tips': + 'By disabling Labs, you can avoid participating in any experiments in the future', 'page.settings.tab.labs.welcome': 'Welcome to Labs', 'page.settings.tab.labs.welcome.content': 'We occasionally make experimental changes to some features of PeerBanHelper. These experiments are ongoing; some will be included in stable version; some might be discontinued. We hope most of them will receive your feedback, be improved, and eventually become part of PeerBanHelper. This is the purpose of the PeerBanHelper Lab.\nIf you have any suggestions or ideas, feel free to submit an issue or a pull request on {github}. Each experiment is randomly enabled for a subset of PeerBanHelper users upon release. You can always use the toggle below to choose whether to disable or enable these experiments.', diff --git a/webui/src/views/settings/components/labs/locale/zh-CN.ts b/webui/src/views/settings/components/labs/locale/zh-CN.ts index 1f9393837d..db0b271a7f 100644 --- a/webui/src/views/settings/components/labs/locale/zh-CN.ts +++ b/webui/src/views/settings/components/labs/locale/zh-CN.ts @@ -1,5 +1,7 @@ export default { 'page.settings.tab.labs': '实验室', + 'page.settings.tab.labs.enable': '启用实验性功能', + 'page.settings.tab.labs.enable.tips': '通过禁用实验室功能,你可以避免在未来参与任何实验', 'page.settings.tab.labs.welcome': '欢迎来到实验室', 'page.settings.tab.labs.welcome.content': '我们有时会对 PeerBanHelper 的一些功能做出实验性的更改。这些实验正在进行中,有些可能进入正式版本,有的则可能被放弃。我们希望其中的多数会获得您的反馈意见,得以改进,并最终成为 PeerBanHelper 的一部分。PeerBanHelper 实验室的作用就在于此。\n如果您有任何建议或者想法,欢迎在 {github} 上提交 Issue 或者 PR。每个实验推出时都会随机的在一部分用户的 PeerBanHelper 上启用,您随时可以通过下面的开关决定禁用还是启用这些实验。', From a1b8db7994196b9df3e4961e143a65d3313dfe27 Mon Sep 17 00:00:00 2001 From: Gaojianli <823805669hehe@gmail.com> Date: Sun, 8 Dec 2024 01:35:56 +0800 Subject: [PATCH 198/232] add indent config --- .../views/custom-script/components/editor/index.vue | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/webui/src/views/custom-script/components/editor/index.vue b/webui/src/views/custom-script/components/editor/index.vue index e1bd234189..6eb6a5e8ac 100644 --- a/webui/src/views/custom-script/components/editor/index.vue +++ b/webui/src/views/custom-script/components/editor/index.vue @@ -4,7 +4,13 @@ v-model:value="model" theme="vs-dark" class="editor" - :options="MONACO_EDITOR_OPTIONS" + :options="{ + automaticLayout: true, + formatOnType: true, + formatOnPaste: true, + foldingStrategy: 'indentation', + autoIndent: 'brackets' + }" :default-language="AV" @mount="handleMount" @change="handleChange" @@ -48,11 +54,6 @@ loader.config({ } }) const AV = 'aviatorscript' -const MONACO_EDITOR_OPTIONS = { - automaticLayout: true, - formatOnType: true, - formatOnPaste: true -} type onMountF = VueMonacoEditorEmitsOptions['mount'] type editor = Parameters[0] // monacoEditor.editor.IStandaloneCodeEditor const editorRef = shallowRef() From ecd2eaa803e15a07699e3e4a94d6132861374359 Mon Sep 17 00:00:00 2001 From: Gaojianli <823805669hehe@gmail.com> Date: Sun, 8 Dec 2024 01:39:18 +0800 Subject: [PATCH 199/232] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=9C=88=E4=BB=A5?= =?UTF-8?q?=E4=B8=8A=E5=A4=A9=E6=95=B0=EF=BC=8Cfix=20#795?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/utils/time.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/webui/src/utils/time.ts b/webui/src/utils/time.ts index e99d7cf0ba..232cced4b0 100644 --- a/webui/src/utils/time.ts +++ b/webui/src/utils/time.ts @@ -18,17 +18,9 @@ function parseTimeDuration(ms: number) { const days = totalDays % 7 const totalWeeks = Math.floor(totalDays / 7) - const weeks = totalWeeks % 4 - - const totalMonths = Math.floor(totalWeeks / 4) - const months = totalMonths % 12 - - const years = Math.floor(totalMonths / 12) return { - years, - months, - weeks, + weeks: totalWeeks, days, hours, minutes, From d59e699e0f7f3189b54e506287ef3fc28adbb654 Mon Sep 17 00:00:00 2001 From: Gaojianli <823805669hehe@gmail.com> Date: Sun, 8 Dec 2024 02:06:03 +0800 Subject: [PATCH 200/232] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=9C=A8=E9=BB=91=E6=9A=97=E6=A8=A1=E5=BC=8F=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/components/iconFont.ts | 2 +- .../views/settings/components/info/index.vue | 31 +++++++++++++++++-- webui/src/views/settings/index.vue | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/webui/src/components/iconFont.ts b/webui/src/components/iconFont.ts index 0d536c582f..316ba3daa6 100644 --- a/webui/src/components/iconFont.ts +++ b/webui/src/components/iconFont.ts @@ -2,7 +2,7 @@ import { Icon } from '@arco-design/web-vue' import { defineComponent, h } from 'vue' const IconFont = Icon.addFromIconFontCn({ - src: 'https://at.alicdn.com/t/c/font_4646549_lud1rt6o4xr.js' + src: 'https://at.alicdn.com/t/c/font_4646549_qn0pz8axvi.js' }) export function genIconComponent(type: string) { diff --git a/webui/src/views/settings/components/info/index.vue b/webui/src/views/settings/components/info/index.vue index 25b867e2db..b0dc77e79f 100644 --- a/webui/src/views/settings/components/info/index.vue +++ b/webui/src/views/settings/components/info/index.vue @@ -176,8 +176,33 @@ " :content="t('page.settings.tab.info.version.webui.versionNotMatch')" > - - + + + + + + @@ -455,7 +480,7 @@ diff --git a/webui/src/components/plusTryModal.vue b/webui/src/components/plusTryModal.vue new file mode 100644 index 0000000000..1bd6da6d48 --- /dev/null +++ b/webui/src/components/plusTryModal.vue @@ -0,0 +1,64 @@ + + diff --git a/webui/src/locale/en-US/plus.ts b/webui/src/locale/en-US/plus.ts index 2e6c760d53..1a590bd437 100644 --- a/webui/src/locale/en-US/plus.ts +++ b/webui/src/locale/en-US/plus.ts @@ -20,5 +20,10 @@ export default { 'plus.activeSuccess': 'Activation successful', 'plus.or': 'Or', - 'plus.try': "I don't want to donate" + 'plus.try': "I don't want to donate", + + 'plus.tryModal.title': 'Get Plus subscription for free', + 'plus.tryModal.content1': + "Even if you don't want to donate, PBH-BTN can still provide you with a 15-day Plus subscription. After 15 days, you can activate it again.", + 'plus.tryModal.content2': `PBH-BTN also maintains multiple online services and infrastructure that require continuous investment, such as GeoIP DB distribution, BTN, public BitTorrent Tracker, and China CDN acceleration. All these online services require a certain cost every month, which increases with the increase of users. If PBH helps you, please consider donating to us. For the price of a cup of coffee, you can get a permanent license for PBH Plus, and help us go further in maintaining the BitTorrent environment. In the future, we will continue to provide more SaaS services to Plus subscribers.` } diff --git a/webui/src/locale/zh-CN/plus.ts b/webui/src/locale/zh-CN/plus.ts index d335300a4f..5d5a016cfc 100644 --- a/webui/src/locale/zh-CN/plus.ts +++ b/webui/src/locale/zh-CN/plus.ts @@ -20,5 +20,13 @@ export default { 'plus.activeSuccess': '激活成功', 'plus.or': '或者', - 'plus.try': '我不想捐赠' + 'plus.try': '我不想捐赠', + + 'plus.tryModal.title': '免费激活 Plus 订阅', + 'plus.tryModal.content1': + ' 即使你不想捐赠,PBH-BTN 依旧可以向你提供15天的 Plus 订阅,在15天到期后,可以重新进行上述步骤激活。', + 'plus.tryModal.content2': `PBH-BTN 同时维护着多个需要持续投入的在线服务和基础设施,例如 GeoIP DB分发、BTN、公共 BitTorrent Tracker 和国内 CDN 加速,所有这些在线服务均需每月消耗一定的成本,并随着用户的增加而增多。 如果 + PBH 帮助到了你,请考虑捐赠我们。只需一杯咖啡的价格,您就可以获得一个 PBH Plus + 的永久许可证,并能帮助我们在维护 BitTorrent + 环境的道路上走得更远。未来我们也将不断努力提供更多的 SaaS 服务给 Plus 订阅用户。` } From 8e90a89d531f253e8d77ed5e34fd915251a72d53 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 9 Dec 2024 13:29:55 +0800 Subject: [PATCH 215/232] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=88=B0=E5=B0=8F=E9=A9=BC=E5=B3=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/push/impl/ServerChanPushProvider.java | 8 ++++---- .../peerbanhelper/push/impl/TelegramPushProvider.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/ServerChanPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/ServerChanPushProvider.java index af6dc6320c..a22d4e12a8 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/ServerChanPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/ServerChanPushProvider.java @@ -49,7 +49,7 @@ public ConfigurationSection saveYaml() { section.set("type", "serverchan"); section.set("sendkey", config.getSendKey()); section.set("channel", config.getChannel()); - section.set("openid", config.getOpenid()); + section.set("openid", config.getOpenId()); return section; } @@ -80,8 +80,8 @@ public boolean push(String title, String content) throws Exception { if (config.getChannel() != null) { map.put("channel", config.getChannel()); } - if (config.getOpenid() != null) { - map.put("openid", config.getOpenid()); + if (config.getOpenId() != null) { + map.put("openid", config.getOpenId()); } HttpResponse resp = HTTPUtil.retryableSend(HTTPUtil.getHttpClient(false, null), MutableRequest.POST("https://sctapi.ftqq.com/" + config.getSendKey() + ".send" @@ -100,7 +100,7 @@ public boolean push(String title, String content) throws Exception { public static class Config{ private String sendKey; private String channel; - private String openid; + private String openId; } @NoArgsConstructor diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/TelegramPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/TelegramPushProvider.java index 83b091f48b..8b7ca15c13 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/TelegramPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/TelegramPushProvider.java @@ -59,7 +59,7 @@ public ConfigurationSection saveYaml() { YamlConfiguration section = new YamlConfiguration(); section.set("type", "telegram"); section.set("token", config.getToken()); - section.set("chatid", config.getChatid()); + section.set("chatid", config.getChatId()); return section; } @@ -67,7 +67,7 @@ public ConfigurationSection saveYaml() { public boolean push(String title, String content) throws Exception { String markdown = "*" + title + "*\n" + content; Map map = new HashMap<>(); - map.put("chat_id", config.getChatid()); + map.put("chat_id", config.getChatId()); map.put("caption", markdown); map.put("text", markdown); map.put("photo", "https://raw.githubusercontent.com/PBH-BTN/PeerBanHelper/refs/heads/master/src/main/resources/assets/icon.png"); @@ -88,7 +88,7 @@ public boolean push(String title, String content) throws Exception { @Data public static class Config{ private String token; - private String chatid; + private String chatId; } @NoArgsConstructor From 471c62df96778abb73cf4aa28933702b02248794 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Mon, 9 Dec 2024 14:10:37 +0800 Subject: [PATCH 216/232] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=80=92=E8=AE=A1?= =?UTF-8?q?=E6=97=B6=E5=8F=AF=E8=83=BD=E5=8F=98=E6=88=90=E8=B4=9F=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webui/src/components/plusTryModal.vue | 32 +++++++++++++++++++-------- webui/src/locale/en-US/plus.ts | 4 +++- webui/src/locale/zh-CN/plus.ts | 5 +++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/webui/src/components/plusTryModal.vue b/webui/src/components/plusTryModal.vue index 1bd6da6d48..de914dde48 100644 --- a/webui/src/components/plusTryModal.vue +++ b/webui/src/components/plusTryModal.vue @@ -9,11 +9,13 @@ @@ -22,25 +24,37 @@ import { obtainFreeTrial } from '@/service/version' import { useEndpointStore } from '@/stores/endpoint' import { Message } from '@arco-design/web-vue' -import { computed, ref } from 'vue' +import { computed, onUnmounted, ref } from 'vue' import { useI18n } from 'vue-i18n' + +const DEFAULT_COUNTDOWN = 10 + const { t } = useI18n() const timer = ref() -const countDown = ref(10) +const countDown = ref(DEFAULT_COUNTDOWN) const visible = ref(false) const okDisabled = computed(() => countDown.value !== 0) defineExpose({ try: () => { - countDown.value = 10 + countDown.value = DEFAULT_COUNTDOWN timer.value = setInterval(() => { countDown.value-- if (countDown.value === 0) { - if (timer.value) clearInterval(timer.value) + if (timer.value) { + clearInterval(timer.value) + timer.value = null + } } }, 1000) visible.value = true } }) +onUnmounted(() => { + if (timer.value) { + clearInterval(timer.value) + timer.value = null + } +}) const loading = ref(false) const endpointStore = useEndpointStore() const handleOk = async () => { diff --git a/webui/src/locale/en-US/plus.ts b/webui/src/locale/en-US/plus.ts index 1a590bd437..165c4f4783 100644 --- a/webui/src/locale/en-US/plus.ts +++ b/webui/src/locale/en-US/plus.ts @@ -25,5 +25,7 @@ export default { 'plus.tryModal.title': 'Get Plus subscription for free', 'plus.tryModal.content1': "Even if you don't want to donate, PBH-BTN can still provide you with a 15-day Plus subscription. After 15 days, you can activate it again.", - 'plus.tryModal.content2': `PBH-BTN also maintains multiple online services and infrastructure that require continuous investment, such as GeoIP DB distribution, BTN, public BitTorrent Tracker, and China CDN acceleration. All these online services require a certain cost every month, which increases with the increase of users. If PBH helps you, please consider donating to us. For the price of a cup of coffee, you can get a permanent license for PBH Plus, and help us go further in maintaining the BitTorrent environment. In the future, we will continue to provide more SaaS services to Plus subscribers.` + 'plus.tryModal.content2': `PBH-BTN also maintains multiple online services and infrastructure that require continuous investment, such as GeoIP DB distribution, BTN, public BitTorrent Tracker, and China CDN acceleration. All these online services require a certain cost every month, which increases with the increase of users. If PBH helps you, please consider donating to us. For the price of a cup of coffee, you can get a permanent license for PBH Plus, and help us go further in maintaining the BitTorrent environment.`, + 'plus.tryModal.ok': 'Ok', + 'plus.tryModal.cancel': 'Cancel' } diff --git a/webui/src/locale/zh-CN/plus.ts b/webui/src/locale/zh-CN/plus.ts index 5d5a016cfc..8309b550de 100644 --- a/webui/src/locale/zh-CN/plus.ts +++ b/webui/src/locale/zh-CN/plus.ts @@ -27,6 +27,7 @@ export default { ' 即使你不想捐赠,PBH-BTN 依旧可以向你提供15天的 Plus 订阅,在15天到期后,可以重新进行上述步骤激活。', 'plus.tryModal.content2': `PBH-BTN 同时维护着多个需要持续投入的在线服务和基础设施,例如 GeoIP DB分发、BTN、公共 BitTorrent Tracker 和国内 CDN 加速,所有这些在线服务均需每月消耗一定的成本,并随着用户的增加而增多。 如果 PBH 帮助到了你,请考虑捐赠我们。只需一杯咖啡的价格,您就可以获得一个 PBH Plus - 的永久许可证,并能帮助我们在维护 BitTorrent - 环境的道路上走得更远。未来我们也将不断努力提供更多的 SaaS 服务给 Plus 订阅用户。` + 的永久许可证,并能帮助我们在维护 BitTorrent 环境的道路上走得更远。`, + 'plus.tryModal.ok': '确定', + 'plus.tryModal.cancel': '取消' } From f5fa7e155dd9e3add2091be081a35a34e08eeb3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:20:31 +0000 Subject: [PATCH 217/232] Bump com.formdev:flatlaf from 3.5.2 to 3.5.4 Bumps [com.formdev:flatlaf](https://github.com/JFormDesigner/FlatLaf) from 3.5.2 to 3.5.4. - [Release notes](https://github.com/JFormDesigner/FlatLaf/releases) - [Changelog](https://github.com/JFormDesigner/FlatLaf/blob/main/CHANGELOG.md) - [Commits](https://github.com/JFormDesigner/FlatLaf/compare/3.5.2...3.5.4) --- updated-dependencies: - dependency-name: com.formdev:flatlaf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4d6aadfc94..84480c8723 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ UTF-8 com.ghostchu.peerbanhelper.MainJumpLoader yyyyMMdd-HHmmss - 3.5.2 + 3.5.4 /opt/install4j 6.1 From 41b638aeabf7642aa2c91dffe5be498b856ad99f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:21:12 +0000 Subject: [PATCH 218/232] Bump com.formdev:flatlaf-extras from 3.5.2 to 3.5.4 Bumps [com.formdev:flatlaf-extras](https://github.com/JFormDesigner/FlatLaf) from 3.5.2 to 3.5.4. - [Release notes](https://github.com/JFormDesigner/FlatLaf/releases) - [Changelog](https://github.com/JFormDesigner/FlatLaf/blob/main/CHANGELOG.md) - [Commits](https://github.com/JFormDesigner/FlatLaf/compare/3.5.2...3.5.4) --- updated-dependencies: - dependency-name: com.formdev:flatlaf-extras dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4d6aadfc94..8bc74b8095 100644 --- a/pom.xml +++ b/pom.xml @@ -498,7 +498,7 @@ com.formdev flatlaf-extras - 3.5.2 + 3.5.4 com.offbynull.portmapper From e3d72148111bc94265e83a58a6c53ddc012b20ed Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 9 Dec 2024 22:20:03 +0800 Subject: [PATCH 219/232] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peerbanhelper/module/impl/webapi/PBHPushController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPushController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPushController.java index 3d530b1a9c..c61ea36124 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPushController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHPushController.java @@ -101,7 +101,7 @@ private void handlePushProviderPatch(Context ctx, String pushProviderName) { return; } // 可能重命名了? - pushManager.getProviderList().stream() + List.copyOf(pushManager.getProviderList()).stream() // Copy 一下来避免并发修改错误 .filter(d -> d.getName().equals(pushProviderName)) .forEach(d -> pushManager.removePushProvider(d)); if (pushManager.addPushProvider(pushProvider)) { From 803f279762fbc938ea5dfc18d09d8e6177d287e9 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 9 Dec 2024 22:42:57 +0800 Subject: [PATCH 220/232] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java index b164da77ce..6033eb660b 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java @@ -38,10 +38,10 @@ public static SmtpPushProvider loadFromYaml(String name, ConfigurationSection se var username = section.getString("username"); var password = section.getString("password"); var sender = section.getString("sender"); - var senderName = section.getString("name"); + var senderName = section.getString("name", "PeerBanHelper"); var receivers = section.getStringList("receiver"); - var encryption = Encryption.valueOf(section.getString("encryption", "STARTTLS").toUpperCase(Locale.ROOT)); - var sendPartial = section.getBoolean("sendPartial"); + var encryption = Encryption.valueOf(section.getString("encryption", "SSLTLS").toUpperCase(Locale.ROOT)); + var sendPartial = section.getBoolean("sendPartial", true); Config config = new Config(section.getString("host"), section.getInt("port"), auth, username, password, sender, senderName, receivers, encryption, sendPartial From 2e2d109aa9427627dd37bf7bb9ba2e5aa6531bbe Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 9 Dec 2024 23:12:02 +0800 Subject: [PATCH 221/232] =?UTF-8?q?=E5=90=91=20User-Agent=20=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A=E4=B8=80=E4=BA=9B=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ghostchu/peerbanhelper/Main.java | 28 +++++++++++++++++-- .../peerbanhelper/btn/BtnNetwork.java | 6 ++-- .../impl/webapi/PBHGeneralController.java | 4 +-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index b5bbf3ab9e..426f94f6b5 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -29,12 +29,14 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import oshi.SystemInfo; import javax.swing.*; import java.awt.*; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.management.ManagementFactory; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; @@ -83,6 +85,9 @@ public class Main { private static String[] startupArgs; @Getter private static long startupAt = System.currentTimeMillis(); + private static String userAgent; + public static final int PBH_BTN_PROTOCOL_IMPL_VERSION = 8; + public static final String PBH_BTN_PROTOCOL_READABLE_VERSION = "0.0.3"; public static void main(String[] args) { startupArgs = args; @@ -325,7 +330,26 @@ private static void initGUI(String[] args) { } public static String getUserAgent() { - return "PeerBanHelper/" + meta.getVersion() + " BTN-Protocol/0.0.2"; + if (userAgent != null) return userAgent; + String userAgentTemplate = "PeerBanHelper/%s (%s; %s,%s,%s) BTN-Protocol/%s BTN-Protocol-Version/%s"; + var osMXBean = ManagementFactory.getOperatingSystemMXBean(); + String release = System.getProperty("pbh.release"); + if (release == null) { + release = "unknown"; + } + String os = osMXBean.getName(); + String osVersion = osMXBean.getVersion(); + String buildNumber = "unknown"; + String codeName = ""; + try { + SystemInfo info = new SystemInfo(); + var verInfo = info.getOperatingSystem().getVersionInfo(); + buildNumber = verInfo.getBuildNumber(); + codeName = verInfo.getCodeName(); + } catch (Throwable ignored) { + } + userAgent = String.format(userAgentTemplate, meta.getVersion(), release, os, osVersion, codeName + buildNumber, PBH_BTN_PROTOCOL_READABLE_VERSION, PBH_BTN_PROTOCOL_IMPL_VERSION); + return userAgent; } private static void handleCommand(String input) { @@ -368,7 +392,7 @@ public static String decapitalize(String name) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && - Character.isUpperCase(name.charAt(0))) { + Character.isUpperCase(name.charAt(0))) { return name; } char chars[] = name.toCharArray(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java index f7f5c1d213..231d1d9081 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java +++ b/src/main/java/com/ghostchu/peerbanhelper/btn/BtnNetwork.java @@ -36,8 +36,8 @@ @Slf4j @Getter @Component +// 特别注意:该类不允许静态初始化任何内容 public class BtnNetwork implements Reloadable { - private static final int PBH_BTN_PROTOCOL_IMPL_VERSION = 8; @Getter private final Map, BtnAbility> abilities = new HashMap<>(); private final ScriptEngine scriptEngine; @@ -117,11 +117,11 @@ public void configBtnNetwork() { throw new IllegalStateException(tlUI(Lang.MISSING_VERSION_PROTOCOL_FIELD)); } int min_protocol_version = json.get("min_protocol_version").getAsInt(); - if (PBH_BTN_PROTOCOL_IMPL_VERSION < min_protocol_version) { + if (Main.PBH_BTN_PROTOCOL_IMPL_VERSION < min_protocol_version) { throw new IllegalStateException(tlUI(Lang.BTN_INCOMPATIBLE_SERVER)); } int max_protocol_version = json.get("max_protocol_version").getAsInt(); - if (PBH_BTN_PROTOCOL_IMPL_VERSION > max_protocol_version) { + if (Main.PBH_BTN_PROTOCOL_IMPL_VERSION > max_protocol_version) { throw new IllegalStateException(tlUI(Lang.BTN_INCOMPATIBLE_SERVER)); } resetScheduler(); diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java index 0911c89052..ede165da35 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java @@ -161,9 +161,9 @@ private Map generatePbhData() { } private Map generateSystemData(Context context, SystemInfo systemInfo) { - var osMXBean = ManagementFactory.getOperatingSystemMXBean(); + + Map os = new LinkedHashMap<>(); var osMXBean = ManagementFactory.getOperatingSystemMXBean(); var operatingSystem = systemInfo.getOperatingSystem(); - Map os = new LinkedHashMap<>(); if (osMXBean.getName().contains("Windows")) { os.put("os", "Windows"); os.put("version", String.valueOf(operatingSystem)); From 1070080a5e9fa92e5302e502b948161dbf0910bf Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Mon, 9 Dec 2024 23:15:17 +0800 Subject: [PATCH 222/232] =?UTF-8?q?=E6=B8=85=E7=90=86=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/webapi/PBHGeneralController.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java index ede165da35..c31208aa70 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java +++ b/src/main/java/com/ghostchu/peerbanhelper/module/impl/webapi/PBHGeneralController.java @@ -162,7 +162,8 @@ private Map generatePbhData() { private Map generateSystemData(Context context, SystemInfo systemInfo) { - Map os = new LinkedHashMap<>(); var osMXBean = ManagementFactory.getOperatingSystemMXBean(); + Map os = new LinkedHashMap<>(); + var osMXBean = ManagementFactory.getOperatingSystemMXBean(); var operatingSystem = systemInfo.getOperatingSystem(); if (osMXBean.getName().contains("Windows")) { os.put("os", "Windows"); @@ -173,15 +174,6 @@ private Map generateSystemData(Context context, SystemInfo syste } os.put("architecture", osMXBean.getArch()); os.put("cores", osMXBean.getAvailableProcessors()); - //os.put("family", operatingSystem.getFamily()); - //os.put("bitness", operatingSystem.getBitness()); - //os.put("manufacturer", operatingSystem.getManufacturer()); - //var versionInfo = operatingSystem.getVersionInfo(); - //os.put("build_number", versionInfo.getBuildNumber()); - //os.put("code_name", versionInfo.getCodeName()); - //os.put("os_version", versionInfo.getVersion()); - //os.put("boot_time", operatingSystem.getSystemBootTime()); - //os.put("up_time", operatingSystem.getSystemUptime()); var mem = generateSystemMemoryData(systemInfo.getHardware()); os.put("memory", mem); os.put("load", osMXBean.getSystemLoadAverage()); @@ -191,7 +183,6 @@ private Map generateSystemData(Context context, SystemInfo syste } private Map generateNetworkStats(Context context) { - //var clientIp = IPAddressUtil.getIPAddress(context.ip()).toCompressedString(); var userIp = IPAddressUtil.getIPAddress(userIp(context)).toCompressedString(); Map network = new LinkedHashMap<>(); var proxy = Main.getMainConfig().getInt("proxy.setting"); @@ -199,7 +190,6 @@ private Map generateNetworkStats(Context context) { network.put("use_proxy", proxy == 1 || proxy == 2 || proxy == 3); network.put("reverse_proxy", MiscUtil.isUsingReserveProxy(context)); network.put("client_ip", userIp); - //network.put("user_ip", userIp); return network; } @@ -210,10 +200,6 @@ private Map generateJvmData() { jvm.put("vendor", runtimeMXBean.getVmVendor()); jvm.put("runtime", runtimeMXBean.getVmName()); jvm.put("bitness", Short.parseShort(System.getProperty("sun.arch.data.model"))); - //jvm.put("specification", runtimeMXBean.getSpecName()); - //jvm.put("class_version", System.getProperty("java.class.version")); - //jvm.put("uptime", runtimeMXBean.getUptime()); - //jvm.put("start_time", runtimeMXBean.getStartTime()); Map mem = new LinkedHashMap<>(); mem.put("heap", generateMemoryData(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage())); mem.put("non_heap", generateMemoryData(ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage())); From de87f693d34e723da2a0eb6996dec0a7f0f1c904 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 10 Dec 2024 00:13:39 +0800 Subject: [PATCH 223/232] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=94=99=E8=AF=AF=E6=97=B6=EF=BC=8C=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ghostchu/peerbanhelper/Main.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/Main.java b/src/main/java/com/ghostchu/peerbanhelper/Main.java index 426f94f6b5..d1003aedd0 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/Main.java +++ b/src/main/java/com/ghostchu/peerbanhelper/Main.java @@ -258,7 +258,16 @@ private static YamlConfiguration loadConfiguration(File file) { configuration.load(file); } catch (IOException | InvalidConfigurationException e) { log.error("Unable to load configuration: invalid YAML configuration // 无法加载配置文件:无效的 YAML 配置,请检查是否有语法错误", e); - JOptionPane.showMessageDialog(null, "Invalid/Corrupted YAML configuration | 无效或损坏的 YAML 配置文件", String.format("Failed to read configuration: %s", file), JOptionPane.ERROR_MESSAGE); + if (!Desktop.isDesktopSupported() || System.getProperty("pbh.nogui") != null || Arrays.stream(startupArgs).anyMatch(arg -> arg.equalsIgnoreCase("nogui"))) { + try { + log.error("Bad configuration: {}", Files.readString(file.toPath())); + } catch (IOException ex) { + log.error("Unable to output the bad configuration content", ex); + } + log.error("Unable to load configuration: invalid YAML configuration // 无法加载配置文件:无效的 YAML 配置,请检查是否有语法错误", e); + } else { + JOptionPane.showMessageDialog(null, "Invalid/Corrupted YAML configuration | 无效或损坏的 YAML 配置文件", String.format("Failed to read configuration: %s", file), JOptionPane.ERROR_MESSAGE); + } System.exit(1); } return configuration; From 6ec77ee53bf411fc27ea2e91501836d6f14d6372 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 10 Dec 2024 00:15:58 +0800 Subject: [PATCH 224/232] =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../push/impl/SmtpPushProvider.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java index 6033eb660b..05cb10937c 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java @@ -77,13 +77,17 @@ public String sendMail(List email, String subject, String text) throws E mail.setCharset("UTF-8"); mail.setHostName(config.getHost()); mail.setSmtpPort(config.getPort()); - switch (config.getEncryption()) { - case STARTTLS -> mail.setStartTLSEnabled(true); - case ENFORCE_STARTTLS -> { - mail.setStartTLSEnabled(true); - mail.setStartTLSRequired(true); + try { + switch (Encryption.valueOf(config.getEncryption())) { + case STARTTLS -> mail.setStartTLSEnabled(true); + case ENFORCE_STARTTLS -> { + mail.setStartTLSEnabled(true); + mail.setStartTLSRequired(true); + } + case SSLTLS -> mail.setSSLOnConnect(true); } - case SSLTLS -> mail.setSSLOnConnect(true); + } catch (Exception e) { + log.error("Unable to load mail encryption type: {}, it's valid?", config.getEncryption(), e); } mail.setSendPartial(config.isSendPartial()); mail.setSubject(subject); @@ -140,7 +144,7 @@ public static class Config { private String sender; private String senderName; private @NotNull List receivers; - private Encryption encryption; + private String encryption; private boolean sendPartial; } } \ No newline at end of file From 62f77b8b8a40ced2abec7f371471da1a05d3e3e3 Mon Sep 17 00:00:00 2001 From: Ghost_chu Date: Tue, 10 Dec 2024 00:19:28 +0800 Subject: [PATCH 225/232] fix build --- .../com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java index 05cb10937c..65e6a7b5d8 100644 --- a/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java +++ b/src/main/java/com/ghostchu/peerbanhelper/push/impl/SmtpPushProvider.java @@ -16,7 +16,6 @@ import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import java.util.List; -import java.util.Locale; import java.util.Objects; @Slf4j @@ -40,7 +39,7 @@ public static SmtpPushProvider loadFromYaml(String name, ConfigurationSection se var sender = section.getString("sender"); var senderName = section.getString("name", "PeerBanHelper"); var receivers = section.getStringList("receiver"); - var encryption = Encryption.valueOf(section.getString("encryption", "SSLTLS").toUpperCase(Locale.ROOT)); + var encryption = section.getString("encryption", "SSLTLS"); var sendPartial = section.getBoolean("sendPartial", true); Config config = new Config(section.getString("host"), section.getInt("port"), auth, username, password, From c0f2faa9d948ddd1676c3faf708fea77a03020d0 Mon Sep 17 00:00:00 2001 From: paulzzh <28055560+paulzzh@users.noreply.github.com> Date: Tue, 10 Dec 2024 04:46:53 +0800 Subject: [PATCH 226/232] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index 35413e0e3c..7ddcd33466 100644 --- a/pom.xml +++ b/pom.xml @@ -445,11 +445,6 @@ bcpg-jdk18on 1.79 - - name.neuhalfen.projects.crypto.bouncycastle.openpgp - bouncy-gpg - 2.3.0 - com.vdurmont semver4j From 2046d5420b60ff1dbb1a4efc0ae9186a550a3ba4 Mon Sep 17 00:00:00 2001 From: Gaojianli Date: Tue, 10 Dec 2024 15:08:55 +0800 Subject: [PATCH 227/232] add change log viewer --- webui/src/api/model/manifest.ts | 1 + webui/src/components/changelogViewer.vue | 42 +++++++++++++++++++ webui/src/components/pageFooter.vue | 36 ++++++++++++---- webui/src/components/{ => plus}/plusMedal.vue | 0 webui/src/components/{ => plus}/plusModal.vue | 0 .../components/{ => plus}/plusTryModal.vue | 0 webui/src/locale/en-US.ts | 6 ++- webui/src/locale/zh-CN.ts | 6 ++- webui/src/stores/endpoint.ts | 22 +++++----- 9 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 webui/src/components/changelogViewer.vue rename webui/src/components/{ => plus}/plusMedal.vue (100%) rename webui/src/components/{ => plus}/plusModal.vue (100%) rename webui/src/components/{ => plus}/plusTryModal.vue (100%) diff --git a/webui/src/api/model/manifest.ts b/webui/src/api/model/manifest.ts index b630619efb..5b4292580a 100644 --- a/webui/src/api/model/manifest.ts +++ b/webui/src/api/model/manifest.ts @@ -9,6 +9,7 @@ export interface version { export interface release { tagName: string url: string + changeLog: string } export interface module { diff --git a/webui/src/components/changelogViewer.vue b/webui/src/components/changelogViewer.vue new file mode 100644 index 0000000000..14cbae6cbc --- /dev/null +++ b/webui/src/components/changelogViewer.vue @@ -0,0 +1,42 @@ +