Compare commits

...

11 Commits

Author SHA1 Message Date
Henrique Dias
037e29a708
chore(release): 2.54.0 2026-01-10 10:30:26 +01:00
Beckam White
fda8a99292
feat: add "redirect after copy/move" user setting (#5662) 2026-01-10 10:27:54 +01:00
Ariel Leyva
208535a8cc
fix: clear selection by clicking on empty area (#5663) 2026-01-10 10:05:12 +01:00
transifex-integration[bot]
464b581953
feat: update translations (#5659)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-01-10 09:38:48 +01:00
renovate[bot]
20312ff18e
chore(deps): update all non-major dependencies (#5676)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-10 09:37:56 +01:00
Ariel Leyva
219582c0b0
fix: hide "change password form" in noauth setting (#5652) 2026-01-10 09:31:27 +01:00
Jagadam Dinesh Reddy
4fd18a382c
feat: force file sync while uploading file (#5668) 2026-01-10 09:30:08 +01:00
Henrique Dias
94ec786d34
chore(release): 2.53.1 2026-01-03 08:54:16 +01:00
renovate[bot]
25e9b85259
chore(deps): update all non-major dependencies (#5657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-03 08:53:36 +01:00
Jagadam Dinesh Reddy
ffa893e9ac
fix: download path encoding file paths (#5655) 2026-01-03 08:53:21 +01:00
Ariel Leyva
b8151a038a
fix: request a password to change sensitive user data (#5629) 2026-01-03 08:44:03 +01:00
65 changed files with 631 additions and 400 deletions

View File

@ -2,6 +2,29 @@
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. 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)
### Bug Fixes
* download path encoding file paths ([#5655](https://github.com/filebrowser/filebrowser/issues/5655)) ([ffa893e](https://github.com/filebrowser/filebrowser/commit/ffa893e9ac387a49dba5917a41df7c3b7ce120fc))
* request a password to change sensitive user data ([#5629](https://github.com/filebrowser/filebrowser/issues/5629)) ([b8151a0](https://github.com/filebrowser/filebrowser/commit/b8151a038a1ea55afae8073b439b74e364cac12f))
## [2.53.0](https://github.com/filebrowser/filebrowser/compare/v2.52.0...v2.53.0) (2025-12-29) ## [2.53.0](https://github.com/filebrowser/filebrowser/compare/v2.52.0...v2.53.0) (2025-12-29)

View File

@ -158,16 +158,17 @@ func (a *HookAuth) SaveUser() (*users.User, error) {
// create user with the provided credentials // create user with the provided credentials
d := &users.User{ d := &users.User{
Username: a.Cred.Username, Username: a.Cred.Username,
Password: pass, Password: pass,
Scope: a.Settings.Defaults.Scope, Scope: a.Settings.Defaults.Scope,
Locale: a.Settings.Defaults.Locale, Locale: a.Settings.Defaults.Locale,
ViewMode: a.Settings.Defaults.ViewMode, ViewMode: a.Settings.Defaults.ViewMode,
SingleClick: a.Settings.Defaults.SingleClick, SingleClick: a.Settings.Defaults.SingleClick,
Sorting: a.Settings.Defaults.Sorting, RedirectAfterCopyMove: a.Settings.Defaults.RedirectAfterCopyMove,
Perm: a.Settings.Defaults.Perm, Sorting: a.Settings.Defaults.Sorting,
Commands: a.Settings.Defaults.Commands, Perm: a.Settings.Defaults.Perm,
HideDotfiles: a.Settings.Defaults.HideDotfiles, Commands: a.Settings.Defaults.Commands,
HideDotfiles: a.Settings.Defaults.HideDotfiles,
} }
u = a.GetUser(d) 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), Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download),
} }
user := users.User{ user := users.User{
ID: d.ID, ID: d.ID,
Username: d.Username, Username: d.Username,
Password: d.Password, Password: d.Password,
Scope: a.Fields.GetString("user.scope", d.Scope), Scope: a.Fields.GetString("user.scope", d.Scope),
Locale: a.Fields.GetString("user.locale", d.Locale), Locale: a.Fields.GetString("user.locale", d.Locale),
ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))),
SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick),
RedirectAfterCopyMove: a.Fields.GetBoolean("user.redirectAfterCopyMove", d.RedirectAfterCopyMove),
Sorting: files.Sorting{ Sorting: files.Sorting{
Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc),
By: a.Fields.GetString("user.sorting.by", d.Sorting.By), By: a.Fields.GetString("user.sorting.by", d.Sorting.By),
@ -251,6 +253,7 @@ var validHookFields = []string{
"user.locale", "user.locale",
"user.viewMode", "user.viewMode",
"user.singleClick", "user.singleClick",
"user.redirectAfterCopyMove",
"user.sorting.by", "user.sorting.by",
"user.sorting.asc", "user.sorting.asc",
"user.commands", "user.commands",

View File

@ -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, "\tLocale:\t%s\n", set.Defaults.Locale)
fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode) 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, "\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, "\tFile Creation Mode:\t%O\n", set.FileMode)
fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode) fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " ")) fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))

View File

@ -393,10 +393,11 @@ func quickSetup(v *viper.Viper, s *storage.Storage) error {
MinimumPasswordLength: settings.DefaultMinimumPasswordLength, MinimumPasswordLength: settings.DefaultMinimumPasswordLength,
UserHomeBasePath: settings.DefaultUsersHomeBasePath, UserHomeBasePath: settings.DefaultUsersHomeBasePath,
Defaults: settings.UserDefaults{ Defaults: settings.UserDefaults{
Scope: ".", Scope: ".",
Locale: "en", Locale: "en",
SingleClick: false, SingleClick: false,
AceEditorTheme: v.GetString("defaults.aceEditorTheme"), RedirectAfterCopyMove: true,
AceEditorTheme: v.GetString("defaults.aceEditorTheme"),
Perm: users.Permissions{ Perm: users.Permissions{
Admin: false, Admin: false,
Execute: true, Execute: true,

View File

@ -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") 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 { 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.ID,
u.Username, u.Username,
u.Scope, u.Scope,
u.Locale, u.Locale,
u.ViewMode, u.ViewMode,
u.SingleClick, u.SingleClick,
u.RedirectAfterCopyMove,
u.Perm.Admin, u.Perm.Admin,
u.Perm.Execute, u.Perm.Execute,
u.Perm.Create, u.Perm.Create,
@ -77,6 +78,7 @@ func addUserFlags(flags *pflag.FlagSet) {
flags.String("locale", "en", "locale for users") flags.String("locale", "en", "locale for users")
flags.String("viewMode", string(users.ListViewMode), "view mode for users") flags.String("viewMode", string(users.ListViewMode), "view mode for users")
flags.Bool("singleClick", false, "use single clicks only") 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("dateFormat", false, "use date format (true for absolute time, false for relative)")
flags.Bool("hideDotfiles", false, "hide dotfiles") flags.Bool("hideDotfiles", false, "hide dotfiles")
flags.String("aceEditorTheme", "", "ace editor's syntax highlighting theme for users") 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) defaults.ViewMode, err = getAndParseViewMode(flags)
case "singleClick": case "singleClick":
defaults.SingleClick, err = flags.GetBool(flag.Name) defaults.SingleClick, err = flags.GetBool(flag.Name)
case "redirectAfterCopyMove":
defaults.RedirectAfterCopyMove, err = flags.GetBool(flag.Name)
case "aceEditorTheme": case "aceEditorTheme":
defaults.AceEditorTheme, err = flags.GetString(flag.Name) defaults.AceEditorTheme, err = flags.GetString(flag.Name)
case "perm.admin": case "perm.admin":

View File

@ -52,13 +52,14 @@ options you want to change.`,
} }
defaults := settings.UserDefaults{ defaults := settings.UserDefaults{
Scope: user.Scope, Scope: user.Scope,
Locale: user.Locale, Locale: user.Locale,
ViewMode: user.ViewMode, ViewMode: user.ViewMode,
SingleClick: user.SingleClick, SingleClick: user.SingleClick,
Perm: user.Perm, RedirectAfterCopyMove: user.RedirectAfterCopyMove,
Sorting: user.Sorting, Perm: user.Perm,
Commands: user.Commands, Sorting: user.Sorting,
Commands: user.Commands,
} }
err = getUserDefaults(flags, &defaults, false) err = getUserDefaults(flags, &defaults, false)
@ -70,6 +71,7 @@ options you want to change.`,
user.Locale = defaults.Locale user.Locale = defaults.Locale
user.ViewMode = defaults.ViewMode user.ViewMode = defaults.ViewMode
user.SingleClick = defaults.SingleClick user.SingleClick = defaults.SingleClick
user.RedirectAfterCopyMove = defaults.RedirectAfterCopyMove
user.Perm = defaults.Perm user.Perm = defaults.Perm
user.Commands = defaults.Commands user.Commands = defaults.Commands
user.Sorting = defaults.Sorting user.Sorting = defaults.Sorting

View File

@ -6,22 +6,23 @@ import (
) )
var ( var (
ErrEmptyKey = errors.New("empty key") ErrEmptyKey = errors.New("empty key")
ErrExist = errors.New("the resource already exists") ErrExist = errors.New("the resource already exists")
ErrNotExist = errors.New("the resource does not exist") ErrNotExist = errors.New("the resource does not exist")
ErrEmptyPassword = errors.New("password is empty") ErrEmptyPassword = errors.New("password is empty")
ErrEasyPassword = errors.New("password is too easy") ErrEasyPassword = errors.New("password is too easy")
ErrEmptyUsername = errors.New("username is empty") ErrEmptyUsername = errors.New("username is empty")
ErrEmptyRequest = errors.New("empty request") ErrEmptyRequest = errors.New("empty request")
ErrScopeIsRelative = errors.New("scope is a relative path") ErrScopeIsRelative = errors.New("scope is a relative path")
ErrInvalidDataType = errors.New("invalid data type") ErrInvalidDataType = errors.New("invalid data type")
ErrIsDirectory = errors.New("file is directory") ErrIsDirectory = errors.New("file is directory")
ErrInvalidOption = errors.New("invalid option") ErrInvalidOption = errors.New("invalid option")
ErrInvalidAuthMethod = errors.New("invalid auth method") ErrInvalidAuthMethod = errors.New("invalid auth method")
ErrPermissionDenied = errors.New("permission denied") ErrPermissionDenied = errors.New("permission denied")
ErrInvalidRequestParams = errors.New("invalid request params") ErrInvalidRequestParams = errors.New("invalid request params")
ErrSourceIsParent = errors.New("source is parent") ErrSourceIsParent = errors.New("source is parent")
ErrRootUserDeletion = errors.New("user with id 1 can't be deleted") ErrRootUserDeletion = errors.New("user with id 1 can't be deleted")
ErrCurrentPasswordIncorrect = errors.New("the current password is incorrect")
) )
type ErrShortPassword struct { type ErrShortPassword struct {

View File

@ -71,5 +71,5 @@
"vite-plugin-compression2": "^2.3.1", "vite-plugin-compression2": "^2.3.1",
"vue-tsc": "^3.1.3" "vue-tsc": "^3.1.3"
}, },
"packageManager": "pnpm@10.26.2+sha512.0e308ff2005fc7410366f154f625f6631ab2b16b1d2e70238444dd6ae9d630a8482d92a451144debc492416896ed16f7b114a86ec68b8404b2443869e68ffda6" "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48"
} }

462
frontend/pnpm-lock.yaml generated
View File

@ -82,7 +82,7 @@ importers:
version: 4.5.5(@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3)))(@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)))(focus-trap@7.6.2)(vue@3.5.26(typescript@5.9.3)) version: 4.5.5(@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3)))(@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)))(focus-trap@7.6.2)(vue@3.5.26(typescript@5.9.3))
vue-i18n: vue-i18n:
specifier: ^11.1.10 specifier: ^11.1.10
version: 11.2.7(vue@3.5.26(typescript@5.9.3)) version: 11.2.8(vue@3.5.26(typescript@5.9.3))
vue-lazyload: vue-lazyload:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.0.0 version: 3.0.0
@ -98,7 +98,7 @@ importers:
devDependencies: devDependencies:
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: ^11.0.1 specifier: ^11.0.1
version: 11.0.3(@vue/compiler-dom@3.5.26)(eslint@9.39.2)(rollup@4.54.0)(typescript@5.9.3)(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) 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': '@tsconfig/node24':
specifier: ^24.0.2 specifier: ^24.0.2
version: 24.0.3 version: 24.0.3
@ -107,16 +107,16 @@ importers:
version: 4.17.12 version: 4.17.12
'@types/node': '@types/node':
specifier: ^24.10.1 specifier: ^24.10.1
version: 24.10.4 version: 24.10.6
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.37.0 specifier: ^8.37.0
version: 8.50.1(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) 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)
'@vitejs/plugin-legacy': '@vitejs/plugin-legacy':
specifier: ^7.2.1 specifier: ^7.2.1
version: 7.2.1(terser@5.44.1)(vite@7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.2)) 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))
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.0.3(vite@7.3.0(@types/node@24.10.4)(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.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))
'@vue/eslint-config-prettier': '@vue/eslint-config-prettier':
specifier: ^10.2.0 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.7.4)
@ -155,13 +155,13 @@ importers:
version: 5.9.3 version: 5.9.3
vite: vite:
specifier: ^7.2.2 specifier: ^7.2.2
version: 7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.2) version: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2)
vite-plugin-compression2: vite-plugin-compression2:
specifier: ^2.3.1 specifier: ^2.3.1
version: 2.4.0(rollup@4.54.0) version: 2.4.0(rollup@4.55.1)
vue-tsc: vue-tsc:
specifier: ^3.1.3 specifier: ^3.1.3
version: 3.2.1(typescript@5.9.3) version: 3.2.2(typescript@5.9.3)
packages: packages:
@ -983,6 +983,12 @@ packages:
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/regexpp@4.12.2': '@eslint-community/regexpp@4.12.2':
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@ -1043,20 +1049,20 @@ packages:
vue-i18n: vue-i18n:
optional: true optional: true
'@intlify/core-base@11.2.7': '@intlify/core-base@11.2.8':
resolution: {integrity: sha512-+Ra9I/LAzXDnmv/IrTO03WMCiLya7pHRmGJvNl9fKwx/W4REJ0xaMk2PxCRqnxcBsX443amEMdebQ3R1geiuIw==} resolution: {integrity: sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/message-compiler@11.2.7': '@intlify/message-compiler@11.2.8':
resolution: {integrity: sha512-TFamC+GzJAotAFwUNvbtRVBgvuSn2nCwKNresmPUHv3IIVMmXJt7QQJj/DORI1h8hs46ZF6L0Fs2xBohSOE4iQ==} resolution: {integrity: sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/shared@11.2.2': '@intlify/shared@11.2.2':
resolution: {integrity: sha512-OtCmyFpSXxNu/oET/aN6HtPCbZ01btXVd0f3w00YsHOb13Kverk1jzA2k47pAekM55qbUw421fvPF1yxZ+gicw==} resolution: {integrity: sha512-OtCmyFpSXxNu/oET/aN6HtPCbZ01btXVd0f3w00YsHOb13Kverk1jzA2k47pAekM55qbUw421fvPF1yxZ+gicw==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/shared@11.2.7': '@intlify/shared@11.2.8':
resolution: {integrity: sha512-uvlkvc/0uQ4FDlHQZccpUnmcOwNcaI3i+69ck2YJ+GqM35AoVbuS63b+YfirV4G0SZh64Ij2UMcFRMmB4nr95w==} resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/unplugin-vue-i18n@11.0.3': '@intlify/unplugin-vue-i18n@11.0.3':
@ -1137,113 +1143,128 @@ packages:
rollup: rollup:
optional: true optional: true
'@rollup/rollup-android-arm-eabi@4.54.0': '@rollup/rollup-android-arm-eabi@4.55.1':
resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@rollup/rollup-android-arm64@4.54.0': '@rollup/rollup-android-arm64@4.55.1':
resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@rollup/rollup-darwin-arm64@4.54.0': '@rollup/rollup-darwin-arm64@4.55.1':
resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@rollup/rollup-darwin-x64@4.54.0': '@rollup/rollup-darwin-x64@4.55.1':
resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@rollup/rollup-freebsd-arm64@4.54.0': '@rollup/rollup-freebsd-arm64@4.55.1':
resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-freebsd-x64@4.54.0': '@rollup/rollup-freebsd-x64@4.55.1':
resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.54.0': '@rollup/rollup-linux-arm-gnueabihf@4.55.1':
resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.54.0': '@rollup/rollup-linux-arm-musleabihf@4.55.1':
resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.54.0': '@rollup/rollup-linux-arm64-gnu@4.55.1':
resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-musl@4.54.0': '@rollup/rollup-linux-arm64-musl@4.55.1':
resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-loong64-gnu@4.54.0': '@rollup/rollup-linux-loong64-gnu@4.55.1':
resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.54.0': '@rollup/rollup-linux-loong64-musl@4.55.1':
resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.55.1':
resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.54.0': '@rollup/rollup-linux-ppc64-musl@4.55.1':
resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.55.1':
resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.54.0': '@rollup/rollup-linux-riscv64-musl@4.55.1':
resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.54.0': '@rollup/rollup-linux-s390x-gnu@4.55.1':
resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-gnu@4.54.0': '@rollup/rollup-linux-x64-gnu@4.55.1':
resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-musl@4.54.0': '@rollup/rollup-linux-x64-musl@4.55.1':
resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-openharmony-arm64@4.54.0': '@rollup/rollup-openbsd-x64@4.55.1':
resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==}
cpu: [x64]
os: [openbsd]
'@rollup/rollup-openharmony-arm64@4.55.1':
resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==}
cpu: [arm64] cpu: [arm64]
os: [openharmony] os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.54.0': '@rollup/rollup-win32-arm64-msvc@4.55.1':
resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.54.0': '@rollup/rollup-win32-ia32-msvc@4.55.1':
resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@rollup/rollup-win32-x64-gnu@4.54.0': '@rollup/rollup-win32-x64-gnu@4.55.1':
resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@rollup/rollup-win32-x64-msvc@4.54.0': '@rollup/rollup-win32-x64-msvc@4.55.1':
resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -1266,8 +1287,8 @@ packages:
'@types/lodash@4.17.13': '@types/lodash@4.17.13':
resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
'@types/node@24.10.4': '@types/node@24.10.6':
resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} resolution: {integrity: sha512-B8h60xgJMR/xmgyX9fncRzEW9gCxoJjdenUhke2v1JGOd/V66KopmWrLPXi5oUI4VuiGK+d+HlXJjDRZMj21EQ==}
'@types/trusted-types@2.0.7': '@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@ -1283,11 +1304,11 @@ packages:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/eslint-plugin@8.50.1': '@typescript-eslint/eslint-plugin@8.52.0':
resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.50.1 '@typescript-eslint/parser': ^8.52.0
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
@ -1310,8 +1331,8 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.50.1': '@typescript-eslint/project-service@8.52.0':
resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
@ -1324,8 +1345,8 @@ packages:
resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.50.1': '@typescript-eslint/scope-manager@8.52.0':
resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.37.0': '@typescript-eslint/tsconfig-utils@8.37.0':
@ -1340,8 +1361,8 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/tsconfig-utils@8.50.1': '@typescript-eslint/tsconfig-utils@8.52.0':
resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
@ -1353,8 +1374,8 @@ packages:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/type-utils@8.50.1': '@typescript-eslint/type-utils@8.52.0':
resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@ -1368,8 +1389,8 @@ packages:
resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.50.1': '@typescript-eslint/types@8.52.0':
resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.37.0': '@typescript-eslint/typescript-estree@8.37.0':
@ -1384,8 +1405,8 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/typescript-estree@8.50.1': '@typescript-eslint/typescript-estree@8.52.0':
resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
@ -1397,8 +1418,8 @@ packages:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/utils@8.50.1': '@typescript-eslint/utils@8.52.0':
resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@ -1412,8 +1433,8 @@ packages:
resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.50.1': '@typescript-eslint/visitor-keys@8.52.0':
resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@videojs/http-streaming@3.17.2': '@videojs/http-streaming@3.17.2':
@ -1493,8 +1514,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@vue/language-core@3.2.1': '@vue/language-core@3.2.2':
resolution: {integrity: sha512-g6oSenpnGMtpxHGAwKuu7HJJkNZpemK/zg3vZzZbJ6cnnXq1ssxuNrXSsAHYM3NvH8p4IkTw+NLmuxyeYz4r8A==} resolution: {integrity: sha512-5DAuhxsxBN9kbriklh3Q5AMaJhyOCNiQJvCskN9/30XOpdLiqZU9Q+WvjArP17ubdGEyZtBzlIeG5nIjEbNOrQ==}
'@vue/reactivity@3.5.26': '@vue/reactivity@3.5.26':
resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==}
@ -2415,8 +2436,8 @@ packages:
rfdc@1.4.1: rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
rollup@4.54.0: rollup@4.55.1:
resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
@ -2490,8 +2511,8 @@ packages:
systemjs@6.15.1: systemjs@6.15.1:
resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
tabbable@6.3.0: tabbable@6.4.0:
resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
tar-mini@0.2.0: tar-mini@0.2.0:
resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==}
@ -2509,8 +2530,8 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
ts-api-utils@2.3.0: ts-api-utils@2.4.0:
resolution: {integrity: sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==} resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
engines: {node: '>=18.12'} engines: {node: '>=18.12'}
peerDependencies: peerDependencies:
typescript: '>=4.8.4' typescript: '>=4.8.4'
@ -2612,8 +2633,8 @@ packages:
vite-plugin-compression2@2.4.0: vite-plugin-compression2@2.4.0:
resolution: {integrity: sha512-8J4CBF1+dM1I06azba/eXJuJHinLF0Am7lUvRH8AZpu0otJoBaDEnxrIEr5iPZJSwH0AEglJGYCveh7pN52jCg==} resolution: {integrity: sha512-8J4CBF1+dM1I06azba/eXJuJHinLF0Am7lUvRH8AZpu0otJoBaDEnxrIEr5iPZJSwH0AEglJGYCveh7pN52jCg==}
vite@7.3.0: vite@7.3.1:
resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -2669,8 +2690,8 @@ packages:
focus-trap: '>=7.2.0' focus-trap: '>=7.2.0'
vue: '>=3.2.0' vue: '>=3.2.0'
vue-i18n@11.2.7: vue-i18n@11.2.8:
resolution: {integrity: sha512-LPv8bAY5OA0UvFEXl4vBQOBqJzRrlExy92tWgRuwW7tbykHf7CH71G2Y4TM2OwGcIS4+hyqKHS2EVBqaYwPY9Q==} resolution: {integrity: sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
@ -2691,8 +2712,8 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.0.2 vue: ^3.0.2
vue-tsc@3.2.1: vue-tsc@3.2.2:
resolution: {integrity: sha512-I23Rk8dkQfmcSbxDO0dmg9ioMLjKA1pjlU3Lz6Jfk2pMGu3Uryu9810XkcZH24IzPbhzPCnkKo2rEMRX0skSrw==} resolution: {integrity: sha512-r9YSia/VgGwmbbfC06hDdAatH634XJ9nVl6Zrnz1iK4ucp8Wu78kawplXnIDa3MSu1XdQQePTHLXYwPDWn+nyQ==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: '>=5.0.0' typescript: '>=5.0.0'
@ -3558,6 +3579,11 @@ snapshots:
eslint: 9.39.2 eslint: 9.39.2
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)':
dependencies:
eslint: 9.39.2
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {} '@eslint-community/regexpp@4.12.2': {}
'@eslint/config-array@0.21.1': '@eslint/config-array@0.21.1':
@ -3610,9 +3636,9 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {} '@humanwhocodes/retry@0.4.3': {}
'@intlify/bundle-utils@11.0.3(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)))': '@intlify/bundle-utils@11.0.3(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))':
dependencies: dependencies:
'@intlify/message-compiler': 11.2.7 '@intlify/message-compiler': 11.2.8
'@intlify/shared': 11.2.2 '@intlify/shared': 11.2.2
acorn: 8.15.0 acorn: 8.15.0
esbuild: 0.25.12 esbuild: 0.25.12
@ -3622,29 +3648,29 @@ snapshots:
source-map-js: 1.2.1 source-map-js: 1.2.1
yaml-eslint-parser: 1.3.2 yaml-eslint-parser: 1.3.2
optionalDependencies: optionalDependencies:
vue-i18n: 11.2.7(vue@3.5.26(typescript@5.9.3)) vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3))
'@intlify/core-base@11.2.7': '@intlify/core-base@11.2.8':
dependencies: dependencies:
'@intlify/message-compiler': 11.2.7 '@intlify/message-compiler': 11.2.8
'@intlify/shared': 11.2.7 '@intlify/shared': 11.2.8
'@intlify/message-compiler@11.2.7': '@intlify/message-compiler@11.2.8':
dependencies: dependencies:
'@intlify/shared': 11.2.7 '@intlify/shared': 11.2.8
source-map-js: 1.2.1 source-map-js: 1.2.1
'@intlify/shared@11.2.2': {} '@intlify/shared@11.2.2': {}
'@intlify/shared@11.2.7': {} '@intlify/shared@11.2.8': {}
'@intlify/unplugin-vue-i18n@11.0.3(@vue/compiler-dom@3.5.26)(eslint@9.39.2)(rollup@4.54.0)(typescript@5.9.3)(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3))': '@intlify/unplugin-vue-i18n@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))':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
'@intlify/bundle-utils': 11.0.3(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3))) '@intlify/bundle-utils': 11.0.3(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))
'@intlify/shared': 11.2.2 '@intlify/shared': 11.2.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3))
'@rollup/pluginutils': 5.3.0(rollup@4.54.0) '@rollup/pluginutils': 5.3.0(rollup@4.55.1)
'@typescript-eslint/scope-manager': 8.49.0 '@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
debug: 4.4.3 debug: 4.4.3
@ -3654,7 +3680,7 @@ snapshots:
unplugin: 2.3.11 unplugin: 2.3.11
vue: 3.5.26(typescript@5.9.3) vue: 3.5.26(typescript@5.9.3)
optionalDependencies: optionalDependencies:
vue-i18n: 11.2.7(vue@3.5.26(typescript@5.9.3)) vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3))
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/compiler-dom' - '@vue/compiler-dom'
- eslint - eslint
@ -3662,14 +3688,14 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3))': '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3))':
dependencies: dependencies:
'@babel/parser': 7.28.5 '@babel/parser': 7.28.5
optionalDependencies: optionalDependencies:
'@intlify/shared': 11.2.2 '@intlify/shared': 11.2.2
'@vue/compiler-dom': 3.5.26 '@vue/compiler-dom': 3.5.26
vue: 3.5.26(typescript@5.9.3) vue: 3.5.26(typescript@5.9.3)
vue-i18n: 11.2.7(vue@3.5.26(typescript@5.9.3)) vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3))
'@jridgewell/gen-mapping@0.3.13': '@jridgewell/gen-mapping@0.3.13':
dependencies: dependencies:
@ -3711,78 +3737,87 @@ snapshots:
'@rolldown/pluginutils@1.0.0-beta.53': {} '@rolldown/pluginutils@1.0.0-beta.53': {}
'@rollup/pluginutils@5.3.0(rollup@4.54.0)': '@rollup/pluginutils@5.3.0(rollup@4.55.1)':
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 4.0.3 picomatch: 4.0.3
optionalDependencies: optionalDependencies:
rollup: 4.54.0 rollup: 4.55.1
'@rollup/rollup-android-arm-eabi@4.54.0': '@rollup/rollup-android-arm-eabi@4.55.1':
optional: true optional: true
'@rollup/rollup-android-arm64@4.54.0': '@rollup/rollup-android-arm64@4.55.1':
optional: true optional: true
'@rollup/rollup-darwin-arm64@4.54.0': '@rollup/rollup-darwin-arm64@4.55.1':
optional: true optional: true
'@rollup/rollup-darwin-x64@4.54.0': '@rollup/rollup-darwin-x64@4.55.1':
optional: true optional: true
'@rollup/rollup-freebsd-arm64@4.54.0': '@rollup/rollup-freebsd-arm64@4.55.1':
optional: true optional: true
'@rollup/rollup-freebsd-x64@4.54.0': '@rollup/rollup-freebsd-x64@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.54.0': '@rollup/rollup-linux-arm-gnueabihf@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-arm-musleabihf@4.54.0': '@rollup/rollup-linux-arm-musleabihf@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-arm64-gnu@4.54.0': '@rollup/rollup-linux-arm64-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-arm64-musl@4.54.0': '@rollup/rollup-linux-arm64-musl@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-loong64-gnu@4.54.0': '@rollup/rollup-linux-loong64-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-ppc64-gnu@4.54.0': '@rollup/rollup-linux-loong64-musl@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-riscv64-gnu@4.54.0': '@rollup/rollup-linux-ppc64-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-riscv64-musl@4.54.0': '@rollup/rollup-linux-ppc64-musl@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-s390x-gnu@4.54.0': '@rollup/rollup-linux-riscv64-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-x64-gnu@4.54.0': '@rollup/rollup-linux-riscv64-musl@4.55.1':
optional: true optional: true
'@rollup/rollup-linux-x64-musl@4.54.0': '@rollup/rollup-linux-s390x-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-openharmony-arm64@4.54.0': '@rollup/rollup-linux-x64-gnu@4.55.1':
optional: true optional: true
'@rollup/rollup-win32-arm64-msvc@4.54.0': '@rollup/rollup-linux-x64-musl@4.55.1':
optional: true optional: true
'@rollup/rollup-win32-ia32-msvc@4.54.0': '@rollup/rollup-openbsd-x64@4.55.1':
optional: true optional: true
'@rollup/rollup-win32-x64-gnu@4.54.0': '@rollup/rollup-openharmony-arm64@4.55.1':
optional: true optional: true
'@rollup/rollup-win32-x64-msvc@4.54.0': '@rollup/rollup-win32-arm64-msvc@4.55.1':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.55.1':
optional: true
'@rollup/rollup-win32-x64-gnu@4.55.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.55.1':
optional: true optional: true
'@tsconfig/node24@24.0.3': {} '@tsconfig/node24@24.0.3': {}
@ -3801,7 +3836,7 @@ snapshots:
'@types/lodash@4.17.13': {} '@types/lodash@4.17.13': {}
'@types/node@24.10.4': '@types/node@24.10.6':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@ -3822,23 +3857,23 @@ snapshots:
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/eslint-plugin@8.50.1(@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.52.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.50.1 '@typescript-eslint/scope-manager': 8.52.0
'@typescript-eslint/type-utils': 8.50.1(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3)
'@typescript-eslint/utils': 8.50.1(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.50.1 '@typescript-eslint/visitor-keys': 8.52.0
eslint: 9.39.2 eslint: 9.39.2
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3873,10 +3908,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
debug: 4.4.3 debug: 4.4.3
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
@ -3892,10 +3927,10 @@ snapshots:
'@typescript-eslint/types': 8.49.0 '@typescript-eslint/types': 8.49.0
'@typescript-eslint/visitor-keys': 8.49.0 '@typescript-eslint/visitor-keys': 8.49.0
'@typescript-eslint/scope-manager@8.50.1': '@typescript-eslint/scope-manager@8.52.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
'@typescript-eslint/visitor-keys': 8.50.1 '@typescript-eslint/visitor-keys': 8.52.0
'@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)': '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)':
dependencies: dependencies:
@ -3905,7 +3940,7 @@ snapshots:
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
'@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)':
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
@ -3916,19 +3951,19 @@ snapshots:
'@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3)
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.2 eslint: 9.39.2
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/type-utils@8.50.1(eslint@9.39.2)(typescript@5.9.3)': '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
'@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.50.1(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3)
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.2 eslint: 9.39.2
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3937,7 +3972,7 @@ snapshots:
'@typescript-eslint/types@8.49.0': {} '@typescript-eslint/types@8.49.0': {}
'@typescript-eslint/types@8.50.1': {} '@typescript-eslint/types@8.52.0': {}
'@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)': '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)':
dependencies: dependencies:
@ -3950,7 +3985,7 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3965,22 +4000,22 @@ snapshots:
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3)
'@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
'@typescript-eslint/visitor-keys': 8.50.1 '@typescript-eslint/visitor-keys': 8.52.0
debug: 4.4.3 debug: 4.4.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
ts-api-utils: 2.3.0(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3996,12 +4031,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.50.1(eslint@9.39.2)(typescript@5.9.3)': '@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies: 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.50.1 '@typescript-eslint/scope-manager': 8.52.0
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
'@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
eslint: 9.39.2 eslint: 9.39.2
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
@ -4017,9 +4052,9 @@ snapshots:
'@typescript-eslint/types': 8.49.0 '@typescript-eslint/types': 8.49.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
'@typescript-eslint/visitor-keys@8.50.1': '@typescript-eslint/visitor-keys@8.52.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.50.1 '@typescript-eslint/types': 8.52.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
'@videojs/http-streaming@3.17.2(video.js@8.23.4)': '@videojs/http-streaming@3.17.2(video.js@8.23.4)':
@ -4044,7 +4079,7 @@ snapshots:
global: 4.4.0 global: 4.4.0
is-function: 1.0.2 is-function: 1.0.2
'@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.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))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5)
@ -4059,14 +4094,14 @@ snapshots:
regenerator-runtime: 0.14.1 regenerator-runtime: 0.14.1
systemjs: 6.15.1 systemjs: 6.15.1
terser: 5.44.1 terser: 5.44.1
vite: 7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.2) vite: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitejs/plugin-vue@6.0.3(vite@7.3.0(@types/node@24.10.4)(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.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))':
dependencies: dependencies:
'@rolldown/pluginutils': 1.0.0-beta.53 '@rolldown/pluginutils': 1.0.0-beta.53
vite: 7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.2) 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) vue: 3.5.26(typescript@5.9.3)
'@volar/language-core@2.4.27': '@volar/language-core@2.4.27':
@ -4153,7 +4188,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vue/language-core@3.2.1': '@vue/language-core@3.2.2':
dependencies: dependencies:
'@volar/language-core': 2.4.27 '@volar/language-core': 2.4.27
'@vue/compiler-dom': 3.5.26 '@vue/compiler-dom': 3.5.26
@ -4670,7 +4705,7 @@ snapshots:
focus-trap@7.6.2: focus-trap@7.6.2:
dependencies: dependencies:
tabbable: 6.3.0 tabbable: 6.4.0
fraction.js@5.3.4: {} fraction.js@5.3.4: {}
@ -5057,32 +5092,35 @@ snapshots:
rfdc@1.4.1: {} rfdc@1.4.1: {}
rollup@4.54.0: rollup@4.55.1:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
optionalDependencies: optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.54.0 '@rollup/rollup-android-arm-eabi': 4.55.1
'@rollup/rollup-android-arm64': 4.54.0 '@rollup/rollup-android-arm64': 4.55.1
'@rollup/rollup-darwin-arm64': 4.54.0 '@rollup/rollup-darwin-arm64': 4.55.1
'@rollup/rollup-darwin-x64': 4.54.0 '@rollup/rollup-darwin-x64': 4.55.1
'@rollup/rollup-freebsd-arm64': 4.54.0 '@rollup/rollup-freebsd-arm64': 4.55.1
'@rollup/rollup-freebsd-x64': 4.54.0 '@rollup/rollup-freebsd-x64': 4.55.1
'@rollup/rollup-linux-arm-gnueabihf': 4.54.0 '@rollup/rollup-linux-arm-gnueabihf': 4.55.1
'@rollup/rollup-linux-arm-musleabihf': 4.54.0 '@rollup/rollup-linux-arm-musleabihf': 4.55.1
'@rollup/rollup-linux-arm64-gnu': 4.54.0 '@rollup/rollup-linux-arm64-gnu': 4.55.1
'@rollup/rollup-linux-arm64-musl': 4.54.0 '@rollup/rollup-linux-arm64-musl': 4.55.1
'@rollup/rollup-linux-loong64-gnu': 4.54.0 '@rollup/rollup-linux-loong64-gnu': 4.55.1
'@rollup/rollup-linux-ppc64-gnu': 4.54.0 '@rollup/rollup-linux-loong64-musl': 4.55.1
'@rollup/rollup-linux-riscv64-gnu': 4.54.0 '@rollup/rollup-linux-ppc64-gnu': 4.55.1
'@rollup/rollup-linux-riscv64-musl': 4.54.0 '@rollup/rollup-linux-ppc64-musl': 4.55.1
'@rollup/rollup-linux-s390x-gnu': 4.54.0 '@rollup/rollup-linux-riscv64-gnu': 4.55.1
'@rollup/rollup-linux-x64-gnu': 4.54.0 '@rollup/rollup-linux-riscv64-musl': 4.55.1
'@rollup/rollup-linux-x64-musl': 4.54.0 '@rollup/rollup-linux-s390x-gnu': 4.55.1
'@rollup/rollup-openharmony-arm64': 4.54.0 '@rollup/rollup-linux-x64-gnu': 4.55.1
'@rollup/rollup-win32-arm64-msvc': 4.54.0 '@rollup/rollup-linux-x64-musl': 4.55.1
'@rollup/rollup-win32-ia32-msvc': 4.54.0 '@rollup/rollup-openbsd-x64': 4.55.1
'@rollup/rollup-win32-x64-gnu': 4.54.0 '@rollup/rollup-openharmony-arm64': 4.55.1
'@rollup/rollup-win32-x64-msvc': 4.54.0 '@rollup/rollup-win32-arm64-msvc': 4.55.1
'@rollup/rollup-win32-ia32-msvc': 4.55.1
'@rollup/rollup-win32-x64-gnu': 4.55.1
'@rollup/rollup-win32-x64-msvc': 4.55.1
fsevents: 2.3.3 fsevents: 2.3.3
run-parallel@1.2.0: run-parallel@1.2.0:
@ -5138,7 +5176,7 @@ snapshots:
systemjs@6.15.1: {} systemjs@6.15.1: {}
tabbable@6.3.0: {} tabbable@6.4.0: {}
tar-mini@0.2.0: {} tar-mini@0.2.0: {}
@ -5158,7 +5196,7 @@ snapshots:
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
ts-api-utils@2.3.0(typescript@5.9.3): ts-api-utils@2.4.0(typescript@5.9.3):
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
@ -5271,23 +5309,23 @@ snapshots:
dependencies: dependencies:
global: 4.4.0 global: 4.4.0
vite-plugin-compression2@2.4.0(rollup@4.54.0): vite-plugin-compression2@2.4.0(rollup@4.55.1):
dependencies: dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.54.0) '@rollup/pluginutils': 5.3.0(rollup@4.55.1)
tar-mini: 0.2.0 tar-mini: 0.2.0
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
vite@7.3.0(@types/node@24.10.4)(terser@5.44.1)(yaml@2.8.2): vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2):
dependencies: dependencies:
esbuild: 0.27.2 esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
postcss: 8.5.6 postcss: 8.5.6
rollup: 4.54.0 rollup: 4.55.1
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 24.10.4 '@types/node': 24.10.6
fsevents: 2.3.3 fsevents: 2.3.3
terser: 5.44.1 terser: 5.44.1
yaml: 2.8.2 yaml: 2.8.2
@ -5313,10 +5351,10 @@ snapshots:
focus-trap: 7.6.2 focus-trap: 7.6.2
vue: 3.5.26(typescript@5.9.3) vue: 3.5.26(typescript@5.9.3)
vue-i18n@11.2.7(vue@3.5.26(typescript@5.9.3)): vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)):
dependencies: dependencies:
'@intlify/core-base': 11.2.7 '@intlify/core-base': 11.2.8
'@intlify/shared': 11.2.7 '@intlify/shared': 11.2.8
'@vue/devtools-api': 6.6.4 '@vue/devtools-api': 6.6.4
vue: 3.5.26(typescript@5.9.3) vue: 3.5.26(typescript@5.9.3)
@ -5335,10 +5373,10 @@ snapshots:
dependencies: dependencies:
vue: 3.5.26(typescript@5.9.3) vue: 3.5.26(typescript@5.9.3)
vue-tsc@3.2.1(typescript@5.9.3): vue-tsc@3.2.2(typescript@5.9.3):
dependencies: dependencies:
'@volar/typescript': 2.4.27 '@volar/typescript': 2.4.27
'@vue/language-core': 3.2.1 '@vue/language-core': 3.2.2
typescript: 5.9.3 typescript: 5.9.3
vue@3.5.26(typescript@5.9.3): vue@3.5.26(typescript@5.9.3):

View File

@ -41,12 +41,12 @@ export function download(
let url = `${baseURL}/api/public/dl/${hash}`; let url = `${baseURL}/api/public/dl/${hash}`;
if (files.length === 1) { if (files.length === 1) {
url += encodeURIComponent(files[0]) + "?"; url += files[0] + "?";
} else { } else {
let arg = ""; let arg = "";
for (const file of files) { for (const file of files) {
arg += encodeURIComponent(file) + ","; arg += file + ",";
} }
arg = arg.substring(0, arg.length - 1); arg = arg.substring(0, arg.length - 1);

View File

@ -8,12 +8,13 @@ export async function get(id: number) {
return fetchJSON<IUser>(`/api/users/${id}`, {}); return fetchJSON<IUser>(`/api/users/${id}`, {});
} }
export async function create(user: IUser) { export async function create(user: IUser, currentPassword: string) {
const res = await fetchURL(`/api/users`, { const res = await fetchURL(`/api/users`, {
method: "POST", method: "POST",
body: JSON.stringify({ body: JSON.stringify({
what: "user", what: "user",
which: [], which: [],
current_password: currentPassword,
data: user, data: user,
}), }),
}); });
@ -25,12 +26,17 @@ export async function create(user: IUser) {
throw new StatusError(await res.text(), res.status); throw new StatusError(await res.text(), res.status);
} }
export async function update(user: Partial<IUser>, which = ["all"]) { export async function update(
user: Partial<IUser>,
which = ["all"],
currentPassword: string | null = null
) {
await fetchURL(`/api/users/${user.id}`, { await fetchURL(`/api/users/${user.id}`, {
method: "PUT", method: "PUT",
body: JSON.stringify({ body: JSON.stringify({
what: "user", what: "user",
which: which, which: which,
...(currentPassword != null ? { current_password: currentPassword } : {}),
data: user, data: user,
}), }),
}); });

View File

@ -109,7 +109,8 @@ export default {
return; return;
} }
this.$router.push({ path: this.dest }); if (this.user.redirectAfterCopyMove)
this.$router.push({ path: this.dest });
}) })
.catch((e) => { .catch((e) => {
buttons.done("copy"); buttons.done("copy");

View File

@ -79,7 +79,7 @@ export default {
computed: { computed: {
...mapState(useFileStore, ["req", "selected"]), ...mapState(useFileStore, ["req", "selected"]),
...mapState(useAuthStore, ["user"]), ...mapState(useAuthStore, ["user"]),
...mapWritableState(useFileStore, ["preselect"]), ...mapWritableState(useFileStore, ["reload", "preselect"]),
excludedFolders() { excludedFolders() {
return this.selected return this.selected
.filter((idx) => this.req.items[idx].isDir) .filter((idx) => this.req.items[idx].isDir)
@ -108,7 +108,9 @@ export default {
.then(() => { .then(() => {
buttons.success("move"); buttons.success("move");
this.preselect = removePrefix(items[0].to); 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) => { .catch((e) => {
buttons.done("move"); buttons.done("move");

View File

@ -24,7 +24,7 @@
"ok": "موافق", "ok": "موافق",
"permalink": "الحصول على رابط دائم", "permalink": "الحصول على رابط دائم",
"previous": "السابق", "previous": "السابق",
"preview": "Preview", "preview": "معاينة",
"publish": "نشر", "publish": "نشر",
"rename": "إعادة تسمية", "rename": "إعادة تسمية",
"replace": "استبدال", "replace": "استبدال",
@ -43,11 +43,11 @@
"upload": "رفع", "upload": "رفع",
"openFile": "فتح الملف", "openFile": "فتح الملف",
"discardChanges": "إلغاء التغييرات", "discardChanges": "إلغاء التغييرات",
"stopSearch": "Stop searching", "stopSearch": "توقف عن البحث",
"saveChanges": "Save changes", "saveChanges": "حفظ التغييرات",
"editAsText": "Edit as Text", "editAsText": "تعديل على شكل نص",
"increaseFontSize": "Increase font size", "increaseFontSize": "زيادة حجم الخط",
"decreaseFontSize": "Decrease font size" "decreaseFontSize": "تصغير حجم الخط"
}, },
"download": { "download": {
"downloadFile": "تحميل الملف", "downloadFile": "تحميل الملف",
@ -80,7 +80,7 @@
"sortByName": "الترتيب باﻹسم", "sortByName": "الترتيب باﻹسم",
"sortBySize": "الترتيب بالحجم", "sortBySize": "الترتيب بالحجم",
"noPreview": "لا يوجد عرض مسبق لهذا الملف.", "noPreview": "لا يوجد عرض مسبق لهذا الملف.",
"csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", "csvTooLarge": "حجم الملف اكبر من (<5MB), يرجى تحميل الملف للمعاينة",
"csvLoadFailed": "Failed to load CSV file.", "csvLoadFailed": "Failed to load CSV file.",
"showingRows": "Showing {count} row(s)", "showingRows": "Showing {count} row(s)",
"columnSeparator": "Column Separator", "columnSeparator": "Column Separator",
@ -138,7 +138,7 @@
"filesSelected": "تم تحديد {count} ملفات.", "filesSelected": "تم تحديد {count} ملفات.",
"lastModified": "آخر تعديل", "lastModified": "آخر تعديل",
"move": "نقل", "move": "نقل",
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:", "moveMessage": "اختر منزلاً جديداً لملفك (ملفاتك)/مجلدك (مجلداتك):",
"newArchetype": "إنشاء منشور من المنشور اﻷصلي. الملف سيتم انشاءه في مجلد المحتويات.", "newArchetype": "إنشاء منشور من المنشور اﻷصلي. الملف سيتم انشاءه في مجلد المحتويات.",
"newDir": "مجلد جديد", "newDir": "مجلد جديد",
"newDirMessage": "أدخل اسم المجلد الجديد.", "newDirMessage": "أدخل اسم المجلد الجديد.",
@ -189,15 +189,15 @@
"commandRunner": "منفذ اﻷوامر", "commandRunner": "منفذ اﻷوامر",
"commandRunnerHelp": "هنا بإمكانك تعيين اﻷوامر التي سيتم تنفيذها في اﻷحداث المسماة. يجب كتابة أمر واحد في كل سطر. ستكون المتغيرات البيئية (env) {0} و {1} متاحة، حيث {0} نسبي لـ {1}. لمزيد من المعلومات حول هذه الميزة و المتغيرات البيئية المتاحة، يرجى قراءة {2}.", "commandRunnerHelp": "هنا بإمكانك تعيين اﻷوامر التي سيتم تنفيذها في اﻷحداث المسماة. يجب كتابة أمر واحد في كل سطر. ستكون المتغيرات البيئية (env) {0} و {1} متاحة، حيث {0} نسبي لـ {1}. لمزيد من المعلومات حول هذه الميزة و المتغيرات البيئية المتاحة، يرجى قراءة {2}.",
"commandsUpdated": "تم تحديث اﻷوامر", "commandsUpdated": "تم تحديث اﻷوامر",
"createUserDir": "إنشاء مجلد المستخدم (home) تلقائياً عند إنشاء مستخدم جديد", "createUserDir": "إنشاء مجلد المستخدم الرئيسي تلقائياً عند إنشاء مستخدم جديد",
"minimumPasswordLength": "Minimum password length", "minimumPasswordLength": "Minimum password length",
"tusUploads": "التحميلات المتقطعة", "tusUploads": "التحميلات المتقطعة",
"tusUploadsHelp": "يدعم متصفح الملفات تحميل الملفات المتقطعة، مما يسمح بتحميلات الملفات بشكل فعال و موثوق و قابلة للمتابغة و متقطعة حتى على الشبكات غير الموثوقة.", "tusUploadsHelp": "يدعم متصفح الملفات تحميل الملفات المتقطعة، مما يسمح بتحميلات الملفات بشكل فعال و موثوق و قابلة للمتابغة و متقطعة حتى على الشبكات غير الموثوقة.",
"tusUploadsChunkSize": "يشير إلى الحد اﻷقصى لحجم الطلب (سيتم استخدام التحميل المباشر للتحميلات صغيرة الخحم). يمكنك إدخال عدد صحيح عادي يدل على الحجم بوحدة البايت أو نمظ مثل10MB, 1GB, إلخ.", "tusUploadsChunkSize": "يشير إلى الحد اﻷقصى لحجم الطلب (سيتم استخدام التحميل المباشر للتحميلات صغيرة الخحم). يمكنك إدخال عدد صحيح عادي يدل على الحجم بوحدة البايت أو نمظ مثل10MB, 1GB, إلخ.",
"tusUploadsRetryCount": "عدد مرات إعادة المحاولة إذا فشلت عملية تحميل القطعة.", "tusUploadsRetryCount": "عدد مرات إعادة المحاولة إذا فشلت عملية تحميل القطعة.",
"userHomeBasePath": "المسار الرئيسي لمجلد المستخدم (home)", "userHomeBasePath": "المسار الرئيسي لمجلد المستخدم الرئيسي",
"userScopeGenerationPlaceholder": "سيتم تعيين نطاق المستخدم تلقائياً", "userScopeGenerationPlaceholder": "سيتم تعيين نطاق المستخدم تلقائياً",
"createUserHomeDirectory": "إنشاء مجلد المستخدم (home)", "createUserHomeDirectory": "إنشاء مجلد المستخدم الرئيسي",
"customStylesheet": "ستايل مخصص", "customStylesheet": "ستايل مخصص",
"defaultUserDescription": "هذه اﻹعدادات اﻹفتراضية للمستخدمين الجدد.", "defaultUserDescription": "هذه اﻹعدادات اﻹفتراضية للمستخدمين الجدد.",
"disableExternalLinks": "تعطيل الروابط الخارجية (بإسثناء الوثائق)", "disableExternalLinks": "تعطيل الروابط الخارجية (بإسثناء الوثائق)",
@ -258,7 +258,8 @@
"userManagement": "إدارة المستخدمين", "userManagement": "إدارة المستخدمين",
"userUpdated": "تم تعديل المستخدم", "userUpdated": "تم تعديل المستخدم",
"username": "إسم المستخدم", "username": "إسم المستخدم",
"users": "المستخدمين" "users": "المستخدمين",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "مساعدة", "help": "مساعدة",

View File

@ -258,7 +258,8 @@
"userManagement": "Управление на потребители", "userManagement": "Управление на потребители",
"userUpdated": "Потребителя е обновен!", "userUpdated": "Потребителя е обновен!",
"username": "Потребителско име", "username": "Потребителско име",
"users": "Потребители" "users": "Потребители",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Помощ", "help": "Помощ",

View File

@ -258,7 +258,8 @@
"userManagement": "Administració d'usuaris", "userManagement": "Administració d'usuaris",
"userUpdated": "Usuari actualitzat!", "userUpdated": "Usuari actualitzat!",
"username": "Usuari", "username": "Usuari",
"users": "Usuaris" "users": "Usuaris",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Ajuda", "help": "Ajuda",

View File

@ -258,7 +258,8 @@
"userManagement": "Správa uživatelů", "userManagement": "Správa uživatelů",
"userUpdated": "Uživatel aktualizován!", "userUpdated": "Uživatel aktualizován!",
"username": "Uživatelské jméno", "username": "Uživatelské jméno",
"users": "Uživatelé" "users": "Uživatelé",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Nápověda", "help": "Nápověda",

View File

@ -43,11 +43,11 @@
"upload": "Upload", "upload": "Upload",
"openFile": "Datei öffnen", "openFile": "Datei öffnen",
"discardChanges": "Verwerfen", "discardChanges": "Verwerfen",
"stopSearch": "Stop searching", "stopSearch": "Suche abbrechen",
"saveChanges": "Änderungen speichern", "saveChanges": "Änderungen speichern",
"editAsText": "Als Text bearbeiten", "editAsText": "Als Text bearbeiten",
"increaseFontSize": "Increase font size", "increaseFontSize": "Schriftgröße vergrößern",
"decreaseFontSize": "Decrease font size" "decreaseFontSize": "Schriftgröße verkleinern"
}, },
"download": { "download": {
"downloadFile": "Download Datei", "downloadFile": "Download Datei",
@ -82,12 +82,12 @@
"noPreview": "Für diese Datei ist keine Vorschau verfügbar.", "noPreview": "Für diese Datei ist keine Vorschau verfügbar.",
"csvTooLarge": "Die CSV-Datei ist zu groß für die Vorschau (>5 MB). Bitte herunterladen, um sie anzuzeigen.", "csvTooLarge": "Die CSV-Datei ist zu groß für die Vorschau (>5 MB). Bitte herunterladen, um sie anzuzeigen.",
"csvLoadFailed": "Fehler beim Laden der CSV-Datei.", "csvLoadFailed": "Fehler beim Laden der CSV-Datei.",
"showingRows": "Showing {count} row(s)", "showingRows": "{count} Zeile(n) werden angezeigt",
"columnSeparator": "Column Separator", "columnSeparator": "Spaltentrennzeichen",
"csvSeparators": { "csvSeparators": {
"comma": "Comma (,)", "comma": "Komma (,)",
"semicolon": "Semicolon (;)", "semicolon": "Semikolon (;)",
"both": "Both (,) and (;)" "both": "Sowohl (,) als auch (;)"
} }
}, },
"help": { "help": {
@ -214,7 +214,7 @@
"instanceName": "Instanzname", "instanceName": "Instanzname",
"language": "Sprache", "language": "Sprache",
"lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert", "lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert",
"newPassword": "Ihr neues Passwort.", "newPassword": "Ihr neues Passwort",
"newPasswordConfirm": "Bestätigen Sie Ihr neues Passwort", "newPasswordConfirm": "Bestätigen Sie Ihr neues Passwort",
"newUser": "Neuer Benutzer", "newUser": "Neuer Benutzer",
"password": "Passwort", "password": "Passwort",
@ -258,7 +258,8 @@
"userManagement": "Benutzerverwaltung", "userManagement": "Benutzerverwaltung",
"userUpdated": "Benutzer aktualisiert!", "userUpdated": "Benutzer aktualisiert!",
"username": "Nutzername", "username": "Nutzername",
"users": "Nutzer" "users": "Nutzer",
"currentPassword": "Ihr aktuelles Passwort"
}, },
"sidebar": { "sidebar": {
"help": "Hilfe", "help": "Hilfe",

View File

@ -258,7 +258,8 @@
"userManagement": "Διαχείριση χρηστών", "userManagement": "Διαχείριση χρηστών",
"userUpdated": "Ο χρήστης ενημερώθηκε!", "userUpdated": "Ο χρήστης ενημερώθηκε!",
"username": "Όνομα χρήστη", "username": "Όνομα χρήστη",
"users": "Χρήστες" "users": "Χρήστες",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Βοήθεια", "help": "Βοήθεια",

View File

@ -232,6 +232,7 @@
"permissions": "Permissions", "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", "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", "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", "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.", "ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
"rules": "Rules", "rules": "Rules",
@ -258,7 +259,8 @@
"userManagement": "User Management", "userManagement": "User Management",
"userUpdated": "User updated!", "userUpdated": "User updated!",
"username": "Username", "username": "Username",
"users": "Users" "users": "Users",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Help", "help": "Help",

View File

@ -258,7 +258,8 @@
"userManagement": "Administración de usuarios", "userManagement": "Administración de usuarios",
"userUpdated": "¡Usuario actualizado!", "userUpdated": "¡Usuario actualizado!",
"username": "Usuario", "username": "Usuario",
"users": "Usuarios" "users": "Usuarios",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Ayuda", "help": "Ayuda",

View File

@ -258,7 +258,8 @@
"userManagement": "مدیریت کاربران", "userManagement": "مدیریت کاربران",
"userUpdated": "کاربر به روز شد!", "userUpdated": "کاربر به روز شد!",
"username": "نام کاربری", "username": "نام کاربری",
"users": "کاربران" "users": "کاربران",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "راهنما", "help": "راهنما",

View File

@ -43,11 +43,11 @@
"upload": "Importer", "upload": "Importer",
"openFile": "Ouvrir le fichier", "openFile": "Ouvrir le fichier",
"discardChanges": "Annuler", "discardChanges": "Annuler",
"stopSearch": "Stop searching", "stopSearch": "Arrêter recherche",
"saveChanges": "Save changes", "saveChanges": "Enregistrer changements",
"editAsText": "Edit as Text", "editAsText": "Editer comme Texte",
"increaseFontSize": "Increase font size", "increaseFontSize": "Augmenter taille police",
"decreaseFontSize": "Decrease font size" "decreaseFontSize": "Réduire taille police"
}, },
"download": { "download": {
"downloadFile": "Télécharger le fichier", "downloadFile": "Télécharger le fichier",
@ -80,14 +80,14 @@
"sortByName": "Trier par nom", "sortByName": "Trier par nom",
"sortBySize": "Trier par taille", "sortBySize": "Trier par taille",
"noPreview": "L'aperçu n'est pas disponible pour ce fichier.", "noPreview": "L'aperçu n'est pas disponible pour ce fichier.",
"csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", "csvTooLarge": "Le fichier CSV est trop volumineux pour être prévisualisé (>5MB). Veuillez le télécharger pour le voir.",
"csvLoadFailed": "Failed to load CSV file.", "csvLoadFailed": "Impossible de charger le fichier CSV.",
"showingRows": "Showing {count} row(s)", "showingRows": "Affichage de {count} ligne(s)",
"columnSeparator": "Column Separator", "columnSeparator": "Séparateur de Colonnes",
"csvSeparators": { "csvSeparators": {
"comma": "Comma (,)", "comma": "Virgule (,)",
"semicolon": "Semicolon (;)", "semicolon": "Point-virgule (;)",
"both": "Both (,) and (;)" "both": "Les (,) et (;)"
} }
}, },
"help": { "help": {
@ -115,9 +115,9 @@
"username": "Utilisateur·ice", "username": "Utilisateur·ice",
"usernameTaken": "Le nom d'utilisateur·ice est déjà pris", "usernameTaken": "Le nom d'utilisateur·ice est déjà pris",
"wrongCredentials": "Identifiants incorrects !", "wrongCredentials": "Identifiants incorrects !",
"passwordTooShort": "Password must be at least {min} characters", "passwordTooShort": "Le mot de passe doit contenir au moins {min} caractères",
"logout_reasons": { "logout_reasons": {
"inactivity": "You have been logged out due to inactivity." "inactivity": "Vous avez été déconnecté(e) en raison d'une inactivité prolongée."
} }
}, },
"permanent": "Permanent", "permanent": "Permanent",
@ -172,7 +172,7 @@
"video": "Vidéo" "video": "Vidéo"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme", "aceEditorTheme": "Éditeur de Thème Ace",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrateur·ice", "administrator": "Administrateur·ice",
"allowCommands": "Exécuter des commandes", "allowCommands": "Exécuter des commandes",
@ -180,7 +180,7 @@
"allowNew": "Créer de nouveaux fichiers et dossiers", "allowNew": "Créer de nouveaux fichiers et dossiers",
"allowPublish": "Publier de nouveaux posts et pages", "allowPublish": "Publier de nouveaux posts et pages",
"allowSignup": "Autoriser les utilisateur·ices à s'inscrire", "allowSignup": "Autoriser les utilisateur·ices à s'inscrire",
"hideLoginButton": "Hide the login button from public pages", "hideLoginButton": "Cacher le bouton didentification sur les pages publiques",
"avoidChanges": "(Laisser vide pour conserver l'actuel)", "avoidChanges": "(Laisser vide pour conserver l'actuel)",
"branding": "Image de marque", "branding": "Image de marque",
"brandingDirectoryPath": "Chemin du dossier d'image de marque", "brandingDirectoryPath": "Chemin du dossier d'image de marque",
@ -258,7 +258,8 @@
"userManagement": "Gestion des utilisateur·ices", "userManagement": "Gestion des utilisateur·ices",
"userUpdated": "Utilisateur·ice mis à jour !", "userUpdated": "Utilisateur·ice mis à jour !",
"username": "Nom d'utilisateur·ice", "username": "Nom d'utilisateur·ice",
"users": "Utilisateur·ices" "users": "Utilisateur·ices",
"currentPassword": "Mot de Passe Actuel"
}, },
"sidebar": { "sidebar": {
"help": "Aide", "help": "Aide",

View File

@ -258,7 +258,8 @@
"userManagement": "ניהול משתמש", "userManagement": "ניהול משתמש",
"userUpdated": "המשתמש עודכן!", "userUpdated": "המשתמש עודכן!",
"username": "שם משתמש", "username": "שם משתמש",
"users": "משתמשים" "users": "משתמשים",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "עזרה", "help": "עזרה",

View File

@ -258,7 +258,8 @@
"userManagement": "Upravljanje Korisnicima", "userManagement": "Upravljanje Korisnicima",
"userUpdated": "Korisnik ažuriran!", "userUpdated": "Korisnik ažuriran!",
"username": "Korisničko ime", "username": "Korisničko ime",
"users": "Korisnici" "users": "Korisnici",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Pomoć", "help": "Pomoć",

View File

@ -258,7 +258,8 @@
"userManagement": "Felhasználókezelés", "userManagement": "Felhasználókezelés",
"userUpdated": "Felhasználó frissítve!", "userUpdated": "Felhasználó frissítve!",
"username": "Felhasználói név", "username": "Felhasználói név",
"users": "Felhasználók" "users": "Felhasználók",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Súgó", "help": "Súgó",

View File

@ -258,7 +258,8 @@
"userManagement": "Notendastýring", "userManagement": "Notendastýring",
"userUpdated": "Notandastillingar vistaðar!", "userUpdated": "Notandastillingar vistaðar!",
"username": "Notendanafn", "username": "Notendanafn",
"users": "Notendur" "users": "Notendur",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Hjálp", "help": "Hjálp",

View File

@ -258,7 +258,8 @@
"userManagement": "Gestione degli utenti", "userManagement": "Gestione degli utenti",
"userUpdated": "Utente aggiornato!", "userUpdated": "Utente aggiornato!",
"username": "Nome utente", "username": "Nome utente",
"users": "Utenti" "users": "Utenti",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Aiuto", "help": "Aiuto",

View File

@ -42,7 +42,6 @@
"update": "更新", "update": "更新",
"upload": "アップロード", "upload": "アップロード",
"openFile": "ファイルを開く", "openFile": "ファイルを開く",
"stopSearch": "検索を停止",
"discardChanges": "Discard", "discardChanges": "Discard",
"stopSearch": "Stop searching", "stopSearch": "Stop searching",
"saveChanges": "Save changes", "saveChanges": "Save changes",
@ -259,7 +258,8 @@
"userManagement": "ユーザー管理", "userManagement": "ユーザー管理",
"userUpdated": "ユーザーを更新しました!", "userUpdated": "ユーザーを更新しました!",
"username": "ユーザー名", "username": "ユーザー名",
"users": "ユーザー" "users": "ユーザー",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "ヘルプ", "help": "ヘルプ",

View File

@ -41,7 +41,6 @@
"toggleSidebar": "사이드바 전환", "toggleSidebar": "사이드바 전환",
"update": "업데이트", "update": "업데이트",
"upload": "업로드", "upload": "업로드",
"stopSearch": "검색 중지",
"openFile": "파일 열기", "openFile": "파일 열기",
"discardChanges": "변경 사항 취소", "discardChanges": "변경 사항 취소",
"stopSearch": "Stop searching", "stopSearch": "Stop searching",
@ -259,7 +258,8 @@
"userManagement": "사용자 관리", "userManagement": "사용자 관리",
"userUpdated": "사용자 수정됨!", "userUpdated": "사용자 수정됨!",
"username": "사용자 이름", "username": "사용자 이름",
"users": "사용자" "users": "사용자",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "도움말", "help": "도움말",

View File

@ -258,7 +258,8 @@
"userManagement": "Lietotāju pārvaldība", "userManagement": "Lietotāju pārvaldība",
"userUpdated": "Lietotājs atjaunināts!", "userUpdated": "Lietotājs atjaunināts!",
"username": "Lietotājvārds", "username": "Lietotājvārds",
"users": "Lietotāji" "users": "Lietotāji",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Palīdzība", "help": "Palīdzība",

View File

@ -258,7 +258,8 @@
"userManagement": "Lietotāju pārvaldība", "userManagement": "Lietotāju pārvaldība",
"userUpdated": "Lietotājs atjaunināts!", "userUpdated": "Lietotājs atjaunināts!",
"username": "Lietotājvārds", "username": "Lietotājvārds",
"users": "Lietotāji" "users": "Lietotāji",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Palīdzība", "help": "Palīdzība",

View File

@ -258,7 +258,8 @@
"userManagement": "Gebruikersbeheer", "userManagement": "Gebruikersbeheer",
"userUpdated": "Gebruiker bijgewerkt!", "userUpdated": "Gebruiker bijgewerkt!",
"username": "Gebruikersnaam", "username": "Gebruikersnaam",
"users": "Gebruikers" "users": "Gebruikers",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Help", "help": "Help",

View File

@ -258,7 +258,8 @@
"userManagement": "Brukeradministrasjon", "userManagement": "Brukeradministrasjon",
"userUpdated": "Bruker opprettet!", "userUpdated": "Bruker opprettet!",
"username": "Brukernavn", "username": "Brukernavn",
"users": "Bruker" "users": "Bruker",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Hjelp", "help": "Hjelp",

View File

@ -258,7 +258,8 @@
"userManagement": "Zarządzanie użytkownikami", "userManagement": "Zarządzanie użytkownikami",
"userUpdated": "Użytkownik zapisany!", "userUpdated": "Użytkownik zapisany!",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"users": "Użytkownicy" "users": "Użytkownicy",
"currentPassword": "Twoje aktualne hasło"
}, },
"sidebar": { "sidebar": {
"help": "Pomoc", "help": "Pomoc",

View File

@ -258,7 +258,8 @@
"userManagement": "Gerenciamento de usuários", "userManagement": "Gerenciamento de usuários",
"userUpdated": "Usuário atualizado!", "userUpdated": "Usuário atualizado!",
"username": "Nome do usuário", "username": "Nome do usuário",
"users": "Usuários" "users": "Usuários",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Ajuda", "help": "Ajuda",

View File

@ -258,7 +258,8 @@
"userManagement": "Gestão de utilizadores", "userManagement": "Gestão de utilizadores",
"userUpdated": "Utilizador atualizado!", "userUpdated": "Utilizador atualizado!",
"username": "Nome de utilizador", "username": "Nome de utilizador",
"users": "Utilizadores" "users": "Utilizadores",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Ajuda", "help": "Ajuda",

View File

@ -258,7 +258,8 @@
"userManagement": "Gestionare utilizatori", "userManagement": "Gestionare utilizatori",
"userUpdated": "Utilizator actualizat!", "userUpdated": "Utilizator actualizat!",
"username": "Utilizator", "username": "Utilizator",
"users": "Utilizatori" "users": "Utilizatori",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Ajutor", "help": "Ajutor",

View File

@ -42,7 +42,6 @@
"update": "Обновить", "update": "Обновить",
"upload": "Загрузить", "upload": "Загрузить",
"openFile": "Открыть файл", "openFile": "Открыть файл",
"stopSearch": "Прекратить поиск",
"discardChanges": "Отказаться", "discardChanges": "Отказаться",
"stopSearch": "Stop searching", "stopSearch": "Stop searching",
"saveChanges": "Сохранить", "saveChanges": "Сохранить",
@ -259,7 +258,8 @@
"userManagement": "Управление пользователями", "userManagement": "Управление пользователями",
"userUpdated": "Пользователь изменен!", "userUpdated": "Пользователь изменен!",
"username": "Имя пользователя", "username": "Имя пользователя",
"users": "Пользователи" "users": "Пользователи",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Помощь", "help": "Помощь",

View File

@ -258,7 +258,8 @@
"userManagement": "Správa používateľov", "userManagement": "Správa používateľov",
"userUpdated": "Používateľ upravený!", "userUpdated": "Používateľ upravený!",
"username": "Meno používateľa", "username": "Meno používateľa",
"users": "Používatelia" "users": "Používatelia",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Pomoc", "help": "Pomoc",

View File

@ -258,7 +258,8 @@
"userManagement": "Användarehantering", "userManagement": "Användarehantering",
"userUpdated": "Användare uppdaterad!", "userUpdated": "Användare uppdaterad!",
"username": "Användarnamn", "username": "Användarnamn",
"users": "Användare" "users": "Användare",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Hjälp", "help": "Hjälp",

View File

@ -258,7 +258,8 @@
"userManagement": "Kullanıcı yönetimi", "userManagement": "Kullanıcı yönetimi",
"userUpdated": "Kullanıcı güncellendi!", "userUpdated": "Kullanıcı güncellendi!",
"username": "Kullanıcı adı", "username": "Kullanıcı adı",
"users": "Kullanıcılar" "users": "Kullanıcılar",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Yardım", "help": "Yardım",

View File

@ -258,7 +258,8 @@
"userManagement": "Керування користувачами", "userManagement": "Керування користувачами",
"userUpdated": "Користувача змінено!", "userUpdated": "Користувача змінено!",
"username": "Ім'я користувача", "username": "Ім'я користувача",
"users": "Користувачі" "users": "Користувачі",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Допомога", "help": "Допомога",

View File

@ -258,7 +258,8 @@
"userManagement": "Quản lý người dùng", "userManagement": "Quản lý người dùng",
"userUpdated": "Người dùng đã được cập nhật!", "userUpdated": "Người dùng đã được cập nhật!",
"username": "Tên người dùng", "username": "Tên người dùng",
"users": "Người dùng" "users": "Người dùng",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "Trợ giúp", "help": "Trợ giúp",

View File

@ -42,7 +42,6 @@
"update": "更新", "update": "更新",
"upload": "上传", "upload": "上传",
"openFile": "打开文件", "openFile": "打开文件",
"stopSearch": "停止搜索",
"discardChanges": "放弃更改", "discardChanges": "放弃更改",
"stopSearch": "Stop searching", "stopSearch": "Stop searching",
"saveChanges": "保存更改", "saveChanges": "保存更改",
@ -259,7 +258,8 @@
"userManagement": "用户管理", "userManagement": "用户管理",
"userUpdated": "用户已更新!", "userUpdated": "用户已更新!",
"username": "用户名", "username": "用户名",
"users": "用户" "users": "用户",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "帮助", "help": "帮助",

View File

@ -42,7 +42,6 @@
"update": "更新", "update": "更新",
"upload": "上傳", "upload": "上傳",
"openFile": "開啟檔案", "openFile": "開啟檔案",
"stopSearch": "停止搜尋",
"discardChanges": "放棄變更", "discardChanges": "放棄變更",
"stopSearch": "Stop searching", "stopSearch": "Stop searching",
"saveChanges": "Save changes", "saveChanges": "Save changes",
@ -259,7 +258,8 @@
"userManagement": "使用者管理", "userManagement": "使用者管理",
"userUpdated": "使用者已更新!", "userUpdated": "使用者已更新!",
"username": "使用者名稱", "username": "使用者名稱",
"users": "使用者" "users": "使用者",
"currentPassword": "Your Current Password"
}, },
"sidebar": { "sidebar": {
"help": "幫助", "help": "幫助",

View File

@ -5,6 +5,7 @@ interface ISettings {
minimumPasswordLength: number; minimumPasswordLength: number;
userHomeBasePath: string; userHomeBasePath: string;
defaults: SettingsDefaults; defaults: SettingsDefaults;
authMethod: string;
rules: any[]; rules: any[];
branding: SettingsBranding; branding: SettingsBranding;
tus: SettingsTus; tus: SettingsTus;
@ -17,6 +18,7 @@ interface SettingsDefaults {
locale: string; locale: string;
viewMode: ViewModeType; viewMode: ViewModeType;
singleClick: boolean; singleClick: boolean;
redirectAfterCopyMove: boolean;
sorting: Sorting; sorting: Sorting;
perm: Permissions; perm: Permissions;
commands: any[]; commands: any[];

View File

@ -10,6 +10,7 @@ interface IUser {
lockPassword: boolean; lockPassword: boolean;
hideDotfiles: boolean; hideDotfiles: boolean;
singleClick: boolean; singleClick: boolean;
redirectAfterCopyMove: boolean;
dateFormat: boolean; dateFormat: boolean;
viewMode: ViewModeType; viewMode: ViewModeType;
sorting?: Sorting; sorting?: Sorting;
@ -30,6 +31,7 @@ interface IUserForm {
lockPassword?: boolean; lockPassword?: boolean;
hideDotfiles?: boolean; hideDotfiles?: boolean;
singleClick?: boolean; singleClick?: boolean;
redirectAfterCopyMove?: boolean;
dateFormat?: boolean; dateFormat?: boolean;
} }

View File

@ -159,6 +159,7 @@
ref="listing" ref="listing"
class="file-icons" class="file-icons"
:class="authStore.user?.viewMode ?? ''" :class="authStore.user?.viewMode ?? ''"
@click="handleEmptyAreaClick"
> >
<div> <div>
<div class="item header"> <div class="item header">
@ -1051,4 +1052,18 @@ const showContextMenu = (event: MouseEvent) => {
const hideContextMenu = () => { const hideContextMenu = () => {
isContextMenuVisible.value = false; isContextMenuVisible.value = false;
}; };
const handleEmptyAreaClick = (e: MouseEvent) => {
const target = e.target;
if (!(target instanceof HTMLElement)) return;
if (target.closest("item") || target.closest(".item")) return;
fileStore.selected = [];
};
</script> </script>
<style scoped>
#listing {
min-height: calc(100vh - 8rem);
}
</style>

View File

@ -15,6 +15,14 @@
<input type="checkbox" name="singleClick" v-model="singleClick" /> <input type="checkbox" name="singleClick" v-model="singleClick" />
{{ t("settings.singleClick") }} {{ t("settings.singleClick") }}
</p> </p>
<p>
<input
type="checkbox"
name="redirectAfterCopyMove"
v-model="redirectAfterCopyMove"
/>
{{ t("settings.redirectAfterCopyMove") }}
</p>
<p> <p>
<input type="checkbox" name="dateFormat" v-model="dateFormat" /> <input type="checkbox" name="dateFormat" v-model="dateFormat" />
{{ t("settings.setDateFormat") }} {{ t("settings.setDateFormat") }}
@ -44,7 +52,7 @@
</form> </form>
</div> </div>
<div class="column"> <div v-if="!noAuth" class="column">
<form <form
class="card" class="card"
v-if="!authStore.user?.lockPassword" v-if="!authStore.user?.lockPassword"
@ -69,6 +77,15 @@
v-model="passwordConf" v-model="passwordConf"
name="passwordConf" name="passwordConf"
/> />
<input
v-if="isCurrentPasswordRequired"
:class="passwordClass"
type="password"
:placeholder="t('settings.currentPassword')"
v-model="currentPassword"
name="current_password"
autocomplete="current-password"
/>
</div> </div>
<div class="card-action"> <div class="card-action">
@ -92,6 +109,7 @@ import AceEditorTheme from "@/components/settings/AceEditorTheme.vue";
import Languages from "@/components/settings/Languages.vue"; import Languages from "@/components/settings/Languages.vue";
import { computed, inject, onMounted, ref } from "vue"; import { computed, inject, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import { authMethod, noAuth } from "@/utils/constants";
const layoutStore = useLayoutStore(); const layoutStore = useLayoutStore();
const authStore = useAuthStore(); const authStore = useAuthStore();
@ -102,8 +120,11 @@ const $showError = inject<IToastError>("$showError")!;
const password = ref<string>(""); const password = ref<string>("");
const passwordConf = ref<string>(""); const passwordConf = ref<string>("");
const currentPassword = ref<string>("");
const isCurrentPasswordRequired = ref<boolean>(false);
const hideDotfiles = ref<boolean>(false); const hideDotfiles = ref<boolean>(false);
const singleClick = ref<boolean>(false); const singleClick = ref<boolean>(false);
const redirectAfterCopyMove = ref<boolean>(false);
const dateFormat = ref<boolean>(false); const dateFormat = ref<boolean>(false);
const locale = ref<string>(""); const locale = ref<string>("");
const aceEditorTheme = ref<string>(""); const aceEditorTheme = ref<string>("");
@ -128,9 +149,12 @@ onMounted(async () => {
locale.value = authStore.user.locale; locale.value = authStore.user.locale;
hideDotfiles.value = authStore.user.hideDotfiles; hideDotfiles.value = authStore.user.hideDotfiles;
singleClick.value = authStore.user.singleClick; singleClick.value = authStore.user.singleClick;
redirectAfterCopyMove.value = authStore.user.redirectAfterCopyMove;
dateFormat.value = authStore.user.dateFormat; dateFormat.value = authStore.user.dateFormat;
aceEditorTheme.value = authStore.user.aceEditorTheme; aceEditorTheme.value = authStore.user.aceEditorTheme;
layoutStore.loading = false; layoutStore.loading = false;
isCurrentPasswordRequired.value = authMethod == "json";
return true; return true;
}); });
@ -140,6 +164,7 @@ const updatePassword = async (event: Event) => {
if ( if (
password.value !== passwordConf.value || password.value !== passwordConf.value ||
password.value === "" || password.value === "" ||
currentPassword.value === "" ||
authStore.user === null authStore.user === null
) { ) {
return; return;
@ -151,7 +176,7 @@ const updatePassword = async (event: Event) => {
id: authStore.user.id, id: authStore.user.id,
password: password.value, password: password.value,
}; };
await api.update(data, ["password"]); await api.update(data, ["password"], currentPassword.value);
authStore.updateUser(data); authStore.updateUser(data);
$showSuccess(t("settings.passwordUpdated")); $showSuccess(t("settings.passwordUpdated"));
} catch (e: any) { } catch (e: any) {
@ -172,6 +197,7 @@ const updateSettings = async (event: Event) => {
locale: locale.value, locale: locale.value,
hideDotfiles: hideDotfiles.value, hideDotfiles: hideDotfiles.value,
singleClick: singleClick.value, singleClick: singleClick.value,
redirectAfterCopyMove: redirectAfterCopyMove.value,
dateFormat: dateFormat.value, dateFormat: dateFormat.value,
aceEditorTheme: aceEditorTheme.value, aceEditorTheme: aceEditorTheme.value,
}; };
@ -180,6 +206,7 @@ const updateSettings = async (event: Event) => {
"locale", "locale",
"hideDotfiles", "hideDotfiles",
"singleClick", "singleClick",
"redirectAfterCopyMove",
"dateFormat", "dateFormat",
"aceEditorTheme", "aceEditorTheme",
]); ]);

View File

@ -15,6 +15,19 @@
:isDefault="false" :isDefault="false"
:isNew="isNew" :isNew="isNew"
/> />
<p v-if="isCurrentPasswordRequired">
<label for="currentPassword">{{
t("settings.currentPassword")
}}</label>
<input
class="input input--block"
type="password"
v-model="currentPassword"
id="currentPassword"
autocomplete="current-password"
/>
</p>
</div> </div>
<div class="card-action"> <div class="card-action">
@ -63,6 +76,8 @@ const error = ref<StatusError>();
const originalUser = ref<IUser>(); const originalUser = ref<IUser>();
const user = ref<IUser>(); const user = ref<IUser>();
const createUserDir = ref<boolean>(false); const createUserDir = ref<boolean>(false);
const currentPassword = ref<string>("");
const isCurrentPasswordRequired = ref<boolean>(false);
const $showError = inject<IToastError>("$showError")!; const $showError = inject<IToastError>("$showError")!;
const $showSuccess = inject<IToastSuccess>("$showSuccess")!; const $showSuccess = inject<IToastSuccess>("$showSuccess")!;
@ -90,7 +105,12 @@ const fetchData = async () => {
try { try {
if (isNew.value) { if (isNew.value) {
const { defaults, createUserDir: _createUserDir } = await settings.get(); const {
authMethod,
defaults,
createUserDir: _createUserDir,
} = await settings.get();
isCurrentPasswordRequired.value = authMethod == "json";
createUserDir.value = _createUserDir; createUserDir.value = _createUserDir;
user.value = { user.value = {
...defaults, ...defaults,
@ -101,6 +121,8 @@ const fetchData = async () => {
id: 0, id: 0,
}; };
} else { } else {
const { authMethod } = await settings.get();
isCurrentPasswordRequired.value = authMethod == "json";
const id = Array.isArray(route.params.id) const id = Array.isArray(route.params.id)
? route.params.id.join("") ? route.params.id.join("")
: route.params.id; : route.params.id;
@ -151,11 +173,11 @@ const save = async (event: Event) => {
...user.value, ...user.value,
}; };
const loc = await api.create(newUser); const loc = await api.create(newUser, currentPassword.value);
router.push({ path: loc || "/settings/users" }); router.push({ path: loc || "/settings/users" });
$showSuccess(t("settings.userCreated")); $showSuccess(t("settings.userCreated"));
} else { } else {
await api.update(user.value); await api.update(user.value, ["all"], currentPassword.value);
if (user.value.id === authStore.user?.id) { if (user.value.id === authStore.user?.id) {
authStore.updateUser(user.value); authStore.updateUser(user.value);

4
go.mod
View File

@ -17,7 +17,7 @@ require (
github.com/mholt/archives v0.1.5 github.com/mholt/archives v0.1.5
github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/go-homedir v1.1.0
github.com/samber/lo v1.52.0 github.com/samber/lo v1.52.0
github.com/shirou/gopsutil/v4 v4.25.11 github.com/shirou/gopsutil/v4 v4.25.12
github.com/spf13/afero v1.15.0 github.com/spf13/afero v1.15.0
github.com/spf13/cobra v1.10.2 github.com/spf13/cobra v1.10.2
github.com/spf13/pflag v1.0.10 github.com/spf13/pflag v1.0.10
@ -26,7 +26,7 @@ require (
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce
golang.org/x/crypto v0.46.0 golang.org/x/crypto v0.46.0
golang.org/x/image v0.34.0 golang.org/x/image v0.34.0
golang.org/x/text v0.32.0 golang.org/x/text v0.33.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )

8
go.sum
View File

@ -204,8 +204,8 @@ github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDc
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw=
github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
github.com/shirou/gopsutil/v4 v4.25.11 h1:X53gB7muL9Gnwwo2evPSE+SfOrltMoR6V3xJAXZILTY= github.com/shirou/gopsutil/v4 v4.25.12 h1:e7PvW/0RmJ8p8vPGJH4jvNkOyLmbkXgXW4m6ZPic6CY=
github.com/shirou/gopsutil/v4 v4.25.11/go.mod h1:EivAfP5x2EhLp2ovdpKSozecVXn1TmuG7SMzs/Wh4PU= github.com/shirou/gopsutil/v4 v4.25.12/go.mod h1:EivAfP5x2EhLp2ovdpKSozecVXn1TmuG7SMzs/Wh4PU=
github.com/sorairolake/lzip-go v0.3.8 h1:j5Q2313INdTA80ureWYRhX+1K78mUXfMoPZCw/ivWik= github.com/sorairolake/lzip-go v0.3.8 h1:j5Q2313INdTA80ureWYRhX+1K78mUXfMoPZCw/ivWik=
github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/54YPsw66qkU= github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/54YPsw66qkU=
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
@ -372,8 +372,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@ -23,17 +23,18 @@ const (
) )
type userInfo struct { type userInfo struct {
ID uint `json:"id"` ID uint `json:"id"`
Locale string `json:"locale"` Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"` ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"` RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"`
Commands []string `json:"commands"` Perm users.Permissions `json:"perm"`
LockPassword bool `json:"lockPassword"` Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"` LockPassword bool `json:"lockPassword"`
DateFormat bool `json:"dateFormat"` HideDotfiles bool `json:"hideDotfiles"`
Username string `json:"username"` DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"` Username string `json:"username"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
type authToken struct { 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) { func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) {
claims := &authToken{ claims := &authToken{
User: userInfo{ User: userInfo{
ID: user.ID, ID: user.ID,
Locale: user.Locale, Locale: user.Locale,
ViewMode: user.ViewMode, ViewMode: user.ViewMode,
SingleClick: user.SingleClick, SingleClick: user.SingleClick,
Perm: user.Perm, RedirectAfterCopyMove: user.RedirectAfterCopyMove,
LockPassword: user.LockPassword, Perm: user.Perm,
Commands: user.Commands, LockPassword: user.LockPassword,
HideDotfiles: user.HideDotfiles, Commands: user.Commands,
DateFormat: user.DateFormat, HideDotfiles: user.HideDotfiles,
Username: user.Username, DateFormat: user.DateFormat,
AceEditorTheme: user.AceEditorTheme, Username: user.Username,
AceEditorTheme: user.AceEditorTheme,
}, },
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()),

View File

@ -11,8 +11,9 @@ import (
) )
type modifyRequest struct { type modifyRequest struct {
What string `json:"what"` // Answer to: what data type? What string `json:"what"` // Answer to: what data type?
Which []string `json:"which"` // Answer to: which fields? Which []string `json:"which"` // Answer to: which fields?
CurrentPassword string `json:"current_password"` // Answer to: user logged password
} }
func NewHandler( func NewHandler(

View File

@ -280,6 +280,12 @@ func writeFile(afs afero.Fs, dst string, in io.Reader, fileMode, dirMode fs.File
return nil, err return nil, err
} }
// Sync the file to ensure all data is written to storage.
// to prevent file corruption.
if err := file.Sync(); err != nil {
return nil, err
}
// Gets the info about the file. // Gets the info about the file.
info, err := file.Stat() info, err := file.Stat()
if err != nil { if err != nil {

View File

@ -15,6 +15,7 @@ type settingsData struct {
MinimumPasswordLength uint `json:"minimumPasswordLength"` MinimumPasswordLength uint `json:"minimumPasswordLength"`
UserHomeBasePath string `json:"userHomeBasePath"` UserHomeBasePath string `json:"userHomeBasePath"`
Defaults settings.UserDefaults `json:"defaults"` Defaults settings.UserDefaults `json:"defaults"`
AuthMethod settings.AuthMethod `json:"authMethod"`
Rules []rules.Rule `json:"rules"` Rules []rules.Rule `json:"rules"`
Branding settings.Branding `json:"branding"` Branding settings.Branding `json:"branding"`
Tus settings.Tus `json:"tus"` Tus settings.Tus `json:"tus"`
@ -30,6 +31,7 @@ var settingsGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request,
MinimumPasswordLength: d.settings.MinimumPasswordLength, MinimumPasswordLength: d.settings.MinimumPasswordLength,
UserHomeBasePath: d.settings.UserHomeBasePath, UserHomeBasePath: d.settings.UserHomeBasePath,
Defaults: d.settings.Defaults, Defaults: d.settings.Defaults,
AuthMethod: d.settings.AuthMethod,
Rules: d.settings.Rules, Rules: d.settings.Rules,
Branding: d.settings.Branding, Branding: d.settings.Branding,
Tus: d.settings.Tus, Tus: d.settings.Tus,

View File

@ -256,6 +256,12 @@ func tusPatchHandler() handleFunc {
return http.StatusInternalServerError, fmt.Errorf("could not write to file: %w", err) return http.StatusInternalServerError, fmt.Errorf("could not write to file: %w", err)
} }
// Sync the file to ensure all data is written to storage
// to prevent file corruption.
if err := openFile.Sync(); err != nil {
return http.StatusInternalServerError, fmt.Errorf("could not sync file: %w", err)
}
newOffset := uploadOffset + bytesWritten newOffset := uploadOffset + bytesWritten
w.Header().Set("Upload-Offset", strconv.FormatInt(newOffset, 10)) w.Header().Set("Upload-Offset", strconv.FormatInt(newOffset, 10))

View File

@ -12,6 +12,7 @@ import (
"golang.org/x/text/cases" "golang.org/x/text/cases"
"golang.org/x/text/language" "golang.org/x/text/language"
"github.com/filebrowser/filebrowser/v2/auth"
fberrors "github.com/filebrowser/filebrowser/v2/errors" fberrors "github.com/filebrowser/filebrowser/v2/errors"
"github.com/filebrowser/filebrowser/v2/users" "github.com/filebrowser/filebrowser/v2/users"
) )
@ -117,6 +118,12 @@ var userPostHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d *
return http.StatusBadRequest, err return http.StatusBadRequest, err
} }
if d.settings.AuthMethod == auth.MethodJSONAuth {
if !users.CheckPwd(req.CurrentPassword, d.user.Password) {
return http.StatusBadRequest, fberrors.ErrCurrentPasswordIncorrect
}
}
if len(req.Which) != 0 { if len(req.Which) != 0 {
return http.StatusBadRequest, nil return http.StatusBadRequest, nil
} }
@ -153,6 +160,27 @@ var userPutHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request
return http.StatusBadRequest, err return http.StatusBadRequest, err
} }
if d.settings.AuthMethod == auth.MethodJSONAuth {
var sensibleFields = map[string]struct{}{
"all": {},
"username": {},
"password": {},
"scope": {},
"lockPassword": {},
"commands": {},
"perm": {},
}
for _, field := range req.Which {
if _, ok := sensibleFields[field]; ok {
if !users.CheckPwd(req.CurrentPassword, d.user.Password) {
return http.StatusBadRequest, fberrors.ErrCurrentPasswordIncorrect
}
break
}
}
}
if req.Data.ID != d.raw.(uint) { if req.Data.ID != d.raw.(uint) {
return http.StatusBadRequest, nil return http.StatusBadRequest, nil
} }

View File

@ -8,16 +8,17 @@ import (
// UserDefaults is a type that holds the default values // UserDefaults is a type that holds the default values
// for some fields on User. // for some fields on User.
type UserDefaults struct { type UserDefaults struct {
Scope string `json:"scope"` Scope string `json:"scope"`
Locale string `json:"locale"` Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"` ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"` RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"`
Perm users.Permissions `json:"perm"` Sorting files.Sorting `json:"sorting"`
Commands []string `json:"commands"` Perm users.Permissions `json:"perm"`
HideDotfiles bool `json:"hideDotfiles"` Commands []string `json:"commands"`
DateFormat bool `json:"dateFormat"` HideDotfiles bool `json:"hideDotfiles"`
AceEditorTheme string `json:"aceEditorTheme"` DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
// Apply applies the default options to a user. // Apply applies the default options to a user.
@ -26,6 +27,7 @@ func (d *UserDefaults) Apply(u *users.User) {
u.Locale = d.Locale u.Locale = d.Locale
u.ViewMode = d.ViewMode u.ViewMode = d.ViewMode
u.SingleClick = d.SingleClick u.SingleClick = d.SingleClick
u.RedirectAfterCopyMove = d.RedirectAfterCopyMove
u.Perm = d.Perm u.Perm = d.Perm
u.Sorting = d.Sorting u.Sorting = d.Sorting
u.Commands = d.Commands u.Commands = d.Commands

View File

@ -20,22 +20,23 @@ const (
// User describes a user. // User describes a user.
type User struct { type User struct {
ID uint `storm:"id,increment" json:"id"` ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"` Username string `storm:"unique" json:"username"`
Password string `json:"password"` Password string `json:"password"`
Scope string `json:"scope"` Scope string `json:"scope"`
Locale string `json:"locale"` Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"` LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"` ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"` RedirectAfterCopyMove bool `json:"redirectAfterCopyMove"`
Commands []string `json:"commands"` Perm Permissions `json:"perm"`
Sorting files.Sorting `json:"sorting"` Commands []string `json:"commands"`
Fs afero.Fs `json:"-" yaml:"-"` Sorting files.Sorting `json:"sorting"`
Rules []rules.Rule `json:"rules"` Fs afero.Fs `json:"-" yaml:"-"`
HideDotfiles bool `json:"hideDotfiles"` Rules []rules.Rule `json:"rules"`
DateFormat bool `json:"dateFormat"` HideDotfiles bool `json:"hideDotfiles"`
AceEditorTheme string `json:"aceEditorTheme"` DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
// GetRules implements rules.Provider. // GetRules implements rules.Provider.

View File

@ -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.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.key string ReCaptcha site key
--recaptcha.secret string ReCaptcha secret --recaptcha.secret string ReCaptcha secret
--redirectAfterCopyMove redirect to destination after copy/move
-r, --root string root to prepend to relative paths (default ".") -r, --root string root to prepend to relative paths (default ".")
--scope string scope for users (default ".") --scope string scope for users (default ".")
--shell string shell command to which other commands should be appended --shell string shell command to which other commands should be appended

View File

@ -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.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.key string ReCaptcha site key
--recaptcha.secret string ReCaptcha secret --recaptcha.secret string ReCaptcha secret
--redirectAfterCopyMove redirect to destination after copy/move
-r, --root string root to prepend to relative paths (default ".") -r, --root string root to prepend to relative paths (default ".")
--scope string scope for users (default ".") --scope string scope for users (default ".")
--shell string shell command to which other commands should be appended --shell string shell command to which other commands should be appended

View File

@ -28,6 +28,7 @@ filebrowser users add <username> <password> [flags]
--perm.modify modify perm for users (default true) --perm.modify modify perm for users (default true)
--perm.rename rename perm for users (default true) --perm.rename rename perm for users (default true)
--perm.share share 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 ".") --scope string scope for users (default ".")
--singleClick use single clicks only --singleClick use single clicks only
--sorting.asc sorting by ascending order --sorting.asc sorting by ascending order

View File

@ -30,6 +30,7 @@ filebrowser users update <id|username> [flags]
--perm.modify modify perm for users (default true) --perm.modify modify perm for users (default true)
--perm.rename rename perm for users (default true) --perm.rename rename perm for users (default true)
--perm.share share 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 ".") --scope string scope for users (default ".")
--singleClick use single clicks only --singleClick use single clicks only
--sorting.asc sorting by ascending order --sorting.asc sorting by ascending order