hfs 0.42.3 → 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 (41) hide show
  1. package/README.md +6 -8
  2. package/admin/assets/{index-08017e15.js → index-5cd667a5.js} +134 -134
  3. package/admin/assets/index-8ff39373.css +1 -0
  4. package/{frontend/assets/sha512-f6798733.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-69b26793.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 +1 -1
  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.file_list.js +15 -2
  18. package/src/api.lang.js +8 -11
  19. package/src/api.vfs.js +2 -1
  20. package/src/block.js +6 -20
  21. package/src/config.js +6 -2
  22. package/src/const.js +2 -2
  23. package/src/customHtml.js +1 -1
  24. package/src/frontEndApis.js +1 -26
  25. package/src/lang.js +77 -0
  26. package/src/langs/hfs-lang-it.json +100 -0
  27. package/src/langs/hfs-lang-ko.json +103 -0
  28. package/src/langs/hfs-lang-ru.json +106 -0
  29. package/src/langs/hfs-lang-sr.json +108 -0
  30. package/src/langs/hfs-lang-zh.json +98 -0
  31. package/src/listen.js +8 -3
  32. package/src/middlewares.js +10 -0
  33. package/src/misc.js +13 -9
  34. package/src/perm.js +1 -1
  35. package/src/serveFile.js +2 -2
  36. package/src/serveGuiFiles.js +21 -8
  37. package/src/upload.js +1 -1
  38. package/src/vfs.js +19 -27
  39. package/admin/assets/index-94bbe0be.css +0 -1
  40. package/frontend/assets/index-5f125477.js +0 -94
  41. package/frontend/assets/index-a09cacfd.css +0 -1
package/src/vfs.js CHANGED
@@ -4,7 +4,7 @@ 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.walkNode = exports.statusCodeForMissingPerm = exports.hasPermission = exports.nodeIsDirectory = exports.getNodeName = exports.saveVfs = exports.vfs = exports.urlToNode = exports.isSameFilenameAs = exports.MIME_AUTO = exports.defaultPerms = void 0;
7
+ exports.masksCouldGivePermission = exports.walkNode = exports.statusCodeForMissingPerm = exports.hasPermission = exports.nodeIsDirectory = exports.getNodeName = exports.saveVfs = exports.vfs = exports.urlToNode = exports.isSameFilenameAs = exports.MIME_AUTO = exports.defaultPerms = exports.WHO_ANY_ACCOUNT = exports.WHO_NO_ONE = exports.WHO_ANYONE = void 0;
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  const path_1 = require("path");
10
10
  const misc_1 = require("./misc");
@@ -13,15 +13,15 @@ const config_1 = require("./config");
13
13
  const const_1 = require("./const");
14
14
  const events_1 = __importDefault(require("./events"));
15
15
  const perm_1 = require("./perm");
16
- const WHO_ANYONE = true;
17
- const WHO_NO_ONE = false;
18
- const WHO_ANY_ACCOUNT = '*';
16
+ exports.WHO_ANYONE = true;
17
+ exports.WHO_NO_ONE = false;
18
+ exports.WHO_ANY_ACCOUNT = '*';
19
19
  exports.defaultPerms = {
20
- can_see: WHO_ANYONE,
21
- can_read: WHO_ANYONE,
22
- can_list: WHO_ANYONE,
23
- can_upload: WHO_NO_ONE,
24
- can_delete: WHO_NO_ONE,
20
+ can_see: exports.WHO_ANYONE,
21
+ can_read: exports.WHO_ANYONE,
22
+ can_list: exports.WHO_ANYONE,
23
+ can_upload: exports.WHO_NO_ONE,
24
+ can_delete: exports.WHO_NO_ONE,
25
25
  };
26
26
  exports.MIME_AUTO = 'auto';
27
27
  function inheritFromParent(parent, child) {
@@ -139,10 +139,6 @@ exports.statusCodeForMissingPerm = statusCodeForMissingPerm;
139
139
  // Too many parameters: consider object, but benchmark against degraded recursion on huge folders.
140
140
  async function* walkNode(parent, ctx, depth = 0, prefixPath = '', requiredPerm) {
141
141
  var _a;
142
- if (requiredPerm && ctx
143
- && !hasPermission(parent, requiredPerm, ctx)
144
- && !masksCouldGivePermission(parent.masks))
145
- return; // no permission, no reason to continue
146
142
  const { children, source } = parent;
147
143
  const took = prefixPath ? undefined : new Set();
148
144
  if (children)
@@ -162,6 +158,10 @@ async function* walkNode(parent, ctx, depth = 0, prefixPath = '', requiredPerm)
162
158
  }
163
159
  if (!source)
164
160
  return;
161
+ if (requiredPerm && ctx // no permission, no reason to continue (at least for dynamic elements)
162
+ && !hasPermission(parent, requiredPerm, ctx)
163
+ && !masksCouldGivePermission(parent.masks, requiredPerm))
164
+ return;
165
165
  try {
166
166
  let lastDir = prefixPath.slice(0, -1) || '.';
167
167
  const map = new Map();
@@ -203,20 +203,12 @@ async function* walkNode(parent, ctx, depth = 0, prefixPath = '', requiredPerm)
203
203
  item.isTemp = true;
204
204
  return item;
205
205
  }
206
- function masksCouldGivePermission(masks) {
207
- if (!masks)
208
- return false;
209
- for (const [, props] of Object.entries(masks)) {
210
- const v = props[requiredPerm];
211
- if (v && (!ctx || matchWho(v, ctx))) // without ctx we can't say, so it could
212
- return true;
213
- if (masksCouldGivePermission(props.masks))
214
- return true;
215
- }
216
- return false;
217
- }
218
206
  }
219
207
  exports.walkNode = walkNode;
208
+ function masksCouldGivePermission(masks, perm) {
209
+ return masks !== undefined && Object.values(masks).some(props => props[perm] || masksCouldGivePermission(props.masks, perm));
210
+ }
211
+ exports.masksCouldGivePermission = masksCouldGivePermission;
220
212
  function applyMasks(item, parent, virtualBasename) {
221
213
  const { masks } = parent;
222
214
  if (!masks)
@@ -248,8 +240,8 @@ function renameUnderPath(rename, path) {
248
240
  return lodash_1.default.isEmpty(rename) ? undefined : rename;
249
241
  }
250
242
  function matchWho(who, ctx) {
251
- return who === WHO_ANYONE
252
- || who === WHO_ANY_ACCOUNT && Boolean(ctx.state.account)
243
+ return who === exports.WHO_ANYONE
244
+ || who === exports.WHO_ANY_ACCOUNT && Boolean(ctx.state.account)
253
245
  || Array.isArray(who) // check if I or any ancestor match `who`, but cache ancestors' usernames inside context state
254
246
  && (0, misc_1.getOrSet)(ctx.state, 'usernames', () => (0, perm_1.getCurrentUsernameExpanded)(ctx)).some((u) => who.includes(u));
255
247
  }
@@ -1 +0,0 @@
1
- :root{height:100dvh}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:100vh;background:#000}#root{min-height:100%;display:flex}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.MuiTreeItem-content{box-sizing:border-box}ol,ul{margin-top:.2em}.dialog-backdrop{position:fixed;inset:0;background:#888a;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog{background:#fff;background:var(--bg);padding:max(.5em,1vw);border-radius:1em;position:relative;margin:0 3vw;overflow:hidden;max-height:calc(100vh - 2em);display:flex;justify-content:center}.dialog-icon{color:#fff;background-color:var(--color);position:absolute;top:0;width:2em;height:1.8em;text-align:center;border-radius:.8em 0}.dialog-title{font-size:120%;position:absolute;top:5px}.dialog-icon~.dialog-title{text-align:center}.dialog-closer{border-radius:0 .8em;right:0;padding:0;background-color:#c88}.dialog-icon~.dialog-content{margin-top:2em}.dialog-type{left:0;top:0;overflow:hidden;line-height:1.8em;opacity:.8}.dialog-content{overflow:auto;max-height:calc(100vh - 4.5em)}.dialog-content p{white-space:pre-wrap;margin:.5em 0}.dialog-confirm .dialog-content button{margin-top:1em}.dialog-alert-info{--color: #282 }.dialog-alert-warning{--color: #c91 }.dialog-alert-error{--color: #822}@media (max-width: 42em){.dialog-icon{font-size:120%}.dialog-icon~.dialog-content{margin-top:2.5em}.dialog-title{top:5px}}.dialog-prompt label{display:block;margin-bottom:.5em;margin-left:.1em}