From d0039afbb76a9364c1e6ac9715ccc3c239dc8cb6 Mon Sep 17 00:00:00 2001
From: Ryan <43447928+Rmiller5466@users.noreply.github.com>
Date: Fri, 3 Oct 2025 04:42:24 -0400
Subject: [PATCH 001/169] fix: wrong url on settings branding link
---
frontend/src/views/settings/Global.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/views/settings/Global.vue b/frontend/src/views/settings/Global.vue
index e397c6f7..0a42a293 100644
--- a/frontend/src/views/settings/Global.vue
+++ b/frontend/src/views/settings/Global.vue
@@ -65,7 +65,7 @@
{{ t("settings.documentation") }}
From a397e7305d1572baf67823413f97a29eea38f0cc Mon Sep 17 00:00:00 2001
From: Ryan <43447928+Rmiller5466@users.noreply.github.com>
Date: Fri, 17 Oct 2025 10:45:36 -0400
Subject: [PATCH 002/169] fix: editor discard prompt doesn't save nor discard
Co-authored-by: Ryan Miller
---
.../components/prompts/DiscardEditorChanges.vue | 10 ++--------
frontend/src/views/files/Editor.vue | 16 ++++++++++++++--
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/frontend/src/components/prompts/DiscardEditorChanges.vue b/frontend/src/components/prompts/DiscardEditorChanges.vue
index bd6bc49a..7a99c5fc 100644
--- a/frontend/src/components/prompts/DiscardEditorChanges.vue
+++ b/frontend/src/components/prompts/DiscardEditorChanges.vue
@@ -17,7 +17,7 @@
diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue
index f3d9aa94..0913ea98 100644
--- a/frontend/src/views/files/Editor.vue
+++ b/frontend/src/views/files/Editor.vue
@@ -216,12 +216,24 @@ const decreaseFontSize = () => {
const close = () => {
if (!editor.value?.session.getUndoManager().isClean()) {
- layoutStore.showHover("discardEditorChanges");
+ layoutStore.showHover({
+ prompt: "discardEditorChanges",
+ confirm: (event: Event) => {
+ event.preventDefault();
+ finishClose();
+ },
+ saveAction: async () => {
+ await save();
+ finishClose();
+ },
+ });
return;
}
+ finishClose();
+};
+const finishClose = () => {
fileStore.updateRequest(null);
-
const uri = url.removeLastDir(route.path) + "/";
router.push({ path: uri });
};
From 97b8911ba8a65456091cbec0202f6b5209fcf363 Mon Sep 17 00:00:00 2001
From: rocksload
Date: Fri, 17 Oct 2025 22:45:47 +0800
Subject: [PATCH 003/169] refactor: use slices.Contains to simplify code
(#5483)
---
auth/hook.go | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/auth/hook.go b/auth/hook.go
index 3cb5b8b9..2ecb12f3 100644
--- a/auth/hook.go
+++ b/auth/hook.go
@@ -8,6 +8,7 @@ import (
"net/http"
"os"
"os/exec"
+ "slices"
"strings"
fbErrors "github.com/filebrowser/filebrowser/v2/errors"
@@ -266,13 +267,7 @@ var validHookFields = []string{
// IsValid checks if the provided field is on the valid fields list
func (hf *hookFields) IsValid(field string) bool {
- for _, val := range validHookFields {
- if field == val {
- return true
- }
- }
-
- return false
+ return slices.Contains(validHookFields, field)
}
// GetString returns the string value or provided default
From dd883985bb484af9dfea2677a40d56999fdc72f3 Mon Sep 17 00:00:00 2001
From: MSomnium Studios <70982507+ArielLeyva@users.noreply.github.com>
Date: Fri, 17 Oct 2025 11:38:57 -0400
Subject: [PATCH 004/169] fix(auth): prevent integer overflow in logout timer
using safeTimeout (#5470)
---
frontend/src/api/utils.ts | 18 ++++++++++++++++++
frontend/src/utils/auth.ts | 6 ++++--
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/frontend/src/api/utils.ts b/frontend/src/api/utils.ts
index ae509de2..f21fbe38 100644
--- a/frontend/src/api/utils.ts
+++ b/frontend/src/api/utils.ts
@@ -91,3 +91,21 @@ export function createURL(endpoint: string, searchParams = {}): string {
return url.toString();
}
+
+export function setSafeTimeout(callback: () => void, delay: number): number {
+ const MAX_DELAY = 86_400_000;
+ let remaining = delay;
+
+ function scheduleNext(): number {
+ if (remaining <= MAX_DELAY) {
+ return window.setTimeout(callback, remaining);
+ } else {
+ return window.setTimeout(() => {
+ remaining -= MAX_DELAY;
+ scheduleNext();
+ }, MAX_DELAY);
+ }
+ }
+
+ return scheduleNext();
+}
diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts
index 2b940cd4..57e665ea 100644
--- a/frontend/src/utils/auth.ts
+++ b/frontend/src/utils/auth.ts
@@ -4,6 +4,7 @@ import type { JwtPayload } from "jwt-decode";
import { jwtDecode } from "jwt-decode";
import { baseURL, noAuth } from "./constants";
import { StatusError } from "@/api/utils";
+import { setSafeTimeout } from "@/api/utils";
export function parseToken(token: string) {
// falsy or malformed jwt will throw InvalidTokenError
@@ -22,10 +23,11 @@ export function parseToken(token: string) {
}
const expiresAt = new Date(data.exp! * 1000);
+ const timeout = expiresAt.getTime() - Date.now();
authStore.setLogoutTimer(
- window.setTimeout(() => {
+ setSafeTimeout(() => {
logout("inactivity");
- }, expiresAt.getTime() - Date.now())
+ }, timeout)
);
}
From de35dee1c573f731e776c36eeff8173eeef14c0f Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Fri, 17 Oct 2025 17:41:27 +0200
Subject: [PATCH 005/169] chore(release): 2.44.1
---
CHANGELOG.md | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9bf8bd77..df4ec91b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+### [2.44.1](https://github.com/filebrowser/filebrowser/compare/v2.44.0...v2.44.1) (2025-10-17)
+
+
+### Bug Fixes
+
+* **auth:** prevent integer overflow in logout timer using safeTimeout ([#5470](https://github.com/filebrowser/filebrowser/issues/5470)) ([dd88398](https://github.com/filebrowser/filebrowser/commit/dd883985bb484af9dfea2677a40d56999fdc72f3))
+* editor discard prompt doesn't save nor discard ([a397e73](https://github.com/filebrowser/filebrowser/commit/a397e7305d1572baf67823413f97a29eea38f0cc))
+* wrong url on settings branding link ([d0039af](https://github.com/filebrowser/filebrowser/commit/d0039afbb76a9364c1e6ac9715ccc3c239dc8cb6))
+
+
+### Refactorings
+
+* use slices.Contains to simplify code ([#5483](https://github.com/filebrowser/filebrowser/issues/5483)) ([97b8911](https://github.com/filebrowser/filebrowser/commit/97b8911ba8a65456091cbec0202f6b5209fcf363))
+
## [2.44.0](https://github.com/filebrowser/filebrowser/compare/v2.43.0...v2.44.0) (2025-09-25)
From b8f64a1c1bc235df784d7f52abd3a9e84c6db6ce Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 21 Oct 2025 03:32:45 +0000
Subject: [PATCH 006/169] build(deps-dev): bump vite from 6.3.6 to 6.4.1 in
/frontend
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.6 to 6.4.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.4.1/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-version: 6.4.1
dependency-type: direct:development
...
Signed-off-by: dependabot[bot]
---
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 445 ++++++++++++++++++++--------------------
2 files changed, 228 insertions(+), 219 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index 290b6cf1..de251299 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -71,7 +71,7 @@
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"terser": "^5.43.1",
- "vite": "^6.3.6",
+ "vite": "^6.4.1",
"vite-plugin-compression2": "^1.0.0",
"vue-tsc": "^2.2.0"
},
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 989f0442..1482e30c 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -101,7 +101,7 @@ importers:
devDependencies:
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.8
- version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
+ version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
'@playwright/test':
specifier: ^1.54.1
version: 1.54.1
@@ -119,10 +119,10 @@ importers:
version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3)
'@vitejs/plugin-legacy':
specifier: ^6.0.0
- version: 6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
+ version: 6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
'@vitejs/plugin-vue':
specifier: ^5.0.4
- version: 5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))
+ version: 5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))
'@vue/eslint-config-prettier':
specifier: ^10.2.0
version: 10.2.0(eslint@9.31.0)(prettier@3.6.2)
@@ -163,11 +163,11 @@ importers:
specifier: ^5.43.1
version: 5.43.1
vite:
- specifier: ^6.3.6
- version: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
+ specifier: ^6.4.1
+ version: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite-plugin-compression2:
specifier: ^1.0.0
- version: 1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
+ version: 1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
vue-tsc:
specifier: ^2.2.0
version: 2.2.0(typescript@5.6.3)
@@ -737,158 +737,158 @@ packages:
resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
engines: {node: '>=18'}
- '@esbuild/aix-ppc64@0.25.9':
- resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
+ '@esbuild/aix-ppc64@0.25.11':
+ resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.25.9':
- resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
+ '@esbuild/android-arm64@0.25.11':
+ resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.25.9':
- resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
+ '@esbuild/android-arm@0.25.11':
+ resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.25.9':
- resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
+ '@esbuild/android-x64@0.25.11':
+ resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.25.9':
- resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
+ '@esbuild/darwin-arm64@0.25.11':
+ resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.9':
- resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
+ '@esbuild/darwin-x64@0.25.11':
+ resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.25.9':
- resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
+ '@esbuild/freebsd-arm64@0.25.11':
+ resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.9':
- resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
+ '@esbuild/freebsd-x64@0.25.11':
+ resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.25.9':
- resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
+ '@esbuild/linux-arm64@0.25.11':
+ resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.25.9':
- resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
+ '@esbuild/linux-arm@0.25.11':
+ resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.25.9':
- resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
+ '@esbuild/linux-ia32@0.25.11':
+ resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.25.9':
- resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
+ '@esbuild/linux-loong64@0.25.11':
+ resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.9':
- resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
+ '@esbuild/linux-mips64el@0.25.11':
+ resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.25.9':
- resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
+ '@esbuild/linux-ppc64@0.25.11':
+ resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.9':
- resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
+ '@esbuild/linux-riscv64@0.25.11':
+ resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.25.9':
- resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
+ '@esbuild/linux-s390x@0.25.11':
+ resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.25.9':
- resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
+ '@esbuild/linux-x64@0.25.11':
+ resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.9':
- resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
+ '@esbuild/netbsd-arm64@0.25.11':
+ resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.9':
- resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
+ '@esbuild/netbsd-x64@0.25.11':
+ resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.25.9':
- resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
+ '@esbuild/openbsd-arm64@0.25.11':
+ resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.9':
- resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
+ '@esbuild/openbsd-x64@0.25.11':
+ resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.9':
- resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
+ '@esbuild/openharmony-arm64@0.25.11':
+ resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.25.9':
- resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
+ '@esbuild/sunos-x64@0.25.11':
+ resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.25.9':
- resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
+ '@esbuild/win32-arm64@0.25.11':
+ resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.25.9':
- resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
+ '@esbuild/win32-ia32@0.25.11':
+ resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.25.9':
- resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
+ '@esbuild/win32-x64@0.25.11':
+ resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -1088,108 +1088,113 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.50.1':
- resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==}
+ '@rollup/rollup-android-arm-eabi@4.52.5':
+ resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.50.1':
- resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==}
+ '@rollup/rollup-android-arm64@4.52.5':
+ resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.50.1':
- resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==}
+ '@rollup/rollup-darwin-arm64@4.52.5':
+ resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.50.1':
- resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==}
+ '@rollup/rollup-darwin-x64@4.52.5':
+ resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.50.1':
- resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==}
+ '@rollup/rollup-freebsd-arm64@4.52.5':
+ resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.50.1':
- resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==}
+ '@rollup/rollup-freebsd-x64@4.52.5':
+ resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.50.1':
- resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
+ resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.50.1':
- resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==}
+ '@rollup/rollup-linux-arm-musleabihf@4.52.5':
+ resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.50.1':
- resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==}
+ '@rollup/rollup-linux-arm64-gnu@4.52.5':
+ resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.50.1':
- resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==}
+ '@rollup/rollup-linux-arm64-musl@4.52.5':
+ resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-loongarch64-gnu@4.50.1':
- resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==}
+ '@rollup/rollup-linux-loong64-gnu@4.52.5':
+ resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
cpu: [loong64]
os: [linux]
- '@rollup/rollup-linux-ppc64-gnu@4.50.1':
- resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==}
+ '@rollup/rollup-linux-ppc64-gnu@4.52.5':
+ resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.50.1':
- resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==}
+ '@rollup/rollup-linux-riscv64-gnu@4.52.5':
+ resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-riscv64-musl@4.50.1':
- resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==}
+ '@rollup/rollup-linux-riscv64-musl@4.52.5':
+ resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.50.1':
- resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==}
+ '@rollup/rollup-linux-s390x-gnu@4.52.5':
+ resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.50.1':
- resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==}
+ '@rollup/rollup-linux-x64-gnu@4.52.5':
+ resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.50.1':
- resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==}
+ '@rollup/rollup-linux-x64-musl@4.52.5':
+ resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-openharmony-arm64@4.50.1':
- resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==}
+ '@rollup/rollup-openharmony-arm64@4.52.5':
+ resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
cpu: [arm64]
os: [openharmony]
- '@rollup/rollup-win32-arm64-msvc@4.50.1':
- resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==}
+ '@rollup/rollup-win32-arm64-msvc@4.52.5':
+ resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.50.1':
- resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==}
+ '@rollup/rollup-win32-ia32-msvc@4.52.5':
+ resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.50.1':
- resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==}
+ '@rollup/rollup-win32-x64-gnu@4.52.5':
+ resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.52.5':
+ resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
cpu: [x64]
os: [win32]
@@ -1723,8 +1728,8 @@ packages:
resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
engines: {node: '>=0.12'}
- esbuild@0.25.9:
- resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
+ esbuild@0.25.11:
+ resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'}
hasBin: true
@@ -2426,8 +2431,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- rollup@4.50.1:
- resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==}
+ rollup@4.52.5:
+ resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -2684,8 +2689,8 @@ packages:
peerDependencies:
vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0
- vite@6.3.6:
- resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==}
+ vite@6.4.1:
+ resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -3609,82 +3614,82 @@ snapshots:
'@csstools/css-tokenizer@3.0.3': {}
- '@esbuild/aix-ppc64@0.25.9':
+ '@esbuild/aix-ppc64@0.25.11':
optional: true
- '@esbuild/android-arm64@0.25.9':
+ '@esbuild/android-arm64@0.25.11':
optional: true
- '@esbuild/android-arm@0.25.9':
+ '@esbuild/android-arm@0.25.11':
optional: true
- '@esbuild/android-x64@0.25.9':
+ '@esbuild/android-x64@0.25.11':
optional: true
- '@esbuild/darwin-arm64@0.25.9':
+ '@esbuild/darwin-arm64@0.25.11':
optional: true
- '@esbuild/darwin-x64@0.25.9':
+ '@esbuild/darwin-x64@0.25.11':
optional: true
- '@esbuild/freebsd-arm64@0.25.9':
+ '@esbuild/freebsd-arm64@0.25.11':
optional: true
- '@esbuild/freebsd-x64@0.25.9':
+ '@esbuild/freebsd-x64@0.25.11':
optional: true
- '@esbuild/linux-arm64@0.25.9':
+ '@esbuild/linux-arm64@0.25.11':
optional: true
- '@esbuild/linux-arm@0.25.9':
+ '@esbuild/linux-arm@0.25.11':
optional: true
- '@esbuild/linux-ia32@0.25.9':
+ '@esbuild/linux-ia32@0.25.11':
optional: true
- '@esbuild/linux-loong64@0.25.9':
+ '@esbuild/linux-loong64@0.25.11':
optional: true
- '@esbuild/linux-mips64el@0.25.9':
+ '@esbuild/linux-mips64el@0.25.11':
optional: true
- '@esbuild/linux-ppc64@0.25.9':
+ '@esbuild/linux-ppc64@0.25.11':
optional: true
- '@esbuild/linux-riscv64@0.25.9':
+ '@esbuild/linux-riscv64@0.25.11':
optional: true
- '@esbuild/linux-s390x@0.25.9':
+ '@esbuild/linux-s390x@0.25.11':
optional: true
- '@esbuild/linux-x64@0.25.9':
+ '@esbuild/linux-x64@0.25.11':
optional: true
- '@esbuild/netbsd-arm64@0.25.9':
+ '@esbuild/netbsd-arm64@0.25.11':
optional: true
- '@esbuild/netbsd-x64@0.25.9':
+ '@esbuild/netbsd-x64@0.25.11':
optional: true
- '@esbuild/openbsd-arm64@0.25.9':
+ '@esbuild/openbsd-arm64@0.25.11':
optional: true
- '@esbuild/openbsd-x64@0.25.9':
+ '@esbuild/openbsd-x64@0.25.11':
optional: true
- '@esbuild/openharmony-arm64@0.25.9':
+ '@esbuild/openharmony-arm64@0.25.11':
optional: true
- '@esbuild/sunos-x64@0.25.9':
+ '@esbuild/sunos-x64@0.25.11':
optional: true
- '@esbuild/win32-arm64@0.25.9':
+ '@esbuild/win32-arm64@0.25.11':
optional: true
- '@esbuild/win32-ia32@0.25.9':
+ '@esbuild/win32-ia32@0.25.11':
optional: true
- '@esbuild/win32-x64@0.25.9':
+ '@esbuild/win32-x64@0.25.11':
optional: true
'@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)':
@@ -3784,13 +3789,13 @@ snapshots:
'@intlify/shared@11.1.7': {}
- '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))':
+ '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0)
'@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))
'@intlify/shared': 11.1.7
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
- '@rollup/pluginutils': 5.1.4(rollup@4.50.1)
+ '@rollup/pluginutils': 5.1.4(rollup@4.52.5)
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3)
debug: 4.4.0
@@ -3866,83 +3871,86 @@ snapshots:
dependencies:
playwright: 1.54.1
- '@rollup/pluginutils@5.1.3(rollup@4.50.1)':
+ '@rollup/pluginutils@5.1.3(rollup@4.52.5)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
- rollup: 4.50.1
+ rollup: 4.52.5
- '@rollup/pluginutils@5.1.4(rollup@4.50.1)':
+ '@rollup/pluginutils@5.1.4(rollup@4.52.5)':
dependencies:
'@types/estree': 1.0.7
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
- rollup: 4.50.1
+ rollup: 4.52.5
- '@rollup/rollup-android-arm-eabi@4.50.1':
+ '@rollup/rollup-android-arm-eabi@4.52.5':
optional: true
- '@rollup/rollup-android-arm64@4.50.1':
+ '@rollup/rollup-android-arm64@4.52.5':
optional: true
- '@rollup/rollup-darwin-arm64@4.50.1':
+ '@rollup/rollup-darwin-arm64@4.52.5':
optional: true
- '@rollup/rollup-darwin-x64@4.50.1':
+ '@rollup/rollup-darwin-x64@4.52.5':
optional: true
- '@rollup/rollup-freebsd-arm64@4.50.1':
+ '@rollup/rollup-freebsd-arm64@4.52.5':
optional: true
- '@rollup/rollup-freebsd-x64@4.50.1':
+ '@rollup/rollup-freebsd-x64@4.52.5':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.50.1':
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.50.1':
+ '@rollup/rollup-linux-arm-musleabihf@4.52.5':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.50.1':
+ '@rollup/rollup-linux-arm64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.50.1':
+ '@rollup/rollup-linux-arm64-musl@4.52.5':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.50.1':
+ '@rollup/rollup-linux-loong64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.50.1':
+ '@rollup/rollup-linux-ppc64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.50.1':
+ '@rollup/rollup-linux-riscv64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.50.1':
+ '@rollup/rollup-linux-riscv64-musl@4.52.5':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.50.1':
+ '@rollup/rollup-linux-s390x-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.50.1':
+ '@rollup/rollup-linux-x64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-x64-musl@4.50.1':
+ '@rollup/rollup-linux-x64-musl@4.52.5':
optional: true
- '@rollup/rollup-openharmony-arm64@4.50.1':
+ '@rollup/rollup-openharmony-arm64@4.52.5':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.50.1':
+ '@rollup/rollup-win32-arm64-msvc@4.52.5':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.50.1':
+ '@rollup/rollup-win32-ia32-msvc@4.52.5':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.50.1':
+ '@rollup/rollup-win32-x64-gnu@4.52.5':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.52.5':
optional: true
'@tsconfig/node22@22.0.2': {}
@@ -4115,7 +4123,7 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
- '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))':
+ '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/preset-env': 7.26.0(@babel/core@7.26.0)
@@ -4126,13 +4134,13 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.43.1
- vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
+ vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-vue@5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))':
+ '@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
- vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
+ vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vue: 3.5.17(typescript@5.6.3)
'@volar/language-core@2.4.11':
@@ -4548,34 +4556,34 @@ snapshots:
d: 1.0.2
ext: 1.7.0
- esbuild@0.25.9:
+ esbuild@0.25.11:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.9
- '@esbuild/android-arm': 0.25.9
- '@esbuild/android-arm64': 0.25.9
- '@esbuild/android-x64': 0.25.9
- '@esbuild/darwin-arm64': 0.25.9
- '@esbuild/darwin-x64': 0.25.9
- '@esbuild/freebsd-arm64': 0.25.9
- '@esbuild/freebsd-x64': 0.25.9
- '@esbuild/linux-arm': 0.25.9
- '@esbuild/linux-arm64': 0.25.9
- '@esbuild/linux-ia32': 0.25.9
- '@esbuild/linux-loong64': 0.25.9
- '@esbuild/linux-mips64el': 0.25.9
- '@esbuild/linux-ppc64': 0.25.9
- '@esbuild/linux-riscv64': 0.25.9
- '@esbuild/linux-s390x': 0.25.9
- '@esbuild/linux-x64': 0.25.9
- '@esbuild/netbsd-arm64': 0.25.9
- '@esbuild/netbsd-x64': 0.25.9
- '@esbuild/openbsd-arm64': 0.25.9
- '@esbuild/openbsd-x64': 0.25.9
- '@esbuild/openharmony-arm64': 0.25.9
- '@esbuild/sunos-x64': 0.25.9
- '@esbuild/win32-arm64': 0.25.9
- '@esbuild/win32-ia32': 0.25.9
- '@esbuild/win32-x64': 0.25.9
+ '@esbuild/aix-ppc64': 0.25.11
+ '@esbuild/android-arm': 0.25.11
+ '@esbuild/android-arm64': 0.25.11
+ '@esbuild/android-x64': 0.25.11
+ '@esbuild/darwin-arm64': 0.25.11
+ '@esbuild/darwin-x64': 0.25.11
+ '@esbuild/freebsd-arm64': 0.25.11
+ '@esbuild/freebsd-x64': 0.25.11
+ '@esbuild/linux-arm': 0.25.11
+ '@esbuild/linux-arm64': 0.25.11
+ '@esbuild/linux-ia32': 0.25.11
+ '@esbuild/linux-loong64': 0.25.11
+ '@esbuild/linux-mips64el': 0.25.11
+ '@esbuild/linux-ppc64': 0.25.11
+ '@esbuild/linux-riscv64': 0.25.11
+ '@esbuild/linux-s390x': 0.25.11
+ '@esbuild/linux-x64': 0.25.11
+ '@esbuild/netbsd-arm64': 0.25.11
+ '@esbuild/netbsd-x64': 0.25.11
+ '@esbuild/openbsd-arm64': 0.25.11
+ '@esbuild/openbsd-x64': 0.25.11
+ '@esbuild/openharmony-arm64': 0.25.11
+ '@esbuild/sunos-x64': 0.25.11
+ '@esbuild/win32-arm64': 0.25.11
+ '@esbuild/win32-ia32': 0.25.11
+ '@esbuild/win32-x64': 0.25.11
escalade@3.2.0: {}
@@ -5266,31 +5274,32 @@ snapshots:
reusify@1.0.4: {}
- rollup@4.50.1:
+ rollup@4.52.5:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.50.1
- '@rollup/rollup-android-arm64': 4.50.1
- '@rollup/rollup-darwin-arm64': 4.50.1
- '@rollup/rollup-darwin-x64': 4.50.1
- '@rollup/rollup-freebsd-arm64': 4.50.1
- '@rollup/rollup-freebsd-x64': 4.50.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.50.1
- '@rollup/rollup-linux-arm-musleabihf': 4.50.1
- '@rollup/rollup-linux-arm64-gnu': 4.50.1
- '@rollup/rollup-linux-arm64-musl': 4.50.1
- '@rollup/rollup-linux-loongarch64-gnu': 4.50.1
- '@rollup/rollup-linux-ppc64-gnu': 4.50.1
- '@rollup/rollup-linux-riscv64-gnu': 4.50.1
- '@rollup/rollup-linux-riscv64-musl': 4.50.1
- '@rollup/rollup-linux-s390x-gnu': 4.50.1
- '@rollup/rollup-linux-x64-gnu': 4.50.1
- '@rollup/rollup-linux-x64-musl': 4.50.1
- '@rollup/rollup-openharmony-arm64': 4.50.1
- '@rollup/rollup-win32-arm64-msvc': 4.50.1
- '@rollup/rollup-win32-ia32-msvc': 4.50.1
- '@rollup/rollup-win32-x64-msvc': 4.50.1
+ '@rollup/rollup-android-arm-eabi': 4.52.5
+ '@rollup/rollup-android-arm64': 4.52.5
+ '@rollup/rollup-darwin-arm64': 4.52.5
+ '@rollup/rollup-darwin-x64': 4.52.5
+ '@rollup/rollup-freebsd-arm64': 4.52.5
+ '@rollup/rollup-freebsd-x64': 4.52.5
+ '@rollup/rollup-linux-arm-gnueabihf': 4.52.5
+ '@rollup/rollup-linux-arm-musleabihf': 4.52.5
+ '@rollup/rollup-linux-arm64-gnu': 4.52.5
+ '@rollup/rollup-linux-arm64-musl': 4.52.5
+ '@rollup/rollup-linux-loong64-gnu': 4.52.5
+ '@rollup/rollup-linux-ppc64-gnu': 4.52.5
+ '@rollup/rollup-linux-riscv64-gnu': 4.52.5
+ '@rollup/rollup-linux-riscv64-musl': 4.52.5
+ '@rollup/rollup-linux-s390x-gnu': 4.52.5
+ '@rollup/rollup-linux-x64-gnu': 4.52.5
+ '@rollup/rollup-linux-x64-musl': 4.52.5
+ '@rollup/rollup-openharmony-arm64': 4.52.5
+ '@rollup/rollup-win32-arm64-msvc': 4.52.5
+ '@rollup/rollup-win32-ia32-msvc': 4.52.5
+ '@rollup/rollup-win32-x64-gnu': 4.52.5
+ '@rollup/rollup-win32-x64-msvc': 4.52.5
fsevents: 2.3.3
rrweb-cssom@0.8.0: {}
@@ -5527,21 +5536,21 @@ snapshots:
dependencies:
global: 4.4.0
- vite-plugin-compression2@1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)):
+ vite-plugin-compression2@1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)):
dependencies:
- '@rollup/pluginutils': 5.1.3(rollup@4.50.1)
+ '@rollup/pluginutils': 5.1.3(rollup@4.52.5)
tar-mini: 0.2.0
- vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
+ vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
- vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0):
+ vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0):
dependencies:
- esbuild: 0.25.9
+ esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
- rollup: 4.50.1
+ rollup: 4.52.5
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 22.10.10
From 57db25d08a1ef2cd0b41f34e312b7b7c35c7ed38 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Wed, 22 Oct 2025 10:38:30 +0200
Subject: [PATCH 007/169] fix(http): remove auth query parameter
---
http/auth.go | 5 -----
1 file changed, 5 deletions(-)
diff --git a/http/auth.go b/http/auth.go
index 18d10025..3604c122 100644
--- a/http/auth.go
+++ b/http/auth.go
@@ -51,11 +51,6 @@ func (e extractor) ExtractToken(r *http.Request) (string, error) {
return token, nil
}
- auth := r.URL.Query().Get("auth")
- if auth != "" && strings.Count(auth, ".") == 2 {
- return auth, nil
- }
-
if r.Method == http.MethodGet {
cookie, _ := r.Cookie("auth")
if cookie != nil && strings.Count(cookie.Value, ".") == 2 {
From c18afcddc4f2cc29c9711e9077b2d2048a508248 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Wed, 22 Oct 2025 10:39:43 +0200
Subject: [PATCH 008/169] chore(release): 2.44.2
---
CHANGELOG.md | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index df4ec91b..1659a413 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+### [2.44.2](https://github.com/filebrowser/filebrowser/compare/v2.44.1...v2.44.2) (2025-10-22)
+
+
+### Bug Fixes
+
+* **http:** remove auth query parameter ([57db25d](https://github.com/filebrowser/filebrowser/commit/57db25d08a1ef2cd0b41f34e312b7b7c35c7ed38))
+
+
+### Build
+
+* **deps-dev:** bump vite from 6.3.6 to 6.4.1 in /frontend ([b8f64a1](https://github.com/filebrowser/filebrowser/commit/b8f64a1c1bc235df784d7f52abd3a9e84c6db6ce))
+
### [2.44.1](https://github.com/filebrowser/filebrowser/compare/v2.44.0...v2.44.1) (2025-10-17)
From d00b3ea8f8f8cd48326a5bf7e2b44e9b510cca46 Mon Sep 17 00:00:00 2001
From: jagadam97
Date: Mon, 27 Oct 2025 04:44:31 +0530
Subject: [PATCH 009/169] fix(img):Prevent thumbnail generation for large
images
---
http/utils.go | 3 +++
img/service.go | 17 ++++++++++++++++-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/http/utils.go b/http/utils.go
index a1611ce5..03615263 100644
--- a/http/utils.go
+++ b/http/utils.go
@@ -9,6 +9,7 @@ import (
"strings"
libErrors "github.com/filebrowser/filebrowser/v2/errors"
+ imgErrors "github.com/filebrowser/filebrowser/v2/img"
)
func renderJSON(w http.ResponseWriter, _ *http.Request, data interface{}) (int, error) {
@@ -42,6 +43,8 @@ func errToStatus(err error) int {
return http.StatusBadRequest
case errors.Is(err, libErrors.ErrRootUserDeletion):
return http.StatusForbidden
+ case errors.Is(err, imgErrors.ErrImageTooLarge):
+ return http.StatusRequestEntityTooLarge
default:
return http.StatusInternalServerError
}
diff --git a/img/service.go b/img/service.go
index 2791c387..34a84c67 100644
--- a/img/service.go
+++ b/img/service.go
@@ -19,6 +19,15 @@ import (
// ErrUnsupportedFormat means the given image format is not supported.
var ErrUnsupportedFormat = errors.New("unsupported image format")
+// ErrImageTooLarge means the image is too large to create a thumbnail.
+var ErrImageTooLarge = errors.New("image too large for thumbnail generation")
+
+// Maximum dimensions for thumbnail generation to prevent server crashes
+const (
+ MaxImageWidth = 10000
+ MaxImageHeight = 10000
+)
+
// Service
type Service struct {
sem semaphore.Semaphore
@@ -187,11 +196,17 @@ func (s *Service) detectFormat(in io.Reader) (Format, io.Reader, error) {
buf := &bytes.Buffer{}
r := io.TeeReader(in, buf)
- _, imgFormat, err := image.DecodeConfig(r)
+ imgConfig, imgFormat, err := image.DecodeConfig(r)
if err != nil {
return 0, nil, fmt.Errorf("%s: %w", err.Error(), ErrUnsupportedFormat)
}
+ // Check if image dimensions exceed maximum allowed size
+ if imgConfig.Width > MaxImageWidth || imgConfig.Height > MaxImageHeight {
+ return 0, nil, fmt.Errorf("image dimensions %dx%d exceed maximum %dx%d: %w",
+ imgConfig.Width, imgConfig.Height, MaxImageWidth, MaxImageHeight, ErrImageTooLarge)
+ }
+
format, err := ParseFormat(imgFormat)
if err != nil {
return 0, nil, ErrUnsupportedFormat
From b9a03fabd98119d6588882f5ba2a7d29b012d729 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sat, 1 Nov 2025 08:38:55 +0100
Subject: [PATCH 010/169] feat: update translations (#5458)
---
frontend/src/i18n/hr.json | 271 +++++++++++++++++++++++++++++++++++
frontend/src/i18n/pl.json | 2 +-
frontend/src/i18n/sk.json | 4 +-
frontend/src/i18n/sv-se.json | 88 ++++++------
4 files changed, 318 insertions(+), 47 deletions(-)
create mode 100644 frontend/src/i18n/hr.json
diff --git a/frontend/src/i18n/hr.json b/frontend/src/i18n/hr.json
new file mode 100644
index 00000000..433a3b43
--- /dev/null
+++ b/frontend/src/i18n/hr.json
@@ -0,0 +1,271 @@
+{
+ "buttons": {
+ "cancel": "Otkaži",
+ "clear": "Očisti",
+ "close": "Zatvori",
+ "continue": "Nastavi",
+ "copy": "Kopiraj",
+ "copyFile": "Kopiraj datoteku",
+ "copyToClipboard": "Kopiraj u međuspremnik",
+ "copyDownloadLinkToClipboard": "Kopiraj poveznicu za preuzimanje u međuspremnik",
+ "create": "Stvori",
+ "delete": "Izbriši",
+ "download": "Preuzmi",
+ "file": "Datoteka",
+ "folder": "Mapa",
+ "fullScreen": "Prebaci na cijeli zaslon",
+ "hideDotfiles": "Sakrij datoteke koje započinju točkom",
+ "info": "Info",
+ "more": "Više",
+ "move": "Premjesti",
+ "moveFile": "Premjesti datoteku",
+ "new": "Novo",
+ "next": "Sljedeće",
+ "ok": "OK",
+ "permalink": "Dohvati trajnu poveznicu",
+ "previous": "Prethodno",
+ "preview": "Pregled",
+ "publish": "Objavi",
+ "rename": "Preimenuj",
+ "replace": "Zamijeni",
+ "reportIssue": "Prijavi grešku",
+ "save": "Spremi",
+ "schedule": "Zakaži",
+ "search": "Pretraži",
+ "select": "Označi",
+ "selectMultiple": "Označi više",
+ "share": "Podijeli",
+ "shell": "Promijeni ljusku",
+ "submit": "Predaj",
+ "switchView": "Promijeni prikaz",
+ "toggleSidebar": "Prebaci bočnu traku",
+ "update": "Ažuriraj",
+ "upload": "Prenesi",
+ "openFile": "Otvori datoteku",
+ "discardChanges": "Odbaci",
+ "saveChanges": "Spremi promjene"
+ },
+ "download": {
+ "downloadFile": "Preuzmi Datoteku",
+ "downloadFolder": "Preuzmi Mapu",
+ "downloadSelected": "Preuzmi Odabrano"
+ },
+ "upload": {
+ "abortUpload": "Jeste li sigurni da hoćete otkazati?"
+ },
+ "errors": {
+ "forbidden": "Nemate dopuštenje pristupiti ovome.",
+ "internal": "Nešto je stvarno pošlo po zlu.",
+ "notFound": "Lokacija ne može biti dohvaćena.",
+ "connection": "Poslužitelj ne može biti dohvaćen."
+ },
+ "files": {
+ "body": "Tijelo",
+ "closePreview": "Zatvori pregled",
+ "files": "Datoteke",
+ "folders": "Mape",
+ "home": "Dom",
+ "lastModified": "Zadnje izmijenjeno",
+ "loading": "Učitavanje...",
+ "lonely": "Ovdje je tako prazno...",
+ "metadata": "Metapodaci",
+ "multipleSelectionEnabled": "Višestruk odabir",
+ "name": "Naziv",
+ "size": "Veličina",
+ "sortByLastModified": "Sortiraj po zadnjoj izmjeni",
+ "sortByName": "Sortiraj po nazivu",
+ "sortBySize": "Sortiraj po veličini",
+ "noPreview": "Pregled nije dostupan za ovu datoteku."
+ },
+ "help": {
+ "click": "odaberi datoteku ili mapu",
+ "ctrl": {
+ "click": "odaberi više datoteka ili mapa",
+ "f": "tražilica",
+ "s": "spremi datoteku ili preuzmi trenutnu mapu"
+ },
+ "del": "izbriši odabrane stavke",
+ "doubleClick": "otvori datoteku ili mapu",
+ "esc": "očisti odabir i/ili zatvori upit",
+ "f1": "ova informacija",
+ "f2": "preimenuj datoteku",
+ "help": "Pomoć"
+ },
+ "login": {
+ "createAnAccount": "Stvori korisnički račun",
+ "loginInstead": "Imam korisnički račun",
+ "password": "Lozinka",
+ "passwordConfirm": "Potvrda lozinke",
+ "passwordsDontMatch": "Lozinke se ne podudaraju",
+ "signup": "Registracija",
+ "submit": "Prijava",
+ "username": "Korisničko ime",
+ "usernameTaken": "Korisničko ime zauzeto",
+ "wrongCredentials": "Neispravno korisničko ime/lozinka",
+ "logout_reasons": {
+ "inactivity": "Odjavljeni ste zbog neaktivnosti."
+ }
+ },
+ "permanent": "Trajan",
+ "prompts": {
+ "copy": "Kopiraj",
+ "copyMessage": "Odaberite lokaciju za kopiranje datoteka:",
+ "currentlyNavigating": "Trenutno navigiranje na:",
+ "deleteMessageMultiple": "Jeste li sigurni da želite izbrisati datoteke: {count}?",
+ "deleteMessageSingle": "Jeste li sigurni da hoćete izbrisati ovu datoteku/mapu?",
+ "deleteMessageShare": "Jeste li sigurni da hoćete izbrisati ovo dijeljenje({path})?",
+ "deleteUser": "Jeste li sigurni da hoćete izbrisati ovaj korisnički račun?",
+ "deleteTitle": "Izbriši datoteke",
+ "displayName": "Prikazno Ime:",
+ "download": "Preuzmi datoteke",
+ "downloadMessage": "Odaberite format za preuzimanje.",
+ "error": "Nešto je pošlo po zlu",
+ "fileInfo": "Informacije o datoteci",
+ "filesSelected": "{count} datoteka odabrana.",
+ "lastModified": "Zadnje izmijenjeno",
+ "move": "Premjesti",
+ "moveMessage": "Odaberite novi dom za Vašu datoteku(e)/mapu(e):",
+ "newArchetype": "Stvorite novu objavu na temelju arhetipu. Vaša datoteka bit će stvorena u mapi sadržaja.",
+ "newDir": "Nova mapa",
+ "newDirMessage": "Imenujte Vašu novu mapu.",
+ "newFile": "Nova datoteka",
+ "newFileMessage": "Imenujte Vašu novu datoteku.",
+ "numberDirs": "Broj mapa",
+ "numberFiles": "Broj datoteka",
+ "rename": "Preimenuj",
+ "renameMessage": "Umetni novo ime za",
+ "replace": "Zamijeni",
+ "replaceMessage": "Jedna od datoteka koju pokušavate prenijeti ima sukobljavajući naziv. Želite li preskočiti ovu datoteku i nastaviti s prijenosom ili zamijeniti postojeću datoteku?\n",
+ "schedule": "Zakaži",
+ "scheduleMessage": "Odaberite datum i vrijeme za zakazivanje ove objave.",
+ "show": "Prikaži",
+ "size": "Veličina",
+ "upload": "Prenesi",
+ "uploadFiles": "Prenošenje {files} datoteka...",
+ "uploadMessage": "Odaberite opciju za prijenos.",
+ "optionalPassword": "Opcionalna lozinka",
+ "resolution": "Rezolucija",
+ "discardEditorChanges": "Jeste li sigurni da želite odbaciti promjene koje ste napravili?"
+ },
+ "search": {
+ "images": "Slike",
+ "music": "Glazba",
+ "pdf": "PDF",
+ "pressToSearch": "Pritisnite enter za pretraživanje...",
+ "search": "Pretraživanje...",
+ "typeToSearch": "Tipkajte za pretraživanje...",
+ "types": "Tipovi",
+ "video": "Video"
+ },
+ "settings": {
+ "aceEditorTheme": "Ace editor theme",
+ "admin": "Admin",
+ "administrator": "Administrator",
+ "allowCommands": "Izvrši naredbe",
+ "allowEdit": "Uredi, preimenuj i izbriši datoteke ili mape",
+ "allowNew": "Stvori nove datoteke i mape",
+ "allowPublish": "Objavi nove objave i stranice",
+ "allowSignup": "Dopusti registraciju korisnicima",
+ "avoidChanges": "(ostavite prazno kako biste izbjegli promjene)",
+ "branding": "Brendiranje",
+ "brandingDirectoryPath": "Put brendiranja",
+ "brandingHelp": "Možete prilagoditi izgled i funkcionalnost Vašeg File Browsera mijenjanjem njegovog naziva, zamjenom logotipa, dodavanjem prilagođenih stilova pa čak i onemogućavanjem vanjskih poveznica na GitHub.\nZa više informacija o prilagođenome brendiranju pogledajte {0}.",
+ "changePassword": "Promjena lozinke",
+ "commandRunner": "Izvršitelj naredbi",
+ "commandRunnerHelp": "Ovdje možete postaviti naredbe koje se izvršuju u imenovanim događajima. Morate napisati jednu po liniji. Varijable okruženja {0} i {1} bit će dostupne, tako da je {0} relativna {1}. Za više informacija o ovoj značajci pogledajte {2}.",
+ "commandsUpdated": "Naredbe ažurirane!",
+ "createUserDir": "Automatsko stvaranje kućne mape korisnika pri dodavanju novog korisnika",
+ "minimumPasswordLength": "Minimalna duljina lozinke",
+ "tusUploads": "Segmentirani prijenosi",
+ "tusUploadsHelp": "File Browser podržava segmentirane prijenose datoteka, omogućavajući stvaranje učinkovitih, pouzdanih, obnovljivih i segmentiranih prijenosa datoteka čak i na nepouzdanim mrežama.",
+ "tusUploadsChunkSize": "Naznačuje maksimalnu veličinu zahtjeva (direktni prijenosi bit će korišteni za manje prijenose). Možete unijeti cijeli broj koji označava veličinu bajta ili niz znakova poput 10MB, 1GB itd.",
+ "tusUploadsRetryCount": "Broj ponovnih pokušaja ako se dio ne uspije prenijeti.",
+ "userHomeBasePath": "Bazni put za kućne mape korisnika",
+ "userScopeGenerationPlaceholder": "Opseg će se automatski generirati",
+ "createUserHomeDirectory": "Stvori kućnu mapu korisnika",
+ "customStylesheet": "Prilagođeni Stylesheet",
+ "defaultUserDescription": "Zadane postavke za nove korisnike.",
+ "disableExternalLinks": "Onemogući vanjske poveznice (osim dokumentacije)",
+ "disableUsedDiskPercentage": "Onemogući graf iskorištenosti diska",
+ "documentation": "dokumentacija",
+ "examples": "Primjeri",
+ "executeOnShell": "Izvrši u ljusci",
+ "executeOnShellDescription": "Po zadanim postavkama, File Browser izvršava naredbe izravnim pozivanjem njihovih binarnih datoteka. Ako ih želite izvršiti u ljusci (kao što su Bash ili PowerShell), možete ih definirati ovdje s potrebnim argumentima i oznakama. Ako je postavljena, naredba koju izvršavate bit će dodana kao argument. To se odnosi i na korisničke naredbe i na događajne kuke.",
+ "globalRules": "Ovo je globalan skup pravila dopuštanja i zabrane. Primjenjuju se na svakog korisnika. Moguće je definirati specifična pravila u postavkama svakog korisnika da biste nadjačali ove postavke.",
+ "globalSettings": "Globalne postavke",
+ "hideDotfiles": "Sakrij datoteke koje započinju točkom",
+ "insertPath": "Umetni put",
+ "insertRegex": "Umetni regex izraz",
+ "instanceName": "Naziv instance",
+ "language": "Jezik",
+ "lockPassword": "Onemogući mijenjanje lozinke korisniku",
+ "newPassword": "Vaša nova lozinka",
+ "newPasswordConfirm": "Potvrdite Vašu novu lozinku",
+ "newUser": "Novi Korisnik",
+ "password": "Lozinka",
+ "passwordUpdated": "Lozinka ažurirana!",
+ "path": "Put",
+ "perm": {
+ "create": "Stvaranje datoteka i mapa",
+ "delete": "Brisanje datoteka i mapa",
+ "download": "Preuzimanje",
+ "execute": "Izvršavanje naredbi",
+ "modify": "Uređivanje datoteka",
+ "rename": "Preimenovanje ili premještanje datoteka i mapa",
+ "share": "Dijeljenje datoteka"
+ },
+ "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",
+ "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",
+ "rulesHelp": "Ovdje možete definirati skup pravila dopuštanja i zabrane za ovog specifičnog korisnika. Blokirane datoteke neće se prikazivati u popisima i neće biti dostupne korisniku. Podržavamo regex i puteve relativne opsegu korisnika.\n",
+ "scope": "Opseg",
+ "setDateFormat": "Odredi točan format datuma",
+ "settingsUpdated": "Postavke ažurirane!",
+ "shareDuration": "Podijeli Trajanje",
+ "shareManagement": "Upravljanje Dijeljenjem",
+ "shareDeleted": "Podjela izbrisana!",
+ "singleClick": "Koristi jednostruke klikove za otvaranje datoteka i mapa",
+ "themes": {
+ "default": "Zadano - Sustav",
+ "dark": "Tamno",
+ "light": "Svijetlo",
+ "title": "Tema"
+ },
+ "user": "Korisnik",
+ "userCommands": "Naredbe",
+ "userCommandsHelp": "Popis dostupnih naredbi za ovog korisnika. Primjer:\n",
+ "userCreated": "Korisnik stvoren!",
+ "userDefaults": "Zadane postavke korisnika",
+ "userDeleted": "Korisnik izbrisan!",
+ "userManagement": "Upravljanje Korisnicima",
+ "userUpdated": "Korisnik ažuriran!",
+ "username": "Korisničko ime",
+ "users": "Korisnici"
+ },
+ "sidebar": {
+ "help": "Pomoć",
+ "hugoNew": "Hugo New",
+ "login": "Prijava",
+ "logout": "Odjava",
+ "myFiles": "Moje datoteke",
+ "newFile": "Nova datoteka",
+ "newFolder": "Nova mapa",
+ "preview": "Pregled",
+ "settings": "Postavke",
+ "signup": "Registracija",
+ "siteSettings": "Postavke stranice"
+ },
+ "success": {
+ "linkCopied": "Poveznica kopirana!"
+ },
+ "time": {
+ "days": "Dani",
+ "hours": "Sati",
+ "minutes": "Minute",
+ "seconds": "Sekunde",
+ "unit": "Jedinica vremena"
+ }
+}
diff --git a/frontend/src/i18n/pl.json b/frontend/src/i18n/pl.json
index b9db7455..7c9e71b8 100644
--- a/frontend/src/i18n/pl.json
+++ b/frontend/src/i18n/pl.json
@@ -158,7 +158,7 @@
"video": "Wideo"
},
"settings": {
- "aceEditorTheme": "Ace editor theme",
+ "aceEditorTheme": "Motyw edytora Ace",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Wykonaj polecenie",
diff --git a/frontend/src/i18n/sk.json b/frontend/src/i18n/sk.json
index 68112fba..da0fac33 100644
--- a/frontend/src/i18n/sk.json
+++ b/frontend/src/i18n/sk.json
@@ -43,7 +43,7 @@
"upload": "Nahrať",
"openFile": "Otvoriť súbor",
"discardChanges": "Zahodiť",
- "saveChanges": "Save changes"
+ "saveChanges": "Uložiť zmeny"
},
"download": {
"downloadFile": "Stiahnuť súbor",
@@ -103,7 +103,7 @@
"usernameTaken": "Meno je už obsadené",
"wrongCredentials": "Nesprávne prihlasovacie údaje",
"logout_reasons": {
- "inactivity": "You have been logged out due to inactivity."
+ "inactivity": "Boli ste odhlásení z dôvodu nečinnosti."
}
},
"permanent": "Trvalé",
diff --git a/frontend/src/i18n/sv-se.json b/frontend/src/i18n/sv-se.json
index 9f66a141..0378587a 100644
--- a/frontend/src/i18n/sv-se.json
+++ b/frontend/src/i18n/sv-se.json
@@ -3,18 +3,18 @@
"cancel": "Avbryt",
"clear": "Rensa",
"close": "Stäng",
- "continue": "Continue",
+ "continue": "Fortsätt",
"copy": "Kopiera",
"copyFile": "Kopiera fil",
"copyToClipboard": "Kopiera till urklipp",
- "copyDownloadLinkToClipboard": "Copy download link to clipboard",
+ "copyDownloadLinkToClipboard": "Kopiera hämtningslänk till urklipp",
"create": "Skapa",
"delete": "Ta bort",
"download": "Ladda ner",
- "file": "File",
- "folder": "Folder",
- "fullScreen": "Toggle full screen",
- "hideDotfiles": "Hide dotfiles",
+ "file": "Fil",
+ "folder": "Mapp",
+ "fullScreen": "Växla helskärm",
+ "hideDotfiles": "Dölj punktfiler",
"info": "Info",
"more": "Mer",
"move": "Flytta",
@@ -24,7 +24,7 @@
"ok": "OK",
"permalink": "Skapa en permanent länk",
"previous": "Föregående",
- "preview": "Preview",
+ "preview": "Förhandsvisa",
"publish": "Publisera",
"rename": "Ändra namn",
"replace": "Ersätt",
@@ -36,28 +36,28 @@
"selectMultiple": "Välj flera",
"share": "Dela",
"shell": "Växla skal",
- "submit": "Submit",
+ "submit": "Skicka",
"switchView": "Byt vy",
"toggleSidebar": "Växla sidofält",
"update": "Uppdatera",
"upload": "Ladda upp",
- "openFile": "Open file",
- "discardChanges": "Discard",
- "saveChanges": "Save changes"
+ "openFile": "Öppna fil",
+ "discardChanges": "Förkasta",
+ "saveChanges": "Spara ändringar"
},
"download": {
"downloadFile": "Ladda ner fil",
"downloadFolder": "Ladda ner mapp",
- "downloadSelected": "Download Selected"
+ "downloadSelected": "Hämta markerade"
},
"upload": {
- "abortUpload": "Are you sure you wish to abort?"
+ "abortUpload": "Är du säker på att du vill avbryta?"
},
"errors": {
"forbidden": "Du saknar rättigheter till detta",
"internal": "Något gick fel",
"notFound": "Det går inte att nå den här platsen.",
- "connection": "The server can't be reached."
+ "connection": "Servern går inte att nå."
},
"files": {
"body": "Huvud",
@@ -75,7 +75,7 @@
"sortByLastModified": "Sortera på senast ändrad",
"sortByName": "Sortera på namn",
"sortBySize": "Sortera på storlek",
- "noPreview": "Preview is not available for this file."
+ "noPreview": "Förhandsvisning är inte tillgänglig för denna fil."
},
"help": {
"click": "välj fil eller mapp",
@@ -103,7 +103,7 @@
"usernameTaken": "Användarnamn upptaget",
"wrongCredentials": "Fel inloggning",
"logout_reasons": {
- "inactivity": "You have been logged out due to inactivity."
+ "inactivity": "Du har blivit utloggad på grund av inaktivitet."
}
},
"permanent": "Permanent",
@@ -113,8 +113,8 @@
"currentlyNavigating": "För närvarande navigerar du på:",
"deleteMessageMultiple": "Är du säker på att du vill radera {count} filer(na)?",
"deleteMessageSingle": "Är du säker på att du vill radera denna fil/mapp",
- "deleteMessageShare": "Are you sure you wish to delete this share({path})?",
- "deleteUser": "Are you sure you want to delete this user?",
+ "deleteMessageShare": "Är du säker på att du vill ta bort denna utdelning({path})?",
+ "deleteUser": "Är du säker på att du vill ta bort denna användare?",
"deleteTitle": "Ta bort filer",
"displayName": "Visningsnamn:",
"download": "Ladda ner filer",
@@ -140,12 +140,12 @@
"scheduleMessage": "Pick a date and time to schedule the publication of this post.",
"show": "Visa",
"size": "Storlek",
- "upload": "Upload",
- "uploadFiles": "Uploading {files} files...",
- "uploadMessage": "Select an option to upload.",
- "optionalPassword": "Optional password",
- "resolution": "Resolution",
- "discardEditorChanges": "Are you sure you wish to discard the changes you've made?"
+ "upload": "Ladda upp",
+ "uploadFiles": "Laddar upp {files} filer...",
+ "uploadMessage": "Välj ett alternativ att ladda upp.",
+ "optionalPassword": "Valfritt lösenord",
+ "resolution": "Upplösning",
+ "discardEditorChanges": "Är du säker på att du vill förkasta ändringarna du gjort?"
},
"search": {
"images": "Bilder",
@@ -158,7 +158,7 @@
"video": "Video"
},
"settings": {
- "aceEditorTheme": "Ace editor theme",
+ "aceEditorTheme": "Tema för Ace editor",
"admin": "Admin",
"administrator": "Administratör",
"allowCommands": "Exekvera kommandon",
@@ -175,14 +175,14 @@
"commandRunnerHelp": "Här kan du ange kommandon som körs i de namngivna händelserna. Du måste skriva en per rad. Miljövariablerna {0} och {1} kommer att vara tillgängliga, och vara {0} i förhållande till {1}. För mer information om den här funktionen och de tillgängliga miljövariablerna, vänligen läs {2}.",
"commandsUpdated": "Kommandon uppdaterade!",
"createUserDir": "Auto skapa användarens hemkatalog när du lägger till nya användare",
- "minimumPasswordLength": "Minimum password length",
- "tusUploads": "Chunked Uploads",
- "tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.",
- "tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.",
- "tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.",
- "userHomeBasePath": "Base path for user home directories",
- "userScopeGenerationPlaceholder": "The scope will be auto generated",
- "createUserHomeDirectory": "Create user home directory",
+ "minimumPasswordLength": "Minsta lösenordslängd",
+ "tusUploads": "Uppdelade uppladdningar",
+ "tusUploadsHelp": "Filbläddraren stöder uppdelade filuppladdningar, vilket möjliggör effektiva, tillförlitliga, återupptagbara och uppdelade filuppladdningar även på otillförlitliga nätverk.",
+ "tusUploadsChunkSize": "Anger maximal storlek för en begäran (direkta uppladdningar används för mindre uppladdningar). Du kan ange ett helt tal som anger storleken i byte eller en sträng som 10 MB, 1 GB osv.",
+ "tusUploadsRetryCount": "Antal försök som ska göras om en del inte kan laddas upp.",
+ "userHomeBasePath": "Bassökväg för användarnas hemkataloger",
+ "userScopeGenerationPlaceholder": "Omfånget kommer att automatiskt genereras",
+ "createUserHomeDirectory": "Skapa användarens hemkatalog",
"customStylesheet": "Anpassad formatmall",
"defaultUserDescription": "Detta är standard inställningar för användare.",
"disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)",
@@ -193,7 +193,7 @@
"executeOnShellDescription": "Som standard kör fil bläddraren kommandona genom att anropa deras binärfiler direkt. Om du vill köra dem på ett skal i stället (till exempel bash eller PowerShell), kan du definiera det här med nödvändiga argument och flaggor. Om det är inställt kommer kommandot du kör att läggas till som ett argument. Detta gäller både användar kommandon och händelse krokar.",
"globalRules": "Det här är en global uppsättning regler för att tillåta och inte tillåta. De gäller för alla användare. Du kan definiera specifika regler för varje användares inställningar för att åsidosätta de här inställningarna.",
"globalSettings": "Globala inställningar",
- "hideDotfiles": "Hide dotfiles",
+ "hideDotfiles": "Dölj punktfiler",
"insertPath": "Ange sökväg",
"insertRegex": "Sätt in regex expression",
"instanceName": "Instans namn",
@@ -204,7 +204,7 @@
"newUser": "Ny användare",
"password": "Lösenord",
"passwordUpdated": "Lösenord uppdaterat",
- "path": "Path",
+ "path": "Sökväg",
"perm": {
"create": "Skapa filer och mappar",
"delete": "Ta bort filer och mappar",
@@ -222,17 +222,17 @@
"rules": "Regler",
"rulesHelp": "Här kan du definiera en uppsättning regler för godkänna och neka för den här specifika användaren. Den blockerade filen kommer inte upp i listningarna och kommer inte att vara tillgänglig till användaren. Vi stöder regex och sökvägar i förhållande till användarnas omfång.\n",
"scope": "Omfattning",
- "setDateFormat": "Set exact date format",
+ "setDateFormat": "Ställ in exakt datumformat",
"settingsUpdated": "Inställning uppdaterad!",
- "shareDuration": "Share Duration",
- "shareManagement": "Share Management",
- "shareDeleted": "Share deleted!",
- "singleClick": "Use single clicks to open files and directories",
+ "shareDuration": "Utdelningstid",
+ "shareManagement": "Utdelningshantering",
+ "shareDeleted": "Utdelning borttagen!",
+ "singleClick": "Använd enkla klick för att öppna filer och kataloger",
"themes": {
- "default": "System default",
- "dark": "Dark",
- "light": "Light",
- "title": "Theme"
+ "default": "Systemet standard",
+ "dark": "Mörk",
+ "light": "Ljus",
+ "title": "Tema"
},
"user": "Användare",
"userCommands": "Kommandon",
From 93fe31cc55c9d9d27c634993619a768fa700da1d Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sat, 1 Nov 2025 08:53:50 +0100
Subject: [PATCH 011/169] fix: support croatian (#5502)
---
frontend/src/components/settings/Languages.vue | 1 +
frontend/src/i18n/index.ts | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/frontend/src/components/settings/Languages.vue b/frontend/src/components/settings/Languages.vue
index f17ab8e2..f4e4090e 100644
--- a/frontend/src/components/settings/Languages.vue
+++ b/frontend/src/components/settings/Languages.vue
@@ -16,6 +16,7 @@ export default {
const dataObj = {};
const locales = {
he: "עברית",
+ hr: "Hrvatski",
hu: "Magyar",
ar: "العربية",
ca: "Català",
diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts
index dcf6cef9..a276ee9d 100644
--- a/frontend/src/i18n/index.ts
+++ b/frontend/src/i18n/index.ts
@@ -8,6 +8,7 @@ import("dayjs/locale/en");
import("dayjs/locale/es");
import("dayjs/locale/fr");
import("dayjs/locale/he");
+import("dayjs/locale/hr");
import("dayjs/locale/hu");
import("dayjs/locale/is");
import("dayjs/locale/it");
@@ -41,6 +42,9 @@ export function detectLocale() {
case /^he\b/.test(locale):
locale = "he";
break;
+ case /^hr\b/.test(locale):
+ locale = "hr";
+ break;
case /^hu\b/.test(locale):
locale = "hu";
break;
From 99aeb766c3b8e4520acbdb51e16f0ef28f1e21be Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Sat, 1 Nov 2025 09:57:04 +0100
Subject: [PATCH 012/169] chore(release): 2.45.0
---
CHANGELOG.md | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1659a413..7a130be0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+## [2.45.0](https://github.com/filebrowser/filebrowser/compare/v2.44.2...v2.45.0) (2025-11-01)
+
+
+### Features
+
+* update translations ([#5458](https://github.com/filebrowser/filebrowser/issues/5458)) ([b9a03fa](https://github.com/filebrowser/filebrowser/commit/b9a03fabd98119d6588882f5ba2a7d29b012d729))
+
+
+### Bug Fixes
+
+* support croatian ([#5502](https://github.com/filebrowser/filebrowser/issues/5502)) ([93fe31c](https://github.com/filebrowser/filebrowser/commit/93fe31cc55c9d9d27c634993619a768fa700da1d))
+
### [2.44.2](https://github.com/filebrowser/filebrowser/compare/v2.44.1...v2.44.2) (2025-10-22)
From 291223b3cefe1e50fae8f73d70464b1dc25351a4 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 08:06:16 +0100
Subject: [PATCH 013/169] Merge commit from fork
---
http/share.go | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/http/share.go b/http/share.go
index e1036d2a..d968c05b 100644
--- a/http/share.go
+++ b/http/share.go
@@ -77,7 +77,16 @@ var shareDeleteHandler = withPermShare(func(_ http.ResponseWriter, r *http.Reque
return http.StatusBadRequest, nil
}
- err := d.store.Share.Delete(hash)
+ link, err := d.store.Share.GetByHash(hash)
+ if err != nil {
+ return errToStatus(err), err
+ }
+
+ if link.UserID != d.user.ID && !d.user.Perm.Admin {
+ return http.StatusForbidden, nil
+ }
+
+ err = d.store.Share.Delete(hash)
return errToStatus(err), err
})
From 6950c2e4d2868f06235f93c0a18b303b4095ca0a Mon Sep 17 00:00:00 2001
From: Jagadam Dinesh Reddy
Date: Tue, 11 Nov 2025 12:39:19 +0530
Subject: [PATCH 014/169] fix: share page preview items to contain baseUrl
(#5510)
Co-authored-by: jagadam97
---
.../src/components/settings/AceEditorTheme.vue | 6 +++++-
frontend/src/views/Share.vue | 15 ++++++---------
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/frontend/src/components/settings/AceEditorTheme.vue b/frontend/src/components/settings/AceEditorTheme.vue
index 09efe48b..68585a3a 100644
--- a/frontend/src/components/settings/AceEditorTheme.vue
+++ b/frontend/src/components/settings/AceEditorTheme.vue
@@ -1,5 +1,9 @@
-
+
{{ theme.name }}
diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue
index 40b940b5..f92b8633 100644
--- a/frontend/src/views/Share.vue
+++ b/frontend/src/views/Share.vue
@@ -301,7 +301,7 @@ import { pub as api } from "@/api";
import { filesize } from "@/utils";
import dayjs from "dayjs";
import { Base64 } from "js-base64";
-
+import { createURL } from "@/api/utils";
import HeaderBar from "@/components/header/HeaderBar.vue";
import Action from "@/components/header/Action.vue";
import Breadcrumbs from "@/components/Breadcrumbs.vue";
@@ -354,14 +354,11 @@ const icon = computed(() => {
const link = computed(() => (req.value ? api.getDownloadURL(req.value) : ""));
const raw = computed(() => {
- return req.value
- ? req.value.items[fileStore.selected[0]].url.replace(
- /share/,
- "api/public/dl"
- ) +
- "?token=" +
- token.value
- : "";
+ if (!req.value || !req.value.items[fileStore.selected[0]]) return "";
+ return createURL(
+ `api/public/dl/${hash.value}${req.value.items[fileStore.selected[0]].path}`,
+ { token: token.value }
+ );
});
const inlineLink = computed(() =>
req.value ? api.getDownloadURL(req.value, true) : ""
From 7a5b9646116478d1cbc9110d865852091fa99572 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 08:10:41 +0100
Subject: [PATCH 015/169] chore(release): 2.45.1
---
CHANGELOG.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7a130be0..f5c0c070 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+### [2.45.1](https://github.com/filebrowser/filebrowser/compare/v2.45.0...v2.45.1) (2025-11-11)
+
+
+### Bug Fixes
+
+* share page preview items to contain baseUrl ([#5510](https://github.com/filebrowser/filebrowser/issues/5510)) ([6950c2e](https://github.com/filebrowser/filebrowser/commit/6950c2e4d2868f06235f93c0a18b303b4095ca0a))
+
## [2.45.0](https://github.com/filebrowser/filebrowser/compare/v2.44.2...v2.45.0) (2025-11-01)
From 7860013aa95e0b63dcb334299de42b8fd158e810 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 17:39:24 +0100
Subject: [PATCH 016/169] chore: update CODEOWNERS to use team (#5512)
---
.github/CODEOWNERS | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 827fbfd1..4c1605e6 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,5 +1 @@
-# These owners will be the default owners for everything in the repo.
-# Unless a later match takes precedence, @o1egl will be requested for
-# review when someone opens a pull request.
-
-* @o1egl @hacdias
+* @filebrowser/maintainers
From 1ac0305ed07dce3e772bd54f8dd6093cdae5baf1 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 17:40:33 +0100
Subject: [PATCH 017/169] docs: add notice about releases page
---
www/docs/installation.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/www/docs/installation.md b/www/docs/installation.md
index eb609f06..741e8c1a 100644
--- a/www/docs/installation.md
+++ b/www/docs/installation.md
@@ -4,7 +4,7 @@ File Browser is a single binary and can be used as standalone executable. Howeve
## Binary
-The quickest and easiest way to install File Browser is to use a package manager, or our download script, which automatically fetches the latest version of File Browser for your platform.
+The quickest and easiest way to install File Browser is to use a package manager, or our download script, which automatically fetches the latest version of File Browser for your platform. Alternatively, you can manually download the binary from the [releases page](https://github.com/filebrowser/filebrowser/releases).
=== "Brew"
From 63142042bc731888bf371c065d9fa77ef0b3423a Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 18:10:55 +0100
Subject: [PATCH 018/169] docs: remove unmaintained badges
---
README.md | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 94ec1cef..11c3cbd8 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,8 @@
[](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml)
-[](https://goreportcard.com/report/github.com/filebrowser/filebrowser)
-[](http://godoc.org/github.com/filebrowser/filebrowser)
+[](https://goreportcard.com/report/github.com/filebrowser/filebrowser/v2)
[](https://github.com/filebrowser/filebrowser/releases/latest)
-[](http://webchat.freenode.net/?channels=%23filebrowser)
File Browser provides a file managing interface within a specified directory and it can be used to upload, delete, preview and edit your files. It is a **create-your-own-cloud**-kind of software where you can just install it on your server, direct it to a path and access your files through a nice web interface.
From c5acbffe3fb7f316dc54a17acb0ec696a2861d68 Mon Sep 17 00:00:00 2001
From: Henrique Dias
Date: Tue, 11 Nov 2025 18:32:41 +0100
Subject: [PATCH 019/169] docs: import logo and banner (#5514)
---
README.md | 2 +-
branding/banner.png | Bin 0 -> 67856 bytes
branding/banner.svg | 1 +
branding/icon.png | Bin 0 -> 39962 bytes
branding/icon.svg | 1 +
branding/logo.png | Bin 0 -> 27365 bytes
branding/logo.svg | 1 +
frontend/public/img/logo.svg | 148 +----------------------------------
www/docs/index.md | 2 +-
9 files changed, 6 insertions(+), 149 deletions(-)
create mode 100644 branding/banner.png
create mode 100644 branding/banner.svg
create mode 100644 branding/icon.png
create mode 100644 branding/icon.svg
create mode 100644 branding/logo.png
create mode 100644 branding/logo.svg
diff --git a/README.md b/README.md
index 11c3cbd8..607bca46 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
[](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml)
diff --git a/branding/banner.png b/branding/banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a533bfc850e1797c176f70f16a5544063da9629
GIT binary patch
literal 67856
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