hfs 0.42.2 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +9 -12
  2. package/admin/assets/index-5cd667a5.js +511 -0
  3. package/admin/assets/index-8ff39373.css +1 -0
  4. package/{frontend/assets/sha512-bce9fb1c.js → admin/assets/sha512-55ff2fa3.js} +1 -1
  5. package/admin/index.html +2 -2
  6. package/frontend/assets/index-27488fde.js +94 -0
  7. package/frontend/assets/index-54a5c76f.css +1 -0
  8. package/{admin/assets/sha512-af87c1bd.js → frontend/assets/sha512-8ebf6e2a.js} +1 -1
  9. package/frontend/fontello.css +9 -3
  10. package/frontend/fontello.woff2 +0 -0
  11. package/frontend/index.html +2 -2
  12. package/package.json +2 -2
  13. package/plugins/antibrute/plugin.js +1 -1
  14. package/plugins/download-counter/plugin.js +10 -3
  15. package/plugins/download-counter/public/main.js +12 -2
  16. package/src/adminApis.js +3 -3
  17. package/src/api.accounts.js +2 -1
  18. package/src/api.file_list.js +15 -2
  19. package/src/api.lang.js +8 -11
  20. package/src/api.vfs.js +11 -5
  21. package/src/block.js +6 -20
  22. package/src/config.js +6 -2
  23. package/src/const.js +2 -2
  24. package/src/customHtml.js +1 -1
  25. package/src/frontEndApis.js +1 -26
  26. package/src/lang.js +77 -0
  27. package/src/langs/hfs-lang-it.json +100 -0
  28. package/src/langs/hfs-lang-ko.json +103 -0
  29. package/src/langs/hfs-lang-ru.json +106 -0
  30. package/src/langs/hfs-lang-sr.json +108 -0
  31. package/src/langs/hfs-lang-zh.json +98 -0
  32. package/src/listen.js +8 -3
  33. package/src/middlewares.js +10 -0
  34. package/src/misc.js +13 -9
  35. package/src/perm.js +1 -1
  36. package/src/serveFile.js +2 -2
  37. package/src/serveGuiFiles.js +21 -8
  38. package/src/upload.js +1 -1
  39. package/src/vfs.js +27 -33
  40. package/admin/assets/index-1db4299e.js +0 -511
  41. package/admin/assets/index-94bbe0be.css +0 -1
  42. package/frontend/assets/index-297a3f3d.js +0 -94
  43. package/frontend/assets/index-a09cacfd.css +0 -1
@@ -0,0 +1,100 @@
1
+ {
2
+ "author": "Massimo Melina",
3
+ "version": 1.5,
4
+ "hfs_version": "0.43.0",
5
+ "translate": {
6
+ "Select": "Seleziona",
7
+ "n_files": "{n} file",
8
+ "n_folders": "{n,plural, one{# cartella} other{# cartelle}}",
9
+ "filter_count": "{n,plural, one{# filtrato} other{# filtrati}}",
10
+ "select_count": "{n,plural, one{# selezionato} other{# selezionati}}",
11
+ "filter_placeholder": "Digita qui per filtrare la lista dei file",
12
+ "Select some files": "Solo alcuni file",
13
+ "zip_checkboxes": "Spunta le caselle per selezionare i file desiderati, e poi clicca di nuovo su Zip",
14
+ "zip_tooltip_selected": "Scarica gli elementi selezionati come singolo file zip",
15
+ "zip_tooltip_whole": "Scarica intera lista (non considera il filtro) come singolo file zip. Se selezioni alcuni elementi, solo quelli saranno inclusi.",
16
+ "zip_confirm_search": "Scarica TUTTI i risultati di questa ricerca come file zip?",
17
+ "zip_confirm_folder": "Scarica l'INTERA artella come file zip?",
18
+ "select_tooltip": "Selezionare serve con la funziona Zip e per cancellare (dove disponibile), ma puoi anche filtrare la lista",
19
+ "delete_hint": "Per poter cancellare bisogna prima cliccare Seleziona",
20
+ "delete_confirm": "Cancellare {n,plural, one{l'elemento} =8 =11 {gli # elementi} other{i # elementi}}?",
21
+ "delete_completed": "Cancellazione: {n} riusciti",
22
+ "delete_failed": ", {n,plural, one{# fallito} other{# falliti}}",
23
+ "delete_select": "Seleziona qualcosa per poter cancellare",
24
+ "Delete": "Cancella",
25
+ "Options": "Opzioni",
26
+ "Search": "Cerca",
27
+ "search_msg": "Cerca in questa cartella e cartelle sottostanti",
28
+ "Searching": "Cercando",
29
+ "Searched": "Risultati ricerca",
30
+ "Clear search": "Annulla ricerca",
31
+ "Interrupted": "interrotto",
32
+ "stopped_before": "Ricerca interrotta prima di trovare risultati",
33
+ "empty_list": "Non c'è niente qui",
34
+ "filter_none": "Nessun elemento corrisponde al filtro impostato",
35
+ "Login": "Entra",
36
+ "Username": "Nome utente",
37
+ "Continue": "Avanti",
38
+ "login_untrusted": "Login interrotto: server non affidabile",
39
+ "login_bad_credentials": "Nome utente o password non validi",
40
+ "login_bad_cookies": "Login interrotto: non funzionano i cookies",
41
+ "User panel": "Pannello utente",
42
+ "Change password": "Cambia password",
43
+ "enter_pass": "Inserisci nuova password",
44
+ "enter_pass2": "Ripeti la stessa password",
45
+ "pass2_mismatch": "Hai scritto 2 volte la password ma non sono uguali.",
46
+ "password_changed": "La password è stata cambiata",
47
+ "Logout": "Esci",
48
+ "connection error": "errore di connessione",
49
+ "Full timestamp:": "Data e ora:",
50
+ "Search was interrupted": "Ricerca interrotta",
51
+ "Stop list": "Interrompi",
52
+ "upload_starting": "Ora dovrebbe iniziare il download",
53
+ "wrong_account": "L'account {u} non ha accesso a questa cartella, prova con un altro",
54
+ "no_upload_here": "Non hai il permesso di uplodare in questa cartella",
55
+ "Create folder": "Crea cartella",
56
+ "Pick files": "Scegli file",
57
+ "Pick folder": "Scegli una cartella",
58
+ "send_files": "Invia {n} file, {size}",
59
+ "Clear": "Azzera",
60
+ "failed_upload": "Upload fallito per {name}",
61
+ "confirm_resume": "Vuoi riprendere questo upload?",
62
+ "file too large": "file troppo grande",
63
+ "Enter folder name": "Inserisci nome cartella",
64
+ "Successfully created": "Creazione riuscita",
65
+ "enter_folder": "Accedi alla nuova cartella",
66
+ "folder_exists": "Questo nome esiste già",
67
+ "Sort by": "Ordinamento",
68
+ "name": "nome",
69
+ "extension": "estensione",
70
+ "size": "dimensioni",
71
+ "time": "data/ora",
72
+ "Invert order": "Inverti ordine",
73
+ "Folders first": "Prima le cartelle",
74
+ "Numeric names": "Rispetta numeri all'inizio",
75
+ "theme:": "tema:",
76
+ "auto": "automatico",
77
+ "light": "chiaro",
78
+ "dark": "scuro",
79
+ "parent folder": "cartella superiore",
80
+ "Confirm": "Conferma",
81
+ "Don't": "Annulla",
82
+ "Warning": "Attenzione",
83
+ "Error": "Errore",
84
+ "Unauthorized": "Non autorizzato",
85
+ "Forbidden": "Vietato",
86
+ "Not found": "Non trovato",
87
+ "Server error": "Errore del server",
88
+ "upload_concluded": "Upload concluso",
89
+ "upload_finished": "{n,plural, one{# riuscito} other{# riusciti}} ({size})",
90
+ "upload_errors": "{n,plural, one{# fallito} other{# falliti}}",
91
+ "upload_file_rejected": "Alcuni file non sono stati accettati",
92
+ "download counter": "download conteggiati",
93
+ "File menu": "Menu file",
94
+ "Folder menu": "Menu cartella",
95
+ "Name": "Nome",
96
+ "file_open": "Apri",
97
+ "Download": "Download",
98
+ "Missing permission": "Permesso mancante"
99
+ }
100
+ }
@@ -0,0 +1,103 @@
1
+ {
2
+ "author": "배서연",
3
+ "version": 1.0,
4
+ "hfs_version": "0.42.3",
5
+ "translate": {
6
+ "Select": "선택",
7
+ "n_files": "{n,plural,one{1개의 파일} =2 =3{파일 #개} other{#개 파일}}",
8
+ "n_folders": "{n,plural,one{1 폴더} =2 =3 =4 {#개의 폴더} other{#개 폴더}",
9
+ "filter_count": "{n}개 통과",
10
+ "select_count": "{n}선정",
11
+ "filter_placeholder": "아래 목록을 필터링하려면 여기에 입력하세요.",
12
+ "Select some files": "파일선택",
13
+ "zip_checkboxes": "파일을 선택한 후 압축하기를 클릭해 주세요.",
14
+ "zip_tooltip_selected": "선택한 요소를 하나의 ZIP 파일로 다운로드",
15
+ "zip_tooltip_whole": "전체 목록(필터링되지 않은)을 하나의 ZIP 파일로 다운로드합니다. 항목을 선택한 경우 선택한 항목만 다운로드됩니다.",
16
+ "zip_confirm_search": "이 검색 결과를 모두 ZIP 아카이브로 다운로드하시겠습니까?",
17
+ "zip_confirm_folder": "전체 폴더를 ZIP 아카이브로 다운로드하시겠습니까?",
18
+ "select_tooltip": "압축하기 및 삭제하기(사용 가능한 경우)에 선택이 적용됩니다. 목록을 필터링할 수도 있습니다.",
19
+ "delete_hint": "삭제하려면 먼저 항목을 선택하세요.",
20
+ "delete_confirm": "{n,plural, one{# item} other{# items}}개 항목을 삭제하시겠습니까?",
21
+ "delete_completed": "{n}개의 항목이 삭제되었습니다.",
22
+ "delete_failed": ", {n,plural, one{# failed} other{# failed}}",
23
+ "delete_select": "삭제할 항목을 선택하세요.",
24
+ "Delete": "삭제",
25
+ "Options": "옵션",
26
+ "Search": "검색",
27
+ "Zip": "Zip으로 압축",
28
+ "search_msg": "검색",
29
+ "Searching": "검색 중",
30
+ "Searched": "검색 완료",
31
+ "Clear search": "검색결과 지우기",
32
+ "Interrupted": "중단됨",
33
+ "stopped_before": "이미 중단된 작업입니다.",
34
+ "empty_list": "목록이 비어 있습니다.",
35
+ "filter_none": "필터 없음",
36
+ "Admin-panel": "관리자 패널",
37
+ "Login": "로그인",
38
+ "Username": "사용자명",
39
+ "Password": "비밀번호",
40
+ "login_untrusted": "로그인 중단: 서버를 신뢰할 수 없음",
41
+ "login_bad_credentials": "잘못된 자격 증명",
42
+ "login_bad_cookies": "쿠키 오류 - 로그인 실패",
43
+ "User panel": "사용자 패널",
44
+ "Change password": "비밀번호 변경",
45
+ "enter_pass": "새 비밀번호 입력",
46
+ "enter_pass2": "새 비밀번호 재입력",
47
+ "pass2_mismatch": "새 비밀번호가 일치하지 않습니다.",
48
+ "password_changed": "비밀번호가 변경되었습니다.",
49
+ "Logout": "로그아웃",
50
+ "connection error": "연결 오류",
51
+ "Full timestamp:": "전체 타임스탬프:",
52
+ "Search was interrupted": "검색이 중단되었습니다.",
53
+ "Stop list": "중지 목록",
54
+ "upload_starting": "요청이 처리 중입니다.",
55
+ "wrong_account": "계정 {u}은(는) 접근 권한이 없습니다. 다른 계정을 시도해보십시오.",
56
+ "Create folder": "폴더 생성",
57
+ "Pick files": "파일 선택",
58
+ "Pick folder": "폴더 선택",
59
+ "send_files": "{n,plural,one{# file} other{# files}}, {size} 보내기",
60
+ "Clear": "지우기",
61
+ "failed_upload": "{name} 업로드에 실패했습니다.",
62
+ "confirm_resume": "업로드를 재시도 하시겠습니까?",
63
+ "Enter folder name": "폴더 이름 입력",
64
+ "Successfully created": "성공적으로 생성되었습니다.",
65
+ "enter_folder": "폴더 입력",
66
+ "folder_exists": "동일한 이름의 폴더가 이미 존재합니다.",
67
+ "Sort by": "정렬 기준",
68
+ "name": "이름",
69
+ "extension": "확장자",
70
+ "size": "크기",
71
+ "time": "시간",
72
+ "Invert order": "역순 정렬",
73
+ "Folders first": "폴더 우선 정렬",
74
+ "Numeric names": "숫자 우선 정렬",
75
+ "theme": "테마",
76
+ "auto": "자동",
77
+ "light": "밝은 테마",
78
+ "dark": "어두운 테마",
79
+ "parent folder": "상위 폴더",
80
+ "home": "홈",
81
+ "Continue": "계속하기",
82
+ "Confirm": "확인",
83
+ "Don't": "취소",
84
+ "Warning": "경고",
85
+ "Error": "오류",
86
+ "Info": "정보",
87
+ "Unauthorized": "허용되지 않음",
88
+ "Forbidden": "접근금지",
89
+ "Not found": "찾을 수 없음",
90
+ "Server error": "서버 오류",
91
+ "Upload": "업로드",
92
+ "upload_concluded": "업로드가 완료되었습니다.",
93
+ "upload_finished": "{n}개 파일 완료 ({size})",
94
+ "upload_errors": "{n}개 파일 실패",
95
+ "upload_file_rejected": "일부 파일은 업로드되지 않았습니다.",
96
+ "download counter": "다운로드 횟수",
97
+ "File menu": "파일 메뉴",
98
+ "Name": "이름",
99
+ "file_open": "열기",
100
+ "Download": "다운로드",
101
+ "Missing permission": "권한이 존재하지 않습니다."
102
+ }
103
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "author": "Mefistofell, SanokKule",
3
+ "version": 1.9,
4
+ "hfs_version": "0.43.0",
5
+ "translate": {
6
+ "Select": "Выбор",
7
+ "n_files": "{n,plural, one{1 файл} few{# файла} other{# файлов}}",
8
+ "n_folders": "{n,plural, one{1 папка} few {# папки} other{# папок}}",
9
+ "filter_count": "{n,plural, one{1 элемент} few{# элемента} other{# элементов}}",
10
+ "select_count": "{n,plural, one{Выбран #} other{Выбрано #}}",
11
+ "filter_placeholder": "Фильтр",
12
+ "Select some files": "Выберите файлы",
13
+ "zip_checkboxes": "Выделите нужные файлы и снова нажмите zip",
14
+ "zip_tooltip_selected": "Скачать выбранные элементы в zip-архиве",
15
+ "zip_tooltip_whole": "Выбрать файлы для скачивания в zip-архиве. Если файлы не выбраны, то будет скачана вся папка",
16
+ "zip_confirm_search": "Скачать все результаты поиска в одном zip-архиве",
17
+ "zip_confirm_folder": "Скачать всю папку как zip-архив?",
18
+ "select_tooltip": "Выбор необходимых файлов",
19
+ "delete_hint": "Для удаления файлов сначала нажмите Выбор",
20
+ "delete_confirm": "Удалить {n,plural, =1{элемент} one{# элемент} few {# элемента} many{# элементов} other{# элементов}}?",
21
+ "delete_completed": "{n,plural, one{Удалён} other{Удалено}} {n,plural, one{# элемент} few {# элемента} many{# элементов} other{# элементов}}",
22
+ "delete_failed": ", {n} не удалось",
23
+ "delete_select": "Выберите элементы для удаления",
24
+ "Delete": "Удалить",
25
+ "Options": "Настройки",
26
+ "Search": "Поиск",
27
+ "Zip": "Zip",
28
+ "search_msg": "Поиск в текущей и вложенных папках",
29
+ "Searching": "Поиск...",
30
+ "Searched": "Результаты поиска",
31
+ "Clear search": "Отменить поиск",
32
+ "Interrupted": "Прерван",
33
+ "stopped_before": "Поиск остановлен",
34
+ "empty_list": "Здесь ничего нет",
35
+ "filter_none": "Ни один элемент не соответствует фильтру",
36
+ "Admin-panel": "Панель администратора",
37
+ "Login": "Вход",
38
+ "Username": "Имя пользователя",
39
+ "Password": "Пароль",
40
+ "login_untrusted": "Вход в систему прерван",
41
+ "login_bad_credentials": "Неверное имя пользователя или пароль",
42
+ "login_bad_cookies": "Вход прерван. Отключены cookies",
43
+ "User panel": "Панель пользователя",
44
+ "Change password": "Изменить пароль",
45
+ "enter_pass": "Введите новый пароль",
46
+ "enter_pass2": "Повторите пароль",
47
+ "pass2_mismatch": "Введённые пароли не совпадают",
48
+ "password_changed": "Пароль успешно изменён",
49
+ "Logout": "Выйти",
50
+ "connection error": "Ошибка соединения",
51
+ "Full timestamp:": "Дата и время: ",
52
+ "Search was interrupted": "Поиск прерван",
53
+ "Stop list": "Остановить",
54
+ "upload_starting": "Загрузка началась",
55
+ "wrong_account": "Пользователь {u} не имеет доступа к этой папке",
56
+ "no_upload_here": "Нет доступа к загрузке файлов в эту папку",
57
+ "Create folder": "Создать папку",
58
+ "Pick files": "Выбрать файлы",
59
+ "Pick folder": "Выбрать папку",
60
+ "send_files": "Загрузить {n,plural, one{# файл} few{# файла} many{# файлов} other{# файла}}, {size}",
61
+ "Clear": "Очистить",
62
+ "failed_upload": "Не удалась загрузить {name}",
63
+ "confirm_resume": "Возобновить загрузку?",
64
+ "file too large": "Слишком большой файл",
65
+ "Enter folder name": "Введите имя папки",
66
+ "Successfully created": "Успешно создано",
67
+ "enter_folder": "Перейти в папку",
68
+ "folder_exists": "Папка уже существует",
69
+ "Sort by": "Сортировка",
70
+ "name": "Имя",
71
+ "extension": "Расширение",
72
+ "size": "Размер",
73
+ "time": "Время",
74
+ "Invert order": "Инвертировать",
75
+ "Folders first": "Сначала папки",
76
+ "Numeric names": "Сначала цифры",
77
+ "theme:": "Тема:",
78
+ "auto": "Авто",
79
+ "light": "Светлая",
80
+ "dark": "Тёмная",
81
+ "parent folder": "Родительская папка",
82
+ "home": "Домашняя папка",
83
+ "Continue": "Продолжить",
84
+ "Confirm": "Да",
85
+ "Don't": "Нет",
86
+ "Warning": "Внимание",
87
+ "Error": "Ошибка",
88
+ "Info": "Информация",
89
+ "Unauthorized": "Вход не выполнен",
90
+ "Forbidden": "Запрещено",
91
+ "Not found": "Не найдено",
92
+ "Server error": "Ошибка сервера",
93
+ "Upload": "Загрузить",
94
+ "upload_concluded": "Загрузка окончена:",
95
+ "upload_finished": "{n,plural, one{Загружен # файл} few{Загружено # файла} other{Загружено # файлов}} ({size})",
96
+ "upload_errors": "Не удалось загрузить {n,plural, one{# файл} few{# файла} other{# файлов}}",
97
+ "upload_file_rejected": "Некоторые файлы не были приняты",
98
+ "download counter": "Количество скачиваний",
99
+ "File menu": "Меню файла",
100
+ "Folder menu": "Меню папки",
101
+ "Name": "Имя",
102
+ "file_open": "Открыть",
103
+ "Download": "Скачать",
104
+ "Missing permission": "Отсутствует доступ"
105
+ }
106
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "author": "Горан",
3
+ "version": 1.6,
4
+ "hfs_version": "0.43.0",
5
+ "translate": {
6
+ "Select": "Изабери",
7
+ "n_files": "{n,plural, one {# документ} other{# документа}}",
8
+ "n_folders": "{n,plural, one {# фолдер} other{# фолдера}}",
9
+ "filter_count": "{n,plural, one{# ставка} other{# ставки}}",
10
+ "select_count": "{n,plural, one{# изабран} other{# изабранa}}",
11
+ "filter_placeholder": "Филтер",
12
+ "Select some files": "Изаберите неке документе",
13
+ "zip_checkboxes": "Изаберите жељене документе и поново притисните zip",
14
+ "zip_tooltip_selected": "Преузми изабране ставке у zip архиву",
15
+ "zip_tooltip_whole": "Изаберите датотеке за преузимање у zip архиви. Ако ниједан документ није изабран, цео директоријум ће бити преузет",
16
+ "zip_confirm_search": "Преузми све резултате претраге у једној зип архиви",
17
+ "zip_confirm_folder": "Сачувај цео директоријум у зип архиву?",
18
+ "select_tooltip": "Изаберите потребне датотеке",
19
+ "delete_hint": "Да бисте избрисали датотеке, прво притисните Изабери",
20
+ "delete_confirm": "Избриши {n,plural, one{1 елемент} =2 =3 =4 {# елеменaтa} other{# елементи}}?",
21
+ "delete_completed": "{n,plural,one{# елемент обрисан} other{# елемената обрисано}}",
22
+ "delete_failed": ", {n,plural,one{# неуспешно обрисан} other{# неуспешно обрисаних}}",
23
+ "delete_select": "Изабери ставке за брисање",
24
+ "Delete": "Избриши",
25
+ "Options": "Сортирање",
26
+ "Search": "Претрага",
27
+ "Zip": "Zip",
28
+ "search_msg": "Претражи тренутни фолдер и све подфолдере",
29
+ "Searching": "Претражујем...",
30
+ "Searched": "Резултати претраге",
31
+ "Clear search": "Откажи претрагу",
32
+ "Interrupted": "Прекинуто",
33
+ "stopped_before": "Претрага је заустављена",
34
+ "empty_list": "Празна листа",
35
+ "filter_none": "Ниједна ставка не одговара филтеру",
36
+ "Admin-panel": "Администратор-панел",
37
+ "Login": "Пријава",
38
+ "Username": "Корисничко име",
39
+ "Password": "Лозинка",
40
+ "Continue": "Настави",
41
+ "login_untrusted": "Пријава је прекинута",
42
+ "login_bad_credentials": "Неважеће корисничко име или лозинка",
43
+ "login_bad_cookies": "Пријава је прекинута. Колачићи су онемогућени",
44
+ "User panel": "Кориснички панел",
45
+ "Change password": "Промени лозинку",
46
+ "enter_pass": "Унесите нову лозинку",
47
+ "enter_pass2": "Поновите лозинку",
48
+ "pass2_mismatch": "Унете лозинке се не поклапају",
49
+ "password_changed": "Лозинка је успешно промењена",
50
+ "Logout": "Одјава",
51
+ "connection error": " Грешка везе ",
52
+ "Full timestamp:": "Датум и време: ",
53
+ "Search was interrupted": "Претрага је прекинута",
54
+ "Stop list": "Заустави",
55
+ "Upload": "Отпреми",
56
+ "upload_starting": "Отпремање је почело",
57
+ "wrong_account": "Корисник {u} нема приступ овом директоријуму",
58
+ "no_upload_here": "Немогуће отпремање овде",
59
+ "Create folder": "Креирај фолдер",
60
+ "Pick files": " Изаберите документ(а)",
61
+ "Pick folder": "Изаберите фолдер(е)",
62
+ "send_files": "Отпремите {n} документ(а), {size}",
63
+ "Clear": "Обриши",
64
+ "failed_upload": "Отпремање није успело {name}",
65
+ "confirm_resume": "Настави преузимање?",
66
+ "file too large": "Неважећа величина документа",
67
+ "Upload error": "Грешка при отпремању",
68
+ "Enter folder name": "Унесите назив фолдера",
69
+ "Successfully created": "Успешно креирано",
70
+ "enter_folder": "Иди у фолдер",
71
+ "folder_exists": "Фолдер већ постоји",
72
+ "finished": "учитано",
73
+ "Sort by": "Сортирај по",
74
+ "name": "Име",
75
+ "extension": " Екстензија",
76
+ "size": "Величина",
77
+ "time": "Време",
78
+ "Invert order": "Обрни редослед",
79
+ "Folders first": "Прво фолдери",
80
+ "Numeric names": "Прво бројеви",
81
+ "theme:": "Изглед:",
82
+ "auto": "Ауто",
83
+ "light": "Светло",
84
+ "dark": "Тамно",
85
+ "parent folder": "Надређени фолдер",
86
+ "home": "Почетна страна",
87
+ "Confirm": "Да",
88
+ "Don't": "Не",
89
+ "Warning": "Упозорење",
90
+ "Error": "Грешка",
91
+ "Info": "Информација",
92
+ "Unauthorized": "Пријава није успела",
93
+ "Forbidden": "Забрањено",
94
+ "Not found": "Није пронађено",
95
+ "Server error": " Сервер Грешка",
96
+ "upload_concluded": "Отпремање завршено:",
97
+ "upload_finished": "{n} пребачен(о) ({size})",
98
+ "upload_errors": "{n} неуспешно пребачен(их)",
99
+ "upload_file_rejected": "Нека документа нису прихваћена",
100
+ "download counter": "бројач преузимања",
101
+ "File menu": "Мени документа",
102
+ "Folder menu": "Мени фолдера",
103
+ "Name": "Име",
104
+ "file_open": "Отвори",
105
+ "Download": "Преузми",
106
+ "Missing permission": "Додељене дозволе онемогућавају преузимање докумената, фолдера"
107
+ }
108
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "author": "yx3016",
3
+ "version": 1.1,
4
+ "hfs_version": "0.40.1",
5
+ "translate": {
6
+ "Select": "选择",
7
+ "n_files": "{n} 个文件",
8
+ "n_folders": "{n} 个文件夹",
9
+ "filter_count": "{n} 通过筛选",
10
+ "select_count": "{n} 已选择",
11
+ "filter_placeholder": "输入筛选内容,筛选以下列表",
12
+ "Select some files": "去勾选文件!",
13
+ "zip_checkboxes": "点击复选框选择文件,然后再次使用Zip打包!",
14
+ "zip_tooltip_selected": "将所选元素下载为单个zip文件",
15
+ "zip_tooltip_whole": "将整个列表(未经过滤)作为一个zip文件下载.如果选择了一些元素,则只会下载这些元素.",
16
+ "zip_confirm_search": "将此搜索的所有结果下载为ZIP压缩包?",
17
+ "zip_confirm_folder": "确认将整个文件夹下载为ZIP压缩包?",
18
+ "select_tooltip": "选择适用于“Zip”和“删除”,也可以筛选列表.",
19
+ "delete_hint": "请先单击“选择”某个项目,才能执行删除.",
20
+ "delete_confirm": "确认删除 {n} 项?",
21
+ "delete_completed": "删除: {n} 成功!",
22
+ "delete_failed": "删除失败, {n,plural, one{# failed} other{# failed}}",
23
+ "delete_select": "选择要删除的内容",
24
+ "Delete": "删除",
25
+ "Options": "选项",
26
+ "Search": "搜索",
27
+ "Zip": "Zip",
28
+ "search_msg": "搜索当前文件夹和子文件夹",
29
+ "Searching": "搜索中...",
30
+ "Searched": "搜索完成!",
31
+ "Clear search": "清除搜索条件",
32
+ "Interrupted": "暂停",
33
+ "stopped_before": "已停止",
34
+ "empty_list": "空",
35
+ "filter_none": "无过滤",
36
+ "Admin-panel": "管理面板",
37
+ "Login": "登陆",
38
+ "Username": "用户名",
39
+ "Password": "密码",
40
+ "login_untrusted": "登录中止:服务器标识不可信!",
41
+ "login_bad_credentials": "证书参数有问题",
42
+ "login_bad_cookies": "Cookie错误-登录失败",
43
+ "User panel": "用户面板",
44
+ "Change password": "修改密码",
45
+ "enter_pass": "输入新密码",
46
+ "enter_pass2": "再次输入一遍密码",
47
+ "pass2_mismatch": "2次密码输入的不一致。修改失败!",
48
+ "password_changed": "密码修改成功",
49
+ "Logout": "注销",
50
+ "connection error": "链接错误",
51
+ "Full timestamp:": "完整的时间戳:",
52
+ "Search was interrupted": "搜索已中断",
53
+ "Stop list": "停止",
54
+ "upload_starting": "开始下载",
55
+ "wrong_account": "用户 {u} 没有访问权限,请更换用户",
56
+ "no_upload_here": "没有上传权限",
57
+ "Create folder": "创建文件夹",
58
+ "Pick files": "选择文件",
59
+ "Pick folder": "选择文件夹",
60
+ "send_files": "开始上传 {n,plural,one{# file} other{# files}}, {size}",
61
+ "Clear": "清空",
62
+ "failed_upload": "无法上传 {name}",
63
+ "confirm_resume": "是否重命名?",
64
+ "file too large": "文件太大",
65
+ "Enter folder name": "输入文件夹名称",
66
+ "Successfully created": "创建成功",
67
+ "enter_folder": "进入文件夹",
68
+ "folder_exists": "已存在同名文件夹",
69
+ "Sort by": "排序依据",
70
+ "name": "文件名",
71
+ "extension": "扩展名",
72
+ "size": "文件大小",
73
+ "time": "文件时间",
74
+ "Invert order": "降序",
75
+ "Folders first": "文件夹在前",
76
+ "Numeric names": "数字名称",
77
+ "theme:": "主题:",
78
+ "auto": "auto",
79
+ "light": "明亮",
80
+ "dark": "暗黑",
81
+ "parent folder": "上层文件夹",
82
+ "home": "根目录",
83
+ "Continue": "继续",
84
+ "Confirm": "确认",
85
+ "Don't": "取消",
86
+ "Warning": "警告",
87
+ "Error": "错误",
88
+ "Unauthorized": "未授权",
89
+ "Forbidden": "禁止",
90
+ "Not found": "未找到",
91
+ "Server error": "服务器错误",
92
+ "Upload": "上传",
93
+ "Upload terminated": "上传已终止",
94
+ "upload_finished": "上传{n} 结束 ({size})",
95
+ "upload_errors": "上传失败{n} 失败",
96
+ "download counter": "download 计数"
97
+ }
98
+ }
package/src/listen.js CHANGED
@@ -27,7 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  return (mod && mod.__esModule) ? mod : { "default": mod };
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.getUrls = exports.getServerStatus = exports.httpsPortCfg = exports.openAdmin = exports.portCfg = void 0;
30
+ exports.getUrls = exports.getServerStatus = exports.httpsPortCfg = exports.openAdmin = exports.portCfg = exports.getHttpsWorkingPort = void 0;
31
31
  const http = __importStar(require("http"));
32
32
  const config_1 = require("./config");
33
33
  const index_1 = require("./index");
@@ -44,6 +44,11 @@ const lodash_1 = __importDefault(require("lodash"));
44
44
  let httpSrv;
45
45
  let httpsSrv;
46
46
  const openBrowserAtStart = (0, config_1.defineConfig)('open_browser_at_start', !const_1.DEV);
47
+ function getHttpsWorkingPort() {
48
+ var _a;
49
+ return httpsSrv.listening && ((_a = httpsSrv.address()) === null || _a === void 0 ? void 0 : _a.port);
50
+ }
51
+ exports.getHttpsWorkingPort = getHttpsWorkingPort;
47
52
  exports.portCfg = (0, config_1.defineConfig)('port', 80);
48
53
  exports.portCfg.sub(async (port) => {
49
54
  while (!index_1.app)
@@ -104,8 +109,8 @@ const considerHttps = (0, misc_1.debounceAsync)(async () => {
104
109
  httpsSrv.on('connection', connections_1.newConnection);
105
110
  printUrls(port, 'https');
106
111
  });
107
- const cert = (0, config_1.defineConfig)('cert');
108
- const privateKey = (0, config_1.defineConfig)('private_key');
112
+ const cert = (0, config_1.defineConfig)('cert', '');
113
+ const privateKey = (0, config_1.defineConfig)('private_key', '');
109
114
  const httpsNeeds = [cert, privateKey];
110
115
  const httpsOptions = { cert: '', private_key: '' };
111
116
  for (const cfg of httpsNeeds) {
@@ -28,6 +28,9 @@ const formidable_1 = __importDefault(require("formidable"));
28
28
  const upload_1 = require("./upload");
29
29
  const adminApis_1 = require("./adminApis");
30
30
  const zlib_1 = require("zlib");
31
+ const listen_1 = require("./listen");
32
+ const config_1 = require("./config");
33
+ const forceHttps = (0, config_1.defineConfig)('force_https', true);
31
34
  exports.gzipper = (0, koa_compress_1.default)({
32
35
  threshold: 2048,
33
36
  gzip: { flush: zlib_1.constants.Z_SYNC_FLUSH },
@@ -74,6 +77,13 @@ const serveGuiAndSharedFiles = async (ctx, next) => {
74
77
  }
75
78
  if (ctx.body)
76
79
  return next();
80
+ if (!ctx.secure && forceHttps.get() && (0, listen_1.getHttpsWorkingPort)() && !(0, misc_1.isLocalHost)(ctx)) {
81
+ const { URL } = ctx;
82
+ URL.protocol = 'https';
83
+ URL.port = (0, listen_1.getHttpsWorkingPort)();
84
+ ctx.status = 307; // this ensures the client doesn't switch to a simpler GET request
85
+ return ctx.redirect(URL.href);
86
+ }
77
87
  if (path.startsWith(const_2.FRONTEND_URI))
78
88
  return serveFrontendPrefixed(ctx, next);
79
89
  if (path.length === const_1.ADMIN_URI.length - 1 && const_1.ADMIN_URI.startsWith(path))
package/src/misc.js CHANGED
@@ -18,7 +18,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
18
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.try_ = exports.stream2string = exports.tryJson = exports.same = exports.matches = exports.matchesNet = exports.isLocalHost = exports.with_ = exports.typedKeys = exports.objRenameKey = exports.onOff = exports.pendingPromise = exports.onlyTruthy = exports.truthy = exports.pattern2filter = exports.onFirstEvent = exports.onProcessExit = exports.randomId = exports.getOrSet = exports.wantArray = exports.waitFor = exports.wait = exports.newObj = exports.setHidden = exports.prefix = exports.removeStarting = exports.enforceFinal = exports.debounceAsync = void 0;
21
+ exports.try_ = exports.stream2string = exports.tryJson = exports.same = exports.matches = exports.makeMatcher = exports.makeNetMatcher = exports.isLocalHost = exports.with_ = exports.typedKeys = exports.objRenameKey = exports.onOff = exports.pendingPromise = exports.onlyTruthy = exports.truthy = exports.pattern2filter = exports.onFirstEvent = exports.onProcessExit = exports.randomId = exports.getOrSet = exports.wantArray = exports.waitFor = exports.wait = exports.newObj = exports.setHidden = exports.prefix = exports.removeStarting = exports.enforceFinal = exports.debounceAsync = void 0;
22
22
  const path_1 = require("path");
23
23
  const lodash_1 = __importDefault(require("lodash"));
24
24
  const assert_1 = __importDefault(require("assert"));
@@ -28,6 +28,7 @@ __exportStar(require("./util-files"), exports);
28
28
  const debounceAsync_1 = __importDefault(require("./debounceAsync"));
29
29
  exports.debounceAsync = debounceAsync_1.default;
30
30
  const micromatch_1 = require("micromatch");
31
+ const cidr_tools_1 = __importDefault(require("cidr-tools"));
31
32
  function enforceFinal(sub, s) {
32
33
  return s.endsWith(sub) ? s : s + sub;
33
34
  }
@@ -174,16 +175,19 @@ function isLocalHost(c) {
174
175
  return ip && (ip === '::1' || ip.endsWith('127.0.0.1'));
175
176
  }
176
177
  exports.isLocalHost = isLocalHost;
177
- function matchesNet(ip, mask, emptyMaskReturns = false) {
178
- if (typeof ip !== 'string')
179
- ip = ip.ip;
180
- return matches(ip, mask, emptyMaskReturns);
178
+ function makeNetMatcher(mask, emptyMaskReturns = false) {
179
+ return !mask ? () => emptyMaskReturns
180
+ : mask.includes('/') ? (ip) => cidr_tools_1.default.contains(mask, ip)
181
+ : makeMatcher(mask);
181
182
  }
182
- exports.matchesNet = matchesNet;
183
+ exports.makeNetMatcher = makeNetMatcher;
184
+ function makeMatcher(mask, emptyMaskReturns = false) {
185
+ return mask ? (0, micromatch_1.matcher)('(' + mask + ')') // adding () will allow us to use the pipe at root level
186
+ : () => emptyMaskReturns;
187
+ }
188
+ exports.makeMatcher = makeMatcher;
183
189
  function matches(s, mask, emptyMaskReturns = false) {
184
- if (!mask)
185
- return emptyMaskReturns;
186
- return (0, micromatch_1.isMatch)(s, '(' + mask + ')'); // adding () will allow us to use the pipe at root level
190
+ return makeMatcher('(' + mask + ')', emptyMaskReturns)(s); // adding () will allow us to use the pipe at root level
187
191
  }
188
192
  exports.matches = matches;
189
193
  function same(a, b) {
package/src/perm.js CHANGED
@@ -41,7 +41,7 @@ function saveSrpInfo(account, salt, verifier) {
41
41
  account.srp = String(salt) + '|' + String(verifier);
42
42
  }
43
43
  exports.saveSrpInfo = saveSrpInfo;
44
- exports.allowClearTextLogin = (0, config_1.defineConfig)('allow_clear_text_login');
44
+ exports.allowClearTextLogin = (0, config_1.defineConfig)('allow_clear_text_login', false);
45
45
  const srp6aNimbusRoutines = new tssrp6a_1.SRPRoutines(new tssrp6a_1.SRPParameters());
46
46
  async function updateAccount(account, changer) {
47
47
  const was = JSON.stringify(account);