From c1715992bda46517f801c1aa496df8a3b42a4e4d Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sun, 7 Dec 2025 07:47:43 +0100
Subject: [PATCH 01/43] fix(frontend): add missing i18n strings
---
frontend/src/i18n/en.json | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json
index da91b6c0..9063dcde 100644
--- a/frontend/src/i18n/en.json
+++ b/frontend/src/i18n/en.json
@@ -44,7 +44,9 @@
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes",
- "editAsText": "Edit as Text"
+ "editAsText": "Edit as Text",
+ "increaseFontSize": "Increase font size",
+ "decreaseFontSize": "Decrease font size"
},
"download": {
"downloadFile": "Download File",
From 849f5ad4434ef60744e3a2b3834e9b6a1fd5a8cb Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sun, 7 Dec 2025 08:12:35 +0100
Subject: [PATCH 02/43] chore(release): 2.51.2
---
CHANGELOG.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4aadf3b4..58f6ffd5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
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.51.2](https://github.com/filebrowser/filebrowser/compare/v2.51.1...v2.51.2) (2025-12-07)
+
+
+### Bug Fixes
+
+* **frontend:** add missing i18n strings ([c171599](https://github.com/filebrowser/filebrowser/commit/c1715992bda46517f801c1aa496df8a3b42a4e4d))
+
## [2.51.1](https://github.com/filebrowser/filebrowser/compare/v2.51.0...v2.51.1) (2025-12-07)
From e9ce7fa5aa631b1029d89ad901357cd9a71cfea3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 9 Dec 2025 21:44:27 +0100
Subject: [PATCH 03/43] chore(deps): update all non-major dependencies (#5601)
---
Dockerfile.s6 | 2 +-
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 193 +++++++++---------
.../src/components/prompts/CreateFilePath.vue | 2 +-
go.mod | 10 +-
go.sum | 20 +-
6 files changed, 114 insertions(+), 115 deletions(-)
diff --git a/Dockerfile.s6 b/Dockerfile.s6
index 2a1218b2..8b363cb3 100644
--- a/Dockerfile.s6
+++ b/Dockerfile.s6
@@ -1,4 +1,4 @@
-FROM ghcr.io/linuxserver/baseimage-alpine:3.22
+FROM ghcr.io/linuxserver/baseimage-alpine:3.23
RUN apk update && \
apk --no-cache add ca-certificates mailcap jq libcap
diff --git a/frontend/package.json b/frontend/package.json
index f7c9d531..c405b2f8 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -71,5 +71,5 @@
"vite-plugin-compression2": "^2.3.1",
"vue-tsc": "^3.1.3"
},
- "packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a"
+ "packageManager": "pnpm@10.25.0+sha512.5e82639027af37cf832061bcc6d639c219634488e0f2baebe785028a793de7b525ffcd3f7ff574f5e9860654e098fe852ba8ac5dd5cefe1767d23a020a92f501"
}
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index ec1150cb..bb103583 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -25,7 +25,7 @@ importers:
version: 1.11.19
dompurify:
specifier: ^3.2.6
- version: 3.3.0
+ version: 3.3.1
epubjs:
specifier: ^0.3.93
version: 0.3.93
@@ -107,16 +107,16 @@ importers:
version: 4.17.12
'@types/node':
specifier: ^24.10.1
- version: 24.10.1
+ version: 24.10.2
'@typescript-eslint/eslint-plugin':
specifier: ^8.37.0
- 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)
+ version: 8.49.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.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0))
+ version: 7.2.1(terser@5.44.1)(vite@7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.7.0))
'@vitejs/plugin-vue':
specifier: ^6.0.1
- 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))
+ version: 6.0.2(vite@7.2.7(@types/node@24.10.2)(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.4)
@@ -155,13 +155,13 @@ importers:
version: 5.9.3
vite:
specifier: ^7.2.2
- version: 7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)
+ version: 7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.7.0)
vite-plugin-compression2:
specifier: ^2.3.1
- version: 2.3.1(rollup@4.53.3)
+ version: 2.4.0(rollup@4.53.3)
vue-tsc:
specifier: ^3.1.3
- version: 3.1.5(typescript@5.9.3)
+ version: 3.1.8(typescript@5.9.3)
packages:
@@ -1110,8 +1110,8 @@ packages:
'@types/lodash@4.17.13':
resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
- '@types/node@24.10.1':
- resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==}
+ '@types/node@24.10.2':
+ resolution: {integrity: sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==}
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -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.1':
- resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==}
+ '@typescript-eslint/eslint-plugin@8.49.0':
+ resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.48.1
+ '@typescript-eslint/parser': ^8.49.0
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.1':
- resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==}
+ '@typescript-eslint/project-service@8.49.0':
+ resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
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.1':
- resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==}
+ '@typescript-eslint/scope-manager@8.49.0':
+ resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
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.1':
- resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==}
+ '@typescript-eslint/tsconfig-utils@8.49.0':
+ resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==}
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.1':
- resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==}
+ '@typescript-eslint/type-utils@8.49.0':
+ resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==}
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.1':
- resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==}
+ '@typescript-eslint/types@8.49.0':
+ resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
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.1':
- resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==}
+ '@typescript-eslint/typescript-estree@8.49.0':
+ resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==}
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.1':
- resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==}
+ '@typescript-eslint/utils@8.49.0':
+ resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==}
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.1':
- resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==}
+ '@typescript-eslint/visitor-keys@8.49.0':
+ resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@videojs/http-streaming@3.17.2':
@@ -1287,14 +1287,14 @@ packages:
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
vue: ^3.2.25
- '@volar/language-core@2.4.23':
- resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==}
+ '@volar/language-core@2.4.26':
+ resolution: {integrity: sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==}
- '@volar/source-map@2.4.23':
- resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==}
+ '@volar/source-map@2.4.26':
+ resolution: {integrity: sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==}
- '@volar/typescript@2.4.23':
- resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==}
+ '@volar/typescript@2.4.26':
+ resolution: {integrity: sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==}
'@vue/compiler-core@3.5.25':
resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==}
@@ -1337,8 +1337,8 @@ packages:
typescript:
optional: true
- '@vue/language-core@3.1.5':
- resolution: {integrity: sha512-FMcqyzWN+sYBeqRMWPGT2QY0mUasZMVIuHvmb5NT3eeqPrbHBYtCP8JWEUCDCgM+Zr62uuWY/qoeBrPrzfa78w==}
+ '@vue/language-core@3.1.8':
+ resolution: {integrity: sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -1456,8 +1456,8 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
- alien-signals@3.1.0:
- resolution: {integrity: sha512-yufC6VpSy8tK3I0lO67pjumo5JvDQVQyr38+3OHqe6CHl1t2VZekKZ7EKKZSqk0cRmE7U7tfZbpXiKNzuc+ckg==}
+ alien-signals@3.1.1:
+ resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==}
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -1606,8 +1606,8 @@ packages:
dom-walk@0.1.2:
resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
- dompurify@3.3.0:
- resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
+ dompurify@3.3.1:
+ resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==}
electron-to-chromium@1.5.250:
resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==}
@@ -2436,11 +2436,11 @@ packages:
videojs-vtt.js@0.15.5:
resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==}
- vite-plugin-compression2@2.3.1:
- resolution: {integrity: sha512-bnhLTsurtvOiiP6EMISIKVsOMCeTAjE6FJbyqQus3W4mtAxF7pCuC4puUIAiCgNs98tOCpqo6GIXJXTLufzIaw==}
+ vite-plugin-compression2@2.4.0:
+ resolution: {integrity: sha512-8J4CBF1+dM1I06azba/eXJuJHinLF0Am7lUvRH8AZpu0otJoBaDEnxrIEr5iPZJSwH0AEglJGYCveh7pN52jCg==}
- vite@7.2.6:
- resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==}
+ vite@7.2.7:
+ resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -2518,8 +2518,8 @@ packages:
peerDependencies:
vue: ^3.0.2
- vue-tsc@3.1.5:
- resolution: {integrity: sha512-L/G9IUjOWhBU0yun89rv8fKqmKC+T0HfhrFjlIml71WpfBv9eb4E9Bev8FMbyueBIU9vxQqbd+oOsVcDa5amGw==}
+ vue-tsc@3.1.8:
+ resolution: {integrity: sha512-deKgwx6exIHeZwF601P1ktZKNF0bepaSN4jBU3AsbldPx9gylUc1JDxYppl82yxgkAgaz0Y0LCLOi+cXe9HMYA==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
@@ -3550,7 +3550,7 @@ snapshots:
'@types/lodash@4.17.13': {}
- '@types/node@24.10.1':
+ '@types/node@24.10.2':
dependencies:
undici-types: 7.16.0
@@ -3576,16 +3576,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@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)':
+ '@typescript-eslint/eslint-plugin@8.49.0(@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.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
+ '@typescript-eslint/scope-manager': 8.49.0
+ '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.49.0
eslint: 9.39.1
- graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.9.3)
@@ -3623,10 +3622,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3)
- '@typescript-eslint/types': 8.48.1
+ '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.49.0
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
@@ -3642,10 +3641,10 @@ snapshots:
'@typescript-eslint/types': 8.46.4
'@typescript-eslint/visitor-keys': 8.46.4
- '@typescript-eslint/scope-manager@8.48.1':
+ '@typescript-eslint/scope-manager@8.49.0':
dependencies:
- '@typescript-eslint/types': 8.48.1
- '@typescript-eslint/visitor-keys': 8.48.1
+ '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/visitor-keys': 8.49.0
'@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)':
dependencies:
@@ -3655,7 +3654,7 @@ snapshots:
dependencies:
typescript: 5.9.3
- '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
@@ -3671,11 +3670,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@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)
+ '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.49.0(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 +3686,7 @@ snapshots:
'@typescript-eslint/types@8.46.4': {}
- '@typescript-eslint/types@8.48.1': {}
+ '@typescript-eslint/types@8.49.0': {}
'@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)':
dependencies:
@@ -3721,12 +3720,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)':
dependencies:
- '@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
+ '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3
minimatch: 9.0.5
semver: 7.7.3
@@ -3747,12 +3746,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.49.0(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.1
- '@typescript-eslint/types': 8.48.1
- '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.49.0
+ '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
eslint: 9.39.1
typescript: 5.9.3
transitivePeerDependencies:
@@ -3768,9 +3767,9 @@ snapshots:
'@typescript-eslint/types': 8.46.4
eslint-visitor-keys: 4.2.1
- '@typescript-eslint/visitor-keys@8.48.1':
+ '@typescript-eslint/visitor-keys@8.49.0':
dependencies:
- '@typescript-eslint/types': 8.48.1
+ '@typescript-eslint/types': 8.49.0
eslint-visitor-keys: 4.2.1
'@videojs/http-streaming@3.17.2(video.js@8.23.4)':
@@ -3795,7 +3794,7 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
- '@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))':
+ '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.2.7(@types/node@24.10.2)(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,25 +3809,25 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.44.1
- vite: 7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)
+ vite: 7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
- '@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))':
+ '@vitejs/plugin-vue@6.0.2(vite@7.2.7(@types/node@24.10.2)(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.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0)
+ vite: 7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.7.0)
vue: 3.5.25(typescript@5.9.3)
- '@volar/language-core@2.4.23':
+ '@volar/language-core@2.4.26':
dependencies:
- '@volar/source-map': 2.4.23
+ '@volar/source-map': 2.4.26
- '@volar/source-map@2.4.23': {}
+ '@volar/source-map@2.4.26': {}
- '@volar/typescript@2.4.23':
+ '@volar/typescript@2.4.26':
dependencies:
- '@volar/language-core': 2.4.23
+ '@volar/language-core': 2.4.26
path-browserify: 1.0.1
vscode-uri: 3.1.0
@@ -3904,12 +3903,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@vue/language-core@3.1.5(typescript@5.9.3)':
+ '@vue/language-core@3.1.8(typescript@5.9.3)':
dependencies:
- '@volar/language-core': 2.4.23
+ '@volar/language-core': 2.4.26
'@vue/compiler-dom': 3.5.25
'@vue/shared': 3.5.25
- alien-signals: 3.1.0
+ alien-signals: 3.1.1
muggle-string: 0.4.1
path-browserify: 1.0.1
picomatch: 4.0.3
@@ -3993,7 +3992,7 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- alien-signals@3.1.0: {}
+ alien-signals@3.1.1: {}
ansi-styles@4.3.0:
dependencies:
@@ -4136,7 +4135,7 @@ snapshots:
dom-walk@0.1.2: {}
- dompurify@3.3.0:
+ dompurify@3.3.1:
optionalDependencies:
'@types/trusted-types': 2.0.7
@@ -4978,14 +4977,14 @@ snapshots:
dependencies:
global: 4.4.0
- vite-plugin-compression2@2.3.1(rollup@4.53.3):
+ vite-plugin-compression2@2.4.0(rollup@4.53.3):
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.53.3)
tar-mini: 0.2.0
transitivePeerDependencies:
- rollup
- vite@7.2.6(@types/node@24.10.1)(terser@5.44.1)(yaml@2.7.0):
+ vite@7.2.7(@types/node@24.10.2)(terser@5.44.1)(yaml@2.7.0):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
@@ -4994,7 +4993,7 @@ snapshots:
rollup: 4.53.3
tinyglobby: 0.2.15
optionalDependencies:
- '@types/node': 24.10.1
+ '@types/node': 24.10.2
fsevents: 2.3.3
terser: 5.44.1
yaml: 2.7.0
@@ -5042,10 +5041,10 @@ snapshots:
dependencies:
vue: 3.5.25(typescript@5.9.3)
- vue-tsc@3.1.5(typescript@5.9.3):
+ vue-tsc@3.1.8(typescript@5.9.3):
dependencies:
- '@volar/typescript': 2.4.23
- '@vue/language-core': 3.1.5(typescript@5.9.3)
+ '@volar/typescript': 2.4.26
+ '@vue/language-core': 3.1.8(typescript@5.9.3)
typescript: 5.9.3
vue@3.5.25(typescript@5.9.3):
diff --git a/frontend/src/components/prompts/CreateFilePath.vue b/frontend/src/components/prompts/CreateFilePath.vue
index ec470f3a..166240d0 100644
--- a/frontend/src/components/prompts/CreateFilePath.vue
+++ b/frontend/src/components/prompts/CreateFilePath.vue
@@ -18,7 +18,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 33/43] 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 34/43] 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 35/43] 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 36/43] 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 37/43] 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 38/43] 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 39/43] 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 40/43] 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 41/43] 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 @@
-
+
("$showError")!;
@@ -95,6 +119,35 @@ const isMarkdownFile =
fileStore.req?.name.endsWith(".md") ||
fileStore.req?.name.endsWith(".markdown");
+const isSelectionEmpty = ref(true);
+
+const executeEditorCommand = (name: string) => {
+ if (name == "paste") {
+ read()
+ .then((data) => {
+ editor.value?.execCommand("paste", {
+ text: data,
+ });
+ })
+ .catch((e) => {
+ if (
+ document.queryCommandSupported &&
+ document.queryCommandSupported("paste")
+ ) {
+ document.execCommand("paste");
+ } else {
+ console.warn("the clipboard api is not supported", e);
+ }
+ });
+ return;
+ }
+ if (name == "copy" || name == "cut") {
+ const selectedText = editor.value?.getCopyText();
+ copy({ text: selectedText });
+ }
+ editor.value?.execCommand(name);
+};
+
onMounted(() => {
window.addEventListener("keydown", keyEvent);
window.addEventListener("beforeunload", handlePageChange);
@@ -132,6 +185,11 @@ onMounted(() => {
editor.value.setFontSize(fontSize.value);
editor.value.focus();
+
+ editor.value.getSelection().on("changeSelection", () => {
+ isSelectionEmpty.value =
+ editor.value == null || editor.value.getSelectedText().length == 0;
+ });
});
onBeforeUnmount(() => {
@@ -250,4 +308,32 @@ const preview = () => {
margin: 0 0.5em;
color: var(--fg);
}
+
+.editor-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.editor-header > div > button {
+ background: transparent;
+ color: var(--action);
+ border: none;
+ outline: none;
+ opacity: 0.8;
+ cursor: pointer;
+}
+
+.editor-header > div > button:hover:not(:disabled) {
+ opacity: 1;
+}
+
+.editor-header > div > button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.editor-header > div > button > span > i {
+ font-size: 1.2rem;
+}
From 1154b49974d79b833872793d82715c5057a2217a Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sun, 18 Jan 2026 08:59:57 +0100
Subject: [PATCH 42/43] chore: add openbsd, remove windows arm (#5695)
---
.goreleaser.yml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/.goreleaser.yml b/.goreleaser.yml
index 57b7b44a..be192ef8 100644
--- a/.goreleaser.yml
+++ b/.goreleaser.yml
@@ -17,6 +17,7 @@ builds:
- linux
- windows
- freebsd
+ - openbsd
goarch:
- amd64
- "386"
@@ -30,6 +31,12 @@ builds:
ignore:
- goos: darwin
goarch: "386"
+ # Experimental, may not work properly
+ - goos: openbsd
+ goarch: riscv64
+ # Broken as of Go 1.24, deprecated as of Go 1.26
+ - goos: windows
+ goarch: arm
- goos: freebsd
goarch: arm
From 08c8ede587240472cd1524e40e514fc2bbc3466e Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sun, 18 Jan 2026 09:00:36 +0100
Subject: [PATCH 43/43] chore(release): 2.55.0
---
CHANGELOG.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 13ee556f..0f49dca9 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.55.0](https://github.com/filebrowser/filebrowser/compare/v2.54.0...v2.55.0) (2026-01-18)
+
+
+### Features
+
+* added cut, copy, paste and show command palette functions in header ([#5648](https://github.com/filebrowser/filebrowser/issues/5648)) ([785b7ab](https://github.com/filebrowser/filebrowser/commit/785b7abb7ba7a86cc0deae1052c319ff714c222c))
+* update translations ([#5677](https://github.com/filebrowser/filebrowser/issues/5677)) ([e7ea1ad](https://github.com/filebrowser/filebrowser/commit/e7ea1ad27d3d17e249489d3338be40bfea15e2a1))
+
+
+### Bug Fixes
+
+* prevent context menu clicks from clearing file selection ([#5681](https://github.com/filebrowser/filebrowser/issues/5681)) ([59ca0c3](https://github.com/filebrowser/filebrowser/commit/59ca0c340afc7774747c70ede9a5a5a3c9349d6b))
+* request current password when deleting users ([#5667](https://github.com/filebrowser/filebrowser/issues/5667)) ([cfa6c58](https://github.com/filebrowser/filebrowser/commit/cfa6c5864e5e7673aa9f3180e4964e0db92cc4da))
+* retain file selection when closing the editor ([#5693](https://github.com/filebrowser/filebrowser/issues/5693)) ([4094fb3](https://github.com/filebrowser/filebrowser/commit/4094fb359babac70e88d0ed4bfe3bd100744aad6))
+
## [2.54.0](https://github.com/filebrowser/filebrowser/compare/v2.53.1...v2.54.0) (2026-01-10)