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.
Files changed (172) hide show
  1. package/admin/assets/{af-U8Sl5sCM.js → af-BDoqNBMg.js} +1 -1
  2. package/admin/assets/{am-n9TdXja0.js → am-DXBvKJ3X.js} +1 -1
  3. package/admin/assets/{ar-CUpxfuw5.js → ar-BJIoxKTh.js} +1 -1
  4. package/admin/assets/{ar-dz-DC58Z9cj.js → ar-dz-C9l3uc_3.js} +1 -1
  5. package/admin/assets/{ar-iq-BDkrto6W.js → ar-iq-DKH8u2lX.js} +1 -1
  6. package/admin/assets/{ar-kw-Bz806GvG.js → ar-kw-D3gJalQp.js} +1 -1
  7. package/admin/assets/{ar-ly-DW7JaKir.js → ar-ly-BZJzWFeR.js} +1 -1
  8. package/admin/assets/{ar-ma-BuveKbkq.js → ar-ma-DabiOCr0.js} +1 -1
  9. package/admin/assets/{ar-sa-DRvob1Jp.js → ar-sa-C7suzSCY.js} +1 -1
  10. package/admin/assets/{ar-tn-Cae7pfui.js → ar-tn-BvBucEx0.js} +1 -1
  11. package/admin/assets/{az-B7PpjwCU.js → az-CPUppH2M.js} +1 -1
  12. package/admin/assets/{be-DSy_sPdD.js → be-vzvhX2dl.js} +1 -1
  13. package/admin/assets/{bg-Djacfatx.js → bg-09Xbj_Y3.js} +1 -1
  14. package/admin/assets/{bi-DOLGYGEN.js → bi-CvhiuiE9.js} +1 -1
  15. package/admin/assets/{bm-BmR133he.js → bm-DtJAZAkZ.js} +1 -1
  16. package/admin/assets/{bn-DsjLUmm3.js → bn-Dnzh2x6I.js} +1 -1
  17. package/admin/assets/{bn-bd-C3SafRtu.js → bn-bd-xEy4797g.js} +1 -1
  18. package/admin/assets/{bo-DsMRUw9A.js → bo-vuPmptG3.js} +1 -1
  19. package/admin/assets/{br-BxR8Zm95.js → br-C9xH4OD3.js} +1 -1
  20. package/admin/assets/{bs-gH68uvCb.js → bs-BB_uCUp1.js} +1 -1
  21. package/admin/assets/{ca-DfGL180b.js → ca-D7LKaf98.js} +1 -1
  22. package/admin/assets/{cs-D4lFVAq6.js → cs-DMFTNdNC.js} +1 -1
  23. package/admin/assets/{cv-CFyqoRN7.js → cv-DNUjJwnO.js} +1 -1
  24. package/admin/assets/{cy-DuubtylZ.js → cy-qmAOTPwC.js} +1 -1
  25. package/admin/assets/{da-Cp7c-T-B.js → da-DDX54iM9.js} +1 -1
  26. package/admin/assets/{de-CeQXU72n.js → de-BBmlsfbM.js} +1 -1
  27. package/admin/assets/{de-at-Cx01BLTk.js → de-at-CuMZqYfu.js} +1 -1
  28. package/admin/assets/{de-ch-K5Vn_bWQ.js → de-ch-s8OXKb-5.js} +1 -1
  29. package/admin/assets/{dist-CfPsVFTp.js → dist-CHP3cW_n.js} +1 -1
  30. package/admin/assets/{dv-DB4pdLQj.js → dv-Cjs3QDBN.js} +1 -1
  31. package/admin/assets/{el-CNA5lg_z.js → el-BsAOrUDP.js} +1 -1
  32. package/admin/assets/{en-Bpua-Wb5.js → en-DQ460ET7.js} +1 -1
  33. package/admin/assets/{en-au-CKwJ7DKC.js → en-au-8tMHM2OT.js} +1 -1
  34. package/admin/assets/{en-ca-D8vKBgWW.js → en-ca-c9jM4M_8.js} +1 -1
  35. package/admin/assets/{en-in-Bhx4y1uu.js → en-gb-unFIXx9f.js} +1 -1
  36. package/admin/assets/{en-ie-0gd4plad.js → en-ie-D4_e3kV6.js} +1 -1
  37. package/admin/assets/{en-il-BYIz25Pw.js → en-il-BoaZOven.js} +1 -1
  38. package/admin/assets/{en-tt-Bk-if7Re.js → en-in-D2ULzXMp.js} +1 -1
  39. package/admin/assets/{en-nz-CtIJOjgh.js → en-nz-grrmB3dg.js} +1 -1
  40. package/admin/assets/{en-sg-iygWx8GW.js → en-sg-Cmqxpoir.js} +1 -1
  41. package/admin/assets/{en-gb-C3jRv20Y.js → en-tt-Cn72OR4N.js} +1 -1
  42. package/admin/assets/{eo-DAvER5ej.js → eo-Cqxmc0TT.js} +1 -1
  43. package/admin/assets/{es-C98a0Ggy.js → es-CkjKdFZ3.js} +1 -1
  44. package/admin/assets/{es-do-TCakoZXN.js → es-do-CTcTshup.js} +1 -1
  45. package/admin/assets/{es-mx-BCj7c6Zn.js → es-mx-DMXgMMxs.js} +1 -1
  46. package/admin/assets/{es-pr-rsR3Q8oM.js → es-pr-DNCV91L3.js} +1 -1
  47. package/admin/assets/{es-us-DC9NM1XV.js → es-us-C7o2mlIH.js} +1 -1
  48. package/admin/assets/{esm-BQaMpob3.js → esm-DvUbRuYx.js} +1 -1
  49. package/admin/assets/{et-tJ-d1AZX.js → et-DaPpH-gK.js} +1 -1
  50. package/admin/assets/{eu-xzUajtaj.js → eu-DfKyFruu.js} +1 -1
  51. package/admin/assets/{fa-kR15gQkC.js → fa-xWrBjePb.js} +1 -1
  52. package/admin/assets/{fi-DQjRBOgG.js → fi-BOWDMsDS.js} +1 -1
  53. package/admin/assets/{fo-BHMXHU45.js → fo-B3FupW8R.js} +1 -1
  54. package/admin/assets/{fr-DGS71Nvo.js → fr-DZBDBkwp.js} +1 -1
  55. package/admin/assets/{fr-ca-Bkzyy0tT.js → fr-ca-CRePPJJ5.js} +1 -1
  56. package/admin/assets/{fr-ch-BRrWrRWV.js → fr-ch-pFKvYU8D.js} +1 -1
  57. package/admin/assets/{fy-Dkv180q7.js → fy-0k7RzHUH.js} +1 -1
  58. package/admin/assets/{ga-xsoXuVDY.js → ga-D31rB2ys.js} +1 -1
  59. package/admin/assets/{gd-cLPVqYdG.js → gd-CbgY-FFE.js} +1 -1
  60. package/admin/assets/{gl-BUG0DHTt.js → gl-DrtvS9gt.js} +1 -1
  61. package/admin/assets/{gom-latn-BKRncAa1.js → gom-latn-Dkke3GyE.js} +1 -1
  62. package/admin/assets/{gu-BpmXErqK.js → gu-BlEipYhR.js} +1 -1
  63. package/admin/assets/{he-DNxd9A8z.js → he-BrHT6OLB.js} +1 -1
  64. package/admin/assets/{hi-dNFE6t75.js → hi-Bx0zlAgr.js} +1 -1
  65. package/admin/assets/{hr-DNZiZtn4.js → hr-CoFYGbr6.js} +1 -1
  66. package/admin/assets/{ht-B1LoCeln.js → ht-Df5xKo4a.js} +1 -1
  67. package/admin/assets/{hu-q6SYps3j.js → hu-BFTN3q6-.js} +1 -1
  68. package/admin/assets/{hy-am-BLa2HL3i.js → hy-am-DuZTJQed.js} +1 -1
  69. package/admin/assets/{id-4zvXdXSK.js → id-DBZ5nPkf.js} +1 -1
  70. package/admin/assets/{index-D2UH6ajh.js → index-BGIe1xaR.js} +57 -57
  71. package/admin/assets/{is-B7wmPDNy.js → is-CmeHm47B.js} +1 -1
  72. package/admin/assets/{it-CGm31WTp.js → it-Cv3fjOA9.js} +1 -1
  73. package/admin/assets/{it-ch-HfVNoF64.js → it-ch-DCTyHA3T.js} +1 -1
  74. package/admin/assets/{ja-RGFi1Jc2.js → ja-DHNVXAM5.js} +1 -1
  75. package/admin/assets/{jv-BclbE5yu.js → jv-BdNIxhWv.js} +1 -1
  76. package/admin/assets/{ka-D3ZrxVjT.js → ka-D-joD0QB.js} +1 -1
  77. package/admin/assets/{kk-B7aIapNy.js → kk-8wRNNjxz.js} +1 -1
  78. package/admin/assets/{km-DPwsGner.js → km-dUWOg1uK.js} +1 -1
  79. package/admin/assets/{kn-CuXmm_DG.js → kn-CwQbzel0.js} +1 -1
  80. package/admin/assets/{ko-BlPgy9aF.js → ko-D_gn9Sfw.js} +1 -1
  81. package/admin/assets/{ku-B6w51rl_.js → ku-Dh3MRML3.js} +1 -1
  82. package/admin/assets/{ky-RLmSGZmf.js → ky-CWYuRvil.js} +1 -1
  83. package/admin/assets/{lb-AKcfj05J.js → lb-Cc2xsSIx.js} +1 -1
  84. package/admin/assets/{lo-VBKOzJn1.js → lo-CkwNFDBz.js} +1 -1
  85. package/admin/assets/{lt-53JaHFcf.js → lt-HWyFDLXu.js} +1 -1
  86. package/admin/assets/{lv-DGOgmu9w.js → lv-C7Zx3OLO.js} +1 -1
  87. package/admin/assets/{me-zNrvFUXX.js → me-DH3AqnfF.js} +1 -1
  88. package/admin/assets/{mi-BBDE1uK4.js → mi-DMmUry6m.js} +1 -1
  89. package/admin/assets/{mk-2LiSrAS9.js → mk-D6MNZrzX.js} +1 -1
  90. package/admin/assets/{ml-BEwbrVql.js → ml-B_ur8Zqf.js} +1 -1
  91. package/admin/assets/{mn-LuMGd2Ic.js → mn-DeL8Ry7x.js} +1 -1
  92. package/admin/assets/{mr-C_dFhleR.js → mr-C01qRXFL.js} +1 -1
  93. package/admin/assets/{ms-BHnmZJI4.js → ms-DFUZJzOm.js} +1 -1
  94. package/admin/assets/{ms-my-FcVPbGSE.js → ms-my-CUYHkebs.js} +1 -1
  95. package/admin/assets/{mt-DzhvOV5Z.js → mt-CE8t5jSj.js} +1 -1
  96. package/admin/assets/{my-Mmp3v0PH.js → my-Df96A8jZ.js} +1 -1
  97. package/admin/assets/{nb-CYPvI8e3.js → nb-D0837ewu.js} +1 -1
  98. package/admin/assets/{ne-BtVsV5BN.js → ne-BdK5TR0R.js} +1 -1
  99. package/admin/assets/{nl-be-X-pQSY5N.js → nl-be-BfVC0cur.js} +1 -1
  100. package/admin/assets/{nl-C6aRDFNr.js → nl-oYKmSma6.js} +1 -1
  101. package/admin/assets/{nn-C1m9zYBT.js → nn-IEUPnyc8.js} +1 -1
  102. package/admin/assets/{oc-lnc-CFT7xZs-.js → oc-lnc-g_wSIROr.js} +1 -1
  103. package/admin/assets/{pa-in-Bby4AmI2.js → pa-in-gWhcLmZE.js} +1 -1
  104. package/admin/assets/{pl-MmIf2tXf.js → pl-H3-LoxVn.js} +1 -1
  105. package/admin/assets/{pt-br-Cu8EXyIK.js → pt-br-B8UcNR6_.js} +1 -1
  106. package/admin/assets/{pt-DHCh_z9j.js → pt-hiX8RqVw.js} +1 -1
  107. package/admin/assets/{rn-DZUJ5hf0.js → rn-BKupViLr.js} +1 -1
  108. package/admin/assets/{ro-BRHg1GDk.js → ro-DmhgIvml.js} +1 -1
  109. package/admin/assets/{ru-Wv8fMN5W.js → ru-CcpO-b8g.js} +1 -1
  110. package/admin/assets/{rw-B_XP1EHM.js → rw-DWX_5ZK0.js} +1 -1
  111. package/admin/assets/{sd-_X3CAPlB.js → sd-Dat8YgLw.js} +1 -1
  112. package/admin/assets/{se-FItkWaOK.js → se-nTBYCwx3.js} +1 -1
  113. package/admin/assets/{sha512-UQMP5wnF.js → sha512-CZz40GwW.js} +1 -1
  114. package/admin/assets/{si-DhVYEiDt.js → si-DG88w5El.js} +1 -1
  115. package/admin/assets/{sk-cWZR9gF4.js → sk-s5FxW36J.js} +1 -1
  116. package/admin/assets/{sl-CJckZkV8.js → sl-B-HyGrpA.js} +1 -1
  117. package/admin/assets/{sq-B7eoM8fS.js → sq-DPFtfEC8.js} +1 -1
  118. package/admin/assets/{sr-SfiQA7kg.js → sr-bBPg1zz4.js} +1 -1
  119. package/admin/assets/{sr-cyrl-Db8Rrl0U.js → sr-cyrl-cXkYHMcP.js} +1 -1
  120. package/admin/assets/{ss-Bian2WDB.js → ss-7nSqXJN7.js} +1 -1
  121. package/admin/assets/{sv-D-Dsf8uN.js → sv-B8mG1QK4.js} +1 -1
  122. package/admin/assets/{sv-fi-BBv1GPVJ.js → sv-fi-CotGRXSH.js} +1 -1
  123. package/admin/assets/{sw-BIzZvuq6.js → sw-fAxU-Uck.js} +1 -1
  124. package/admin/assets/{ta-C2JoHqar.js → ta-Dl0Z1pan.js} +1 -1
  125. package/admin/assets/{te-ByKFS-hT.js → te-DmcKasFF.js} +1 -1
  126. package/admin/assets/{tet-Bq9OQkFH.js → tet-D6mmvYpQ.js} +1 -1
  127. package/admin/assets/{tg-BPqYCigR.js → tg-39Hf2-oO.js} +1 -1
  128. package/admin/assets/{th-m4ghaYsj.js → th-BSmTJSFN.js} +1 -1
  129. package/admin/assets/{tk-CFxWTO9D.js → tk-m85E5igC.js} +1 -1
  130. package/admin/assets/{tl-ph-BiBY15io.js → tl-ph-BlYxVvNt.js} +1 -1
  131. package/admin/assets/{tlh-CyBfXfLa.js → tlh-D1POnIeE.js} +1 -1
  132. package/admin/assets/{tr-69QiF4Yn.js → tr-BurtfrLy.js} +1 -1
  133. package/admin/assets/{tzl-BG9jvswA.js → tzl-BvyD0lOf.js} +1 -1
  134. package/admin/assets/{tzm-IJGtGn0k.js → tzm-DZHS0dK6.js} +1 -1
  135. package/admin/assets/{tzm-latn-CAelnev_.js → tzm-latn-yNW7CNCH.js} +1 -1
  136. package/admin/assets/{ug-cn-CKlXJ1Cr.js → ug-cn-rxs2pf5Y.js} +1 -1
  137. package/admin/assets/{uk-DazXNZ9b.js → uk-CgZM-NnA.js} +1 -1
  138. package/admin/assets/{ur-BFAjqt9p.js → ur-YxIR8yYD.js} +1 -1
  139. package/admin/assets/{uz-CjoAOeqe.js → uz-CE9QsQMG.js} +1 -1
  140. package/admin/assets/{uz-latn-CzIzARA0.js → uz-latn-DiVdSW6G.js} +1 -1
  141. package/admin/assets/{vi-DZuOT62g.js → vi-DKARV6qf.js} +1 -1
  142. package/admin/assets/{x-pseudo-DlpsSPis.js → x-pseudo-BuAdOrXQ.js} +1 -1
  143. package/admin/assets/{yo-BvI53ejW.js → yo-BcB85DhC.js} +1 -1
  144. package/admin/assets/{zh-ci4y7UyJ.js → zh-DLmxfxzl.js} +1 -1
  145. package/admin/assets/{zh-cn-CwOh6Lhp.js → zh-cn-ILRADZJi.js} +1 -1
  146. package/admin/assets/{zh-hk-CPgMd5VF.js → zh-hk-fT7fQk9_.js} +1 -1
  147. package/admin/assets/{zh-tw-DJiWMOSA.js → zh-tw-NqRXGP6v.js} +1 -1
  148. package/admin/index.html +1 -1
  149. package/frontend/assets/{dist-legacy-CFPnugjA.js → dist-legacy-BPToXNXu.js} +1 -1
  150. package/frontend/assets/index-legacy-CmusDwvl.js +1 -0
  151. package/frontend/assets/{lib-legacy-CCULxbTk.js → lib-legacy-CBk-_G90.js} +1 -1
  152. package/frontend/assets/{sha512-legacy-D8zcvvqa.js → sha512-legacy-CWrR2rkQ.js} +1 -1
  153. package/frontend/index.html +1 -1
  154. package/npm-shrinkwrap.json +16 -12
  155. package/package.json +6 -5
  156. package/src/auth.js +4 -1
  157. package/src/block.js +4 -3
  158. package/src/connections.js +3 -2
  159. package/src/fileAttr.js +5 -1
  160. package/src/langs/embedded.js +2 -1
  161. package/src/langs/hfs-lang-pl.json +181 -0
  162. package/src/listen.js +1 -1
  163. package/src/middlewares.js +4 -2
  164. package/src/nat.js +4 -2
  165. package/src/outboundProxy.js +1 -0
  166. package/src/selfCheck.js +4 -4
  167. package/src/serveFile.js +5 -3
  168. package/src/upload.js +1 -1
  169. package/src/vfs.js +8 -4
  170. package/src/webdav.js +12 -0
  171. package/src/zip.js +3 -2
  172. package/frontend/assets/index-legacy-CCOgiwQJ.js +0 -1
@@ -142,9 +142,11 @@ const prepareState = async (ctx, next) => {
142
142
  };
143
143
  exports.prepareState = prepareState;
144
144
  function failAllowNet(ctx, a) {
145
- const cached = ctx.session?.allowNet; // won't reflect changes until session is terminated
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 && ctx.session?.username)
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
- return resolve(out.match(const_1.IS_MAC ? /default +([\d.]+)/ : /^0\.0\.0\.0 +([\d.]+)/)?.[1]);
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
  }));
@@ -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 selfChecking = false;
14
+ let activeSelfChecks = 0;
15
15
  const CHECK_URL = cross_const_1.SPECIAL_URI + 'self-check';
16
16
  const selfCheckMiddleware = (ctx, next) => {
17
- if (!selfChecking || !ctx.url.startsWith(CHECK_URL))
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
- selfChecking = true;
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
- selfChecking = false;
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
- // ctx.attachment is not working well on Windows. Eg: for the file "èÖ.txt" it is producing `Content-Disposition: attachment; filename="??.txt"`. Koa uses module content-disposition, that actually produces a better result anyway: ``
41
- ctx.set('Content-Disposition', (forceDownload ? 'attachment; ' : '')
42
- + `filename="${toAsciiEquivalent(name)}"; filename*=UTF-8''${encodeURIComponent(name)}`);
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 ?? Infinity);
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 (!Array.isArray(a))
488
+ if ((0, misc_1.isWhoObject)(a)) {
489
+ renameInPerm(a.this);
490
+ renameInPerm(a.children);
489
491
  return;
490
- for (let i = 0; i < a.length; i++)
491
- if (a[i] === from)
492
- a[i] = to;
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
- yield subNode; // it could be empty
43
- yield* (0, vfs_1.walkNode)(subNode, { ctx, prefixPath: (0, misc_1.pathDecodeSegments)(uri) + '/', requiredPerm: 'can_archive' });
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
  }