@sync-in/server 1.3.9 → 1.5.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 (294) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +5 -3
  3. package/environment/environment.dist.yaml +2 -0
  4. package/package.json +6 -6
  5. package/server/app.bootstrap.js +9 -0
  6. package/server/app.bootstrap.js.map +1 -1
  7. package/server/app.service.spec.js +44 -19
  8. package/server/app.service.spec.js.map +1 -1
  9. package/server/applications/comments/comments.controller.spec.js +103 -4
  10. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  11. package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
  12. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  13. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
  14. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
  15. package/server/applications/files/constants/files.js +0 -23
  16. package/server/applications/files/constants/files.js.map +1 -1
  17. package/server/applications/files/constants/only-office.js +8 -0
  18. package/server/applications/files/constants/only-office.js.map +1 -1
  19. package/server/applications/files/constants/routes.js +6 -1
  20. package/server/applications/files/constants/routes.js.map +1 -1
  21. package/server/applications/files/files-only-office.controller.js +11 -0
  22. package/server/applications/files/files-only-office.controller.js.map +1 -1
  23. package/server/applications/files/files-only-office.controller.spec.js +97 -3
  24. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  25. package/server/applications/files/files-tasks.controller.spec.js +91 -1
  26. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  27. package/server/applications/files/files.config.js +5 -0
  28. package/server/applications/files/files.config.js.map +1 -1
  29. package/server/applications/files/files.controller.spec.js +268 -46
  30. package/server/applications/files/files.controller.spec.js.map +1 -1
  31. package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
  32. package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
  33. package/server/applications/files/guards/files-only-office.strategy.js +0 -1
  34. package/server/applications/files/guards/files-only-office.strategy.js.map +1 -1
  35. package/server/applications/files/services/files-only-office-manager.service.js +5 -0
  36. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  37. package/server/applications/links/links.controller.spec.js +91 -58
  38. package/server/applications/links/links.controller.spec.js.map +1 -1
  39. package/server/applications/links/services/links-manager.service.js +4 -6
  40. package/server/applications/links/services/links-manager.service.js.map +1 -1
  41. package/server/applications/links/services/links-manager.service.spec.js +378 -14
  42. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  43. package/server/applications/links/services/links-queries.service.js +1 -1
  44. package/server/applications/links/services/links-queries.service.js.map +1 -1
  45. package/server/applications/notifications/notifications.controller.spec.js +56 -1
  46. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  47. package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
  48. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  49. package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
  50. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  51. package/server/applications/spaces/guards/space.guard.spec.js +153 -18
  52. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  53. package/server/applications/spaces/services/spaces-browser.service.js +7 -7
  54. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  55. package/server/applications/spaces/services/spaces-manager.service.js +17 -17
  56. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  57. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
  58. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
  59. package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
  60. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  61. package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
  62. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  63. package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
  64. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  65. package/server/applications/sync/utils/routes.js +1 -1
  66. package/server/applications/sync/utils/routes.js.map +1 -1
  67. package/server/applications/users/guards/permissions.guard.js +4 -4
  68. package/server/applications/users/guards/permissions.guard.js.map +1 -1
  69. package/server/applications/users/guards/permissions.guard.spec.js +6 -6
  70. package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
  71. package/server/applications/users/guards/roles.guard.js +1 -1
  72. package/server/applications/users/guards/roles.guard.js.map +1 -1
  73. package/server/applications/users/models/user.model.js +1 -1
  74. package/server/applications/users/models/user.model.js.map +1 -1
  75. package/server/applications/users/services/admin-users-manager.service.js +22 -24
  76. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  77. package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
  78. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  79. package/server/applications/users/services/users-manager.service.js +1 -1
  80. package/server/applications/users/services/users-manager.service.js.map +1 -1
  81. package/server/applications/users/services/users-manager.service.spec.js +938 -49
  82. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  83. package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
  84. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  85. package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
  86. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
  87. package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
  88. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  89. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
  90. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
  91. package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
  92. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  93. package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
  94. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  95. package/server/applications/webdav/webdav.controller.js +2 -2
  96. package/server/applications/webdav/webdav.controller.js.map +1 -1
  97. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  98. package/server/authentication/guards/auth-basic.guard.spec.js +38 -2
  99. package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
  100. package/server/authentication/guards/auth-basic.strategy.js +0 -1
  101. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  102. package/server/authentication/guards/auth-digest.guard.js +1 -2
  103. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  104. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  105. package/server/authentication/guards/auth-local.guard.spec.js +7 -5
  106. package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
  107. package/server/authentication/guards/auth-local.strategy.js +0 -1
  108. package/server/authentication/guards/auth-local.strategy.js.map +1 -1
  109. package/server/authentication/guards/auth-token-access.guard.spec.js +30 -0
  110. package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
  111. package/server/authentication/guards/auth-token-access.strategy.js +0 -1
  112. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  113. package/server/authentication/guards/auth-token-refresh.strategy.js +0 -1
  114. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  115. package/server/authentication/services/auth-methods/auth-method-database.service.js +1 -1
  116. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
  117. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +8 -6
  118. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
  119. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +2 -2
  120. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  121. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +500 -5
  122. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
  123. package/server/configuration/config.loader.js +0 -3
  124. package/server/configuration/config.loader.js.map +1 -1
  125. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
  126. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
  127. package/server/infrastructure/context/services/context-manager.service.spec.js +98 -0
  128. package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -0
  129. package/server/infrastructure/database/constants.js +0 -1
  130. package/server/infrastructure/database/constants.js.map +1 -1
  131. package/server/infrastructure/database/scripts/seed/usersgroups.js +3 -3
  132. package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
  133. package/server/infrastructure/mailer/mailer.service.js +20 -19
  134. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  135. package/server/infrastructure/mailer/mailer.service.spec.js +176 -0
  136. package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -0
  137. package/static/3rdpartylicenses.txt +26 -26
  138. package/static/assets/pdfjs/build/pdf.mjs +1177 -255
  139. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  140. package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
  141. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  142. package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
  143. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  144. package/static/assets/pdfjs/version +1 -1
  145. package/static/assets/pdfjs/web/debugger.css +31 -0
  146. package/static/assets/pdfjs/web/debugger.mjs +144 -2
  147. package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
  148. package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
  149. package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
  150. package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
  151. package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
  152. package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
  153. package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
  154. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
  155. package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
  156. package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
  157. package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
  158. package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
  159. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
  160. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
  161. package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
  162. package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
  163. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
  164. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
  165. package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
  166. package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
  167. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
  168. package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
  169. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
  170. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
  171. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
  172. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
  173. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
  174. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
  175. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
  176. package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
  177. package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
  178. package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
  179. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
  180. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
  181. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
  182. package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
  183. package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
  184. package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
  185. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
  186. package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
  187. package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
  188. package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
  189. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
  190. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
  191. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
  192. package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
  193. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
  194. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
  195. package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
  196. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
  197. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
  198. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
  199. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
  200. package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
  201. package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
  202. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
  203. package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
  204. package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
  205. package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
  206. package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
  207. package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
  208. package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
  209. package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
  210. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
  211. package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
  212. package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
  213. package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
  214. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
  215. package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
  216. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
  217. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
  218. package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
  219. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
  220. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
  221. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
  222. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
  223. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
  224. package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
  225. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
  226. package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
  227. package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
  228. package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
  229. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
  230. package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
  231. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
  232. package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
  233. package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
  234. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
  235. package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
  236. package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
  237. package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
  238. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
  239. package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
  240. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
  241. package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
  242. package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
  243. package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
  244. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
  245. package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
  246. package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
  247. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
  248. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
  249. package/static/assets/pdfjs/web/viewer.css +649 -120
  250. package/static/assets/pdfjs/web/viewer.html +19 -0
  251. package/static/assets/pdfjs/web/viewer.mjs +489 -38
  252. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  253. package/static/chunk-22EANI6R.js +1 -0
  254. package/static/{chunk-KFM544CA.js → chunk-2UWN7IQF.js} +1 -1
  255. package/static/{chunk-N3T57OCA.js → chunk-2VSPDSJS.js} +1 -1
  256. package/static/{chunk-HUWQHCUX.js → chunk-34UZ7SYI.js} +1 -1
  257. package/static/{chunk-MWFRZBJD.js → chunk-45UQJGGY.js} +1 -1
  258. package/static/{chunk-LYTD6AJE.js → chunk-5TEXH3LJ.js} +1 -1
  259. package/static/{chunk-4KESSWTF.js → chunk-66FMKVJX.js} +1 -1
  260. package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
  261. package/static/chunk-CK4BY2NX.js +27 -0
  262. package/static/{chunk-QTW62OKJ.js → chunk-CSBDAY77.js} +1 -1
  263. package/static/{chunk-XUZSYWRF.js → chunk-CXXPLBDZ.js} +1 -1
  264. package/static/{chunk-ZTXJC5IC.js → chunk-EILQG525.js} +1 -1
  265. package/static/{chunk-FJFNDK67.js → chunk-ENWABUR4.js} +1 -1
  266. package/static/{chunk-WL65GYD5.js → chunk-FR4AOLYL.js} +4 -4
  267. package/static/chunk-HW2H3ISM.js +559 -0
  268. package/static/{chunk-BW5PQAKK.js → chunk-HYMDGBZL.js} +1 -1
  269. package/static/{chunk-WLPYIJFI.js → chunk-IML5UYQG.js} +1 -1
  270. package/static/{chunk-Z5X7LVMZ.js → chunk-IPSMJHMQ.js} +1 -1
  271. package/static/{chunk-3S4WNZ2T.js → chunk-JVCWYSNP.js} +1 -1
  272. package/static/{chunk-CLSVDV7J.js → chunk-KGPCIUD2.js} +1 -1
  273. package/static/{chunk-O4AQBQBF.js → chunk-KQZJSEM3.js} +1 -1
  274. package/static/{chunk-MK7WZG3F.js → chunk-NPEMJJIU.js} +1 -1
  275. package/static/{chunk-4TEHM3AS.js → chunk-OEFBC4GG.js} +1 -1
  276. package/static/{chunk-O67RFAWU.js → chunk-P734A3XZ.js} +1 -1
  277. package/static/{chunk-SRLMFJ7C.js → chunk-RASR4CK6.js} +1 -1
  278. package/static/{chunk-S5WXHO6D.js → chunk-RFMOUC22.js} +1 -1
  279. package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
  280. package/static/{chunk-3FX6ISDY.js → chunk-SBOQGGZX.js} +1 -1
  281. package/static/{chunk-NV2MEIWP.js → chunk-SJAFPXQV.js} +1 -1
  282. package/static/{chunk-PYSFXLMV.js → chunk-XTYGMF2V.js} +1 -1
  283. package/static/{chunk-ZFKCGL6X.js → chunk-YCWMV2YR.js} +1 -1
  284. package/static/{chunk-LB7B5RIV.js → chunk-YGD22MWQ.js} +1 -1
  285. package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
  286. package/static/{chunk-SKDQM65G.js → chunk-ZVY37DKS.js} +1 -1
  287. package/static/index.html +2 -2
  288. package/static/main-N5CZRHAO.js +7 -0
  289. package/static/styles-FYUSO6OJ.css +1 -0
  290. package/static/chunk-AY2GOSJ2.js +0 -24
  291. package/static/chunk-RSNLYAN6.js +0 -560
  292. package/static/chunk-ZZ3LHYOY.js +0 -1
  293. package/static/main-RREKR34B.js +0 -10
  294. package/static/styles-3DONJ2Z4.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-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 { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { AdminDeleteUserDto, DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { UserPasswordDto } from '../dto/user-password.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log(\n `${this.createUserOrGuest.name} - ${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n )\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error(`${this.createUserOrGuest.name} - unable to create user *${createUserDto.login}* : ${e}`)\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was deleted`)\n } else {\n this.logger.error(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was not deleted : not found`)\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error(`${this.deleteUserOrGuest.name} - unable to delete *${userLogin}* (${userId}) : ${e}`)\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserFromAdmin(admin: UserModel, userId: number, adminDeleteUserDto: AdminDeleteUserDto): Promise<void> {\n // check admin password\n if (!(await this.adminQueries.usersQueries.compareUserPassword(admin.id, adminDeleteUserDto.adminPassword))) {\n throw new HttpException('Bad password', HttpStatus.BAD_REQUEST)\n }\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: adminDeleteUserDto.deleteSpace\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(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 && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async deleteGuest(guestId: number): Promise<void> {\n // guest has no space but a temporary directory\n const guest: GuestUser = await this.getGuest(guestId)\n return this.deleteUserOrGuest(guest.id, guest.login, { deleteSpace: true, isGuest: true })\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error(`${this.createGroup.name} - missing group name : ${JSON.stringify(createGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log(`${this.createGroup.name} - group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`)\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error(`${this.createGroup.name} - group was not created : ${JSON.stringify(createGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log(`${this.deleteGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deleteGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, adminPassword: UserPasswordDto, res: FastifyReply): Promise<LoginResponseDto> {\n // check admin password\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.adminQueries.usersQueries.compareUserPassword(admin.id, adminPassword.password))) {\n throw new HttpException('Bad password', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log(`${this.deleteUserSpace.name} - user space *${userLogin}* was deleted`)\n } else {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* does not exist : ${userSpace}`)\n }\n } catch (e) {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* (${userSpace}) was not deleted : ${e}`)\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (await isPathExists(currentUserSpace)) {\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${newLogin}* already exists : ${newUserSpace}`)\n return false\n } else {\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error(`${this.renameUserSpace.name} - unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`)\n return false\n }\n }\n } else {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${oldLogin}* does not exist : ${currentUserSpace}`)\n return false\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","name","JSON","stringify","anonymizePassword","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserFromAdmin","admin","adminDeleteUserDto","compareUserPassword","adminPassword","BAD_REQUEST","userToDelete","from","createGuest","createGuestDto","push","updateGuest","updateGuestDto","deleteGuest","guest","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","checkOnly","groupName","exists","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-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 { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { AdminDeleteUserDto, DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { UserPasswordDto } from '../dto/user-password.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log(\n `${this.createUserOrGuest.name} - ${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n )\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error(`${this.createUserOrGuest.name} - unable to create user *${createUserDto.login}* : ${e}`)\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was deleted`)\n } else {\n this.logger.error(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was not deleted : not found`)\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error(`${this.deleteUserOrGuest.name} - unable to delete *${userLogin}* (${userId}) : ${e}`)\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserFromAdmin(admin: UserModel, userId: number, adminDeleteUserDto: AdminDeleteUserDto): Promise<void> {\n // check admin password\n if (!(await this.adminQueries.usersQueries.compareUserPassword(admin.id, adminDeleteUserDto.adminPassword))) {\n throw new HttpException('Bad password', HttpStatus.BAD_REQUEST)\n }\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: adminDeleteUserDto.deleteSpace\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(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 && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async deleteGuest(guestId: number): Promise<void> {\n // guest has no space but a temporary directory\n const guest: GuestUser = await this.getGuest(guestId)\n return this.deleteUserOrGuest(guest.id, guest.login, { deleteSpace: true, isGuest: true })\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error(`${this.createGroup.name} - missing group name : ${JSON.stringify(createGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log(`${this.createGroup.name} - group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`)\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error(`${this.createGroup.name} - group was not created : ${JSON.stringify(createGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log(`${this.deleteGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deleteGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, adminPassword: UserPasswordDto, res: FastifyReply): Promise<LoginResponseDto> {\n // check admin password\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.adminQueries.usersQueries.compareUserPassword(admin.id, adminPassword.password))) {\n throw new HttpException('Bad password', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log(`${this.deleteUserSpace.name} - user space *${userLogin}* was deleted`)\n } else {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* does not exist : ${userSpace}`)\n }\n } catch (e) {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* (${userSpace}) was not deleted : ${e}`)\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (!(await isPathExists(currentUserSpace))) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${oldLogin}* does not exist : ${currentUserSpace}`)\n return false\n }\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${newLogin}* already exists : ${newUserSpace}`)\n return false\n }\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error(`${this.renameUserSpace.name} - unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`)\n return false\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","name","JSON","stringify","anonymizePassword","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserFromAdmin","admin","adminDeleteUserDto","compareUserPassword","adminPassword","BAD_REQUEST","userToDelete","from","createGuest","createGuestDto","push","updateGuest","updateGuestDto","deleteGuest","guest","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","checkOnly","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","groupName","exists","Logger"],"mappings":"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"}