From 63582b644c7091e81c14c44decc3648b51840b04 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sun, 30 Nov 2025 09:17:35 +0100 Subject: [PATCH 01/56] chore: run linter --- frontend/src/components/files/CsvViewer.vue | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/files/CsvViewer.vue b/frontend/src/components/files/CsvViewer.vue index ad1e7e22..180cf7e2 100644 --- a/frontend/src/components/files/CsvViewer.vue +++ b/frontend/src/components/files/CsvViewer.vue @@ -8,12 +8,7 @@ description

{{ $t("files.lonely") }}

-
+
@@ -66,7 +61,11 @@ const displayError = computed(() => { return props.error; } // Check for parse errors - if (props.content && props.content.trim().length > 0 && data.value.headers.length === 0) { + if ( + props.content && + props.content.trim().length > 0 && + data.value.headers.length === 0 + ) { return "Failed to parse CSV file"; } return null; From 062dc414f886aba5fcce344cf000a5345ecc24f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 07:37:25 +0100 Subject: [PATCH 02/56] chore(deps): update module github.com/shirou/gopsutil/v4 to v4.25.11 (#5597) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e828455d..e6faa384 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/mholt/archives v0.1.5 github.com/mitchellh/go-homedir v1.1.0 github.com/samber/lo v1.52.0 - github.com/shirou/gopsutil/v4 v4.25.10 + github.com/shirou/gopsutil/v4 v4.25.11 github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 @@ -44,7 +44,7 @@ require ( github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect - github.com/ebitengine/purego v0.9.0 // indirect + github.com/ebitengine/purego v0.9.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect diff --git a/go.sum b/go.sum index 443c885b..87b9ba85 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/dsoprea/go-utility/v2 v2.0.0-20221003142440-7a1927d49d9d/go.mod h1:LV github.com/dsoprea/go-utility/v2 v2.0.0-20221003160719-7bc88537c05e/go.mod h1:VZ7cB0pTjm1ADBWhJUOHESu4ZYy9JN+ZPqjfiW09EPU= github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 h1:DilThiXje0z+3UQ5YjYiSRRzVdtamFpvBQXKwMglWqw= github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349/go.mod h1:4GC5sXji84i/p+irqghpPFZBF8tRN/Q7+700G0/DLe8= -github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= -github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= +github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= @@ -204,8 +204,8 @@ github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDc github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.10 h1:at8lk/5T1OgtuCp+AwrDofFRjnvosn0nkN2OLQ6g8tA= -github.com/shirou/gopsutil/v4 v4.25.10/go.mod h1:+kSwyC8DRUD9XXEHCAFjK+0nuArFJM0lva+StQAcskM= +github.com/shirou/gopsutil/v4 v4.25.11 h1:X53gB7muL9Gnwwo2evPSE+SfOrltMoR6V3xJAXZILTY= +github.com/shirou/gopsutil/v4 v4.25.11/go.mod h1:EivAfP5x2EhLp2ovdpKSozecVXn1TmuG7SMzs/Wh4PU= github.com/sorairolake/lzip-go v0.3.8 h1:j5Q2313INdTA80ureWYRhX+1K78mUXfMoPZCw/ivWik= github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/54YPsw66qkU= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= From 5cf8ce8db546148e7d749f00c69a852aaf650e66 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 08:38:14 +0100 Subject: [PATCH 03/56] chore(deps): update dependency vite to v7.2.6 (#5598) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 698416bb..2fd8bacc 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -113,10 +113,10 @@ importers: version: 8.48.0(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) '@vitejs/plugin-legacy': specifier: ^7.2.1 - version: 7.2.1(terser@5.44.1)(vite@7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)) + version: 7.2.1(terser@5.44.1)(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)) '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.2(vite@7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))(vue@3.5.25(typescript@5.9.3)) + version: 6.0.2(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))(vue@3.5.25(typescript@5.9.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 version: 10.2.0(eslint@9.39.1)(prettier@3.7.3) @@ -155,7 +155,7 @@ importers: version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) + version: 7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) vite-plugin-compression2: specifier: ^2.3.1 version: 2.3.1(rollup@4.53.3) @@ -2439,8 +2439,8 @@ packages: vite-plugin-compression2@2.3.1: resolution: {integrity: sha512-bnhLTsurtvOiiP6EMISIKVsOMCeTAjE6FJbyqQus3W4mtAxF7pCuC4puUIAiCgNs98tOCpqo6GIXJXTLufzIaw==} - vite@7.2.4: - resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} + vite@7.2.6: + resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3795,7 +3795,7 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))': + '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) @@ -3810,14 +3810,14 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.44.1 - vite: 7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.2(vite@7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.50 - vite: 7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0) vue: 3.5.25(typescript@5.9.3) '@volar/language-core@2.4.23': @@ -4985,7 +4985,7 @@ snapshots: transitivePeerDependencies: - rollup - vite@7.2.4(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0): + vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) From 98662ac5ec2e22586dbd98491aa0a4ee6ee42d32 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:47:00 +0100 Subject: [PATCH 04/56] chore(deps): update all non-major dependencies (#5600) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 126 ++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 2fd8bacc..ec1150cb 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.25(typescript@5.9.3)) ace-builds: specifier: ^1.43.2 - version: 1.43.4 + version: 1.43.5 dayjs: specifier: ^1.11.13 version: 1.11.19 @@ -110,7 +110,7 @@ importers: version: 24.10.1 '@typescript-eslint/eslint-plugin': specifier: ^8.37.0 - version: 8.48.0(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + version: 8.48.1(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) '@vitejs/plugin-legacy': specifier: ^7.2.1 version: 7.2.1(terser@5.44.1)(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)) @@ -119,7 +119,7 @@ importers: version: 6.0.2(vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))(vue@3.5.25(typescript@5.9.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 - version: 10.2.0(eslint@9.39.1)(prettier@3.7.3) + version: 10.2.0(eslint@9.39.1)(prettier@3.7.4) '@vue/eslint-config-typescript': specifier: ^14.6.0 version: 14.6.0(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1)))(eslint@9.39.1)(typescript@5.9.3) @@ -137,7 +137,7 @@ importers: version: 10.1.8(eslint@9.39.1) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.3) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4) eslint-plugin-vue: specifier: ^10.5.1 version: 10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(vue-eslint-parser@10.2.0(eslint@9.39.1)) @@ -146,7 +146,7 @@ importers: version: 8.5.6 prettier: specifier: ^3.6.2 - version: 3.7.3 + version: 3.7.4 terser: specifier: ^5.43.1 version: 5.44.1 @@ -1127,11 +1127,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.48.0': - resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} + '@typescript-eslint/eslint-plugin@8.48.1': + resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.0 + '@typescript-eslint/parser': ^8.48.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -1154,8 +1154,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.48.0': - resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} + '@typescript-eslint/project-service@8.48.1': + resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1168,8 +1168,8 @@ packages: resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.48.0': - resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} + '@typescript-eslint/scope-manager@8.48.1': + resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.37.0': @@ -1184,8 +1184,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.48.0': - resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} + '@typescript-eslint/tsconfig-utils@8.48.1': + resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1197,8 +1197,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.48.0': - resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} + '@typescript-eslint/type-utils@8.48.1': + resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1212,8 +1212,8 @@ packages: resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.48.0': - resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} + '@typescript-eslint/types@8.48.1': + resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.37.0': @@ -1228,8 +1228,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.48.0': - resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} + '@typescript-eslint/typescript-estree@8.48.1': + resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1241,8 +1241,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.48.0': - resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} + '@typescript-eslint/utils@8.48.1': + resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1256,8 +1256,8 @@ packages: resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.48.0': - resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} + '@typescript-eslint/visitor-keys@8.48.1': + resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@videojs/http-streaming@3.17.2': @@ -1437,8 +1437,8 @@ packages: resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} - ace-builds@1.43.4: - resolution: {integrity: sha512-8hAxVfo2ImICd69BWlZwZlxe9rxDGDjuUhh+WeWgGDvfBCE+r3lkynkQvIovDz4jcMi8O7bsEaFygaDT+h9sBA==} + ace-builds@1.43.5: + resolution: {integrity: sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -2167,8 +2167,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.7.3: - resolution: {integrity: sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} hasBin: true @@ -3576,14 +3576,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.37.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.37.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.1 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -3623,10 +3623,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -3642,10 +3642,10 @@ snapshots: '@typescript-eslint/types': 8.46.4 '@typescript-eslint/visitor-keys': 8.46.4 - '@typescript-eslint/scope-manager@8.48.0': + '@typescript-eslint/scope-manager@8.48.1': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)': dependencies: @@ -3655,7 +3655,7 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -3671,11 +3671,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -3687,7 +3687,7 @@ snapshots: '@typescript-eslint/types@8.46.4': {} - '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/types@8.48.1': {} '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)': dependencies: @@ -3721,12 +3721,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/project-service': 8.48.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -3747,12 +3747,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: @@ -3768,9 +3768,9 @@ snapshots: '@typescript-eslint/types': 8.46.4 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.48.0': + '@typescript-eslint/visitor-keys@8.48.1': dependencies: - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/types': 8.48.1 eslint-visitor-keys: 4.2.1 '@videojs/http-streaming@3.17.2(video.js@8.23.4)': @@ -3882,12 +3882,12 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/eslint-config-prettier@10.2.0(eslint@9.39.1)(prettier@3.7.3)': + '@vue/eslint-config-prettier@10.2.0(eslint@9.39.1)(prettier@3.7.4)': dependencies: eslint: 9.39.1 eslint-config-prettier: 10.1.8(eslint@9.39.1) - eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.3) - prettier: 3.7.3 + eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4) + prettier: 3.7.4 transitivePeerDependencies: - '@types/eslint' @@ -3971,7 +3971,7 @@ snapshots: '@xmldom/xmldom@0.8.11': {} - ace-builds@1.43.4: {} + ace-builds@1.43.5: {} acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -4219,10 +4219,10 @@ snapshots: dependencies: eslint: 9.39.1 - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.3): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4): dependencies: eslint: 9.39.1 - prettier: 3.7.3 + prettier: 3.7.4 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: @@ -4697,7 +4697,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.7.3: {} + prettier@3.7.4: {} pretty-bytes@7.1.0: {} From a6934e40ffa1f2ea015870973663ed154eceffdf Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Fri, 5 Dec 2025 15:11:22 +0100 Subject: [PATCH 05/56] ci: run renovate on weekends --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 2cc079cc..ae7193e8 100644 --- a/renovate.json +++ b/renovate.json @@ -10,5 +10,6 @@ "postUpdateOptions": [ "gomodUpdateImportPaths", "gomodTidy" - ] + ], + "schedule": "* * * * 0,6" } From f029c3005e450cfbebb074c42dbdf65db9c8d56a Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sat, 6 Dec 2025 10:52:11 +0100 Subject: [PATCH 06/56] refactor: cleanup package names (#5605) --- auth/hook.go | 4 ++-- auth/proxy.go | 4 ++-- cmd/config.go | 12 ++++++------ errors/errors.go | 2 +- files/file.go | 6 +++--- http/auth.go | 6 +++--- http/commands.go | 2 +- http/data.go | 2 +- http/headers.go | 2 +- http/http.go | 2 +- http/preview.go | 2 +- http/preview_enum.go | 2 +- http/public.go | 2 +- http/public_test.go | 2 +- http/raw.go | 2 +- http/resource.go | 14 +++++++------- http/search.go | 2 +- http/settings.go | 2 +- http/share.go | 8 ++++---- http/static.go | 2 +- http/subtitle.go | 2 +- http/tus_handlers.go | 2 +- http/users.go | 12 ++++++------ http/utils.go | 2 +- settings/storage.go | 4 ++-- share/storage.go | 4 ++-- storage/bolt/auth.go | 4 ++-- storage/bolt/share.go | 12 ++++++------ storage/bolt/users.go | 10 +++++----- storage/bolt/utils.go | 4 ++-- users/password.go | 6 +++--- users/storage.go | 8 ++++---- users/users.go | 6 +++--- 33 files changed, 78 insertions(+), 78 deletions(-) diff --git a/auth/hook.go b/auth/hook.go index ec3c5bfb..9bb38969 100644 --- a/auth/hook.go +++ b/auth/hook.go @@ -11,7 +11,7 @@ import ( "slices" "strings" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" @@ -146,7 +146,7 @@ func (a *HookAuth) GetValues(s string) { // SaveUser updates the existing user or creates a new one when not found func (a *HookAuth) SaveUser() (*users.User, error) { u, err := a.Users.Get(a.Server.Root, a.Cred.Username) - if err != nil && !errors.Is(err, fbErrors.ErrNotExist) { + if err != nil && !errors.Is(err, fberrors.ErrNotExist) { return nil, err } diff --git a/auth/proxy.go b/auth/proxy.go index 301aa292..3f4a627c 100644 --- a/auth/proxy.go +++ b/auth/proxy.go @@ -4,7 +4,7 @@ import ( "errors" "net/http" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" ) @@ -21,7 +21,7 @@ type ProxyAuth struct { func (a ProxyAuth) Auth(r *http.Request, usr users.Store, setting *settings.Settings, srv *settings.Server) (*users.User, error) { username := r.Header.Get(a.Header) user, err := usr.Get(srv.Root, username) - if errors.Is(err, fbErrors.ErrNotExist) { + if errors.Is(err, fberrors.ErrNotExist) { return a.createUser(usr, setting, srv, username) } return user, err diff --git a/cmd/config.go b/cmd/config.go index 93ba29df..4766c389 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -2,7 +2,7 @@ package cmd import ( "encoding/json" - nerrors "errors" + "errors" "fmt" "os" "strings" @@ -12,7 +12,7 @@ import ( "github.com/spf13/pflag" "github.com/filebrowser/filebrowser/v2/auth" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" ) @@ -104,7 +104,7 @@ func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (a } if header == "" { - return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'") + return nil, errors.New("you must set the flag 'auth.header' for method 'proxy'") } return &auth.ProxyAuth{Header: header}, nil @@ -163,7 +163,7 @@ func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (au } if command == "" { - return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'") + return nil, errors.New("you must set the flag 'auth.command' for method 'hook'") } return &auth.HookAuth{Command: command}, nil @@ -186,7 +186,7 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings. case auth.MethodHookAuth: auther, err = getHookAuth(flags, defaultAuther) default: - return "", nil, errors.ErrInvalidAuthMethod + return "", nil, fberrors.ErrInvalidAuthMethod } if err != nil { @@ -361,7 +361,7 @@ func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Ser flags.Visit(visit) } - err := nerrors.Join(errs...) + err := errors.Join(errs...) if err != nil { return nil, err } diff --git a/errors/errors.go b/errors/errors.go index 5fd760c2..85258e5b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -1,4 +1,4 @@ -package errors +package fberrors import ( "errors" diff --git a/files/file.go b/files/file.go index 0f96440e..5ce0aee7 100644 --- a/files/file.go +++ b/files/file.go @@ -23,7 +23,7 @@ import ( "github.com/spf13/afero" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/rules" ) @@ -168,7 +168,7 @@ func stat(opts *FileOptions) (*FileInfo, error) { // algorithm. The checksums data is saved on File object. func (i *FileInfo) Checksum(algo string) error { if i.IsDir { - return fbErrors.ErrIsDirectory + return fberrors.ErrIsDirectory } if i.Checksums == nil { @@ -193,7 +193,7 @@ func (i *FileInfo) Checksum(algo string) error { case "sha512": h = sha512.New() default: - return fbErrors.ErrInvalidOption + return fberrors.ErrInvalidOption } _, err = io.Copy(h, reader) diff --git a/http/auth.go b/http/auth.go index 4c052a5c..5a483a8d 100644 --- a/http/auth.go +++ b/http/auth.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "encoding/json" @@ -13,7 +13,7 @@ import ( "github.com/golang-jwt/jwt/v5/request" fbAuth "github.com/filebrowser/filebrowser/v2/auth" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" ) @@ -185,7 +185,7 @@ var signupHandler = func(_ http.ResponseWriter, r *http.Request, d *data) (int, log.Printf("new user: %s, home dir: [%s].", user.Username, userHome) err = d.store.Users.Save(user) - if errors.Is(err, fbErrors.ErrExist) { + if errors.Is(err, fberrors.ErrExist) { return http.StatusConflict, err } else if err != nil { return http.StatusInternalServerError, err diff --git a/http/commands.go b/http/commands.go index 6229d597..f0380c50 100644 --- a/http/commands.go +++ b/http/commands.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "bufio" diff --git a/http/data.go b/http/data.go index 3f949ad0..d591053e 100644 --- a/http/data.go +++ b/http/data.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "log" diff --git a/http/headers.go b/http/headers.go index a768a46c..a18e7b53 100644 --- a/http/headers.go +++ b/http/headers.go @@ -1,6 +1,6 @@ //go:build !dev -package http +package fbhttp // global headers to append to every response var globalHeaders = map[string]string{ diff --git a/http/http.go b/http/http.go index 2d87535f..e6fc185a 100644 --- a/http/http.go +++ b/http/http.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "io/fs" diff --git a/http/preview.go b/http/preview.go index cb64ba9c..e57d597b 100644 --- a/http/preview.go +++ b/http/preview.go @@ -1,5 +1,5 @@ //go:generate go-enum --sql --marshal --names --file $GOFILE -package http +package fbhttp import ( "bytes" diff --git a/http/preview_enum.go b/http/preview_enum.go index 50e3372c..2bb1a078 100644 --- a/http/preview_enum.go +++ b/http/preview_enum.go @@ -1,7 +1,7 @@ // Code generated by go-enum // DO NOT EDIT! -package http +package fbhttp import ( "database/sql/driver" diff --git a/http/public.go b/http/public.go index 92c8102d..ae1bd10a 100644 --- a/http/public.go +++ b/http/public.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "errors" diff --git a/http/public_test.go b/http/public_test.go index f102cc07..9a9c7f2e 100644 --- a/http/public_test.go +++ b/http/public_test.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "fmt" diff --git a/http/raw.go b/http/raw.go index f2548155..bed04310 100644 --- a/http/raw.go +++ b/http/raw.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "errors" diff --git a/http/resource.go b/http/resource.go index fba422df..9fe4caa6 100644 --- a/http/resource.go +++ b/http/resource.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "context" @@ -17,7 +17,7 @@ import ( "github.com/shirou/gopsutil/v4/disk" "github.com/spf13/afero" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/fileutils" ) @@ -44,7 +44,7 @@ var resourceGetHandler = withUser(func(w http.ResponseWriter, r *http.Request, d if checksum := r.URL.Query().Get("checksum"); checksum != "" { err := file.Checksum(checksum) - if errors.Is(err, fbErrors.ErrInvalidOption) { + if errors.Is(err, fberrors.ErrInvalidOption) { return http.StatusBadRequest, nil } else if err != nil { return http.StatusInternalServerError, err @@ -238,7 +238,7 @@ func checkParent(src, dst string) error { rel = filepath.ToSlash(rel) if !strings.HasPrefix(rel, "../") && rel != ".." && rel != "." { - return fbErrors.ErrSourceIsParent + return fberrors.ErrSourceIsParent } return nil @@ -304,13 +304,13 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach switch action { case "copy": if !d.user.Perm.Create { - return fbErrors.ErrPermissionDenied + return fberrors.ErrPermissionDenied } return fileutils.Copy(d.user.Fs, src, dst, d.settings.FileMode, d.settings.DirMode) case "rename": if !d.user.Perm.Rename { - return fbErrors.ErrPermissionDenied + return fberrors.ErrPermissionDenied } src = path.Clean("/" + src) dst = path.Clean("/" + dst) @@ -335,7 +335,7 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach return fileutils.MoveFile(d.user.Fs, src, dst, d.settings.FileMode, d.settings.DirMode) default: - return fmt.Errorf("unsupported action %s: %w", action, fbErrors.ErrInvalidRequestParams) + return fmt.Errorf("unsupported action %s: %w", action, fberrors.ErrInvalidRequestParams) } } diff --git a/http/search.go b/http/search.go index 1c78b781..5b926b43 100644 --- a/http/search.go +++ b/http/search.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "net/http" diff --git a/http/settings.go b/http/settings.go index 500e1c2c..358ca7de 100644 --- a/http/settings.go +++ b/http/settings.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "encoding/json" diff --git a/http/share.go b/http/share.go index 670629bd..509a7b21 100644 --- a/http/share.go +++ b/http/share.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "crypto/rand" @@ -14,7 +14,7 @@ import ( "golang.org/x/crypto/bcrypt" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/share" ) @@ -38,7 +38,7 @@ var shareListHandler = withPermShare(func(w http.ResponseWriter, r *http.Request } else { s, err = d.store.Share.FindByUserID(d.user.ID) } - if errors.Is(err, fbErrors.ErrNotExist) { + if errors.Is(err, fberrors.ErrNotExist) { return renderJSON(w, r, []*share.Link{}) } @@ -58,7 +58,7 @@ var shareListHandler = withPermShare(func(w http.ResponseWriter, r *http.Request var shareGetsHandler = withPermShare(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { s, err := d.store.Share.Gets(r.URL.Path, d.user.ID) - if errors.Is(err, fbErrors.ErrNotExist) { + if errors.Is(err, fberrors.ErrNotExist) { return renderJSON(w, r, []*share.Link{}) } diff --git a/http/static.go b/http/static.go index b8883c4e..d996cc07 100644 --- a/http/static.go +++ b/http/static.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "encoding/json" diff --git a/http/subtitle.go b/http/subtitle.go index 71fe8ae4..07c2dcfc 100644 --- a/http/subtitle.go +++ b/http/subtitle.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "bytes" diff --git a/http/tus_handlers.go b/http/tus_handlers.go index 05671cf7..d11920ae 100644 --- a/http/tus_handlers.go +++ b/http/tus_handlers.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "context" diff --git a/http/users.go b/http/users.go index 4185e82e..905f123b 100644 --- a/http/users.go +++ b/http/users.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "encoding/json" @@ -12,7 +12,7 @@ import ( "golang.org/x/text/cases" "golang.org/x/text/language" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/users" ) @@ -36,7 +36,7 @@ func getUserID(r *http.Request) (uint, error) { func getUser(_ http.ResponseWriter, r *http.Request) (*modifyUserRequest, error) { if r.Body == nil { - return nil, fbErrors.ErrEmptyRequest + return nil, fberrors.ErrEmptyRequest } req := &modifyUserRequest{} @@ -46,7 +46,7 @@ func getUser(_ http.ResponseWriter, r *http.Request) (*modifyUserRequest, error) } if req.What != "user" { - return nil, fbErrors.ErrInvalidDataType + return nil, fberrors.ErrInvalidDataType } return req, nil @@ -87,7 +87,7 @@ var usersGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d * var userGetHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { u, err := d.store.Users.Get(d.server.Root, d.raw.(uint)) - if errors.Is(err, fbErrors.ErrNotExist) { + if errors.Is(err, fberrors.ErrNotExist) { return http.StatusNotFound, err } @@ -122,7 +122,7 @@ var userPostHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d * } if req.Data.Password == "" { - return http.StatusBadRequest, fbErrors.ErrEmptyPassword + return http.StatusBadRequest, fberrors.ErrEmptyPassword } req.Data.Password, err = users.ValidateAndHashPwd(req.Data.Password, d.settings.MinimumPasswordLength) diff --git a/http/utils.go b/http/utils.go index 03615263..c76cecf4 100644 --- a/http/utils.go +++ b/http/utils.go @@ -1,4 +1,4 @@ -package http +package fbhttp import ( "encoding/json" diff --git a/settings/storage.go b/settings/storage.go index 8bf11a64..573024f7 100644 --- a/settings/storage.go +++ b/settings/storage.go @@ -1,7 +1,7 @@ package settings import ( - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/rules" "github.com/filebrowser/filebrowser/v2/users" ) @@ -72,7 +72,7 @@ var defaultEvents = []string{ // Save saves the settings for the current instance. func (s *Storage) Save(set *Settings) error { if len(set.Key) == 0 { - return errors.ErrEmptyKey + return fberrors.ErrEmptyKey } if set.Defaults.Locale == "" { diff --git a/share/storage.go b/share/storage.go index 398c192d..76ba26eb 100644 --- a/share/storage.go +++ b/share/storage.go @@ -3,7 +3,7 @@ package share import ( "time" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" ) // StorageBackend is the interface to implement for a share storage. @@ -79,7 +79,7 @@ func (s *Storage) GetByHash(hash string) (*Link, error) { if err := s.Delete(link.Hash); err != nil { return nil, err } - return nil, errors.ErrNotExist + return nil, fberrors.ErrNotExist } return link, nil diff --git a/storage/bolt/auth.go b/storage/bolt/auth.go index cf15a8fe..1de95192 100644 --- a/storage/bolt/auth.go +++ b/storage/bolt/auth.go @@ -4,7 +4,7 @@ import ( "github.com/asdine/storm/v3" "github.com/filebrowser/filebrowser/v2/auth" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" ) @@ -25,7 +25,7 @@ func (s authBackend) Get(t settings.AuthMethod) (auth.Auther, error) { case auth.MethodNoAuth: auther = &auth.NoAuth{} default: - return nil, errors.ErrInvalidAuthMethod + return nil, fberrors.ErrInvalidAuthMethod } return auther, get(s.db, "auther", auther) diff --git a/storage/bolt/share.go b/storage/bolt/share.go index 373533f1..c5b91483 100644 --- a/storage/bolt/share.go +++ b/storage/bolt/share.go @@ -6,7 +6,7 @@ import ( "github.com/asdine/storm/v3" "github.com/asdine/storm/v3/q" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/share" ) @@ -18,7 +18,7 @@ func (s shareBackend) All() ([]*share.Link, error) { var v []*share.Link err := s.db.All(&v) if errors.Is(err, storm.ErrNotFound) { - return v, fbErrors.ErrNotExist + return v, fberrors.ErrNotExist } return v, err @@ -28,7 +28,7 @@ func (s shareBackend) FindByUserID(id uint) ([]*share.Link, error) { var v []*share.Link err := s.db.Select(q.Eq("UserID", id)).Find(&v) if errors.Is(err, storm.ErrNotFound) { - return v, fbErrors.ErrNotExist + return v, fberrors.ErrNotExist } return v, err @@ -38,7 +38,7 @@ func (s shareBackend) GetByHash(hash string) (*share.Link, error) { var v share.Link err := s.db.One("Hash", hash, &v) if errors.Is(err, storm.ErrNotFound) { - return nil, fbErrors.ErrNotExist + return nil, fberrors.ErrNotExist } return &v, err @@ -48,7 +48,7 @@ func (s shareBackend) GetPermanent(path string, id uint) (*share.Link, error) { var v share.Link err := s.db.Select(q.Eq("Path", path), q.Eq("Expire", 0), q.Eq("UserID", id)).First(&v) if errors.Is(err, storm.ErrNotFound) { - return nil, fbErrors.ErrNotExist + return nil, fberrors.ErrNotExist } return &v, err @@ -58,7 +58,7 @@ func (s shareBackend) Gets(path string, id uint) ([]*share.Link, error) { var v []*share.Link err := s.db.Select(q.Eq("Path", path), q.Eq("UserID", id)).Find(&v) if errors.Is(err, storm.ErrNotFound) { - return v, fbErrors.ErrNotExist + return v, fberrors.ErrNotExist } return v, err diff --git a/storage/bolt/users.go b/storage/bolt/users.go index dc901c34..974c0a48 100644 --- a/storage/bolt/users.go +++ b/storage/bolt/users.go @@ -7,7 +7,7 @@ import ( "github.com/asdine/storm/v3" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/users" ) @@ -25,14 +25,14 @@ func (st usersBackend) GetBy(i interface{}) (user *users.User, err error) { case string: arg = "Username" default: - return nil, fbErrors.ErrInvalidDataType + return nil, fberrors.ErrInvalidDataType } err = st.db.One(arg, i, user) if err != nil { if errors.Is(err, storm.ErrNotFound) { - return nil, fbErrors.ErrNotExist + return nil, fberrors.ErrNotExist } return nil, err } @@ -44,7 +44,7 @@ func (st usersBackend) Gets() ([]*users.User, error) { var allUsers []*users.User err := st.db.All(&allUsers) if errors.Is(err, storm.ErrNotFound) { - return nil, fbErrors.ErrNotExist + return nil, fberrors.ErrNotExist } if err != nil { @@ -76,7 +76,7 @@ func (st usersBackend) Update(user *users.User, fields ...string) error { func (st usersBackend) Save(user *users.User) error { err := st.db.Save(user) if errors.Is(err, storm.ErrAlreadyExists) { - return fbErrors.ErrExist + return fberrors.ErrExist } return err } diff --git a/storage/bolt/utils.go b/storage/bolt/utils.go index e275a0d1..b16bccff 100644 --- a/storage/bolt/utils.go +++ b/storage/bolt/utils.go @@ -5,13 +5,13 @@ import ( "github.com/asdine/storm/v3" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" ) func get(db *storm.DB, name string, to interface{}) error { err := db.Get("config", name, to) if errors.Is(err, storm.ErrNotFound) { - return fbErrors.ErrNotExist + return fberrors.ErrNotExist } return err diff --git a/users/password.go b/users/password.go index 3a01053d..2e355ad4 100644 --- a/users/password.go +++ b/users/password.go @@ -6,17 +6,17 @@ import ( "golang.org/x/crypto/bcrypt" - fbErrors "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" ) // ValidateAndHashPwd validates and hashes a password. func ValidateAndHashPwd(password string, minimumLength uint) (string, error) { if uint(len(password)) < minimumLength { - return "", fbErrors.ErrShortPassword{MinimumLength: minimumLength} + return "", fberrors.ErrShortPassword{MinimumLength: minimumLength} } if _, ok := commonPasswords[password]; ok { - return "", fbErrors.ErrEasyPassword + return "", fberrors.ErrEasyPassword } return HashPwd(password) diff --git a/users/storage.go b/users/storage.go index 1dd0da3f..43c65fe4 100644 --- a/users/storage.go +++ b/users/storage.go @@ -4,7 +4,7 @@ import ( "sync" "time" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" ) // StorageBackend is the interface to implement for a users storage. @@ -109,16 +109,16 @@ func (s *Storage) Delete(id interface{}) error { return err } if user.ID == 1 { - return errors.ErrRootUserDeletion + return fberrors.ErrRootUserDeletion } return s.back.DeleteByUsername(id) case uint: if id == 1 { - return errors.ErrRootUserDeletion + return fberrors.ErrRootUserDeletion } return s.back.DeleteByID(id) default: - return errors.ErrInvalidDataType + return fberrors.ErrInvalidDataType } } diff --git a/users/users.go b/users/users.go index 987a94f2..0fcc26d8 100644 --- a/users/users.go +++ b/users/users.go @@ -5,7 +5,7 @@ import ( "github.com/spf13/afero" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/rules" ) @@ -64,11 +64,11 @@ func (u *User) Clean(baseScope string, fields ...string) error { switch field { case "Username": if u.Username == "" { - return errors.ErrEmptyUsername + return fberrors.ErrEmptyUsername } case "Password": if u.Password == "" { - return errors.ErrEmptyPassword + return fberrors.ErrEmptyPassword } case "ViewMode": if u.ViewMode == "" { From 204a3f0eeaa0c68781b60651bf27c4b27eac44e6 Mon Sep 17 00:00:00 2001 From: Ariel Leyva Date: Sat, 6 Dec 2025 05:08:50 -0500 Subject: [PATCH 07/56] fix: added column separator select (comma, semicolon and both) in CSV viewer (#5604) Co-authored-by: Henrique Dias --- frontend/src/components/files/CsvViewer.vue | 59 +++++++++++++++++++-- frontend/src/i18n/en.json | 5 ++ frontend/src/utils/csv.ts | 7 ++- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/files/CsvViewer.vue b/frontend/src/components/files/CsvViewer.vue index 180cf7e2..4f66fff0 100644 --- a/frontend/src/components/files/CsvViewer.vue +++ b/frontend/src/components/files/CsvViewer.vue @@ -25,9 +25,29 @@
-
- info - Showing {{ data.rows.length }} rows +
@@ -35,7 +55,7 @@ + From fda8a992929b1466e75fb2813f2c4e293c12d244 Mon Sep 17 00:00:00 2001 From: Beckam White <47697544+BJDubb@users.noreply.github.com> Date: Sat, 10 Jan 2026 20:27:54 +1100 Subject: [PATCH 46/56] feat: add "redirect after copy/move" user setting (#5662) --- auth/hook.go | 37 ++++++++++--------- cmd/config.go | 1 + cmd/root.go | 9 ++--- cmd/users.go | 6 +++- cmd/users_update.go | 16 +++++---- frontend/src/components/prompts/Copy.vue | 3 +- frontend/src/components/prompts/Move.vue | 6 ++-- frontend/src/i18n/en.json | 1 + frontend/src/types/settings.d.ts | 1 + frontend/src/types/user.d.ts | 2 ++ frontend/src/views/settings/Profile.vue | 12 +++++++ http/auth.go | 46 ++++++++++++------------ settings/defaults.go | 22 ++++++------ users/users.go | 33 ++++++++--------- www/docs/cli/filebrowser-config-init.md | 1 + www/docs/cli/filebrowser-config-set.md | 1 + www/docs/cli/filebrowser-users-add.md | 1 + www/docs/cli/filebrowser-users-update.md | 1 + 18 files changed, 119 insertions(+), 80 deletions(-) diff --git a/auth/hook.go b/auth/hook.go index 9bb38969..0c5efac5 100644 --- a/auth/hook.go +++ b/auth/hook.go @@ -158,16 +158,17 @@ func (a *HookAuth) SaveUser() (*users.User, error) { // create user with the provided credentials d := &users.User{ - Username: a.Cred.Username, - Password: pass, - Scope: a.Settings.Defaults.Scope, - Locale: a.Settings.Defaults.Locale, - ViewMode: a.Settings.Defaults.ViewMode, - SingleClick: a.Settings.Defaults.SingleClick, - Sorting: a.Settings.Defaults.Sorting, - Perm: a.Settings.Defaults.Perm, - Commands: a.Settings.Defaults.Commands, - HideDotfiles: a.Settings.Defaults.HideDotfiles, + Username: a.Cred.Username, + Password: pass, + Scope: a.Settings.Defaults.Scope, + Locale: a.Settings.Defaults.Locale, + ViewMode: a.Settings.Defaults.ViewMode, + SingleClick: a.Settings.Defaults.SingleClick, + RedirectAfterCopyMove: a.Settings.Defaults.RedirectAfterCopyMove, + Sorting: a.Settings.Defaults.Sorting, + Perm: a.Settings.Defaults.Perm, + Commands: a.Settings.Defaults.Commands, + HideDotfiles: a.Settings.Defaults.HideDotfiles, } u = a.GetUser(d) @@ -219,13 +220,14 @@ func (a *HookAuth) GetUser(d *users.User) *users.User { Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download), } user := users.User{ - ID: d.ID, - Username: d.Username, - Password: d.Password, - Scope: a.Fields.GetString("user.scope", d.Scope), - Locale: a.Fields.GetString("user.locale", d.Locale), - ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), - SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), + ID: d.ID, + Username: d.Username, + Password: d.Password, + Scope: a.Fields.GetString("user.scope", d.Scope), + Locale: a.Fields.GetString("user.locale", d.Locale), + ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), + SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), + RedirectAfterCopyMove: a.Fields.GetBoolean("user.redirectAfterCopyMove", d.RedirectAfterCopyMove), Sorting: files.Sorting{ Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), By: a.Fields.GetString("user.sorting.by", d.Sorting.By), @@ -251,6 +253,7 @@ var validHookFields = []string{ "user.locale", "user.viewMode", "user.singleClick", + "user.redirectAfterCopyMove", "user.sorting.by", "user.sorting.asc", "user.commands", diff --git a/cmd/config.go b/cmd/config.go index 3fb2e7e4..5b3314ed 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -240,6 +240,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale) fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode) fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick) + fmt.Fprintf(w, "\tRedirect after Copy/Move:\t%t\n", set.Defaults.RedirectAfterCopyMove) fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode) fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode) fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " ")) diff --git a/cmd/root.go b/cmd/root.go index 0f78535c..981eec4f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -393,10 +393,11 @@ func quickSetup(v *viper.Viper, s *storage.Storage) error { MinimumPasswordLength: settings.DefaultMinimumPasswordLength, UserHomeBasePath: settings.DefaultUsersHomeBasePath, Defaults: settings.UserDefaults{ - Scope: ".", - Locale: "en", - SingleClick: false, - AceEditorTheme: v.GetString("defaults.aceEditorTheme"), + Scope: ".", + Locale: "en", + SingleClick: false, + RedirectAfterCopyMove: true, + AceEditorTheme: v.GetString("defaults.aceEditorTheme"), Perm: users.Permissions{ Admin: false, Execute: true, diff --git a/cmd/users.go b/cmd/users.go index 86434a42..66487862 100644 --- a/cmd/users.go +++ b/cmd/users.go @@ -30,13 +30,14 @@ func printUsers(usrs []*users.User) { fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock") for _, u := range usrs { - fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", + fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", u.ID, u.Username, u.Scope, u.Locale, u.ViewMode, u.SingleClick, + u.RedirectAfterCopyMove, u.Perm.Admin, u.Perm.Execute, u.Perm.Create, @@ -77,6 +78,7 @@ func addUserFlags(flags *pflag.FlagSet) { flags.String("locale", "en", "locale for users") flags.String("viewMode", string(users.ListViewMode), "view mode for users") flags.Bool("singleClick", false, "use single clicks only") + flags.Bool("redirectAfterCopyMove", false, "redirect to destination after copy/move") flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)") flags.Bool("hideDotfiles", false, "hide dotfiles") flags.String("aceEditorTheme", "", "ace editor's syntax highlighting theme for users") @@ -110,6 +112,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all defaults.ViewMode, err = getAndParseViewMode(flags) case "singleClick": defaults.SingleClick, err = flags.GetBool(flag.Name) + case "redirectAfterCopyMove": + defaults.RedirectAfterCopyMove, err = flags.GetBool(flag.Name) case "aceEditorTheme": defaults.AceEditorTheme, err = flags.GetString(flag.Name) case "perm.admin": diff --git a/cmd/users_update.go b/cmd/users_update.go index 96f1e2d3..e9a484fc 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -52,13 +52,14 @@ options you want to change.`, } defaults := settings.UserDefaults{ - Scope: user.Scope, - Locale: user.Locale, - ViewMode: user.ViewMode, - SingleClick: user.SingleClick, - Perm: user.Perm, - Sorting: user.Sorting, - Commands: user.Commands, + Scope: user.Scope, + Locale: user.Locale, + ViewMode: user.ViewMode, + SingleClick: user.SingleClick, + RedirectAfterCopyMove: user.RedirectAfterCopyMove, + Perm: user.Perm, + Sorting: user.Sorting, + Commands: user.Commands, } err = getUserDefaults(flags, &defaults, false) @@ -70,6 +71,7 @@ options you want to change.`, user.Locale = defaults.Locale user.ViewMode = defaults.ViewMode user.SingleClick = defaults.SingleClick + user.RedirectAfterCopyMove = defaults.RedirectAfterCopyMove user.Perm = defaults.Perm user.Commands = defaults.Commands user.Sorting = defaults.Sorting diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue index 9b5e4c63..09040e0a 100644 --- a/frontend/src/components/prompts/Copy.vue +++ b/frontend/src/components/prompts/Copy.vue @@ -109,7 +109,8 @@ export default { return; } - this.$router.push({ path: this.dest }); + if (this.user.redirectAfterCopyMove) + this.$router.push({ path: this.dest }); }) .catch((e) => { buttons.done("copy"); diff --git a/frontend/src/components/prompts/Move.vue b/frontend/src/components/prompts/Move.vue index d92e4b6e..0fec8679 100644 --- a/frontend/src/components/prompts/Move.vue +++ b/frontend/src/components/prompts/Move.vue @@ -79,7 +79,7 @@ export default { computed: { ...mapState(useFileStore, ["req", "selected"]), ...mapState(useAuthStore, ["user"]), - ...mapWritableState(useFileStore, ["preselect"]), + ...mapWritableState(useFileStore, ["reload", "preselect"]), excludedFolders() { return this.selected .filter((idx) => this.req.items[idx].isDir) @@ -108,7 +108,9 @@ export default { .then(() => { buttons.success("move"); this.preselect = removePrefix(items[0].to); - this.$router.push({ path: this.dest }); + if (this.user.redirectAfterCopyMove) + this.$router.push({ path: this.dest }); + else this.reload = true; }) .catch((e) => { buttons.done("move"); diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 60fe527f..3fcdf635 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -232,6 +232,7 @@ "permissions": "Permissions", "permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n", "profileSettings": "Profile Settings", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "prevents the access to any dotfile (such as .git, .gitignore) in every folder.\n", "ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.", "rules": "Rules", diff --git a/frontend/src/types/settings.d.ts b/frontend/src/types/settings.d.ts index c213e016..18672bdf 100644 --- a/frontend/src/types/settings.d.ts +++ b/frontend/src/types/settings.d.ts @@ -18,6 +18,7 @@ interface SettingsDefaults { locale: string; viewMode: ViewModeType; singleClick: boolean; + redirectAfterCopyMove: boolean; sorting: Sorting; perm: Permissions; commands: any[]; diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts index 40c453c5..317f1e43 100644 --- a/frontend/src/types/user.d.ts +++ b/frontend/src/types/user.d.ts @@ -10,6 +10,7 @@ interface IUser { lockPassword: boolean; hideDotfiles: boolean; singleClick: boolean; + redirectAfterCopyMove: boolean; dateFormat: boolean; viewMode: ViewModeType; sorting?: Sorting; @@ -30,6 +31,7 @@ interface IUserForm { lockPassword?: boolean; hideDotfiles?: boolean; singleClick?: boolean; + redirectAfterCopyMove?: boolean; dateFormat?: boolean; } diff --git a/frontend/src/views/settings/Profile.vue b/frontend/src/views/settings/Profile.vue index 8aafccb6..ffb20f0d 100644 --- a/frontend/src/views/settings/Profile.vue +++ b/frontend/src/views/settings/Profile.vue @@ -15,6 +15,14 @@ {{ t("settings.singleClick") }}

+

+ + {{ t("settings.redirectAfterCopyMove") }} +

{{ t("settings.setDateFormat") }} @@ -116,6 +124,7 @@ const currentPassword = ref(""); const isCurrentPasswordRequired = ref(false); const hideDotfiles = ref(false); const singleClick = ref(false); +const redirectAfterCopyMove = ref(false); const dateFormat = ref(false); const locale = ref(""); const aceEditorTheme = ref(""); @@ -140,6 +149,7 @@ onMounted(async () => { locale.value = authStore.user.locale; hideDotfiles.value = authStore.user.hideDotfiles; singleClick.value = authStore.user.singleClick; + redirectAfterCopyMove.value = authStore.user.redirectAfterCopyMove; dateFormat.value = authStore.user.dateFormat; aceEditorTheme.value = authStore.user.aceEditorTheme; layoutStore.loading = false; @@ -187,6 +197,7 @@ const updateSettings = async (event: Event) => { locale: locale.value, hideDotfiles: hideDotfiles.value, singleClick: singleClick.value, + redirectAfterCopyMove: redirectAfterCopyMove.value, dateFormat: dateFormat.value, aceEditorTheme: aceEditorTheme.value, }; @@ -195,6 +206,7 @@ const updateSettings = async (event: Event) => { "locale", "hideDotfiles", "singleClick", + "redirectAfterCopyMove", "dateFormat", "aceEditorTheme", ]); diff --git a/http/auth.go b/http/auth.go index 5a483a8d..4eceeafe 100644 --- a/http/auth.go +++ b/http/auth.go @@ -23,17 +23,18 @@ const ( ) type userInfo struct { - ID uint `json:"id"` - Locale string `json:"locale"` - ViewMode users.ViewMode `json:"viewMode"` - SingleClick bool `json:"singleClick"` - Perm users.Permissions `json:"perm"` - Commands []string `json:"commands"` - LockPassword bool `json:"lockPassword"` - HideDotfiles bool `json:"hideDotfiles"` - DateFormat bool `json:"dateFormat"` - Username string `json:"username"` - AceEditorTheme string `json:"aceEditorTheme"` + ID uint `json:"id"` + Locale string `json:"locale"` + ViewMode users.ViewMode `json:"viewMode"` + SingleClick bool `json:"singleClick"` + RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"` + Perm users.Permissions `json:"perm"` + Commands []string `json:"commands"` + LockPassword bool `json:"lockPassword"` + HideDotfiles bool `json:"hideDotfiles"` + DateFormat bool `json:"dateFormat"` + Username string `json:"username"` + AceEditorTheme string `json:"aceEditorTheme"` } type authToken struct { @@ -204,17 +205,18 @@ func renewHandler(tokenExpireTime time.Duration) handleFunc { func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) { claims := &authToken{ User: userInfo{ - ID: user.ID, - Locale: user.Locale, - ViewMode: user.ViewMode, - SingleClick: user.SingleClick, - Perm: user.Perm, - LockPassword: user.LockPassword, - Commands: user.Commands, - HideDotfiles: user.HideDotfiles, - DateFormat: user.DateFormat, - Username: user.Username, - AceEditorTheme: user.AceEditorTheme, + ID: user.ID, + Locale: user.Locale, + ViewMode: user.ViewMode, + SingleClick: user.SingleClick, + RedirectAfterCopyMove: user.RedirectAfterCopyMove, + Perm: user.Perm, + LockPassword: user.LockPassword, + Commands: user.Commands, + HideDotfiles: user.HideDotfiles, + DateFormat: user.DateFormat, + Username: user.Username, + AceEditorTheme: user.AceEditorTheme, }, RegisteredClaims: jwt.RegisteredClaims{ IssuedAt: jwt.NewNumericDate(time.Now()), diff --git a/settings/defaults.go b/settings/defaults.go index 5b6c3f2a..46024179 100644 --- a/settings/defaults.go +++ b/settings/defaults.go @@ -8,16 +8,17 @@ import ( // UserDefaults is a type that holds the default values // for some fields on User. type UserDefaults struct { - Scope string `json:"scope"` - Locale string `json:"locale"` - ViewMode users.ViewMode `json:"viewMode"` - SingleClick bool `json:"singleClick"` - Sorting files.Sorting `json:"sorting"` - Perm users.Permissions `json:"perm"` - Commands []string `json:"commands"` - HideDotfiles bool `json:"hideDotfiles"` - DateFormat bool `json:"dateFormat"` - AceEditorTheme string `json:"aceEditorTheme"` + Scope string `json:"scope"` + Locale string `json:"locale"` + ViewMode users.ViewMode `json:"viewMode"` + SingleClick bool `json:"singleClick"` + RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"` + Sorting files.Sorting `json:"sorting"` + Perm users.Permissions `json:"perm"` + Commands []string `json:"commands"` + HideDotfiles bool `json:"hideDotfiles"` + DateFormat bool `json:"dateFormat"` + AceEditorTheme string `json:"aceEditorTheme"` } // Apply applies the default options to a user. @@ -26,6 +27,7 @@ func (d *UserDefaults) Apply(u *users.User) { u.Locale = d.Locale u.ViewMode = d.ViewMode u.SingleClick = d.SingleClick + u.RedirectAfterCopyMove = d.RedirectAfterCopyMove u.Perm = d.Perm u.Sorting = d.Sorting u.Commands = d.Commands diff --git a/users/users.go b/users/users.go index 0fcc26d8..7181b299 100644 --- a/users/users.go +++ b/users/users.go @@ -20,22 +20,23 @@ const ( // User describes a user. type User struct { - ID uint `storm:"id,increment" json:"id"` - Username string `storm:"unique" json:"username"` - Password string `json:"password"` - Scope string `json:"scope"` - Locale string `json:"locale"` - LockPassword bool `json:"lockPassword"` - ViewMode ViewMode `json:"viewMode"` - SingleClick bool `json:"singleClick"` - Perm Permissions `json:"perm"` - Commands []string `json:"commands"` - Sorting files.Sorting `json:"sorting"` - Fs afero.Fs `json:"-" yaml:"-"` - Rules []rules.Rule `json:"rules"` - HideDotfiles bool `json:"hideDotfiles"` - DateFormat bool `json:"dateFormat"` - AceEditorTheme string `json:"aceEditorTheme"` + ID uint `storm:"id,increment" json:"id"` + Username string `storm:"unique" json:"username"` + Password string `json:"password"` + Scope string `json:"scope"` + Locale string `json:"locale"` + LockPassword bool `json:"lockPassword"` + ViewMode ViewMode `json:"viewMode"` + SingleClick bool `json:"singleClick"` + RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"` + Perm Permissions `json:"perm"` + Commands []string `json:"commands"` + Sorting files.Sorting `json:"sorting"` + Fs afero.Fs `json:"-" yaml:"-"` + Rules []rules.Rule `json:"rules"` + HideDotfiles bool `json:"hideDotfiles"` + DateFormat bool `json:"dateFormat"` + AceEditorTheme string `json:"aceEditorTheme"` } // GetRules implements rules.Provider. diff --git a/www/docs/cli/filebrowser-config-init.md b/www/docs/cli/filebrowser-config-init.md index f4ff829f..0f16efa7 100644 --- a/www/docs/cli/filebrowser-config-init.md +++ b/www/docs/cli/filebrowser-config-init.md @@ -61,6 +61,7 @@ filebrowser config init [flags] --recaptcha.host string use another host for ReCAPTCHA. recaptcha.net might be useful in China (default "https://www.google.com") --recaptcha.key string ReCaptcha site key --recaptcha.secret string ReCaptcha secret + --redirectAfterCopyMove redirect to destination after copy/move -r, --root string root to prepend to relative paths (default ".") --scope string scope for users (default ".") --shell string shell command to which other commands should be appended diff --git a/www/docs/cli/filebrowser-config-set.md b/www/docs/cli/filebrowser-config-set.md index 5b166d7d..603bb506 100644 --- a/www/docs/cli/filebrowser-config-set.md +++ b/www/docs/cli/filebrowser-config-set.md @@ -58,6 +58,7 @@ filebrowser config set [flags] --recaptcha.host string use another host for ReCAPTCHA. recaptcha.net might be useful in China (default "https://www.google.com") --recaptcha.key string ReCaptcha site key --recaptcha.secret string ReCaptcha secret + --redirectAfterCopyMove redirect to destination after copy/move -r, --root string root to prepend to relative paths (default ".") --scope string scope for users (default ".") --shell string shell command to which other commands should be appended diff --git a/www/docs/cli/filebrowser-users-add.md b/www/docs/cli/filebrowser-users-add.md index c6c5b53d..1de95e4d 100644 --- a/www/docs/cli/filebrowser-users-add.md +++ b/www/docs/cli/filebrowser-users-add.md @@ -28,6 +28,7 @@ filebrowser users add [flags] --perm.modify modify perm for users (default true) --perm.rename rename perm for users (default true) --perm.share share perm for users (default true) + --redirectAfterCopyMove redirect to destination after copy/move --scope string scope for users (default ".") --singleClick use single clicks only --sorting.asc sorting by ascending order diff --git a/www/docs/cli/filebrowser-users-update.md b/www/docs/cli/filebrowser-users-update.md index 996bdac7..4ba7d608 100644 --- a/www/docs/cli/filebrowser-users-update.md +++ b/www/docs/cli/filebrowser-users-update.md @@ -30,6 +30,7 @@ filebrowser users update [flags] --perm.modify modify perm for users (default true) --perm.rename rename perm for users (default true) --perm.share share perm for users (default true) + --redirectAfterCopyMove redirect to destination after copy/move --scope string scope for users (default ".") --singleClick use single clicks only --sorting.asc sorting by ascending order From 037e29a7084b23a3a7a16b25d70c54f710b27bec Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Sat, 10 Jan 2026 10:30:26 +0100 Subject: [PATCH 47/56] chore(release): 2.54.0 --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f98a426..13ee556f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. +## [2.54.0](https://github.com/filebrowser/filebrowser/compare/v2.53.1...v2.54.0) (2026-01-10) + + +### Features + +* add "redirect after copy/move" user setting ([#5662](https://github.com/filebrowser/filebrowser/issues/5662)) ([fda8a99](https://github.com/filebrowser/filebrowser/commit/fda8a992929b1466e75fb2813f2c4e293c12d244)) +* force file sync while uploading file ([#5668](https://github.com/filebrowser/filebrowser/issues/5668)) ([4fd18a3](https://github.com/filebrowser/filebrowser/commit/4fd18a382c31bbe7059d6733ffa371e70051865b)) +* update translations ([#5659](https://github.com/filebrowser/filebrowser/issues/5659)) ([464b581](https://github.com/filebrowser/filebrowser/commit/464b581953139c17e3276b774e381e4052827125)) + + +### Bug Fixes + +* clear selection by clicking on empty area ([#5663](https://github.com/filebrowser/filebrowser/issues/5663)) ([208535a](https://github.com/filebrowser/filebrowser/commit/208535a8cc23254de0013dfab9008486707ee6c2)) +* hide "change password form" in noauth setting ([#5652](https://github.com/filebrowser/filebrowser/issues/5652)) ([219582c](https://github.com/filebrowser/filebrowser/commit/219582c0b03fd90979b1d1398dba7919d086a23f)) + ## [2.53.1](https://github.com/filebrowser/filebrowser/compare/v2.53.0...v2.53.1) (2026-01-03) From 59ca0c340afc7774747c70ede9a5a5a3c9349d6b Mon Sep 17 00:00:00 2001 From: Andy <87505797+AndyBodnar@users.noreply.github.com> Date: Sat, 17 Jan 2026 14:57:01 -0700 Subject: [PATCH 48/56] fix: prevent context menu clicks from clearing file selection (#5681) --- frontend/src/views/files/FileListing.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue index 62a6819f..c9f636ba 100644 --- a/frontend/src/views/files/FileListing.vue +++ b/frontend/src/views/files/FileListing.vue @@ -1059,6 +1059,9 @@ const handleEmptyAreaClick = (e: MouseEvent) => { if (target.closest("item") || target.closest(".item")) return; + // Do not clear selection when clicking on context menu actions + if (target.closest(".context-menu")) return; + fileStore.selected = []; }; From cfa6c5864e5e7673aa9f3180e4964e0db92cc4da Mon Sep 17 00:00:00 2001 From: Ariel Leyva Date: Sun, 18 Jan 2026 02:36:25 -0500 Subject: [PATCH 49/56] fix: request current password when deleting users (#5667) --- frontend/src/api/users.ts | 8 +++++++- frontend/src/views/settings/User.vue | 9 +++------ http/users.go | 20 +++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/frontend/src/api/users.ts b/frontend/src/api/users.ts index 56e1d0f3..dc45e084 100644 --- a/frontend/src/api/users.ts +++ b/frontend/src/api/users.ts @@ -42,8 +42,14 @@ export async function update( }); } -export async function remove(id: number) { +export async function remove( + id: number, + currentPassword: string | null = null +) { await fetchURL(`/api/users/${id}`, { method: "DELETE", + body: JSON.stringify({ + ...(currentPassword != null ? { current_password: currentPassword } : {}), + }), }); } diff --git a/frontend/src/views/settings/User.vue b/frontend/src/views/settings/User.vue index be46fabb..77786e2a 100644 --- a/frontend/src/views/settings/User.vue +++ b/frontend/src/views/settings/User.vue @@ -71,6 +71,7 @@ import { computed, inject, onMounted, ref, watch } from "vue"; import { useRoute, useRouter } from "vue-router"; import { useI18n } from "vue-i18n"; import { StatusError } from "@/api/utils"; +import { authMethod } from "@/utils/constants"; const error = ref(); const originalUser = ref(); @@ -105,11 +106,7 @@ const fetchData = async () => { try { if (isNew.value) { - const { - authMethod, - defaults, - createUserDir: _createUserDir, - } = await settings.get(); + const { defaults, createUserDir: _createUserDir } = await settings.get(); isCurrentPasswordRequired.value = authMethod == "json"; createUserDir.value = _createUserDir; user.value = { @@ -146,7 +143,7 @@ const deleteUser = async (e: Event) => { return false; } try { - await api.remove(user.value.id); + await api.remove(user.value.id, currentPassword.value); router.push({ path: "/settings/users" }); $showSuccess(t("settings.userDeleted")); } catch (err) { diff --git a/http/users.go b/http/users.go index adae7729..5604dc38 100644 --- a/http/users.go +++ b/http/users.go @@ -103,7 +103,25 @@ var userGetHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request return renderJSON(w, r, u) }) -var userDeleteHandler = withSelfOrAdmin(func(_ http.ResponseWriter, _ *http.Request, d *data) (int, error) { +var userDeleteHandler = withSelfOrAdmin(func(_ http.ResponseWriter, r *http.Request, d *data) (int, error) { + if r.Body == nil { + return http.StatusBadRequest, fberrors.ErrEmptyRequest + } + + var body struct { + CurrentPassword string `json:"current_password"` + } + + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + return http.StatusBadRequest, err + } + + if d.settings.AuthMethod == auth.MethodJSONAuth { + if !users.CheckPwd(body.CurrentPassword, d.user.Password) { + return http.StatusBadRequest, fberrors.ErrCurrentPasswordIncorrect + } + } + err := d.store.Users.Delete(d.raw.(uint)) if err != nil { return errToStatus(err), err From 4094fb359babac70e88d0ed4bfe3bd100744aad6 Mon Sep 17 00:00:00 2001 From: Ariel Leyva Date: Sun, 18 Jan 2026 02:37:12 -0500 Subject: [PATCH 50/56] fix: retain file selection when closing the editor (#5693) --- frontend/src/views/files/Editor.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue index 58f0d524..fc5f9728 100644 --- a/frontend/src/views/files/Editor.vue +++ b/frontend/src/views/files/Editor.vue @@ -236,7 +236,6 @@ const close = () => { }; const finishClose = () => { - fileStore.updateRequest(null); const uri = url.removeLastDir(route.path) + "/"; router.push({ path: uri }); }; From 24781badd413ee20333aba5cce1919d676e01889 Mon Sep 17 00:00:00 2001 From: GUCHI <82448575+GUCHIHACKER@users.noreply.github.com> Date: Sun, 18 Jan 2026 08:44:16 +0100 Subject: [PATCH 51/56] Merge commit from fork Added a dummy bcrypt hash to prevent user enumeration timing attacks in JSON authentication. --- auth/json.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/auth/json.go b/auth/json.go index f779c476..2284dc7f 100644 --- a/auth/json.go +++ b/auth/json.go @@ -14,6 +14,10 @@ import ( // MethodJSONAuth is used to identify json auth. const MethodJSONAuth settings.AuthMethod = "json" +// dummyHash is used to prevent user enumeration timing attacks. +// It MUST be a valid bcrypt hash. +const dummyHash = "$2a$10$O4mEMeOL/nit6zqe.WQXauLRbRlzb3IgLHsa26Pf0N/GiU9b.wK1m" + type jsonCred struct { Password string `json:"password"` Username string `json:"username"` @@ -52,7 +56,17 @@ func (a JSONAuth) Auth(r *http.Request, usr users.Store, _ *settings.Settings, s } u, err := usr.Get(srv.Root, cred.Username) - if err != nil || !users.CheckPwd(cred.Password, u.Password) { + + hash := dummyHash + if err == nil { + hash = u.Password + } + + if !users.CheckPwd(cred.Password, hash) { + return nil, os.ErrPermission + } + + if err != nil { return nil, os.ErrPermission } From e7ea1ad27d3d17e249489d3338be40bfea15e2a1 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 08:45:48 +0100 Subject: [PATCH 52/56] feat: update translations (#5677) Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- frontend/src/i18n/ar.json | 1 + frontend/src/i18n/bg.json | 1 + frontend/src/i18n/ca.json | 1 + frontend/src/i18n/cs.json | 1 + frontend/src/i18n/de.json | 1 + frontend/src/i18n/el.json | 1 + frontend/src/i18n/es.json | 1 + frontend/src/i18n/fa.json | 1 + frontend/src/i18n/fr.json | 1 + frontend/src/i18n/he.json | 1 + frontend/src/i18n/hr.json | 1 + frontend/src/i18n/hu.json | 1 + frontend/src/i18n/is.json | 1 + frontend/src/i18n/it.json | 1 + frontend/src/i18n/ja.json | 1 + frontend/src/i18n/ko.json | 1 + frontend/src/i18n/lv.json | 1 + frontend/src/i18n/lv_LV.json | 7 ++++--- frontend/src/i18n/nl-be.json | 1 + frontend/src/i18n/no.json | 1 + frontend/src/i18n/pl.json | 3 ++- frontend/src/i18n/pt-br.json | 1 + frontend/src/i18n/pt.json | 1 + frontend/src/i18n/ro.json | 1 + frontend/src/i18n/ru.json | 1 + frontend/src/i18n/sk.json | 1 + frontend/src/i18n/sv-se.json | 1 + frontend/src/i18n/tr.json | 1 + frontend/src/i18n/uk.json | 1 + frontend/src/i18n/vi.json | 1 + frontend/src/i18n/zh-cn.json | 5 +++-- frontend/src/i18n/zh-tw.json | 1 + 32 files changed, 38 insertions(+), 6 deletions(-) diff --git a/frontend/src/i18n/ar.json b/frontend/src/i18n/ar.json index bbe17461..b8f431eb 100644 --- a/frontend/src/i18n/ar.json +++ b/frontend/src/i18n/ar.json @@ -232,6 +232,7 @@ "permissions": "الصلاحيات", "permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n", "profileSettings": "إعدادات الحساب", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n", "ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.", "rules": "المجموعات", diff --git a/frontend/src/i18n/bg.json b/frontend/src/i18n/bg.json index afbd8a9c..d1388d3f 100644 --- a/frontend/src/i18n/bg.json +++ b/frontend/src/i18n/bg.json @@ -232,6 +232,7 @@ "permissions": "Разрешения", "permissionsHelp": "Можете да зададете потребител да бъде администратор или да изберете разрешения индивидуално. Ако изберете \"Администратор\" всички други опции ще бъдат автоматично отметнати. Управлението на потребителите е привилегия на администратор.\n", "profileSettings": "Настройки на Профила", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "предотвратете достъпа до всеки файл започващ с точка (като .git, .gitignore) във всяка папка.\n", "ruleExample2": "блокира достъпа до файл именуван Caddyfile поставен в началото за обхвата.", "rules": "Правила", diff --git a/frontend/src/i18n/ca.json b/frontend/src/i18n/ca.json index a8e88498..2ca2b5d4 100644 --- a/frontend/src/i18n/ca.json +++ b/frontend/src/i18n/ca.json @@ -232,6 +232,7 @@ "permissions": "Permisos", "permissionsHelp": "Pots nomenar l'usuari com a administrador o triar els permisos individualment. Si selecciones \"Administrador\", totes les altres opcions s'activaran automàticament. L'administració d'usuaris és un privilegi d'administrador.\n", "profileSettings": "Ajustos del perfil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "prevé l'accés a una extensió de fitxer (Com .git) en cada carpeta.\n", "ruleExample2": "bloqueja l'accés al fitxer anomenat Caddyfile a la carpeta arrel.", "rules": "Regles", diff --git a/frontend/src/i18n/cs.json b/frontend/src/i18n/cs.json index 6f489c53..d57c4336 100644 --- a/frontend/src/i18n/cs.json +++ b/frontend/src/i18n/cs.json @@ -232,6 +232,7 @@ "permissions": "Oprávnění", "permissionsHelp": "Můžete nastavit uživatele jako administrátora nebo zvolit jednotlivá oprávnění. Pokud vyberete \"Administrátor\", všechny ostatní možnosti budou automaticky zaškrtnuty. Správa uživatelů zůstává výsadou administrátora.\n", "profileSettings": "Nastavení profilu", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "zabraňuje přístupu k jakémukoli skrytému souboru (např. .git, .gitignore) v každé složce.\n", "ruleExample2": "blokuje přístup k souboru s názvem Caddyfile v kořenovém adresáři.", "rules": "Pravidla", diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index 815fbd1f..872b29e2 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -232,6 +232,7 @@ "permissions": "Berechtigungen", "permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigungen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n", "profileSettings": "Profileinstellungen", + "redirectAfterCopyMove": "Nach Kopieren/Verschieben zum Zielverzeichnis wechseln", "ruleExample1": "Verhindert den Zugang zu versteckten Dateien (dot-Files, wie .git, .gitignore) in allen Ordnern\n", "ruleExample2": "blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des Scopes.", "rules": "Regeln", diff --git a/frontend/src/i18n/el.json b/frontend/src/i18n/el.json index 121452a1..04e837f3 100644 --- a/frontend/src/i18n/el.json +++ b/frontend/src/i18n/el.json @@ -232,6 +232,7 @@ "permissions": "Δικαιώματα", "permissionsHelp": "Μπορείτε να ορίσετε τον χρήστη ως διαχειριστή ή να επιλέξετε τα δικαιώματα μεμονωμένα. Αν επιλέξετε \"Διαχειριστής\", όλες οι υπόλοιπες επιλογές θα είναι αυτόματα επιλεγμένες. Η διαχείριση χρηστών παραμένει προνόμιο ενός χρήστη με τον ρόλο του διαχειριστή.\n", "profileSettings": "Ρυθμίσεις προφίλ", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "αποκλείει την πρόσβαση σε οποιοδήποτε κρυφό αρχείο (όπως .git, .gitignore) σε κάθε φάκελο.\n", "ruleExample2": "αποκλείει την πρόσβαση στο αρχείο με το όνομα Caddyfile στον ριζικό φάκελο της εμβέλειας του κανόνα.", "rules": "Κανόνες", diff --git a/frontend/src/i18n/es.json b/frontend/src/i18n/es.json index 28338c98..aaab108b 100644 --- a/frontend/src/i18n/es.json +++ b/frontend/src/i18n/es.json @@ -232,6 +232,7 @@ "permissions": "Permisos", "permissionsHelp": "Puedes nombrar al usuario como administrador o elegir los permisos individualmente. Si seleccionas \"Administrador\", todas las otras opciones serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.\n", "profileSettings": "Ajustes del perfil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previene el acceso a una extensión de archivo (Como .git) en cada carpeta.\n", "ruleExample2": "bloquea el acceso al archivo llamado Caddyfile en la carpeta raíz.", "rules": "Reglas", diff --git a/frontend/src/i18n/fa.json b/frontend/src/i18n/fa.json index 4af7f205..3484d3a0 100644 --- a/frontend/src/i18n/fa.json +++ b/frontend/src/i18n/fa.json @@ -232,6 +232,7 @@ "permissions": "دسترسی ها", "permissionsHelp": "شما می‌توانید کاربر را به عنوان مدیر تنظیم کنید یا دسترسی‌ها را به صورت جداگانه انتخاب کنید. اگر \"مدیر\" را انتخاب کنید، تمام گزینه‌های دیگر به طور خودکار اعمال می‌شوند. مدیریت کاربران همچنان از اختیارات مدیر است.", "profileSettings": "تنظیمات ناحیه کاربری", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "از دسترسی به هرگونه فایل نقطه‌ای (مانند .git، .gitignore) در هر پوشه جلوگیری می‌کند.", "ruleExample2": "دسترسی به فایلی به نام Caddyfile را در ریشه دامنه مسدود می‌کند.", "rules": "قواعد", diff --git a/frontend/src/i18n/fr.json b/frontend/src/i18n/fr.json index 148306e5..798cee50 100644 --- a/frontend/src/i18n/fr.json +++ b/frontend/src/i18n/fr.json @@ -232,6 +232,7 @@ "permissions": "Permissions", "permissionsHelp": "Vous pouvez définir l'utilisateur·ice comme étant administrateur·ice ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur·ice\", toutes les autres options seront automatiquement activées. La gestion des utilisateur·ices est un privilège que seul l'administrateur·ice possède.\n", "profileSettings": "Paramètres du profil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "Bloque l'accès à tous les fichiers commençant par un point (comme par exemple .git, .gitignore) dans tous les dossiers.\n", "ruleExample2": "Bloque l'accès au fichier nommé \"Caddyfile\" à la racine du dossier utilisateur·ice.", "rules": "Règles", diff --git a/frontend/src/i18n/he.json b/frontend/src/i18n/he.json index d2deb938..f340feca 100644 --- a/frontend/src/i18n/he.json +++ b/frontend/src/i18n/he.json @@ -232,6 +232,7 @@ "permissions": "הרשאות", "permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות יינתנו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n", "profileSettings": "הגדרות פרופיל", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ/תיקייה שמתחיל בנקודה, לדוגמא .git)", "ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בהיקף הראשי.", "rules": "חוקים", diff --git a/frontend/src/i18n/hr.json b/frontend/src/i18n/hr.json index 1a467cc0..e21ffd80 100644 --- a/frontend/src/i18n/hr.json +++ b/frontend/src/i18n/hr.json @@ -232,6 +232,7 @@ "permissions": "Dopuštenja", "permissionsHelp": "Korisnika možete postaviti administratorom ili odabrati dopuštenja individualno. Odabirom na \"Administrator\", sve druge opcije bit će automatski odabrane. Upravljanje korisnicima ostaje privilegija administratora.\n", "profileSettings": "Postavke profila", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "onemogućava pristup svakoj datoteci koja započinje točkom (poput .git, .gitignore) u svakoj mapi.\n", "ruleExample2": "blokira pristup datoteci naziva Caddyfile na korijenu opsega.", "rules": "Pravila", diff --git a/frontend/src/i18n/hu.json b/frontend/src/i18n/hu.json index 0f2abeef..f6d856cf 100644 --- a/frontend/src/i18n/hu.json +++ b/frontend/src/i18n/hu.json @@ -232,6 +232,7 @@ "permissions": "Jogosultságok", "permissionsHelp": "A felhasználót beállíthatja rendszergazdának, vagy egyénileg is kiválaszthatja a jogosultságokat. Ha a \"Rendszergazda\" lehetőséget választja, az összes többi opció automatikusan be lesz jelölve. A felhasználók kezelése továbbra is a rendszergazda kiváltsága marad.\n", "profileSettings": "Profilbeállítások", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "megakadályozza a hozzáférést bármely rejtett fájlhoz (pl. .git, .gitignore) bármely mappában.\n", "ruleExample2": "blokkolja a hozzáférést a Caddyfile nevű fájlhoz a hatókör gyökerében.", "rules": "Szabályok", diff --git a/frontend/src/i18n/is.json b/frontend/src/i18n/is.json index 2752b60f..01b3ace6 100644 --- a/frontend/src/i18n/is.json +++ b/frontend/src/i18n/is.json @@ -232,6 +232,7 @@ "permissions": "Heimildir", "permissionsHelp": "Þú getur stillt notenda sem stjórnanda eða valið einstaklingsbundnar heimildir. Ef þú velur \"Stjórnandi\", þá verða allir aðrir valmöguleikar valdir sjálfrafa. Aðgangstýring notenda er á hendi stjórnenda. \n", "profileSettings": "Stilla prófíl", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "kemur í veg fyrir aðgang að dot-skjali (t.d. .git, .gitignore) í öllum möppum. \n", "ruleExample2": "kemur í veg fyrir aðgang að Caddyfile-skjalinu í root-möppu í sýn notandans. ", "rules": "Reglur", diff --git a/frontend/src/i18n/it.json b/frontend/src/i18n/it.json index 29863efa..ad54172c 100644 --- a/frontend/src/i18n/it.json +++ b/frontend/src/i18n/it.json @@ -232,6 +232,7 @@ "permissions": "Permessi", "permissionsHelp": "È possibile impostare l'utente come amministratore o scegliere i permessi singolarmente. Se si seleziona \"Amministratore\", tutte le altre opzioni saranno automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.\n", "profileSettings": "Impostazioni del profilo", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "impedisci l'accesso a qualsiasi file avente come prefisso un punto\n (ad esempio .git, .gitignore) presente in ogni cartella.\n", "ruleExample2": "blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.", "rules": "Regole", diff --git a/frontend/src/i18n/ja.json b/frontend/src/i18n/ja.json index f6f2b886..44beb9cb 100644 --- a/frontend/src/i18n/ja.json +++ b/frontend/src/i18n/ja.json @@ -232,6 +232,7 @@ "permissions": "権限", "permissionsHelp": "ユーザーを管理者に設定するか、その他の権限を個別に選択することができます。「管理者」を選択すると、他のオプションはすべて自動的にチェックされます。ユーザーを管理するには管理者権限が必要です。\n", "profileSettings": "プロフィール設定", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": ".git や .gitignore のようなドットから始まるファイルへのアクセスを禁止します。\n", "ruleExample2": "スコープのルートにある Caddyfile という名前のファイルへのアクセスを禁止します。", "rules": "ルール", diff --git a/frontend/src/i18n/ko.json b/frontend/src/i18n/ko.json index fe1e6ec2..c1d49b18 100644 --- a/frontend/src/i18n/ko.json +++ b/frontend/src/i18n/ko.json @@ -232,6 +232,7 @@ "permissions": "권한", "permissionsHelp": "사용자를 관리자로 만들거나 권한을 부여할 수 있습니다. 관리자를 선택하면, 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 현재 관리자만 할 수 있습니다.\n", "profileSettings": "프로필 설정", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "점(.)으로 시작하는 모든 파일의 접근을 방지합니다.(예 .git, .gitignore)\n", "ruleExample2": "Caddyfile파일의 접근을 방지합니다.", "rules": "룰", diff --git a/frontend/src/i18n/lv.json b/frontend/src/i18n/lv.json index fabd4a86..c7e1d02f 100644 --- a/frontend/src/i18n/lv.json +++ b/frontend/src/i18n/lv.json @@ -232,6 +232,7 @@ "permissions": "Atļaujas", "permissionsHelp": "Varat iestatīt lietotāju kā administratoru vai izvēlēties atļaujas individuāli. Ja atlasīsiet “Administrators”, visas pārējās opcijas tiks automātiski atzīmētas. Lietotāju pārvaldība joprojām ir administratora privilēģija.\n", "profileSettings": "Profila iestatījumi", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "neļauj piekļūt jebkuram dotfile failam (piemēram, .git, .gitignore) katrā mapē.\n", "ruleExample2": "bloķē piekļuvi failam ar nosaukumu Caddyfile darbības jomas saknē.", "rules": "Noteikumi", diff --git a/frontend/src/i18n/lv_LV.json b/frontend/src/i18n/lv_LV.json index fabd4a86..c6af9aed 100644 --- a/frontend/src/i18n/lv_LV.json +++ b/frontend/src/i18n/lv_LV.json @@ -43,7 +43,7 @@ "upload": "Augšupielādēt", "openFile": "Atvērt failu", "discardChanges": "Izmest", - "stopSearch": "Stop searching", + "stopSearch": "Beigt meklēšanu", "saveChanges": "Saglabāt izmaiņas", "editAsText": "Rediģēt kā tekstu", "increaseFontSize": "Palieliniet fonta lielumu", @@ -232,6 +232,7 @@ "permissions": "Atļaujas", "permissionsHelp": "Varat iestatīt lietotāju kā administratoru vai izvēlēties atļaujas individuāli. Ja atlasīsiet “Administrators”, visas pārējās opcijas tiks automātiski atzīmētas. Lietotāju pārvaldība joprojām ir administratora privilēģija.\n", "profileSettings": "Profila iestatījumi", + "redirectAfterCopyMove": "Pārvirzīt uz galapunktu pēc kopēšanas/pārvietošanas", "ruleExample1": "neļauj piekļūt jebkuram dotfile failam (piemēram, .git, .gitignore) katrā mapē.\n", "ruleExample2": "bloķē piekļuvi failam ar nosaukumu Caddyfile darbības jomas saknē.", "rules": "Noteikumi", @@ -241,7 +242,7 @@ "settingsUpdated": "Iestatījumi atjaunināti!", "shareDuration": "Kopīgošanas ilgums", "shareManagement": "Kopīgošanas pārvaldība", - "shareDeleted": "Kopīgošana ir izdzēsta!", + "shareDeleted": "Kopīgojums izdzēsts!", "singleClick": "Failu un direktoriju atvēršanai izmantojiet vienus klikšķi", "themes": { "default": "Sistēmas noklusējums", @@ -259,7 +260,7 @@ "userUpdated": "Lietotājs atjaunināts!", "username": "Lietotājvārds", "users": "Lietotāji", - "currentPassword": "Your Current Password" + "currentPassword": "Esošā Parole" }, "sidebar": { "help": "Palīdzība", diff --git a/frontend/src/i18n/nl-be.json b/frontend/src/i18n/nl-be.json index 6b2b5384..a5fcb062 100644 --- a/frontend/src/i18n/nl-be.json +++ b/frontend/src/i18n/nl-be.json @@ -232,6 +232,7 @@ "permissions": "Permissies", "permissionsHelp": "U kunt de gebruiker instellen als beheerder of de machtigingen afzonderlijk kiezen. Als u \"Beheerder\" selecteert, worden alle andere opties automatisch gecontroleerd. Het beheer van gebruikers blijft een privilege van een beheerder.\n", "profileSettings": "Profielinstellingen", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "voorkomt de toegang tot elk puntbestand (zoals .git, .gitignore) in elke map.\n", "ruleExample2": "blokkeert de toegang tot het bestand met de naam Caddyfile in de hoofdmap van het bereik.", "rules": "Regels", diff --git a/frontend/src/i18n/no.json b/frontend/src/i18n/no.json index 79b6f958..3a5e7bdd 100644 --- a/frontend/src/i18n/no.json +++ b/frontend/src/i18n/no.json @@ -232,6 +232,7 @@ "permissions": "Tilaterser", "permissionsHelp": "Du kan angi brukeren som administrator eller velge tillatelsene individuelt. Hvis du velger «Administrator», vil alle de andre alternativene bli automatisk avkrysset. Administrasjon av brukere er fortsatt et privilegium for en administrator.\n", "profileSettings": "Profil Innstilinger", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "forhindrer tilgang til noen dotfiler (som .git, .gitignore) i alle mapper.\n", "ruleExample2": "blokkerer tilgangen til filen med navnet Caddyfile på roten av omfanget.", "rules": "Regler", diff --git a/frontend/src/i18n/pl.json b/frontend/src/i18n/pl.json index 2d43d91a..64b9f04a 100644 --- a/frontend/src/i18n/pl.json +++ b/frontend/src/i18n/pl.json @@ -231,7 +231,8 @@ }, "permissions": "Uprawnienia", "permissionsHelp": "Możesz ustawić użytkownika jako administratora lub wybrać uprawnienia indywidualnie. Jeśli wybierzesz „Administrator”, wszystkie pozostałe opcje zostaną automatycznie zaznaczone. Zarządzanie użytkownikami pozostaje przywilejem administratora.\n", - "profileSettings": "Twój profil", + "profileSettings": "Ustawienia profilu", + "redirectAfterCopyMove": "Przekieruj do miejsca docelowego po skopiowaniu lub przeniesieniu", "ruleExample1": "uniemożliwia dostęp do plików poprzedzonych kropką (takich jak .git, .gitignore) we wszystkich folderach.\n", "ruleExample2": "blokuje dostęp do pliku o nazwie Caddyfile w katalogu głównym zakresu.", "rules": "Uprawnienia", diff --git a/frontend/src/i18n/pt-br.json b/frontend/src/i18n/pt-br.json index 2f563354..f6aa8f4e 100644 --- a/frontend/src/i18n/pt-br.json +++ b/frontend/src/i18n/pt-br.json @@ -232,6 +232,7 @@ "permissions": "Permissões", "permissionsHelp": "Pode definir o usuário como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos usuários é um privilégio restringido aos administradores.\n", "profileSettings": "Configurações do usuário", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n", "ruleExample2": "bloqueia o acesso ao arquivo chamado Caddyfile.", "rules": "Regras", diff --git a/frontend/src/i18n/pt.json b/frontend/src/i18n/pt.json index 4c076622..dcacf3b6 100644 --- a/frontend/src/i18n/pt.json +++ b/frontend/src/i18n/pt.json @@ -232,6 +232,7 @@ "permissions": "Permissões", "permissionsHelp": "Pode definir o utilizador como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido aos administradores.\n", "profileSettings": "Configurações do utilizador", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n", "ruleExample2": "bloqueia o acesso ao ficheiro chamado Caddyfile na raiz.", "rules": "Regras", diff --git a/frontend/src/i18n/ro.json b/frontend/src/i18n/ro.json index 82b5c388..c80c4e28 100644 --- a/frontend/src/i18n/ro.json +++ b/frontend/src/i18n/ro.json @@ -232,6 +232,7 @@ "permissions": "Permisiuni", "permissionsHelp": "Poți alege ca un utilizator să fie administrator sau să-i alegi permisiunile individual. Dacă alegi \"Administrator\", toate celelalte opțiuni vor fi bifate automat. Gestionarea utilizatorilor rămâne un privilegiu exclusiv al administratorilor.\n", "profileSettings": "Setări profil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "împiedică accesul la fisiere cu punct in față (.), cum ar fi .git, .gitignore în orice director.\n", "ruleExample2": "împiedică accesul la fișierul Caddyfile din rădăcina domeniului.", "rules": "Reguli", diff --git a/frontend/src/i18n/ru.json b/frontend/src/i18n/ru.json index 359fd228..60b211f6 100644 --- a/frontend/src/i18n/ru.json +++ b/frontend/src/i18n/ru.json @@ -232,6 +232,7 @@ "permissions": "Права доступа", "permissionsHelp": "Можно настроить пользователя как администратора или выбрать разрешения индивидуально. При выборе \"Администратор\", все остальные параметры будут автоматически выбраны. Управление пользователями - привилегия администратора.\n", "profileSettings": "Настройки профиля", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "предотвратить доступ к любому скрытому файлу (например: .git, .gitignore) в каждой папке.\n", "ruleExample2": "блокирует доступ к файлу с именем Caddyfile в корневой области.", "rules": "Права", diff --git a/frontend/src/i18n/sk.json b/frontend/src/i18n/sk.json index 0031b730..201d2d3d 100644 --- a/frontend/src/i18n/sk.json +++ b/frontend/src/i18n/sk.json @@ -232,6 +232,7 @@ "permissions": "Práva", "permissionsHelp": "Môžete nastaviť používateľa, aby bol administrátorom alebo vybrať práva jednotlivo. Ak zvolíte \"Administrator\", všetky ďalšie budú automaticky zaškrtnuté. Manažment používateľov ostáva v správe administrátora.\n", "profileSettings": "Nastavenia profilu", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "blokuje prístup ku všetkým súborom začínajúcim bodkou (napríklad .git, .gitignore) v každom priečinku.\n", "ruleExample2": "blokuje prístup k súborom s názvom Caddyfile v koreňovom priečinku.", "rules": "Pravidlá", diff --git a/frontend/src/i18n/sv-se.json b/frontend/src/i18n/sv-se.json index 8e823b43..642252d9 100644 --- a/frontend/src/i18n/sv-se.json +++ b/frontend/src/i18n/sv-se.json @@ -232,6 +232,7 @@ "permissions": "Rättigheter", "permissionsHelp": "Du kan ange att användaren ska vara administratör eller välja behörigheterna individuellt. Om du väljer \"administratör \" kommer alla andra alternativ att kontrolleras automatiskt. Hanteringen av användare är fortfarande ett privilegium för en administratör.\n", "profileSettings": "Profil inställningar", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "förhindrar åtkomst till en dot-fil (till exempel. git,. gitignore) i varje mapp.\n", "ruleExample2": "blockerar åtkomsten till filen som heter Caddyfilen i roten av scopet.", "rules": "Regler", diff --git a/frontend/src/i18n/tr.json b/frontend/src/i18n/tr.json index ac18f211..f83e7103 100644 --- a/frontend/src/i18n/tr.json +++ b/frontend/src/i18n/tr.json @@ -232,6 +232,7 @@ "permissions": "İzinler", "permissionsHelp": "Kullanıcıyı yönetici olarak ayarlayabilir veya izinleri ayrı ayrı seçebilirsiniz. \"Yönetici\"yi seçerseniz, diğer tüm seçenekler otomatik olarak kontrol edilecektir. Kullanıcıların yönetimi, bir yöneticinin yetkisi olarak kalır.\n", "profileSettings": "Profil ayarları", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "her klasördeki herhangi bir noktalı dosyaya (.git, .gitignore gibi) erişimi engeller.\n", "ruleExample2": "Root erişimidenki CaddyFile dosyalarına erişimi engelle.", "rules": "Kurallar", diff --git a/frontend/src/i18n/uk.json b/frontend/src/i18n/uk.json index 2ae93f00..782b86e9 100644 --- a/frontend/src/i18n/uk.json +++ b/frontend/src/i18n/uk.json @@ -232,6 +232,7 @@ "permissions": "Дозволи", "permissionsHelp": "Можна налаштувати користувача як адміністратора чи вибрати індивідуальні дозволи. При виборі \"Адміністратор\" всі інші параметри будуть автоматично вибрані. Керування користувачами - привілей адміністратора.\n", "profileSettings": "Налаштування профілю", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "запобігти доступу до будь-якого прихованого файлу (наприклад: .git, .gitignore) у кожній папці.\n", "ruleExample2": "блокує доступ до файлу з ім'ям Caddyfile у кореневій області.", "rules": "Права", diff --git a/frontend/src/i18n/vi.json b/frontend/src/i18n/vi.json index 793f2120..65e7fe01 100644 --- a/frontend/src/i18n/vi.json +++ b/frontend/src/i18n/vi.json @@ -232,6 +232,7 @@ "permissions": "Quyền", "permissionsHelp": "Bạn có thể đặt người dùng làm quản trị viên hoặc chọn quyền riêng lẻ. Nếu chọn \"Người quản trị\", tất cả các tùy chọn khác sẽ tự động được chọn. Việc quản lý người dùng vẫn là đặc quyền của quản trị viên.\n", "profileSettings": "Cài đặt hồ sơ", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "ngăn truy cập vào bất kỳ tệp ẩn nào (chẳng hạn như .git, .gitignore) trong mọi thư mục.\n", "ruleExample2": "chặn truy cập vào tệp có tên Caddyfile trong thư mục gốc của phạm vi.", "rules": "Quy tắc", diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index 57178911..93486c21 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -43,7 +43,7 @@ "upload": "上传", "openFile": "打开文件", "discardChanges": "放弃更改", - "stopSearch": "Stop searching", + "stopSearch": "停止搜索", "saveChanges": "保存更改", "editAsText": "以文本形式编辑", "increaseFontSize": "增大字体大小", @@ -232,6 +232,7 @@ "permissions": "权限", "permissionsHelp": "你可以将该用户设置为管理员或单独选择各项权限。如果你选择了“管理员”,则其他的选项会被自动选中,同时该用户可以管理其他用户。\n", "profileSettings": "个人设置", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件(隐藏文件, 例如: .git, .gitignore)。\n", "ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。", "rules": "规则", @@ -259,7 +260,7 @@ "userUpdated": "用户已更新!", "username": "用户名", "users": "用户", - "currentPassword": "Your Current Password" + "currentPassword": "您当前的密码" }, "sidebar": { "help": "帮助", diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index d8630129..c0cafc3d 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -232,6 +232,7 @@ "permissions": "權限", "permissionsHelp": "您可以將該使用者設置為管理員,也可以單獨選擇各項權限。如果選擇了“管理員”,則其他的選項會被自動勾上,同時該使用者可以管理其他使用者。", "profileSettings": "個人設定", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "封鎖使用者存取所有資料夾下任何以 . 開頭的檔案(隱藏文件, 例如: .git, .gitignore)。", "ruleExample2": "封鎖使用者存取其目錄範圍的根目錄下名為 Caddyfile 的檔案。", "rules": "規則", From 550a73b6ba705946ff30bfa7d1219abf8f08450d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 08:54:42 +0100 Subject: [PATCH 53/56] chore(deps): update all non-major dependencies (#5679) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 202 ++++++++++++++++++++-------------------- go.mod | 8 +- go.sum | 16 ++-- 3 files changed, 113 insertions(+), 113 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 37dab7ae..d3b79699 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -101,28 +101,28 @@ importers: version: 11.0.3(@vue/compiler-dom@3.5.26)(eslint@9.39.2)(rollup@4.55.1)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) '@tsconfig/node24': specifier: ^24.0.2 - version: 24.0.3 + version: 24.0.4 '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': specifier: ^24.10.1 - version: 24.10.6 + version: 24.10.9 '@typescript-eslint/eslint-plugin': specifier: ^8.37.0 - version: 8.52.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + version: 8.53.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) '@vitejs/plugin-legacy': specifier: ^7.2.1 - version: 7.2.1(terser@5.44.1)(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2)) + version: 7.2.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2)) '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.3(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + version: 6.0.3(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 - version: 10.2.0(eslint@9.39.2)(prettier@3.7.4) + version: 10.2.0(eslint@9.39.2)(prettier@3.8.0) '@vue/eslint-config-typescript': specifier: ^14.6.0 - version: 14.6.0(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.3) + version: 14.6.0(eslint-plugin-vue@10.7.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.3) '@vue/tsconfig': specifier: ^0.8.1 version: 0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) @@ -137,25 +137,25 @@ importers: version: 10.1.8(eslint@9.39.2) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0) eslint-plugin-vue: specifier: ^10.5.1 - version: 10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) + version: 10.7.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) postcss: specifier: ^8.5.6 version: 8.5.6 prettier: specifier: ^3.6.2 - version: 3.7.4 + version: 3.8.0 terser: specifier: ^5.43.1 - version: 5.44.1 + version: 5.46.0 typescript: specifier: ^5.9.3 version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) + version: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) vite-plugin-compression2: specifier: ^2.3.1 version: 2.4.0(rollup@4.55.1) @@ -1268,8 +1268,8 @@ packages: cpu: [x64] os: [win32] - '@tsconfig/node24@24.0.3': - resolution: {integrity: sha512-vcERKtKQKHgzt/vfS3Gjasd8SUI2a0WZXpgJURdJsMySpS5+ctgbPfuLj2z/W+w4lAfTWxoN4upKfu2WzIRYnw==} + '@tsconfig/node24@24.0.4': + resolution: {integrity: sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1287,8 +1287,8 @@ packages: '@types/lodash@4.17.13': resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} - '@types/node@24.10.6': - resolution: {integrity: sha512-B8h60xgJMR/xmgyX9fncRzEW9gCxoJjdenUhke2v1JGOd/V66KopmWrLPXi5oUI4VuiGK+d+HlXJjDRZMj21EQ==} + '@types/node@24.10.9': + resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1304,11 +1304,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.52.0': - resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==} + '@typescript-eslint/eslint-plugin@8.53.0': + resolution: {integrity: sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.52.0 + '@typescript-eslint/parser': ^8.53.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -1331,8 +1331,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.52.0': - resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} + '@typescript-eslint/project-service@8.53.0': + resolution: {integrity: sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1345,8 +1345,8 @@ packages: resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.52.0': - resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} + '@typescript-eslint/scope-manager@8.53.0': + resolution: {integrity: sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.37.0': @@ -1361,8 +1361,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.52.0': - resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} + '@typescript-eslint/tsconfig-utils@8.53.0': + resolution: {integrity: sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1374,8 +1374,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.52.0': - resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==} + '@typescript-eslint/type-utils@8.53.0': + resolution: {integrity: sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1389,8 +1389,8 @@ packages: resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.52.0': - resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + '@typescript-eslint/types@8.53.0': + resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.37.0': @@ -1405,8 +1405,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.52.0': - resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} + '@typescript-eslint/typescript-estree@8.53.0': + resolution: {integrity: sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -1418,8 +1418,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.52.0': - resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} + '@typescript-eslint/utils@8.53.0': + resolution: {integrity: sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1433,8 +1433,8 @@ packages: resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.52.0': - resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} + '@typescript-eslint/visitor-keys@8.53.0': + resolution: {integrity: sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@videojs/http-streaming@3.17.2': @@ -1846,8 +1846,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.4: - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1860,8 +1860,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-vue@10.6.2: - resolution: {integrity: sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==} + eslint-plugin-vue@10.7.0: + resolution: {integrity: sha512-r2XFCK4qlo1sxEoAMIoTTX0PZAdla0JJDt1fmYiworZUX67WeEGqm+JbyAg3M+pGiJ5U6Mp5WQbontXWtIW7TA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -2351,12 +2351,12 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.7.4: - resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} hasBin: true @@ -2504,8 +2504,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} systemjs@6.15.1: @@ -2517,8 +2517,8 @@ packages: tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true @@ -3820,7 +3820,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true - '@tsconfig/node24@24.0.3': {} + '@tsconfig/node24@24.0.4': {} '@types/estree@1.0.8': {} @@ -3836,7 +3836,7 @@ snapshots: '@types/lodash@4.17.13': {} - '@types/node@24.10.6': + '@types/node@24.10.9': dependencies: undici-types: 7.16.0 @@ -3862,14 +3862,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.52.0 + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 eslint: 9.39.2 ignore: 7.0.5 natural-compare: 1.4.0 @@ -3908,10 +3908,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -3927,10 +3927,10 @@ snapshots: '@typescript-eslint/types': 8.49.0 '@typescript-eslint/visitor-keys': 8.49.0 - '@typescript-eslint/scope-manager@8.52.0': + '@typescript-eslint/scope-manager@8.53.0': dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)': dependencies: @@ -3940,7 +3940,7 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -3956,11 +3956,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.2 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -3972,7 +3972,7 @@ snapshots: '@typescript-eslint/types@8.49.0': {} - '@typescript-eslint/types@8.52.0': {} + '@typescript-eslint/types@8.53.0': {} '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)': dependencies: @@ -4005,12 +4005,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 + '@typescript-eslint/project-service': 8.53.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -4022,7 +4022,7 @@ snapshots: '@typescript-eslint/utils@8.37.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.3) @@ -4031,12 +4031,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: @@ -4052,9 +4052,9 @@ snapshots: '@typescript-eslint/types': 8.49.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.52.0': + '@typescript-eslint/visitor-keys@8.53.0': dependencies: - '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/types': 8.53.0 eslint-visitor-keys: 4.2.1 '@videojs/http-streaming@3.17.2(video.js@8.23.4)': @@ -4079,7 +4079,7 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))': + '@vitejs/plugin-legacy@7.2.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) @@ -4093,15 +4093,15 @@ snapshots: magic-string: 0.30.21 regenerator-runtime: 0.14.1 systemjs: 6.15.1 - terser: 5.44.1 - vite: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) + terser: 5.46.0 + vite: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.26(typescript@5.9.3) '@volar/language-core@2.4.27': @@ -4166,20 +4166,20 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/eslint-config-prettier@10.2.0(eslint@9.39.2)(prettier@3.7.4)': + '@vue/eslint-config-prettier@10.2.0(eslint@9.39.2)(prettier@3.8.0)': dependencies: eslint: 9.39.2 eslint-config-prettier: 10.1.8(eslint@9.39.2) - eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4) - prettier: 3.7.4 + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0) + prettier: 3.8.0 transitivePeerDependencies: - '@types/eslint' - '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.3)': + '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@10.7.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2 - eslint-plugin-vue: 10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) + eslint-plugin-vue: 10.7.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) fast-glob: 3.3.3 typescript-eslint: 8.37.0(eslint@9.39.2)(typescript@5.9.3) vue-eslint-parser: 10.2.0(eslint@9.39.2) @@ -4543,18 +4543,18 @@ snapshots: dependencies: eslint: 9.39.2 - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0): dependencies: eslint: 9.39.2 - prettier: 3.7.4 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.11 + prettier: 3.8.0 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 optionalDependencies: eslint-config-prettier: 10.1.8(eslint@9.39.2) - eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)): + eslint-plugin-vue@10.7.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) eslint: 9.39.2 natural-compare: 1.4.0 nth-check: 2.1.1 @@ -5015,11 +5015,11 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: + prettier-linter-helpers@1.0.1: dependencies: fast-diff: 1.3.0 - prettier@3.7.4: {} + prettier@3.8.0: {} pretty-bytes@7.1.0: {} @@ -5170,7 +5170,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.11: + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 @@ -5180,7 +5180,7 @@ snapshots: tar-mini@0.2.0: {} - terser@5.44.1: + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -5316,7 +5316,7 @@ snapshots: transitivePeerDependencies: - rollup - vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2): + vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -5325,9 +5325,9 @@ snapshots: rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.6 + '@types/node': 24.10.9 fsevents: 2.3.3 - terser: 5.44.1 + terser: 5.46.0 yaml: 2.8.2 vscode-uri@3.1.0: {} diff --git a/go.mod b/go.mod index 44741833..edf46277 100644 --- a/go.mod +++ b/go.mod @@ -24,8 +24,8 @@ require ( github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce - golang.org/x/crypto v0.46.0 - golang.org/x/image v0.34.0 + golang.org/x/crypto v0.47.0 + golang.org/x/image v0.35.0 golang.org/x/text v0.33.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 @@ -73,9 +73,9 @@ require ( go.etcd.io/bbolt v1.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/net v0.47.0 // indirect + golang.org/x/net v0.48.0 // indirect golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.39.0 // indirect + golang.org/x/sys v0.40.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 443fb17c..45dff859 100644 --- a/go.sum +++ b/go.sum @@ -266,8 +266,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -279,8 +279,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8= -golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU= +golang.org/x/image v0.35.0 h1:LKjiHdgMtO8z7Fh18nGY6KDcoEtVfsgLDPeLyguqb7I= +golang.org/x/image v0.35.0/go.mod h1:MwPLTVgvxSASsxdLzKrl8BRFuyqMyGhLwmC+TO1Sybk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -319,8 +319,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -360,8 +360,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From 785b7abb7ba7a86cc0deae1052c319ff714c222c Mon Sep 17 00:00:00 2001 From: Ariel Leyva Date: Sun, 18 Jan 2026 02:55:20 -0500 Subject: [PATCH 54/56] feat: added cut, copy, paste and show command palette functions in header (#5648) --- frontend/src/css/base.css | 4 ++ frontend/src/utils/clipboard.ts | 14 +++++ frontend/src/views/files/Editor.vue | 88 ++++++++++++++++++++++++++++- 3 files changed, 105 insertions(+), 1 deletion(-) diff --git a/frontend/src/css/base.css b/frontend/src/css/base.css index be5b0b98..f0b8ef0c 100644 --- a/frontend/src/css/base.css +++ b/frontend/src/css/base.css @@ -185,3 +185,7 @@ html[dir="rtl"] .breadcrumbs a { .vfm-modal { z-index: 9999999 !important; } + +body > div[style*="z-index: 9990"] { + z-index: 10000 !important; +} diff --git a/frontend/src/utils/clipboard.ts b/frontend/src/utils/clipboard.ts index 23bb7895..53e03589 100644 --- a/frontend/src/utils/clipboard.ts +++ b/frontend/src/utils/clipboard.ts @@ -51,6 +51,20 @@ export function copy(data: ClipboardArgs, opts?: ClipboardOpts) { }); } +export function read() { + return new Promise((resolve, reject) => { + if ( + // Clipboard API requires secure context + window.isSecureContext && + typeof navigator.clipboard !== "undefined" + ) { + navigator.clipboard.readText().then(resolve).catch(reject); + } else { + reject(); + } + }); +} + function getPermission(name: string) { return new Promise((resolve, reject) => { typeof navigator.permissions !== "undefined" && diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue index fc5f9728..7d3a8dfc 100644 --- a/frontend/src/views/files/Editor.vue +++ b/frontend/src/views/files/Editor.vue @@ -41,7 +41,30 @@