hfs 0.55.0-beta3 → 0.55.0-beta4
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.
- package/admin/assets/{index-DHCaIJ9p.js → index-ErTf5p78.js} +98 -98
- package/admin/assets/{sha512-DicKEgNv.js → sha512-CqnbmZS9.js} +1 -1
- package/admin/index.html +1 -1
- package/frontend/assets/{index-legacy-CBj6uwzd.js → index-legacy-BoMy1vEB.js} +2 -2
- package/frontend/assets/{sha512-legacy-CxvBXzw1.js → sha512-legacy-CP10jckG.js} +1 -1
- package/frontend/index.html +1 -1
- package/package.json +1 -1
- package/src/consoleLog.js +6 -1
- package/src/const.js +2 -2
- package/src/cross.js +1 -0
- package/src/langs/hfs-lang-fi.json +5 -3
- package/src/langs/hfs-lang-it.json +2 -1
- package/src/langs/hfs-lang-ru.json +3 -2
- package/src/perm.js +8 -1
- package/src/plugins.js +4 -0
- package/src/util-os.js +4 -3
- package/src/vfs.js +2 -7
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
System.register(["./index-legacy-
|
|
1
|
+
System.register(["./index-legacy-BoMy1vEB.js"],(function(h,t){"use strict";var i,s;return{setters:[function(h){i=h.g,s=h.c}],execute:function(){function t(h,t){for(var i=function(){var i=t[s];if("string"!=typeof i&&!Array.isArray(i)){var r=function(t){if("default"!==t&&!(t in h)){var s=Object.getOwnPropertyDescriptor(i,t);s&&Object.defineProperty(h,t,s.get?s:{enumerable:!0,get:function(){return i[t]}})}};for(var e in i)r(e)}},s=0;s<t.length;s++)i();return Object.freeze(Object.defineProperty(h,Symbol.toStringTag,{value:"Module"}))}var r={exports:{}};
|
|
2
2
|
/*
|
|
3
3
|
* [js-sha512]{@link https://github.com/emn178/js-sha512}
|
|
4
4
|
*
|
package/frontend/index.html
CHANGED
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
<style class="removeAtBoot">@media (prefers-color-scheme: dark) { html { background-color: #000; color: #888; } }</style>
|
|
11
11
|
<div id="root">Wait for loading or <a href="?get=basic">use basic interface now</a></div>
|
|
12
12
|
<script crossorigin id="vite-legacy-polyfill" src="/assets/polyfills-legacy-DMrMt_pQ.js"></script>
|
|
13
|
-
<script crossorigin id="vite-legacy-entry" data-src="/assets/index-legacy-
|
|
13
|
+
<script crossorigin id="vite-legacy-entry" data-src="/assets/index-legacy-BoMy1vEB.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
|
|
14
14
|
</body>
|
|
15
15
|
</html>
|
package/package.json
CHANGED
package/src/consoleLog.js
CHANGED
|
@@ -6,16 +6,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.consoleLog = void 0;
|
|
7
7
|
const events_1 = __importDefault(require("./events"));
|
|
8
8
|
const cross_1 = require("./cross");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const const_1 = require("./const");
|
|
9
11
|
exports.consoleLog = [];
|
|
12
|
+
const f = const_1.argv.consoleFile ? (0, fs_1.createWriteStream)(const_1.argv.consoleFile, 'utf-8') : null;
|
|
10
13
|
for (const k of ['log', 'warn', 'error']) {
|
|
11
14
|
const original = console[k];
|
|
12
15
|
console[k] = (...args) => {
|
|
13
16
|
const ts = new Date();
|
|
14
|
-
const
|
|
17
|
+
const msg = args.join(' ');
|
|
18
|
+
const rec = { ts, k, msg };
|
|
15
19
|
exports.consoleLog.push(rec);
|
|
16
20
|
if (exports.consoleLog.length > 100000) // limit to avoid infinite space
|
|
17
21
|
exports.consoleLog.splice(0, 1000);
|
|
18
22
|
events_1.default.emit('console', rec);
|
|
23
|
+
f === null || f === void 0 ? void 0 : f.write(`${(0, cross_1.formatTimestamp)(ts)} [${k}] ${msg}\n`);
|
|
19
24
|
return original((0, cross_1.formatTime)(ts), ...args); // bundled nodejs doesn't have locales (and apparently uses en-US)
|
|
20
25
|
};
|
|
21
26
|
}
|
package/src/const.js
CHANGED
|
@@ -38,7 +38,7 @@ const lodash_1 = __importDefault(require("lodash"));
|
|
|
38
38
|
const path_1 = require("path");
|
|
39
39
|
const cross_1 = require("./cross");
|
|
40
40
|
__exportStar(require("./cross-const"), exports);
|
|
41
|
-
exports.API_VERSION = 10.
|
|
41
|
+
exports.API_VERSION = 10.3;
|
|
42
42
|
exports.COMPATIBLE_API_VERSION = 1; // while changes in the api are not breaking, this number stays the same, otherwise it is made equal to API_VERSION
|
|
43
43
|
exports.argv = (0, minimist_1.default)(process.argv.slice(2));
|
|
44
44
|
// you can add arguments with this file, currently used for the update process on mac/linux
|
|
@@ -54,7 +54,7 @@ exports.DEV = process.env.DEV || exports.argv.dev ? 'DEV' : '';
|
|
|
54
54
|
exports.ORIGINAL_CWD = process.cwd();
|
|
55
55
|
exports.HFS_STARTED = new Date();
|
|
56
56
|
const PKG_PATH = (0, path_1.join)(__dirname, '..', 'package.json');
|
|
57
|
-
exports.BUILD_TIMESTAMP = "2024-12-
|
|
57
|
+
exports.BUILD_TIMESTAMP = "2024-12-19T15:58:01.475Z";
|
|
58
58
|
const pkg = JSON.parse(fs.readFileSync(PKG_PATH, 'utf8'));
|
|
59
59
|
exports.VERSION = pkg.version;
|
|
60
60
|
exports.RUNNING_BETA = exports.VERSION.includes('-');
|
package/src/cross.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Pultsari & Win_7",
|
|
3
|
-
"version": 1.
|
|
4
|
-
"hfs_version": "0.
|
|
3
|
+
"version": 1.3,
|
|
4
|
+
"hfs_version": "0.55.0",
|
|
5
5
|
"translate": {
|
|
6
6
|
"Select": "Valitse",
|
|
7
7
|
"n_files": "{n,plural,one{# tiedosto} other{# tiedostoa}}",
|
|
@@ -167,6 +167,8 @@
|
|
|
167
167
|
"Logged in": "Kirjauduttu sisään",
|
|
168
168
|
"Logged out": "Kirjauduttu ulos",
|
|
169
169
|
"Cancel": "Peruuta",
|
|
170
|
-
"allow_session_ip_change": "Salli IP vaihto tämän istunnon aikana"
|
|
170
|
+
"allow_session_ip_change": "Salli IP vaihto tämän istunnon aikana",
|
|
171
|
+
"focus_hint": "Kirjoittamalla näppäimistölläsi, voit etsiä ja korostaa elementtejä listalta",
|
|
172
|
+
"copy_links": "Kopioi linkit"
|
|
171
173
|
}
|
|
172
174
|
}
|
|
@@ -156,6 +156,7 @@
|
|
|
156
156
|
"Logged out": "Arrivederci",
|
|
157
157
|
"Cancel": "Annulla",
|
|
158
158
|
"allow_session_ip_change": "Permetti cambio IP in questa sessione",
|
|
159
|
-
"focus_hint": "Scrivendo sulla tastiera cerchi tra gli elementi della lista."
|
|
159
|
+
"focus_hint": "Scrivendo sulla tastiera cerchi tra gli elementi della lista.",
|
|
160
|
+
"copy_links": "Copia i link"
|
|
160
161
|
}
|
|
161
162
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Mefistofell, SanokKule, ItsNeverLight",
|
|
3
3
|
"version": 2.6,
|
|
4
|
-
"hfs_version": "0.
|
|
4
|
+
"hfs_version": "0.55.0",
|
|
5
5
|
"translate": {
|
|
6
6
|
"Select": "Выбор",
|
|
7
7
|
"n_files": "{n,plural, one{# файл} few{# файла} many{# файлов}}",
|
|
@@ -168,6 +168,7 @@
|
|
|
168
168
|
"Logged out": "Выход выполнен",
|
|
169
169
|
"Cancel": "Отмена",
|
|
170
170
|
"allow_session_ip_change": "Разрешить смену IP в этой сессии",
|
|
171
|
-
"focus_hint": "Набирая текст на клавиатуре, вы можете выполнять поиск и выбирать элементы из списка."
|
|
171
|
+
"focus_hint": "Набирая текст на клавиатуре, вы можете выполнять поиск и выбирать элементы из списка.",
|
|
172
|
+
"copy_links": "Копировать ссылки"
|
|
172
173
|
}
|
|
173
174
|
}
|
package/src/perm.js
CHANGED
|
@@ -4,13 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.changeSrpHelper = exports.accountCanLoginAdmin = exports.accountCanLogin = exports.accountHasPassword = exports.getFromAccount = exports.delAccount = exports.addAccount = exports.renameAccount = exports.normalizeUsername = exports.accountsConfig = exports.updateAccount = exports.createAdmin = exports.saveSrpInfo = exports.getAccount = exports.expandUsername = void 0;
|
|
7
|
+
exports.changeSrpHelper = exports.accountCanLoginAdmin = exports.accountCanLogin = exports.accountHasPassword = exports.getFromAccount = exports.delAccount = exports.addAccount = exports.renameAccount = exports.normalizeUsername = exports.accountsConfig = exports.updateAccount = exports.createAdmin = exports.saveSrpInfo = exports.getAccount = exports.ctxBelongsTo = exports.expandUsername = void 0;
|
|
8
8
|
const lodash_1 = __importDefault(require("lodash"));
|
|
9
9
|
const misc_1 = require("./misc");
|
|
10
10
|
const config_1 = require("./config");
|
|
11
11
|
const tssrp6a_1 = require("tssrp6a");
|
|
12
12
|
const events_1 = __importDefault(require("./events"));
|
|
13
13
|
const apiMiddleware_1 = require("./apiMiddleware");
|
|
14
|
+
const auth_1 = require("./auth");
|
|
14
15
|
let accounts = {};
|
|
15
16
|
// provides the username and all other usernames it inherits based on the 'belongs' attribute. Useful to check permissions
|
|
16
17
|
function expandUsername(who) {
|
|
@@ -27,6 +28,12 @@ function expandUsername(who) {
|
|
|
27
28
|
return ret;
|
|
28
29
|
}
|
|
29
30
|
exports.expandUsername = expandUsername;
|
|
31
|
+
// check if current username or any ancestor match the provided usernames
|
|
32
|
+
function ctxBelongsTo(ctx, usernames) {
|
|
33
|
+
return (0, misc_1.getOrSet)(ctx.state, 'usernames', () => expandUsername((0, auth_1.getCurrentUsername)(ctx))) // cache ancestors' usernames inside context state
|
|
34
|
+
.some((u) => usernames.includes(u));
|
|
35
|
+
}
|
|
36
|
+
exports.ctxBelongsTo = ctxBelongsTo;
|
|
30
37
|
function getAccount(username, normalize = true) {
|
|
31
38
|
if (normalize)
|
|
32
39
|
username = normalizeUsername(username);
|
package/src/plugins.js
CHANGED
|
@@ -50,6 +50,8 @@ const index_1 = require("./index");
|
|
|
50
50
|
const block_1 = require("./block");
|
|
51
51
|
const lang_1 = require("./lang");
|
|
52
52
|
const i18n_1 = require("./i18n");
|
|
53
|
+
const perm_1 = require("./perm");
|
|
54
|
+
const auth_1 = require("./auth");
|
|
53
55
|
exports.PATH = 'plugins';
|
|
54
56
|
exports.DISABLING_SUFFIX = '-disabled';
|
|
55
57
|
exports.STORAGE_FOLDER = 'storage';
|
|
@@ -142,6 +144,8 @@ async function initPlugin(pl, morePassedToInit) {
|
|
|
142
144
|
notifyClient: frontEndApis_1.notifyClient,
|
|
143
145
|
addBlock: block_1.addBlock,
|
|
144
146
|
misc,
|
|
147
|
+
ctxBelongsTo: perm_1.ctxBelongsTo,
|
|
148
|
+
getCurrentUsername: auth_1.getCurrentUsername,
|
|
145
149
|
...morePassedToInit
|
|
146
150
|
}));
|
|
147
151
|
return Object.assign(pl, typeof res === 'function' ? { unload: res } : res);
|
package/src/util-os.js
CHANGED
|
@@ -76,17 +76,18 @@ async function runCmd(cmd, args = [], options = {}) {
|
|
|
76
76
|
return (stderr || stdout).replace(/\r/g, '');
|
|
77
77
|
}
|
|
78
78
|
exports.runCmd = runCmd;
|
|
79
|
+
// returns pid-to-name object
|
|
79
80
|
async function getWindowsServicePids() {
|
|
80
81
|
var _a;
|
|
81
82
|
const res = await runCmd('tasklist /svc /fo csv');
|
|
82
83
|
const parsed = new csv_1.default().parse(res);
|
|
83
84
|
const no = (_a = parsed === null || parsed === void 0 ? void 0 : parsed[1]) === null || _a === void 0 ? void 0 : _a[2];
|
|
84
|
-
return parsed.slice(2).filter(x => x[2] !== no).map(x =>
|
|
85
|
+
return Object.fromEntries(parsed.slice(2).filter(x => x[2] !== no).map(x => [x[1], x[2]]));
|
|
85
86
|
}
|
|
86
87
|
exports.RUNNING_AS_SERVICE = const_1.IS_WINDOWS && getWindowsServicePids().then(x => {
|
|
87
|
-
const ret = x.
|
|
88
|
+
const ret = x[node_process_1.pid] || x[node_process_1.ppid];
|
|
88
89
|
if (ret)
|
|
89
|
-
console.log("running as service");
|
|
90
|
+
console.log("running as service", ret);
|
|
90
91
|
return ret;
|
|
91
92
|
}, e => {
|
|
92
93
|
console.log("couldn't determine if we are running as a service");
|
package/src/vfs.js
CHANGED
|
@@ -224,13 +224,8 @@ function statusCodeForMissingPerm(node, perm, ctx, assign = true) {
|
|
|
224
224
|
}
|
|
225
225
|
cur = who;
|
|
226
226
|
} while (1);
|
|
227
|
-
if (Array.isArray(who))
|
|
228
|
-
|
|
229
|
-
// check if I or any ancestor match `who`, but cache ancestors' usernames inside context state
|
|
230
|
-
const some = (0, misc_1.getOrSet)(ctx.state, 'usernames', () => (0, perm_1.expandUsername)((0, auth_1.getCurrentUsername)(ctx)))
|
|
231
|
-
.some((u) => arr.includes(u));
|
|
232
|
-
return some ? 0 : const_1.HTTP_UNAUTHORIZED;
|
|
233
|
-
}
|
|
227
|
+
if (Array.isArray(who))
|
|
228
|
+
return (0, perm_1.ctxBelongsTo)(ctx, who) ? 0 : const_1.HTTP_UNAUTHORIZED;
|
|
234
229
|
return typeof who === 'boolean' ? (who ? 0 : const_1.HTTP_FORBIDDEN)
|
|
235
230
|
: who === misc_1.WHO_ANY_ACCOUNT ? ((0, auth_1.getCurrentUsername)(ctx) ? 0 : const_1.HTTP_UNAUTHORIZED)
|
|
236
231
|
: (0, misc_1.throw_)(Error(`invalid permission: ${perm}=${(0, misc_1.try_)(() => JSON.stringify(who))}`));
|