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.
@@ -1,4 +1,4 @@
1
- System.register(["./index-legacy-CBj6uwzd.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:{}};
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
  *
@@ -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-CBj6uwzd.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hfs",
3
- "version": "0.55.0-beta3",
3
+ "version": "0.55.0-beta4",
4
4
  "description": "HTTP File Server",
5
5
  "keywords": [
6
6
  "file server",
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 rec = { ts, k, msg: args.join(' ') };
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.2;
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-14T14:24:01.619Z";
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
@@ -39,6 +39,7 @@ exports.FRONTEND_OPTIONS = {
39
39
  invert_order: false,
40
40
  folders_first: true,
41
41
  sort_numerics: false,
42
+ title_with_path: true,
42
43
  theme: '',
43
44
  auto_play_seconds: 5,
44
45
  disableTranslation: false,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "author": "Pultsari & Win_7",
3
- "version": 1.21,
4
- "hfs_version": "0.54.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.54.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 => Number(x[1]));
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.includes(node_process_1.pid);
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
- const arr = who; // shut up ts
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))}`));