@sync-in/server 1.8.1 → 1.9.1

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 (605) hide show
  1. package/CHANGELOG.md +57 -11
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +15 -15
  4. package/server/app.constants.js +9 -0
  5. package/server/app.constants.js.map +1 -1
  6. package/server/app.functions.js +42 -0
  7. package/server/app.functions.js.map +1 -0
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +88 -8
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +11 -4
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +38 -8
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/files.js +1 -1
  65. package/server/applications/files/utils/files.js.map +1 -1
  66. package/server/applications/files/utils/send-file.js +3 -2
  67. package/server/applications/files/utils/send-file.js.map +1 -1
  68. package/server/applications/links/services/links-queries.service.js +1 -1
  69. package/server/applications/links/services/links-queries.service.js.map +1 -1
  70. package/server/applications/notifications/constants/notifications.js +5 -1
  71. package/server/applications/notifications/constants/notifications.js.map +1 -1
  72. package/server/applications/notifications/i18n/de.js +8 -2
  73. package/server/applications/notifications/i18n/de.js.map +1 -1
  74. package/server/applications/notifications/i18n/es.js +8 -2
  75. package/server/applications/notifications/i18n/es.js.map +1 -1
  76. package/server/applications/notifications/i18n/fr.js +8 -2
  77. package/server/applications/notifications/i18n/fr.js.map +1 -1
  78. package/server/applications/notifications/i18n/hi.js +8 -2
  79. package/server/applications/notifications/i18n/hi.js.map +1 -1
  80. package/server/applications/notifications/i18n/it.js +8 -2
  81. package/server/applications/notifications/i18n/it.js.map +1 -1
  82. package/server/applications/notifications/i18n/ja.js +8 -2
  83. package/server/applications/notifications/i18n/ja.js.map +1 -1
  84. package/server/applications/notifications/i18n/ko.js +8 -2
  85. package/server/applications/notifications/i18n/ko.js.map +1 -1
  86. package/server/applications/notifications/i18n/pl.js +8 -2
  87. package/server/applications/notifications/i18n/pl.js.map +1 -1
  88. package/server/applications/notifications/i18n/pt.js +8 -2
  89. package/server/applications/notifications/i18n/pt.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt_br.js +8 -2
  91. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  92. package/server/applications/notifications/i18n/ru.js +8 -2
  93. package/server/applications/notifications/i18n/ru.js.map +1 -1
  94. package/server/applications/notifications/i18n/tr.js +8 -2
  95. package/server/applications/notifications/i18n/tr.js.map +1 -1
  96. package/server/applications/notifications/i18n/zh.js +8 -2
  97. package/server/applications/notifications/i18n/zh.js.map +1 -1
  98. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  99. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  100. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  101. package/server/applications/notifications/mails/models.js +38 -3
  102. package/server/applications/notifications/mails/models.js.map +1 -1
  103. package/server/applications/notifications/mails/templates.js +1 -1
  104. package/server/applications/notifications/mails/templates.js.map +1 -1
  105. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  106. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  108. package/server/applications/shares/services/shares-manager.service.js +17 -10
  109. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  111. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  112. package/server/applications/shares/services/shares-queries.service.js +11 -1
  113. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  114. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  115. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  116. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  117. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  119. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  121. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  122. package/server/applications/spaces/utils/permissions.js +2 -2
  123. package/server/applications/spaces/utils/permissions.js.map +1 -1
  124. package/server/applications/sync/services/sync-manager.service.js +1 -0
  125. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  126. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  127. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  130. package/server/applications/users/constants/user.js +1 -1
  131. package/server/applications/users/constants/user.js.map +1 -1
  132. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  133. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  134. package/server/applications/users/services/users-queries.service.js +67 -68
  135. package/server/applications/users/services/users-queries.service.js.map +1 -1
  136. package/server/applications/users/users.module.js +2 -1
  137. package/server/applications/users/users.module.js.map +1 -1
  138. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  139. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  140. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  141. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  142. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  143. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  144. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  145. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  146. package/server/authentication/constants/auth-ldap.js +2 -0
  147. package/server/authentication/constants/auth-ldap.js.map +1 -1
  148. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  149. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  150. package/server/common/functions.js +0 -8
  151. package/server/common/functions.js.map +1 -1
  152. package/server/common/image.js +1 -0
  153. package/server/common/image.js.map +1 -1
  154. package/server/common/shared.js +18 -1
  155. package/server/common/shared.js.map +1 -1
  156. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  157. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  158. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  159. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  160. package/static/3rdpartylicenses.txt +1393 -44
  161. package/static/assets/favicon.svg +2 -25
  162. package/static/assets/logo-dark.svg +2 -32
  163. package/static/assets/logo.svg +2 -32
  164. package/static/assets/mimes/application-sql.svg +29 -1
  165. package/static/assets/mimes/application-x-sql.svg +29 -0
  166. package/static/assets/mimes/image-bmp.svg +12 -0
  167. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  168. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  169. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  170. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  171. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  172. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  173. package/static/assets/pdfjs/version +1 -1
  174. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  175. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  176. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  177. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  178. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  179. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  180. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  181. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  182. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  183. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  184. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  185. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  186. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  187. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  189. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  190. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  191. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  192. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  194. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  195. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  196. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  198. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  200. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  202. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  203. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  204. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  205. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  206. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  207. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  208. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  209. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  210. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  211. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  212. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  213. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  214. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  216. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  217. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  218. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  219. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  220. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  222. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  223. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  224. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  225. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  226. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  227. package/static/assets/pdfjs/web/viewer.css +141 -110
  228. package/static/assets/pdfjs/web/viewer.html +7 -7
  229. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  230. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  231. package/static/chunk-22DWHRCL.js +1 -0
  232. package/static/chunk-23UUFZSR.js +1 -0
  233. package/static/chunk-25QTY2GI.js +1 -0
  234. package/static/chunk-2E7IJZLL.js +1 -0
  235. package/static/chunk-2FC5EKS5.js +1 -0
  236. package/static/chunk-2TB2INBF.js +1 -0
  237. package/static/chunk-32L7RG2G.js +1 -0
  238. package/static/chunk-3OHSTP3R.js +1 -0
  239. package/static/chunk-3WLBVJ2S.js +1 -0
  240. package/static/{chunk-MTVSJTIW.js → chunk-3YDYZLF7.js} +1 -1
  241. package/static/chunk-42L6C5MT.js +1 -0
  242. package/static/chunk-4AGQL5GV.js +1 -0
  243. package/static/chunk-4BPSQMI2.js +1 -0
  244. package/static/chunk-4FDRWZWT.js +1 -0
  245. package/static/chunk-4GCCF6PF.js +1 -0
  246. package/static/chunk-4ORP3SBY.js +1 -0
  247. package/static/chunk-4PZPHJ7L.js +1 -0
  248. package/static/chunk-4QBOHIC3.js +1 -0
  249. package/static/chunk-4YT6K5KY.js +1 -0
  250. package/static/chunk-556I6YIW.js +1 -0
  251. package/static/chunk-5DPIGJU4.js +1 -0
  252. package/static/chunk-5E3TYOL3.js +1 -0
  253. package/static/chunk-5IL7C45D.js +1 -0
  254. package/static/chunk-5KJXGMKR.js +1 -0
  255. package/static/chunk-5S6KPQRA.js +1 -0
  256. package/static/chunk-5SPGSHKL.js +1 -0
  257. package/static/chunk-5WCQBTXW.js +1 -0
  258. package/static/chunk-5XUIPWOH.js +1 -0
  259. package/static/chunk-62WT7PI3.js +1 -0
  260. package/static/chunk-6B3GGAV3.js +4 -0
  261. package/static/chunk-6F6OMQ5H.js +1 -0
  262. package/static/chunk-6I5BGQHT.js +1 -0
  263. package/static/chunk-6NEBGCAZ.js +1 -0
  264. package/static/chunk-6NOS45DG.js +1 -0
  265. package/static/chunk-6OKLPRCD.js +1 -0
  266. package/static/chunk-6VEJCG43.js +1 -0
  267. package/static/chunk-77SS36Z2.js +1 -0
  268. package/static/chunk-7AXEPO3G.js +1 -0
  269. package/static/chunk-7CKHC72R.js +1 -0
  270. package/static/chunk-7DUTYOJG.js +1 -0
  271. package/static/chunk-7HKFYRPF.js +1 -0
  272. package/static/chunk-7NZJZATZ.js +1 -0
  273. package/static/chunk-AADK5D2H.js +1 -0
  274. package/static/chunk-ACUF7IKP.js +1 -0
  275. package/static/chunk-AGREZPV4.js +1 -0
  276. package/static/chunk-ATBJWFA3.js +1 -0
  277. package/static/chunk-ATXLZN2B.js +1 -0
  278. package/static/chunk-AZ5TF5Y3.js +1 -0
  279. package/static/chunk-BBHYIURC.js +1 -0
  280. package/static/chunk-BHZEPHRI.js +13 -0
  281. package/static/chunk-BODMMLVB.js +7 -0
  282. package/static/chunk-BSB4VROD.js +2 -0
  283. package/static/chunk-BU4ZICZR.js +1 -0
  284. package/static/chunk-C3AAEQKW.js +1 -0
  285. package/static/chunk-CFTKW432.js +1 -0
  286. package/static/chunk-CNOVT6KU.js +1 -0
  287. package/static/chunk-D56H3XE2.js +1 -0
  288. package/static/chunk-DFOOSIIA.js +1 -0
  289. package/static/chunk-DHFQIFOF.js +1 -0
  290. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  291. package/static/chunk-DJDRX53V.js +2 -0
  292. package/static/chunk-DKGXUMLT.js +1 -0
  293. package/static/chunk-DQ3GEMPM.js +1 -0
  294. package/static/chunk-DRHPEERW.js +2 -0
  295. package/static/chunk-DWYP6ZGG.js +1 -0
  296. package/static/chunk-EDJAISWO.js +13 -0
  297. package/static/chunk-EIYRBM4J.js +1 -0
  298. package/static/chunk-EL6QL4TP.js +1 -0
  299. package/static/chunk-ERDZ7IVF.js +1 -0
  300. package/static/chunk-EVQKKVUZ.js +1 -0
  301. package/static/chunk-F2XG7EWI.js +1 -0
  302. package/static/chunk-F672FY5I.js +1 -0
  303. package/static/chunk-F6V37MKG.js +1 -0
  304. package/static/chunk-FCGTI42I.js +1 -0
  305. package/static/chunk-FNOTGWRW.js +1 -0
  306. package/static/chunk-FQHOSSCO.js +1 -0
  307. package/static/chunk-GAGHHYLF.js +1 -0
  308. package/static/chunk-GNZPP2VO.js +1 -0
  309. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  310. package/static/chunk-GRLHFXGB.js +1 -0
  311. package/static/chunk-H6WOTGQ5.js +1 -0
  312. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  313. package/static/chunk-HC7F57NA.js +1 -0
  314. package/static/chunk-HCSWO7BO.js +7 -0
  315. package/static/chunk-HHWXIK2M.js +7 -0
  316. package/static/chunk-HKRGIRKB.js +3 -0
  317. package/static/chunk-HMOB6XC5.js +1 -0
  318. package/static/chunk-HNMGPG72.js +1 -0
  319. package/static/chunk-HS4S6BV3.js +1 -0
  320. package/static/chunk-I2S3XPC5.js +3 -0
  321. package/static/chunk-IJ7K7ATQ.js +1 -0
  322. package/static/chunk-IOIBQGHN.js +562 -0
  323. package/static/chunk-ITVA26X2.js +2 -0
  324. package/static/chunk-J6YSFHLZ.js +1 -0
  325. package/static/chunk-JAEJ6IMV.js +1 -0
  326. package/static/chunk-JB5R6V33.js +1 -0
  327. package/static/chunk-JF6WIV6M.js +1 -0
  328. package/static/chunk-JGB4LLUT.js +1 -0
  329. package/static/chunk-JGXVTKLG.js +1 -0
  330. package/static/chunk-JMYAD7E2.js +1 -0
  331. package/static/chunk-JSE63Q5X.js +1 -0
  332. package/static/chunk-JVV3ZL6L.js +1 -0
  333. package/static/chunk-JWPXQOS3.js +5 -0
  334. package/static/chunk-JXZCNFW7.js +1 -0
  335. package/static/chunk-JY2I3HGL.js +1 -0
  336. package/static/chunk-K657XPXA.js +1 -0
  337. package/static/chunk-KAVP6UXH.js +1 -0
  338. package/static/{chunk-3R74L4UU.js → chunk-KDEEERWZ.js} +1 -1
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KT3TWCST.js +1 -0
  342. package/static/chunk-L6SYG23T.js +1 -0
  343. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  344. package/static/chunk-LRQSPCYZ.js +1 -0
  345. package/static/chunk-LUSVISM6.js +1 -0
  346. package/static/{chunk-LVSNIS5P.js → chunk-LYZGJZNP.js} +1 -1
  347. package/static/chunk-LZKI5P5T.js +1 -0
  348. package/static/chunk-M4XL3JN5.js +6 -0
  349. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  350. package/static/chunk-MIA5YBOI.js +1 -0
  351. package/static/chunk-MKUUWY6Y.js +1 -0
  352. package/static/chunk-MR3U7TKQ.js +1 -0
  353. package/static/chunk-MYM43ENO.js +1 -0
  354. package/static/chunk-NAH4V2R6.js +2 -0
  355. package/static/chunk-NBBDVVUF.js +1 -0
  356. package/static/chunk-NKGKBQBX.js +1 -0
  357. package/static/chunk-NMF2ZFBE.js +1 -0
  358. package/static/chunk-NN4ONTOT.js +1 -0
  359. package/static/chunk-NOPACN4F.js +1 -0
  360. package/static/chunk-NYJPOP4L.js +1 -0
  361. package/static/chunk-OQRWXCLY.js +1 -0
  362. package/static/chunk-PCFH5HCI.js +2 -0
  363. package/static/chunk-PJF5XUTO.js +1 -0
  364. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  365. package/static/chunk-PTLYIUFW.js +1 -0
  366. package/static/chunk-PXRT4L57.js +1 -0
  367. package/static/chunk-PZGLDZZM.js +1 -0
  368. package/static/chunk-Q4VNZGFI.js +1 -0
  369. package/static/chunk-Q556XB3S.js +1 -0
  370. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  371. package/static/chunk-Q7U2VPIS.js +1 -0
  372. package/static/chunk-QM6CQMEX.js +1 -0
  373. package/static/chunk-QMHUIHSR.js +1 -0
  374. package/static/chunk-QVFPHTOH.js +1 -0
  375. package/static/chunk-R4MI25E2.js +1 -0
  376. package/static/chunk-R7JRAR3P.js +1 -0
  377. package/static/chunk-R7PNKQU2.js +1 -0
  378. package/static/chunk-RCAORRB7.js +1 -0
  379. package/static/chunk-RDNTK4YH.js +1 -0
  380. package/static/{chunk-VJTXJ43D.js → chunk-RK2ONYTL.js} +1 -1
  381. package/static/chunk-RK7XRDNB.js +1 -0
  382. package/static/chunk-RO7SAOLK.js +1 -0
  383. package/static/chunk-RQUUINHV.js +1 -0
  384. package/static/chunk-RUN556VW.js +1 -0
  385. package/static/chunk-S2VBGI6Q.js +1 -0
  386. package/static/chunk-S7S5M3AZ.js +1 -0
  387. package/static/chunk-SBLNYV74.js +1 -0
  388. package/static/chunk-SIZCHHUA.js +1 -0
  389. package/static/chunk-SRBOO7AO.js +1 -0
  390. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  391. package/static/chunk-T3YI3BSS.js +1 -0
  392. package/static/chunk-TAL3RTTQ.js +1 -0
  393. package/static/chunk-TGLJFALR.js +1 -0
  394. package/static/chunk-TJZKTNNS.js +1 -0
  395. package/static/chunk-U4RW6XG5.js +1 -0
  396. package/static/chunk-UJTFWZEC.js +1 -0
  397. package/static/chunk-UPGVU5LG.js +1 -0
  398. package/static/chunk-UQ6O3I6W.js +1 -0
  399. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  400. package/static/chunk-V6FA5QY4.js +1 -0
  401. package/static/chunk-VK7XMFVE.js +1 -0
  402. package/static/chunk-VQJYCYWI.js +1 -0
  403. package/static/chunk-VWIRXLNE.js +1 -0
  404. package/static/chunk-VZMVGIVW.js +1 -0
  405. package/static/chunk-VZPCXSRG.js +2 -0
  406. package/static/chunk-WR3MA3L3.js +1 -0
  407. package/static/chunk-XCLK7NJL.js +1 -0
  408. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  409. package/static/chunk-XEGHEUP5.js +1 -0
  410. package/static/chunk-XKEBQNQJ.js +1 -0
  411. package/static/chunk-XOF4UW3S.js +1 -0
  412. package/static/chunk-XQGPSNQB.js +1 -0
  413. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  414. package/static/chunk-Y5RLD72B.js +1 -0
  415. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  416. package/static/chunk-Y63UUJGJ.js +1 -0
  417. package/static/chunk-YBNAC7QM.js +1 -0
  418. package/static/chunk-YCTCESL4.js +1 -0
  419. package/static/chunk-YMAN4LIU.js +1 -0
  420. package/static/chunk-YTDE6SXT.js +1 -0
  421. package/static/chunk-YZPIUJB3.js +1 -0
  422. package/static/chunk-ZCOWBVOT.js +1 -0
  423. package/static/chunk-ZHRYYMYE.js +1 -0
  424. package/static/chunk-ZNXTOQFG.js +1 -0
  425. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  426. package/static/chunk-ZXXHFBGL.js +1 -0
  427. package/static/favicon.ico +0 -0
  428. package/static/index.html +2 -2
  429. package/static/main-56PZQ6TJ.js +11 -0
  430. package/static/styles-Q4OZOSSK.css +1 -0
  431. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  432. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  433. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  434. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  435. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  436. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  437. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  438. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  439. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  440. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  441. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  442. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  443. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  444. package/static/assets/codemirror/mode/css/css.js +0 -862
  445. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  446. package/static/assets/codemirror/mode/d/d.js +0 -223
  447. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  448. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  449. package/static/assets/codemirror/mode/django/django.js +0 -356
  450. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  451. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  452. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  453. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  454. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  455. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  456. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  457. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  458. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  459. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  460. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  461. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  462. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  463. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  464. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  465. package/static/assets/codemirror/mode/go/go.js +0 -187
  466. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  467. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  468. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  469. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  470. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  471. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  472. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  473. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  474. package/static/assets/codemirror/mode/http/http.js +0 -113
  475. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  476. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  477. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  478. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  479. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  480. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  481. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  482. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  483. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  484. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  485. package/static/assets/codemirror/mode/meta.js +0 -221
  486. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  487. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  488. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  489. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  490. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  491. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  492. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  493. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  494. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  495. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  496. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  497. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  498. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  499. package/static/assets/codemirror/mode/php/php.js +0 -234
  500. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  501. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  502. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  503. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  504. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  505. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  506. package/static/assets/codemirror/mode/python/python.js +0 -402
  507. package/static/assets/codemirror/mode/q/q.js +0 -139
  508. package/static/assets/codemirror/mode/r/r.js +0 -190
  509. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  510. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  511. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  512. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  513. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  514. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  515. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  516. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  517. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  518. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  519. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  520. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  521. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  522. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  523. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  524. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  525. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  526. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  527. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  528. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  529. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  530. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  531. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  532. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  533. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  534. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  535. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  536. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  537. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  538. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  539. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  540. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  541. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  542. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  543. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  544. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  545. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  546. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  547. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  548. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  549. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  550. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  551. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  552. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  553. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  554. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  555. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  556. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  557. package/static/chunk-2KLC4T2Z.js +0 -1
  558. package/static/chunk-2VMSXRCB.js +0 -12
  559. package/static/chunk-3OHSRRKH.js +0 -4
  560. package/static/chunk-3R4WKOHQ.js +0 -1
  561. package/static/chunk-3XVM35O2.js +0 -1
  562. package/static/chunk-3YVRP3VM.js +0 -2
  563. package/static/chunk-5UKZLU5H.js +0 -1
  564. package/static/chunk-AF24EYXU.js +0 -1
  565. package/static/chunk-AKQVEHO6.js +0 -2
  566. package/static/chunk-BCVX464U.js +0 -2
  567. package/static/chunk-BQV4FRM6.js +0 -1
  568. package/static/chunk-CETH7UYS.js +0 -1
  569. package/static/chunk-DIT6W7VM.js +0 -562
  570. package/static/chunk-DKSEQTMX.js +0 -1
  571. package/static/chunk-FZ3JPGYZ.js +0 -1
  572. package/static/chunk-IQSKQXC3.js +0 -1
  573. package/static/chunk-ITUFI2BJ.js +0 -1
  574. package/static/chunk-LCTZJ537.js +0 -1
  575. package/static/chunk-LK2UCQJ6.js +0 -1
  576. package/static/chunk-LP5TBXEN.js +0 -7
  577. package/static/chunk-N3U6637P.js +0 -1
  578. package/static/chunk-NNV4OXSB.js +0 -1
  579. package/static/chunk-O6FYXVHI.js +0 -1
  580. package/static/chunk-OOGP4WSH.js +0 -2
  581. package/static/chunk-PCWDQPOM.js +0 -2
  582. package/static/chunk-PNR6M34W.js +0 -1
  583. package/static/chunk-Q5KM7LTX.js +0 -1
  584. package/static/chunk-QHC6ZPQ4.js +0 -1
  585. package/static/chunk-QMRBZHE4.js +0 -1
  586. package/static/chunk-QSJRY3TF.js +0 -1
  587. package/static/chunk-QUUIRSYT.js +0 -1
  588. package/static/chunk-RFH46UW3.js +0 -1
  589. package/static/chunk-RSXHRKM5.js +0 -1
  590. package/static/chunk-RV3VZJPZ.js +0 -1
  591. package/static/chunk-S7HNXVRB.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SJR5R3Y4.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-V3LHHZYN.js +0 -1
  597. package/static/chunk-VQQKMY2C.js +0 -1
  598. package/static/chunk-WSSU2HXE.js +0 -1
  599. package/static/chunk-XDZGW64M.js +0 -3
  600. package/static/chunk-XTRDKGKG.js +0 -1
  601. package/static/chunk-YLWTEC3X.js +0 -1
  602. package/static/chunk-Z5J5F5SX.js +0 -1
  603. package/static/main-4H5BJY3J.js +0 -9
  604. package/static/scripts-WRDOQIU5.js +0 -24
  605. package/static/styles-2C2UNCNB.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/spaces/guards/space.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { createMock, DeepMocked } from '@golevelup/ts-jest'\nimport { ExecutionContext, HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { intersectPermissions } from '../../../common/functions'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { API_FILES_ONLY_OFFICE_CALLBACK } from '../../files/constants/routes'\nimport { OnlyOfficeContext } from '../../files/decorators/only-office-environment.decorator'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SHARE_ALL_OPERATIONS } from '../../shares/constants/shares'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SyncContext } from '../../sync/decorators/sync-context.decorator'\nimport { USER_PERMISSION, USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { WebDAVContext } from '../../webdav/decorators/webdav-context.decorator'\nimport { SPACE_ALIAS, SPACE_ALL_OPERATIONS, SPACE_OPERATION, SPACE_PERMS_SEP, SPACE_REPOSITORY } from '../constants/spaces'\nimport { SkipSpaceGuard } from '../decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../decorators/space-skip-permissions.decorator'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpacesManager } from '../services/spaces-manager.service'\nimport { SpacesQueries } from '../services/spaces-queries.service'\nimport { SpaceGuard } from './space.guard'\n\ndescribe(SpaceGuard.name, () => {\n let spacesGuard: SpaceGuard\n let spacesManager: SpacesManager\n let spacesQueries: SpacesQueries\n let userTest: UserModel\n let context: DeepMocked<ExecutionContext>\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n {\n provide: Cache,\n useValue: {}\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n SpaceGuard,\n SpacesManager,\n SpacesQueries,\n SharesManager,\n SharesQueries,\n FilesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n spacesManager = module.get<SpacesManager>(SpacesManager)\n spacesQueries = module.get<SpacesQueries>(SpacesQueries)\n spacesGuard = module.get<SpaceGuard>(SpaceGuard)\n // mocks\n spacesManager['setQuotaExceeded'] = jest.fn()\n userTest = new UserModel(generateUserTest())\n context = createMock<ExecutionContext>()\n })\n\n it('should be defined', () => {\n expect(spacesGuard).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should pass for a personal space', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.name).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: userTest.id, path: 'root/foo/bar' })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(true)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toEqual(expect.arrayContaining(['root', 'foo', 'bar']))\n })\n\n it('should pass for a common space', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: ':a:d:m:so',\n role: 0\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject({ id: 0, alias: '', name: '', permissions: 'a:d:m:so' })\n expect(req.space.dbFile).toMatchObject({ inTrash: false, spaceId: fakeSpace.id, spaceExternalRootId: null, path: '.' })\n expect(req.space.permissions).toBe(SHARE_ALL_OPERATIONS)\n expect(req.space.envPermissions).not.toContain('d')\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: fakeSpace.root.owner.id, path: fakeSpace.root.file.path })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(\n intersectPermissions(fakeSpace.permissions, fakeSpace.root.permissions)\n .split(SPACE_PERMS_SEP)\n .filter((p) => p !== SPACE_OPERATION.DELETE)\n .join(SPACE_PERMS_SEP)\n )\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root with a path', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root/path' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({\n inTrash: false,\n ownerId: fakeSpace.root.owner.id,\n path: `${fakeSpace.root.file.path}/${req.space.paths[0]}`\n })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(fakeSpace.root.permissions)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(1)\n })\n\n it('should pass for a space in shares repository', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.alias).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.name).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toBeUndefined()\n expect(req.space.permissions).toBe('')\n expect(req.space.envPermissions).toBe('')\n expect(req.space.inFilesRepository).toBe(false)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(true)\n expect(req.space.inSharesList).toBe(true)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should not pass if the space is not found or not valid', async () => {\n const fakeSpace = null\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/foo' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n })\n\n it('should validate (or not) the access to the space depending on the user permissions', async () => {\n // we only check the `spacesManager.checkAccessToSpace` function, ignores the `spacesManager.spaceEnv`\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n for (const url of ['', 'shares/personal', 'shares/toto']) {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': url }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n // should pass because it is a standard user\n // should not pass because user is a guest (and dot not have the permission to access to a personal space)\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({ enabled: true }) // only for user role\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n for (const userRole of [USER_ROLE.USER, USER_ROLE.GUEST]) {\n userTest.role = userRole\n if (userRole === USER_ROLE.USER) {\n expect(await spacesGuard.canActivate(context)).toBe(true)\n } else {\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n }\n })\n\n it('should check user permissions on route', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation (only modify)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allows modification\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'PATCH',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n\n // does not allow guest (on personal space)\n userTest.role = USER_ROLE.GUEST\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allow if SkipSpacePermissionsCheck is enabled\n userTest.role = USER_ROLE.USER\n SkipSpacePermissionsCheck()(context.getHandler())\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation but pass\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should fail with quota exceeded', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n quotaIsExceeded: true\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n })\n\n it('should fail if request content-length header exceed the quota', async () => {\n userTest.role = USER_ROLE.USER\n const storageQuota = 12\n const storageUsage = 11\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n storageQuota: storageQuota,\n storageUsage: storageUsage,\n willExceedQuota: (contentLength: number) => contentLength > storageQuota - storageUsage\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n headers: { 'content-length': 13 },\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n headers: {},\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n })\n\n it('should fail with space disabled', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: false\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n })\n\n it('should validate (or not) the webdav routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n WebDAVContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should validate (or not) the sync routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n SyncContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'personal/foo' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal', 'foo'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'sync/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should require the modify permission when using the POST method on the OnlyOffice callback URL', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.MODIFY}` })\n OnlyOfficeContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: API_FILES_ONLY_OFFICE_CALLBACK,\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.ADD}` })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: '',\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should pass if skipSpaceGuard context is enabled', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n SkipSpaceGuard()(context.getHandler())\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('coverage only', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockRejectedValueOnce(new Error('error'))\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n})\n"],"names":["describe","SpaceGuard","name","spacesGuard","spacesManager","spacesQueries","userTest","context","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","ContextManager","NotificationsManager","SpacesManager","SpacesQueries","SharesManager","SharesQueries","FilesQueries","UsersQueries","LinksQueries","compile","get","jest","fn","UserModel","generateUserTest","createMock","it","expect","toBeDefined","switchToHttp","getRequest","mockReturnValue","user","params","canActivate","toBe","req","space","id","repository","SPACE_REPOSITORY","FILES","alias","SPACE_ALIAS","PERSONAL","enabled","root","toBeUndefined","dbFile","toMatchObject","inTrash","ownerId","path","permissions","SPACE_ALL_OPERATIONS","envPermissions","inFilesRepository","inPersonalSpace","inTrashRepository","inSharesRepository","inSharesList","paths","toEqual","arrayContaining","fakeSpace","role","mockReturnValueOnce","spaceId","spaceExternalRootId","SHARE_ALL_OPERATIONS","not","toContain","toHaveLength","owner","login","file","externalPath","intersectPermissions","split","SPACE_PERMS_SEP","filter","p","SPACE_OPERATION","DELETE","join","SHARES","rejects","toThrow","HttpException","applications","USER_PERMISSION","PERSONAL_SPACE","url","spaceEnv","userRole","USER_ROLE","USER","GUEST","MODIFY","method","SkipSpacePermissionsCheck","getHandler","ADD","quotaIsExceeded","objectContaining","status","HttpStatus","INSUFFICIENT_STORAGE","storageQuota","storageUsage","willExceedQuota","contentLength","headers","FORBIDDEN","spyUrlSegment","spyOn","WebDAVContext","mock","results","value","mockRestore","SyncContext","OnlyOfficeContext","originalUrl","API_FILES_ONLY_OFFICE_CALLBACK","SkipSpaceGuard","mockRejectedValueOnce","Error","BAD_REQUEST"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/spaces/guards/space.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { createMock, DeepMocked } from '@golevelup/ts-jest'\nimport { ExecutionContext, HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { intersectPermissions } from '../../../common/shared'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { API_FILES_ONLY_OFFICE_CALLBACK } from '../../files/constants/routes'\nimport { OnlyOfficeContext } from '../../files/decorators/only-office-environment.decorator'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SHARE_ALL_OPERATIONS } from '../../shares/constants/shares'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SyncContext } from '../../sync/decorators/sync-context.decorator'\nimport { USER_PERMISSION, USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { WebDAVContext } from '../../webdav/decorators/webdav-context.decorator'\nimport { SPACE_ALIAS, SPACE_ALL_OPERATIONS, SPACE_OPERATION, SPACE_PERMS_SEP, SPACE_REPOSITORY } from '../constants/spaces'\nimport { SkipSpaceGuard } from '../decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../decorators/space-skip-permissions.decorator'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpacesManager } from '../services/spaces-manager.service'\nimport { SpacesQueries } from '../services/spaces-queries.service'\nimport { SpaceGuard } from './space.guard'\n\ndescribe(SpaceGuard.name, () => {\n let spacesGuard: SpaceGuard\n let spacesManager: SpacesManager\n let spacesQueries: SpacesQueries\n let userTest: UserModel\n let context: DeepMocked<ExecutionContext>\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n {\n provide: Cache,\n useValue: {}\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n SpaceGuard,\n SpacesManager,\n SpacesQueries,\n SharesManager,\n SharesQueries,\n FilesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n spacesManager = module.get<SpacesManager>(SpacesManager)\n spacesQueries = module.get<SpacesQueries>(SpacesQueries)\n spacesGuard = module.get<SpaceGuard>(SpaceGuard)\n // mocks\n spacesManager['setQuotaExceeded'] = jest.fn()\n userTest = new UserModel(generateUserTest())\n context = createMock<ExecutionContext>()\n })\n\n it('should be defined', () => {\n expect(spacesGuard).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should pass for a personal space', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.name).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: userTest.id, path: 'root/foo/bar' })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(true)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toEqual(expect.arrayContaining(['root', 'foo', 'bar']))\n })\n\n it('should pass for a common space', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: ':a:d:m:so',\n role: 0\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject({ id: 0, alias: '', name: '', permissions: 'a:d:m:so' })\n expect(req.space.dbFile).toMatchObject({ inTrash: false, spaceId: fakeSpace.id, spaceExternalRootId: null, path: '.' })\n expect(req.space.permissions).toBe(SHARE_ALL_OPERATIONS)\n expect(req.space.envPermissions).not.toContain('d')\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: fakeSpace.root.owner.id, path: fakeSpace.root.file.path })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(\n intersectPermissions(fakeSpace.permissions, fakeSpace.root.permissions)\n .split(SPACE_PERMS_SEP)\n .filter((p) => p !== SPACE_OPERATION.DELETE)\n .join(SPACE_PERMS_SEP)\n )\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root with a path', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root/path' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({\n inTrash: false,\n ownerId: fakeSpace.root.owner.id,\n path: `${fakeSpace.root.file.path}/${req.space.paths[0]}`\n })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(fakeSpace.root.permissions)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(1)\n })\n\n it('should pass for a space in shares repository', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.alias).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.name).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toBeUndefined()\n expect(req.space.permissions).toBe('')\n expect(req.space.envPermissions).toBe('')\n expect(req.space.inFilesRepository).toBe(false)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(true)\n expect(req.space.inSharesList).toBe(true)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should not pass if the space is not found or not valid', async () => {\n const fakeSpace = null\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/foo' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n })\n\n it('should validate (or not) the access to the space depending on the user permissions', async () => {\n // we only check the `spacesManager.checkAccessToSpace` function, ignores the `spacesManager.spaceEnv`\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n for (const url of ['', 'shares/personal', 'shares/toto']) {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': url }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n // should pass because it is a standard user\n // should not pass because user is a guest (and dot not have the permission to access to a personal space)\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({ enabled: true }) // only for user role\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n for (const userRole of [USER_ROLE.USER, USER_ROLE.GUEST]) {\n userTest.role = userRole\n if (userRole === USER_ROLE.USER) {\n expect(await spacesGuard.canActivate(context)).toBe(true)\n } else {\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n }\n })\n\n it('should check user permissions on route', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation (only modify)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allows modification\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'PATCH',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n\n // does not allow guest (on personal space)\n userTest.role = USER_ROLE.GUEST\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allow if SkipSpacePermissionsCheck is enabled\n userTest.role = USER_ROLE.USER\n SkipSpacePermissionsCheck()(context.getHandler())\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation but pass\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should fail with quota exceeded', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n quotaIsExceeded: true\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n })\n\n it('should fail if request content-length header exceed the quota', async () => {\n userTest.role = USER_ROLE.USER\n const storageQuota = 12\n const storageUsage = 11\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n storageQuota: storageQuota,\n storageUsage: storageUsage,\n willExceedQuota: (contentLength: number) => contentLength > storageQuota - storageUsage\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n headers: { 'content-length': 13 },\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n headers: {},\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n })\n\n it('should fail with space disabled', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: false\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n })\n\n it('should validate (or not) the webdav routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n WebDAVContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should validate (or not) the sync routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n SyncContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'personal/foo' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal', 'foo'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'sync/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should require the modify permission when using the POST method on the OnlyOffice callback URL', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.MODIFY}` })\n OnlyOfficeContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: API_FILES_ONLY_OFFICE_CALLBACK,\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.ADD}` })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: '',\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should pass if skipSpaceGuard context is enabled', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n SkipSpaceGuard()(context.getHandler())\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('coverage only', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockRejectedValueOnce(new Error('error'))\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n})\n"],"names":["describe","SpaceGuard","name","spacesGuard","spacesManager","spacesQueries","userTest","context","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","ContextManager","NotificationsManager","SpacesManager","SpacesQueries","SharesManager","SharesQueries","FilesQueries","UsersQueries","LinksQueries","compile","get","jest","fn","UserModel","generateUserTest","createMock","it","expect","toBeDefined","switchToHttp","getRequest","mockReturnValue","user","params","canActivate","toBe","req","space","id","repository","SPACE_REPOSITORY","FILES","alias","SPACE_ALIAS","PERSONAL","enabled","root","toBeUndefined","dbFile","toMatchObject","inTrash","ownerId","path","permissions","SPACE_ALL_OPERATIONS","envPermissions","inFilesRepository","inPersonalSpace","inTrashRepository","inSharesRepository","inSharesList","paths","toEqual","arrayContaining","fakeSpace","role","mockReturnValueOnce","spaceId","spaceExternalRootId","SHARE_ALL_OPERATIONS","not","toContain","toHaveLength","owner","login","file","externalPath","intersectPermissions","split","SPACE_PERMS_SEP","filter","p","SPACE_OPERATION","DELETE","join","SHARES","rejects","toThrow","HttpException","applications","USER_PERMISSION","PERSONAL_SPACE","url","spaceEnv","userRole","USER_ROLE","USER","GUEST","MODIFY","method","SkipSpacePermissionsCheck","getHandler","ADD","quotaIsExceeded","objectContaining","status","HttpStatus","INSUFFICIENT_STORAGE","storageQuota","storageUsage","willExceedQuota","contentLength","headers","FORBIDDEN","spyUrlSegment","spyOn","WebDAVContext","mock","results","value","mockRestore","SyncContext","OnlyOfficeContext","originalUrl","API_FILES_ONLY_OFFICE_CALLBACK","SkipSpaceGuard","mockRejectedValueOnce","Error","BAD_REQUEST"],"mappings":"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"}
@@ -22,7 +22,6 @@ const _filesrecentsservice = require("../../files/services/files-recents.service
22
22
  const _files = require("../../files/utils/files");
23
23
  const _sharesqueriesservice = require("../../shares/services/shares-queries.service");
24
24
  const _user = require("../../users/constants/user");
25
- const _webdav = require("../../webdav/constants/webdav");
26
25
  const _paths = require("../utils/paths");
27
26
  const _spacesmanagerservice = require("./spaces-manager.service");
28
27
  const _spacesqueriesservice = require("./spaces-queries.service");
@@ -55,7 +54,8 @@ let SpacesBrowser = class SpacesBrowser {
55
54
  this.parseRootFiles(user, space, {
56
55
  withShares: options.withSpacesAndShares,
57
56
  withHasComments: options.withHasComments,
58
- withSyncs: options.withSyncs
57
+ withSyncs: options.withSyncs,
58
+ withLocks: options.withLocks
59
59
  })
60
60
  ]);
61
61
  this.updateDBFiles(user, space, dbFiles, fsFiles, options);
@@ -139,8 +139,8 @@ let SpacesBrowser = class SpacesBrowser {
139
139
  }
140
140
  }
141
141
  async updateRootFile(f, options) {
142
- // get realpath
143
142
  const realPath = (0, _paths.realPathFromRootFile)(f);
143
+ const originalPath = f.path;
144
144
  f.path = f.root.name;
145
145
  try {
146
146
  const fileProps = await (0, _files.getProps)(realPath, f.path);
@@ -153,8 +153,33 @@ let SpacesBrowser = class SpacesBrowser {
153
153
  if (options.withSyncs) {
154
154
  fileProps.syncs = f.syncs;
155
155
  }
156
+ if (options.withLocks && (f.origin || f.root?.owner)) {
157
+ // `f.origin` is used for shares
158
+ // `f.root.owner` is used for anchored files in spaces
159
+ // all other files are handled in the `enrichWithLocks` function
160
+ const dbFile = {
161
+ ...f.origin?.spaceId ? {
162
+ spaceId: f.origin.spaceId,
163
+ ...f.origin.spaceExternalRootId ? {
164
+ spaceExternalRootId: f.origin.spaceExternalRootId
165
+ } : {}
166
+ } : f.origin?.shareExternalId ? {
167
+ shareExternalId: f.origin.shareExternalId
168
+ } : {
169
+ ownerId: f.origin?.ownerId ?? f.root.owner.id
170
+ },
171
+ path: originalPath,
172
+ inTrash: f.inTrash
173
+ };
174
+ const locks = await this.filesLockManager.getLocksByPath(dbFile);
175
+ if (locks.length > 0) {
176
+ fileProps.lock = this.filesLockManager.convertLockToFileLockProps(locks[0]);
177
+ }
178
+ }
179
+ // `owner.id` is only used in the `withLocks` condition
180
+ delete f.root.owner?.id;
181
+ // check `f.id`; it can be null for external roots
156
182
  if (f.id) {
157
- // f.id is null for external roots
158
183
  // todo: check if a db file referenced under external roots have an id and correctly parsed here
159
184
  this.filesQueries.compareAndUpdateFileProps(f, fileProps).catch((e)=>this.logger.error(`${this.updateRootFile.name} - ${e}`));
160
185
  fileProps.id = f.id;
@@ -273,13 +298,8 @@ let SpacesBrowser = class SpacesBrowser {
273
298
  }
274
299
  const locks = await this.filesLockManager.browseParentChildLocks(space.dbFile, false);
275
300
  if (!Object.keys(locks).length) return;
276
- for (const f of files.filter((f)=>f.root && f.root.alias in locks || !f.root && f.name in locks)){
277
- const lock = f.root ? locks[f.root.alias] : locks[f.name];
278
- f.lock = {
279
- owner: lock?.davLock?.owner || `${lock.owner.fullName} (${lock.owner.email})`,
280
- ownerLogin: lock.owner.login,
281
- isExclusive: lock?.davLock?.lockscope ? lock?.davLock?.lockscope === _webdav.LOCK_SCOPE.EXCLUSIVE : true
282
- };
301
+ for (const f of files.filter((f)=>!f.root && !f.origin && f.name in locks)){
302
+ f.lock = this.filesLockManager.convertLockToFileLockProps(locks[f.name]);
283
303
  }
284
304
  }
285
305
  constructor(spacesManager, spacesQueries, sharesQueries, filesQueries, filesLockManager, filesRecents){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-browser.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, Injectable, Logger } from '@nestjs/common'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { configuration } from '../../../configuration/config.environment'\nimport { FileLock } from '../../files/interfaces/file-lock.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { FilesRecents } from '../../files/services/files-recents.service'\nimport { dirName, fileName, getProps } from '../../files/utils/files'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { USER_PERMISSION } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { LOCK_SCOPE } from '../../webdav/constants/webdav'\nimport { SpaceFiles } from '../interfaces/space-files.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { IsRealPathIsDirAndExists, realPathFromRootFile } from '../utils/paths'\nimport { SpacesManager } from './spaces-manager.service'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesBrowser {\n private readonly logger = new Logger(SpacesBrowser.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries,\n private readonly filesQueries: FilesQueries,\n private readonly filesLockManager: FilesLockManager,\n private readonly filesRecents: FilesRecents\n ) {}\n\n async browse(\n user: UserModel,\n space: SpaceEnv,\n options: {\n withLocks?: boolean\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n } = {}\n ): Promise<SpaceFiles> {\n // check sync permission\n options.withSyncs = options.withSyncs && user.havePermission(USER_PERMISSION.DESKTOP_APP) && user.havePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n const spaceFiles: SpaceFiles = { files: [], hasRoots: false, permissions: space.browsePermissions() }\n const [fsFiles, dbFiles, rootFiles] = await Promise.all([\n this.parseFS(space),\n this.parseDB(user.id, space, options),\n this.parseRootFiles(user, space, {\n withShares: options.withSpacesAndShares,\n withHasComments: options.withHasComments,\n withSyncs: options.withSyncs\n })\n ])\n this.updateDBFiles(user, space, dbFiles, fsFiles, options)\n if (space.inSharesList) {\n // the share space includes shares as root files\n spaceFiles.files = [...rootFiles, ...fsFiles]\n spaceFiles.hasRoots = true\n } else {\n await this.mergeSpaceRootFiles(space, rootFiles, fsFiles, spaceFiles)\n }\n if (options.withLocks && !space.inTrashRepository) {\n // locks were removed when files were moved to the trash, no need to parse locks\n await this.enrichWithLocks(space, spaceFiles.files)\n }\n // update recents files\n this.filesRecents.updateRecents(user, space, spaceFiles.files).catch((e: Error) => this.logger.error(`${this.browse.name} - ${e}`))\n return spaceFiles\n }\n\n private async parseRootFiles(\n user: UserModel,\n space: SpaceEnv,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n }\n ): Promise<FileProps[]> {\n if (space.inFilesRepository && space.id && !space.root.alias) {\n // list roots in the space\n return Promise.all((await this.spacesQueries.spaceRootFiles(user.id, space.id, options)).map((f) => this.updateRootFile(f, options)))\n } else if (space.inSharesList) {\n // list shares as roots\n return Promise.all((await this.sharesQueries.shareRootFiles(user, options)).map((f) => this.updateRootFile(f, options)))\n }\n return []\n }\n\n private async parseDB(\n userId: number,\n space: SpaceEnv,\n options: {\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n }\n ): Promise<FileProps[]> {\n if (space.inSharesList) return []\n const dbOptions = {\n withSpaces: options.withSpacesAndShares && space.inPersonalSpace,\n withShares: options.withSpacesAndShares,\n withSyncs: options.withSyncs,\n withHasComments: options.withHasComments,\n ignoreChildShares: !space.inSharesRepository\n }\n return this.filesQueries.browseFiles(userId, space.dbFile, dbOptions)\n }\n\n private async parseFS(space: SpaceEnv): Promise<FileProps[]> {\n if (space.inSharesList) return []\n const fsFiles: FileProps[] = []\n try {\n await IsRealPathIsDirAndExists(space.realPath)\n } catch (e) {\n this.logger.warn(`${this.parseFS.name} - ${space.realPath} : ${e.message}`)\n throw new HttpException(e.message, e.httpCode)\n }\n for await (const f of this.parsePath(space)) {\n fsFiles.push(f)\n }\n return fsFiles\n }\n\n private async *parsePath(space: SpaceEnv): AsyncGenerator<FileProps> {\n try {\n for (const element of await fs.readdir(space.realPath, { withFileTypes: true })) {\n const isDir = element.isDirectory()\n if (!isDir && !element.isFile()) {\n this.logger.log(`${this.parsePath.name} - ignore special file : ${element.name}`)\n continue\n }\n if (!configuration.applications.files.showHiddenFiles && element.name[0] === '.') {\n this.logger.verbose(`${this.parsePath.name} - ignore filtered file : ${element.name}`)\n continue\n }\n const realPath = path.join(space.realPath, element.name)\n const filePath = path.join(space.relativeUrl, element.name)\n try {\n yield await getProps(realPath, filePath, isDir)\n } catch (e) {\n this.logger.warn(`${this.parsePath.name} - unable get stats from ${realPath} : ${e}`)\n }\n }\n } catch (e) {\n this.logger.error(`${this.parsePath.name} - unable to parse ${space.realPath} : ${e}`)\n }\n }\n\n private async updateRootFile(f: FileProps, options: { withShares?: boolean; withHasComments?: boolean; withSyncs?: boolean }): Promise<FileProps> {\n // get realpath\n const realPath = realPathFromRootFile(f)\n f.path = f.root.name\n try {\n const fileProps: FileProps = await getProps(realPath, f.path)\n if (options.withShares) {\n fileProps.shares = f.shares\n }\n if (options.withHasComments) {\n fileProps.hasComments = f.hasComments\n }\n if (options.withSyncs) {\n fileProps.syncs = f.syncs\n }\n if (f.id) {\n // f.id is null for external roots\n // todo: check if a db file referenced under external roots have an id and correctly parsed here\n this.filesQueries.compareAndUpdateFileProps(f, fileProps).catch((e: Error) => this.logger.error(`${this.updateRootFile.name} - ${e}`))\n fileProps.id = f.id\n }\n fileProps.root = {\n id: f.root.id,\n alias: f.root.alias,\n description: f.root.description,\n enabled: typeof f.root.enabled === 'undefined' ? true : f.root.enabled,\n permissions: f.root.permissions,\n owner: f.root.owner\n }\n return fileProps\n } catch (e) {\n this.logger.error(`${this.updateRootFile.name} - ${JSON.stringify(f)} - ${e}`)\n return { ...f, name: fileName(f.path), path: dirName(f.path), ...{ root: { ...f.root, enabled: false } } }\n }\n }\n\n private updateDBFiles(\n user: UserModel,\n space: SpaceEnv,\n dbFiles: FileProps[],\n fsFiles: FileProps[],\n options: {\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n }\n ) {\n for (const dbFile of dbFiles) {\n const fsFile = fsFiles.find((f: FileProps) => dbFile.name === f.name)\n if (fsFile) {\n /* important: inherits from the file id in database */\n fsFile.id = dbFile.id\n if (options.withSpacesAndShares) {\n fsFile.spaces = dbFile.spaces\n fsFile.shares = dbFile.shares\n }\n if (options.withSyncs) {\n fsFile.syncs = dbFile.syncs\n }\n if (options.withHasComments) {\n fsFile.hasComments = dbFile.hasComments\n }\n this.filesQueries.compareAndUpdateFileProps(dbFile, fsFile).catch((e: Error) => this.logger.error(`${this.updateDBFiles.name} - ${e}`))\n } else {\n this.logger.warn(`${this.updateDBFiles.name} - missing ${dbFile.path}/${dbFile.name} (${dbFile.id}) from fs, delete it from db`)\n if (options.withSpacesAndShares) {\n if (dbFile.spaces) {\n for (const space of dbFile.spaces) {\n this.logger.warn(\n `${this.updateDBFiles.name} - ${dbFile.path}/${dbFile.name} (${dbFile.id}) will be removed from space : *${space.alias}* (${space.id})`\n )\n }\n }\n if (dbFile.shares) {\n for (const share of dbFile.shares) {\n this.logger.warn(\n `${this.updateDBFiles.name} - ${dbFile.path}/${dbFile.name} (${dbFile.id}) will be removed from share : *${share.alias}* (${share.id})`\n )\n }\n }\n }\n this.deleteDBFile(user, space, dbFile).catch((e: Error) => this.logger.error(`${this.updateDBFiles.name} - ${e}`))\n }\n }\n }\n\n private async deleteDBFile(user: UserModel, space: SpaceEnv, dbFile: FileProps) {\n const spaceEnv = await this.spacesManager.spaceEnv(user, path.join(space.url, dbFile.name).split('/'))\n this.filesQueries.deleteFiles(spaceEnv.dbFile, dbFile.isDir, true).catch((e: Error) => this.logger.error(`${this.deleteDBFile.name} - ${e}`))\n }\n\n private async mergeSpaceRootFiles(space: SpaceEnv, rootFiles: FileProps[], fsFiles: FileProps[], spaceFiles: SpaceFiles) {\n // merges root files in space files taking care of alias and name (file names must be unique)\n if (!rootFiles.length) {\n spaceFiles.files = fsFiles\n return\n }\n spaceFiles.hasRoots = true\n for (const f of rootFiles) {\n // check root alias (must be unique in the space)\n const newAlias: string = await this.spacesManager.uniqueRootAlias(\n space.id,\n f.root.alias,\n fsFiles.map((f) => f.name),\n true\n )\n if (newAlias) {\n this.logger.log(`${this.mergeSpaceRootFiles.name} - update space root alias (${f.root.id}) : ${f.root.alias} -> ${newAlias}`)\n // update in db\n this.spacesQueries\n .updateRoot({ alias: newAlias }, { id: f.root.id })\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // cleanup cache\n this.spacesQueries\n .clearCachePermissions(space.alias, [f.root.alias, newAlias])\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // assign\n f.root.alias = newAlias\n }\n // check root name (must be unique in the space)\n // f.name is equal to root name\n const newName: string = this.spacesManager.uniqueRootName(\n f.name,\n fsFiles.map((f) => f.name)\n )\n if (newName) {\n this.logger.log(`${this.mergeSpaceRootFiles.name} - update space root name (${f.root.id}) : ${f.name} -> ${newName}`)\n // update in db\n this.spacesQueries\n .updateRoot({ name: newName }, { id: f.root.id })\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // assign\n f.name = newName\n }\n }\n spaceFiles.files = [...fsFiles, ...rootFiles]\n }\n\n private async enrichWithLocks(space: SpaceEnv, files: FileProps[]) {\n if (space.inSharesList) {\n return\n }\n const locks: Record<string, FileLock> = await this.filesLockManager.browseParentChildLocks(space.dbFile, false)\n if (!Object.keys(locks).length) return\n for (const f of files.filter((f) => (f.root && f.root.alias in locks) || (!f.root && f.name in locks))) {\n const lock: FileLock = f.root ? locks[f.root.alias] : locks[f.name]\n f.lock = {\n owner: lock?.davLock?.owner || `${lock.owner.fullName} (${lock.owner.email})`,\n ownerLogin: lock.owner.login,\n isExclusive: lock?.davLock?.lockscope ? lock?.davLock?.lockscope === LOCK_SCOPE.EXCLUSIVE : true\n }\n }\n }\n}\n"],"names":["SpacesBrowser","browse","user","space","options","withSyncs","havePermission","USER_PERMISSION","DESKTOP_APP","DESKTOP_APP_SYNC","spaceFiles","files","hasRoots","permissions","browsePermissions","fsFiles","dbFiles","rootFiles","Promise","all","parseFS","parseDB","id","parseRootFiles","withShares","withSpacesAndShares","withHasComments","updateDBFiles","inSharesList","mergeSpaceRootFiles","withLocks","inTrashRepository","enrichWithLocks","filesRecents","updateRecents","catch","e","logger","error","name","inFilesRepository","root","alias","spacesQueries","spaceRootFiles","map","f","updateRootFile","sharesQueries","shareRootFiles","userId","dbOptions","withSpaces","inPersonalSpace","ignoreChildShares","inSharesRepository","filesQueries","browseFiles","dbFile","IsRealPathIsDirAndExists","realPath","warn","message","HttpException","httpCode","parsePath","push","element","fs","readdir","withFileTypes","isDir","isDirectory","isFile","log","configuration","applications","showHiddenFiles","verbose","path","join","filePath","relativeUrl","getProps","realPathFromRootFile","fileProps","shares","hasComments","syncs","compareAndUpdateFileProps","description","enabled","owner","JSON","stringify","fileName","dirName","fsFile","find","spaces","share","deleteDBFile","spaceEnv","spacesManager","url","split","deleteFiles","length","newAlias","uniqueRootAlias","updateRoot","clearCachePermissions","newName","uniqueRootName","locks","filesLockManager","browseParentChildLocks","Object","keys","filter","lock","davLock","fullName","email","ownerLogin","login","isExclusive","lockscope","LOCK_SCOPE","EXCLUSIVE","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-browser.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, Injectable, Logger } from '@nestjs/common'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { configuration } from '../../../configuration/config.environment'\nimport { FileDBProps } from '../../files/interfaces/file-db-props.interface'\nimport { FileLock } from '../../files/interfaces/file-lock.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { FilesRecents } from '../../files/services/files-recents.service'\nimport { dirName, fileName, getProps } from '../../files/utils/files'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { USER_PERMISSION } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { SpaceFiles } from '../interfaces/space-files.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { IsRealPathIsDirAndExists, realPathFromRootFile } from '../utils/paths'\nimport { SpacesManager } from './spaces-manager.service'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesBrowser {\n private readonly logger = new Logger(SpacesBrowser.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries,\n private readonly filesQueries: FilesQueries,\n private readonly filesLockManager: FilesLockManager,\n private readonly filesRecents: FilesRecents\n ) {}\n\n async browse(\n user: UserModel,\n space: SpaceEnv,\n options: {\n withLocks?: boolean\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n } = {}\n ): Promise<SpaceFiles> {\n // check sync permission\n options.withSyncs = options.withSyncs && user.havePermission(USER_PERMISSION.DESKTOP_APP) && user.havePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n const spaceFiles: SpaceFiles = { files: [], hasRoots: false, permissions: space.browsePermissions() }\n const [fsFiles, dbFiles, rootFiles] = await Promise.all([\n this.parseFS(space),\n this.parseDB(user.id, space, options),\n this.parseRootFiles(user, space, {\n withShares: options.withSpacesAndShares,\n withHasComments: options.withHasComments,\n withSyncs: options.withSyncs,\n withLocks: options.withLocks\n })\n ])\n this.updateDBFiles(user, space, dbFiles, fsFiles, options)\n if (space.inSharesList) {\n // the share space includes shares as root files\n spaceFiles.files = [...rootFiles, ...fsFiles]\n spaceFiles.hasRoots = true\n } else {\n await this.mergeSpaceRootFiles(space, rootFiles, fsFiles, spaceFiles)\n }\n if (options.withLocks && !space.inTrashRepository) {\n // locks were removed when files were moved to the trash, no need to parse locks\n await this.enrichWithLocks(space, spaceFiles.files)\n }\n // update recents files\n this.filesRecents.updateRecents(user, space, spaceFiles.files).catch((e: Error) => this.logger.error(`${this.browse.name} - ${e}`))\n return spaceFiles\n }\n\n private async parseRootFiles(\n user: UserModel,\n space: SpaceEnv,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n withLocks?: boolean\n }\n ): Promise<FileProps[]> {\n if (space.inFilesRepository && space.id && !space.root.alias) {\n // list roots in the space\n return Promise.all((await this.spacesQueries.spaceRootFiles(user.id, space.id, options)).map((f) => this.updateRootFile(f, options)))\n } else if (space.inSharesList) {\n // list shares as roots\n return Promise.all((await this.sharesQueries.shareRootFiles(user, options)).map((f) => this.updateRootFile(f, options)))\n }\n return []\n }\n\n private async parseDB(\n userId: number,\n space: SpaceEnv,\n options: {\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n }\n ): Promise<FileProps[]> {\n if (space.inSharesList) return []\n const dbOptions = {\n withSpaces: options.withSpacesAndShares && space.inPersonalSpace,\n withShares: options.withSpacesAndShares,\n withSyncs: options.withSyncs,\n withHasComments: options.withHasComments,\n ignoreChildShares: !space.inSharesRepository\n }\n return this.filesQueries.browseFiles(userId, space.dbFile, dbOptions)\n }\n\n private async parseFS(space: SpaceEnv): Promise<FileProps[]> {\n if (space.inSharesList) return []\n const fsFiles: FileProps[] = []\n try {\n await IsRealPathIsDirAndExists(space.realPath)\n } catch (e) {\n this.logger.warn(`${this.parseFS.name} - ${space.realPath} : ${e.message}`)\n throw new HttpException(e.message, e.httpCode)\n }\n for await (const f of this.parsePath(space)) {\n fsFiles.push(f)\n }\n return fsFiles\n }\n\n private async *parsePath(space: SpaceEnv): AsyncGenerator<FileProps> {\n try {\n for (const element of await fs.readdir(space.realPath, { withFileTypes: true })) {\n const isDir = element.isDirectory()\n if (!isDir && !element.isFile()) {\n this.logger.log(`${this.parsePath.name} - ignore special file : ${element.name}`)\n continue\n }\n if (!configuration.applications.files.showHiddenFiles && element.name[0] === '.') {\n this.logger.verbose(`${this.parsePath.name} - ignore filtered file : ${element.name}`)\n continue\n }\n const realPath = path.join(space.realPath, element.name)\n const filePath = path.join(space.relativeUrl, element.name)\n try {\n yield await getProps(realPath, filePath, isDir)\n } catch (e) {\n this.logger.warn(`${this.parsePath.name} - unable get stats from ${realPath} : ${e}`)\n }\n }\n } catch (e) {\n this.logger.error(`${this.parsePath.name} - unable to parse ${space.realPath} : ${e}`)\n }\n }\n\n private async updateRootFile(\n f: FileProps,\n options: { withShares?: boolean; withHasComments?: boolean; withSyncs?: boolean; withLocks?: boolean }\n ): Promise<FileProps> {\n const realPath = realPathFromRootFile(f)\n const originalPath = f.path\n f.path = f.root.name\n try {\n const fileProps: FileProps = await getProps(realPath, f.path)\n if (options.withShares) {\n fileProps.shares = f.shares\n }\n if (options.withHasComments) {\n fileProps.hasComments = f.hasComments\n }\n if (options.withSyncs) {\n fileProps.syncs = f.syncs\n }\n if (options.withLocks && (f.origin || f.root?.owner)) {\n // `f.origin` is used for shares\n // `f.root.owner` is used for anchored files in spaces\n // all other files are handled in the `enrichWithLocks` function\n const dbFile: FileDBProps = {\n ...(f.origin?.spaceId\n ? { spaceId: f.origin.spaceId, ...(f.origin.spaceExternalRootId ? { spaceExternalRootId: f.origin.spaceExternalRootId } : {}) }\n : f.origin?.shareExternalId\n ? { shareExternalId: f.origin.shareExternalId }\n : { ownerId: f.origin?.ownerId ?? f.root.owner.id }),\n path: originalPath,\n inTrash: f.inTrash\n }\n const locks = await this.filesLockManager.getLocksByPath(dbFile)\n if (locks.length > 0) {\n fileProps.lock = this.filesLockManager.convertLockToFileLockProps(locks[0])\n }\n }\n // `owner.id` is only used in the `withLocks` condition\n delete f.root.owner?.id\n // check `f.id`; it can be null for external roots\n if (f.id) {\n // todo: check if a db file referenced under external roots have an id and correctly parsed here\n this.filesQueries.compareAndUpdateFileProps(f, fileProps).catch((e: Error) => this.logger.error(`${this.updateRootFile.name} - ${e}`))\n fileProps.id = f.id\n }\n fileProps.root = {\n id: f.root.id,\n alias: f.root.alias,\n description: f.root.description,\n enabled: typeof f.root.enabled === 'undefined' ? true : f.root.enabled,\n permissions: f.root.permissions,\n owner: f.root.owner\n }\n return fileProps\n } catch (e) {\n this.logger.error(`${this.updateRootFile.name} - ${JSON.stringify(f)} - ${e}`)\n return { ...f, name: fileName(f.path), path: dirName(f.path), ...{ root: { ...f.root, enabled: false } } }\n }\n }\n\n private updateDBFiles(\n user: UserModel,\n space: SpaceEnv,\n dbFiles: FileProps[],\n fsFiles: FileProps[],\n options: {\n withSpacesAndShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n }\n ) {\n for (const dbFile of dbFiles) {\n const fsFile = fsFiles.find((f: FileProps) => dbFile.name === f.name)\n if (fsFile) {\n /* important: inherits from the file id in database */\n fsFile.id = dbFile.id\n if (options.withSpacesAndShares) {\n fsFile.spaces = dbFile.spaces\n fsFile.shares = dbFile.shares\n }\n if (options.withSyncs) {\n fsFile.syncs = dbFile.syncs\n }\n if (options.withHasComments) {\n fsFile.hasComments = dbFile.hasComments\n }\n this.filesQueries.compareAndUpdateFileProps(dbFile, fsFile).catch((e: Error) => this.logger.error(`${this.updateDBFiles.name} - ${e}`))\n } else {\n this.logger.warn(`${this.updateDBFiles.name} - missing ${dbFile.path}/${dbFile.name} (${dbFile.id}) from fs, delete it from db`)\n if (options.withSpacesAndShares) {\n if (dbFile.spaces) {\n for (const space of dbFile.spaces) {\n this.logger.warn(\n `${this.updateDBFiles.name} - ${dbFile.path}/${dbFile.name} (${dbFile.id}) will be removed from space : *${space.alias}* (${space.id})`\n )\n }\n }\n if (dbFile.shares) {\n for (const share of dbFile.shares) {\n this.logger.warn(\n `${this.updateDBFiles.name} - ${dbFile.path}/${dbFile.name} (${dbFile.id}) will be removed from share : *${share.alias}* (${share.id})`\n )\n }\n }\n }\n this.deleteDBFile(user, space, dbFile).catch((e: Error) => this.logger.error(`${this.updateDBFiles.name} - ${e}`))\n }\n }\n }\n\n private async deleteDBFile(user: UserModel, space: SpaceEnv, dbFile: FileProps) {\n const spaceEnv = await this.spacesManager.spaceEnv(user, path.join(space.url, dbFile.name).split('/'))\n this.filesQueries.deleteFiles(spaceEnv.dbFile, dbFile.isDir, true).catch((e: Error) => this.logger.error(`${this.deleteDBFile.name} - ${e}`))\n }\n\n private async mergeSpaceRootFiles(space: SpaceEnv, rootFiles: FileProps[], fsFiles: FileProps[], spaceFiles: SpaceFiles) {\n // merges root files in space files taking care of alias and name (file names must be unique)\n if (!rootFiles.length) {\n spaceFiles.files = fsFiles\n return\n }\n spaceFiles.hasRoots = true\n for (const f of rootFiles) {\n // check root alias (must be unique in the space)\n const newAlias: string = await this.spacesManager.uniqueRootAlias(\n space.id,\n f.root.alias,\n fsFiles.map((f) => f.name),\n true\n )\n if (newAlias) {\n this.logger.log(`${this.mergeSpaceRootFiles.name} - update space root alias (${f.root.id}) : ${f.root.alias} -> ${newAlias}`)\n // update in db\n this.spacesQueries\n .updateRoot({ alias: newAlias }, { id: f.root.id })\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // cleanup cache\n this.spacesQueries\n .clearCachePermissions(space.alias, [f.root.alias, newAlias])\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // assign\n f.root.alias = newAlias\n }\n // check root name (must be unique in the space)\n // f.name is equal to root name\n const newName: string = this.spacesManager.uniqueRootName(\n f.name,\n fsFiles.map((f) => f.name)\n )\n if (newName) {\n this.logger.log(`${this.mergeSpaceRootFiles.name} - update space root name (${f.root.id}) : ${f.name} -> ${newName}`)\n // update in db\n this.spacesQueries\n .updateRoot({ name: newName }, { id: f.root.id })\n .catch((e: Error) => this.logger.error(`${this.mergeSpaceRootFiles.name} - ${e}`))\n // assign\n f.name = newName\n }\n }\n spaceFiles.files = [...fsFiles, ...rootFiles]\n }\n\n private async enrichWithLocks(space: SpaceEnv, files: FileProps[]) {\n if (space.inSharesList) {\n return\n }\n const locks: Record<string, FileLock> = await this.filesLockManager.browseParentChildLocks(space.dbFile, false)\n if (!Object.keys(locks).length) return\n for (const f of files.filter((f) => !f.root && !f.origin && f.name in locks)) {\n f.lock = this.filesLockManager.convertLockToFileLockProps(locks[f.name])\n }\n }\n}\n"],"names":["SpacesBrowser","browse","user","space","options","withSyncs","havePermission","USER_PERMISSION","DESKTOP_APP","DESKTOP_APP_SYNC","spaceFiles","files","hasRoots","permissions","browsePermissions","fsFiles","dbFiles","rootFiles","Promise","all","parseFS","parseDB","id","parseRootFiles","withShares","withSpacesAndShares","withHasComments","withLocks","updateDBFiles","inSharesList","mergeSpaceRootFiles","inTrashRepository","enrichWithLocks","filesRecents","updateRecents","catch","e","logger","error","name","inFilesRepository","root","alias","spacesQueries","spaceRootFiles","map","f","updateRootFile","sharesQueries","shareRootFiles","userId","dbOptions","withSpaces","inPersonalSpace","ignoreChildShares","inSharesRepository","filesQueries","browseFiles","dbFile","IsRealPathIsDirAndExists","realPath","warn","message","HttpException","httpCode","parsePath","push","element","fs","readdir","withFileTypes","isDir","isDirectory","isFile","log","configuration","applications","showHiddenFiles","verbose","path","join","filePath","relativeUrl","getProps","realPathFromRootFile","originalPath","fileProps","shares","hasComments","syncs","origin","owner","spaceId","spaceExternalRootId","shareExternalId","ownerId","inTrash","locks","filesLockManager","getLocksByPath","length","lock","convertLockToFileLockProps","compareAndUpdateFileProps","description","enabled","JSON","stringify","fileName","dirName","fsFile","find","spaces","share","deleteDBFile","spaceEnv","spacesManager","url","split","deleteFiles","newAlias","uniqueRootAlias","updateRoot","clearCachePermissions","newName","uniqueRootName","browseParentChildLocks","Object","keys","filter","Logger"],"mappings":"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"}
@@ -759,7 +759,7 @@ let SpacesManager = class SpacesManager {
759
759
  url: ''
760
760
  };
761
761
  this.notificationsManager.create(memberIds, notification, {
762
- currentUrl: this.contextManager.get('headerOriginUrl'),
762
+ currentUrl: this.contextManager.headerOriginUrl(),
763
763
  action: action
764
764
  }).catch((e)=>this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`));
765
765
  }
@@ -789,7 +789,7 @@ let SpacesManager = class SpacesManager {
789
789
  url: `${_spaces.SPACE_REPOSITORY.FILES}/${space.name}`
790
790
  };
791
791
  this.notificationsManager.create(spaceUserIds, notification, {
792
- currentUrl: this.contextManager.get('headerOriginUrl'),
792
+ currentUrl: this.contextManager.headerOriginUrl(),
793
793
  author: user,
794
794
  action: action
795
795
  }).catch((e)=>this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`));