hfs 3.2.1 → 3.2.2
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/{af-U8Sl5sCM.js → af-BDoqNBMg.js} +1 -1
- package/admin/assets/{am-n9TdXja0.js → am-DXBvKJ3X.js} +1 -1
- package/admin/assets/{ar-CUpxfuw5.js → ar-BJIoxKTh.js} +1 -1
- package/admin/assets/{ar-dz-DC58Z9cj.js → ar-dz-C9l3uc_3.js} +1 -1
- package/admin/assets/{ar-iq-BDkrto6W.js → ar-iq-DKH8u2lX.js} +1 -1
- package/admin/assets/{ar-kw-Bz806GvG.js → ar-kw-D3gJalQp.js} +1 -1
- package/admin/assets/{ar-ly-DW7JaKir.js → ar-ly-BZJzWFeR.js} +1 -1
- package/admin/assets/{ar-ma-BuveKbkq.js → ar-ma-DabiOCr0.js} +1 -1
- package/admin/assets/{ar-sa-DRvob1Jp.js → ar-sa-C7suzSCY.js} +1 -1
- package/admin/assets/{ar-tn-Cae7pfui.js → ar-tn-BvBucEx0.js} +1 -1
- package/admin/assets/{az-B7PpjwCU.js → az-CPUppH2M.js} +1 -1
- package/admin/assets/{be-DSy_sPdD.js → be-vzvhX2dl.js} +1 -1
- package/admin/assets/{bg-Djacfatx.js → bg-09Xbj_Y3.js} +1 -1
- package/admin/assets/{bi-DOLGYGEN.js → bi-CvhiuiE9.js} +1 -1
- package/admin/assets/{bm-BmR133he.js → bm-DtJAZAkZ.js} +1 -1
- package/admin/assets/{bn-DsjLUmm3.js → bn-Dnzh2x6I.js} +1 -1
- package/admin/assets/{bn-bd-C3SafRtu.js → bn-bd-xEy4797g.js} +1 -1
- package/admin/assets/{bo-DsMRUw9A.js → bo-vuPmptG3.js} +1 -1
- package/admin/assets/{br-BxR8Zm95.js → br-C9xH4OD3.js} +1 -1
- package/admin/assets/{bs-gH68uvCb.js → bs-BB_uCUp1.js} +1 -1
- package/admin/assets/{ca-DfGL180b.js → ca-D7LKaf98.js} +1 -1
- package/admin/assets/{cs-D4lFVAq6.js → cs-DMFTNdNC.js} +1 -1
- package/admin/assets/{cv-CFyqoRN7.js → cv-DNUjJwnO.js} +1 -1
- package/admin/assets/{cy-DuubtylZ.js → cy-qmAOTPwC.js} +1 -1
- package/admin/assets/{da-Cp7c-T-B.js → da-DDX54iM9.js} +1 -1
- package/admin/assets/{de-CeQXU72n.js → de-BBmlsfbM.js} +1 -1
- package/admin/assets/{de-at-Cx01BLTk.js → de-at-CuMZqYfu.js} +1 -1
- package/admin/assets/{de-ch-K5Vn_bWQ.js → de-ch-s8OXKb-5.js} +1 -1
- package/admin/assets/{dist-CfPsVFTp.js → dist-CHP3cW_n.js} +1 -1
- package/admin/assets/{dv-DB4pdLQj.js → dv-Cjs3QDBN.js} +1 -1
- package/admin/assets/{el-CNA5lg_z.js → el-BsAOrUDP.js} +1 -1
- package/admin/assets/{en-Bpua-Wb5.js → en-DQ460ET7.js} +1 -1
- package/admin/assets/{en-au-CKwJ7DKC.js → en-au-8tMHM2OT.js} +1 -1
- package/admin/assets/{en-ca-D8vKBgWW.js → en-ca-c9jM4M_8.js} +1 -1
- package/admin/assets/{en-in-Bhx4y1uu.js → en-gb-unFIXx9f.js} +1 -1
- package/admin/assets/{en-ie-0gd4plad.js → en-ie-D4_e3kV6.js} +1 -1
- package/admin/assets/{en-il-BYIz25Pw.js → en-il-BoaZOven.js} +1 -1
- package/admin/assets/{en-tt-Bk-if7Re.js → en-in-D2ULzXMp.js} +1 -1
- package/admin/assets/{en-nz-CtIJOjgh.js → en-nz-grrmB3dg.js} +1 -1
- package/admin/assets/{en-sg-iygWx8GW.js → en-sg-Cmqxpoir.js} +1 -1
- package/admin/assets/{en-gb-C3jRv20Y.js → en-tt-Cn72OR4N.js} +1 -1
- package/admin/assets/{eo-DAvER5ej.js → eo-Cqxmc0TT.js} +1 -1
- package/admin/assets/{es-C98a0Ggy.js → es-CkjKdFZ3.js} +1 -1
- package/admin/assets/{es-do-TCakoZXN.js → es-do-CTcTshup.js} +1 -1
- package/admin/assets/{es-mx-BCj7c6Zn.js → es-mx-DMXgMMxs.js} +1 -1
- package/admin/assets/{es-pr-rsR3Q8oM.js → es-pr-DNCV91L3.js} +1 -1
- package/admin/assets/{es-us-DC9NM1XV.js → es-us-C7o2mlIH.js} +1 -1
- package/admin/assets/{esm-BQaMpob3.js → esm-DvUbRuYx.js} +1 -1
- package/admin/assets/{et-tJ-d1AZX.js → et-DaPpH-gK.js} +1 -1
- package/admin/assets/{eu-xzUajtaj.js → eu-DfKyFruu.js} +1 -1
- package/admin/assets/{fa-kR15gQkC.js → fa-xWrBjePb.js} +1 -1
- package/admin/assets/{fi-DQjRBOgG.js → fi-BOWDMsDS.js} +1 -1
- package/admin/assets/{fo-BHMXHU45.js → fo-B3FupW8R.js} +1 -1
- package/admin/assets/{fr-DGS71Nvo.js → fr-DZBDBkwp.js} +1 -1
- package/admin/assets/{fr-ca-Bkzyy0tT.js → fr-ca-CRePPJJ5.js} +1 -1
- package/admin/assets/{fr-ch-BRrWrRWV.js → fr-ch-pFKvYU8D.js} +1 -1
- package/admin/assets/{fy-Dkv180q7.js → fy-0k7RzHUH.js} +1 -1
- package/admin/assets/{ga-xsoXuVDY.js → ga-D31rB2ys.js} +1 -1
- package/admin/assets/{gd-cLPVqYdG.js → gd-CbgY-FFE.js} +1 -1
- package/admin/assets/{gl-BUG0DHTt.js → gl-DrtvS9gt.js} +1 -1
- package/admin/assets/{gom-latn-BKRncAa1.js → gom-latn-Dkke3GyE.js} +1 -1
- package/admin/assets/{gu-BpmXErqK.js → gu-BlEipYhR.js} +1 -1
- package/admin/assets/{he-DNxd9A8z.js → he-BrHT6OLB.js} +1 -1
- package/admin/assets/{hi-dNFE6t75.js → hi-Bx0zlAgr.js} +1 -1
- package/admin/assets/{hr-DNZiZtn4.js → hr-CoFYGbr6.js} +1 -1
- package/admin/assets/{ht-B1LoCeln.js → ht-Df5xKo4a.js} +1 -1
- package/admin/assets/{hu-q6SYps3j.js → hu-BFTN3q6-.js} +1 -1
- package/admin/assets/{hy-am-BLa2HL3i.js → hy-am-DuZTJQed.js} +1 -1
- package/admin/assets/{id-4zvXdXSK.js → id-DBZ5nPkf.js} +1 -1
- package/admin/assets/{index-D2UH6ajh.js → index-BGIe1xaR.js} +57 -57
- package/admin/assets/{is-B7wmPDNy.js → is-CmeHm47B.js} +1 -1
- package/admin/assets/{it-CGm31WTp.js → it-Cv3fjOA9.js} +1 -1
- package/admin/assets/{it-ch-HfVNoF64.js → it-ch-DCTyHA3T.js} +1 -1
- package/admin/assets/{ja-RGFi1Jc2.js → ja-DHNVXAM5.js} +1 -1
- package/admin/assets/{jv-BclbE5yu.js → jv-BdNIxhWv.js} +1 -1
- package/admin/assets/{ka-D3ZrxVjT.js → ka-D-joD0QB.js} +1 -1
- package/admin/assets/{kk-B7aIapNy.js → kk-8wRNNjxz.js} +1 -1
- package/admin/assets/{km-DPwsGner.js → km-dUWOg1uK.js} +1 -1
- package/admin/assets/{kn-CuXmm_DG.js → kn-CwQbzel0.js} +1 -1
- package/admin/assets/{ko-BlPgy9aF.js → ko-D_gn9Sfw.js} +1 -1
- package/admin/assets/{ku-B6w51rl_.js → ku-Dh3MRML3.js} +1 -1
- package/admin/assets/{ky-RLmSGZmf.js → ky-CWYuRvil.js} +1 -1
- package/admin/assets/{lb-AKcfj05J.js → lb-Cc2xsSIx.js} +1 -1
- package/admin/assets/{lo-VBKOzJn1.js → lo-CkwNFDBz.js} +1 -1
- package/admin/assets/{lt-53JaHFcf.js → lt-HWyFDLXu.js} +1 -1
- package/admin/assets/{lv-DGOgmu9w.js → lv-C7Zx3OLO.js} +1 -1
- package/admin/assets/{me-zNrvFUXX.js → me-DH3AqnfF.js} +1 -1
- package/admin/assets/{mi-BBDE1uK4.js → mi-DMmUry6m.js} +1 -1
- package/admin/assets/{mk-2LiSrAS9.js → mk-D6MNZrzX.js} +1 -1
- package/admin/assets/{ml-BEwbrVql.js → ml-B_ur8Zqf.js} +1 -1
- package/admin/assets/{mn-LuMGd2Ic.js → mn-DeL8Ry7x.js} +1 -1
- package/admin/assets/{mr-C_dFhleR.js → mr-C01qRXFL.js} +1 -1
- package/admin/assets/{ms-BHnmZJI4.js → ms-DFUZJzOm.js} +1 -1
- package/admin/assets/{ms-my-FcVPbGSE.js → ms-my-CUYHkebs.js} +1 -1
- package/admin/assets/{mt-DzhvOV5Z.js → mt-CE8t5jSj.js} +1 -1
- package/admin/assets/{my-Mmp3v0PH.js → my-Df96A8jZ.js} +1 -1
- package/admin/assets/{nb-CYPvI8e3.js → nb-D0837ewu.js} +1 -1
- package/admin/assets/{ne-BtVsV5BN.js → ne-BdK5TR0R.js} +1 -1
- package/admin/assets/{nl-be-X-pQSY5N.js → nl-be-BfVC0cur.js} +1 -1
- package/admin/assets/{nl-C6aRDFNr.js → nl-oYKmSma6.js} +1 -1
- package/admin/assets/{nn-C1m9zYBT.js → nn-IEUPnyc8.js} +1 -1
- package/admin/assets/{oc-lnc-CFT7xZs-.js → oc-lnc-g_wSIROr.js} +1 -1
- package/admin/assets/{pa-in-Bby4AmI2.js → pa-in-gWhcLmZE.js} +1 -1
- package/admin/assets/{pl-MmIf2tXf.js → pl-H3-LoxVn.js} +1 -1
- package/admin/assets/{pt-br-Cu8EXyIK.js → pt-br-B8UcNR6_.js} +1 -1
- package/admin/assets/{pt-DHCh_z9j.js → pt-hiX8RqVw.js} +1 -1
- package/admin/assets/{rn-DZUJ5hf0.js → rn-BKupViLr.js} +1 -1
- package/admin/assets/{ro-BRHg1GDk.js → ro-DmhgIvml.js} +1 -1
- package/admin/assets/{ru-Wv8fMN5W.js → ru-CcpO-b8g.js} +1 -1
- package/admin/assets/{rw-B_XP1EHM.js → rw-DWX_5ZK0.js} +1 -1
- package/admin/assets/{sd-_X3CAPlB.js → sd-Dat8YgLw.js} +1 -1
- package/admin/assets/{se-FItkWaOK.js → se-nTBYCwx3.js} +1 -1
- package/admin/assets/{sha512-UQMP5wnF.js → sha512-CZz40GwW.js} +1 -1
- package/admin/assets/{si-DhVYEiDt.js → si-DG88w5El.js} +1 -1
- package/admin/assets/{sk-cWZR9gF4.js → sk-s5FxW36J.js} +1 -1
- package/admin/assets/{sl-CJckZkV8.js → sl-B-HyGrpA.js} +1 -1
- package/admin/assets/{sq-B7eoM8fS.js → sq-DPFtfEC8.js} +1 -1
- package/admin/assets/{sr-SfiQA7kg.js → sr-bBPg1zz4.js} +1 -1
- package/admin/assets/{sr-cyrl-Db8Rrl0U.js → sr-cyrl-cXkYHMcP.js} +1 -1
- package/admin/assets/{ss-Bian2WDB.js → ss-7nSqXJN7.js} +1 -1
- package/admin/assets/{sv-D-Dsf8uN.js → sv-B8mG1QK4.js} +1 -1
- package/admin/assets/{sv-fi-BBv1GPVJ.js → sv-fi-CotGRXSH.js} +1 -1
- package/admin/assets/{sw-BIzZvuq6.js → sw-fAxU-Uck.js} +1 -1
- package/admin/assets/{ta-C2JoHqar.js → ta-Dl0Z1pan.js} +1 -1
- package/admin/assets/{te-ByKFS-hT.js → te-DmcKasFF.js} +1 -1
- package/admin/assets/{tet-Bq9OQkFH.js → tet-D6mmvYpQ.js} +1 -1
- package/admin/assets/{tg-BPqYCigR.js → tg-39Hf2-oO.js} +1 -1
- package/admin/assets/{th-m4ghaYsj.js → th-BSmTJSFN.js} +1 -1
- package/admin/assets/{tk-CFxWTO9D.js → tk-m85E5igC.js} +1 -1
- package/admin/assets/{tl-ph-BiBY15io.js → tl-ph-BlYxVvNt.js} +1 -1
- package/admin/assets/{tlh-CyBfXfLa.js → tlh-D1POnIeE.js} +1 -1
- package/admin/assets/{tr-69QiF4Yn.js → tr-BurtfrLy.js} +1 -1
- package/admin/assets/{tzl-BG9jvswA.js → tzl-BvyD0lOf.js} +1 -1
- package/admin/assets/{tzm-IJGtGn0k.js → tzm-DZHS0dK6.js} +1 -1
- package/admin/assets/{tzm-latn-CAelnev_.js → tzm-latn-yNW7CNCH.js} +1 -1
- package/admin/assets/{ug-cn-CKlXJ1Cr.js → ug-cn-rxs2pf5Y.js} +1 -1
- package/admin/assets/{uk-DazXNZ9b.js → uk-CgZM-NnA.js} +1 -1
- package/admin/assets/{ur-BFAjqt9p.js → ur-YxIR8yYD.js} +1 -1
- package/admin/assets/{uz-CjoAOeqe.js → uz-CE9QsQMG.js} +1 -1
- package/admin/assets/{uz-latn-CzIzARA0.js → uz-latn-DiVdSW6G.js} +1 -1
- package/admin/assets/{vi-DZuOT62g.js → vi-DKARV6qf.js} +1 -1
- package/admin/assets/{x-pseudo-DlpsSPis.js → x-pseudo-BuAdOrXQ.js} +1 -1
- package/admin/assets/{yo-BvI53ejW.js → yo-BcB85DhC.js} +1 -1
- package/admin/assets/{zh-ci4y7UyJ.js → zh-DLmxfxzl.js} +1 -1
- package/admin/assets/{zh-cn-CwOh6Lhp.js → zh-cn-ILRADZJi.js} +1 -1
- package/admin/assets/{zh-hk-CPgMd5VF.js → zh-hk-fT7fQk9_.js} +1 -1
- package/admin/assets/{zh-tw-DJiWMOSA.js → zh-tw-NqRXGP6v.js} +1 -1
- package/admin/index.html +1 -1
- package/frontend/assets/{dist-legacy-CFPnugjA.js → dist-legacy-BPToXNXu.js} +1 -1
- package/frontend/assets/index-legacy-CmusDwvl.js +1 -0
- package/frontend/assets/{lib-legacy-CCULxbTk.js → lib-legacy-CBk-_G90.js} +1 -1
- package/frontend/assets/{sha512-legacy-D8zcvvqa.js → sha512-legacy-CWrR2rkQ.js} +1 -1
- package/frontend/index.html +1 -1
- package/npm-shrinkwrap.json +16 -12
- package/package.json +6 -5
- package/src/auth.js +4 -1
- package/src/block.js +4 -3
- package/src/connections.js +3 -2
- package/src/fileAttr.js +5 -1
- package/src/langs/embedded.js +2 -1
- package/src/langs/hfs-lang-pl.json +181 -0
- package/src/listen.js +1 -1
- package/src/middlewares.js +4 -2
- package/src/nat.js +4 -2
- package/src/outboundProxy.js +1 -0
- package/src/selfCheck.js +4 -4
- package/src/serveFile.js +5 -3
- package/src/upload.js +1 -1
- package/src/vfs.js +8 -4
- package/src/webdav.js +12 -0
- package/src/zip.js +3 -2
- package/frontend/assets/index-legacy-CCOgiwQJ.js +0 -1
package/src/middlewares.js
CHANGED
|
@@ -142,9 +142,11 @@ const prepareState = async (ctx, next) => {
|
|
|
142
142
|
};
|
|
143
143
|
exports.prepareState = prepareState;
|
|
144
144
|
function failAllowNet(ctx, a) {
|
|
145
|
-
|
|
145
|
+
// a cached mask is valid only for the identity that stored it
|
|
146
|
+
const sameAccount = ctx.session?.username === (0, perm_1.normalizeUsername)(a?.username || '');
|
|
147
|
+
const cached = sameAccount ? ctx.session?.allowNet : undefined;
|
|
146
148
|
const mask = cached ?? (0, perm_1.getFromAccount)(a || '', a => a.allow_net);
|
|
147
|
-
if (!cached && mask
|
|
149
|
+
if (sameAccount && !cached && mask)
|
|
148
150
|
ctx.session.allowNet = mask; // must be deleted on logout by setLoggedIn
|
|
149
151
|
const ret = mask && !(0, misc_1.netMatches)(ctx.ip, mask, true);
|
|
150
152
|
if (ret)
|
package/src/nat.js
CHANGED
|
@@ -144,8 +144,10 @@ function findGateway() {
|
|
|
144
144
|
return new Promise((resolve, reject) => (0, child_process_1.exec)(const_1.IS_WINDOWS || const_1.IS_MAC ? 'netstat -rn' : 'route -n', (err, out) => {
|
|
145
145
|
if (err)
|
|
146
146
|
return reject(err);
|
|
147
|
-
if (!const_1.IS_WINDOWS)
|
|
148
|
-
|
|
147
|
+
if (!const_1.IS_WINDOWS) {
|
|
148
|
+
// linux route output starts with headers, so its default-route pattern must be multiline
|
|
149
|
+
return resolve(out.match(const_1.IS_MAC ? /default +([\d.]+)/ : /^0\.0\.0\.0 +([\d.]+)/m)?.[1]);
|
|
150
|
+
}
|
|
149
151
|
const sortedByMetric = lodash_1.default.sortBy([...out.matchAll(/(?:0\.0\.0\.0 +){2}([\d.]+)\s+[\d.]+\s+(\d+)/g)], x => Number(x[2]));
|
|
150
152
|
resolve(sortedByMetric[0]?.[1]); // take ip with lowest metric
|
|
151
153
|
}));
|
package/src/outboundProxy.js
CHANGED
|
@@ -6,6 +6,7 @@ const util_os_1 = require("./util-os");
|
|
|
6
6
|
const const_1 = require("./const");
|
|
7
7
|
const cross_1 = require("./cross");
|
|
8
8
|
const outboundProxy = (0, config_1.defineConfig)(cross_1.CFG.outbound_proxy, '', v => {
|
|
9
|
+
util_http_1.httpStream.defaultProxy = undefined;
|
|
9
10
|
if (!v)
|
|
10
11
|
return;
|
|
11
12
|
try {
|
package/src/selfCheck.js
CHANGED
|
@@ -11,10 +11,10 @@ const net_1 = require("net");
|
|
|
11
11
|
const lodash_1 = __importDefault(require("lodash"));
|
|
12
12
|
const cross_1 = require("./cross");
|
|
13
13
|
const util_http_1 = require("./util-http");
|
|
14
|
-
let
|
|
14
|
+
let activeSelfChecks = 0;
|
|
15
15
|
const CHECK_URL = cross_const_1.SPECIAL_URI + 'self-check';
|
|
16
16
|
const selfCheckMiddleware = (ctx, next) => {
|
|
17
|
-
if (!
|
|
17
|
+
if (!activeSelfChecks || !ctx.url.startsWith(CHECK_URL))
|
|
18
18
|
return next();
|
|
19
19
|
ctx.body = 'HFS';
|
|
20
20
|
ctx.state.skipFilters = true;
|
|
@@ -26,7 +26,7 @@ async function selfCheck(url) {
|
|
|
26
26
|
const parsed = new URL(url);
|
|
27
27
|
const family = !(0, net_1.isIP)(parsed.hostname) ? undefined : (0, net_1.isIPv6)(parsed.hostname) ? 6 : 4;
|
|
28
28
|
try {
|
|
29
|
-
|
|
29
|
+
++activeSelfChecks;
|
|
30
30
|
for (const services of lodash_1.default.chunk(lodash_1.default.shuffle(prjInfo.selfCheckServices), 2)) {
|
|
31
31
|
try {
|
|
32
32
|
const results = await Promise.allSettled(services.map(async (svc) => {
|
|
@@ -57,7 +57,7 @@ async function selfCheck(url) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
finally {
|
|
60
|
-
|
|
60
|
+
--activeSelfChecks;
|
|
61
61
|
}
|
|
62
62
|
function applySymbols(s) {
|
|
63
63
|
return s?.replace('$IP', parsed.hostname)
|
package/src/serveFile.js
CHANGED
|
@@ -37,9 +37,11 @@ function forceDownload(ctx, name) {
|
|
|
37
37
|
disposition(ctx, name, true);
|
|
38
38
|
}
|
|
39
39
|
function disposition(ctx, name, forceDownload = false) {
|
|
40
|
-
//
|
|
41
|
-
ctx.
|
|
42
|
-
|
|
40
|
+
// override Koa's question-mark fallback for decomposed Unicode filenames on Windows
|
|
41
|
+
ctx.attachment(name, {
|
|
42
|
+
type: forceDownload ? 'attachment' : 'inline',
|
|
43
|
+
fallback: toAsciiEquivalent(name),
|
|
44
|
+
});
|
|
43
45
|
}
|
|
44
46
|
async function serveFileNode(ctx, node) {
|
|
45
47
|
const { source, mime } = node;
|
package/src/upload.js
CHANGED
|
@@ -132,7 +132,7 @@ function uploadWriter(base, baseUri, filename, ctx) {
|
|
|
132
132
|
// append if resuming
|
|
133
133
|
if (!resume && stats)
|
|
134
134
|
fs_1.default.unlinkSync(tempName);
|
|
135
|
-
const writeStream = (0, misc_1.createStreamLimiter)(contentLength
|
|
135
|
+
const writeStream = (0, misc_1.createStreamLimiter)(isNaN(contentLength) ? Infinity : contentLength);
|
|
136
136
|
const fullSize = stillToWrite + resume;
|
|
137
137
|
// allow plugins to mess with the write-stream, because the read-stream can be complicated in case of multipart
|
|
138
138
|
const obj = { ctx, writeStream, fullPath, tempName, resume, fullSize, uri: '' };
|
package/src/vfs.js
CHANGED
|
@@ -485,10 +485,14 @@ events_1.default.on('accountRenamed', ({ from, to }) => {
|
|
|
485
485
|
})(exports.vfs);
|
|
486
486
|
(0, exports.saveVfs)();
|
|
487
487
|
function renameInPerm(a) {
|
|
488
|
-
if (
|
|
488
|
+
if ((0, misc_1.isWhoObject)(a)) {
|
|
489
|
+
renameInPerm(a.this);
|
|
490
|
+
renameInPerm(a.children);
|
|
489
491
|
return;
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
492
|
+
}
|
|
493
|
+
if (Array.isArray(a))
|
|
494
|
+
for (let i = 0; i < a.length; i++)
|
|
495
|
+
if (a[i] === from)
|
|
496
|
+
a[i] = to;
|
|
493
497
|
}
|
|
494
498
|
});
|
package/src/webdav.js
CHANGED
|
@@ -246,6 +246,18 @@ const webdav = async (ctx, next) => {
|
|
|
246
246
|
}
|
|
247
247
|
async function handleLock() {
|
|
248
248
|
setWebdavHeaders();
|
|
249
|
+
// a lock reserves a future write, so authorize it against the existing resource or its parent
|
|
250
|
+
const node = await (0, vfs_1.urlToNode)(path, ctx);
|
|
251
|
+
const permissionNode = node || await (0, vfs_1.urlToNode)((0, path_1.dirname)(path), ctx);
|
|
252
|
+
if (!permissionNode)
|
|
253
|
+
return ctx.status = cross_1.HTTP_CONFLICT;
|
|
254
|
+
const missingWritePerm = node && canOverwrite.has(path + (0, cross_1.prefix)('|', (0, auth_1.getCurrentUsername)(ctx))) ? 0
|
|
255
|
+
: (0, vfs_1.statusCodeForMissingPerm)(permissionNode, node ? 'can_delete' : 'can_upload', ctx);
|
|
256
|
+
if (missingWritePerm) {
|
|
257
|
+
if (ctx.status === cross_1.HTTP_UNAUTHORIZED)
|
|
258
|
+
setWebdavHeaders(true);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
249
261
|
const body = ctx.length || ctx.get('content-length') || ctx.get('transfer-encoding') ? await (0, consumers_1.text)(ctx.req) : '';
|
|
250
262
|
const token = getProvidedLockToken();
|
|
251
263
|
let seconds = Number(ctx.get('timeout').split(',').find(x => /^Second-\d+$/i.test(x.trim()))?.trim().split('-', 2)[1]);
|
package/src/zip.js
CHANGED
|
@@ -39,8 +39,9 @@ async function zipStreamFromFolder(node, ctx) {
|
|
|
39
39
|
continue;
|
|
40
40
|
if ((0, vfs_1.nodeIsFolder)(subNode)) { // a directory needs to be walked
|
|
41
41
|
if ((0, vfs_1.hasPermission)(subNode, 'can_list', ctx) && (0, vfs_1.hasPermission)(subNode, 'can_archive', ctx)) {
|
|
42
|
-
|
|
43
|
-
yield
|
|
42
|
+
const archivePath = (0, misc_1.pathDecodeSegments)(uri);
|
|
43
|
+
yield { ...subNode, name: archivePath }; // keep empty selected folders at the same path used for their contents
|
|
44
|
+
yield* (0, vfs_1.walkNode)(subNode, { ctx, prefixPath: archivePath + '/', requiredPerm: 'can_archive' });
|
|
44
45
|
}
|
|
45
46
|
continue;
|
|
46
47
|
}
|