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.
- package/README.md +6 -8
- package/admin/assets/{index-08017e15.js → index-5cd667a5.js} +134 -134
- package/admin/assets/index-8ff39373.css +1 -0
- package/{frontend/assets/sha512-f6798733.js → admin/assets/sha512-55ff2fa3.js} +1 -1
- package/admin/index.html +2 -2
- package/frontend/assets/index-27488fde.js +94 -0
- package/frontend/assets/index-54a5c76f.css +1 -0
- package/{admin/assets/sha512-69b26793.js → frontend/assets/sha512-8ebf6e2a.js} +1 -1
- package/frontend/fontello.css +9 -3
- package/frontend/fontello.woff2 +0 -0
- package/frontend/index.html +2 -2
- package/package.json +1 -1
- package/plugins/antibrute/plugin.js +1 -1
- package/plugins/download-counter/plugin.js +10 -3
- package/plugins/download-counter/public/main.js +12 -2
- package/src/adminApis.js +3 -3
- package/src/api.file_list.js +15 -2
- package/src/api.lang.js +8 -11
- package/src/api.vfs.js +2 -1
- package/src/block.js +6 -20
- package/src/config.js +6 -2
- package/src/const.js +2 -2
- package/src/customHtml.js +1 -1
- package/src/frontEndApis.js +1 -26
- package/src/lang.js +77 -0
- package/src/langs/hfs-lang-it.json +100 -0
- package/src/langs/hfs-lang-ko.json +103 -0
- package/src/langs/hfs-lang-ru.json +106 -0
- package/src/langs/hfs-lang-sr.json +108 -0
- package/src/langs/hfs-lang-zh.json +98 -0
- package/src/listen.js +8 -3
- package/src/middlewares.js +10 -0
- package/src/misc.js +13 -9
- package/src/perm.js +1 -1
- package/src/serveFile.js +2 -2
- package/src/serveGuiFiles.js +21 -8
- package/src/upload.js +1 -1
- package/src/vfs.js +19 -27
- package/admin/assets/index-94bbe0be.css +0 -1
- package/frontend/assets/index-5f125477.js +0 -94
- 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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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}
|