@sync-in/server 1.9.3 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/CHANGELOG.md +41 -4
  2. package/environment/environment.dist.yaml +15 -5
  3. package/package.json +18 -19
  4. package/server/app.bootstrap.js +1 -1
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +3 -2
  7. package/server/app.constants.js.map +1 -1
  8. package/server/applications/files/constants/cache.js +2 -5
  9. package/server/applications/files/constants/cache.js.map +1 -1
  10. package/server/applications/files/constants/files.js +4 -0
  11. package/server/applications/files/constants/files.js.map +1 -1
  12. package/server/applications/files/constants/operations.js +4 -0
  13. package/server/applications/files/constants/operations.js.map +1 -1
  14. package/server/applications/files/constants/routes.js +1 -26
  15. package/server/applications/files/constants/routes.js.map +1 -1
  16. package/server/applications/files/files.config.js +15 -39
  17. package/server/applications/files/files.config.js.map +1 -1
  18. package/server/applications/files/files.controller.js +4 -4
  19. package/server/applications/files/files.controller.js.map +1 -1
  20. package/server/applications/files/files.module.js +12 -9
  21. package/server/applications/files/files.module.js.map +1 -1
  22. package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
  23. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  24. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +32 -0
  25. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -0
  26. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +280 -0
  27. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -0
  28. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +552 -0
  29. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -0
  30. package/server/applications/files/modules/collabora-online/collabora-online.config.js +40 -0
  31. package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -0
  32. package/server/applications/files/modules/collabora-online/collabora-online.constants.js +110 -0
  33. package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -0
  34. package/server/applications/files/modules/collabora-online/collabora-online.controller.js +128 -0
  35. package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -0
  36. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +47 -0
  37. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -0
  38. package/server/applications/files/{interfaces/only-office-config.interface.js → modules/collabora-online/collabora-online.dtos.js} +1 -1
  39. package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -0
  40. package/server/applications/files/{guards/files-only-office.guard.js → modules/collabora-online/collabora-online.guard.js} +7 -21
  41. package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -0
  42. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +86 -0
  43. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -0
  44. package/server/applications/files/modules/collabora-online/collabora-online.interface.js +10 -0
  45. package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -0
  46. package/server/applications/files/modules/collabora-online/collabora-online.module.js +41 -0
  47. package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -0
  48. package/server/applications/files/modules/collabora-online/collabora-online.routes.js +35 -0
  49. package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -0
  50. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +59 -0
  51. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -0
  52. package/server/applications/files/modules/collabora-online/collabora-online.utils.js +28 -0
  53. package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -0
  54. package/server/applications/files/{decorators → modules/only-office}/only-office-environment.decorator.js +5 -5
  55. package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -0
  56. package/server/applications/files/{services/files-only-office-manager.service.js → modules/only-office/only-office-manager.service.js} +101 -97
  57. package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -0
  58. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +477 -0
  59. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -0
  60. package/server/applications/files/modules/only-office/only-office.config.js +51 -0
  61. package/server/applications/files/modules/only-office/only-office.config.js.map +1 -0
  62. package/server/applications/files/modules/only-office/only-office.constants.js +417 -0
  63. package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -0
  64. package/server/applications/files/{files-only-office.controller.js → modules/only-office/only-office.controller.js} +35 -52
  65. package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -0
  66. package/server/applications/files/{files-only-office.controller.spec.js → modules/only-office/only-office.controller.spec.js} +24 -21
  67. package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -0
  68. package/server/applications/files/modules/only-office/only-office.dtos.js +10 -0
  69. package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -0
  70. package/server/applications/files/modules/only-office/only-office.guard.js +40 -0
  71. package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -0
  72. package/server/applications/files/{guards/files-only-office.guard.spec.js → modules/only-office/only-office.guard.spec.js} +15 -21
  73. package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -0
  74. package/server/applications/files/modules/only-office/only-office.interface.js +10 -0
  75. package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -0
  76. package/server/applications/files/modules/only-office/only-office.module.js +41 -0
  77. package/server/applications/files/modules/only-office/only-office.module.js.map +1 -0
  78. package/server/applications/files/modules/only-office/only-office.routes.js +45 -0
  79. package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -0
  80. package/server/applications/files/{guards/files-only-office.strategy.js → modules/only-office/only-office.strategy.js} +11 -11
  81. package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -0
  82. package/server/applications/files/services/files-lock-manager.service.js +25 -33
  83. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  84. package/server/applications/files/services/files-manager.service.js +17 -16
  85. package/server/applications/files/services/files-manager.service.js.map +1 -1
  86. package/server/applications/files/services/files-methods.service.js +2 -2
  87. package/server/applications/files/services/files-methods.service.js.map +1 -1
  88. package/server/applications/files/services/files-methods.service.spec.js +5 -5
  89. package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
  90. package/server/applications/files/services/files-recents.service.js +4 -0
  91. package/server/applications/files/services/files-recents.service.js.map +1 -1
  92. package/server/applications/files/services/files-scheduler.service.js +24 -5
  93. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  94. package/server/applications/files/utils/files.js +10 -2
  95. package/server/applications/files/utils/files.js.map +1 -1
  96. package/server/applications/links/constants/routes.js +5 -0
  97. package/server/applications/links/constants/routes.js.map +1 -1
  98. package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
  99. package/server/applications/links/links.controller.js +25 -5
  100. package/server/applications/links/links.controller.js.map +1 -1
  101. package/server/applications/links/services/links-manager.service.js +43 -21
  102. package/server/applications/links/services/links-manager.service.js.map +1 -1
  103. package/server/applications/links/services/links-manager.service.spec.js +4 -3
  104. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  105. package/server/applications/links/services/links-queries.service.js +9 -2
  106. package/server/applications/links/services/links-queries.service.js.map +1 -1
  107. package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
  108. package/server/applications/shares/services/shares-manager.service.js +3 -0
  109. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.spec.js +2 -1
  111. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  112. package/server/applications/shares/services/shares-queries.service.js +1 -0
  113. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  114. package/server/applications/spaces/constants/spaces.js +2 -2
  115. package/server/applications/spaces/constants/spaces.js.map +1 -1
  116. package/server/applications/spaces/decorators/space-override-permission.decorator.js +18 -0
  117. package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -0
  118. package/server/applications/spaces/guards/space.guard.js +40 -33
  119. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  120. package/server/applications/spaces/guards/space.guard.spec.js +10 -15
  121. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-scheduler.service.js +9 -1
  123. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  124. package/server/applications/webdav/constants/webdav.js +4 -0
  125. package/server/applications/webdav/constants/webdav.js.map +1 -1
  126. package/server/applications/webdav/guards/webdav-protocol.guard.js +9 -8
  127. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  128. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +1 -1
  129. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  130. package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
  131. package/server/applications/webdav/services/webdav-methods.service.js +40 -17
  132. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  133. package/server/applications/webdav/services/webdav-methods.service.spec.js +2157 -1289
  134. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  135. package/server/applications/webdav/utils/webdav.js +8 -4
  136. package/server/applications/webdav/utils/webdav.js.map +1 -1
  137. package/server/applications/webdav/webdav.controller.js +4 -4
  138. package/server/applications/webdav/webdav.controller.js.map +1 -1
  139. package/server/authentication/guards/auth-token-access.guard.js +8 -3
  140. package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
  141. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +1 -1
  142. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -1
  143. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +350 -4
  144. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -1
  145. package/server/configuration/config.environment.js +5 -1
  146. package/server/configuration/config.environment.js.map +1 -1
  147. package/server/configuration/config.interfaces.js.map +1 -1
  148. package/static/3rdpartylicenses.txt +507 -507
  149. package/static/assets/pdfjs/build/pdf.mjs +93 -33
  150. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  151. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  152. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  153. package/static/assets/pdfjs/build/pdf.worker.mjs +166 -54
  154. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  155. package/static/assets/pdfjs/version +1 -1
  156. package/static/assets/pdfjs/web/images/checkmark.svg +5 -0
  157. package/static/assets/pdfjs/web/images/pages_closeButton.svg +3 -0
  158. package/static/assets/pdfjs/web/images/pages_selected.svg +7 -0
  159. package/static/assets/pdfjs/web/images/pages_viewArrow.svg +3 -0
  160. package/static/assets/pdfjs/web/images/pages_viewButton.svg +3 -0
  161. package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -2
  162. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -5
  163. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -6
  164. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -2
  165. package/static/assets/pdfjs/web/locale/da/viewer.ftl +0 -2
  166. package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -2
  167. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -2
  168. package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -2
  169. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +6 -2
  170. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -2
  171. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +82 -17
  172. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -2
  173. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -2
  174. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -2
  175. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +0 -2
  176. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -2
  177. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -2
  178. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -2
  179. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -2
  180. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -5
  181. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +3 -5
  182. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -2
  183. package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -2
  184. package/static/assets/pdfjs/web/locale/hr/viewer.ftl +66 -0
  185. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -2
  186. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -2
  187. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +3 -8
  188. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -2
  189. package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -5
  190. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -5
  191. package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -2
  192. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +0 -14
  193. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +4 -6
  194. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -5
  195. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +0 -2
  196. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -2
  197. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +1 -3
  198. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -2
  199. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +4 -2
  200. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -2
  201. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -2
  202. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -2
  203. package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +35 -0
  204. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -5
  205. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +4 -6
  206. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -5
  207. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -2
  208. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +0 -2
  209. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -2
  210. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -2
  211. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -2
  212. package/static/assets/pdfjs/web/locale/th/viewer.ftl +2 -2
  213. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -2
  214. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -2
  215. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -2
  216. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -2
  217. package/static/assets/pdfjs/web/viewer.css +1778 -835
  218. package/static/assets/pdfjs/web/viewer.html +167 -86
  219. package/static/assets/pdfjs/web/viewer.mjs +1106 -801
  220. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  221. package/static/chunk-27V66YJV.js +2 -0
  222. package/static/{chunk-WJYVS27M.js → chunk-27Z3SYRL.js} +1 -1
  223. package/static/{chunk-NFIES7BC.js → chunk-2RWLNKZH.js} +1 -1
  224. package/static/chunk-2YQ4SX3A.js +13 -0
  225. package/static/{chunk-GENTF6JM.js → chunk-3JYMJQYT.js} +1 -1
  226. package/static/chunk-3QTROEHV.js +1 -0
  227. package/static/{chunk-ZPI7RQ2S.js → chunk-3RPUQ22U.js} +1 -1
  228. package/static/{chunk-R6VB3INJ.js → chunk-3WZ6F3LC.js} +1 -1
  229. package/static/chunk-3ZLBVUCX.js +2 -0
  230. package/static/{chunk-5HCVWZMA.js → chunk-45AZ6ZML.js} +1 -1
  231. package/static/chunk-46TJLPJY.js +1 -0
  232. package/static/chunk-4NIYCYRS.js +2 -0
  233. package/static/{chunk-XXYMVRSH.js → chunk-4TPFERL6.js} +1 -1
  234. package/static/{chunk-CAZSNVMS.js → chunk-5O66CLTD.js} +1 -1
  235. package/static/chunk-6OEOADR6.js +1 -0
  236. package/static/chunk-6WMXMIE4.js +1 -0
  237. package/static/{chunk-NK2NMAJI.js → chunk-7VRYTDX4.js} +1 -1
  238. package/static/{chunk-ASBPYTLT.js → chunk-ARS47O5X.js} +1 -1
  239. package/static/chunk-B6HQYQYG.js +1 -0
  240. package/static/chunk-BCN4T5DO.js +2 -0
  241. package/static/{chunk-PKU4IIIR.js → chunk-CCZWPM7Q.js} +1 -1
  242. package/static/{chunk-QUSS6SUC.js → chunk-CMNMPG6Z.js} +1 -1
  243. package/static/{chunk-GDPJRUVU.js → chunk-CSVPAZHK.js} +1 -1
  244. package/static/{chunk-BJARRIS6.js → chunk-D55YR5X7.js} +4 -4
  245. package/static/{chunk-Z6RJZIDG.js → chunk-D5FQ72R4.js} +1 -1
  246. package/static/{chunk-4DF2SQD4.js → chunk-DGCVA6BM.js} +1 -1
  247. package/static/{chunk-TVJQXN73.js → chunk-DVCN3P7Q.js} +1 -1
  248. package/static/chunk-E32J777S.js +5 -0
  249. package/static/{chunk-5NHB7SV3.js → chunk-FIUF2JM4.js} +1 -1
  250. package/static/{chunk-RJOHDAPM.js → chunk-G3PL6YX3.js} +1 -1
  251. package/static/chunk-G7RZN7HN.js +1 -0
  252. package/static/{chunk-DDRGLHOP.js → chunk-GQHXYX6Z.js} +1 -1
  253. package/static/{chunk-5HYSNQR4.js → chunk-GWRAGN3M.js} +1 -1
  254. package/static/{chunk-ZC5ZDCDC.js → chunk-GXWGB7WO.js} +1 -1
  255. package/static/{chunk-25PWAXTJ.js → chunk-HGODIZTV.js} +1 -1
  256. package/static/{chunk-4KXJ6C4N.js → chunk-HZAB6F4Q.js} +1 -1
  257. package/static/chunk-I3FR3A45.js +1 -0
  258. package/static/{chunk-A6J6SOM6.js → chunk-I5SPA4G2.js} +1 -1
  259. package/static/{chunk-TGHBDJZA.js → chunk-IMFO2MI7.js} +1 -1
  260. package/static/{chunk-CURVLK7L.js → chunk-JNTNMIUH.js} +1 -1
  261. package/static/chunk-JRXG43AA.js +2 -0
  262. package/static/{chunk-XAIOGRBO.js → chunk-KAUCN24H.js} +1 -1
  263. package/static/chunk-KDUAB76O.js +1 -0
  264. package/static/chunk-KPOQLDWF.js +1 -0
  265. package/static/{chunk-HE6EDXWI.js → chunk-KWFELZTM.js} +1 -1
  266. package/static/{chunk-2CAAJBRO.js → chunk-L3BIP4AA.js} +1 -1
  267. package/static/{chunk-U75PLYIJ.js → chunk-LGIVVJDD.js} +1 -1
  268. package/static/{chunk-JEVBUJQ4.js → chunk-LNLBIJZD.js} +1 -1
  269. package/static/chunk-LTJNLOX2.js +1 -0
  270. package/static/{chunk-SDR3UG2F.js → chunk-LZUHREOF.js} +1 -1
  271. package/static/{chunk-VO4WVT6K.js → chunk-NIR4YE2E.js} +1 -1
  272. package/static/{chunk-S6YKBWJE.js → chunk-NJJURHX4.js} +1 -1
  273. package/static/chunk-NNZWSNAW.js +1 -0
  274. package/static/chunk-NWKBB7J4.js +1 -0
  275. package/static/chunk-O3YLAEVE.js +3 -0
  276. package/static/chunk-OUHCDDT6.js +1 -0
  277. package/static/{chunk-ZRBLCAOK.js → chunk-PDG7DOEF.js} +1 -1
  278. package/static/chunk-POUWUMC4.js +1 -0
  279. package/static/{chunk-YTBSB2GE.js → chunk-PPJCVBJH.js} +1 -1
  280. package/static/{chunk-K3MOXDU5.js → chunk-PQZLR4P3.js} +1 -1
  281. package/static/chunk-PVYVY3GD.js +1 -0
  282. package/static/chunk-Q5X5TPAG.js +1 -0
  283. package/static/{chunk-LFAQLJZK.js → chunk-QHJT5H4M.js} +1 -1
  284. package/static/{chunk-A7DSX7VP.js → chunk-R4VMWCM5.js} +1 -1
  285. package/static/{chunk-27XEAHMV.js → chunk-R7PLNX75.js} +1 -1
  286. package/static/chunk-RJULB733.js +1 -0
  287. package/static/{chunk-MBFMTBVJ.js → chunk-RNVPQQKT.js} +5 -5
  288. package/static/chunk-RTNEBRKJ.js +1 -0
  289. package/static/{chunk-FXM7XXWA.js → chunk-S3TTWPQA.js} +1 -1
  290. package/static/{chunk-6VJI4X2A.js → chunk-SDJNZULP.js} +1 -1
  291. package/static/chunk-SNOOCDJD.js +1 -0
  292. package/static/chunk-T42BV6TR.js +1 -0
  293. package/static/{chunk-4OV3SAUS.js → chunk-TNCKNU6I.js} +1 -1
  294. package/static/{chunk-2LHHXDD5.js → chunk-ULSPQ3HP.js} +1 -1
  295. package/static/{chunk-4EUHBTWV.js → chunk-UOK3LKSX.js} +1 -1
  296. package/static/{chunk-7NI353LS.js → chunk-VD5JHSDS.js} +1 -1
  297. package/static/{chunk-YXWF2DGF.js → chunk-XBKCQCBI.js} +1 -1
  298. package/static/{chunk-KBWK65KM.js → chunk-XEWLBWFF.js} +1 -1
  299. package/static/{chunk-FLPZB3OX.js → chunk-XTVNHFKX.js} +1 -1
  300. package/static/chunk-ZCSHU3D7.js +1 -0
  301. package/static/{chunk-FRBTL2ER.js → chunk-ZEJLIGAY.js} +1 -1
  302. package/static/{chunk-7H5O4BLV.js → chunk-ZHOE5VEY.js} +1 -1
  303. package/static/chunk-ZOMRIN3G.js +2 -0
  304. package/static/index.html +2 -2
  305. package/static/main-YKDNJ7LK.js +11 -0
  306. package/static/{styles-S5HVK4H5.css → styles-XLLEY5Y3.css} +1 -1
  307. package/server/applications/files/constants/only-office.js +0 -531
  308. package/server/applications/files/constants/only-office.js.map +0 -1
  309. package/server/applications/files/decorators/only-office-environment.decorator.js.map +0 -1
  310. package/server/applications/files/files-only-office.controller.js.map +0 -1
  311. package/server/applications/files/files-only-office.controller.spec.js.map +0 -1
  312. package/server/applications/files/guards/files-only-office.guard.js.map +0 -1
  313. package/server/applications/files/guards/files-only-office.guard.spec.js.map +0 -1
  314. package/server/applications/files/guards/files-only-office.strategy.js.map +0 -1
  315. package/server/applications/files/interfaces/only-office-config.interface.js.map +0 -1
  316. package/server/applications/files/services/files-only-office-manager.service.js.map +0 -1
  317. package/server/applications/files/services/files-only-office-manager.service.spec.js +0 -58
  318. package/server/applications/files/services/files-only-office-manager.service.spec.js.map +0 -1
  319. package/static/chunk-2XY4PMI5.js +0 -1
  320. package/static/chunk-33WFRCUP.js +0 -1
  321. package/static/chunk-3LVFDMTN.js +0 -1
  322. package/static/chunk-42L6C5MT.js +0 -1
  323. package/static/chunk-5WCQBTXW.js +0 -1
  324. package/static/chunk-A7R246NW.js +0 -1
  325. package/static/chunk-BSB4VROD.js +0 -2
  326. package/static/chunk-DHFQIFOF.js +0 -1
  327. package/static/chunk-DRHPEERW.js +0 -2
  328. package/static/chunk-FCGTI42I.js +0 -1
  329. package/static/chunk-H4RLHI3Y.js +0 -1
  330. package/static/chunk-ITVA26X2.js +0 -2
  331. package/static/chunk-IUJ4IK26.js +0 -1
  332. package/static/chunk-L3PDWJZ3.js +0 -3
  333. package/static/chunk-LBXOAKBD.js +0 -1
  334. package/static/chunk-LZKI5P5T.js +0 -1
  335. package/static/chunk-MYM43ENO.js +0 -1
  336. package/static/chunk-MZBO5PAR.js +0 -1
  337. package/static/chunk-NAH4V2R6.js +0 -2
  338. package/static/chunk-O7UXVNR2.js +0 -1
  339. package/static/chunk-PCFH5HCI.js +0 -2
  340. package/static/chunk-SRBOO7AO.js +0 -1
  341. package/static/chunk-UUX3M6DC.js +0 -1
  342. package/static/chunk-VJ2HWQRJ.js +0 -5
  343. package/static/chunk-VZPCXSRG.js +0 -2
  344. package/static/chunk-W72JYHOH.js +0 -1
  345. package/static/chunk-XHQEF2IX.js +0 -1
  346. package/static/chunk-XKEBQNQJ.js +0 -1
  347. package/static/chunk-ZERBTNFW.js +0 -13
  348. package/static/main-FE6GWZXU.js +0 -11
  349. /package/static/assets/pdfjs/web/images/{toolbarButton-sidebarToggle.svg → toolbarButton-viewsManagerToggle.svg} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Lock,\n Logger,\n Move,\n ParseBoolPipe,\n ParseIntPipe,\n Patch,\n Post,\n Put,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n Unlock,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileLockProps } from './interfaces/file-props.interface'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadCreate(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Put(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadOverwrite(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Patch(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadContent(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n @Lock(`${FILES_ROUTE.OPERATION}/*`)\n async lock(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileLockProps> {\n return this.filesMethods.lock(user, space)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/*`)\n async unlock(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('forceAsOwner', new ParseBoolPipe({ optional: true })) forceAsOwner?: boolean\n ): Promise<void> {\n return this.filesMethods.unlock(user, space, forceAsOwner)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UNLOCK_REQUEST}/*`)\n @UseInterceptors(ContextInterceptor)\n async unlockRequest(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.unlockRequest(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.GET_SIZE}/*`)\n async getSize(@GetSpace() space: SpaceEnv): Promise<{ size: number }> {\n return this.filesMethods.getSize(space)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","uploadCreate","upload","uploadOverwrite","uploadContent","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","lock","unlock","forceAsOwner","unlockRequest","getSize","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","ParseBoolPipe","UNLOCK_REQUEST","GET_SIZE","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Lock,\n Logger,\n Move,\n ParseBoolPipe,\n ParseIntPipe,\n Patch,\n Post,\n Put,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n Unlock,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION, FORCE_AS_FILE_OWNER } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileLockProps } from './interfaces/file-props.interface'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadCreate(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Put(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadOverwrite(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Patch(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadContent(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n @Lock(`${FILES_ROUTE.OPERATION}/*`)\n async lock(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileLockProps> {\n return this.filesMethods.lock(user, space)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/*`)\n async unlock(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query(FORCE_AS_FILE_OWNER, new ParseBoolPipe({ optional: true })) forceAsFileOwner?: boolean\n ): Promise<void> {\n return this.filesMethods.unlock(user, space, forceAsFileOwner)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UNLOCK_REQUEST}/*`)\n @UseInterceptors(ContextInterceptor)\n async unlockRequest(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.unlockRequest(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.GET_SIZE}/*`)\n async getSize(@GetSpace() space: SpaceEnv): Promise<{ size: number }> {\n return this.filesMethods.getSize(space)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Can be used to create or download an archive of files; permissions are checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n await SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","uploadCreate","upload","uploadOverwrite","uploadContent","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","lock","unlock","forceAsFileOwner","unlockRequest","getSize","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","ParseBoolPipe","UNLOCK_REQUEST","GET_SIZE","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
@@ -13,18 +13,17 @@ Object.defineProperty(exports, "FilesModule", {
13
13
  }
14
14
  });
15
15
  const _common = require("@nestjs/common");
16
+ const _configenvironment = require("../../configuration/config.environment");
16
17
  const _filesindexermysqlservice = require("./adapters/files-indexer-mysql.service");
17
- const _filesonlyofficecontroller = require("./files-only-office.controller");
18
18
  const _filestaskscontroller = require("./files-tasks.controller");
19
19
  const _filescontroller = require("./files.controller");
20
- const _filesonlyofficeguard = require("./guards/files-only-office.guard");
21
- const _filesonlyofficestrategy = require("./guards/files-only-office.strategy");
22
20
  const _filesindexer = require("./models/files-indexer");
21
+ const _collaboraonlinemodule = require("./modules/collabora-online/collabora-online.module");
22
+ const _onlyofficemodule = require("./modules/only-office/only-office.module");
23
23
  const _filescontentmanagerservice = require("./services/files-content-manager.service");
24
24
  const _fileslockmanagerservice = require("./services/files-lock-manager.service");
25
25
  const _filesmanagerservice = require("./services/files-manager.service");
26
26
  const _filesmethodsservice = require("./services/files-methods.service");
27
- const _filesonlyofficemanagerservice = require("./services/files-only-office-manager.service");
28
27
  const _filesparserservice = require("./services/files-parser.service");
29
28
  const _filesqueriesservice = require("./services/files-queries.service");
30
29
  const _filesrecentsservice = require("./services/files-recents.service");
@@ -41,10 +40,17 @@ let FilesModule = class FilesModule {
41
40
  };
42
41
  FilesModule = _ts_decorate([
43
42
  (0, _common.Module)({
43
+ imports: [
44
+ ..._configenvironment.configuration.applications.files.onlyoffice.enabled ? [
45
+ _onlyofficemodule.OnlyOfficeModule
46
+ ] : [],
47
+ ..._configenvironment.configuration.applications.files.collabora.enabled ? [
48
+ _collaboraonlinemodule.CollaboraOnlineModule
49
+ ] : []
50
+ ],
44
51
  controllers: [
45
52
  _filescontroller.FilesController,
46
- _filestaskscontroller.FilesTasksController,
47
- _filesonlyofficecontroller.FilesOnlyOfficeController
53
+ _filestaskscontroller.FilesTasksController
48
54
  ],
49
55
  providers: [
50
56
  _filesmethodsservice.FilesMethods,
@@ -54,9 +60,6 @@ FilesModule = _ts_decorate([
54
60
  _filestasksmanagerservice.FilesTasksManager,
55
61
  _filesschedulerservice.FilesScheduler,
56
62
  _filesrecentsservice.FilesRecents,
57
- _filesonlyofficemanagerservice.FilesOnlyOfficeManager,
58
- _filesonlyofficeguard.FilesOnlyOfficeGuard,
59
- _filesonlyofficestrategy.FilesOnlyOfficeStrategy,
60
63
  _filesparserservice.FilesParser,
61
64
  _filescontentmanagerservice.FilesContentManager,
62
65
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files.module.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 { Module } from '@nestjs/common'\nimport { FilesIndexerMySQL } from './adapters/files-indexer-mysql.service'\nimport { FilesOnlyOfficeController } from './files-only-office.controller'\nimport { FilesTasksController } from './files-tasks.controller'\nimport { FilesController } from './files.controller'\nimport { FilesOnlyOfficeGuard } from './guards/files-only-office.guard'\nimport { FilesOnlyOfficeStrategy } from './guards/files-only-office.strategy'\nimport { FilesIndexer } from './models/files-indexer'\nimport { FilesContentManager } from './services/files-content-manager.service'\nimport { FilesLockManager } from './services/files-lock-manager.service'\nimport { FilesManager } from './services/files-manager.service'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\nimport { FilesParser } from './services/files-parser.service'\nimport { FilesQueries } from './services/files-queries.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesScheduler } from './services/files-scheduler.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Module({\n controllers: [FilesController, FilesTasksController, FilesOnlyOfficeController],\n providers: [\n FilesMethods,\n FilesManager,\n FilesQueries,\n FilesLockManager,\n FilesTasksManager,\n FilesScheduler,\n FilesRecents,\n FilesOnlyOfficeManager,\n FilesOnlyOfficeGuard,\n FilesOnlyOfficeStrategy,\n FilesParser,\n FilesContentManager,\n { provide: FilesIndexer, useClass: FilesIndexerMySQL },\n FilesSearchManager\n ],\n exports: [FilesManager, FilesQueries, FilesLockManager, FilesMethods, FilesRecents]\n})\nexport class FilesModule {}\n"],"names":["FilesModule","controllers","FilesController","FilesTasksController","FilesOnlyOfficeController","providers","FilesMethods","FilesManager","FilesQueries","FilesLockManager","FilesTasksManager","FilesScheduler","FilesRecents","FilesOnlyOfficeManager","FilesOnlyOfficeGuard","FilesOnlyOfficeStrategy","FilesParser","FilesContentManager","provide","FilesIndexer","useClass","FilesIndexerMySQL","FilesSearchManager","exports"],"mappings":"AAAA;;;;CAIC;;;;+BA0CYA;;;eAAAA;;;wBAxCU;0CACW;2CACQ;sCACL;iCACL;sCACK;yCACG;8BACX;4CACO;yCACH;qCACJ;qCACA;+CACU;oCACX;qCACC;qCACA;uCACE;2CACI;0CACD;;;;;;;AAsB3B,IAAA,AAAMA,cAAN,MAAMA;AAAa;;;QAnBxBC,aAAa;YAACC,gCAAe;YAAEC,0CAAoB;YAAEC,oDAAyB;SAAC;QAC/EC,WAAW;YACTC,iCAAY;YACZC,iCAAY;YACZC,iCAAY;YACZC,yCAAgB;YAChBC,2CAAiB;YACjBC,qCAAc;YACdC,iCAAY;YACZC,qDAAsB;YACtBC,0CAAoB;YACpBC,gDAAuB;YACvBC,+BAAW;YACXC,+CAAmB;YACnB;gBAAEC,SAASC,0BAAY;gBAAEC,UAAUC,2CAAiB;YAAC;YACrDC,6CAAkB;SACnB;QACDC,SAAS;YAAChB,iCAAY;YAAEC,iCAAY;YAAEC,yCAAgB;YAAEH,iCAAY;YAAEM,iCAAY;SAAC"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files.module.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 { Module } from '@nestjs/common'\nimport { configuration } from '../../configuration/config.environment'\nimport { FilesIndexerMySQL } from './adapters/files-indexer-mysql.service'\nimport { FilesTasksController } from './files-tasks.controller'\nimport { FilesController } from './files.controller'\nimport { FilesIndexer } from './models/files-indexer'\nimport { CollaboraOnlineModule } from './modules/collabora-online/collabora-online.module'\nimport { OnlyOfficeModule } from './modules/only-office/only-office.module'\nimport { FilesContentManager } from './services/files-content-manager.service'\nimport { FilesLockManager } from './services/files-lock-manager.service'\nimport { FilesManager } from './services/files-manager.service'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesParser } from './services/files-parser.service'\nimport { FilesQueries } from './services/files-queries.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesScheduler } from './services/files-scheduler.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Module({\n imports: [\n ...(configuration.applications.files.onlyoffice.enabled ? [OnlyOfficeModule] : []),\n ...(configuration.applications.files.collabora.enabled ? [CollaboraOnlineModule] : [])\n ],\n controllers: [FilesController, FilesTasksController],\n providers: [\n FilesMethods,\n FilesManager,\n FilesQueries,\n FilesLockManager,\n FilesTasksManager,\n FilesScheduler,\n FilesRecents,\n FilesParser,\n FilesContentManager,\n { provide: FilesIndexer, useClass: FilesIndexerMySQL },\n FilesSearchManager\n ],\n exports: [FilesManager, FilesQueries, FilesLockManager, FilesMethods, FilesRecents]\n})\nexport class FilesModule {}\n"],"names":["FilesModule","imports","configuration","applications","files","onlyoffice","enabled","OnlyOfficeModule","collabora","CollaboraOnlineModule","controllers","FilesController","FilesTasksController","providers","FilesMethods","FilesManager","FilesQueries","FilesLockManager","FilesTasksManager","FilesScheduler","FilesRecents","FilesParser","FilesContentManager","provide","FilesIndexer","useClass","FilesIndexerMySQL","FilesSearchManager","exports"],"mappings":"AAAA;;;;CAIC;;;;+BA0CYA;;;eAAAA;;;wBAxCU;mCACO;0CACI;sCACG;iCACL;8BACH;uCACS;kCACL;4CACG;yCACH;qCACJ;qCACA;oCACD;qCACC;qCACA;uCACE;2CACI;0CACD;;;;;;;AAuB3B,IAAA,AAAMA,cAAN,MAAMA;AAAa;;;QApBxBC,SAAS;eACHC,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;gBAACC,kCAAgB;aAAC,GAAG,EAAE;eAC7EL,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACI,SAAS,CAACF,OAAO,GAAG;gBAACG,4CAAqB;aAAC,GAAG,EAAE;SACtF;QACDC,aAAa;YAACC,gCAAe;YAAEC,0CAAoB;SAAC;QACpDC,WAAW;YACTC,iCAAY;YACZC,iCAAY;YACZC,iCAAY;YACZC,yCAAgB;YAChBC,2CAAiB;YACjBC,qCAAc;YACdC,iCAAY;YACZC,+BAAW;YACXC,+CAAmB;YACnB;gBAAEC,SAASC,0BAAY;gBAAEC,UAAUC,2CAAiB;YAAC;YACrDC,6CAAkB;SACnB;QACDC,SAAS;YAACb,iCAAY;YAAEC,iCAAY;YAAEC,yCAAgB;YAAEH,iCAAY;YAAEM,iCAAY;SAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-lock.interface.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 { Owner } from '../../users/interfaces/owner.interface'\nimport { LOCK_DEPTH } from '../../webdav/constants/webdav'\nimport { WebDAVLock } from '../../webdav/interfaces/webdav.interface'\n\nexport interface FileLock {\n owner: Owner\n dbFilePath: string\n key: string\n depth: LOCK_DEPTH\n expiration: number\n davLock?: WebDAVLock\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-lock.interface.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 { SERVER_NAME } from '../../../common/shared'\nimport { Owner } from '../../users/interfaces/owner.interface'\nimport { LOCK_DEPTH, LOCK_SCOPE, WEBDAV_APP_LOCK } from '../../webdav/constants/webdav'\nimport { COLLABORA_APP_LOCK } from '../modules/collabora-online/collabora-online.constants'\nimport { ONLY_OFFICE_APP_LOCK } from '../modules/only-office/only-office.constants'\n\nexport type LOCK_APP = typeof WEBDAV_APP_LOCK | typeof COLLABORA_APP_LOCK | typeof ONLY_OFFICE_APP_LOCK | typeof SERVER_NAME\n\n// Optional lock parameters\nexport interface FileLockOptions {\n // Only locktype write is currently implemented in RFC\n lockRoot: string // Used with webdav (uri)\n lockToken: string\n lockScope: LOCK_SCOPE\n lockInfo?: string // Provided by some WebDAV clients to identify the locking application.\n}\n\nexport interface FileLock {\n owner: Owner\n dbFilePath: string\n key: string\n depth: LOCK_DEPTH\n expiration: number\n app: LOCK_APP // Known application (internal)\n options?: FileLockOptions\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileLockProps {\n owner: string\n ownerLogin: string\n isExclusive: boolean\n}\n\nexport interface FileProps extends Omit<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash'> {\n id: number\n name: string\n path: string\n isDir: boolean\n size: number\n ctime: number\n mtime: number\n mime: string\n inTrash?: boolean\n // used with shares\n origin?: {\n ownerId: number\n ownerLogin: string\n spaceId: number\n spaceAlias: string\n spaceExternalRootId: number\n spaceRootExternalPath: string\n shareExternalId: number\n }\n // root can be a share or a space root\n // enabled, and description are only used for shares\n root?: Pick<SpaceRoot, 'id' | 'alias' | 'permissions'> &\n Partial<Pick<SpaceRoot, 'name' | 'externalPath'>> &\n Partial<Pick<Share, 'enabled' | 'description'>> & {\n owner: Owner\n }\n lock?: FileLockProps\n // used by the file browser to enrich files\n spaces?: Pick<Space, 'id' | 'alias' | 'name'>[]\n shares?: Pick<Share, 'id' | 'alias' | 'name' | 'type'>[]\n syncs?: Pick<SyncPath, 'clientId' | 'id'> & { clientName: string }[]\n hasComments?: boolean\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileLockProps {\n owner: Owner\n app: string\n info?: string\n isExclusive: boolean\n}\n\nexport interface FileProps extends Omit<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash'> {\n id: number\n name: string\n path: string\n isDir: boolean\n size: number\n ctime: number\n mtime: number\n mime: string\n inTrash?: boolean\n // used with shares\n origin?: {\n ownerId: number\n ownerLogin: string\n spaceId: number\n spaceAlias: string\n spaceExternalRootId: number\n spaceRootExternalPath: string\n shareExternalId: number\n }\n // root can be a share or a space root\n // enabled, and description are only used for shares\n root?: Pick<SpaceRoot, 'id' | 'alias' | 'permissions'> &\n Partial<Pick<SpaceRoot, 'name' | 'externalPath'>> &\n Partial<Pick<Share, 'enabled' | 'description'>> & {\n owner: Owner\n }\n lock?: FileLockProps\n // used by the file browser to enrich files\n spaces?: Pick<Space, 'id' | 'alias' | 'name'>[]\n shares?: Pick<Share, 'id' | 'alias' | 'name' | 'type'>[]\n syncs?: Pick<SyncPath, 'clientId' | 'id'> & { clientName: string }[]\n hasComments?: boolean\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ function _export(target, all) {
10
+ for(var name in all)Object.defineProperty(target, name, {
11
+ enumerable: true,
12
+ get: Object.getOwnPropertyDescriptor(all, name).get
13
+ });
14
+ }
15
+ _export(exports, {
16
+ get CollaboraOnlineContext () {
17
+ return CollaboraOnlineContext;
18
+ },
19
+ get CollaboraOnlineEnvironment () {
20
+ return CollaboraOnlineEnvironment;
21
+ }
22
+ });
23
+ const _common = require("@nestjs/common");
24
+ const _spaceguard = require("../../../spaces/guards/space.guard");
25
+ const _collaboraonlineconstants = require("./collabora-online.constants");
26
+ const _collaboraonlineguard = require("./collabora-online.guard");
27
+ const CollaboraOnlineContext = ()=>(0, _common.SetMetadata)(_collaboraonlineconstants.COLLABORA_CONTEXT, true);
28
+ const CollaboraOnlineEnvironment = ()=>{
29
+ return (0, _common.applyDecorators)(CollaboraOnlineContext(), (0, _common.UseGuards)(_collaboraonlineguard.CollaboraOnlineGuard, _spaceguard.SpaceGuard));
30
+ };
31
+
32
+ //# sourceMappingURL=collabora-online-environment.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../backend/src/applications/files/modules/collabora-online/collabora-online-environment.decorator.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 { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common'\nimport { SpaceGuard } from '../../../spaces/guards/space.guard'\nimport { COLLABORA_CONTEXT } from './collabora-online.constants'\nimport { CollaboraOnlineGuard } from './collabora-online.guard'\n\nexport const CollaboraOnlineContext = () => SetMetadata(COLLABORA_CONTEXT, true)\nexport const CollaboraOnlineEnvironment = () => {\n return applyDecorators(CollaboraOnlineContext(), UseGuards(CollaboraOnlineGuard, SpaceGuard))\n}\n"],"names":["CollaboraOnlineContext","CollaboraOnlineEnvironment","SetMetadata","COLLABORA_CONTEXT","applyDecorators","UseGuards","CollaboraOnlineGuard","SpaceGuard"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAOYA;eAAAA;;QACAC;eAAAA;;;wBAN2C;4BAC7B;0CACO;sCACG;AAE9B,MAAMD,yBAAyB,IAAME,IAAAA,mBAAW,EAACC,2CAAiB,EAAE;AACpE,MAAMF,6BAA6B;IACxC,OAAOG,IAAAA,uBAAe,EAACJ,0BAA0BK,IAAAA,iBAAS,EAACC,0CAAoB,EAAEC,sBAAU;AAC7F"}
@@ -0,0 +1,280 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "CollaboraOnlineManager", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return CollaboraOnlineManager;
13
+ }
14
+ });
15
+ const _common = require("@nestjs/common");
16
+ const _jwt = require("@nestjs/jwt");
17
+ const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
18
+ const _nodeos = /*#__PURE__*/ _interop_require_default(require("node:os"));
19
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
20
+ const _functions = require("../../../../common/functions");
21
+ const _configenvironment = require("../../../../configuration/config.environment");
22
+ const _contextmanagerservice = require("../../../../infrastructure/context/services/context-manager.service");
23
+ const _spaces = require("../../../spaces/constants/spaces");
24
+ const _permissions = require("../../../spaces/utils/permissions");
25
+ const _avatar = require("../../../users/utils/avatar");
26
+ const _webdav = require("../../../webdav/constants/webdav");
27
+ const _operations = require("../../constants/operations");
28
+ const _filelockerror = require("../../models/file-lock-error");
29
+ const _fileslockmanagerservice = require("../../services/files-lock-manager.service");
30
+ const _files = require("../../utils/files");
31
+ const _collaboraonlineconstants = require("./collabora-online.constants");
32
+ const _collaboraonlineroutes = require("./collabora-online.routes");
33
+ function _interop_require_default(obj) {
34
+ return obj && obj.__esModule ? obj : {
35
+ default: obj
36
+ };
37
+ }
38
+ function _ts_decorate(decorators, target, key, desc) {
39
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
40
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
41
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
42
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
43
+ }
44
+ function _ts_metadata(k, v) {
45
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
46
+ }
47
+ let CollaboraOnlineManager = class CollaboraOnlineManager {
48
+ async getSettings(user, space) {
49
+ await this.checkSpace(space);
50
+ const fileExtension = _nodepath.default.extname(space.realPath).slice(1);
51
+ if (!_collaboraonlineconstants.COLLABORA_ONLINE_EXTENSIONS.has(fileExtension)) {
52
+ throw new _common.HttpException('Document not supported', _common.HttpStatus.BAD_REQUEST);
53
+ }
54
+ let hasLock = false;
55
+ let mode = (0, _permissions.haveSpaceEnvPermissions)(space, _spaces.SPACE_OPERATION.MODIFY) ? _operations.FILE_MODE.EDIT : _operations.FILE_MODE.VIEW;
56
+ if (mode === _operations.FILE_MODE.EDIT) {
57
+ // Check lock conflicts
58
+ try {
59
+ await this.filesLockManager.checkConflicts(space.dbFile, _webdav.DEPTH.RESOURCE, {
60
+ userId: user.id,
61
+ app: _collaboraonlineconstants.COLLABORA_APP_LOCK,
62
+ lockScope: _webdav.LOCK_SCOPE.SHARED
63
+ });
64
+ } catch (e) {
65
+ if (e instanceof _filelockerror.LockConflict) {
66
+ hasLock = this.filesLockManager.convertLockToFileLockProps(e.lock);
67
+ mode = _operations.FILE_MODE.VIEW;
68
+ } else {
69
+ this.logger.error(`${this.getSettings.name} - ${e}`);
70
+ throw new _common.HttpException('Unable to check file lock', _common.HttpStatus.INTERNAL_SERVER_ERROR);
71
+ }
72
+ }
73
+ }
74
+ const dbFileHash = (0, _files.genUniqHashFromFileDBProps)(space.dbFile);
75
+ const authToken = await this.genAuthToken(user, space, dbFileHash);
76
+ return {
77
+ documentServerUrl: this.getDocumentUrl(dbFileHash, authToken),
78
+ mode: mode,
79
+ hasLock: hasLock
80
+ };
81
+ }
82
+ async checkFileInfo(req) {
83
+ const fStats = await _promises.default.stat(req.space.realPath);
84
+ return {
85
+ BaseFileName: (0, _files.fileName)(req.space.realPath),
86
+ Version: (0, _files.genEtag)(null, req.space.realPath, false),
87
+ OwnerId: `${req.space.dbFile.ownerId || req.user.id}`,
88
+ Size: fStats.size,
89
+ LastModifiedTime: fStats.mtime.toISOString(),
90
+ UserId: `${req.user.id}`,
91
+ UserFriendlyName: `${req.user.fullName} (${req.user.email})`,
92
+ ReadOnly: false,
93
+ UserExtraInfo: {
94
+ avatar: await (0, _avatar.getAvatarBase64)(req.user.login)
95
+ },
96
+ UserCanNotWriteRelative: true,
97
+ UserCanWrite: (0, _permissions.haveSpaceEnvPermissions)(req.space, _spaces.SPACE_OPERATION.MODIFY),
98
+ UserCanRename: false,
99
+ SupportsUpdate: true,
100
+ SupportsRename: false,
101
+ SupportsExport: true,
102
+ SupportsCoauth: true,
103
+ SupportsLocks: true,
104
+ SupportsGetLock: true
105
+ };
106
+ }
107
+ async saveDocument(req) {
108
+ await this.checkSpace(req.space);
109
+ await this.checkTimeStampFromHeaders(req);
110
+ const tmpFilePath = await (0, _files.uniqueFilePathFromDir)(_nodepath.default.join(_nodeos.default.tmpdir(), (0, _files.fileName)(req.space.realPath)));
111
+ try {
112
+ await (0, _files.writeFromStream)(tmpFilePath, req.raw);
113
+ } catch (e) {
114
+ throw new Error(`unable to save document : ${e.message}`);
115
+ }
116
+ // try to verify the downloaded size
117
+ const contentLength = parseInt(req.headers['content-length'], 10);
118
+ if (!isNaN(contentLength) && contentLength !== 0) {
119
+ const tmpFileSize = await (0, _files.fileSize)(tmpFilePath);
120
+ if (tmpFileSize !== contentLength) {
121
+ this.logger.error(`${this.saveDocument.name} - document size differs (${tmpFileSize} != ${contentLength})`);
122
+ throw new _common.HttpException('Size Mismatch', _common.HttpStatus.BAD_REQUEST);
123
+ }
124
+ } else if (contentLength === 0) {
125
+ this.logger.warn(`${this.saveDocument.name} - content length is 0 : ${req.space.url}`);
126
+ }
127
+ // copy contents to avoid inode changes (dbFileHash in some cases)
128
+ try {
129
+ // todo: versioning
130
+ await (0, _files.copyFileContent)(tmpFilePath, req.space.realPath);
131
+ await (0, _files.removeFiles)(tmpFilePath);
132
+ const fStats = await _promises.default.stat(req.space.realPath);
133
+ return {
134
+ LastModifiedTime: fStats.mtime.toISOString()
135
+ };
136
+ } catch (e) {
137
+ this.logger.error(`${this.saveDocument.name} - unable to save document: ${e}`);
138
+ throw new _common.HttpException('Unable to save document', _common.HttpStatus.INTERNAL_SERVER_ERROR);
139
+ }
140
+ }
141
+ async manageLock(req, res) {
142
+ const lockAction = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.Action];
143
+ switch(lockAction){
144
+ case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.LOCK:
145
+ {
146
+ const reqLockToken = this.lockTokenFromHeaders(req);
147
+ const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
148
+ if (currentLock) {
149
+ await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration);
150
+ break;
151
+ }
152
+ const [ok, fileLock] = await this.filesLockManager.create(req.user, req.space.dbFile, _collaboraonlineconstants.COLLABORA_APP_LOCK, _webdav.DEPTH.RESOURCE, {
153
+ lockRoot: null,
154
+ lockToken: reqLockToken,
155
+ lockScope: _webdav.LOCK_SCOPE.SHARED // Collabora uses one lock for the session
156
+ }, this.expiration);
157
+ if (!ok) {
158
+ this.lockConflict(res, fileLock.options.lockToken);
159
+ return;
160
+ }
161
+ break;
162
+ }
163
+ case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.UNLOCK:
164
+ {
165
+ const reqLockToken = this.lockTokenFromHeaders(req);
166
+ const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
167
+ if (currentLock) {
168
+ await this.filesLockManager.removeLock(currentLock.key);
169
+ } else {
170
+ throw new _common.HttpException('Lock not found', _common.HttpStatus.CONFLICT);
171
+ }
172
+ break;
173
+ }
174
+ case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.GET_LOCK:
175
+ {
176
+ const lock = await this.filesLockManager.getLocksByPath(req.space.dbFile);
177
+ if (lock.length) {
178
+ res.header(_collaboraonlineconstants.COLLABORA_HEADERS.LockToken, lock[0].options.lockToken);
179
+ }
180
+ break;
181
+ }
182
+ case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.REFRESH_LOCK:
183
+ {
184
+ const reqLockToken = this.lockTokenFromHeaders(req);
185
+ const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
186
+ if (currentLock) {
187
+ await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration);
188
+ } else {
189
+ throw new _common.HttpException('Lock not found', _common.HttpStatus.CONFLICT);
190
+ }
191
+ break;
192
+ }
193
+ default:
194
+ this.logger.warn(`${this.manageLock.name} - Unknown lock action: ${lockAction}`);
195
+ throw new _common.HttpException('Unknown lock action', _common.HttpStatus.BAD_REQUEST);
196
+ }
197
+ }
198
+ getDocumentUrl(dbFileHash, token) {
199
+ const collaboraBase = this.externalCollaboraOnlineServer || this.contextManager.headerOriginUrl();
200
+ // Example:
201
+ // - external: https://collabora.domain.com
202
+ // - internal (via nginx proxy): https://domain.com/*
203
+ const editorUrl = new URL(_collaboraonlineconstants.COLLABORA_URI, collaboraBase);
204
+ // → /browser/dist/cool.html
205
+ const wopiSrcUrl = new URL(`${_collaboraonlineroutes.API_COLLABORA_ONLINE_FILES}/${dbFileHash}`, this.contextManager.headerOriginUrl());
206
+ // → https://domain.com/wopi/files/888
207
+ editorUrl.searchParams.set(_collaboraonlineconstants.COLLABORA_WOPI_SRC_QUERY_PARAM_NAME, wopiSrcUrl.toString());
208
+ editorUrl.searchParams.set(_collaboraonlineconstants.COLLABORA_TOKEN_QUERY_PARAM_NAME, token);
209
+ return editorUrl.toString();
210
+ }
211
+ genAuthToken(user, space, dbFileHash) {
212
+ // use refresh expiration to allow long sessions
213
+ return this.jwt.signAsync({
214
+ identity: {
215
+ id: user.id,
216
+ login: user.login,
217
+ email: user.email,
218
+ fullName: user.fullName,
219
+ language: user.language,
220
+ role: user.role,
221
+ applications: user.applications,
222
+ spaceUrl: space.url,
223
+ dbFileHash: dbFileHash
224
+ }
225
+ }, {
226
+ secret: _configenvironment.configuration.auth.token.access.secret,
227
+ expiresIn: this.expiration
228
+ });
229
+ }
230
+ lockTokenFromHeaders(req) {
231
+ const lockToken = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.LockToken];
232
+ if (!lockToken) {
233
+ throw new _common.HttpException('Lock token is required', _common.HttpStatus.CONFLICT);
234
+ }
235
+ return lockToken;
236
+ }
237
+ lockConflict(res, currentLockToken) {
238
+ res.header(_collaboraonlineconstants.COLLABORA_HEADERS.LockToken, currentLockToken);
239
+ throw new _common.HttpException('The file is locked', _common.HttpStatus.CONFLICT);
240
+ }
241
+ async checkTimeStampFromHeaders(req) {
242
+ const timestamp = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.Timestamp];
243
+ if (!timestamp) {
244
+ return;
245
+ }
246
+ const fStats = await _promises.default.stat(req.space.realPath);
247
+ if (fStats.mtime.toISOString() !== timestamp) {
248
+ throw new _common.HttpException({
249
+ LOOLStatusCode: 1010
250
+ }, _common.HttpStatus.CONFLICT);
251
+ }
252
+ }
253
+ async checkSpace(space) {
254
+ if (!await (0, _files.isPathExists)(space.realPath)) {
255
+ throw new _common.HttpException('Document not found', _common.HttpStatus.NOT_FOUND);
256
+ }
257
+ if (await (0, _files.isPathIsDir)(space.realPath)) {
258
+ throw new _common.HttpException('Document must be a file', _common.HttpStatus.BAD_REQUEST);
259
+ }
260
+ }
261
+ constructor(contextManager, jwt, filesLockManager){
262
+ this.contextManager = contextManager;
263
+ this.jwt = jwt;
264
+ this.filesLockManager = filesLockManager;
265
+ this.logger = new _common.Logger(CollaboraOnlineManager.name);
266
+ this.externalCollaboraOnlineServer = _configenvironment.configuration.applications.files.collabora.externalServer || null;
267
+ this.expiration = (0, _functions.convertHumanTimeToSeconds)(_configenvironment.configuration.auth.token.refresh.expiration);
268
+ }
269
+ };
270
+ CollaboraOnlineManager = _ts_decorate([
271
+ (0, _common.Injectable)(),
272
+ _ts_metadata("design:type", Function),
273
+ _ts_metadata("design:paramtypes", [
274
+ typeof _contextmanagerservice.ContextManager === "undefined" ? Object : _contextmanagerservice.ContextManager,
275
+ typeof _jwt.JwtService === "undefined" ? Object : _jwt.JwtService,
276
+ typeof _fileslockmanagerservice.FilesLockManager === "undefined" ? Object : _fileslockmanagerservice.FilesLockManager
277
+ ])
278
+ ], CollaboraOnlineManager);
279
+
280
+ //# sourceMappingURL=collabora-online-manager.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../backend/src/applications/files/modules/collabora-online/collabora-online-manager.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, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { JwtService } from '@nestjs/jwt'\nimport { FastifyReply } from 'fastify'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { convertHumanTimeToSeconds } from '../../../../common/functions'\nimport { configuration } from '../../../../configuration/config.environment'\nimport { ContextManager } from '../../../../infrastructure/context/services/context-manager.service'\nimport { SPACE_OPERATION } from '../../../spaces/constants/spaces'\nimport type { SpaceEnv } from '../../../spaces/models/space-env.model'\nimport { haveSpaceEnvPermissions } from '../../../spaces/utils/permissions'\nimport type { UserModel } from '../../../users/models/user.model'\nimport { getAvatarBase64 } from '../../../users/utils/avatar'\nimport { DEPTH, LOCK_SCOPE } from '../../../webdav/constants/webdav'\nimport { FILE_MODE } from '../../constants/operations'\nimport { FileLockOptions } from '../../interfaces/file-lock.interface'\nimport { FileLockProps } from '../../interfaces/file-props.interface'\nimport { LockConflict } from '../../models/file-lock-error'\nimport { FilesLockManager } from '../../services/files-lock-manager.service'\nimport {\n copyFileContent,\n fileName,\n fileSize,\n genEtag,\n genUniqHashFromFileDBProps,\n isPathExists,\n isPathIsDir,\n removeFiles,\n uniqueFilePathFromDir,\n writeFromStream\n} from '../../utils/files'\nimport {\n COLLABORA_APP_LOCK,\n COLLABORA_HEADERS,\n COLLABORA_LOCK_ACTION,\n COLLABORA_ONLINE_EXTENSIONS,\n COLLABORA_TOKEN_QUERY_PARAM_NAME,\n COLLABORA_URI,\n COLLABORA_WOPI_SRC_QUERY_PARAM_NAME\n} from './collabora-online.constants'\nimport { CollaboraOnlineReqDto, CollaboraSaveDocumentDto } from './collabora-online.dtos'\nimport { CollaboraOnlineCheckFileInfo, FastifyCollaboraOnlineSpaceRequest, JwtCollaboraOnlinePayload } from './collabora-online.interface'\nimport { API_COLLABORA_ONLINE_FILES } from './collabora-online.routes'\n\n@Injectable()\nexport class CollaboraOnlineManager {\n private logger = new Logger(CollaboraOnlineManager.name)\n private readonly externalCollaboraOnlineServer = configuration.applications.files.collabora.externalServer || null\n private readonly expiration = convertHumanTimeToSeconds(configuration.auth.token.refresh.expiration)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly jwt: JwtService,\n private readonly filesLockManager: FilesLockManager\n ) {}\n\n async getSettings(user: UserModel, space: SpaceEnv): Promise<CollaboraOnlineReqDto> {\n await this.checkSpace(space)\n const fileExtension = path.extname(space.realPath).slice(1)\n if (!COLLABORA_ONLINE_EXTENSIONS.has(fileExtension)) {\n throw new HttpException('Document not supported', HttpStatus.BAD_REQUEST)\n }\n let hasLock: false | FileLockProps = false\n let mode: FILE_MODE = haveSpaceEnvPermissions(space, SPACE_OPERATION.MODIFY) ? FILE_MODE.EDIT : FILE_MODE.VIEW\n if (mode === FILE_MODE.EDIT) {\n // Check lock conflicts\n try {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, {\n userId: user.id,\n app: COLLABORA_APP_LOCK,\n lockScope: LOCK_SCOPE.SHARED\n })\n } catch (e) {\n if (e instanceof LockConflict) {\n hasLock = this.filesLockManager.convertLockToFileLockProps(e.lock)\n mode = FILE_MODE.VIEW\n } else {\n this.logger.error(`${this.getSettings.name} - ${e}`)\n throw new HttpException('Unable to check file lock', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n }\n const dbFileHash = genUniqHashFromFileDBProps(space.dbFile)\n const authToken: string = await this.genAuthToken(user, space, dbFileHash)\n return { documentServerUrl: this.getDocumentUrl(dbFileHash, authToken), mode: mode, hasLock: hasLock }\n }\n\n async checkFileInfo(req: FastifyCollaboraOnlineSpaceRequest): Promise<CollaboraOnlineCheckFileInfo> {\n const fStats = await fs.stat(req.space.realPath)\n return {\n BaseFileName: fileName(req.space.realPath),\n Version: genEtag(null, req.space.realPath, false),\n OwnerId: `${req.space.dbFile.ownerId || req.user.id}`,\n Size: fStats.size,\n LastModifiedTime: fStats.mtime.toISOString(),\n UserId: `${req.user.id}`,\n UserFriendlyName: `${req.user.fullName} (${req.user.email})`,\n ReadOnly: false,\n UserExtraInfo: { avatar: await getAvatarBase64(req.user.login) },\n UserCanNotWriteRelative: true,\n UserCanWrite: haveSpaceEnvPermissions(req.space, SPACE_OPERATION.MODIFY),\n UserCanRename: false,\n SupportsUpdate: true,\n SupportsRename: false,\n SupportsExport: true,\n SupportsCoauth: true,\n SupportsLocks: true,\n SupportsGetLock: true\n } satisfies CollaboraOnlineCheckFileInfo\n }\n\n async saveDocument(req: FastifyCollaboraOnlineSpaceRequest): Promise<CollaboraSaveDocumentDto> {\n await this.checkSpace(req.space)\n await this.checkTimeStampFromHeaders(req)\n const tmpFilePath = await uniqueFilePathFromDir(path.join(os.tmpdir(), fileName(req.space.realPath)))\n try {\n await writeFromStream(tmpFilePath, req.raw)\n } catch (e) {\n throw new Error(`unable to save document : ${e.message}`)\n }\n // try to verify the downloaded size\n const contentLength = parseInt(req.headers['content-length'], 10)\n if (!isNaN(contentLength) && contentLength !== 0) {\n const tmpFileSize = await fileSize(tmpFilePath)\n if (tmpFileSize !== contentLength) {\n this.logger.error(`${this.saveDocument.name} - document size differs (${tmpFileSize} != ${contentLength})`)\n throw new HttpException('Size Mismatch', HttpStatus.BAD_REQUEST)\n }\n } else if (contentLength === 0) {\n this.logger.warn(`${this.saveDocument.name} - content length is 0 : ${req.space.url}`)\n }\n // copy contents to avoid inode changes (dbFileHash in some cases)\n try {\n // todo: versioning\n await copyFileContent(tmpFilePath, req.space.realPath)\n await removeFiles(tmpFilePath)\n const fStats = await fs.stat(req.space.realPath)\n return { LastModifiedTime: fStats.mtime.toISOString() } satisfies CollaboraSaveDocumentDto\n } catch (e) {\n this.logger.error(`${this.saveDocument.name} - unable to save document: ${e}`)\n throw new HttpException('Unable to save document', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async manageLock(req: FastifyCollaboraOnlineSpaceRequest, res: FastifyReply) {\n const lockAction = req.headers[COLLABORA_HEADERS.Action] as COLLABORA_LOCK_ACTION\n switch (lockAction) {\n case COLLABORA_LOCK_ACTION.LOCK: {\n const reqLockToken = this.lockTokenFromHeaders(req)\n const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path)\n if (currentLock) {\n await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration)\n break\n }\n const [ok, fileLock] = await this.filesLockManager.create(\n req.user,\n req.space.dbFile,\n COLLABORA_APP_LOCK,\n DEPTH.RESOURCE,\n {\n lockRoot: null,\n lockToken: reqLockToken,\n lockScope: LOCK_SCOPE.SHARED // Collabora uses one lock for the session\n } satisfies FileLockOptions,\n this.expiration\n )\n if (!ok) {\n this.lockConflict(res, fileLock.options.lockToken)\n return\n }\n break\n }\n case COLLABORA_LOCK_ACTION.UNLOCK: {\n const reqLockToken = this.lockTokenFromHeaders(req)\n const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path)\n if (currentLock) {\n await this.filesLockManager.removeLock(currentLock.key)\n } else {\n throw new HttpException('Lock not found', HttpStatus.CONFLICT)\n }\n break\n }\n case COLLABORA_LOCK_ACTION.GET_LOCK: {\n const lock = await this.filesLockManager.getLocksByPath(req.space.dbFile)\n if (lock.length) {\n res.header(COLLABORA_HEADERS.LockToken, lock[0].options.lockToken)\n }\n break\n }\n case COLLABORA_LOCK_ACTION.REFRESH_LOCK: {\n const reqLockToken = this.lockTokenFromHeaders(req)\n const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path)\n if (currentLock) {\n await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration)\n } else {\n throw new HttpException('Lock not found', HttpStatus.CONFLICT)\n }\n break\n }\n default:\n this.logger.warn(`${this.manageLock.name} - Unknown lock action: ${lockAction}`)\n throw new HttpException('Unknown lock action', HttpStatus.BAD_REQUEST)\n }\n }\n\n private getDocumentUrl(dbFileHash: string, token: string): string {\n const collaboraBase = this.externalCollaboraOnlineServer || this.contextManager.headerOriginUrl()\n // Example:\n // - external: https://collabora.domain.com\n // - internal (via nginx proxy): https://domain.com/*\n\n const editorUrl = new URL(COLLABORA_URI, collaboraBase)\n // → /browser/dist/cool.html\n\n const wopiSrcUrl = new URL(`${API_COLLABORA_ONLINE_FILES}/${dbFileHash}`, this.contextManager.headerOriginUrl())\n // → https://domain.com/wopi/files/888\n\n editorUrl.searchParams.set(COLLABORA_WOPI_SRC_QUERY_PARAM_NAME, wopiSrcUrl.toString())\n editorUrl.searchParams.set(COLLABORA_TOKEN_QUERY_PARAM_NAME, token)\n\n return editorUrl.toString()\n }\n\n private genAuthToken(user: UserModel, space: SpaceEnv, dbFileHash: string): Promise<string> {\n // use refresh expiration to allow long sessions\n return this.jwt.signAsync(\n {\n identity: {\n id: user.id,\n login: user.login,\n email: user.email,\n fullName: user.fullName,\n language: user.language,\n role: user.role,\n applications: user.applications,\n spaceUrl: space.url,\n dbFileHash: dbFileHash\n } satisfies JwtCollaboraOnlinePayload\n },\n {\n secret: configuration.auth.token.access.secret,\n expiresIn: this.expiration\n }\n )\n }\n\n private lockTokenFromHeaders(req: FastifyCollaboraOnlineSpaceRequest): string {\n const lockToken = req.headers[COLLABORA_HEADERS.LockToken] as string\n if (!lockToken) {\n throw new HttpException('Lock token is required', HttpStatus.CONFLICT)\n }\n return lockToken\n }\n\n private lockConflict(res: FastifyReply, currentLockToken: string) {\n res.header(COLLABORA_HEADERS.LockToken, currentLockToken)\n throw new HttpException('The file is locked', HttpStatus.CONFLICT)\n }\n\n private async checkTimeStampFromHeaders(req: FastifyCollaboraOnlineSpaceRequest) {\n const timestamp = req.headers[COLLABORA_HEADERS.Timestamp] as string\n if (!timestamp) {\n return\n }\n const fStats = await fs.stat(req.space.realPath)\n if (fStats.mtime.toISOString() !== timestamp) {\n throw new HttpException({ LOOLStatusCode: 1010 }, HttpStatus.CONFLICT)\n }\n }\n\n private async checkSpace(space: SpaceEnv) {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Document not found', HttpStatus.NOT_FOUND)\n }\n if (await isPathIsDir(space.realPath)) {\n throw new HttpException('Document must be a file', HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["CollaboraOnlineManager","getSettings","user","space","checkSpace","fileExtension","path","extname","realPath","slice","COLLABORA_ONLINE_EXTENSIONS","has","HttpException","HttpStatus","BAD_REQUEST","hasLock","mode","haveSpaceEnvPermissions","SPACE_OPERATION","MODIFY","FILE_MODE","EDIT","VIEW","filesLockManager","checkConflicts","dbFile","DEPTH","RESOURCE","userId","id","app","COLLABORA_APP_LOCK","lockScope","LOCK_SCOPE","SHARED","e","LockConflict","convertLockToFileLockProps","lock","logger","error","name","INTERNAL_SERVER_ERROR","dbFileHash","genUniqHashFromFileDBProps","authToken","genAuthToken","documentServerUrl","getDocumentUrl","checkFileInfo","req","fStats","fs","stat","BaseFileName","fileName","Version","genEtag","OwnerId","ownerId","Size","size","LastModifiedTime","mtime","toISOString","UserId","UserFriendlyName","fullName","email","ReadOnly","UserExtraInfo","avatar","getAvatarBase64","login","UserCanNotWriteRelative","UserCanWrite","UserCanRename","SupportsUpdate","SupportsRename","SupportsExport","SupportsCoauth","SupportsLocks","SupportsGetLock","saveDocument","checkTimeStampFromHeaders","tmpFilePath","uniqueFilePathFromDir","join","os","tmpdir","writeFromStream","raw","Error","message","contentLength","parseInt","headers","isNaN","tmpFileSize","fileSize","warn","url","copyFileContent","removeFiles","manageLock","res","lockAction","COLLABORA_HEADERS","Action","COLLABORA_LOCK_ACTION","LOCK","reqLockToken","lockTokenFromHeaders","currentLock","isLockedWithToken","refreshLockTimeout","expiration","ok","fileLock","create","lockRoot","lockToken","lockConflict","options","UNLOCK","removeLock","key","CONFLICT","GET_LOCK","getLocksByPath","length","header","LockToken","REFRESH_LOCK","token","collaboraBase","externalCollaboraOnlineServer","contextManager","headerOriginUrl","editorUrl","URL","COLLABORA_URI","wopiSrcUrl","API_COLLABORA_ONLINE_FILES","searchParams","set","COLLABORA_WOPI_SRC_QUERY_PARAM_NAME","toString","COLLABORA_TOKEN_QUERY_PARAM_NAME","jwt","signAsync","identity","language","role","applications","spaceUrl","secret","configuration","auth","access","expiresIn","currentLockToken","timestamp","Timestamp","LOOLStatusCode","isPathExists","NOT_FOUND","isPathIsDir","Logger","files","collabora","externalServer","convertHumanTimeToSeconds","refresh"],"mappings":"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"}