@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/users/services/users-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { MultipartFile } from '@fastify/multipart'\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport bcrypt from 'bcryptjs'\nimport { WriteStream } from 'fs'\nimport { createWriteStream } from 'node:fs'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport { AUTH_SCOPE } from '../../../authentication/constants/scope'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { FastifyAuthenticatedRequest } from '../../../authentication/interfaces/auth-request.interface'\nimport { JwtIdentityPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { ACTION } from '../../../common/constants'\nimport { comparePassword, hashPassword } from '../../../common/functions'\nimport { generateAvatar, pngMimeType, svgMimeType } from '../../../common/image'\nimport { createLightSlug, genPassword } from '../../../common/shared'\nimport { configuration, serverConfig } from '../../../configuration/config.environment'\nimport { isPathExists, moveFiles } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_MAX_PASSWORD_ATTEMPTS, USER_ONLINE_STATUS, USER_ROLE } from '../constants/user'\nimport type { UserCreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type {\n UserAppPasswordDto,\n UserLanguageDto,\n UserNotificationDto,\n UserStorageIndexingDto,\n UserUpdatePasswordDto\n} from '../dto/user-properties.dto'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GroupMember, GroupWithMembers } from '../interfaces/group-member'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport type { UserAppPassword, UserSecrets } from '../interfaces/user-secrets.interface'\nimport type { UserOnline } from '../interfaces/websocket.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { UserGroup } from '../schemas/user-group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { USER_AVATAR_FILE_NAME, USER_AVATAR_MAX_UPLOAD_SIZE, USER_DEFAULT_AVATAR_FILE_PATH } from '../utils/avatar'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { UsersQueries } from './users-queries.service'\n\n@Injectable()\nexport class UsersManager {\n private readonly logger = new Logger(UsersManager.name)\n\n constructor(\n public readonly usersQueries: UsersQueries,\n private readonly adminUsersManager: AdminUsersManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async fromUserId(id: number): Promise<UserModel> {\n const user: User = await this.usersQueries.from(id)\n return user ? new UserModel(user, true) : null\n }\n\n async findUser(loginOrEmail: string, removePassword: false): Promise<UserModel>\n async findUser(loginOrEmail: string, removePassword?: true): Promise<Omit<UserModel, 'password'>>\n async findUser(loginOrEmail: string, removePassword: boolean = true): Promise<Omit<UserModel, 'password'>> {\n const user: User = await this.usersQueries.from(null, loginOrEmail)\n return user ? new UserModel(user, removePassword) : null\n }\n\n async logUser(user: UserModel, password: string, ip: string, scope?: AUTH_SCOPE): Promise<UserModel> {\n this.validateUserAccess(user, ip)\n let authSuccess: boolean = await comparePassword(password, user.password)\n if (!authSuccess && scope) {\n authSuccess = await this.validateAppPassword(user, password, ip, scope)\n }\n this.updateAccesses(user, ip, authSuccess).catch((e: Error) => this.logger.error(`${this.logUser.name} - ${e}`))\n if (authSuccess) {\n await user.makePaths()\n return user\n }\n this.logger.warn(`${this.logUser.name} - bad password for *${user.login}*`)\n return null\n }\n\n validateUserAccess(user: UserModel, ip: string) {\n if (user.role === USER_ROLE.LINK) {\n this.logger.error(`${this.validateUserAccess.name} - guest link account ${user} is not authorized to login`)\n throw new HttpException('Account is not allowed', HttpStatus.FORBIDDEN)\n }\n if (!user.isActive || user.passwordAttempts >= USER_MAX_PASSWORD_ATTEMPTS) {\n this.updateAccesses(user, ip, false).catch((e: Error) => this.logger.error(`${this.validateUserAccess.name} - ${e}`))\n this.logger.error(`${this.validateUserAccess.name} - user account *${user.login}* is locked`)\n this.notifyAccountLocked(user, ip)\n throw new HttpException('Account locked', HttpStatus.FORBIDDEN)\n }\n }\n\n async me(authUser: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n const user = await this.fromUserId(authUser.id)\n if (!user) {\n this.logger.warn(`User *${authUser.login} (${authUser.id}) not found`)\n throw new HttpException(`User not found`, HttpStatus.NOT_FOUND)\n }\n user.impersonated = !!authUser.impersonatedFromId\n user.clientId = authUser.clientId\n return { user: user, server: serverConfig }\n }\n\n async compareUserPassword(userId: number, password: string): Promise<boolean> {\n return this.usersQueries.compareUserPassword(userId, password)\n }\n\n async updateLanguage(user: UserModel, userLanguageDto: UserLanguageDto) {\n if (!userLanguageDto.language) userLanguageDto.language = null\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userLanguageDto))) {\n throw new HttpException('Unable to update language', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updatePassword(user: UserModel, userPasswordDto: UserUpdatePasswordDto) {\n const r = await this.usersQueries.selectUserProperties(user.id, ['password'])\n if (!r) {\n throw new HttpException('Unable to check password', HttpStatus.NOT_FOUND)\n }\n if (!(await comparePassword(userPasswordDto.oldPassword, r.password))) {\n throw new HttpException('Password mismatch', HttpStatus.BAD_REQUEST)\n }\n const hash = await bcrypt.hash(userPasswordDto.newPassword, 10)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { password: hash }))) {\n throw new HttpException('Unable to update password', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateNotification(user: UserModel, userNotificationDto: UserNotificationDto) {\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userNotificationDto))) {\n throw new HttpException('Unable to update notification preference', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateStorageIndexing(user: UserModel, userStorageIndexingDto: UserStorageIndexingDto) {\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userStorageIndexingDto))) {\n throw new HttpException('Unable to update full-text search preference', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateAvatar(req: FastifyAuthenticatedRequest) {\n const part: MultipartFile = await req.file({ limits: { fileSize: USER_AVATAR_MAX_UPLOAD_SIZE } })\n if (!part.mimetype.startsWith('image/')) {\n throw new HttpException('Unsupported file type', HttpStatus.BAD_REQUEST)\n }\n const dstPath = path.join(req.user.tmpPath, USER_AVATAR_FILE_NAME)\n try {\n await pipeline(part.file, createWriteStream(dstPath))\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to upload avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n if (part.file.truncated) {\n this.logger.warn(`${this.updateAvatar.name} - image is too large`)\n throw new HttpException('Image is too large (5MB max)', HttpStatus.PAYLOAD_TOO_LARGE)\n }\n try {\n await moveFiles(dstPath, path.join(req.user.homePath, USER_AVATAR_FILE_NAME), true)\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to create avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateSecrets(userId: number, secrets: UserSecrets) {\n const userSecrets = await this.usersQueries.getUserSecrets(userId)\n const updatedSecrets = { ...userSecrets, ...secrets }\n if (!(await this.usersQueries.updateUserOrGuest(userId, { secrets: updatedSecrets }))) {\n throw new HttpException('Unable to update secrets', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateAccesses(user: UserModel, ip: string, success: boolean, isAuthTwoFa = false) {\n let passwordAttempts: number\n if (!isAuthTwoFa && configuration.auth.mfa.totp.enabled && user.twoFaEnabled) {\n // Do not reset password attempts if the login still requires 2FA validation\n passwordAttempts = user.passwordAttempts\n } else {\n passwordAttempts = success ? 0 : Math.min(user.passwordAttempts + 1, USER_MAX_PASSWORD_ATTEMPTS)\n }\n await this.usersQueries.updateUserOrGuest(user.id, {\n lastAccess: user.currentAccess,\n currentAccess: new Date(),\n lastIp: user.currentIp,\n currentIp: ip,\n passwordAttempts: passwordAttempts,\n isActive: user.isActive && passwordAttempts < USER_MAX_PASSWORD_ATTEMPTS\n })\n }\n\n async getAvatar(userLogin: string, generate: true, generateIsNotExists?: boolean): Promise<undefined>\n async getAvatar(userLogin: string, generate?: false, generateIsNotExists?: boolean): Promise<[path: string, mime: string]>\n async getAvatar(userLogin: string, generate: boolean = false, generateIsNotExists?: boolean): Promise<[path: string, mime: string]> {\n const avatarPath = path.join(UserModel.getHomePath(userLogin), USER_AVATAR_FILE_NAME)\n const avatarExists = await isPathExists(avatarPath)\n if (!avatarExists && generateIsNotExists) {\n generate = true\n }\n if (!generate) {\n return [avatarExists ? avatarPath : USER_DEFAULT_AVATAR_FILE_PATH, avatarExists ? pngMimeType : svgMimeType]\n }\n if (!(await isPathExists(UserModel.getHomePath(userLogin)))) {\n throw new HttpException(`Home path for user *${userLogin}* does not exist`, HttpStatus.FORBIDDEN)\n }\n const user: Partial<UserModel> = await this.findUser(userLogin)\n if (!user) {\n throw new HttpException(`avatar not found`, HttpStatus.NOT_FOUND)\n }\n const avatarFile: WriteStream = createWriteStream(avatarPath)\n const avatarStream = Readable.from(await generateAvatar(user.getInitials()))\n try {\n await pipeline(avatarStream, avatarFile)\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to create avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n if (generateIsNotExists) {\n return [avatarPath, pngMimeType]\n }\n }\n\n async listAppPasswords(user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (Array.isArray(secrets.appPasswords)) {\n // remove passwords from response\n return secrets.appPasswords.map(({ password, ...rest }: UserAppPassword) => rest)\n }\n return []\n }\n\n async generateAppPassword(user: UserModel, userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n const slugName = createLightSlug(userAppPasswordDto.name)\n if (Array.isArray(secrets.appPasswords) && secrets.appPasswords.find((p: UserAppPassword) => p.name === slugName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n secrets.appPasswords = Array.isArray(secrets.appPasswords) ? secrets.appPasswords : []\n const clearPassword = genPassword(24)\n const appPassword: UserAppPassword = {\n name: createLightSlug(userAppPasswordDto.name),\n app: userAppPasswordDto.app,\n expiration: userAppPasswordDto.expiration,\n password: await hashPassword(clearPassword),\n createdAt: new Date(),\n currentIp: null,\n currentAccess: null,\n lastIp: null,\n lastAccess: null\n }\n secrets.appPasswords.unshift(appPassword)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { secrets: secrets }))) {\n throw new HttpException('Unable to update app passwords', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n // return clear password only once\n return { ...appPassword, password: clearPassword }\n }\n\n async deleteAppPassword(user: UserModel, passwordName: string): Promise<void> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (!Array.isArray(secrets.appPasswords) || !secrets.appPasswords.find((p: UserAppPassword) => p.name === passwordName)) {\n throw new HttpException('App password not found', HttpStatus.NOT_FOUND)\n }\n secrets.appPasswords = secrets.appPasswords.filter((p: UserAppPassword) => p.name !== passwordName)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { secrets: secrets }))) {\n throw new HttpException('Unable to delete app password', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async validateAppPassword(user: UserModel, password: string, ip: string, scope: AUTH_SCOPE): Promise<boolean> {\n if (!scope || !user.haveRole(USER_ROLE.USER)) return false\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (!Array.isArray(secrets.appPasswords)) return false\n for (const p of secrets.appPasswords) {\n if (p.app !== scope) continue\n const expMs = p.expiration ? new Date(p.expiration) : null\n if (p.expiration && new Date() > expMs) continue // expired\n if (await comparePassword(password, p.password)) {\n p.lastAccess = p.currentAccess\n p.currentAccess = new Date()\n p.lastIp = p.currentIp\n p.currentIp = ip\n // update accesses\n this.usersQueries\n .updateUserOrGuest(user.id, { secrets: secrets })\n .catch((e: Error) => this.logger.error(`${this.validateAppPassword.name} - ${e}`))\n return true\n }\n }\n return false\n }\n\n setOnlineStatus(user: JwtIdentityPayload, onlineStatus: USER_ONLINE_STATUS) {\n this.usersQueries.setOnlineStatus(user.id, onlineStatus).catch((e: Error) => this.logger.error(`${this.setOnlineStatus.name} - ${e}`))\n }\n\n getOnlineUsers(userIds: number[]): Promise<UserOnline[]> {\n return this.usersQueries.getOnlineUsers(userIds)\n }\n\n async usersWhitelist(userId: number): Promise<number[]> {\n return this.usersQueries.usersWhitelist(userId)\n }\n\n async browseGroups(user: UserModel, name: string): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] } = await this.usersQueries.groupFromName(user.id, name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.usersQueries.browseGroupMembers(group.id) }\n }\n return { parentGroup: undefined, members: await this.usersQueries.browseRootGroups(user.id) }\n }\n\n async getGroup(user: UserModel, groupId: number, withMembers?: true, asAdmin?: boolean): Promise<GroupWithMembers>\n async getGroup(user: UserModel, groupId: number, withMembers: false, asAdmin?: boolean): Promise<GroupMember>\n async getGroup(user: UserModel, groupId: number, withMembers = true, asAdmin = false): Promise<GroupMember | GroupWithMembers> {\n const group = withMembers\n ? await this.usersQueries.getGroupWithMembers(user.id, groupId, asAdmin)\n : await this.usersQueries.getGroup(user.id, groupId, asAdmin)\n if (!group) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n return group\n }\n\n async createPersonalGroup(user: UserModel, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n if (!userCreateOrUpdateGroupDto.name) {\n this.logger.error(`${this.createPersonalGroup.name} - missing group name : ${JSON.stringify(userCreateOrUpdateGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n if (await this.usersQueries.checkGroupNameExists(userCreateOrUpdateGroupDto.name)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n try {\n const groupId: number = await this.usersQueries.createPersonalGroup(user.id, userCreateOrUpdateGroupDto)\n this.logger.log(`${this.createPersonalGroup.name} - group (${groupId}) was created : ${JSON.stringify(userCreateOrUpdateGroupDto)}`)\n // clear user whitelists\n this.usersQueries.clearWhiteListCaches([user.id])\n return this.getGroup(user, groupId, false)\n } catch (e) {\n this.logger.error(`${this.createPersonalGroup.name} - group was not created : ${JSON.stringify(userCreateOrUpdateGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updatePersonalGroup(user: UserModel, groupId: number, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n if (!Object.keys(userCreateOrUpdateGroupDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n const currentGroup: GroupMember = await this.getGroup(user, groupId, false, user.isAdmin)\n if (currentGroup.type !== MEMBER_TYPE.PGROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (userCreateOrUpdateGroupDto.name && (await this.usersQueries.checkGroupNameExists(userCreateOrUpdateGroupDto.name))) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n try {\n await this.usersQueries.updateGroup(groupId, userCreateOrUpdateGroupDto)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return this.getGroup(user, groupId, false, user.isAdmin)\n }\n\n async addUsersToGroup(user: UserModel, groupId: number, userIds: number[]): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n // only users can be added to users groups\n // guests and users can be added to personal groups\n const userWhiteList: number[] = await this.usersQueries.usersWhitelist(\n user.id,\n currentGroup.type === MEMBER_TYPE.GROUP ? USER_ROLE.USER : undefined\n )\n // ignore user ids that are already group members & filter on user ids allowed to current user\n userIds = userIds.filter((id) => !currentGroup.members.find((m) => m.id === id)).filter((id) => userWhiteList.indexOf(id) > -1)\n if (!userIds.length) {\n throw new HttpException('No users to add to group', HttpStatus.BAD_REQUEST)\n }\n return this.usersQueries.updateGroupMembers(groupId, { add: userIds.map((id) => ({ id: id, groupRole: USER_GROUP_ROLE.MEMBER })) })\n }\n\n async updateUserFromPersonalGroup(user: UserModel, groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n if (currentGroup.type !== MEMBER_TYPE.PGROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const userToUpdate = currentGroup.members.find((m) => m.id === userId)\n if (!userToUpdate) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userToUpdate.groupRole !== updateUserFromGroupDto.role) {\n if (userToUpdate.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n return this.adminUsersManager.updateUserFromGroup(groupId, userId, updateUserFromGroupDto)\n }\n }\n\n async removeUserFromGroup(user: UserModel, groupId: number, userId: number): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n const userToRemove = currentGroup.members.find((m) => m.id === userId)\n if (!userToRemove) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userToRemove.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.type === MEMBER_TYPE.GROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n return this.usersQueries.updateGroupMembers(groupId, { remove: [userId] })\n }\n\n async leavePersonalGroup(user: UserModel, groupId: number): Promise<void> {\n const currentGroup: GroupWithMembers = await this.usersQueries.getGroupWithMembers(user.id, groupId, true)\n if (!currentGroup || currentGroup.type === MEMBER_TYPE.GROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const userWhoLeaves = currentGroup.members.find((m) => m.id === user.id)\n if (!userWhoLeaves) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userWhoLeaves.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n try {\n await this.usersQueries.updateGroupMembers(groupId, { remove: [user.id] })\n this.logger.log(`${this.leavePersonalGroup.name} - user (${user.id}) has left group (${groupId})`)\n } catch (e) {\n this.logger.error(`${this.leavePersonalGroup.name} - user (${user.id}) has not left group (${groupId}) : ${e}`)\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deletePersonalGroup(user: UserModel, groupId: number): Promise<void> {\n if (!(await this.usersQueries.canDeletePersonalGroup(user.id, groupId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (await this.usersQueries.deletePersonalGroup(groupId)) {\n this.logger.log(`${this.deletePersonalGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deletePersonalGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n listGuests(user: UserModel): Promise<GuestUser[]> {\n return this.usersQueries.listGuests(null, user.id)\n }\n\n async getGuest(user: UserModel, guestId: number): Promise<GuestUser> {\n const guest: GuestUser = await this.usersQueries.listGuests(guestId, user.id)\n this.adminUsersManager.checkUser(guest, true)\n return guest\n }\n\n async createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n // filter managers that are allowed for current user\n const userWhiteList = await this.usersQueries.usersWhitelist(user.id, USER_ROLE.USER)\n createGuestDto.managers = createGuestDto.managers.filter((id) => userWhiteList.indexOf(id) > -1)\n if (createGuestDto.managers.indexOf(user.id) === -1) {\n // force user as manager during creation\n createGuestDto.managers.push(user.id)\n }\n // clear user whitelists\n this.usersQueries.clearWhiteListCaches([user.id])\n return this.adminUsersManager.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n async updateGuest(user: UserModel, guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers) {\n // filter managers that are allowed for current user\n const userWhiteList = await this.usersQueries.usersWhitelist(user.id, USER_ROLE.USER)\n updateGuestDto.managers = updateGuestDto.managers.filter((id) => userWhiteList.indexOf(id) > -1)\n if (!updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n if (!(await this.usersQueries.isGuestManager(user.id, guestId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const guest = await this.adminUsersManager.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n return guest.managers.find((m) => m.id === user.id) ? guest : null\n }\n\n async deleteGuest(user: UserModel, guestId: number): Promise<void> {\n const guest = await this.usersQueries.isGuestManager(user.id, guestId)\n if (!guest) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // guest has no space but a temporary directory\n return this.adminUsersManager.deleteUserOrGuest(guest.id, guest.login, { deleteSpace: true, isGuest: true })\n }\n\n searchMembers(user: UserModel, searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersQueries.searchUsersOrGroups(searchMembersDto, user.id)\n }\n\n private notifyAccountLocked(user: UserModel, ip: string) {\n this.notificationsManager\n .sendEmailNotification([user], {\n app: NOTIFICATION_APP.AUTH_LOCKED,\n event: NOTIFICATION_APP_EVENT.AUTH_LOCKED[ACTION.DELETE],\n element: null,\n url: ip\n })\n .catch((e: Error) => this.logger.error(`${this.validateUserAccess.name} - ${e}`))\n }\n}\n"],"names":["UsersManager","fromUserId","id","user","usersQueries","from","UserModel","findUser","loginOrEmail","removePassword","logUser","password","ip","scope","validateUserAccess","authSuccess","comparePassword","validateAppPassword","updateAccesses","catch","e","logger","error","name","makePaths","warn","login","role","USER_ROLE","LINK","HttpException","HttpStatus","FORBIDDEN","isActive","passwordAttempts","USER_MAX_PASSWORD_ATTEMPTS","notifyAccountLocked","me","authUser","NOT_FOUND","impersonated","impersonatedFromId","clientId","server","serverConfig","compareUserPassword","userId","updateLanguage","userLanguageDto","language","updateUserOrGuest","INTERNAL_SERVER_ERROR","updatePassword","userPasswordDto","r","selectUserProperties","oldPassword","BAD_REQUEST","hash","bcrypt","newPassword","updateNotification","userNotificationDto","updateStorageIndexing","userStorageIndexingDto","updateAvatar","req","part","file","limits","fileSize","USER_AVATAR_MAX_UPLOAD_SIZE","mimetype","startsWith","dstPath","path","join","tmpPath","USER_AVATAR_FILE_NAME","pipeline","createWriteStream","truncated","PAYLOAD_TOO_LARGE","moveFiles","homePath","updateSecrets","secrets","userSecrets","getUserSecrets","updatedSecrets","success","isAuthTwoFa","configuration","auth","mfa","totp","enabled","twoFaEnabled","Math","min","lastAccess","currentAccess","Date","lastIp","currentIp","getAvatar","userLogin","generate","generateIsNotExists","avatarPath","getHomePath","avatarExists","isPathExists","USER_DEFAULT_AVATAR_FILE_PATH","pngMimeType","svgMimeType","avatarFile","avatarStream","Readable","generateAvatar","getInitials","listAppPasswords","Array","isArray","appPasswords","map","rest","generateAppPassword","userAppPasswordDto","slugName","createLightSlug","find","p","clearPassword","genPassword","appPassword","app","expiration","hashPassword","createdAt","unshift","deleteAppPassword","passwordName","filter","haveRole","USER","expMs","setOnlineStatus","onlineStatus","getOnlineUsers","userIds","usersWhitelist","browseGroups","group","groupFromName","parentGroup","members","browseGroupMembers","undefined","browseRootGroups","getGroup","groupId","withMembers","asAdmin","getGroupWithMembers","createPersonalGroup","userCreateOrUpdateGroupDto","JSON","stringify","checkGroupNameExists","log","clearWhiteListCaches","updatePersonalGroup","Object","keys","length","currentGroup","isAdmin","type","MEMBER_TYPE","PGROUP","updateGroup","message","addUsersToGroup","userWhiteList","GROUP","m","indexOf","updateGroupMembers","add","groupRole","USER_GROUP_ROLE","MEMBER","updateUserFromPersonalGroup","updateUserFromGroupDto","userToUpdate","MANAGER","adminUsersManager","updateUserFromGroup","removeUserFromGroup","userToRemove","remove","leavePersonalGroup","userWhoLeaves","deletePersonalGroup","canDeletePersonalGroup","listGuests","getGuest","guestId","guest","checkUser","createGuest","createGuestDto","managers","push","createUserOrGuest","GUEST","updateGuest","updateGuestDto","isGuestManager","deleteGuest","deleteUserOrGuest","deleteSpace","isGuest","searchMembers","searchMembersDto","searchUsersOrGroups","notificationsManager","sendEmailNotification","NOTIFICATION_APP","AUTH_LOCKED","event","NOTIFICATION_APP_EVENT","ACTION","DELETE","element","url","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/users/services/users-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { MultipartFile } from '@fastify/multipart'\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport bcrypt from 'bcryptjs'\nimport { WriteStream } from 'fs'\nimport { createWriteStream } from 'node:fs'\nimport path from 'node:path'\nimport { pipeline } from 'node:stream/promises'\nimport { AUTH_SCOPE } from '../../../authentication/constants/scope'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { FastifyAuthenticatedRequest } from '../../../authentication/interfaces/auth-request.interface'\nimport { JwtIdentityPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { ACTION } from '../../../common/constants'\nimport { comparePassword, hashPassword } from '../../../common/functions'\nimport { generateAvatar, pngMimeType, svgMimeType } from '../../../common/image'\nimport { createLightSlug, genPassword } from '../../../common/shared'\nimport { configuration, serverConfig } from '../../../configuration/config.environment'\nimport { isPathExists, moveFiles } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { MEMBER_TYPE } from '../constants/member'\nimport { USER_GROUP_ROLE, USER_MAX_PASSWORD_ATTEMPTS, USER_ONLINE_STATUS, USER_ROLE } from '../constants/user'\nimport type { UserCreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type {\n UserAppPasswordDto,\n UserLanguageDto,\n UserNotificationDto,\n UserStorageIndexingDto,\n UserUpdatePasswordDto\n} from '../dto/user-properties.dto'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GroupMember, GroupWithMembers } from '../interfaces/group-member'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport type { UserAppPassword, UserSecrets } from '../interfaces/user-secrets.interface'\nimport type { UserOnline } from '../interfaces/websocket.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { UserGroup } from '../schemas/user-group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { USER_AVATAR_FILE_NAME, USER_AVATAR_MAX_UPLOAD_SIZE, USER_DEFAULT_AVATAR_FILE_PATH } from '../utils/avatar'\nimport { AdminUsersManager } from './admin-users-manager.service'\nimport { UsersQueries } from './users-queries.service'\n\n@Injectable()\nexport class UsersManager {\n private readonly logger = new Logger(UsersManager.name)\n\n constructor(\n public readonly usersQueries: UsersQueries,\n private readonly adminUsersManager: AdminUsersManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async fromUserId(id: number): Promise<UserModel> {\n const user: User = await this.usersQueries.from(id)\n return user ? new UserModel(user, true) : null\n }\n\n async findUser(loginOrEmail: string, removePassword: false): Promise<UserModel>\n async findUser(loginOrEmail: string, removePassword?: true): Promise<Omit<UserModel, 'password'>>\n async findUser(loginOrEmail: string, removePassword: boolean = true): Promise<Omit<UserModel, 'password'>> {\n const user: User = await this.usersQueries.from(null, loginOrEmail)\n return user ? new UserModel(user, removePassword) : null\n }\n\n async logUser(user: UserModel, password: string, ip: string, scope?: AUTH_SCOPE): Promise<UserModel> {\n this.validateUserAccess(user, ip)\n let authSuccess: boolean = await comparePassword(password, user.password)\n if (!authSuccess && scope) {\n authSuccess = await this.validateAppPassword(user, password, ip, scope)\n }\n this.updateAccesses(user, ip, authSuccess).catch((e: Error) => this.logger.error(`${this.logUser.name} - ${e}`))\n if (authSuccess) {\n await user.makePaths()\n return user\n }\n this.logger.warn(`${this.logUser.name} - bad password for *${user.login}*`)\n return null\n }\n\n validateUserAccess(user: UserModel, ip: string) {\n if (user.role === USER_ROLE.LINK) {\n this.logger.error(`${this.validateUserAccess.name} - guest link account ${user} is not authorized to login`)\n throw new HttpException('Account is not allowed', HttpStatus.FORBIDDEN)\n }\n if (!user.isActive || user.passwordAttempts >= USER_MAX_PASSWORD_ATTEMPTS) {\n this.updateAccesses(user, ip, false).catch((e: Error) => this.logger.error(`${this.validateUserAccess.name} - ${e}`))\n this.logger.error(`${this.validateUserAccess.name} - user account *${user.login}* is locked`)\n this.notifyAccountLocked(user, ip)\n throw new HttpException('Account locked', HttpStatus.FORBIDDEN)\n }\n }\n\n async me(authUser: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n const user = await this.fromUserId(authUser.id)\n if (!user) {\n this.logger.warn(`User *${authUser.login} (${authUser.id}) not found`)\n throw new HttpException(`User not found`, HttpStatus.NOT_FOUND)\n }\n user.impersonated = !!authUser.impersonatedFromId\n user.clientId = authUser.clientId\n return { user: user, server: serverConfig }\n }\n\n async compareUserPassword(userId: number, password: string): Promise<boolean> {\n return this.usersQueries.compareUserPassword(userId, password)\n }\n\n async updateLanguage(user: UserModel, userLanguageDto: UserLanguageDto) {\n if (!userLanguageDto.language) userLanguageDto.language = null\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userLanguageDto))) {\n throw new HttpException('Unable to update language', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updatePassword(user: UserModel, userPasswordDto: UserUpdatePasswordDto) {\n const r = await this.usersQueries.selectUserProperties(user.id, ['password'])\n if (!r) {\n throw new HttpException('Unable to check password', HttpStatus.NOT_FOUND)\n }\n if (!(await comparePassword(userPasswordDto.oldPassword, r.password))) {\n throw new HttpException('Password mismatch', HttpStatus.BAD_REQUEST)\n }\n const hash = await bcrypt.hash(userPasswordDto.newPassword, 10)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { password: hash }))) {\n throw new HttpException('Unable to update password', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateNotification(user: UserModel, userNotificationDto: UserNotificationDto) {\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userNotificationDto))) {\n throw new HttpException('Unable to update notification preference', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateStorageIndexing(user: UserModel, userStorageIndexingDto: UserStorageIndexingDto) {\n if (!(await this.usersQueries.updateUserOrGuest(user.id, userStorageIndexingDto))) {\n throw new HttpException('Unable to update full-text search preference', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateAvatar(req: FastifyAuthenticatedRequest) {\n const part: MultipartFile = await req.file({ limits: { fileSize: USER_AVATAR_MAX_UPLOAD_SIZE } })\n if (!part.mimetype.startsWith('image/')) {\n throw new HttpException('Unsupported file type', HttpStatus.BAD_REQUEST)\n }\n const dstPath = path.join(req.user.tmpPath, USER_AVATAR_FILE_NAME)\n try {\n await pipeline(part.file, createWriteStream(dstPath))\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to upload avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n if (part.file.truncated) {\n this.logger.warn(`${this.updateAvatar.name} - image is too large`)\n throw new HttpException('Image is too large (5MB max)', HttpStatus.PAYLOAD_TOO_LARGE)\n }\n try {\n await moveFiles(dstPath, path.join(req.user.homePath, USER_AVATAR_FILE_NAME), true)\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to create avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateSecrets(userId: number, secrets: UserSecrets) {\n const userSecrets = await this.usersQueries.getUserSecrets(userId)\n const updatedSecrets = { ...userSecrets, ...secrets }\n if (!(await this.usersQueries.updateUserOrGuest(userId, { secrets: updatedSecrets }))) {\n throw new HttpException('Unable to update secrets', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateAccesses(user: UserModel, ip: string, success: boolean, isAuthTwoFa = false) {\n let passwordAttempts: number\n if (!isAuthTwoFa && configuration.auth.mfa.totp.enabled && user.twoFaEnabled) {\n // Do not reset password attempts if the login still requires 2FA validation\n passwordAttempts = user.passwordAttempts\n } else {\n passwordAttempts = success ? 0 : Math.min(user.passwordAttempts + 1, USER_MAX_PASSWORD_ATTEMPTS)\n }\n await this.usersQueries.updateUserOrGuest(user.id, {\n lastAccess: user.currentAccess,\n currentAccess: new Date(),\n lastIp: user.currentIp,\n currentIp: ip,\n passwordAttempts: passwordAttempts,\n isActive: user.isActive && passwordAttempts < USER_MAX_PASSWORD_ATTEMPTS\n })\n }\n\n async getAvatar(userLogin: string, generate: true, generateIsNotExists?: boolean): Promise<undefined>\n async getAvatar(userLogin: string, generate?: false, generateIsNotExists?: boolean): Promise<[path: string, mime: string]>\n async getAvatar(userLogin: string, generate: boolean = false, generateIsNotExists?: boolean): Promise<[path: string, mime: string]> {\n const avatarPath = path.join(UserModel.getHomePath(userLogin), USER_AVATAR_FILE_NAME)\n const avatarExists = await isPathExists(avatarPath)\n if (!avatarExists && generateIsNotExists) {\n generate = true\n }\n if (!generate) {\n return [avatarExists ? avatarPath : USER_DEFAULT_AVATAR_FILE_PATH, avatarExists ? pngMimeType : svgMimeType]\n }\n if (!(await isPathExists(UserModel.getHomePath(userLogin)))) {\n throw new HttpException(`Home path for user *${userLogin}* does not exist`, HttpStatus.FORBIDDEN)\n }\n const user: Partial<UserModel> = await this.findUser(userLogin)\n if (!user) {\n throw new HttpException(`avatar not found`, HttpStatus.NOT_FOUND)\n }\n const avatarFile: WriteStream = createWriteStream(avatarPath)\n const avatarStream: NodeJS.ReadableStream = await generateAvatar(user.getInitials())\n try {\n await pipeline(avatarStream, avatarFile)\n } catch (e) {\n this.logger.error(`${this.updateAvatar.name} - ${e}`)\n throw new HttpException('Unable to create avatar', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n if (generateIsNotExists) {\n return [avatarPath, pngMimeType]\n }\n }\n\n async listAppPasswords(user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (Array.isArray(secrets.appPasswords)) {\n // remove passwords from response\n return secrets.appPasswords.map(({ password, ...rest }: UserAppPassword) => rest)\n }\n return []\n }\n\n async generateAppPassword(user: UserModel, userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n const slugName = createLightSlug(userAppPasswordDto.name)\n if (Array.isArray(secrets.appPasswords) && secrets.appPasswords.find((p: UserAppPassword) => p.name === slugName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n secrets.appPasswords = Array.isArray(secrets.appPasswords) ? secrets.appPasswords : []\n const clearPassword = genPassword(24)\n const appPassword: UserAppPassword = {\n name: createLightSlug(userAppPasswordDto.name),\n app: userAppPasswordDto.app,\n expiration: userAppPasswordDto.expiration,\n password: await hashPassword(clearPassword),\n createdAt: new Date(),\n currentIp: null,\n currentAccess: null,\n lastIp: null,\n lastAccess: null\n }\n secrets.appPasswords.unshift(appPassword)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { secrets: secrets }))) {\n throw new HttpException('Unable to update app passwords', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n // return clear password only once\n return { ...appPassword, password: clearPassword }\n }\n\n async deleteAppPassword(user: UserModel, passwordName: string): Promise<void> {\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (!Array.isArray(secrets.appPasswords) || !secrets.appPasswords.find((p: UserAppPassword) => p.name === passwordName)) {\n throw new HttpException('App password not found', HttpStatus.NOT_FOUND)\n }\n secrets.appPasswords = secrets.appPasswords.filter((p: UserAppPassword) => p.name !== passwordName)\n if (!(await this.usersQueries.updateUserOrGuest(user.id, { secrets: secrets }))) {\n throw new HttpException('Unable to delete app password', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async validateAppPassword(user: UserModel, password: string, ip: string, scope: AUTH_SCOPE): Promise<boolean> {\n if (!scope || !user.haveRole(USER_ROLE.USER)) return false\n const secrets = await this.usersQueries.getUserSecrets(user.id)\n if (!Array.isArray(secrets.appPasswords)) return false\n for (const p of secrets.appPasswords) {\n if (p.app !== scope) continue\n const expMs = p.expiration ? new Date(p.expiration) : null\n if (p.expiration && new Date() > expMs) continue // expired\n if (await comparePassword(password, p.password)) {\n p.lastAccess = p.currentAccess\n p.currentAccess = new Date()\n p.lastIp = p.currentIp\n p.currentIp = ip\n // update accesses\n this.usersQueries\n .updateUserOrGuest(user.id, { secrets: secrets })\n .catch((e: Error) => this.logger.error(`${this.validateAppPassword.name} - ${e}`))\n return true\n }\n }\n return false\n }\n\n setOnlineStatus(user: JwtIdentityPayload, onlineStatus: USER_ONLINE_STATUS) {\n this.usersQueries.setOnlineStatus(user.id, onlineStatus).catch((e: Error) => this.logger.error(`${this.setOnlineStatus.name} - ${e}`))\n }\n\n getOnlineUsers(userIds: number[]): Promise<UserOnline[]> {\n return this.usersQueries.getOnlineUsers(userIds)\n }\n\n async usersWhitelist(userId: number): Promise<number[]> {\n return this.usersQueries.usersWhitelist(userId)\n }\n\n async browseGroups(user: UserModel, name: string): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> & { role: UserGroup['role'] } = await this.usersQueries.groupFromName(user.id, name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.usersQueries.browseGroupMembers(group.id) }\n }\n return { parentGroup: undefined, members: await this.usersQueries.browseRootGroups(user.id) }\n }\n\n async getGroup(user: UserModel, groupId: number, withMembers?: true, asAdmin?: boolean): Promise<GroupWithMembers>\n async getGroup(user: UserModel, groupId: number, withMembers: false, asAdmin?: boolean): Promise<GroupMember>\n async getGroup(user: UserModel, groupId: number, withMembers = true, asAdmin = false): Promise<GroupMember | GroupWithMembers> {\n const group = withMembers\n ? await this.usersQueries.getGroupWithMembers(user.id, groupId, asAdmin)\n : await this.usersQueries.getGroup(user.id, groupId, asAdmin)\n if (!group) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n return group\n }\n\n async createPersonalGroup(user: UserModel, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n if (!userCreateOrUpdateGroupDto.name) {\n this.logger.error(`${this.createPersonalGroup.name} - missing group name : ${JSON.stringify(userCreateOrUpdateGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n if (await this.usersQueries.checkGroupNameExists(userCreateOrUpdateGroupDto.name)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n try {\n const groupId: number = await this.usersQueries.createPersonalGroup(user.id, userCreateOrUpdateGroupDto)\n this.logger.log(`${this.createPersonalGroup.name} - group (${groupId}) was created : ${JSON.stringify(userCreateOrUpdateGroupDto)}`)\n // clear user whitelists\n this.usersQueries.clearWhiteListCaches([user.id])\n return this.getGroup(user, groupId, false)\n } catch (e) {\n this.logger.error(`${this.createPersonalGroup.name} - group was not created : ${JSON.stringify(userCreateOrUpdateGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updatePersonalGroup(user: UserModel, groupId: number, userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n if (!Object.keys(userCreateOrUpdateGroupDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n const currentGroup: GroupMember = await this.getGroup(user, groupId, false, user.isAdmin)\n if (currentGroup.type !== MEMBER_TYPE.PGROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (userCreateOrUpdateGroupDto.name && (await this.usersQueries.checkGroupNameExists(userCreateOrUpdateGroupDto.name))) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n try {\n await this.usersQueries.updateGroup(groupId, userCreateOrUpdateGroupDto)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return this.getGroup(user, groupId, false, user.isAdmin)\n }\n\n async addUsersToGroup(user: UserModel, groupId: number, userIds: number[]): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n // only users can be added to users groups\n // guests and users can be added to personal groups\n const userWhiteList: number[] = await this.usersQueries.usersWhitelist(\n user.id,\n currentGroup.type === MEMBER_TYPE.GROUP ? USER_ROLE.USER : undefined\n )\n // ignore user ids that are already group members & filter on user ids allowed to current user\n userIds = userIds.filter((id) => !currentGroup.members.find((m) => m.id === id)).filter((id) => userWhiteList.indexOf(id) > -1)\n if (!userIds.length) {\n throw new HttpException('No users to add to group', HttpStatus.BAD_REQUEST)\n }\n return this.usersQueries.updateGroupMembers(groupId, { add: userIds.map((id) => ({ id: id, groupRole: USER_GROUP_ROLE.MEMBER })) })\n }\n\n async updateUserFromPersonalGroup(user: UserModel, groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n if (currentGroup.type !== MEMBER_TYPE.PGROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const userToUpdate = currentGroup.members.find((m) => m.id === userId)\n if (!userToUpdate) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userToUpdate.groupRole !== updateUserFromGroupDto.role) {\n if (userToUpdate.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n return this.adminUsersManager.updateUserFromGroup(groupId, userId, updateUserFromGroupDto)\n }\n }\n\n async removeUserFromGroup(user: UserModel, groupId: number, userId: number): Promise<void> {\n const currentGroup: GroupWithMembers = await this.getGroup(user, groupId)\n const userToRemove = currentGroup.members.find((m) => m.id === userId)\n if (!userToRemove) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userToRemove.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.type === MEMBER_TYPE.GROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n return this.usersQueries.updateGroupMembers(groupId, { remove: [userId] })\n }\n\n async leavePersonalGroup(user: UserModel, groupId: number): Promise<void> {\n const currentGroup: GroupWithMembers = await this.usersQueries.getGroupWithMembers(user.id, groupId, true)\n if (!currentGroup || currentGroup.type === MEMBER_TYPE.GROUP) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const userWhoLeaves = currentGroup.members.find((m) => m.id === user.id)\n if (!userWhoLeaves) {\n throw new HttpException('User was not found', HttpStatus.BAD_REQUEST)\n }\n if (userWhoLeaves.groupRole === USER_GROUP_ROLE.MANAGER) {\n if (currentGroup.members.filter((m) => m.groupRole === USER_GROUP_ROLE.MANAGER).length === 1) {\n throw new HttpException('Group must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n try {\n await this.usersQueries.updateGroupMembers(groupId, { remove: [user.id] })\n this.logger.log(`${this.leavePersonalGroup.name} - user (${user.id}) has left group (${groupId})`)\n } catch (e) {\n this.logger.error(`${this.leavePersonalGroup.name} - user (${user.id}) has not left group (${groupId}) : ${e}`)\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deletePersonalGroup(user: UserModel, groupId: number): Promise<void> {\n if (!(await this.usersQueries.canDeletePersonalGroup(user.id, groupId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n if (await this.usersQueries.deletePersonalGroup(groupId)) {\n this.logger.log(`${this.deletePersonalGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deletePersonalGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n listGuests(user: UserModel): Promise<GuestUser[]> {\n return this.usersQueries.listGuests(null, user.id)\n }\n\n async getGuest(user: UserModel, guestId: number): Promise<GuestUser> {\n const guest: GuestUser = await this.usersQueries.listGuests(guestId, user.id)\n this.adminUsersManager.checkUser(guest, true)\n return guest\n }\n\n async createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n // filter managers that are allowed for current user\n const userWhiteList = await this.usersQueries.usersWhitelist(user.id, USER_ROLE.USER)\n createGuestDto.managers = createGuestDto.managers.filter((id) => userWhiteList.indexOf(id) > -1)\n if (createGuestDto.managers.indexOf(user.id) === -1) {\n // force user as manager during creation\n createGuestDto.managers.push(user.id)\n }\n // clear user whitelists\n this.usersQueries.clearWhiteListCaches([user.id])\n return this.adminUsersManager.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n async updateGuest(user: UserModel, guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers) {\n // filter managers that are allowed for current user\n const userWhiteList = await this.usersQueries.usersWhitelist(user.id, USER_ROLE.USER)\n updateGuestDto.managers = updateGuestDto.managers.filter((id) => userWhiteList.indexOf(id) > -1)\n if (!updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n }\n if (!(await this.usersQueries.isGuestManager(user.id, guestId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const guest = await this.adminUsersManager.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n return guest.managers.find((m) => m.id === user.id) ? guest : null\n }\n\n async deleteGuest(user: UserModel, guestId: number): Promise<void> {\n const guest = await this.usersQueries.isGuestManager(user.id, guestId)\n if (!guest) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // guest has no space but a temporary directory\n return this.adminUsersManager.deleteUserOrGuest(guest.id, guest.login, { deleteSpace: true, isGuest: true })\n }\n\n searchMembers(user: UserModel, searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersQueries.searchUsersOrGroups(searchMembersDto, user.id)\n }\n\n private notifyAccountLocked(user: UserModel, ip: string) {\n this.notificationsManager\n .sendEmailNotification([user], {\n app: NOTIFICATION_APP.AUTH_LOCKED,\n event: NOTIFICATION_APP_EVENT.AUTH_LOCKED[ACTION.DELETE],\n element: null,\n url: ip\n })\n .catch((e: Error) => this.logger.error(`${this.validateUserAccess.name} - ${e}`))\n }\n}\n"],"names":["UsersManager","fromUserId","id","user","usersQueries","from","UserModel","findUser","loginOrEmail","removePassword","logUser","password","ip","scope","validateUserAccess","authSuccess","comparePassword","validateAppPassword","updateAccesses","catch","e","logger","error","name","makePaths","warn","login","role","USER_ROLE","LINK","HttpException","HttpStatus","FORBIDDEN","isActive","passwordAttempts","USER_MAX_PASSWORD_ATTEMPTS","notifyAccountLocked","me","authUser","NOT_FOUND","impersonated","impersonatedFromId","clientId","server","serverConfig","compareUserPassword","userId","updateLanguage","userLanguageDto","language","updateUserOrGuest","INTERNAL_SERVER_ERROR","updatePassword","userPasswordDto","r","selectUserProperties","oldPassword","BAD_REQUEST","hash","bcrypt","newPassword","updateNotification","userNotificationDto","updateStorageIndexing","userStorageIndexingDto","updateAvatar","req","part","file","limits","fileSize","USER_AVATAR_MAX_UPLOAD_SIZE","mimetype","startsWith","dstPath","path","join","tmpPath","USER_AVATAR_FILE_NAME","pipeline","createWriteStream","truncated","PAYLOAD_TOO_LARGE","moveFiles","homePath","updateSecrets","secrets","userSecrets","getUserSecrets","updatedSecrets","success","isAuthTwoFa","configuration","auth","mfa","totp","enabled","twoFaEnabled","Math","min","lastAccess","currentAccess","Date","lastIp","currentIp","getAvatar","userLogin","generate","generateIsNotExists","avatarPath","getHomePath","avatarExists","isPathExists","USER_DEFAULT_AVATAR_FILE_PATH","pngMimeType","svgMimeType","avatarFile","avatarStream","generateAvatar","getInitials","listAppPasswords","Array","isArray","appPasswords","map","rest","generateAppPassword","userAppPasswordDto","slugName","createLightSlug","find","p","clearPassword","genPassword","appPassword","app","expiration","hashPassword","createdAt","unshift","deleteAppPassword","passwordName","filter","haveRole","USER","expMs","setOnlineStatus","onlineStatus","getOnlineUsers","userIds","usersWhitelist","browseGroups","group","groupFromName","parentGroup","members","browseGroupMembers","undefined","browseRootGroups","getGroup","groupId","withMembers","asAdmin","getGroupWithMembers","createPersonalGroup","userCreateOrUpdateGroupDto","JSON","stringify","checkGroupNameExists","log","clearWhiteListCaches","updatePersonalGroup","Object","keys","length","currentGroup","isAdmin","type","MEMBER_TYPE","PGROUP","updateGroup","message","addUsersToGroup","userWhiteList","GROUP","m","indexOf","updateGroupMembers","add","groupRole","USER_GROUP_ROLE","MEMBER","updateUserFromPersonalGroup","updateUserFromGroupDto","userToUpdate","MANAGER","adminUsersManager","updateUserFromGroup","removeUserFromGroup","userToRemove","remove","leavePersonalGroup","userWhoLeaves","deletePersonalGroup","canDeletePersonalGroup","listGuests","getGuest","guestId","guest","checkUser","createGuest","createGuestDto","managers","push","createUserOrGuest","GUEST","updateGuest","updateGuestDto","isGuestManager","deleteGuest","deleteUserOrGuest","deleteSpace","isGuest","searchMembers","searchMembersDto","searchUsersOrGroups","notificationsManager","sendEmailNotification","NOTIFICATION_APP","AUTH_LOCKED","event","NOTIFICATION_APP_EVENT","ACTION","DELETE","element","url","Logger"],"mappings":"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"}
@@ -381,83 +381,82 @@ let UsersQueries = class UsersQueries {
381
381
  }
382
382
  async usersWhitelist(userId, lowerOrEqualUserRole = _user.USER_ROLE.GUEST) {
383
383
  /* Get the list of user ids allowed to the current user
384
- - all users with no groups (except link users)
385
- - all users who are members of the current user's groups (excluding link users and members of isolated groups)
386
- - all guests managed by the current user
387
- - all managers who manage the current guest
388
- */ const usersAlias = (0, _mysqlcore.alias)(_usersschema.users, 'usersAlias');
389
- const groupsAlias = (0, _mysqlcore.alias)(_groupsschema.groups, 'groupsAlias');
390
- const userIds = (0, _drizzleorm.sql)`
391
- WITH RECURSIVE children (id, parentId) AS
392
- (SELECT ${_groupsschema.groups.id},
393
- ${_groupsschema.groups.parentId}
394
- FROM ${_groupsschema.groups}
395
- WHERE (${_groupsschema.groups.id} IN (SELECT ${_usersgroupsschema.usersGroups.groupId}
396
- FROM ${_usersgroupsschema.usersGroups}
397
- WHERE ${_usersgroupsschema.usersGroups.userId} = ${userId}
398
- AND ${_groupsschema.groups.visibility} != ${_group.GROUP_VISIBILITY.ISOLATED}))
399
- UNION
400
- SELECT ${groupsAlias.id},
401
- ${groupsAlias.parentId}
402
- FROM ${_groupsschema.groups} AS groupsAlias
403
- INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${_drizzleorm.sql.raw(`${_group.GROUP_VISIBILITY.VISIBLE}`)})
404
- SELECT JSON_ARRAYAGG(id) AS ids
405
- FROM (
406
- -- Users from visible child groups
407
- SELECT ${_usersschema.users.id} AS id
408
- FROM children
409
- INNER JOIN ${_usersgroupsschema.usersGroups} ON ${_usersgroupsschema.usersGroups.groupId} = children.id
410
- INNER JOIN ${_usersschema.users} ON ${_usersgroupsschema.usersGroups.userId} = ${_usersschema.users.id} AND ${_usersschema.users.role} <= ${_drizzleorm.sql.raw(`${lowerOrEqualUserRole}`)}
384
+ - all users with no groups (except users with a role higher than lowerOrEqualUserRole)
385
+ - all users who are members of groups visible to the current user
386
+ (VISIBLE groups for everyone, PRIVATE groups only if the current user is a member, never members of ISOLATED groups)
387
+ - all guests managed by the current user
388
+ - all managers who manage the current guest
389
+ */ const userIds = (0, _drizzleorm.sql)`
390
+ WITH visible_groups AS (
391
+ SELECT ${_groupsschema.groups.id} AS id
392
+ FROM ${_groupsschema.groups}
393
+ LEFT JOIN ${_usersgroupsschema.usersGroups}
394
+ ON ${_usersgroupsschema.usersGroups.groupId} = ${_groupsschema.groups.id}
395
+ AND ${_usersgroupsschema.usersGroups.userId} = ${userId}
396
+ WHERE
397
+ ${_groupsschema.groups.visibility} != ${_group.GROUP_VISIBILITY.ISOLATED}
398
+ AND (
399
+ ${_groupsschema.groups.visibility} = ${_group.GROUP_VISIBILITY.VISIBLE}
400
+ OR (
401
+ ${_groupsschema.groups.visibility} = ${_group.GROUP_VISIBILITY.PRIVATE}
402
+ AND ${_usersgroupsschema.usersGroups.userId} IS NOT NULL
403
+ )
404
+ )
405
+ )
406
+ SELECT JSON_ARRAYAGG(id) AS ids
407
+ FROM (
408
+ -- 1) Users from groups visible to the current user
409
+ SELECT ${_usersschema.users.id} AS id
410
+ FROM ${_usersschema.users}
411
+ INNER JOIN ${_usersgroupsschema.usersGroups}
412
+ ON ${_usersgroupsschema.usersGroups.userId} = ${_usersschema.users.id}
413
+ INNER JOIN visible_groups
414
+ ON visible_groups.id = ${_usersgroupsschema.usersGroups.groupId}
415
+ WHERE ${_usersschema.users.role} <= ${_drizzleorm.sql.raw(`${lowerOrEqualUserRole}`)}
411
416
 
412
- UNION
413
- -- Users visible but not assigned to groups
414
- SELECT ${usersAlias.id} AS id
415
- FROM ${_usersschema.users} AS usersAlias
416
- INNER JOIN ${_usersschema.users} ON ${_usersschema.users.id} = ${usersAlias.id} AND ${_usersschema.users.role} <= ${_drizzleorm.sql.raw(`${lowerOrEqualUserRole}`)}
417
- WHERE NOT EXISTS (SELECT ${_usersgroupsschema.usersGroups.userId} FROM ${_usersgroupsschema.usersGroups} WHERE ${_usersgroupsschema.usersGroups.userId} = ${usersAlias.id})
418
- UNION
419
- -- Users or guests that are manager/managed
420
- SELECT CASE
421
- WHEN ${_usersguestsschema.usersGuests.userId} = ${userId} THEN ${_usersguestsschema.usersGuests.guestId}
422
- WHEN ${_usersguestsschema.usersGuests.guestId} = ${userId} THEN ${_usersguestsschema.usersGuests.userId}
423
- END AS id
424
- FROM ${_usersguestsschema.usersGuests}
425
- WHERE ${_usersguestsschema.usersGuests.userId} = ${userId}
426
- OR ${_usersguestsschema.usersGuests.guestId} = ${userId}) AS usersUnion
427
- `;
417
+ UNION
418
+
419
+ -- 2) Users with no groups
420
+ SELECT ${_usersschema.users.id} AS id
421
+ FROM ${_usersschema.users}
422
+ WHERE
423
+ ${_usersschema.users.role} <= ${_drizzleorm.sql.raw(`${lowerOrEqualUserRole}`)}
424
+ AND NOT EXISTS (
425
+ SELECT 1
426
+ FROM ${_usersgroupsschema.usersGroups}
427
+ WHERE ${_usersgroupsschema.usersGroups.userId} = ${_usersschema.users.id}
428
+ )
429
+
430
+ UNION
431
+
432
+ -- 3) Guests managed by the user and managers of the current guest
433
+ SELECT CASE
434
+ WHEN ${_usersguestsschema.usersGuests.userId} = ${userId} THEN ${_usersguestsschema.usersGuests.guestId}
435
+ WHEN ${_usersguestsschema.usersGuests.guestId} = ${userId} THEN ${_usersguestsschema.usersGuests.userId}
436
+ END AS id
437
+ FROM ${_usersguestsschema.usersGuests}
438
+ WHERE ${_usersguestsschema.usersGuests.userId} = ${userId}
439
+ OR ${_usersguestsschema.usersGuests.guestId} = ${userId}
440
+ ) AS usersUnion
441
+ `;
428
442
  const [r] = await this.db.execute(userIds);
429
443
  return JSON.parse(r[0].ids) || [];
430
444
  }
431
445
  async groupsWhitelist(userId) {
432
- /* Get the list of groups ids allowed to the current user
433
- - all parent groups for which the user is a member (includes personal groups, excludes isolated groups)
434
- - all subgroups inherited from parent groups
435
- */ const groupsAlias = (0, _mysqlcore.alias)(_groupsschema.groups, 'groupsAlias');
436
- const groupIds = (0, _drizzleorm.sql)`
437
- WITH RECURSIVE children (id, parentId, type) AS
438
- (SELECT ${_groupsschema.groups.id},
439
- ${_groupsschema.groups.parentId},
440
- ${_groupsschema.groups.type}
441
- FROM ${_groupsschema.groups}
442
- WHERE (${_groupsschema.groups.id} IN (SELECT ${_usersgroupsschema.usersGroups.groupId}
443
- FROM ${_usersgroupsschema.usersGroups}
444
- WHERE ${_usersgroupsschema.usersGroups.userId} = ${userId}
445
- AND ${_groupsschema.groups.visibility} != ${_group.GROUP_VISIBILITY.ISOLATED}))
446
- UNION
447
- SELECT ${groupsAlias.id},
448
- ${groupsAlias.parentId},
449
- ${groupsAlias.type}
450
- FROM ${_groupsschema.groups} AS groupsAlias
451
- INNER JOIN children cs ON ${groupsAlias.parentId} = cs.id AND ${groupsAlias.visibility} = ${_group.GROUP_VISIBILITY.VISIBLE})
452
- SELECT JSON_ARRAYAGG(children.id) as ids
453
- FROM children
454
- `;
455
- const [r] = await this.db.execute(groupIds);
446
+ /* Get the list of group IDs the current user is allowed to see.
447
+ - A group marked VISIBLE is always included.
448
+ - A group marked ISOLATED is always excluded.
449
+ - A PRIVATE group is included only if the user is a direct member of it.
450
+ - Visibility does not inherit from parent or child groups.
451
+ */ const q = this.db.select({
452
+ id: (0, _drizzleorm.sql)`JSON_ARRAYAGG(${_groupsschema.groups.id}) as ids`
453
+ }).from(_groupsschema.groups).leftJoin(_usersgroupsschema.usersGroups, (0, _drizzleorm.and)((0, _drizzleorm.eq)(_usersgroupsschema.usersGroups.groupId, _groupsschema.groups.id), (0, _drizzleorm.eq)(_usersgroupsschema.usersGroups.userId, userId))).where((0, _drizzleorm.and)((0, _drizzleorm.ne)(_groupsschema.groups.visibility, _group.GROUP_VISIBILITY.ISOLATED), (0, _drizzleorm.or)((0, _drizzleorm.eq)(_groupsschema.groups.visibility, _group.GROUP_VISIBILITY.VISIBLE), (0, _drizzleorm.and)((0, _drizzleorm.eq)(_groupsschema.groups.visibility, _group.GROUP_VISIBILITY.PRIVATE), (0, _drizzleorm.isNotNull)(_usersgroupsschema.usersGroups.userId)))));
454
+ const [r] = await this.db.execute(q);
456
455
  return JSON.parse(r[0].ids) || [];
457
456
  }
458
457
  clearWhiteListCaches(userIds) {
459
458
  if (userIds === '*') {
460
- // means all entries
459
+ // Means all entries
461
460
  for (const pattern of [
462
461
  this.cache.genSlugKey(this.constructor.name, this.usersWhitelist.name, userIds),
463
462
  this.cache.genSlugKey(this.constructor.name, this.groupsWhitelist.name, userIds)