@sync-in/server 1.9.6 → 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 (344) hide show
  1. package/CHANGELOG.md +29 -4
  2. package/environment/environment.dist.yaml +15 -5
  3. package/package.json +13 -14
  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 +3 -1
  89. package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
  90. package/server/applications/files/services/files-scheduler.service.js +2 -2
  91. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  92. package/server/applications/files/utils/files.js +10 -2
  93. package/server/applications/files/utils/files.js.map +1 -1
  94. package/server/applications/links/constants/routes.js +5 -0
  95. package/server/applications/links/constants/routes.js.map +1 -1
  96. package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
  97. package/server/applications/links/links.controller.js +25 -5
  98. package/server/applications/links/links.controller.js.map +1 -1
  99. package/server/applications/links/services/links-manager.service.js +43 -21
  100. package/server/applications/links/services/links-manager.service.js.map +1 -1
  101. package/server/applications/links/services/links-manager.service.spec.js +4 -3
  102. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  103. package/server/applications/links/services/links-queries.service.js +9 -2
  104. package/server/applications/links/services/links-queries.service.js.map +1 -1
  105. package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
  106. package/server/applications/shares/services/shares-manager.service.js +3 -0
  107. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  108. package/server/applications/shares/services/shares-manager.service.spec.js +2 -1
  109. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  110. package/server/applications/shares/services/shares-queries.service.js +1 -0
  111. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  112. package/server/applications/spaces/constants/spaces.js +2 -2
  113. package/server/applications/spaces/constants/spaces.js.map +1 -1
  114. package/server/applications/spaces/decorators/space-override-permission.decorator.js +18 -0
  115. package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -0
  116. package/server/applications/spaces/guards/space.guard.js +40 -33
  117. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  118. package/server/applications/spaces/guards/space.guard.spec.js +10 -15
  119. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  120. package/server/applications/webdav/constants/webdav.js +4 -0
  121. package/server/applications/webdav/constants/webdav.js.map +1 -1
  122. package/server/applications/webdav/guards/webdav-protocol.guard.js +9 -8
  123. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  124. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +1 -1
  125. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  126. package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
  127. package/server/applications/webdav/services/webdav-methods.service.js +40 -17
  128. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  129. package/server/applications/webdav/services/webdav-methods.service.spec.js +2157 -1289
  130. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  131. package/server/applications/webdav/utils/webdav.js +8 -4
  132. package/server/applications/webdav/utils/webdav.js.map +1 -1
  133. package/server/applications/webdav/webdav.controller.js +4 -4
  134. package/server/applications/webdav/webdav.controller.js.map +1 -1
  135. package/server/authentication/guards/auth-token-access.guard.js +8 -3
  136. package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
  137. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +1 -1
  138. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -1
  139. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +350 -4
  140. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -1
  141. package/server/configuration/config.environment.js +5 -1
  142. package/server/configuration/config.environment.js.map +1 -1
  143. package/server/configuration/config.interfaces.js.map +1 -1
  144. package/static/3rdpartylicenses.txt +507 -507
  145. package/static/assets/pdfjs/build/pdf.mjs +93 -33
  146. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  147. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  148. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  149. package/static/assets/pdfjs/build/pdf.worker.mjs +166 -54
  150. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  151. package/static/assets/pdfjs/version +1 -1
  152. package/static/assets/pdfjs/web/images/checkmark.svg +5 -0
  153. package/static/assets/pdfjs/web/images/pages_closeButton.svg +3 -0
  154. package/static/assets/pdfjs/web/images/pages_selected.svg +7 -0
  155. package/static/assets/pdfjs/web/images/pages_viewArrow.svg +3 -0
  156. package/static/assets/pdfjs/web/images/pages_viewButton.svg +3 -0
  157. package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -2
  158. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -5
  159. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -6
  160. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -2
  161. package/static/assets/pdfjs/web/locale/da/viewer.ftl +0 -2
  162. package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -2
  163. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -2
  164. package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -2
  165. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +6 -2
  166. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -2
  167. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +82 -17
  168. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -2
  169. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -2
  170. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -2
  171. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +0 -2
  172. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -2
  173. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -2
  174. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -2
  175. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -2
  176. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -5
  177. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +3 -5
  178. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -2
  179. package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -2
  180. package/static/assets/pdfjs/web/locale/hr/viewer.ftl +66 -0
  181. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -2
  182. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -2
  183. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +3 -8
  184. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -2
  185. package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -5
  186. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -5
  187. package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -2
  188. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +0 -14
  189. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +4 -6
  190. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -5
  191. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +0 -2
  192. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -2
  193. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +1 -3
  194. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -2
  195. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +4 -2
  196. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -2
  197. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -2
  198. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -2
  199. package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +35 -0
  200. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -5
  201. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +4 -6
  202. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -5
  203. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -2
  204. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +0 -2
  205. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -2
  206. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -2
  207. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -2
  208. package/static/assets/pdfjs/web/locale/th/viewer.ftl +2 -2
  209. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -2
  210. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -2
  211. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -2
  212. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -2
  213. package/static/assets/pdfjs/web/viewer.css +1778 -835
  214. package/static/assets/pdfjs/web/viewer.html +167 -86
  215. package/static/assets/pdfjs/web/viewer.mjs +1106 -801
  216. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  217. package/static/chunk-27V66YJV.js +2 -0
  218. package/static/{chunk-BVKDW5XO.js → chunk-27Z3SYRL.js} +1 -1
  219. package/static/{chunk-HLKZCMKV.js → chunk-2RWLNKZH.js} +1 -1
  220. package/static/chunk-2YQ4SX3A.js +13 -0
  221. package/static/{chunk-GENTF6JM.js → chunk-3JYMJQYT.js} +1 -1
  222. package/static/chunk-3QTROEHV.js +1 -0
  223. package/static/{chunk-C5T7RZSD.js → chunk-3RPUQ22U.js} +1 -1
  224. package/static/{chunk-EPDWJEPD.js → chunk-3WZ6F3LC.js} +1 -1
  225. package/static/chunk-3ZLBVUCX.js +2 -0
  226. package/static/{chunk-SF6Q6VRC.js → chunk-45AZ6ZML.js} +1 -1
  227. package/static/chunk-46TJLPJY.js +1 -0
  228. package/static/chunk-4NIYCYRS.js +2 -0
  229. package/static/{chunk-GLPKRULI.js → chunk-4TPFERL6.js} +1 -1
  230. package/static/{chunk-KAAFVHYE.js → chunk-5O66CLTD.js} +1 -1
  231. package/static/chunk-6OEOADR6.js +1 -0
  232. package/static/chunk-6WMXMIE4.js +1 -0
  233. package/static/{chunk-QKMN3S4M.js → chunk-7VRYTDX4.js} +1 -1
  234. package/static/{chunk-Z2KBIZ5D.js → chunk-ARS47O5X.js} +1 -1
  235. package/static/chunk-B6HQYQYG.js +1 -0
  236. package/static/chunk-BCN4T5DO.js +2 -0
  237. package/static/{chunk-7HL5Z6PF.js → chunk-CCZWPM7Q.js} +1 -1
  238. package/static/{chunk-DU4Q4RWJ.js → chunk-CMNMPG6Z.js} +1 -1
  239. package/static/{chunk-BX3QZ7IL.js → chunk-CSVPAZHK.js} +1 -1
  240. package/static/{chunk-BJARRIS6.js → chunk-D55YR5X7.js} +4 -4
  241. package/static/{chunk-NHMYAVJK.js → chunk-D5FQ72R4.js} +1 -1
  242. package/static/{chunk-7QYALK5T.js → chunk-DGCVA6BM.js} +1 -1
  243. package/static/{chunk-IBC7CFBQ.js → chunk-DVCN3P7Q.js} +1 -1
  244. package/static/chunk-E32J777S.js +5 -0
  245. package/static/{chunk-FEQUP26G.js → chunk-FIUF2JM4.js} +1 -1
  246. package/static/{chunk-ODAQRAPO.js → chunk-G3PL6YX3.js} +1 -1
  247. package/static/chunk-G7RZN7HN.js +1 -0
  248. package/static/{chunk-IIKL33TV.js → chunk-GQHXYX6Z.js} +1 -1
  249. package/static/{chunk-5HYSNQR4.js → chunk-GWRAGN3M.js} +1 -1
  250. package/static/{chunk-ANH4VNOS.js → chunk-GXWGB7WO.js} +1 -1
  251. package/static/{chunk-25PWAXTJ.js → chunk-HGODIZTV.js} +1 -1
  252. package/static/{chunk-X5UDV4ZB.js → chunk-HZAB6F4Q.js} +1 -1
  253. package/static/chunk-I3FR3A45.js +1 -0
  254. package/static/{chunk-JYHTSSKW.js → chunk-I5SPA4G2.js} +1 -1
  255. package/static/{chunk-DQAQUSVW.js → chunk-IMFO2MI7.js} +1 -1
  256. package/static/{chunk-AYYJZMBE.js → chunk-JNTNMIUH.js} +1 -1
  257. package/static/chunk-JRXG43AA.js +2 -0
  258. package/static/{chunk-3AR5VNJE.js → chunk-KAUCN24H.js} +1 -1
  259. package/static/{chunk-3WS72A6C.js → chunk-KDUAB76O.js} +1 -1
  260. package/static/chunk-KPOQLDWF.js +1 -0
  261. package/static/{chunk-UO7ATVQG.js → chunk-KWFELZTM.js} +1 -1
  262. package/static/{chunk-2CAAJBRO.js → chunk-L3BIP4AA.js} +1 -1
  263. package/static/{chunk-DK2LAJEL.js → chunk-LGIVVJDD.js} +1 -1
  264. package/static/{chunk-5ATJIR5S.js → chunk-LNLBIJZD.js} +1 -1
  265. package/static/chunk-LTJNLOX2.js +1 -0
  266. package/static/{chunk-GRV44RYI.js → chunk-LZUHREOF.js} +1 -1
  267. package/static/{chunk-XIQXRSZ2.js → chunk-NIR4YE2E.js} +1 -1
  268. package/static/{chunk-TOCCCZP2.js → chunk-NJJURHX4.js} +1 -1
  269. package/static/chunk-NNZWSNAW.js +1 -0
  270. package/static/chunk-NWKBB7J4.js +1 -0
  271. package/static/chunk-O3YLAEVE.js +3 -0
  272. package/static/chunk-OUHCDDT6.js +1 -0
  273. package/static/{chunk-B4TDS6AQ.js → chunk-PDG7DOEF.js} +1 -1
  274. package/static/chunk-POUWUMC4.js +1 -0
  275. package/static/{chunk-NQCKX2AD.js → chunk-PPJCVBJH.js} +1 -1
  276. package/static/{chunk-ZCOEP4O2.js → chunk-PQZLR4P3.js} +1 -1
  277. package/static/chunk-PVYVY3GD.js +1 -0
  278. package/static/chunk-Q5X5TPAG.js +1 -0
  279. package/static/{chunk-LFAQLJZK.js → chunk-QHJT5H4M.js} +1 -1
  280. package/static/{chunk-D6QWQHWE.js → chunk-R4VMWCM5.js} +1 -1
  281. package/static/{chunk-O233BXWK.js → chunk-R7PLNX75.js} +1 -1
  282. package/static/chunk-RJULB733.js +1 -0
  283. package/static/{chunk-E5C4QRNQ.js → chunk-RNVPQQKT.js} +5 -5
  284. package/static/chunk-RTNEBRKJ.js +1 -0
  285. package/static/{chunk-GYYJ4FWN.js → chunk-S3TTWPQA.js} +1 -1
  286. package/static/{chunk-4GBA6EJ4.js → chunk-SDJNZULP.js} +1 -1
  287. package/static/chunk-SNOOCDJD.js +1 -0
  288. package/static/chunk-T42BV6TR.js +1 -0
  289. package/static/{chunk-5KVI243T.js → chunk-TNCKNU6I.js} +1 -1
  290. package/static/{chunk-OVUMPMVM.js → chunk-ULSPQ3HP.js} +1 -1
  291. package/static/{chunk-5NFH4E2B.js → chunk-UOK3LKSX.js} +1 -1
  292. package/static/{chunk-CHMDM2ZW.js → chunk-VD5JHSDS.js} +1 -1
  293. package/static/{chunk-2F42MZQ5.js → chunk-XBKCQCBI.js} +1 -1
  294. package/static/{chunk-2U5VKTML.js → chunk-XEWLBWFF.js} +1 -1
  295. package/static/{chunk-FSGT46LM.js → chunk-XTVNHFKX.js} +1 -1
  296. package/static/chunk-ZCSHU3D7.js +1 -0
  297. package/static/{chunk-QUUQOBTF.js → chunk-ZEJLIGAY.js} +1 -1
  298. package/static/{chunk-7H5O4BLV.js → chunk-ZHOE5VEY.js} +1 -1
  299. package/static/chunk-ZOMRIN3G.js +2 -0
  300. package/static/index.html +2 -2
  301. package/static/main-YKDNJ7LK.js +11 -0
  302. package/static/{styles-S5HVK4H5.css → styles-XLLEY5Y3.css} +1 -1
  303. package/server/applications/files/constants/only-office.js +0 -531
  304. package/server/applications/files/constants/only-office.js.map +0 -1
  305. package/server/applications/files/decorators/only-office-environment.decorator.js.map +0 -1
  306. package/server/applications/files/files-only-office.controller.js.map +0 -1
  307. package/server/applications/files/files-only-office.controller.spec.js.map +0 -1
  308. package/server/applications/files/guards/files-only-office.guard.js.map +0 -1
  309. package/server/applications/files/guards/files-only-office.guard.spec.js.map +0 -1
  310. package/server/applications/files/guards/files-only-office.strategy.js.map +0 -1
  311. package/server/applications/files/interfaces/only-office-config.interface.js.map +0 -1
  312. package/server/applications/files/services/files-only-office-manager.service.js.map +0 -1
  313. package/server/applications/files/services/files-only-office-manager.service.spec.js +0 -58
  314. package/server/applications/files/services/files-only-office-manager.service.spec.js.map +0 -1
  315. package/static/chunk-42L6C5MT.js +0 -1
  316. package/static/chunk-4ZKAVMB4.js +0 -1
  317. package/static/chunk-5GIWZKNS.js +0 -1
  318. package/static/chunk-5WCQBTXW.js +0 -1
  319. package/static/chunk-B2A4HNDC.js +0 -1
  320. package/static/chunk-BSB4VROD.js +0 -2
  321. package/static/chunk-CUC7R6C2.js +0 -1
  322. package/static/chunk-DHFQIFOF.js +0 -1
  323. package/static/chunk-DRHPEERW.js +0 -2
  324. package/static/chunk-FCGTI42I.js +0 -1
  325. package/static/chunk-FCR5AEHR.js +0 -3
  326. package/static/chunk-HB5DC7RJ.js +0 -1
  327. package/static/chunk-ITVA26X2.js +0 -2
  328. package/static/chunk-KWKZN53T.js +0 -1
  329. package/static/chunk-LBXOAKBD.js +0 -1
  330. package/static/chunk-LZKI5P5T.js +0 -1
  331. package/static/chunk-MGMDT4VN.js +0 -1
  332. package/static/chunk-MWUUM2NK.js +0 -13
  333. package/static/chunk-MYM43ENO.js +0 -1
  334. package/static/chunk-NAH4V2R6.js +0 -2
  335. package/static/chunk-PCFH5HCI.js +0 -2
  336. package/static/chunk-Q6B4OVER.js +0 -5
  337. package/static/chunk-QV5LQKTS.js +0 -1
  338. package/static/chunk-S4UTSOPV.js +0 -1
  339. package/static/chunk-SRBOO7AO.js +0 -1
  340. package/static/chunk-VZPCXSRG.js +0 -2
  341. package/static/chunk-XKEBQNQJ.js +0 -1
  342. package/static/chunk-YYTDPI5S.js +0 -1
  343. package/static/main-ODUA232E.js +0 -11
  344. /package/static/assets/pdfjs/web/images/{toolbarButton-sidebarToggle.svg → toolbarButton-viewsManagerToggle.svg} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/shares/services/shares-manager.service.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 { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport * as commonFunctions from '../../../common/functions'\nimport { intersectPermissions } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport * as permissionsUtils from '../../spaces/utils/permissions'\nimport { GUEST_PERMISSION } from '../../users/constants/user'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SHARE_ALL_OPERATIONS } from '../constants/shares'\nimport { SharesManager } from './shares-manager.service'\nimport { SharesQueries } from './shares-queries.service'\n\n// Mock classes and utility modules used by SharesManager\njest.mock('../../spaces/models/space-env.model', () => ({\n SpaceEnv: jest.fn().mockImplementation(() => ({\n setPermissions: jest.fn(),\n envPermissions: 'ENV_PERMS'\n }))\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n havePermission: jest.fn(),\n haveSpacePermission: jest.fn(),\n removePermissions: jest.fn(() => 'trimmed')\n}))\n\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return {\n ...actual,\n generateShortUUID: jest.fn(),\n hashPassword: jest.fn()\n }\n})\n\njest.mock('../../../common/shared', () => {\n const actual = jest.requireActual('../../../common/shared')\n return {\n ...actual,\n intersectPermissions: jest.fn()\n }\n})\n\ndescribe(SharesManager.name, () => {\n let service: SharesManager\n\n // Mocks\n const contextManagerMock = {\n headerOriginUrl: jest.fn()\n }\n\n const notificationsManagerMock = {\n create: jest.fn().mockResolvedValue(undefined),\n sendEmailNotification: jest.fn().mockResolvedValue(undefined)\n }\n\n const spacesQueriesMock = {\n permissions: jest.fn()\n }\n\n const usersQueriesMock = {\n createUserOrGuest: jest.fn(),\n deleteGuestLink: jest.fn(),\n usersWhitelist: jest.fn().mockResolvedValue([]),\n groupsWhitelist: jest.fn().mockResolvedValue([]),\n allUserIdsFromGroupsAndSubGroups: jest.fn().mockResolvedValue([])\n }\n\n const linksQueriesMock = {\n isUniqueUUID: jest.fn(),\n isReservedUUID: jest.fn(),\n allLinksFromSpaceOrShare: jest.fn(),\n createLinkToSpaceOrShare: jest.fn(),\n updateLinkFromSpaceOrShare: jest.fn(),\n linkFromShare: jest.fn(),\n linkFromSpace: jest.fn()\n }\n\n const sharesQueriesMock = {\n permissions: jest.fn(),\n listShareLinks: jest.fn(),\n getShareWithMembers: jest.fn(),\n createShare: jest.fn(),\n updateShare: jest.fn(),\n selectShares: jest.fn(),\n deleteShare: jest.fn(),\n updateMember: jest.fn(),\n updateMembers: jest.fn(),\n shareExistsForOwner: jest.fn(),\n childExistsForShareOwner: jest.fn()\n }\n\n const user = { id: 1, isAdmin: false } as any\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: ContextManager, useValue: contextManagerMock },\n { provide: NotificationsManager, useValue: notificationsManagerMock },\n { provide: SpacesQueries, useValue: spacesQueriesMock },\n { provide: UsersQueries, useValue: usersQueriesMock },\n { provide: LinksQueries, useValue: linksQueriesMock },\n { provide: SharesQueries, useValue: sharesQueriesMock },\n SharesManager\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SharesManager>(SharesManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('setAllowedPermissions', () => {\n it('sets all operations when the user is the file owner (personal space case)', async () => {\n const share: any = { file: { ownerId: user.id, permissions: '' } }\n await service.setAllowedPermissions(user, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('uses space permissions when file has a space alias', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce({ any: 'thing' })\n const share: any = {\n file: { ownerId: 999, space: { alias: 'space-1', root: { alias: 'root' } }, permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(spacesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'space-1', 'root')\n expect(share.file.ownerId).toBeNull()\n expect(share.file.permissions).toBe('ENV_PERMS')\n })\n\n it('uses parent share permissions when parent alias is present', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'PARENT_PERMS' })\n const share: any = {\n ownerId: 77,\n parent: { alias: 'parent-share' },\n file: { permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'parent-share', +user.isAdmin)\n expect(share.file.permissions).toBe('PARENT_PERMS')\n })\n\n it('throws Bad Request when missing required information', async () => {\n const share: any = { file: {}, parent: {} }\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Missing information', HttpStatus.BAD_REQUEST))\n })\n })\n\n describe('getShareWithMembers', () => {\n it('returns the share and calls setAllowedPermissions', async () => {\n const share: any = { id: 10, file: {} }\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(share)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareWithMembers(user, 10, true)\n\n expect(result).toBe(share)\n expect(spy).toHaveBeenCalledWith(user, share, true)\n })\n\n it('throws Forbidden when share is not found or not authorized', async () => {\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(null)\n await expect(service.getShareWithMembers(user, 99, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('generateLinkUUID', () => {\n it('loops until a unique UUID is found', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('aaa').mockReturnValueOnce('bbb')\n\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(false).mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(2)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(1, user.id, 'aaa')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(2, user.id, 'bbb')\n expect(uuid).toBe('bbb')\n })\n })\n\n describe('getShareLink', () => {\n it('returns the share link and trims unsupported permissions', async () => {\n const shareLink: any = { id: 5, file: { permissions: 'ORIG' } }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareLink(user, 5)\n\n expect(spy).toHaveBeenCalledWith(user, shareLink)\n expect(result).toBe(shareLink)\n expect(result.file.permissions).toBe('trimmed')\n expect((permissionsUtils.removePermissions as jest.Mock).mock.calls[0][0]).toBe('ORIG')\n })\n\n it('throws Forbidden when link is not found', async () => {\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(null)\n await expect(service.getShareLink(user, 123)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('updateLinkFromSpaceOrShare (from API)', () => {\n it('intersects permissions and returns updated link object', async () => {\n const baseLink: any = {\n id: 42,\n name: 'old',\n email: 'x@x',\n requireAuth: false,\n limitAccess: null,\n expiresAt: null,\n permissions: 'OLD',\n shareName: 'OldShare',\n shareDescription: 'OldDesc'\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(baseLink)\n jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ file: { permissions: 'SHARE_PERMS' } } as any)\n ;(intersectPermissions as jest.Mock).mockReturnValue('INTERSECTED')\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto: any = {\n permissions: 'NEW_PERMS',\n language: 'fr',\n isActive: false\n }\n\n const result = await service.updateLinkFromSpaceOrShare(user, 7, 55, 1 as any, dto, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n expect(result.permissions).toBe('INTERSECTED')\n expect(result.language).toBe('fr')\n expect(result.isActive).toBe(false)\n })\n })\n\n describe('createGuestLink', () => {\n it('creates guest link with hashed password and returns created user info', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValue('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(99)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SHARES, 'plaintext', 'en', true)\n\n expect(usersQueriesMock.createUserOrGuest).toHaveBeenCalled()\n expect(guest.id).toBe(99)\n expect(guest.password).toBe('HASHED')\n expect(guest.role).toBeDefined()\n expect(guest.permissions).toBe(GUEST_PERMISSION.SHARES)\n expect(guest.language).toBe('en')\n expect(guest.isActive).toBe(true)\n })\n\n it('generates a random password and defaults isActive when not provided', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED-RAND')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(123)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SPACES)\n\n expect(commonFunctions.hashPassword).toHaveBeenCalled()\n expect(guest.id).toBe(123)\n expect(guest.isActive).toBe(true)\n expect(guest.language).toBeNull()\n })\n })\n\n describe('getLinkFromSpaceOrShare', () => {\n it('returns a link guest for SPACE type', async () => {\n const lg = { id: 1 }\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 11, 22, LINK_TYPE.SPACE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromSpace).toHaveBeenCalledWith(user.id, 11, 22)\n expect(linksQueriesMock.linkFromShare).not.toHaveBeenCalled()\n })\n\n it('returns a link guest for SHARE type', async () => {\n const lg = { id: 2 }\n linksQueriesMock.linkFromShare.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 33, 44, LINK_TYPE.SHARE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromShare).toHaveBeenCalledWith(user.id, 33, 44, +user.isAdmin)\n expect(linksQueriesMock.linkFromSpace).not.toHaveBeenCalled()\n })\n\n it('throws when link not found', async () => {\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(null)\n\n await expect(service.getLinkFromSpaceOrShare(user, 55, 66, LINK_TYPE.SPACE)).rejects.toEqual(\n new HttpException('Link not found', HttpStatus.NOT_FOUND)\n )\n })\n })\n\n describe('updateLinkFromSpaceOrShare (additional branches)', () => {\n it('returns null when no diff and not from API', async () => {\n const link: any = { id: 1, name: 'n', email: 'e', requireAuth: false, limitAccess: null, expiresAt: null }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, {}, false)\n\n expect(result).toBeNull()\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).not.toHaveBeenCalled()\n })\n\n it('hashes password and does not leak it when fromAPI is true', async () => {\n const link: any = { id: 1 }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValueOnce('HASHED')\n ;(linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mockImplementation(async (_link: any, _spaceOrShareId: number, updateUser: any) => {\n // Assert at call time before the service deletes the password\n expect(updateUser).toMatchObject({ password: 'HASHED' })\n return\n })\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, { password: 'secret' }, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n // The returned link must not leak password\n expect(result).toBe(link)\n expect((result as any).password).toBeUndefined()\n })\n\n it('updates multiple link/user fields and ignores equal expiresAt', async () => {\n const base = {\n id: 9,\n name: 'a',\n email: 'b',\n requireAuth: false,\n limitAccess: null,\n expiresAt: { date: '2025-01-01' }\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(base as any)\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto = {\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5,\n expiresAt: { date: '2025-01-01' } // equal, should be ignored\n }\n\n await service.updateLinkFromSpaceOrShare(user, 9, 99, LINK_TYPE.SHARE, dto as any, false)\n\n const [, , , updateLink] = (linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mock.calls[0].slice(0, 5)\n expect(updateLink).toMatchObject({\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5\n })\n expect(updateLink.expiresAt).toBeUndefined()\n })\n })\n\n describe('setAllowedPermissions (additional branches)', () => {\n it('sets all operations when share has externalPath and user is admin', async () => {\n const admin = { id: 10, isAdmin: true } as any\n const share: any = { externalPath: '/ext', file: {} }\n await service.setAllowedPermissions(admin, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('throws NOT_FOUND when space permissions are missing', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { file: { space: { alias: 'space-x', root: { alias: 'r' } } } }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Space not found', HttpStatus.NOT_FOUND))\n })\n\n it('throws NOT_FOUND when parent share permissions are missing', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { ownerId: 42, parent: { alias: 'parent' }, file: {} }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Share not found', HttpStatus.NOT_FOUND))\n })\n\n it('uses owner permissions when asAdmin is true', async () => {\n const asAdminUser = { id: 3, isAdmin: false } as any\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'ADMIN_PARENT' })\n const share: any = { ownerId: 77, parent: { alias: 'pa' }, file: {} }\n\n await service.setAllowedPermissions(asAdminUser, share, true)\n\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(77, 'pa', +asAdminUser.isAdmin)\n expect(share.file.permissions).toBe('ADMIN_PARENT')\n })\n })\n\n describe('getShareLink (additional branch)', () => {\n it('does not trim permissions if file.permissions is falsy', async () => {\n const shareLink: any = { id: 7, file: {} }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const res = await service.getShareLink(user, 7)\n\n expect(spy).toHaveBeenCalled()\n expect(res).toBe(shareLink)\n expect(permissionsUtils.removePermissions).not.toHaveBeenCalled()\n })\n })\n\n describe('deleteShare', () => {\n it('throws Forbidden when user is not admin and not owner', async () => {\n sharesQueriesMock.shareExistsForOwner.mockResolvedValueOnce(false)\n\n await expect(service.deleteShare({ id: 2, isAdmin: false } as any, 123)).rejects.toEqual(\n new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n )\n })\n\n it('deletes links and removes shares when authorized (asAdmin)', async () => {\n const deleteLinksSpy = jest.spyOn(service, 'deleteAllLinkMembers').mockResolvedValue(void 0)\n const removeSpy = jest.spyOn<any, any>(service as any, 'removeShareFromOwners').mockResolvedValue(void 0)\n\n await service.deleteShare(user, 456, true)\n\n expect(deleteLinksSpy).toHaveBeenCalledWith(456, expect.anything())\n expect(removeSpy).toHaveBeenCalledWith(456, 'all', false, user.id)\n })\n })\n\n describe('child share wrappers', () => {\n it('getChildShare returns share link when isLink = true', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(99)\n const getShareLinkSpy = jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ id: 99 } as any)\n\n const res = await service.getChildShare(user, 1, 99, true)\n expect(res).toEqual({ id: 99 })\n expect(getShareLinkSpy).toHaveBeenCalledWith(user, 99, true)\n })\n\n it('getChildShare returns child share when isLink = false', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(100)\n const getShareSpy = jest.spyOn(service, 'getShareWithMembers').mockResolvedValueOnce({ id: 100 } as any)\n\n const res = await service.getChildShare(user, 1, 100, false)\n expect(res).toEqual({ id: 100 })\n expect(getShareSpy).toHaveBeenCalledWith(user, 100, true)\n })\n\n it('updateChildShare forwards update and deleteChildShare forwards delete', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValue(200)\n const updateSpy = jest.spyOn(service, 'updateShare').mockResolvedValueOnce({ id: 200 } as any)\n const deleteSpy = jest.spyOn(service, 'deleteShare').mockResolvedValueOnce(void 0)\n\n await service.updateChildShare(user, 1, 200, {} as any)\n expect(updateSpy).toHaveBeenCalledWith(user, 200, {} as any, true)\n\n await service.deleteChildShare(user, 1, 200)\n expect(deleteSpy).toHaveBeenCalledWith(user, 200, true)\n })\n\n it('throws Forbidden when not allowed to manage child share', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(null)\n await expect(service.getChildShare(user, 1, 2, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('createOrUpdateLinksAsMembers', () => {\n it('creates new links for id < 0 and notifies guest', async () => {\n const createLinkSpy = jest.spyOn<any, any>(service as any, 'createLinkFromSpaceOrShare').mockResolvedValue(void 0)\n const notifySpy = jest.spyOn<any, any>(service as any, 'notifyGuestLink').mockResolvedValue(void 0)\n\n const links = [{ id: -1, linkSettings: { uuid: 'u', email: 'e', permissions: 'p' }, permissions: 'p' }] as any\n\n const res = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, links)\n\n expect(res).toEqual([])\n expect(createLinkSpy).toHaveBeenCalled()\n expect(notifySpy).toHaveBeenCalled()\n })\n\n it('updates modified links and returns them along with unmodified ones', async () => {\n const updateLinkSpy = jest.spyOn(service, 'updateLinkFromSpaceOrShare').mockResolvedValue(void 0)\n\n const members = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, [\n { id: 2, linkId: 2, permissions: 'p', linkSettings: { name: 'new' } },\n { id: 3, linkId: 3, permissions: 'q' } // unmodified\n ] as any)\n\n expect(updateLinkSpy).toHaveBeenCalledWith(user, 2, 1, LINK_TYPE.SHARE, { name: 'new' })\n expect(members).toHaveLength(2)\n expect(members.map((m: any) => m.id)).toEqual([2, 3])\n })\n })\n\n describe('generateLinkUUID (additional)', () => {\n it('returns immediately when the first UUID is unique', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('only-one')\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(uuid).toBe('only-one')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(1)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledWith(user.id, 'only-one')\n })\n })\n})\n"],"names":["jest","mock","SpaceEnv","fn","mockImplementation","setPermissions","envPermissions","havePermission","haveSpacePermission","removePermissions","actual","requireActual","generateShortUUID","hashPassword","intersectPermissions","describe","SharesManager","name","service","contextManagerMock","headerOriginUrl","notificationsManagerMock","create","mockResolvedValue","undefined","sendEmailNotification","spacesQueriesMock","permissions","usersQueriesMock","createUserOrGuest","deleteGuestLink","usersWhitelist","groupsWhitelist","allUserIdsFromGroupsAndSubGroups","linksQueriesMock","isUniqueUUID","isReservedUUID","allLinksFromSpaceOrShare","createLinkToSpaceOrShare","updateLinkFromSpaceOrShare","linkFromShare","linkFromSpace","sharesQueriesMock","listShareLinks","getShareWithMembers","createShare","updateShare","selectShares","deleteShare","updateMember","updateMembers","shareExistsForOwner","childExistsForShareOwner","user","id","isAdmin","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","ContextManager","NotificationsManager","SpacesQueries","UsersQueries","LinksQueries","SharesQueries","compile","useLogger","get","beforeEach","clearAllMocks","it","expect","toBeDefined","share","file","ownerId","setAllowedPermissions","toBe","SHARE_ALL_OPERATIONS","mockResolvedValueOnce","any","space","alias","root","toHaveBeenCalledWith","toBeNull","parent","rejects","toEqual","HttpException","HttpStatus","BAD_REQUEST","spy","spyOn","result","FORBIDDEN","commonFunctions","mockReturnValueOnce","uuid","generateLinkUUID","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","shareLink","getShareLink","permissionsUtils","calls","baseLink","email","requireAuth","limitAccess","expiresAt","shareName","shareDescription","mockReturnValue","dto","language","isActive","toHaveBeenCalled","guest","createGuestLink","GUEST_PERMISSION","SHARES","password","role","SPACES","lg","res","getLinkFromSpaceOrShare","LINK_TYPE","SPACE","not","SHARE","NOT_FOUND","link","_link","_spaceOrShareId","updateUser","toMatchObject","toBeUndefined","base","date","updateLink","slice","admin","externalPath","asAdminUser","deleteLinksSpy","removeSpy","anything","getShareLinkSpy","getChildShare","getShareSpy","updateSpy","deleteSpy","updateChildShare","deleteChildShare","createLinkSpy","notifySpy","links","linkSettings","createOrUpdateLinksAsMembers","updateLinkSpy","members","linkId","toHaveLength","map","m"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/shares/services/shares-manager.service.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 { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport * as commonFunctions from '../../../common/functions'\nimport { intersectPermissions } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport * as permissionsUtils from '../../spaces/utils/permissions'\nimport { GUEST_PERMISSION } from '../../users/constants/user'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SHARE_ALL_OPERATIONS } from '../constants/shares'\nimport { SharesManager } from './shares-manager.service'\nimport { SharesQueries } from './shares-queries.service'\n\n// Mock classes and utility modules used by SharesManager\njest.mock('../../spaces/models/space-env.model', () => ({\n SpaceEnv: jest.fn().mockImplementation(() => ({\n setPermissions: jest.fn(),\n envPermissions: 'ENV_PERMS'\n }))\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n havePermission: jest.fn(),\n haveSpacePermission: jest.fn(),\n removePermissions: jest.fn(() => 'trimmed')\n}))\n\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return {\n ...actual,\n generateShortUUID: jest.fn(),\n hashPassword: jest.fn()\n }\n})\n\njest.mock('../../../common/shared', () => {\n const actual = jest.requireActual('../../../common/shared')\n return {\n ...actual,\n intersectPermissions: jest.fn()\n }\n})\n\ndescribe(SharesManager.name, () => {\n let service: SharesManager\n\n // Mocks\n const contextManagerMock = {\n headerOriginUrl: jest.fn()\n }\n\n const notificationsManagerMock = {\n create: jest.fn().mockResolvedValue(undefined),\n sendEmailNotification: jest.fn().mockResolvedValue(undefined)\n }\n\n const spacesQueriesMock = {\n permissions: jest.fn()\n }\n\n const usersQueriesMock = {\n createUserOrGuest: jest.fn(),\n deleteGuestLink: jest.fn(),\n usersWhitelist: jest.fn().mockResolvedValue([]),\n groupsWhitelist: jest.fn().mockResolvedValue([]),\n allUserIdsFromGroupsAndSubGroups: jest.fn().mockResolvedValue([])\n }\n\n const linksQueriesMock = {\n isUniqueUUID: jest.fn(),\n isReservedUUID: jest.fn(),\n allLinksFromSpaceOrShare: jest.fn(),\n createLinkToSpaceOrShare: jest.fn(),\n updateLinkFromSpaceOrShare: jest.fn(),\n linkFromShare: jest.fn(),\n linkFromSpace: jest.fn()\n }\n\n const sharesQueriesMock = {\n permissions: jest.fn(),\n listShareLinks: jest.fn(),\n getShareWithMembers: jest.fn(),\n createShare: jest.fn(),\n updateShare: jest.fn(),\n selectShares: jest.fn(),\n deleteShare: jest.fn(),\n updateMember: jest.fn(),\n updateMembers: jest.fn(),\n shareExistsForOwner: jest.fn(),\n childExistsForShareOwner: jest.fn(),\n clearCachePermissions: jest.fn().mockResolvedValue(true)\n }\n\n const user = { id: 1, isAdmin: false } as any\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: ContextManager, useValue: contextManagerMock },\n { provide: NotificationsManager, useValue: notificationsManagerMock },\n { provide: SpacesQueries, useValue: spacesQueriesMock },\n { provide: UsersQueries, useValue: usersQueriesMock },\n { provide: LinksQueries, useValue: linksQueriesMock },\n { provide: SharesQueries, useValue: sharesQueriesMock },\n SharesManager\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SharesManager>(SharesManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('setAllowedPermissions', () => {\n it('sets all operations when the user is the file owner (personal space case)', async () => {\n const share: any = { file: { ownerId: user.id, permissions: '' } }\n await service.setAllowedPermissions(user, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('uses space permissions when file has a space alias', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce({ any: 'thing' })\n const share: any = {\n file: { ownerId: 999, space: { alias: 'space-1', root: { alias: 'root' } }, permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(spacesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'space-1', 'root')\n expect(share.file.ownerId).toBeNull()\n expect(share.file.permissions).toBe('ENV_PERMS')\n })\n\n it('uses parent share permissions when parent alias is present', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'PARENT_PERMS' })\n const share: any = {\n ownerId: 77,\n parent: { alias: 'parent-share' },\n file: { permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'parent-share', +user.isAdmin)\n expect(share.file.permissions).toBe('PARENT_PERMS')\n })\n\n it('throws Bad Request when missing required information', async () => {\n const share: any = { file: {}, parent: {} }\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Missing information', HttpStatus.BAD_REQUEST))\n })\n })\n\n describe('getShareWithMembers', () => {\n it('returns the share and calls setAllowedPermissions', async () => {\n const share: any = { id: 10, file: {} }\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(share)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareWithMembers(user, 10, true)\n\n expect(result).toBe(share)\n expect(spy).toHaveBeenCalledWith(user, share, true)\n })\n\n it('throws Forbidden when share is not found or not authorized', async () => {\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(null)\n await expect(service.getShareWithMembers(user, 99, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('generateLinkUUID', () => {\n it('loops until a unique UUID is found', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('aaa').mockReturnValueOnce('bbb')\n\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(false).mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(2)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(1, user.id, 'aaa')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(2, user.id, 'bbb')\n expect(uuid).toBe('bbb')\n })\n })\n\n describe('getShareLink', () => {\n it('returns the share link and trims unsupported permissions', async () => {\n const shareLink: any = { id: 5, file: { permissions: 'ORIG' } }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareLink(user, 5)\n\n expect(spy).toHaveBeenCalledWith(user, shareLink)\n expect(result).toBe(shareLink)\n expect(result.file.permissions).toBe('trimmed')\n expect((permissionsUtils.removePermissions as jest.Mock).mock.calls[0][0]).toBe('ORIG')\n })\n\n it('throws Forbidden when link is not found', async () => {\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(null)\n await expect(service.getShareLink(user, 123)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('updateLinkFromSpaceOrShare (from API)', () => {\n it('intersects permissions and returns updated link object', async () => {\n const baseLink: any = {\n id: 42,\n name: 'old',\n email: 'x@x',\n requireAuth: false,\n limitAccess: null,\n expiresAt: null,\n permissions: 'OLD',\n shareName: 'OldShare',\n shareDescription: 'OldDesc'\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(baseLink)\n jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ file: { permissions: 'SHARE_PERMS' } } as any)\n ;(intersectPermissions as jest.Mock).mockReturnValue('INTERSECTED')\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto: any = {\n permissions: 'NEW_PERMS',\n language: 'fr',\n isActive: false\n }\n\n const result = await service.updateLinkFromSpaceOrShare(user, 7, 55, 1 as any, dto, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n expect(result.permissions).toBe('INTERSECTED')\n expect(result.language).toBe('fr')\n expect(result.isActive).toBe(false)\n })\n })\n\n describe('createGuestLink', () => {\n it('creates guest link with hashed password and returns created user info', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValue('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(99)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SHARES, 'plaintext', 'en', true)\n\n expect(usersQueriesMock.createUserOrGuest).toHaveBeenCalled()\n expect(guest.id).toBe(99)\n expect(guest.password).toBe('HASHED')\n expect(guest.role).toBeDefined()\n expect(guest.permissions).toBe(GUEST_PERMISSION.SHARES)\n expect(guest.language).toBe('en')\n expect(guest.isActive).toBe(true)\n })\n\n it('generates a random password and defaults isActive when not provided', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED-RAND')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(123)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SPACES)\n\n expect(commonFunctions.hashPassword).toHaveBeenCalled()\n expect(guest.id).toBe(123)\n expect(guest.isActive).toBe(true)\n expect(guest.language).toBeNull()\n })\n })\n\n describe('getLinkFromSpaceOrShare', () => {\n it('returns a link guest for SPACE type', async () => {\n const lg = { id: 1 }\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 11, 22, LINK_TYPE.SPACE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromSpace).toHaveBeenCalledWith(user.id, 11, 22)\n expect(linksQueriesMock.linkFromShare).not.toHaveBeenCalled()\n })\n\n it('returns a link guest for SHARE type', async () => {\n const lg = { id: 2 }\n linksQueriesMock.linkFromShare.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 33, 44, LINK_TYPE.SHARE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromShare).toHaveBeenCalledWith(user.id, 33, 44, +user.isAdmin)\n expect(linksQueriesMock.linkFromSpace).not.toHaveBeenCalled()\n })\n\n it('throws when link not found', async () => {\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(null)\n\n await expect(service.getLinkFromSpaceOrShare(user, 55, 66, LINK_TYPE.SPACE)).rejects.toEqual(\n new HttpException('Link not found', HttpStatus.NOT_FOUND)\n )\n })\n })\n\n describe('updateLinkFromSpaceOrShare (additional branches)', () => {\n it('returns null when no diff and not from API', async () => {\n const link: any = { id: 1, name: 'n', email: 'e', requireAuth: false, limitAccess: null, expiresAt: null }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, {}, false)\n\n expect(result).toBeNull()\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).not.toHaveBeenCalled()\n })\n\n it('hashes password and does not leak it when fromAPI is true', async () => {\n const link: any = { id: 1 }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValueOnce('HASHED')\n ;(linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mockImplementation(async (_link: any, _spaceOrShareId: number, updateUser: any) => {\n // Assert at call time before the service deletes the password\n expect(updateUser).toMatchObject({ password: 'HASHED' })\n return\n })\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, { password: 'secret' }, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n // The returned link must not leak password\n expect(result).toBe(link)\n expect((result as any).password).toBeUndefined()\n })\n\n it('updates multiple link/user fields and ignores equal expiresAt', async () => {\n const base = {\n id: 9,\n name: 'a',\n email: 'b',\n requireAuth: false,\n limitAccess: null,\n expiresAt: { date: '2025-01-01' }\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(base as any)\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto = {\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5,\n expiresAt: { date: '2025-01-01' } // equal, should be ignored\n }\n\n await service.updateLinkFromSpaceOrShare(user, 9, 99, LINK_TYPE.SHARE, dto as any, false)\n\n const [, , , updateLink] = (linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mock.calls[0].slice(0, 5)\n expect(updateLink).toMatchObject({\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5\n })\n expect(updateLink.expiresAt).toBeUndefined()\n })\n })\n\n describe('setAllowedPermissions (additional branches)', () => {\n it('sets all operations when share has externalPath and user is admin', async () => {\n const admin = { id: 10, isAdmin: true } as any\n const share: any = { externalPath: '/ext', file: {} }\n await service.setAllowedPermissions(admin, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('throws NOT_FOUND when space permissions are missing', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { file: { space: { alias: 'space-x', root: { alias: 'r' } } } }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Space not found', HttpStatus.NOT_FOUND))\n })\n\n it('throws NOT_FOUND when parent share permissions are missing', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { ownerId: 42, parent: { alias: 'parent' }, file: {} }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Share not found', HttpStatus.NOT_FOUND))\n })\n\n it('uses owner permissions when asAdmin is true', async () => {\n const asAdminUser = { id: 3, isAdmin: false } as any\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'ADMIN_PARENT' })\n const share: any = { ownerId: 77, parent: { alias: 'pa' }, file: {} }\n\n await service.setAllowedPermissions(asAdminUser, share, true)\n\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(77, 'pa', +asAdminUser.isAdmin)\n expect(share.file.permissions).toBe('ADMIN_PARENT')\n })\n })\n\n describe('getShareLink (additional branch)', () => {\n it('does not trim permissions if file.permissions is falsy', async () => {\n const shareLink: any = { id: 7, file: {} }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const res = await service.getShareLink(user, 7)\n\n expect(spy).toHaveBeenCalled()\n expect(res).toBe(shareLink)\n expect(permissionsUtils.removePermissions).not.toHaveBeenCalled()\n })\n })\n\n describe('deleteShare', () => {\n it('throws Forbidden when user is not admin and not owner', async () => {\n sharesQueriesMock.shareExistsForOwner.mockResolvedValueOnce(false)\n\n await expect(service.deleteShare({ id: 2, isAdmin: false } as any, 123)).rejects.toEqual(\n new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n )\n })\n\n it('deletes links and removes shares when authorized (asAdmin)', async () => {\n const deleteLinksSpy = jest.spyOn(service, 'deleteAllLinkMembers').mockResolvedValue(void 0)\n const removeSpy = jest.spyOn<any, any>(service as any, 'removeShareFromOwners').mockResolvedValue(void 0)\n\n await service.deleteShare(user, 456, true)\n\n expect(deleteLinksSpy).toHaveBeenCalledWith(456, expect.anything())\n expect(removeSpy).toHaveBeenCalledWith(456, 'all', false, user.id)\n })\n })\n\n describe('child share wrappers', () => {\n it('getChildShare returns share link when isLink = true', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(99)\n const getShareLinkSpy = jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ id: 99 } as any)\n\n const res = await service.getChildShare(user, 1, 99, true)\n expect(res).toEqual({ id: 99 })\n expect(getShareLinkSpy).toHaveBeenCalledWith(user, 99, true)\n })\n\n it('getChildShare returns child share when isLink = false', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(100)\n const getShareSpy = jest.spyOn(service, 'getShareWithMembers').mockResolvedValueOnce({ id: 100 } as any)\n\n const res = await service.getChildShare(user, 1, 100, false)\n expect(res).toEqual({ id: 100 })\n expect(getShareSpy).toHaveBeenCalledWith(user, 100, true)\n })\n\n it('updateChildShare forwards update and deleteChildShare forwards delete', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValue(200)\n const updateSpy = jest.spyOn(service, 'updateShare').mockResolvedValueOnce({ id: 200 } as any)\n const deleteSpy = jest.spyOn(service, 'deleteShare').mockResolvedValueOnce(void 0)\n\n await service.updateChildShare(user, 1, 200, {} as any)\n expect(updateSpy).toHaveBeenCalledWith(user, 200, {} as any, true)\n\n await service.deleteChildShare(user, 1, 200)\n expect(deleteSpy).toHaveBeenCalledWith(user, 200, true)\n })\n\n it('throws Forbidden when not allowed to manage child share', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(null)\n await expect(service.getChildShare(user, 1, 2, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('createOrUpdateLinksAsMembers', () => {\n it('creates new links for id < 0 and notifies guest', async () => {\n const createLinkSpy = jest.spyOn<any, any>(service as any, 'createLinkFromSpaceOrShare').mockResolvedValue(void 0)\n const notifySpy = jest.spyOn<any, any>(service as any, 'notifyGuestLink').mockResolvedValue(void 0)\n\n const links = [{ id: -1, linkSettings: { uuid: 'u', email: 'e', permissions: 'p' }, permissions: 'p' }] as any\n\n const res = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, links)\n\n expect(res).toEqual([])\n expect(createLinkSpy).toHaveBeenCalled()\n expect(notifySpy).toHaveBeenCalled()\n })\n\n it('updates modified links and returns them along with unmodified ones', async () => {\n const updateLinkSpy = jest.spyOn(service, 'updateLinkFromSpaceOrShare').mockResolvedValue(void 0)\n\n const members = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, [\n { id: 2, linkId: 2, permissions: 'p', linkSettings: { name: 'new' } },\n { id: 3, linkId: 3, permissions: 'q' } // unmodified\n ] as any)\n\n expect(updateLinkSpy).toHaveBeenCalledWith(user, 2, 1, LINK_TYPE.SHARE, { name: 'new' })\n expect(members).toHaveLength(2)\n expect(members.map((m: any) => m.id)).toEqual([2, 3])\n })\n })\n\n describe('generateLinkUUID (additional)', () => {\n it('returns immediately when the first UUID is unique', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('only-one')\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(uuid).toBe('only-one')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(1)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledWith(user.id, 'only-one')\n })\n })\n})\n"],"names":["jest","mock","SpaceEnv","fn","mockImplementation","setPermissions","envPermissions","havePermission","haveSpacePermission","removePermissions","actual","requireActual","generateShortUUID","hashPassword","intersectPermissions","describe","SharesManager","name","service","contextManagerMock","headerOriginUrl","notificationsManagerMock","create","mockResolvedValue","undefined","sendEmailNotification","spacesQueriesMock","permissions","usersQueriesMock","createUserOrGuest","deleteGuestLink","usersWhitelist","groupsWhitelist","allUserIdsFromGroupsAndSubGroups","linksQueriesMock","isUniqueUUID","isReservedUUID","allLinksFromSpaceOrShare","createLinkToSpaceOrShare","updateLinkFromSpaceOrShare","linkFromShare","linkFromSpace","sharesQueriesMock","listShareLinks","getShareWithMembers","createShare","updateShare","selectShares","deleteShare","updateMember","updateMembers","shareExistsForOwner","childExistsForShareOwner","clearCachePermissions","user","id","isAdmin","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","ContextManager","NotificationsManager","SpacesQueries","UsersQueries","LinksQueries","SharesQueries","compile","useLogger","get","beforeEach","clearAllMocks","it","expect","toBeDefined","share","file","ownerId","setAllowedPermissions","toBe","SHARE_ALL_OPERATIONS","mockResolvedValueOnce","any","space","alias","root","toHaveBeenCalledWith","toBeNull","parent","rejects","toEqual","HttpException","HttpStatus","BAD_REQUEST","spy","spyOn","result","FORBIDDEN","commonFunctions","mockReturnValueOnce","uuid","generateLinkUUID","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","shareLink","getShareLink","permissionsUtils","calls","baseLink","email","requireAuth","limitAccess","expiresAt","shareName","shareDescription","mockReturnValue","dto","language","isActive","toHaveBeenCalled","guest","createGuestLink","GUEST_PERMISSION","SHARES","password","role","SPACES","lg","res","getLinkFromSpaceOrShare","LINK_TYPE","SPACE","not","SHARE","NOT_FOUND","link","_link","_spaceOrShareId","updateUser","toMatchObject","toBeUndefined","base","date","updateLink","slice","admin","externalPath","asAdminUser","deleteLinksSpy","removeSpy","anything","getShareLinkSpy","getChildShare","getShareSpy","updateSpy","deleteSpy","updateChildShare","deleteChildShare","createLinkSpy","notifySpy","links","linkSettings","createOrUpdateLinksAsMembers","updateLinkSpy","members","linkId","toHaveLength","map","m"],"mappings":"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"}
@@ -158,6 +158,7 @@ let SharesQueries = class SharesQueries {
158
158
  const select = {
159
159
  id: _sharesschema.shares.id,
160
160
  ownerId: _sharesschema.shares.ownerId,
161
+ alias: _sharesschema.shares.alias,
161
162
  name: _sharesschema.shares.name,
162
163
  externalPath: (0, _drizzleorm.sql)`IF (${_sharesschema.shares.externalPath} IS NOT NULL AND ${_sharesschema.shares.ownerId} IS NOT NULL, '.', ${_sharesschema.shares.externalPath})`,
163
164
  description: _sharesschema.shares.description,