@sync-in/server 1.8.0 → 1.9.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 (611) hide show
  1. package/CHANGELOG.md +64 -10
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +18 -17
  4. package/server/app.bootstrap.js +4 -2
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +9 -0
  7. package/server/app.constants.js.map +1 -1
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +100 -12
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +29 -8
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +39 -14
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/doc-textify/adapters/pdf.js +5 -16
  65. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  66. package/server/applications/files/utils/files.js +1 -1
  67. package/server/applications/files/utils/files.js.map +1 -1
  68. package/server/applications/files/utils/send-file.js +3 -2
  69. package/server/applications/files/utils/send-file.js.map +1 -1
  70. package/server/applications/links/services/links-queries.service.js +1 -1
  71. package/server/applications/links/services/links-queries.service.js.map +1 -1
  72. package/server/applications/notifications/constants/notifications.js +5 -1
  73. package/server/applications/notifications/constants/notifications.js.map +1 -1
  74. package/server/applications/notifications/i18n/de.js +8 -2
  75. package/server/applications/notifications/i18n/de.js.map +1 -1
  76. package/server/applications/notifications/i18n/es.js +8 -2
  77. package/server/applications/notifications/i18n/es.js.map +1 -1
  78. package/server/applications/notifications/i18n/fr.js +8 -2
  79. package/server/applications/notifications/i18n/fr.js.map +1 -1
  80. package/server/applications/notifications/i18n/hi.js +8 -2
  81. package/server/applications/notifications/i18n/hi.js.map +1 -1
  82. package/server/applications/notifications/i18n/it.js +8 -2
  83. package/server/applications/notifications/i18n/it.js.map +1 -1
  84. package/server/applications/notifications/i18n/ja.js +8 -2
  85. package/server/applications/notifications/i18n/ja.js.map +1 -1
  86. package/server/applications/notifications/i18n/ko.js +8 -2
  87. package/server/applications/notifications/i18n/ko.js.map +1 -1
  88. package/server/applications/notifications/i18n/pl.js +8 -2
  89. package/server/applications/notifications/i18n/pl.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt.js +8 -2
  91. package/server/applications/notifications/i18n/pt.js.map +1 -1
  92. package/server/applications/notifications/i18n/pt_br.js +8 -2
  93. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  94. package/server/applications/notifications/i18n/ru.js +8 -2
  95. package/server/applications/notifications/i18n/ru.js.map +1 -1
  96. package/server/applications/notifications/i18n/tr.js +8 -2
  97. package/server/applications/notifications/i18n/tr.js.map +1 -1
  98. package/server/applications/notifications/i18n/zh.js +8 -2
  99. package/server/applications/notifications/i18n/zh.js.map +1 -1
  100. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  101. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  102. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  103. package/server/applications/notifications/mails/models.js +38 -3
  104. package/server/applications/notifications/mails/models.js.map +1 -1
  105. package/server/applications/notifications/mails/templates.js +1 -1
  106. package/server/applications/notifications/mails/templates.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  108. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  109. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.js +17 -10
  111. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  112. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  113. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  114. package/server/applications/shares/services/shares-queries.service.js +11 -1
  115. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  116. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  117. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  119. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  121. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  123. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  124. package/server/applications/spaces/utils/permissions.js +2 -2
  125. package/server/applications/spaces/utils/permissions.js.map +1 -1
  126. package/server/applications/sync/services/sync-manager.service.js +1 -0
  127. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  130. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  131. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  132. package/server/applications/users/constants/user.js +1 -1
  133. package/server/applications/users/constants/user.js.map +1 -1
  134. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  135. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  136. package/server/applications/users/services/users-manager.service.js +1 -2
  137. package/server/applications/users/services/users-manager.service.js.map +1 -1
  138. package/server/applications/users/services/users-queries.service.js +67 -68
  139. package/server/applications/users/services/users-queries.service.js.map +1 -1
  140. package/server/applications/users/users.gateway.js +6 -0
  141. package/server/applications/users/users.gateway.js.map +1 -1
  142. package/server/applications/users/users.module.js +2 -1
  143. package/server/applications/users/users.module.js.map +1 -1
  144. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  145. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  146. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  147. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  148. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  149. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  150. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  151. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  152. package/server/authentication/constants/auth-ldap.js +2 -0
  153. package/server/authentication/constants/auth-ldap.js.map +1 -1
  154. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  155. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  156. package/server/common/functions.js +0 -8
  157. package/server/common/functions.js.map +1 -1
  158. package/server/common/image.js +63 -58
  159. package/server/common/image.js.map +1 -1
  160. package/server/common/shared.js +18 -1
  161. package/server/common/shared.js.map +1 -1
  162. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  163. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  164. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  165. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  166. package/static/3rdpartylicenses.txt +1380 -57
  167. package/static/assets/favicon.svg +2 -25
  168. package/static/assets/logo-dark.svg +2 -32
  169. package/static/assets/logo.svg +2 -32
  170. package/static/assets/mimes/application-sql.svg +29 -1
  171. package/static/assets/mimes/application-x-sql.svg +29 -0
  172. package/static/assets/mimes/image-bmp.svg +12 -0
  173. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  174. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  175. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  176. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  177. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  178. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  179. package/static/assets/pdfjs/version +1 -1
  180. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  181. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  182. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  183. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  184. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  185. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  186. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  187. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  189. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  191. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  192. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  195. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  196. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  198. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  200. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  202. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  203. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  204. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  205. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  206. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  208. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  209. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  210. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  211. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  212. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  213. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  214. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  216. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  217. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  218. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  219. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  220. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  222. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  223. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  224. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  225. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  226. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  227. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  228. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  229. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  230. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  231. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  232. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  233. package/static/assets/pdfjs/web/viewer.css +141 -110
  234. package/static/assets/pdfjs/web/viewer.html +7 -7
  235. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  236. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  237. package/static/chunk-22DWHRCL.js +1 -0
  238. package/static/chunk-23UUFZSR.js +1 -0
  239. package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
  240. package/static/chunk-25QTY2GI.js +1 -0
  241. package/static/chunk-2E7IJZLL.js +1 -0
  242. package/static/chunk-2FC5EKS5.js +1 -0
  243. package/static/chunk-2FOWUJQF.js +1 -0
  244. package/static/chunk-2XPHUNYN.js +1 -0
  245. package/static/chunk-32L7RG2G.js +1 -0
  246. package/static/chunk-3IISSX63.js +1 -0
  247. package/static/chunk-3OHSTP3R.js +1 -0
  248. package/static/chunk-42L6C5MT.js +1 -0
  249. package/static/chunk-4AGQL5GV.js +1 -0
  250. package/static/chunk-4BPSQMI2.js +1 -0
  251. package/static/chunk-4FDRWZWT.js +1 -0
  252. package/static/chunk-4FJUCMEG.js +1 -0
  253. package/static/chunk-4GCCF6PF.js +1 -0
  254. package/static/chunk-4ORP3SBY.js +1 -0
  255. package/static/chunk-4QBOHIC3.js +1 -0
  256. package/static/chunk-4YT6K5KY.js +1 -0
  257. package/static/chunk-556I6YIW.js +1 -0
  258. package/static/chunk-5DPIGJU4.js +1 -0
  259. package/static/chunk-5HNQLBSW.js +3 -0
  260. package/static/chunk-5IL7C45D.js +1 -0
  261. package/static/chunk-5KJXGMKR.js +1 -0
  262. package/static/chunk-5SPGSHKL.js +1 -0
  263. package/static/chunk-5WCQBTXW.js +1 -0
  264. package/static/chunk-5XUIPWOH.js +1 -0
  265. package/static/chunk-62WT7PI3.js +1 -0
  266. package/static/chunk-6F6OMQ5H.js +1 -0
  267. package/static/chunk-6I5BGQHT.js +1 -0
  268. package/static/chunk-6NOS45DG.js +1 -0
  269. package/static/chunk-6OKLPRCD.js +1 -0
  270. package/static/chunk-6VEJCG43.js +1 -0
  271. package/static/chunk-77SS36Z2.js +1 -0
  272. package/static/chunk-7AXEPO3G.js +1 -0
  273. package/static/chunk-7CFSJ4BO.js +1 -0
  274. package/static/chunk-7CKHC72R.js +1 -0
  275. package/static/chunk-7DUTYOJG.js +1 -0
  276. package/static/chunk-7HKFYRPF.js +1 -0
  277. package/static/chunk-7NZJZATZ.js +1 -0
  278. package/static/chunk-AADK5D2H.js +1 -0
  279. package/static/chunk-ACUF7IKP.js +1 -0
  280. package/static/chunk-AGREZPV4.js +1 -0
  281. package/static/chunk-ATBJWFA3.js +1 -0
  282. package/static/chunk-ATXLZN2B.js +1 -0
  283. package/static/chunk-AZ5TF5Y3.js +1 -0
  284. package/static/chunk-BBHYIURC.js +1 -0
  285. package/static/chunk-BHZEPHRI.js +13 -0
  286. package/static/chunk-BQZWSZNN.js +1 -0
  287. package/static/chunk-BSB4VROD.js +2 -0
  288. package/static/chunk-BYWSTP3P.js +1 -0
  289. package/static/chunk-C3AAEQKW.js +1 -0
  290. package/static/chunk-CCGGCHGN.js +1 -0
  291. package/static/chunk-CFTKW432.js +1 -0
  292. package/static/chunk-CNOVT6KU.js +1 -0
  293. package/static/chunk-D56H3XE2.js +1 -0
  294. package/static/chunk-DFOOSIIA.js +1 -0
  295. package/static/chunk-DHFQIFOF.js +1 -0
  296. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  297. package/static/chunk-DJDRX53V.js +2 -0
  298. package/static/chunk-DKGXUMLT.js +1 -0
  299. package/static/chunk-DRHPEERW.js +2 -0
  300. package/static/chunk-DWYP6ZGG.js +1 -0
  301. package/static/chunk-EDJAISWO.js +13 -0
  302. package/static/chunk-EIYRBM4J.js +1 -0
  303. package/static/chunk-EKEGRXCV.js +7 -0
  304. package/static/chunk-EL6QL4TP.js +1 -0
  305. package/static/chunk-ERDZ7IVF.js +1 -0
  306. package/static/chunk-EVQKKVUZ.js +1 -0
  307. package/static/chunk-F2XG7EWI.js +1 -0
  308. package/static/chunk-F672FY5I.js +1 -0
  309. package/static/chunk-F6V37MKG.js +1 -0
  310. package/static/chunk-F7TXTNZC.js +1 -0
  311. package/static/chunk-FCGTI42I.js +1 -0
  312. package/static/chunk-FQHOSSCO.js +1 -0
  313. package/static/chunk-FTSIPHMG.js +1 -0
  314. package/static/chunk-GAGHHYLF.js +1 -0
  315. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  316. package/static/chunk-H6WOTGQ5.js +1 -0
  317. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  318. package/static/chunk-HC7F57NA.js +1 -0
  319. package/static/chunk-HHWXIK2M.js +7 -0
  320. package/static/chunk-HKRGIRKB.js +3 -0
  321. package/static/chunk-HNMGPG72.js +1 -0
  322. package/static/chunk-HS4S6BV3.js +1 -0
  323. package/static/chunk-IJ7K7ATQ.js +1 -0
  324. package/static/chunk-IOIBQGHN.js +562 -0
  325. package/static/chunk-ITVA26X2.js +2 -0
  326. package/static/chunk-J6YSFHLZ.js +1 -0
  327. package/static/chunk-JAEJ6IMV.js +1 -0
  328. package/static/chunk-JB5R6V33.js +1 -0
  329. package/static/chunk-JF6WIV6M.js +1 -0
  330. package/static/chunk-JGB4LLUT.js +1 -0
  331. package/static/chunk-JGXVTKLG.js +1 -0
  332. package/static/chunk-JMYAD7E2.js +1 -0
  333. package/static/chunk-JSE63Q5X.js +1 -0
  334. package/static/chunk-JVV3ZL6L.js +1 -0
  335. package/static/chunk-JXZCNFW7.js +1 -0
  336. package/static/chunk-KAVP6UXH.js +1 -0
  337. package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
  338. package/static/chunk-KHRF67SG.js +1 -0
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KNZ3AQPR.js +1 -0
  342. package/static/chunk-KT3TWCST.js +1 -0
  343. package/static/chunk-L6SYG23T.js +1 -0
  344. package/static/chunk-LJSVNPPQ.js +1 -0
  345. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  346. package/static/chunk-LRQSPCYZ.js +1 -0
  347. package/static/chunk-LUSVISM6.js +1 -0
  348. package/static/chunk-LXQGVNU2.js +1 -0
  349. package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
  350. package/static/chunk-LZKI5P5T.js +1 -0
  351. package/static/chunk-M4XL3JN5.js +6 -0
  352. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  353. package/static/chunk-MKUUWY6Y.js +1 -0
  354. package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
  355. package/static/chunk-MR3U7TKQ.js +1 -0
  356. package/static/chunk-MRF3CNLZ.js +1 -0
  357. package/static/chunk-MRMSMTWD.js +1 -0
  358. package/static/chunk-MVZJSG5R.js +1 -0
  359. package/static/chunk-MYM43ENO.js +1 -0
  360. package/static/chunk-N3P6P6GW.js +7 -0
  361. package/static/chunk-NAH4V2R6.js +2 -0
  362. package/static/chunk-NBBDVVUF.js +1 -0
  363. package/static/chunk-NMF2ZFBE.js +1 -0
  364. package/static/chunk-NN4ONTOT.js +1 -0
  365. package/static/chunk-NOPACN4F.js +1 -0
  366. package/static/chunk-NYJPOP4L.js +1 -0
  367. package/static/chunk-OJCAIKUK.js +1 -0
  368. package/static/chunk-OQRWXCLY.js +1 -0
  369. package/static/chunk-PCFH5HCI.js +2 -0
  370. package/static/chunk-PG54TWBO.js +4 -0
  371. package/static/chunk-PJF5XUTO.js +1 -0
  372. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  373. package/static/chunk-PTLYIUFW.js +1 -0
  374. package/static/chunk-PZGLDZZM.js +1 -0
  375. package/static/chunk-Q4VNZGFI.js +1 -0
  376. package/static/chunk-Q556XB3S.js +1 -0
  377. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  378. package/static/chunk-Q7U2VPIS.js +1 -0
  379. package/static/chunk-QM6CQMEX.js +1 -0
  380. package/static/chunk-QMHUIHSR.js +1 -0
  381. package/static/chunk-QNFNXDSX.js +1 -0
  382. package/static/chunk-QVFPHTOH.js +1 -0
  383. package/static/chunk-R4MI25E2.js +1 -0
  384. package/static/chunk-R7JRAR3P.js +1 -0
  385. package/static/chunk-R7PNKQU2.js +1 -0
  386. package/static/chunk-RCAORRB7.js +1 -0
  387. package/static/chunk-RK7XRDNB.js +1 -0
  388. package/static/chunk-RO7SAOLK.js +1 -0
  389. package/static/chunk-RQUUINHV.js +1 -0
  390. package/static/chunk-RT3K6DZR.js +1 -0
  391. package/static/chunk-RUN556VW.js +1 -0
  392. package/static/chunk-RX3YQ67K.js +1 -0
  393. package/static/chunk-S6EVLDHA.js +5 -0
  394. package/static/chunk-S7S5M3AZ.js +1 -0
  395. package/static/chunk-SBLNYV74.js +1 -0
  396. package/static/chunk-SIZCHHUA.js +1 -0
  397. package/static/chunk-SRBOO7AO.js +1 -0
  398. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  399. package/static/chunk-T3YI3BSS.js +1 -0
  400. package/static/chunk-T74SMT7I.js +1 -0
  401. package/static/chunk-TAL3RTTQ.js +1 -0
  402. package/static/chunk-TJZKTNNS.js +1 -0
  403. package/static/chunk-UJTFWZEC.js +1 -0
  404. package/static/chunk-UPGVU5LG.js +1 -0
  405. package/static/chunk-UQ6O3I6W.js +1 -0
  406. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  407. package/static/chunk-VWIRXLNE.js +1 -0
  408. package/static/chunk-VZMVGIVW.js +1 -0
  409. package/static/chunk-VZPCXSRG.js +2 -0
  410. package/static/chunk-WR3MA3L3.js +1 -0
  411. package/static/chunk-XCLK7NJL.js +1 -0
  412. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  413. package/static/chunk-XEGHEUP5.js +1 -0
  414. package/static/chunk-XKEBQNQJ.js +1 -0
  415. package/static/chunk-XOF4UW3S.js +1 -0
  416. package/static/chunk-XOTKK2NJ.js +1 -0
  417. package/static/chunk-XX7JXKA6.js +1 -0
  418. package/static/chunk-Y2I36A4K.js +1 -0
  419. package/static/chunk-Y44XDRM5.js +1 -0
  420. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  421. package/static/chunk-Y5RLD72B.js +1 -0
  422. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  423. package/static/chunk-Y63UUJGJ.js +1 -0
  424. package/static/chunk-YBNAC7QM.js +1 -0
  425. package/static/chunk-YCTCESL4.js +1 -0
  426. package/static/chunk-YMAN4LIU.js +1 -0
  427. package/static/chunk-YTDE6SXT.js +1 -0
  428. package/static/chunk-YZPIUJB3.js +1 -0
  429. package/static/chunk-ZCOWBVOT.js +1 -0
  430. package/static/chunk-ZHRYYMYE.js +1 -0
  431. package/static/chunk-ZNXTOQFG.js +1 -0
  432. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  433. package/static/favicon.ico +0 -0
  434. package/static/index.html +2 -2
  435. package/static/main-3PLRDZTO.js +11 -0
  436. package/static/styles-Q4OZOSSK.css +1 -0
  437. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  438. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  439. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  440. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  441. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  442. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  443. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  444. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  445. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  446. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  447. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  448. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  449. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  450. package/static/assets/codemirror/mode/css/css.js +0 -862
  451. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  452. package/static/assets/codemirror/mode/d/d.js +0 -223
  453. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  454. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  455. package/static/assets/codemirror/mode/django/django.js +0 -356
  456. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  457. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  458. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  459. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  460. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  461. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  462. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  463. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  464. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  465. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  466. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  467. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  468. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  469. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  470. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  471. package/static/assets/codemirror/mode/go/go.js +0 -187
  472. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  473. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  474. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  475. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  476. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  477. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  478. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  479. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  480. package/static/assets/codemirror/mode/http/http.js +0 -113
  481. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  482. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  483. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  484. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  485. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  486. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  487. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  488. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  489. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  490. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  491. package/static/assets/codemirror/mode/meta.js +0 -221
  492. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  493. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  494. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  495. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  496. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  497. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  498. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  499. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  500. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  501. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  502. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  503. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  504. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  505. package/static/assets/codemirror/mode/php/php.js +0 -234
  506. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  507. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  508. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  509. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  510. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  511. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  512. package/static/assets/codemirror/mode/python/python.js +0 -402
  513. package/static/assets/codemirror/mode/q/q.js +0 -139
  514. package/static/assets/codemirror/mode/r/r.js +0 -190
  515. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  516. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  517. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  518. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  519. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  520. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  521. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  522. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  523. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  524. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  525. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  526. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  527. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  528. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  529. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  530. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  531. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  532. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  533. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  534. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  535. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  536. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  537. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  538. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  539. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  540. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  541. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  542. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  543. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  544. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  545. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  546. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  547. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  548. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  549. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  550. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  551. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  552. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  553. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  554. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  555. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  556. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  557. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  558. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  559. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  560. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  561. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  562. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  563. package/static/chunk-2KLC4T2Z.js +0 -1
  564. package/static/chunk-373XVRXW.js +0 -1
  565. package/static/chunk-3XVM35O2.js +0 -1
  566. package/static/chunk-3YVRP3VM.js +0 -2
  567. package/static/chunk-AF24EYXU.js +0 -1
  568. package/static/chunk-AKQVEHO6.js +0 -2
  569. package/static/chunk-AY2SZ3G6.js +0 -1
  570. package/static/chunk-BCVX464U.js +0 -2
  571. package/static/chunk-C36MW4ME.js +0 -562
  572. package/static/chunk-DKSEQTMX.js +0 -1
  573. package/static/chunk-FZ3JPGYZ.js +0 -1
  574. package/static/chunk-GUGNR5TF.js +0 -3
  575. package/static/chunk-H6NE33VX.js +0 -1
  576. package/static/chunk-HNQRZALS.js +0 -1
  577. package/static/chunk-JSWCNGXJ.js +0 -1
  578. package/static/chunk-KFJIQIGR.js +0 -1
  579. package/static/chunk-LVM4QB22.js +0 -1
  580. package/static/chunk-M3XVNQZQ.js +0 -1
  581. package/static/chunk-MFLIJH6T.js +0 -1
  582. package/static/chunk-MSUHTBB2.js +0 -1
  583. package/static/chunk-N3U6637P.js +0 -1
  584. package/static/chunk-NNV4OXSB.js +0 -1
  585. package/static/chunk-NO2LTNW3.js +0 -1
  586. package/static/chunk-OOGP4WSH.js +0 -2
  587. package/static/chunk-PCWDQPOM.js +0 -2
  588. package/static/chunk-PGZZP5W3.js +0 -1
  589. package/static/chunk-Q5KM7LTX.js +0 -1
  590. package/static/chunk-QHC6ZPQ4.js +0 -1
  591. package/static/chunk-QZU2S5CV.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SHIVUDP3.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-TPYBFZS5.js +0 -1
  597. package/static/chunk-UEQCWMXD.js +0 -1
  598. package/static/chunk-UG5DMXYO.js +0 -1
  599. package/static/chunk-UJPPR4MX.js +0 -1
  600. package/static/chunk-V3AT2BKP.js +0 -1
  601. package/static/chunk-VKK5BSLX.js +0 -1
  602. package/static/chunk-WJW7CT6G.js +0 -27
  603. package/static/chunk-X5XGK6T7.js +0 -4
  604. package/static/chunk-YEKR5OPO.js +0 -1
  605. package/static/chunk-YW57T2PF.js +0 -1
  606. package/static/chunk-Z5J5F5SX.js +0 -1
  607. package/static/chunk-ZPF2DSQV.js +0 -1
  608. package/static/chunk-ZTCRGJ6Y.js +0 -7
  609. package/static/main-VOL6OMJ5.js +0 -9
  610. package/static/scripts-WRDOQIU5.js +0 -24
  611. package/static/styles-2C2UNCNB.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-methods.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 { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag\"')\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe(WebDAVMethods.name, () => {\n let service: WebDAVMethods\n let filesManager: {\n sendFileFromSpace: jest.Mock\n mkFile: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n copyMove: jest.Mock\n }\n let filesLockManager: {\n create: jest.Mock\n isLockedWithToken: jest.Mock\n removeLock: jest.Mock\n browseLocks: jest.Mock\n browseParentChildLocks: jest.Mock\n checkConflicts: jest.Mock\n getLocksByPath: jest.Mock\n getLockByToken: jest.Mock\n refreshLockTimeout: jest.Mock\n }\n let webDAVSpaces: { propfind: jest.Mock; spaceEnv: jest.Mock }\n const makeRes = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n const baseReq = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'user-1' },\n dav: {\n url: '/webdav/url',\n depth: '0',\n httpVersion: 'HTTP/1.1',\n body: '<lockrequest/>',\n lock: { timeout: 60, lockscope: 'exclusive', owner: 'user-1', token: 'opaquetoken:abc' }\n },\n space: {\n id: 10,\n alias: 'spaceA',\n url: '/spaces/spaceA/file.txt',\n realPath: '/real/path/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt' }\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn().mockResolvedValue(undefined),\n saveStream: jest.fn(),\n delete: jest.fn().mockResolvedValue(undefined),\n touch: jest.fn().mockResolvedValue(undefined),\n mkDir: jest.fn().mockResolvedValue(undefined),\n copyMove: jest.fn().mockResolvedValue(undefined)\n }\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn().mockResolvedValue(undefined),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn().mockResolvedValue(undefined),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn().mockResolvedValue(undefined)\n }\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n {\n provide: FilesManager,\n useValue: filesManager\n },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockReset().mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('headOrGet', () => {\n it('streams the file when repository is FILES and not in shares list', async () => {\n const req = baseReq()\n const res = makeRes()\n const streamable = { stream: 'ok' }\n const send = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(send.checks).toHaveBeenCalledTimes(1)\n expect(send.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n\n it('returns 403 when repository is not allowed', async () => {\n const req = baseReq({ space: { ...baseReq().space, inSharesList: true } })\n const res = makeRes()\n\n // repository not FILES or inSharesList true => forbidden\n await service.headOrGet(req, res, 'OTHER')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('handles error thrown by sendFile.checks via handleError', async () => {\n const req = baseReq()\n const res = makeRes()\n const send = {\n checks: jest.fn().mockRejectedValue(new Error('boom')),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n const handleSpy = jest.spyOn<any, any>(service, 'handleError').mockReturnValue('handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(handleSpy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('lock', () => {\n it('when body is empty: returns 400 if resource does not exist (lock refresh)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('when body is empty: delegates to lockRefresh if resource exists', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('ok')\n })\n\n it('returns 403 when creating new lock on non-existing resource without permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false) // resource does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('returns 409 when parent does not exist for new lock', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource does not exist\n .mockResolvedValueOnce(false) // parent does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/parent-missing')\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('creates lock on existing resource and returns 200 with lock-token header', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true) // resource exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, _timeout, davLock) => {\n davLock.locktoken = 'opaquetoken:1'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.headers['lock-token']).toBe('<opaquetoken:1>')\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.body).toBeDefined()\n })\n\n it('creates lock on unmapped URL (resource missing), creates empty file and returns 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource missing\n .mockResolvedValueOnce(true) // parent exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, _timeout, davLock) => {\n davLock.locktoken = 'opaquetoken:new'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toBe('<opaquetoken:new>')\n })\n\n it('returns 423 when a lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockResolvedValue([false, { davLock: { lockroot: '/locked' }, dbFilePath: 'file.txt' }])\n\n await service.lock(req, res)\n\n // DAV_ERROR_RES should have set 423 on the response\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('unlock', () => {\n it('returns 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns 409 when lock token does not exist or does not match URL', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('returns 403 when the lock owner is a different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 }, key: 'k1' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n\n it('removes lock and returns 204 when owner matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, key: 'k2' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('k2')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('propfind', () => {\n it('returns 404 when repository is FILES and path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'prop' } })\n const res = makeRes()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns multistatus with only property names when PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'propname', httpVersion: 'HTTP/1.1' } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/a')\n })\n\n it('collects lock discovery based on depth', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req0 = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: '0'\n }\n })\n const reqInf = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: 'infinity'\n }\n })\n const res0 = makeRes()\n const resInf = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt', getlastmodified: 'x' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(req0, res0 as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseLocks).toHaveBeenCalledTimes(1)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(reqInf, resInf as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledTimes(1)\n })\n\n it('includes lockdiscovery when requested', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n body: { propfind: { prop: { lockdiscovery: '' } } }\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n\n await service.propfind(req, res as any, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/dav/url')\n })\n })\n\n describe('put', () => {\n it.each([\n { existed: true, expected: HttpStatus.NO_CONTENT, checkEtag: true },\n { existed: false, expected: HttpStatus.CREATED, checkEtag: false }\n ])('returns correct status for PUT when existed=%s', async ({ existed, expected, checkEtag }) => {\n filesManager.saveStream.mockResolvedValue(existed)\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n if (checkEtag) {\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n }\n expect(res.statusCode).toBe(expected)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n const err = new Error('save failed')\n filesManager.saveStream.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.put(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('delete', () => {\n it('returns 204 on success', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n const err = new Error('delete failed')\n filesManager.delete.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.delete(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('proppatch', () => {\n it('returns 404 when target does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, url: '/x', body: { propertyupdate: {} } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/x')\n })\n\n it('returns 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { unknown: {} } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { foo: 'bar' } } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 207 with errors when unsupported props are provided', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ randomProp: 'x' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('randomProp')\n expect(res.body).toContain('403')\n })\n\n it('applies modified props and still returns 207; failed dependency if one fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'keep' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('delegates lock conflict to handleError when checkConflicts throws', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { prop: [{ lastmodified: 'x' }] } } } } })\n const res = makeRes()\n const err = new Error('conflict')\n filesLockManager.checkConflicts.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.proppatch(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n\n it('normalizes array of propertyupdate items containing {prop: ...}', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-03-01' } }, { prop: { ['Win32CreationTime']: 'ignore' } }]\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('wraps single prop object into an array for processing', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: { lastmodified: '2024-03-02' }\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('handles REMOVE action on supported property and returns 207', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n remove: {\n prop: [{ ['Win32CreationTime']: '' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('returns 207 with 424 Failed Dependency when touching lastmodified fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValueOnce(new Error('touch failed'))\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'ok' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('424')\n expect(res.body).toContain('lastmodified')\n })\n\n it('returns 207 with 403 for unsupported prop and 424 for supported prop as failed dependency', async () => {\n // Préparation : la ressource existe et pas de conflit de lock\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n\n // On envoie à la fois une prop non supportée ('randomProp') et une prop supportée ('Win32CreationTime')\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: [{ randomProp: 'x' }, { Win32CreationTime: 'keep' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n // Exécution\n await service.proppatch(req, res)\n\n // Assertions : multistatus, xml, et contenu\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n const xml = res.body as string\n // On doit trouver le nom de la prop non supportée avec status 403\n expect(xml).toContain('randomProp')\n expect(xml).toContain('403')\n // On doit trouver le nom de la prop supportée avec status 424 (failed dependency)\n expect(xml).toContain('Win32CreationTime')\n expect(xml).toContain('424')\n })\n })\n\n describe('mkcol', () => {\n it('returns 201 when directory created', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n filesManager.mkDir.mockRejectedValue(new Error('mkdir failed'))\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.mkcol(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('copyMove', () => {\n it('returns 404 when destination space not found', async () => {\n const req = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/unknown', isMove: false, overwrite: false } } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/unknown')\n })\n\n it('aborts when evaluateIfHeaders fails', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', token: { value: 'bad', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBeUndefined()\n })\n\n it('aborts with 412 when destination If-Header haveLock mismatches', async () => {\n const handler = (service as any)['webDAVHandler']\n const dstSpace = { ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } }\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.getLocksByPath.mockResolvedValue([{}]) // there is a lock, but mustMatch=false -> mismatch\n\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', haveLock: { mustMatch: false } }]\n }\n })\n const res = makeRes()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns 204 when destination existed; 201 when not', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(true)\n const req1 = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: true, overwrite: true } } })\n const res1 = makeRes()\n await service.copyMove(req1, res1 as any)\n expect(res1.statusCode).toBe(HttpStatus.NO_CONTENT)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false)\n const req2 = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: false } } })\n const res2 = makeRes()\n await service.copyMove(req2, res2 as any)\n expect(res2.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n\n // Chain 1) LockConflict without lockroot (fallback to dbFilePath) then 2) unexpected error\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.copyMove.mockRejectedValueOnce(new LockConflict({ dbFilePath: 'dst' } as any)).mockRejectedValueOnce(new Error('copy failed'))\n\n const req = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: true } } })\n\n // 1) LockConflict => DAV_ERROR_RES(423) using e.lock.dbFilePath\n const res1 = makeRes()\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const result1 = await service.copyMove(req, res1)\n\n expect(result1).toBe(res1)\n expect(res1.statusCode).toBe(HttpStatus.LOCKED)\n\n // 2) Unexpected error => HttpException 500 and log contains \" -> /dst\"\n const res2 = makeRes()\n try {\n await service.copyMove(req, res2)\n expect(true).toBe(false) // should not reach\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n\n // Verify the log message includes an arrow to the destination (toUrl)\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /dst'))\n })\n\n it('returns early when evaluateIfHeaders returns false (explicit spy)', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n // Ensure destination space resolves so we reach the evaluateIfHeaders call\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n // Decorator is no-op (mocked), so copyMove calls evaluateIfHeaders once for destination: force it to return false\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res as any)\n\n expect(spy).toHaveBeenCalledTimes(1)\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n })\n\n describe('evaluateIfHeaders', () => {\n it('returns true when no headers', async () => {\n const req = baseReq({ dav: { ...baseReq().dav, ifHeaders: undefined } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n })\n\n const negativeIfHeaderCases = [\n {\n name: 'haveLock mismatch',\n dav: { ifHeaders: [{ haveLock: { mustMatch: true } }] },\n setup: async () => {\n // No lock present => match=false, mustMatch=true => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n }\n },\n {\n name: 'haveLock mismatch when locks exist but mustMatch=false',\n dav: { ifHeaders: [{ haveLock: { mustMatch: false } }] },\n setup: async () => {\n // Lock present => match=true, mustMatch=false => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'dst', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([{}])\n }\n },\n {\n name: 'token not found',\n dav: { ifHeaders: [{ token: { value: 'missing', mustMatch: true } }] },\n setup: async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n }\n },\n {\n name: 'etag mismatch',\n dav: { ifHeaders: [{ etag: { value: 'W/\"bad\"', mustMatch: true } }] },\n setup: async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n }\n }\n ] as const\n\n it.each(negativeIfHeaderCases)('fails with 412 on %s', async ({ dav, setup }) => {\n await setup()\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns true when one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [\n { etag: { value: 'W/\"bad\"', mustMatch: true } },\n { etag: { value: 'W/\"etag\"', mustMatch: true } } // this should pass\n ]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('fails with 412 on token url mismatch', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/other', token: { value: 'opaquetoken:xyz', mustMatch: true } }]\n }\n })\n const res = makeRes()\n // Space for the explicit path\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dav/other', realPath: '/real/other', dbFile: { path: 'other' } })\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } }) // not a parent of /dav/other\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('fails with 412 and logs error when haveLock lookup throws', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', haveLock: { mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('boom'))\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns true when token exists and path matches lockroot', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', token: { value: 'opaquetoken:good', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } })\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('returns false without setting status when If-Header path cannot be resolved', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/missing' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBeUndefined()\n expect(res.body).toBeUndefined()\n })\n\n it('fails with 412 on etag when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag\"', mustMatch: true } }]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('lockRefresh', () => {\n const refresh400Cases = [\n {\n name: 'more than one or zero tokens in If header',\n dav: { body: undefined, ifHeaders: [] },\n expectMsg: 'Expected a lock token'\n },\n {\n name: 'token extraction fails',\n dav: { body: undefined, ifHeaders: [{ notAToken: true }] },\n expectMsg: 'Unable to extract token'\n }\n ] as const\n\n it.each(refresh400Cases)('returns 400 when %s', async ({ dav, expectMsg }) => {\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain(expectMsg)\n })\n\n it('returns 412 when token not found or not matching URL', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:missing', mustMatch: true } }] }\n })\n const res = makeRes()\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:missing')\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns 403 when owner mismatch', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }] }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 } })\n\n await (service as any).lockRefresh(req, res, baseReq().space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n\n it('returns 200 and XML body on success', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n body: undefined,\n lock: { ...baseReq().dav.lock, timeout: 120 },\n ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }]\n }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, davLock: { lockroot: '/dav/url' } })\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('handleError integration', () => {\n it('maps LockConflict to 423 Locked via DAV_ERROR_RES', async () => {\n // simulate LockConflict during PUT\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.saveStream.mockRejectedValue(new LockConflict({ dbFilePath: 'file.txt', davLock: { lockroot: '/dav/url' } } as any))\n\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(typeof res.body).toBe('string')\n })\n\n it('maps FileError to its httpCode and message', async () => {\n const { FileError } = jest.requireActual('../../files/models/file-error')\n filesManager.delete.mockRejectedValue(new FileError(409, 'conflict happened'))\n\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('conflict happened')\n })\n\n it('throws 500 HttpException for unexpected errors', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n filesManager.saveStream.mockRejectedValue(new Error('unexpected'))\n\n try {\n await service.put(req, res)\n // If we reach this line, the test should fail\n expect(true).toBe(false)\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","dirName","genEtag","mockReturnValue","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","WebDAVMethods","name","service","filesManager","filesLockManager","webDAVSpaces","makeRes","res","statusCode","body","headers","contentType","status","code","send","payload","header","value","toLowerCase","type","ct","baseReq","overrides","method","user","id","login","dav","url","depth","httpVersion","lock","timeout","lockscope","owner","token","space","alias","realPath","inSharesList","dbFile","path","beforeAll","sendFileFromSpace","mkFile","mockResolvedValue","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","propfind","spaceEnv","module","Test","createTestingModule","providers","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","beforeEach","clearAllMocks","mockReset","afterEach","restoreAllMocks","it","expect","toBeDefined","req","streamable","stream","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","mockRejectedValue","Error","handleSpy","spyOn","toHaveBeenCalled","BAD_REQUEST","lockRefreshSpy","mockResolvedValueOnce","not","CONFLICT","mockImplementation","_user","_dbFile","_depth","_timeout","davLock","locktoken","dbFilePath","lockroot","OK","CREATED","LOCKED","unlock","NOT_FOUND","key","NO_CONTENT","propfindMode","handler","href","MULTI_STATUS","toContain","req0","prop","STANDARD_PROPS","reqInf","res0","resInf","getlastmodified","lockdiscovery","each","existed","expected","checkEtag","put","err","spy","propertyupdate","proppatch","unknown","set","foo","randomProp","lastmodified","remove","mockRejectedValueOnce","Win32CreationTime","xml","mkcol","destination","isMove","overwrite","ifHeaders","mustMatch","toBeUndefined","dstSpace","haveLock","PRECONDITION_FAILED","req1","res1","req2","res2","LockConflict","logSpy","result1","e","toBeInstanceOf","HttpException","getStatus","INTERNAL_SERVER_ERROR","stringContaining","ok","evaluateIfHeaders","negativeIfHeaderCases","setup","PathsUtils","spaceId","inTrash","etag","refresh400Cases","expectMsg","notAToken","lockRefresh","IfHeaderUtils","FileError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-methods.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 { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag\"')\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe(WebDAVMethods.name, () => {\n let service: WebDAVMethods\n let filesManager: {\n sendFileFromSpace: jest.Mock\n mkFile: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n copyMove: jest.Mock\n }\n let filesLockManager: {\n create: jest.Mock\n isLockedWithToken: jest.Mock\n removeLock: jest.Mock\n browseLocks: jest.Mock\n browseParentChildLocks: jest.Mock\n checkConflicts: jest.Mock\n getLocksByPath: jest.Mock\n getLockByToken: jest.Mock\n refreshLockTimeout: jest.Mock\n }\n let webDAVSpaces: { propfind: jest.Mock; spaceEnv: jest.Mock }\n const makeRes = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n const baseReq = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'user-1' },\n dav: {\n url: '/webdav/url',\n depth: '0',\n httpVersion: 'HTTP/1.1',\n body: '<lockrequest/>',\n lock: { timeout: 60, lockscope: 'exclusive', owner: 'user-1', token: 'opaquetoken:abc' }\n },\n space: {\n id: 10,\n alias: 'spaceA',\n url: '/spaces/spaceA/file.txt',\n realPath: '/real/path/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt' }\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn().mockResolvedValue(undefined),\n saveStream: jest.fn(),\n delete: jest.fn().mockResolvedValue(undefined),\n touch: jest.fn().mockResolvedValue(undefined),\n mkDir: jest.fn().mockResolvedValue(undefined),\n copyMove: jest.fn().mockResolvedValue(undefined)\n }\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn().mockResolvedValue(undefined),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn().mockResolvedValue(undefined),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn().mockResolvedValue(undefined)\n }\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n {\n provide: FilesManager,\n useValue: filesManager\n },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockReset().mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('headOrGet', () => {\n it('streams the file when repository is FILES and not in shares list', async () => {\n const req = baseReq()\n const res = makeRes()\n const streamable = { stream: 'ok' }\n const send = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(send.checks).toHaveBeenCalledTimes(1)\n expect(send.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n\n it('returns 403 when repository is not allowed', async () => {\n const req = baseReq({ space: { ...baseReq().space, inSharesList: true } })\n const res = makeRes()\n\n // repository not FILES or inSharesList true => forbidden\n await service.headOrGet(req, res, 'OTHER')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('handles error thrown by sendFile.checks via handleError', async () => {\n const req = baseReq()\n const res = makeRes()\n const send = {\n checks: jest.fn().mockRejectedValue(new Error('boom')),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(send)\n const handleSpy = jest.spyOn<any, any>(service, 'handleError').mockReturnValue('handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(handleSpy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('lock', () => {\n it('when body is empty: returns 400 if resource does not exist (lock refresh)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('when body is empty: delegates to lockRefresh if resource exists', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, body: undefined } })\n const res = makeRes()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('ok')\n })\n\n it('returns 403 when creating new lock on non-existing resource without permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false) // resource does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('returns 409 when parent does not exist for new lock', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource does not exist\n .mockResolvedValueOnce(false) // parent does not exist\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/parent-missing')\n const req = baseReq()\n const res = makeRes()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('creates lock on existing resource and returns 200 with lock-token header', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true) // resource exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, davLock, _timeout) => {\n davLock.locktoken = 'opaquetoken:1'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.headers['lock-token']).toBe('<opaquetoken:1>')\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.body).toBeDefined()\n })\n\n it('creates lock on unmapped URL (resource missing), creates empty file and returns 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource missing\n .mockResolvedValueOnce(true) // parent exists\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _depth, davLock, _timeout) => {\n davLock.locktoken = 'opaquetoken:new'\n return [\n true,\n {\n dbFilePath: _dbFile?.path,\n davLock: {\n lockroot: davLock.lockroot,\n locktoken: davLock.locktoken,\n lockscope: davLock.lockscope,\n owner: davLock.owner,\n depth: _depth,\n timeout: _timeout\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toBe('<opaquetoken:new>')\n })\n\n it('returns 423 when a lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq()\n const res = makeRes()\n\n filesLockManager.create.mockResolvedValue([false, { davLock: { lockroot: '/locked' }, dbFilePath: 'file.txt' }])\n\n await service.lock(req, res)\n\n // DAV_ERROR_RES should have set 423 on the response\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('unlock', () => {\n it('returns 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns 409 when lock token does not exist or does not match URL', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('returns 403 when the lock owner is a different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 }, key: 'k1' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n\n it('removes lock and returns 204 when owner matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, key: 'k2' })\n const req = baseReq()\n const res = makeRes()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('k2')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('propfind', () => {\n it('returns 404 when repository is FILES and path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'prop' } })\n const res = makeRes()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('returns multistatus with only property names when PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ dav: { ...baseReq().dav, propfindMode: 'propname', httpVersion: 'HTTP/1.1' } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/a')\n })\n\n it('collects lock discovery based on depth', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req0 = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: '0'\n }\n })\n const reqInf = baseReq({\n dav: {\n ...baseReq().dav,\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } },\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n depth: 'infinity'\n }\n })\n const res0 = makeRes()\n const resInf = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt', getlastmodified: 'x' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(req0, res0 as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseLocks).toHaveBeenCalledTimes(1)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n await service.propfind(reqInf, resInf as any, SPACE_REPOSITORY.FILES)\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledTimes(1)\n })\n\n it('includes lockdiscovery when requested', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n propfindMode: 'prop',\n httpVersion: 'HTTP/1.1',\n body: { propfind: { prop: { lockdiscovery: '' } } }\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'propfind').mockImplementation(async function* () {\n yield { href: '/a', name: 'file.txt' }\n })\n filesLockManager.browseLocks.mockResolvedValue({ 'file.txt': { davLock: { lockroot: '/dav/url' } } })\n\n await service.propfind(req, res as any, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/dav/url')\n })\n })\n\n describe('put', () => {\n it.each([\n { existed: true, expected: HttpStatus.NO_CONTENT, checkEtag: true },\n { existed: false, expected: HttpStatus.CREATED, checkEtag: false }\n ])('returns correct status for PUT when existed=%s', async ({ existed, expected, checkEtag }) => {\n filesManager.saveStream.mockResolvedValue(existed)\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n if (checkEtag) {\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n }\n expect(res.statusCode).toBe(expected)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n const err = new Error('save failed')\n filesManager.saveStream.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.put(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('delete', () => {\n it('returns 204 on success', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n const err = new Error('delete failed')\n filesManager.delete.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.delete(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('proppatch', () => {\n it('returns 404 when target does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, url: '/x', body: { propertyupdate: {} } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/x')\n })\n\n it('returns 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { unknown: {} } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { foo: 'bar' } } } } })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('returns 207 with errors when unsupported props are provided', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ randomProp: 'x' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('randomProp')\n expect(res.body).toContain('403')\n })\n\n it('applies modified props and still returns 207; failed dependency if one fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'keep' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('delegates lock conflict to handleError when checkConflicts throws', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({ method: 'PROPPATCH', dav: { ...baseReq().dav, body: { propertyupdate: { set: { prop: [{ lastmodified: 'x' }] } } } } })\n const res = makeRes()\n const err = new Error('conflict')\n filesLockManager.checkConflicts.mockRejectedValue(err)\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.proppatch(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n\n it('normalizes array of propertyupdate items containing {prop: ...}', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValueOnce(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-03-01' } }, { prop: { ['Win32CreationTime']: 'ignore' } }]\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('wraps single prop object into an array for processing', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: { lastmodified: '2024-03-02' }\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('handles REMOVE action on supported property and returns 207', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n remove: {\n prop: [{ ['Win32CreationTime']: '' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('returns 207 with 424 Failed Dependency when touching lastmodified fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValueOnce(new Error('touch failed'))\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }, { ['Win32CreationTime']: 'ok' }] } } }\n }\n })\n const res = makeRes()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('424')\n expect(res.body).toContain('lastmodified')\n })\n\n it('returns 207 with 403 for unsupported prop and 424 for supported prop as failed dependency', async () => {\n // Préparation : la ressource existe et pas de conflit de lock\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n\n // On envoie à la fois une prop non supportée ('randomProp') et une prop supportée ('Win32CreationTime')\n const req = baseReq({\n method: 'PROPPATCH',\n dav: {\n ...baseReq().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: {\n prop: [{ randomProp: 'x' }, { Win32CreationTime: 'keep' }]\n }\n }\n }\n }\n })\n const res = makeRes()\n\n // Exécution\n await service.proppatch(req, res)\n\n // Assertions : multistatus, xml, et contenu\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n const xml = res.body as string\n // On doit trouver le nom de la prop non supportée avec status 403\n expect(xml).toContain('randomProp')\n expect(xml).toContain('403')\n // On doit trouver le nom de la prop supportée avec status 424 (failed dependency)\n expect(xml).toContain('Win32CreationTime')\n expect(xml).toContain('424')\n })\n })\n\n describe('mkcol', () => {\n it('returns 201 when directory created', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const req = baseReq({ method: 'MKCOL' })\n const res = makeRes()\n filesManager.mkDir.mockRejectedValue(new Error('mkdir failed'))\n const spy = jest.spyOn<any, any>(service as any, 'handleError').mockReturnValue('handled')\n\n const result = await service.mkcol(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBe('handled')\n })\n })\n\n describe('copyMove', () => {\n it('returns 404 when destination space not found', async () => {\n const req = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/unknown', isMove: false, overwrite: false } } })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/unknown')\n })\n\n it('aborts when evaluateIfHeaders fails', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', token: { value: 'bad', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res)\n\n expect(spy).toHaveBeenCalled()\n expect(result).toBeUndefined()\n })\n\n it('aborts with 412 when destination If-Header haveLock mismatches', async () => {\n const handler = (service as any)['webDAVHandler']\n const dstSpace = { ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } }\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.getLocksByPath.mockResolvedValue([{}]) // there is a lock, but mustMatch=false -> mismatch\n\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst', haveLock: { mustMatch: false } }]\n }\n })\n const res = makeRes()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns 204 when destination existed; 201 when not', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(true)\n const req1 = baseReq({ method: 'MOVE', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: true, overwrite: true } } })\n const res1 = makeRes()\n await service.copyMove(req1, res1 as any)\n expect(res1.statusCode).toBe(HttpStatus.NO_CONTENT)\n ;(isPathExists as jest.Mock).mockResolvedValueOnce(false)\n const req2 = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: false } } })\n const res2 = makeRes()\n await service.copyMove(req2, res2 as any)\n expect(res2.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('delegates errors to handleError', async () => {\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...baseReq().space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(true)\n\n // Chain 1) LockConflict without lockroot (fallback to dbFilePath) then 2) unexpected error\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.copyMove.mockRejectedValueOnce(new LockConflict({ dbFilePath: 'dst' } as any)).mockRejectedValueOnce(new Error('copy failed'))\n\n const req = baseReq({ method: 'COPY', dav: { ...baseReq().dav, copyMove: { destination: '/dst', isMove: false, overwrite: true } } })\n\n // 1) LockConflict => DAV_ERROR_RES(423) using e.lock.dbFilePath\n const res1 = makeRes()\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n const result1 = await service.copyMove(req, res1)\n\n expect(result1).toBe(res1)\n expect(res1.statusCode).toBe(HttpStatus.LOCKED)\n\n // 2) Unexpected error => HttpException 500 and log contains \" -> /dst\"\n const res2 = makeRes()\n try {\n await service.copyMove(req, res2)\n expect(true).toBe(false) // should not reach\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n\n // Verify the log message includes an arrow to the destination (toUrl)\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /dst'))\n })\n\n it('returns early when evaluateIfHeaders returns false (explicit spy)', async () => {\n const req = baseReq({\n method: 'COPY',\n dav: {\n ...baseReq().dav,\n copyMove: { destination: '/dst', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/dst' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n // Ensure destination space resolves so we reach the evaluateIfHeaders call\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dst', realPath: '/real/dst', dbFile: { path: 'dst' } })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n // Decorator is no-op (mocked), so copyMove calls evaluateIfHeaders once for destination: force it to return false\n const spy = jest.spyOn<any, any>(service as any, 'evaluateIfHeaders').mockResolvedValue(false)\n\n const result = await service.copyMove(req, res as any)\n\n expect(spy).toHaveBeenCalledTimes(1)\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n })\n\n describe('evaluateIfHeaders', () => {\n it('returns true when no headers', async () => {\n const req = baseReq({ dav: { ...baseReq().dav, ifHeaders: undefined } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n })\n\n const negativeIfHeaderCases = [\n {\n name: 'haveLock mismatch',\n dav: { ifHeaders: [{ haveLock: { mustMatch: true } }] },\n setup: async () => {\n // No lock present => match=false, mustMatch=true => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n }\n },\n {\n name: 'haveLock mismatch when locks exist but mustMatch=false',\n dav: { ifHeaders: [{ haveLock: { mustMatch: false } }] },\n setup: async () => {\n // Lock present => match=true, mustMatch=false => mismatch\n ;(PathsUtils.dbFileFromSpace as unknown as jest.Mock).mockReturnValue({ path: 'dst', spaceId: 1, inTrash: false })\n filesLockManager.getLocksByPath.mockResolvedValue([{}])\n }\n },\n {\n name: 'token not found',\n dav: { ifHeaders: [{ token: { value: 'missing', mustMatch: true } }] },\n setup: async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n }\n },\n {\n name: 'etag mismatch',\n dav: { ifHeaders: [{ etag: { value: 'W/\"bad\"', mustMatch: true } }] },\n setup: async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n }\n }\n ] as const\n\n it.each(negativeIfHeaderCases)('fails with 412 on %s', async ({ dav, setup }) => {\n await setup()\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns true when one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [\n { etag: { value: 'W/\"bad\"', mustMatch: true } },\n { etag: { value: 'W/\"etag\"', mustMatch: true } } // this should pass\n ]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('fails with 412 on token url mismatch', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/other', token: { value: 'opaquetoken:xyz', mustMatch: true } }]\n }\n })\n const res = makeRes()\n // Space for the explicit path\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue({ ...req.space, url: '/dav/other', realPath: '/real/other', dbFile: { path: 'other' } })\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } }) // not a parent of /dav/other\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('fails with 412 and logs error when haveLock lookup throws', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', haveLock: { mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('boom'))\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n\n it('returns true when token exists and path matches lockroot', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/url', token: { value: 'opaquetoken:good', mustMatch: true } }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(req.space)\n filesLockManager.getLockByToken.mockResolvedValue({ davLock: { lockroot: '/dav/url' } })\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('returns false without setting status when If-Header path cannot be resolved', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ path: '/dav/missing' }]\n }\n })\n const res = makeRes()\n const handler = (service as any)['webDAVHandler']\n jest.spyOn(handler, 'spaceEnv').mockResolvedValue(null)\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBeUndefined()\n expect(res.body).toBeUndefined()\n })\n\n it('fails with 412 on etag when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag\"', mustMatch: true } }]\n }\n })\n const res = makeRes()\n\n const ok = await (service as any).evaluateIfHeaders(req, res)\n\n expect(ok).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('lockRefresh', () => {\n const refresh400Cases = [\n {\n name: 'more than one or zero tokens in If header',\n dav: { body: undefined, ifHeaders: [] },\n expectMsg: 'Expected a lock token'\n },\n {\n name: 'token extraction fails',\n dav: { body: undefined, ifHeaders: [{ notAToken: true }] },\n expectMsg: 'Unable to extract token'\n }\n ] as const\n\n it.each(refresh400Cases)('returns 400 when %s', async ({ dav, expectMsg }) => {\n const req = baseReq({ dav: { ...baseReq().dav, ...dav } })\n const res = makeRes()\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain(expectMsg)\n })\n\n it('returns 412 when token not found or not matching URL', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:missing', mustMatch: true } }] }\n })\n const res = makeRes()\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:missing')\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('returns 403 when owner mismatch', async () => {\n const req = baseReq({\n dav: { ...baseReq().dav, body: undefined, ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }] }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 2 } })\n\n await (service as any).lockRefresh(req, res, baseReq().space.dbFile.path)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n\n it('returns 200 and XML body on success', async () => {\n const req = baseReq({\n dav: {\n ...baseReq().dav,\n body: undefined,\n lock: { ...baseReq().dav.lock, timeout: 120 },\n ifHeaders: [{ token: { value: 'opaquetoken:abc', mustMatch: true } }]\n }\n })\n const res = makeRes()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquetoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({ owner: { id: 1 }, davLock: { lockroot: '/dav/url' } })\n\n await (service as any).lockRefresh(req, res, req.space.dbFile.path)\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('handleError integration', () => {\n it('maps LockConflict to 423 Locked via DAV_ERROR_RES', async () => {\n // simulate LockConflict during PUT\n const { LockConflict } = jest.requireActual('../../files/models/file-lock-error')\n filesManager.saveStream.mockRejectedValue(new LockConflict({ dbFilePath: 'file.txt', davLock: { lockroot: '/dav/url' } } as any))\n\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n\n const result = await service.put(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(typeof res.body).toBe('string')\n })\n\n it('maps FileError to its httpCode and message', async () => {\n const { FileError } = jest.requireActual('../../files/models/file-error')\n filesManager.delete.mockRejectedValue(new FileError(409, 'conflict happened'))\n\n const req = baseReq({ method: 'DELETE' })\n const res = makeRes()\n\n const result = await service.delete(req, res)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('conflict happened')\n })\n\n it('throws 500 HttpException for unexpected errors', async () => {\n const req = baseReq({ method: 'PUT' })\n const res = makeRes()\n filesManager.saveStream.mockRejectedValue(new Error('unexpected'))\n\n try {\n await service.put(req, res)\n // If we reach this line, the test should fail\n expect(true).toBe(false)\n } catch (e: any) {\n expect(e).toBeInstanceOf(HttpException)\n expect(e.getStatus()).toBe(HttpStatus.INTERNAL_SERVER_ERROR)\n }\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","dirName","genEtag","mockReturnValue","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","WebDAVMethods","name","service","filesManager","filesLockManager","webDAVSpaces","makeRes","res","statusCode","body","headers","contentType","status","code","send","payload","header","value","toLowerCase","type","ct","baseReq","overrides","method","user","id","login","dav","url","depth","httpVersion","lock","timeout","lockscope","owner","token","space","alias","realPath","inSharesList","dbFile","path","beforeAll","sendFileFromSpace","mkFile","mockResolvedValue","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","propfind","spaceEnv","module","Test","createTestingModule","providers","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","beforeEach","clearAllMocks","mockReset","afterEach","restoreAllMocks","it","expect","toBeDefined","req","streamable","stream","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","mockRejectedValue","Error","handleSpy","spyOn","toHaveBeenCalled","BAD_REQUEST","lockRefreshSpy","mockResolvedValueOnce","not","CONFLICT","mockImplementation","_user","_dbFile","_depth","davLock","_timeout","locktoken","dbFilePath","lockroot","OK","CREATED","LOCKED","unlock","NOT_FOUND","key","NO_CONTENT","propfindMode","handler","href","MULTI_STATUS","toContain","req0","prop","STANDARD_PROPS","reqInf","res0","resInf","getlastmodified","lockdiscovery","each","existed","expected","checkEtag","put","err","spy","propertyupdate","proppatch","unknown","set","foo","randomProp","lastmodified","remove","mockRejectedValueOnce","Win32CreationTime","xml","mkcol","destination","isMove","overwrite","ifHeaders","mustMatch","toBeUndefined","dstSpace","haveLock","PRECONDITION_FAILED","req1","res1","req2","res2","LockConflict","logSpy","result1","e","toBeInstanceOf","HttpException","getStatus","INTERNAL_SERVER_ERROR","stringContaining","ok","evaluateIfHeaders","negativeIfHeaderCases","setup","PathsUtils","spaceId","inTrash","etag","refresh400Cases","expectMsg","notAToken","lockRefresh","IfHeaderUtils","FileError"],"mappings":"AAAA;;;;CAIC;;;;wBAEyC;yBACN;yCACH;qCACJ;uBACS;wBACL;+DACL;6BACY;wBACT;kEACA;sCACD;qCACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7BA,KAAKC,IAAI,CAAC,2BAA2B,IAAO,CAAA;QAC1CC,cAAcF,KAAKG,EAAE;QACrBC,SAASJ,KAAKG,EAAE;QAChBE,SAASL,KAAKG,EAAE,GAAGG,eAAe,CAAC;IACrC,CAAA;AACAN,KAAKC,IAAI,CAAC,kCAAkC,IAAO,CAAA;QACjDM,yBAAyBP,KAAKG,EAAE;IAClC,CAAA;AAEAH,KAAKC,IAAI,CAAC,4BAA4B;IACpC,MAAMO,SAASR,KAAKS,aAAa,CAAC;IAClC,OAAO;QAAE,GAAGD,MAAM;QAAEE,iBAAiBV,KAAKG,EAAE;IAAG;AACjD;AAEAH,KAAKC,IAAI,CAAC,qCAAqC,IAAO,CAAA;QACpDU,mBAAmB,IAAM,CAACC,SAAeC,MAAeC,QAAgBC;IAC1E,CAAA;AAEAC,SAASC,mCAAa,CAACC,IAAI,EAAE;IAC3B,IAAIC;IACJ,IAAIC;IASJ,IAAIC;IAWJ,IAAIC;IACJ,MAAMC,UAAU;QACd,MAAMC,MAAW;YACfC,YAAYV;YACZW,MAAMX;YACNY,SAAS,CAAC;YACVC,aAAab;YACbc,QAAOC,IAAY;gBACjB,IAAI,CAACL,UAAU,GAAGK;gBAClB,OAAO,IAAI;YACb;YACAC,MAAKC,OAAa;gBAChB,IAAI,CAACN,IAAI,GAAGM;gBACZ,OAAO,IAAI;YACb;YACAC,QAAOf,IAAY,EAAEgB,KAAa;gBAChC,IAAI,CAACP,OAAO,CAACT,KAAKiB,WAAW,GAAG,GAAGD;gBACnC,OAAO,IAAI;YACb;YACAE,MAAKC,EAAU;gBACb,IAAI,CAACT,WAAW,GAAGS;gBACnB,OAAO,IAAI;YACb;QACF;QACA,OAAOb;IACT;IAEA,MAAMc,UAAU,CAACC,YAA0B,CAAC,CAAC,GAC1C,CAAA;YACCC,QAAQ;YACRC,MAAM;gBAAEC,IAAI;gBAAGC,OAAO;YAAS;YAC/BC,KAAK;gBACHC,KAAK;gBACLC,OAAO;gBACPC,aAAa;gBACbrB,MAAM;gBACNsB,MAAM;oBAAEC,SAAS;oBAAIC,WAAW;oBAAaC,OAAO;oBAAUC,OAAO;gBAAkB;YACzF;YACAC,OAAO;gBACLX,IAAI;gBACJY,OAAO;gBACPT,KAAK;gBACLU,UAAU;gBACVC,cAAc;gBACdC,QAAQ;oBAAEC,MAAM;gBAAW;YAC7B;YACA,GAAGnB,SAAS;QACd,CAAA;IAEFoB,UAAU;QACRvC,eAAe;YACbwC,mBAAmB5D,KAAKG,EAAE;YAC1B0D,QAAQ7D,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YACpCgD,YAAY/D,KAAKG,EAAE;YACnB6D,QAAQhE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YACpCkD,OAAOjE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YACnCmD,OAAOlE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YACnCoD,UAAUnE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;QACxC;QACAM,mBAAmB;YACjB+C,QAAQpE,KAAKG,EAAE;YACfkE,mBAAmBrE,KAAKG,EAAE;YAC1BmE,YAAYtE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YACxCwD,aAAavE,KAAKG,EAAE;YACpBqE,wBAAwBxE,KAAKG,EAAE;YAC/BsE,gBAAgBzE,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;YAC5C2D,gBAAgB1E,KAAKG,EAAE;YACvBwE,gBAAgB3E,KAAKG,EAAE;YACvByE,oBAAoB5E,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;QAClD;QACAO,eAAe;YACbuD,UAAU7E,KAAKG,EAAE;YACjB2E,UAAU9E,KAAKG,EAAE;QACnB;QAEA,MAAM4E,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACTjE,mCAAa;gBACb;oBAAEkE,SAASC,iCAAY;oBAAEC,UAAU/D;gBAAa;gBAChD;oBACE6D,SAASG,iCAAY;oBACrBD,UAAUjE;gBACZ;gBACA;oBAAE+D,SAASI,yCAAgB;oBAAEF,UAAUhE;gBAAiB;aACzD;QACH,GAAGmE,OAAO;QAEVT,OAAOU,SAAS,CAAC;YAAC;SAAQ;QAC1BtE,UAAU4D,OAAOW,GAAG,CAAgBzE,mCAAa;IACnD;IAEA0E,WAAW;QACT3F,KAAK4F,aAAa;QAChB1F,mBAAY,CAAe2F,SAAS,GAAG/B,iBAAiB,CAAC;QACzD1D,cAAO,CAAeE,eAAe,CAAC;QACtCC,oCAAuB,CAAeD,eAAe,CAAC;IAC1D;IACAwF,UAAU;QACR9F,KAAK+F,eAAe;IACtB;IAEAC,GAAG,qBAAqB;QACtBC,OAAO9E,SAAS+E,WAAW;IAC7B;IAEAlF,SAAS,aAAa;QACpBgF,GAAG,oEAAoE;YACrE,MAAMG,MAAM7D;YACZ,MAAMd,MAAMD;YACZ,MAAM6E,aAAa;gBAAEC,QAAQ;YAAK;YAClC,MAAMtE,OAAO;gBACXuE,QAAQtG,KAAKG,EAAE,GAAG2D,iBAAiB,CAAC/C;gBACpCsF,QAAQrG,KAAKG,EAAE,GAAG2D,iBAAiB,CAACsC;YACtC;YACAhF,aAAawC,iBAAiB,CAACtD,eAAe,CAACyB;YAE/C,MAAMwE,SAAS,MAAMpF,QAAQqF,SAAS,CAACL,KAAK3E,KAAKiF,wBAAgB,CAACC,KAAK;YAEvET,OAAO7E,aAAawC,iBAAiB,EAAE+C,oBAAoB,CAACR,IAAI9C,KAAK;YACrE4C,OAAOlE,KAAKuE,MAAM,EAAEM,qBAAqB,CAAC;YAC1CX,OAAOlE,KAAKsE,MAAM,EAAEM,oBAAoB,CAACR,KAAK3E;YAC9CyE,OAAOM,QAAQM,IAAI,CAACT;QACtB;QAEAJ,GAAG,8CAA8C;YAC/C,MAAMG,MAAM7D,QAAQ;gBAAEe,OAAO;oBAAE,GAAGf,UAAUe,KAAK;oBAAEG,cAAc;gBAAK;YAAE;YACxE,MAAMhC,MAAMD;YAEZ,yDAAyD;YACzD,MAAMJ,QAAQqF,SAAS,CAACL,KAAK3E,KAAK;YAElCyE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACC,SAAS;YAChDd,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,2DAA2D;YAC5D,MAAMG,MAAM7D;YACZ,MAAMd,MAAMD;YACZ,MAAMQ,OAAO;gBACXuE,QAAQtG,KAAKG,EAAE,GAAG6G,iBAAiB,CAAC,IAAIC,MAAM;gBAC9CZ,QAAQrG,KAAKG,EAAE;YACjB;YACAiB,aAAawC,iBAAiB,CAACtD,eAAe,CAACyB;YAC/C,MAAMmF,YAAYlH,KAAKmH,KAAK,CAAWhG,SAAS,eAAeb,eAAe,CAAC;YAE/E,MAAMiG,SAAS,MAAMpF,QAAQqF,SAAS,CAACL,KAAK3E,KAAKiF,wBAAgB,CAACC,KAAK;YAEvET,OAAOiB,WAAWE,gBAAgB;YAClCnB,OAAOM,QAAQM,IAAI,CAAC;QACtB;IACF;IAEA7F,SAAS,QAAQ;QACfgF,GAAG,6EAA6E;;YAC5E9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAMX;gBAAU;YAAE;YACjE,MAAMS,MAAMD;YAEZ,MAAMJ,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACO,WAAW;YAClDpB,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,mEAAmE;;YAClE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAMX;gBAAU;YAAE;YACjE,MAAMS,MAAMD;YACZ,MAAM+F,iBAAiBtH,KAAKmH,KAAK,CAAWhG,SAAS,eAAe2C,iBAAiB,CAAC;YAEtF,MAAMyC,SAAS,MAAMpF,QAAQ6B,IAAI,CAACmD,KAAK3E;YAEvCyE,OAAOqB,gBAAgBX,oBAAoB,CAACR,KAAK3E,KAAK2E,IAAI9C,KAAK,CAACI,MAAM,CAACC,IAAI;YAC3EuC,OAAOM,QAAQM,IAAI,CAAC;QACtB;QAEAb,GAAG,kFAAkF;;YACjF9F,mBAAY,CAAeqH,qBAAqB,CAAC,OAAO,0BAA0B;;YAClFhH,oCAAuB,CAAeD,eAAe,CAAC;YACxD,MAAM6F,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACC,SAAS;YAChDd,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YACtBZ,OAAO5E,iBAAiB+C,MAAM,EAAEoD,GAAG,CAACJ,gBAAgB;QACtD;QAEApB,GAAG,uDAAuD;;YACtD9F,mBAAY,CACXqH,qBAAqB,CAAC,OAAO,0BAA0B;aACvDA,qBAAqB,CAAC,OAAO,wBAAwB;;YACtDhH,oCAAuB,CAAeD,eAAe,CAAC;YACtDF,cAAO,CAAeE,eAAe,CAAC;YACxC,MAAM6F,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACW,QAAQ;YAC/CxB,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YACtBZ,OAAO5E,iBAAiB+C,MAAM,EAAEoD,GAAG,CAACJ,gBAAgB;QACtD;QAEApB,GAAG,4EAA4E;;YAC3E9F,mBAAY,CAAe4D,iBAAiB,CAAC,OAAM,kBAAkB;YACvE,MAAMqC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZF,iBAAiB+C,MAAM,CAACsD,kBAAkB,CAAC,OAAOC,OAAOC,SAASC,QAAQC,SAASC;gBACjFD,QAAQE,SAAS,GAAG;gBACpB,OAAO;oBACL;oBACA;wBACEC,YAAYL,SAASlE;wBACrBoE,SAAS;4BACPI,UAAUJ,QAAQI,QAAQ;4BAC1BF,WAAWF,QAAQE,SAAS;4BAC5B9E,WAAW4E,QAAQ5E,SAAS;4BAC5BC,OAAO2E,QAAQ3E,KAAK;4BACpBL,OAAO+E;4BACP5E,SAAS8E;wBACX;oBACF;iBACD;YACH;YAEA,MAAM5G,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExByE,OAAO5E,iBAAiB+C,MAAM,EAAEwC,qBAAqB,CAAC;YACtDX,OAAOzE,IAAIG,OAAO,CAAC,aAAa,EAAEkF,IAAI,CAAC;YACvCZ,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACqB,EAAE;YACzClC,OAAOzE,IAAII,WAAW,EAAEiF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEwE,WAAW;QAC9B;QAEAF,GAAG,uFAAuF;;YACtF9F,mBAAY,CACXqH,qBAAqB,CAAC,OAAO,mBAAmB;aAChDA,qBAAqB,CAAC,OAAM,gBAAgB;YAC/C,MAAMpB,MAAM7D;YACZ,MAAMd,MAAMD;YAEZF,iBAAiB+C,MAAM,CAACsD,kBAAkB,CAAC,OAAOC,OAAOC,SAASC,QAAQC,SAASC;gBACjFD,QAAQE,SAAS,GAAG;gBACpB,OAAO;oBACL;oBACA;wBACEC,YAAYL,SAASlE;wBACrBoE,SAAS;4BACPI,UAAUJ,QAAQI,QAAQ;4BAC1BF,WAAWF,QAAQE,SAAS;4BAC5B9E,WAAW4E,QAAQ5E,SAAS;4BAC5BC,OAAO2E,QAAQ3E,KAAK;4BACpBL,OAAO+E;4BACP5E,SAAS8E;wBACX;oBACF;iBACD;YACH;YAEA,MAAM5G,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExByE,OAAO7E,aAAayC,MAAM,EAAE+C,qBAAqB,CAAC;YAClDX,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACsB,OAAO;YAC9CnC,OAAOzE,IAAIG,OAAO,CAAC,aAAa,EAAEkF,IAAI,CAAC;QACzC;QAEAb,GAAG,2CAA2C;;YAC1C9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZF,iBAAiB+C,MAAM,CAACN,iBAAiB,CAAC;gBAAC;gBAAO;oBAAEgE,SAAS;wBAAEI,UAAU;oBAAU;oBAAGD,YAAY;gBAAW;aAAE;YAE/G,MAAM9G,QAAQ6B,IAAI,CAACmD,KAAK3E;YAExB,oDAAoD;YACpDyE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACuB,MAAM;QAC/C;IACF;IAEArH,SAAS,UAAU;QACjBgF,GAAG,4CAA4C;;YAC3C9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQmH,MAAM,CAACnC,KAAK3E;YAE1ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACyB,SAAS;YAChDtC,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAACV,IAAIvD,GAAG,CAACC,GAAG;QACnC;QAEAmD,GAAG,oEAAoE;;YACnE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;YACrD,MAAMqC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQmH,MAAM,CAACnC,KAAK3E;YAE1ByE,OAAO5E,iBAAiBgD,iBAAiB,EAAEsC,oBAAoB,CAACR,IAAIvD,GAAG,CAACI,IAAI,CAACI,KAAK,EAAE+C,IAAI9C,KAAK,CAACI,MAAM,CAACC,IAAI;YACzGuC,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACW,QAAQ;QACjD;QAEAzB,GAAG,uDAAuD;;YACtD9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;gBAAEX,OAAO;oBAAET,IAAI;gBAAE;gBAAG8F,KAAK;YAAK;YACnF,MAAMrC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQmH,MAAM,CAACnC,KAAK3E;YAE1ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACC,SAAS;YAChDd,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YACtBZ,OAAO5E,iBAAiBiD,UAAU,EAAEkD,GAAG,CAACJ,gBAAgB;QAC1D;QAEApB,GAAG,mDAAmD;;YAClD9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;gBAAEX,OAAO;oBAAET,IAAI;gBAAE;gBAAG8F,KAAK;YAAK;YACnF,MAAMrC,MAAM7D;YACZ,MAAMd,MAAMD;YAEZ,MAAMJ,QAAQmH,MAAM,CAACnC,KAAK3E;YAE1ByE,OAAO5E,iBAAiBiD,UAAU,EAAEqC,oBAAoB,CAAC;YACzDV,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC2B,UAAU;QACnD;IACF;IAEAzH,SAAS,YAAY;QACnBgF,GAAG,gEAAgE;;YAC/D9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAE8F,cAAc;gBAAO;YAAE;YACtE,MAAMlH,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQ0D,QAAQ,CAACsB,KAAK3E,KAAKiF,wBAAgB,CAACC,KAAK;YAEtET,OAAOM,QAAQM,IAAI,CAACrF;YACpByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACyB,SAAS;YAChDtC,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAACV,IAAIvD,GAAG,CAACC,GAAG;QACnC;QAEAmD,GAAG,mEAAmE;;YAClE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAE8F,cAAc;oBAAY3F,aAAa;gBAAW;YAAE;YACnG,MAAMvB,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAYjB,kBAAkB,CAAC;gBACjD,MAAM;oBAAEkB,MAAM;oBAAM1H,MAAM;gBAAW;YACvC;YAEA,MAAMqF,SAAS,MAAMpF,QAAQ0D,QAAQ,CAACsB,KAAK3E,KAAKiF,wBAAgB,CAACC,KAAK;YAEtET,OAAOM,QAAQM,IAAI,CAACrF;YACpByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC7C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,0CAA0C;;YACzC9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMiF,OAAOzG,QAAQ;gBACnBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBlB,MAAM;wBAAEmD,UAAU;4BAAEmE,MAAM;gCAAE,CAACC,sBAAc,CAAC,EAAE,CAAC,EAAE;4BAAG;wBAAE;oBAAE;oBACxDP,cAAc;oBACd3F,aAAa;oBACbD,OAAO;gBACT;YACF;YACA,MAAMoG,SAAS5G,QAAQ;gBACrBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBlB,MAAM;wBAAEmD,UAAU;4BAAEmE,MAAM;gCAAE,CAACC,sBAAc,CAAC,EAAE,CAAC,EAAE;4BAAG;wBAAE;oBAAE;oBACxDP,cAAc;oBACd3F,aAAa;oBACbD,OAAO;gBACT;YACF;YACA,MAAMqG,OAAO5H;YACb,MAAM6H,SAAS7H;YACf,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAYjB,kBAAkB,CAAC;gBACjD,MAAM;oBAAEkB,MAAM;oBAAM1H,MAAM;oBAAYmI,iBAAiB;gBAAI;YAC7D;YACAhI,iBAAiBkD,WAAW,CAACT,iBAAiB,CAAC;gBAAE,YAAY;oBAAEgE,SAAS;wBAAEI,UAAU;oBAAW;gBAAE;YAAE;YACnG,MAAM/G,QAAQ0D,QAAQ,CAACkE,MAAMI,MAAa1C,wBAAgB,CAACC,KAAK;YAChET,OAAO5E,iBAAiBkD,WAAW,EAAEqC,qBAAqB,CAAC;YAE3DvF,iBAAiBmD,sBAAsB,CAACV,iBAAiB,CAAC;gBAAE,YAAY;oBAAEgE,SAAS;wBAAEI,UAAU;oBAAW;gBAAE;YAAE;YAC9G,MAAM/G,QAAQ0D,QAAQ,CAACqE,QAAQE,QAAe3C,wBAAgB,CAACC,KAAK;YACpET,OAAO5E,iBAAiBmD,sBAAsB,EAAEoC,qBAAqB,CAAC;QACxE;QAEAZ,GAAG,yCAAyC;;YACxC9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChB8F,cAAc;oBACd3F,aAAa;oBACbrB,MAAM;wBAAEmD,UAAU;4BAAEmE,MAAM;gCAAEM,eAAe;4BAAG;wBAAE;oBAAE;gBACpD;YACF;YACA,MAAM9H,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAYjB,kBAAkB,CAAC;gBACjD,MAAM;oBAAEkB,MAAM;oBAAM1H,MAAM;gBAAW;YACvC;YACAG,iBAAiBkD,WAAW,CAACT,iBAAiB,CAAC;gBAAE,YAAY;oBAAEgE,SAAS;wBAAEI,UAAU;oBAAW;gBAAE;YAAE;YAEnG,MAAM/G,QAAQ0D,QAAQ,CAACsB,KAAK3E,KAAYiF,wBAAgB,CAACC,KAAK;YAE9DT,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;IACF;IAEA9H,SAAS,OAAO;QACdgF,GAAGuD,IAAI,CAAC;YACN;gBAAEC,SAAS;gBAAMC,UAAU3C,kBAAU,CAAC2B,UAAU;gBAAEiB,WAAW;YAAK;YAClE;gBAAEF,SAAS;gBAAOC,UAAU3C,kBAAU,CAACsB,OAAO;gBAAEsB,WAAW;YAAM;SAClE,EAAE,kDAAkD,OAAO,EAAEF,OAAO,EAAEC,QAAQ,EAAEC,SAAS,EAAE;YAC1FtI,aAAa2C,UAAU,CAACD,iBAAiB,CAAC0F;YAC1C,MAAMrD,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAM;YACpC,MAAMhB,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQwI,GAAG,CAACxD,KAAK3E;YAEtC,IAAIkI,WAAW;gBACbzD,OAAOzE,IAAIG,OAAO,CAAC,OAAO,EAAEuE,WAAW;gBACvCD,OAAOM,QAAQM,IAAI,CAACrF;YACtB;YACAyE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAAC4C;QAC9B;QAEAzD,GAAG,mCAAmC;YACpC,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAM;YACpC,MAAMhB,MAAMD;YACZ,MAAMqI,MAAM,IAAI3C,MAAM;YACtB7F,aAAa2C,UAAU,CAACiD,iBAAiB,CAAC4C;YAC1C,MAAMC,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,eAAeb,eAAe,CAAC;YAEhF,MAAMiG,SAAS,MAAMpF,QAAQwI,GAAG,CAACxD,KAAK3E;YAEtCyE,OAAO4D,KAAKzC,gBAAgB;YAC5BnB,OAAOM,QAAQM,IAAI,CAAC;QACtB;IACF;IAEA7F,SAAS,UAAU;QACjBgF,GAAG,0BAA0B;YAC3B,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAS;YACvC,MAAMhB,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQ6C,MAAM,CAACmC,KAAK3E;YAEzCyE,OAAOM,QAAQM,IAAI,CAACrF;YACpByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC2B,UAAU;QACnD;QAEAzC,GAAG,mCAAmC;YACpC,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAS;YACvC,MAAMhB,MAAMD;YACZ,MAAMqI,MAAM,IAAI3C,MAAM;YACtB7F,aAAa4C,MAAM,CAACgD,iBAAiB,CAAC4C;YACtC,MAAMC,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,eAAeb,eAAe,CAAC;YAEhF,MAAMiG,SAAS,MAAMpF,QAAQ6C,MAAM,CAACmC,KAAK3E;YAEzCyE,OAAO4D,KAAKzC,gBAAgB;YAC5BnB,OAAOM,QAAQM,IAAI,CAAC;QACtB;IACF;IAEA7F,SAAS,aAAa;QACpBgF,GAAG,0CAA0C;;YACzC9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAaI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEC,KAAK;oBAAMnB,MAAM;wBAAEoI,gBAAgB,CAAC;oBAAE;gBAAE;YAAE;YAC9G,MAAMtI,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACyB,SAAS;YAChDtC,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,sCAAsC;;YACrC9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAaI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAM;wBAAEoI,gBAAgB;4BAAEE,SAAS,CAAC;wBAAE;oBAAE;gBAAE;YAAE;YAChH,MAAMxI,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACO,WAAW;YAClDpB,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,qCAAqC;;YACpC9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAaI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAM;wBAAEoI,gBAAgB;4BAAEG,KAAK;gCAAEC,KAAK;4BAAM;wBAAE;oBAAE;gBAAE;YAAE;YACxH,MAAM1I,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACO,WAAW;YAClDpB,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,+DAA+D;;YAC9D9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClD,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBAAEoI,gBAAgB;4BAAEG,KAAK;gCAAEjB,MAAM;oCAAC;wCAAEmB,YAAY;oCAAI;iCAAE;4BAAC;wBAAE;oBAAE;gBACnE;YACF;YACA,MAAM3I,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC7C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,gFAAgF;;YAC/E9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClDK,aAAa6C,KAAK,CAACsD,qBAAqB,CAACxG;YACzC,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBAAEoI,gBAAgB;4BAAEG,KAAK;gCAAEjB,MAAM;oCAAC;wCAAEoB,cAAc;oCAAa;oCAAG;wCAAE,CAAC,oBAAoB,EAAE;oCAAO;iCAAE;4BAAC;wBAAE;oBAAE;gBACjH;YACF;YACA,MAAM5I,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAO7E,aAAa6C,KAAK,EAAEmD,gBAAgB;YAC3CnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,qEAAqE;;YACpE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAaI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAM;wBAAEoI,gBAAgB;4BAAEG,KAAK;gCAAEjB,MAAM;oCAAC;wCAAEoB,cAAc;oCAAI;iCAAE;4BAAC;wBAAE;oBAAE;gBAAE;YAAE;YAC3I,MAAM5I,MAAMD;YACZ,MAAMqI,MAAM,IAAI3C,MAAM;YACtB5F,iBAAiBoD,cAAc,CAACuC,iBAAiB,CAAC4C;YAClD,MAAMC,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,eAAeb,eAAe,CAAC;YAEhF,MAAMiG,SAAS,MAAMpF,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE5CyE,OAAO4D,KAAKzC,gBAAgB;YAC5BnB,OAAOM,QAAQM,IAAI,CAAC;QACtB;QAEAb,GAAG,mEAAmE;;YAClE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClDK,aAAa6C,KAAK,CAACsD,qBAAqB,CAACxG;YACzC,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBACJoI,gBAAgB;4BACdG,KAAK;gCAAC;oCAAEjB,MAAM;wCAAEoB,cAAc;oCAAa;gCAAE;gCAAG;oCAAEpB,MAAM;wCAAE,CAAC,oBAAoB,EAAE;oCAAS;gCAAE;6BAAE;wBAChG;oBACF;gBACF;YACF;YACA,MAAMxH,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAO7E,aAAa6C,KAAK,EAAEmD,gBAAgB;YAC3CnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC7C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,yDAAyD;;YACxD9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClD,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBACJoI,gBAAgB;4BACdG,KAAK;gCACHjB,MAAM;oCAAEoB,cAAc;gCAAa;4BACrC;wBACF;oBACF;gBACF;YACF;YACA,MAAM5I,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAO7E,aAAa6C,KAAK,EAAEmD,gBAAgB;YAC3CnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,+DAA+D;;YAC9D9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClD,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBACJoI,gBAAgB;4BACdO,QAAQ;gCACNrB,MAAM;oCAAC;wCAAE,CAAC,oBAAoB,EAAE;oCAAG;iCAAE;4BACvC;wBACF;oBACF;gBACF;YACF;YACA,MAAMxH,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAO7E,aAAa6C,KAAK,EAAEuD,GAAG,CAACJ,gBAAgB;YAC/CnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC7C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,2EAA2E;;YAC1E9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAClDK,aAAa6C,KAAK,CAACqG,qBAAqB,CAAC,IAAIrD,MAAM;YACnD,MAAMd,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBAAEoI,gBAAgB;4BAAEG,KAAK;gCAAEjB,MAAM;oCAAC;wCAAEoB,cAAc;oCAAa;oCAAG;wCAAE,CAAC,oBAAoB,EAAE;oCAAK;iCAAE;4BAAC;wBAAE;oBAAE;gBAC/G;YACF;YACA,MAAM5I,MAAMD;YAEZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;YAC7BZ,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;YAC3B7C,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC;QAC7B;QAEA9C,GAAG,6FAA6F;YAC9F,8DAA8D;;YAC5D9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBoD,cAAc,CAACX,iBAAiB,CAAC/C;YAElD,wGAAwG;YACxG,MAAMoF,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBG,aAAa;oBACbrB,MAAM;wBACJoI,gBAAgB;4BACdG,KAAK;gCACHjB,MAAM;oCAAC;wCAAEmB,YAAY;oCAAI;oCAAG;wCAAEI,mBAAmB;oCAAO;iCAAE;4BAC5D;wBACF;oBACF;gBACF;YACF;YACA,MAAM/I,MAAMD;YAEZ,YAAY;YACZ,MAAMJ,QAAQ4I,SAAS,CAAC5D,KAAK3E;YAE7B,4CAA4C;YAC5CyE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC+B,YAAY;YACnD5C,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC,MAAM0B,MAAMhJ,IAAIE,IAAI;YACpB,kEAAkE;YAClEuE,OAAOuE,KAAK1B,SAAS,CAAC;YACtB7C,OAAOuE,KAAK1B,SAAS,CAAC;YACtB,kFAAkF;YAClF7C,OAAOuE,KAAK1B,SAAS,CAAC;YACtB7C,OAAOuE,KAAK1B,SAAS,CAAC;QACxB;IACF;IAEA9H,SAAS,SAAS;QAChBgF,GAAG,sCAAsC;YACvC,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAQ;YACtC,MAAMhB,MAAMD;YAEZ,MAAMJ,QAAQsJ,KAAK,CAACtE,KAAK3E;YAEzByE,OAAO7E,aAAa8C,KAAK,EAAEkD,gBAAgB;YAC3CnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACsB,OAAO;QAChD;QAEApC,GAAG,mCAAmC;YACpC,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAQ;YACtC,MAAMhB,MAAMD;YACZH,aAAa8C,KAAK,CAAC8C,iBAAiB,CAAC,IAAIC,MAAM;YAC/C,MAAM4C,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,eAAeb,eAAe,CAAC;YAEhF,MAAMiG,SAAS,MAAMpF,QAAQsJ,KAAK,CAACtE,KAAK3E;YAExCyE,OAAO4D,KAAKzC,gBAAgB;YAC5BnB,OAAOM,QAAQM,IAAI,CAAC;QACtB;IACF;IAEA7F,SAAS,YAAY;QACnBgF,GAAG,gDAAgD;YACjD,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAQI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEuB,UAAU;wBAAEuG,aAAa;wBAAYC,QAAQ;wBAAOC,WAAW;oBAAM;gBAAE;YAAE;YACxI,MAAMpJ,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;YAElD,MAAM3C,QAAQgD,QAAQ,CAACgC,KAAK3E;YAE5ByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACyB,SAAS;YAChDtC,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,uCAAuC;YACxC,MAAMG,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAOC,WAAW;oBAAK;oBAChEC,WAAW;wBAAC;4BAAEnH,MAAM;4BAAQN,OAAO;gCAAElB,OAAO;gCAAO4I,WAAW;4BAAK;wBAAE;qBAAE;gBACzE;YACF;YACA,MAAMtJ,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;gBAAE,GAAGqC,IAAI9C,KAAK;gBAAER,KAAK;gBAAQU,UAAU;gBAAaE,QAAQ;oBAAEC,MAAM;gBAAM;YAAE;YAC9H,MAAMmG,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,qBAAqB2C,iBAAiB,CAAC;YAExF,MAAMyC,SAAS,MAAMpF,QAAQgD,QAAQ,CAACgC,KAAK3E;YAE3CyE,OAAO4D,KAAKzC,gBAAgB;YAC5BnB,OAAOM,QAAQwE,aAAa;QAC9B;QAEA/E,GAAG,kEAAkE;YACnE,MAAM2C,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjD,MAAM6J,WAAW;gBAAE,GAAG1I,UAAUe,KAAK;gBAAER,KAAK;gBAAQU,UAAU;gBAAaE,QAAQ;oBAAEC,MAAM;gBAAM;YAAE;YACnG1D,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAACkH;YAChD9K,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/CzC,iBAAiBqD,cAAc,CAACZ,iBAAiB,CAAC;gBAAC,CAAC;aAAE,GAAE,mDAAmD;YAE3G,MAAMqC,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAOC,WAAW;oBAAK;oBAChEC,WAAW;wBAAC;4BAAEnH,MAAM;4BAAQuH,UAAU;gCAAEH,WAAW;4BAAM;wBAAE;qBAAE;gBAC/D;YACF;YACA,MAAMtJ,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQgD,QAAQ,CAACgC,KAAK3E;YAE3CyE,OAAOM,QAAQwE,aAAa;YAC5B9E,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;YAC1DjF,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,sDAAsD;YACvD,MAAM2C,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;gBAAE,GAAGxB,UAAUe,KAAK;gBAAER,KAAK;gBAAQU,UAAU;gBAAaE,QAAQ;oBAAEC,MAAM;gBAAM;YAAE;YACpI1D,KAAKmH,KAAK,CAAWhG,SAAgB,qBAAqB2C,iBAAiB,CAAC;YAC1E5D,mBAAY,CAAeqH,qBAAqB,CAAC;YACnD,MAAM4D,OAAO7I,QAAQ;gBAAEE,QAAQ;gBAAQI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAMC,WAAW;oBAAK;gBAAE;YAAE;YACnI,MAAMQ,OAAO7J;YACb,MAAMJ,QAAQgD,QAAQ,CAACgH,MAAMC;YAC7BnF,OAAOmF,KAAK3J,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAAC2B,UAAU;YAChDvI,mBAAY,CAAeqH,qBAAqB,CAAC;YACnD,MAAM8D,OAAO/I,QAAQ;gBAAEE,QAAQ;gBAAQI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAOC,WAAW;oBAAM;gBAAE;YAAE;YACrI,MAAMU,OAAO/J;YACb,MAAMJ,QAAQgD,QAAQ,CAACkH,MAAMC;YAC7BrF,OAAOqF,KAAK7J,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACsB,OAAO;QACjD;QAEApC,GAAG,mCAAmC;YACpC,MAAM2C,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;gBAAE,GAAGxB,UAAUe,KAAK;gBAAER,KAAK;gBAAQU,UAAU;gBAAaE,QAAQ;oBAAEC,MAAM;gBAAM;YAAE;YACpI1D,KAAKmH,KAAK,CAAWhG,SAAgB,qBAAqB2C,iBAAiB,CAAC;YAE5E,2FAA2F;YAC3F,MAAM,EAAEyH,YAAY,EAAE,GAAGvL,KAAKS,aAAa,CAAC;YAC5CW,aAAa+C,QAAQ,CAACmG,qBAAqB,CAAC,IAAIiB,aAAa;gBAAEtD,YAAY;YAAM,IAAWqC,qBAAqB,CAAC,IAAIrD,MAAM;YAE5H,MAAMd,MAAM7D,QAAQ;gBAAEE,QAAQ;gBAAQI,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAOC,WAAW;oBAAK;gBAAE;YAAE;YAEnI,gEAAgE;YAChE,MAAMQ,OAAO7J;YACb,MAAMiK,SAASxL,KAAKmH,KAAK,CAAC,AAAChG,OAAe,CAAC,SAAS,EAAE,SAASuG,kBAAkB,CAAC,IAAM3G;YACxF,MAAM0K,UAAU,MAAMtK,QAAQgD,QAAQ,CAACgC,KAAKiF;YAE5CnF,OAAOwF,SAAS5E,IAAI,CAACuE;YACrBnF,OAAOmF,KAAK3J,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACuB,MAAM;YAE9C,uEAAuE;YACvE,MAAMiD,OAAO/J;YACb,IAAI;gBACF,MAAMJ,QAAQgD,QAAQ,CAACgC,KAAKmF;gBAC5BrF,OAAO,MAAMY,IAAI,CAAC,QAAO,mBAAmB;YAC9C,EAAE,OAAO6E,GAAQ;gBACfzF,OAAOyF,GAAGC,cAAc,CAACC,qBAAa;gBACtC3F,OAAOyF,EAAEG,SAAS,IAAIhF,IAAI,CAACC,kBAAU,CAACgF,qBAAqB;YAC7D;YAEA,sEAAsE;YACtE7F,OAAOuF,QAAQ7E,oBAAoB,CAACV,OAAO8F,gBAAgB,CAAC;QAC9D;QAEA/F,GAAG,qEAAqE;YACtE,MAAMG,MAAM7D,QAAQ;gBAClBE,QAAQ;gBACRI,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBuB,UAAU;wBAAEuG,aAAa;wBAAQC,QAAQ;wBAAOC,WAAW;oBAAK;oBAChEC,WAAW;wBAAC;4BAAEnH,MAAM;wBAAO;qBAAE;gBAC/B;YACF;YACA,MAAMlC,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjD,2EAA2E;YAC3EnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;gBAAE,GAAGqC,IAAI9C,KAAK;gBAAER,KAAK;gBAAQU,UAAU;gBAAaE,QAAQ;oBAAEC,MAAM;gBAAM;YAAE;YAC5HxD,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,kHAAkH;YAClH,MAAM+F,MAAM7J,KAAKmH,KAAK,CAAWhG,SAAgB,qBAAqB2C,iBAAiB,CAAC;YAExF,MAAMyC,SAAS,MAAMpF,QAAQgD,QAAQ,CAACgC,KAAK3E;YAE3CyE,OAAO4D,KAAKjD,qBAAqB,CAAC;YAClCX,OAAOM,QAAQwE,aAAa;YAC5B9E,OAAO7E,aAAa+C,QAAQ,EAAEqD,GAAG,CAACJ,gBAAgB;QACpD;IACF;IAEApG,SAAS,qBAAqB;QAC5BgF,GAAG,gCAAgC;YACjC,MAAMG,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAEiI,WAAW9J;gBAAU;YAAE;YACtE,MAAMS,MAAMD;YAEZ,MAAMyK,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;QAClB;QAEA,MAAMqF,wBAAwB;YAC5B;gBACEhL,MAAM;gBACN0B,KAAK;oBAAEiI,WAAW;wBAAC;4BAAEI,UAAU;gCAAEH,WAAW;4BAAK;wBAAE;qBAAE;gBAAC;gBACtDqB,OAAO;oBACL,6DAA6D;;oBAC3DC,OAAW1L,eAAe,CAA0BJ,eAAe,CAAC;wBAAEoD,MAAM;wBAAY2I,SAAS;wBAAGC,SAAS;oBAAM;oBACrHjL,iBAAiBqD,cAAc,CAACZ,iBAAiB,CAAC,EAAE;gBACtD;YACF;YACA;gBACE5C,MAAM;gBACN0B,KAAK;oBAAEiI,WAAW;wBAAC;4BAAEI,UAAU;gCAAEH,WAAW;4BAAM;wBAAE;qBAAE;gBAAC;gBACvDqB,OAAO;oBACL,0DAA0D;;oBACxDC,OAAW1L,eAAe,CAA0BJ,eAAe,CAAC;wBAAEoD,MAAM;wBAAO2I,SAAS;wBAAGC,SAAS;oBAAM;oBAChHjL,iBAAiBqD,cAAc,CAACZ,iBAAiB,CAAC;wBAAC,CAAC;qBAAE;gBACxD;YACF;YACA;gBACE5C,MAAM;gBACN0B,KAAK;oBAAEiI,WAAW;wBAAC;4BAAEzH,OAAO;gCAAElB,OAAO;gCAAW4I,WAAW;4BAAK;wBAAE;qBAAE;gBAAC;gBACrEqB,OAAO;oBACL9K,iBAAiBsD,cAAc,CAACb,iBAAiB,CAAC;gBACpD;YACF;YACA;gBACE5C,MAAM;gBACN0B,KAAK;oBAAEiI,WAAW;wBAAC;4BAAE0B,MAAM;gCAAErK,OAAO;gCAAW4I,WAAW;4BAAK;wBAAE;qBAAE;gBAAC;gBACpEqB,OAAO;;oBACHjM,mBAAY,CAAe4D,iBAAiB,CAAC;gBACjD;YACF;SACD;QAEDkC,GAAGuD,IAAI,CAAC2C,uBAAuB,wBAAwB,OAAO,EAAEtJ,GAAG,EAAEuJ,KAAK,EAAE;YAC1E,MAAMA;YACN,MAAMhG,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAE,GAAGA,GAAG;gBAAC;YAAE;YACxD,MAAMpB,MAAMD;YAEZ,MAAMyK,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;QAC5D;QAEAlF,GAAG,2CAA2C;;YAC1C9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBACT;4BAAE0B,MAAM;gCAAErK,OAAO;gCAAW4I,WAAW;4BAAK;wBAAE;wBAC9C;4BAAEyB,MAAM;gCAAErK,OAAO;gCAAY4I,WAAW;4BAAK;wBAAE,EAAE,mBAAmB;qBACrE;gBACH;YACF;YACA,MAAMtJ,MAAMD;YAEZ,MAAMyK,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEsJ,aAAa;QACtC;QAEA/E,GAAG,wCAAwC;YACzC,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBAAC;4BAAEnH,MAAM;4BAAcN,OAAO;gCAAElB,OAAO;gCAAmB4I,WAAW;4BAAK;wBAAE;qBAAE;gBAC3F;YACF;YACA,MAAMtJ,MAAMD;YACZ,8BAA8B;YAC9B,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;gBAAE,GAAGqC,IAAI9C,KAAK;gBAAER,KAAK;gBAAcU,UAAU;gBAAeE,QAAQ;oBAAEC,MAAM;gBAAQ;YAAE;YACxIrC,iBAAiBsD,cAAc,CAACb,iBAAiB,CAAC;gBAAEgE,SAAS;oBAAEI,UAAU;gBAAW;YAAE,IAAG,6BAA6B;YAEtH,MAAM8D,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;QAC5D;QAEAlF,GAAG,6DAA6D;YAC9D,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBAAC;4BAAEnH,MAAM;4BAAYuH,UAAU;gCAAEH,WAAW;4BAAK;wBAAE;qBAAE;gBAClE;YACF;YACA,MAAMtJ,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAACqC,IAAI9C,KAAK;YAC3DhC,iBAAiBqD,cAAc,CAACsC,iBAAiB,CAAC,IAAIC,MAAM;YAE5D,MAAM+E,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;YAC1DjF,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,4DAA4D;YAC7D,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBAAC;4BAAEnH,MAAM;4BAAYN,OAAO;gCAAElB,OAAO;gCAAoB4I,WAAW;4BAAK;wBAAE;qBAAE;gBAC1F;YACF;YACA,MAAMtJ,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAACqC,IAAI9C,KAAK;YAC3DhC,iBAAiBsD,cAAc,CAACb,iBAAiB,CAAC;gBAAEgE,SAAS;oBAAEI,UAAU;gBAAW;YAAE;YAEtF,MAAM8D,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEsJ,aAAa;QACtC;QAEA/E,GAAG,+EAA+E;YAChF,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBAAC;4BAAEnH,MAAM;wBAAe;qBAAE;gBACvC;YACF;YACA,MAAMlC,MAAMD;YACZ,MAAMoH,UAAU,AAACxH,OAAe,CAAC,gBAAgB;YACjDnB,KAAKmH,KAAK,CAACwB,SAAS,YAAY7E,iBAAiB,CAAC;YAElD,MAAMkI,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEsJ,aAAa;YACpC9E,OAAOzE,IAAIE,IAAI,EAAEqJ,aAAa;QAChC;QAEA/E,GAAG,mEAAmE;;YAClE9F,mBAAY,CAAe4D,iBAAiB,CAAC;YAC/C,MAAMqC,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBiI,WAAW;wBAAC;4BAAE0B,MAAM;gCAAErK,OAAO;gCAAY4I,WAAW;4BAAK;wBAAE;qBAAE;gBAC/D;YACF;YACA,MAAMtJ,MAAMD;YAEZ,MAAMyK,KAAK,MAAM,AAAC7K,QAAgB8K,iBAAiB,CAAC9F,KAAK3E;YAEzDyE,OAAO+F,IAAInF,IAAI,CAAC;YAChBZ,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;QAC5D;IACF;IAEAlK,SAAS,eAAe;QACtB,MAAMwL,kBAAkB;YACtB;gBACEtL,MAAM;gBACN0B,KAAK;oBAAElB,MAAMX;oBAAW8J,WAAW,EAAE;gBAAC;gBACtC4B,WAAW;YACb;YACA;gBACEvL,MAAM;gBACN0B,KAAK;oBAAElB,MAAMX;oBAAW8J,WAAW;wBAAC;4BAAE6B,WAAW;wBAAK;qBAAE;gBAAC;gBACzDD,WAAW;YACb;SACD;QAEDzG,GAAGuD,IAAI,CAACiD,iBAAiB,uBAAuB,OAAO,EAAE5J,GAAG,EAAE6J,SAAS,EAAE;YACvE,MAAMtG,MAAM7D,QAAQ;gBAAEM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAE,GAAGA,GAAG;gBAAC;YAAE;YACxD,MAAMpB,MAAMD;YAEZ,MAAM,AAACJ,QAAgBwL,WAAW,CAACxG,KAAK3E,KAAK2E,IAAI9C,KAAK,CAACI,MAAM,CAACC,IAAI;YAElEuC,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACO,WAAW;YAClDpB,OAAOzE,IAAIE,IAAI,EAAEoH,SAAS,CAAC2D;QAC7B;QAEAzG,GAAG,wDAAwD;YACzD,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAMX;oBAAW8J,WAAW;wBAAC;4BAAEzH,OAAO;gCAAElB,OAAO;gCAAuB4I,WAAW;4BAAK;wBAAE;qBAAE;gBAAC;YACtH;YACA,MAAMtJ,MAAMD;YACZF,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;YACrD9D,KAAKmH,KAAK,CAACyF,WAAe,mBAAmBtM,eAAe,CAAC;YAE7D,MAAM,AAACa,QAAgBwL,WAAW,CAACxG,KAAK3E,KAAK2E,IAAI9C,KAAK,CAACI,MAAM,CAACC,IAAI;YAElEuC,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACoE,mBAAmB;QAC5D;QAEAlF,GAAG,mCAAmC;YACpC,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBAAE,GAAGN,UAAUM,GAAG;oBAAElB,MAAMX;oBAAW8J,WAAW;wBAAC;4BAAEzH,OAAO;gCAAElB,OAAO;gCAAmB4I,WAAW;4BAAK;wBAAE;qBAAE;gBAAC;YAClH;YACA,MAAMtJ,MAAMD;YACZvB,KAAKmH,KAAK,CAACyF,WAAe,mBAAmBtM,eAAe,CAAC;YAC7De,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;gBAAEX,OAAO;oBAAET,IAAI;gBAAE;YAAE;YAExE,MAAM,AAACvB,QAAgBwL,WAAW,CAACxG,KAAK3E,KAAKc,UAAUe,KAAK,CAACI,MAAM,CAACC,IAAI;YAExEuC,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACC,SAAS;YAChDd,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,uCAAuC;YACxC,MAAMG,MAAM7D,QAAQ;gBAClBM,KAAK;oBACH,GAAGN,UAAUM,GAAG;oBAChBlB,MAAMX;oBACNiC,MAAM;wBAAE,GAAGV,UAAUM,GAAG,CAACI,IAAI;wBAAEC,SAAS;oBAAI;oBAC5C4H,WAAW;wBAAC;4BAAEzH,OAAO;gCAAElB,OAAO;gCAAmB4I,WAAW;4BAAK;wBAAE;qBAAE;gBACvE;YACF;YACA,MAAMtJ,MAAMD;YACZvB,KAAKmH,KAAK,CAACyF,WAAe,mBAAmBtM,eAAe,CAAC;YAC7De,iBAAiBgD,iBAAiB,CAACP,iBAAiB,CAAC;gBAAEX,OAAO;oBAAET,IAAI;gBAAE;gBAAGoF,SAAS;oBAAEI,UAAU;gBAAW;YAAE;YAE3G,MAAM,AAAC/G,QAAgBwL,WAAW,CAACxG,KAAK3E,KAAK2E,IAAI9C,KAAK,CAACI,MAAM,CAACC,IAAI;YAElEuC,OAAO5E,iBAAiBuD,kBAAkB,EAAEwC,gBAAgB;YAC5DnB,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACqB,EAAE;YACzClC,OAAOzE,IAAII,WAAW,EAAEkH,SAAS,CAAC;YAClC7C,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QAC/B;IACF;IAEA7F,SAAS,2BAA2B;QAClCgF,GAAG,qDAAqD;YACtD,mCAAmC;YACnC,MAAM,EAAEuF,YAAY,EAAE,GAAGvL,KAAKS,aAAa,CAAC;YAC5CW,aAAa2C,UAAU,CAACiD,iBAAiB,CAAC,IAAIuE,aAAa;gBAAEtD,YAAY;gBAAYH,SAAS;oBAAEI,UAAU;gBAAW;YAAE;YAEvH,MAAM/B,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAM;YACpC,MAAMhB,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQwI,GAAG,CAACxD,KAAK3E;YAEtCyE,OAAOM,QAAQM,IAAI,CAACrF;YACpByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAACC,kBAAU,CAACuB,MAAM;YAC7CpC,OAAO,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QAC/B;QAEAb,GAAG,8CAA8C;YAC/C,MAAM,EAAE6G,SAAS,EAAE,GAAG7M,KAAKS,aAAa,CAAC;YACzCW,aAAa4C,MAAM,CAACgD,iBAAiB,CAAC,IAAI6F,UAAU,KAAK;YAEzD,MAAM1G,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAS;YACvC,MAAMhB,MAAMD;YAEZ,MAAMgF,SAAS,MAAMpF,QAAQ6C,MAAM,CAACmC,KAAK3E;YAEzCyE,OAAOM,QAAQM,IAAI,CAACrF;YACpByE,OAAOzE,IAAIC,UAAU,EAAEoF,IAAI,CAAC;YAC5BZ,OAAOzE,IAAIE,IAAI,EAAEmF,IAAI,CAAC;QACxB;QAEAb,GAAG,kDAAkD;YACnD,MAAMG,MAAM7D,QAAQ;gBAAEE,QAAQ;YAAM;YACpC,MAAMhB,MAAMD;YACZH,aAAa2C,UAAU,CAACiD,iBAAiB,CAAC,IAAIC,MAAM;YAEpD,IAAI;gBACF,MAAM9F,QAAQwI,GAAG,CAACxD,KAAK3E;gBACvB,8CAA8C;gBAC9CyE,OAAO,MAAMY,IAAI,CAAC;YACpB,EAAE,OAAO6E,GAAQ;gBACfzF,OAAOyF,GAAGC,cAAc,CAACC,qBAAa;gBACtC3F,OAAOyF,EAAEG,SAAS,IAAIhF,IAAI,CAACC,kBAAU,CAACgF,qBAAqB;YAC7D;QACF;IACF;AACF"}
@@ -25,6 +25,8 @@ _export(exports, {
25
25
  });
26
26
  var LDAP_LOGIN_ATTR = /*#__PURE__*/ function(LDAP_LOGIN_ATTR) {
27
27
  LDAP_LOGIN_ATTR["UID"] = "uid";
28
+ LDAP_LOGIN_ATTR["CN"] = "cn";
29
+ LDAP_LOGIN_ATTR["MAIL"] = "mail";
28
30
  LDAP_LOGIN_ATTR["SAM"] = "sAMAccountName";
29
31
  LDAP_LOGIN_ATTR["UPN"] = "userPrincipalName";
30
32
  return LDAP_LOGIN_ATTR;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/constants/auth-ldap.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\nexport enum LDAP_LOGIN_ATTR {\n UID = 'uid',\n SAM = 'sAMAccountName',\n UPN = 'userPrincipalName'\n}\n\nexport const LDAP_COMMON_ATTR = {\n MAIL: 'mail',\n GIVEN_NAME: 'givenName',\n SN: 'sn',\n CN: 'cn',\n DISPLAY_NAME: 'displayName',\n MEMBER_OF: 'memberOf'\n} as const\n\nexport const ALL_LDAP_ATTRIBUTES = [...Object.values(LDAP_LOGIN_ATTR), ...Object.values(LDAP_COMMON_ATTR)]\n"],"names":["ALL_LDAP_ATTRIBUTES","LDAP_COMMON_ATTR","LDAP_LOGIN_ATTR","MAIL","GIVEN_NAME","SN","CN","DISPLAY_NAME","MEMBER_OF","Object","values"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAiBYA;eAAAA;;QATAC;eAAAA;;QANDC;eAAAA;;;AAAL,IAAA,AAAKA,yCAAAA;;;;WAAAA;;AAML,MAAMD,mBAAmB;IAC9BE,MAAM;IACNC,YAAY;IACZC,IAAI;IACJC,IAAI;IACJC,cAAc;IACdC,WAAW;AACb;AAEO,MAAMR,sBAAsB;OAAIS,OAAOC,MAAM,CAACR;OAAqBO,OAAOC,MAAM,CAACT;CAAkB"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/constants/auth-ldap.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\nexport enum LDAP_LOGIN_ATTR {\n UID = 'uid',\n CN = 'cn',\n MAIL = 'mail',\n SAM = 'sAMAccountName',\n UPN = 'userPrincipalName'\n}\n\nexport const LDAP_COMMON_ATTR = {\n MAIL: 'mail',\n GIVEN_NAME: 'givenName',\n SN: 'sn',\n CN: 'cn',\n DISPLAY_NAME: 'displayName',\n MEMBER_OF: 'memberOf'\n} as const\n\nexport const ALL_LDAP_ATTRIBUTES = [...Object.values(LDAP_LOGIN_ATTR), ...Object.values(LDAP_COMMON_ATTR)]\n"],"names":["ALL_LDAP_ATTRIBUTES","LDAP_COMMON_ATTR","LDAP_LOGIN_ATTR","MAIL","GIVEN_NAME","SN","CN","DISPLAY_NAME","MEMBER_OF","Object","values"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAmBYA;eAAAA;;QATAC;eAAAA;;QARDC;eAAAA;;;AAAL,IAAA,AAAKA,yCAAAA;;;;;;WAAAA;;AAQL,MAAMD,mBAAmB;IAC9BE,MAAM;IACNC,YAAY;IACZC,IAAI;IACJC,IAAI;IACJC,cAAc;IACdC,WAAW;AACb;AAEO,MAAMR,sBAAsB;OAAIS,OAAOC,MAAM,CAACR;OAAqBO,OAAOC,MAAM,CAACT;CAAkB"}
@@ -32,10 +32,11 @@ function _ts_metadata(k, v) {
32
32
  }
33
33
  let AuthMethodLdapService = class AuthMethodLdapService {
34
34
  async validateUser(login, password, ip, scope) {
35
+ // Find user from his login or email
35
36
  let user = await this.usersManager.findUser(this.dbLogin(login), false);
36
37
  if (user) {
37
38
  if (user.isGuest) {
38
- // allow guests to be authenticated from db and check if the current user is defined as active
39
+ // Allow guests to be authenticated from db and check if the current user is defined as active
39
40
  return this.usersManager.logUser(user, password, ip);
40
41
  }
41
42
  if (!user.isActive) {
@@ -43,18 +44,19 @@ let AuthMethodLdapService = class AuthMethodLdapService {
43
44
  throw new _common.HttpException('Account locked', _common.HttpStatus.FORBIDDEN);
44
45
  }
45
46
  }
46
- const entry = await this.checkAuth(login, password);
47
+ // If a user was found, use the stored login. This allows logging in with an email.
48
+ const entry = await this.checkAuth(user?.login || login, password);
47
49
  if (entry === false) {
48
50
  // LDAP auth failed
49
51
  if (user) {
50
52
  let authSuccess = false;
51
53
  if (scope) {
52
- // try user app password
54
+ // Try user app password
53
55
  authSuccess = await this.usersManager.validateAppPassword(user, password, ip, scope);
54
56
  }
55
57
  this.usersManager.updateAccesses(user, ip, authSuccess).catch((e)=>this.logger.error(`${this.validateUser.name} : ${e}`));
56
58
  if (authSuccess) {
57
- // logged with app password
59
+ // Logged with app password
58
60
  return user;
59
61
  }
60
62
  }
@@ -72,10 +74,9 @@ let AuthMethodLdapService = class AuthMethodLdapService {
72
74
  }
73
75
  async checkAuth(login, password) {
74
76
  const ldapLogin = this.buildLdapLogin(login);
75
- const isAD = this.ldapConfig.attributes.login === _authldap.LDAP_LOGIN_ATTR.SAM || this.ldapConfig.attributes.login === _authldap.LDAP_LOGIN_ATTR.UPN;
76
77
  // AD: bind directly with the user input (UPN or DOMAIN\user)
77
78
  // Generic LDAP: build DN from login attribute + baseDN
78
- const bindUserDN = isAD ? ldapLogin : `${this.ldapConfig.attributes.login}=${ldapLogin},${this.ldapConfig.baseDN}`;
79
+ const bindUserDN = this.isAD ? ldapLogin : `${this.ldapConfig.attributes.login}=${ldapLogin},${this.ldapConfig.baseDN}`;
79
80
  let client;
80
81
  let error;
81
82
  for (const s of this.ldapConfig.servers){
@@ -134,7 +135,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
134
135
  }
135
136
  async updateOrCreateUser(identity, user) {
136
137
  if (user === null) {
137
- // create
138
+ // Create
138
139
  const createdUser = await this.adminUsersManager.createUserOrGuest(identity, identity.role);
139
140
  const freshUser = await this.usersManager.fromUserId(createdUser.id);
140
141
  if (!freshUser) {
@@ -147,7 +148,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
147
148
  this.logger.error(`${this.updateOrCreateUser.name} - user login mismatch : ${identity.login} !== ${user.login}`);
148
149
  throw new _common.HttpException('Account matching error', _common.HttpStatus.FORBIDDEN);
149
150
  }
150
- // update: check if user information has changed
151
+ // Update: check if user information has changed
151
152
  const identityHasChanged = Object.fromEntries((await Promise.all(Object.keys(identity).map(async (key)=>{
152
153
  if (key === 'password') {
153
154
  const isSame = await (0, _functions.comparePassword)(identity[key], user.password);
@@ -165,7 +166,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
165
166
  try {
166
167
  if (identityHasChanged?.role != null) {
167
168
  if (user.role === _user.USER_ROLE.ADMINISTRATOR && !this.ldapConfig.adminGroup) {
168
- // Prevent removing admin role when adminGroup was removed or not defined
169
+ // Prevent removing the admin role when adminGroup was removed or not defined
169
170
  delete identityHasChanged.role;
170
171
  }
171
172
  }
@@ -177,7 +178,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
177
178
  }
178
179
  Object.assign(user, identityHasChanged);
179
180
  if ('lastName' in identityHasChanged || 'firstName' in identityHasChanged) {
180
- // force fullName update in current user model
181
+ // Force fullName update in the current user model
181
182
  user.setFullName(true);
182
183
  }
183
184
  } catch (e) {
@@ -234,9 +235,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
234
235
  };
235
236
  }
236
237
  dbLogin(login) {
237
- if (login.includes('@')) {
238
- return login.split('@')[0];
239
- } else if (login.includes('\\')) {
238
+ if (login.includes('\\')) {
240
239
  return login.split('\\').slice(-1)[0];
241
240
  }
242
241
  return login;
@@ -257,23 +256,36 @@ let AuthMethodLdapService = class AuthMethodLdapService {
257
256
  // Build a safe LDAP filter to search for a user.
258
257
  // Important: - Values passed to EqualityFilter are auto-escaped by ldapts
259
258
  // - extraFilter is appended as-is (assumed trusted configuration)
260
- // Output: (&(|(userPrincipalName=john.doe@sync-in.com)(sAMAccountName=john.doe)(uid=john.doe))(*extraFilter*))
259
+ // Output: (&(|(userPrincipalName=john.doe@sync-in.com)(sAMAccountName=john.doe)(cn=john.doe)(uid=john.doe)(mail=john.doe@sync-in.com))(*extraFilter*))
261
260
  // Handle the case where the sAMAccountName is provided in domain-qualified format (e.g., SYNC_IN\\user)
262
261
  // Note: sAMAccountName is always stored without the domain in Active Directory.
263
- const uid = this.dbLogin(login);
262
+ const dbLogin = this.dbLogin(login);
264
263
  const or = new _ldapts.OrFilter({
265
- filters: [
264
+ filters: this.isAD ? [
266
265
  new _ldapts.EqualityFilter({
267
- attribute: _authldap.LDAP_LOGIN_ATTR.UPN,
268
- value: login
266
+ attribute: _authldap.LDAP_LOGIN_ATTR.SAM,
267
+ value: dbLogin
269
268
  }),
270
269
  new _ldapts.EqualityFilter({
271
- attribute: _authldap.LDAP_LOGIN_ATTR.SAM,
272
- value: uid
270
+ attribute: _authldap.LDAP_LOGIN_ATTR.UPN,
271
+ value: dbLogin
273
272
  }),
273
+ new _ldapts.EqualityFilter({
274
+ attribute: _authldap.LDAP_LOGIN_ATTR.MAIL,
275
+ value: dbLogin
276
+ })
277
+ ] : [
274
278
  new _ldapts.EqualityFilter({
275
279
  attribute: _authldap.LDAP_LOGIN_ATTR.UID,
276
- value: uid
280
+ value: dbLogin
281
+ }),
282
+ new _ldapts.EqualityFilter({
283
+ attribute: _authldap.LDAP_LOGIN_ATTR.CN,
284
+ value: dbLogin
285
+ }),
286
+ new _ldapts.EqualityFilter({
287
+ attribute: _authldap.LDAP_LOGIN_ATTR.MAIL,
288
+ value: dbLogin
277
289
  })
278
290
  ]
279
291
  });
@@ -294,6 +306,7 @@ let AuthMethodLdapService = class AuthMethodLdapService {
294
306
  this.adminUsersManager = adminUsersManager;
295
307
  this.logger = new _common.Logger(AuthMethodLdapService.name);
296
308
  this.ldapConfig = _configenvironment.configuration.auth.ldap;
309
+ this.isAD = this.ldapConfig.attributes.login === _authldap.LDAP_LOGIN_ATTR.SAM || this.ldapConfig.attributes.login === _authldap.LDAP_LOGIN_ATTR.UPN;
297
310
  this.clientOptions = {
298
311
  timeout: 6000,
299
312
  connectTimeout: 6000,