@sync-in/server 1.5.2 → 1.6.1

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 (355) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +2 -1
  3. package/environment/environment.dist.min.yaml +1 -0
  4. package/environment/environment.dist.yaml +88 -30
  5. package/migrations/0002_sleepy_korath.sql +1 -0
  6. package/migrations/meta/0002_snapshot.json +2424 -0
  7. package/migrations/meta/_journal.json +7 -0
  8. package/package.json +14 -12
  9. package/server/app.bootstrap.js +1 -1
  10. package/server/app.bootstrap.js.map +1 -1
  11. package/server/applications/files/services/files-manager.service.js +1 -2
  12. package/server/applications/files/services/files-manager.service.js.map +1 -1
  13. package/server/applications/files/services/files-only-office-manager.service.js +5 -6
  14. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  15. package/server/applications/files/utils/files.js +6 -4
  16. package/server/applications/files/utils/files.js.map +1 -1
  17. package/server/applications/links/links.controller.js +2 -2
  18. package/server/applications/links/links.controller.js.map +1 -1
  19. package/server/applications/links/services/links-manager.service.js +2 -1
  20. package/server/applications/links/services/links-manager.service.js.map +1 -1
  21. package/server/applications/links/services/links-manager.service.spec.js +6 -3
  22. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  23. package/server/applications/notifications/constants/notifications.js +9 -0
  24. package/server/applications/notifications/constants/notifications.js.map +1 -1
  25. package/server/applications/notifications/i18n/fr.js +10 -1
  26. package/server/applications/notifications/i18n/fr.js.map +1 -1
  27. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  28. package/server/applications/notifications/mails/models.js +41 -3
  29. package/server/applications/notifications/mails/models.js.map +1 -1
  30. package/server/applications/notifications/mails/templates.js +1 -1
  31. package/server/applications/notifications/mails/templates.js.map +1 -1
  32. package/server/applications/notifications/schemas/notifications.schema.js +2 -1
  33. package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
  34. package/server/applications/notifications/services/notifications-manager.service.js +16 -13
  35. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  36. package/server/applications/notifications/services/notifications-manager.service.spec.js +9 -8
  37. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  38. package/server/applications/notifications/services/notifications-queries.service.js +1 -1
  39. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  40. package/server/applications/shares/services/shares-manager.service.js +3 -2
  41. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  42. package/server/applications/sync/constants/auth.js +2 -2
  43. package/server/applications/sync/constants/auth.js.map +1 -1
  44. package/server/applications/sync/dtos/sync-client-registration.dto.js +5 -0
  45. package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
  46. package/server/applications/sync/dtos/sync-operations.dto.js +1 -2
  47. package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
  48. package/server/applications/sync/schemas/sync-clients.schema.js +2 -1
  49. package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
  50. package/server/applications/sync/schemas/sync-paths.schema.js +2 -1
  51. package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
  52. package/server/applications/sync/services/sync-clients-manager.service.js +28 -20
  53. package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
  54. package/server/applications/sync/services/sync-clients-manager.service.spec.js +24 -18
  55. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  56. package/server/applications/sync/services/sync-queries.service.js +5 -5
  57. package/server/applications/sync/services/sync-queries.service.js.map +1 -1
  58. package/server/applications/users/admin-users.controller.js +48 -37
  59. package/server/applications/users/admin-users.controller.js.map +1 -1
  60. package/server/applications/users/admin-users.controller.spec.js +15 -0
  61. package/server/applications/users/admin-users.controller.spec.js.map +1 -1
  62. package/server/applications/users/constants/routes.js +5 -0
  63. package/server/applications/users/constants/routes.js.map +1 -1
  64. package/server/applications/users/constants/user.js +8 -0
  65. package/server/applications/users/constants/user.js.map +1 -1
  66. package/server/applications/users/dto/delete-user.dto.js +5 -23
  67. package/server/applications/users/dto/delete-user.dto.js.map +1 -1
  68. package/server/applications/users/dto/user-properties.dto.js +38 -3
  69. package/server/applications/users/dto/user-properties.dto.js.map +1 -1
  70. package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
  71. package/server/applications/users/interfaces/user-secrets.interface.js +10 -0
  72. package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -0
  73. package/server/applications/users/models/user.model.js +84 -50
  74. package/server/applications/users/models/user.model.js.map +1 -1
  75. package/server/applications/users/schemas/user.interface.js.map +1 -1
  76. package/server/applications/users/schemas/users.schema.js +2 -0
  77. package/server/applications/users/schemas/users.schema.js.map +1 -1
  78. package/server/applications/users/services/admin-users-manager.service.js +7 -19
  79. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  80. package/server/applications/users/services/admin-users-manager.service.spec.js +7 -26
  81. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  82. package/server/applications/users/services/admin-users-queries.service.js +1 -0
  83. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  84. package/server/applications/users/services/users-manager.service.js +138 -28
  85. package/server/applications/users/services/users-manager.service.js.map +1 -1
  86. package/server/applications/users/services/users-manager.service.spec.js +11 -9
  87. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  88. package/server/applications/users/services/users-queries.service.js +63 -57
  89. package/server/applications/users/services/users-queries.service.js.map +1 -1
  90. package/server/applications/users/users.controller.js +48 -1
  91. package/server/applications/users/users.controller.js.map +1 -1
  92. package/server/applications/users/users.controller.spec.js +8 -1
  93. package/server/applications/users/users.controller.spec.js.map +1 -1
  94. package/server/applications/users/users.e2e-spec.js +2 -1
  95. package/server/applications/users/users.e2e-spec.js.map +1 -1
  96. package/server/applications/users/utils/avatar.js +48 -0
  97. package/server/applications/users/utils/avatar.js.map +1 -0
  98. package/server/authentication/auth.config.js +89 -26
  99. package/server/authentication/auth.config.js.map +1 -1
  100. package/server/authentication/auth.controller.js +117 -9
  101. package/server/authentication/auth.controller.js.map +1 -1
  102. package/server/authentication/auth.controller.spec.js +16 -1
  103. package/server/authentication/auth.controller.spec.js.map +1 -1
  104. package/server/authentication/auth.e2e-spec.js +4 -3
  105. package/server/authentication/auth.e2e-spec.js.map +1 -1
  106. package/server/authentication/auth.module.js +4 -1
  107. package/server/authentication/auth.module.js.map +1 -1
  108. package/server/authentication/constants/auth-ldap.js +44 -0
  109. package/server/authentication/constants/auth-ldap.js.map +1 -0
  110. package/server/authentication/constants/auth.js +37 -4
  111. package/server/authentication/constants/auth.js.map +1 -1
  112. package/server/authentication/constants/routes.js +21 -0
  113. package/server/authentication/constants/routes.js.map +1 -1
  114. package/server/authentication/constants/scope.js +20 -0
  115. package/server/authentication/constants/scope.js.map +1 -0
  116. package/server/authentication/dto/login-response.dto.js +27 -4
  117. package/server/authentication/dto/login-response.dto.js.map +1 -1
  118. package/server/authentication/dto/token-response.dto.js +5 -0
  119. package/server/authentication/dto/token-response.dto.js.map +1 -1
  120. package/server/{applications/users/dto/user-password.dto.js → authentication/dto/two-fa-verify.dto.js} +27 -9
  121. package/server/authentication/dto/two-fa-verify.dto.js.map +1 -0
  122. package/server/authentication/guards/auth-basic.strategy.js +6 -5
  123. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  124. package/server/authentication/guards/auth-token-access.strategy.js +3 -2
  125. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  126. package/server/authentication/guards/auth-token-refresh.strategy.js +3 -2
  127. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  128. package/server/authentication/guards/auth-two-fa-guard.js +81 -0
  129. package/server/authentication/guards/auth-two-fa-guard.js.map +1 -0
  130. package/server/authentication/interfaces/jwt-payload.interface.js +5 -0
  131. package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
  132. package/server/authentication/interfaces/token.interface.js +2 -0
  133. package/server/authentication/interfaces/token.interface.js.map +1 -1
  134. package/server/authentication/interfaces/two-fa-setup.interface.js +10 -0
  135. package/server/authentication/interfaces/two-fa-setup.interface.js.map +1 -0
  136. package/server/authentication/models/auth-method.js.map +1 -1
  137. package/server/authentication/services/auth-manager.service.js +72 -49
  138. package/server/authentication/services/auth-manager.service.js.map +1 -1
  139. package/server/authentication/services/auth-methods/auth-method-database.service.js +3 -3
  140. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
  141. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +5 -0
  142. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
  143. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +151 -66
  144. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  145. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +52 -50
  146. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
  147. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +251 -0
  148. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -0
  149. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +41 -0
  150. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -0
  151. package/server/authentication/utils/crypt-secret.js +68 -0
  152. package/server/authentication/utils/crypt-secret.js.map +1 -0
  153. package/server/common/functions.js +18 -2
  154. package/server/common/functions.js.map +1 -1
  155. package/server/common/qrcode.js +34 -0
  156. package/server/common/qrcode.js.map +1 -0
  157. package/server/common/shared.js +18 -0
  158. package/server/common/shared.js.map +1 -1
  159. package/server/configuration/config.environment.js +23 -6
  160. package/server/configuration/config.environment.js.map +1 -1
  161. package/server/configuration/config.interfaces.js +10 -0
  162. package/server/configuration/config.interfaces.js.map +1 -0
  163. package/server/configuration/config.loader.js.map +1 -1
  164. package/server/configuration/config.validation.js +13 -13
  165. package/server/configuration/config.validation.js.map +1 -1
  166. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +6 -6
  167. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  168. package/server/infrastructure/cache/schemas/mysql-cache.schema.js +2 -1
  169. package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
  170. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  171. package/server/infrastructure/database/columns.js +39 -0
  172. package/server/infrastructure/database/columns.js.map +1 -0
  173. package/server/infrastructure/database/database.config.js +0 -1
  174. package/server/infrastructure/database/database.config.js.map +1 -1
  175. package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
  176. package/server/infrastructure/mailer/mailer.config.js +12 -0
  177. package/server/infrastructure/mailer/mailer.config.js.map +1 -1
  178. package/server/infrastructure/mailer/mailer.service.js +2 -1
  179. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  180. package/static/assets/mimes/text-x-c.svg +1 -0
  181. package/static/assets/pdfjs/build/pdf.mjs +2522 -914
  182. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  183. package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
  184. package/static/assets/pdfjs/build/pdf.worker.mjs +1024 -566
  185. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  186. package/static/assets/pdfjs/version +1 -1
  187. package/static/assets/pdfjs/web/debugger.mjs +116 -37
  188. package/static/assets/pdfjs/web/images/comment-popup-editButton.svg +5 -0
  189. package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -12
  190. package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -12
  191. package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -16
  192. package/static/assets/pdfjs/web/locale/ar/viewer.ftl +0 -32
  193. package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -19
  194. package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -16
  195. package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -32
  196. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -32
  197. package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -16
  198. package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -12
  199. package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -22
  200. package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -16
  201. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -32
  202. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +12 -23
  203. package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -23
  204. package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -16
  205. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +0 -32
  206. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -32
  207. package/static/assets/pdfjs/web/locale/da/viewer.ftl +3 -35
  208. package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -32
  209. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -32
  210. package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -32
  211. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +0 -32
  212. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -32
  213. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -13
  214. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -32
  215. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -32
  216. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -32
  217. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +5 -32
  218. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -32
  219. package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -16
  220. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +38 -32
  221. package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -19
  222. package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -12
  223. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -32
  224. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -32
  225. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -32
  226. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +0 -32
  227. package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -12
  228. package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -23
  229. package/static/assets/pdfjs/web/locale/gl/viewer.ftl +0 -32
  230. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -32
  231. package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -12
  232. package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -32
  233. package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -16
  234. package/static/assets/pdfjs/web/locale/hr/viewer.ftl +0 -32
  235. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -32
  236. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -32
  237. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +372 -16
  238. package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -16
  239. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -32
  240. package/static/assets/pdfjs/web/locale/id/viewer.ftl +38 -32
  241. package/static/assets/pdfjs/web/locale/is/viewer.ftl +27 -32
  242. package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -33
  243. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +31 -33
  244. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +0 -32
  245. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -32
  246. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +31 -32
  247. package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -12
  248. package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -12
  249. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -32
  250. package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -12
  251. package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -23
  252. package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -16
  253. package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -12
  254. package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -12
  255. package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -14
  256. package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -19
  257. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -31
  258. package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -16
  259. package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -12
  260. package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -12
  261. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +0 -32
  262. package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -12
  263. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -32
  264. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +0 -32
  265. package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -24
  266. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -32
  267. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -32
  268. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -32
  269. package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +0 -32
  270. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -32
  271. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +5 -37
  272. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +0 -32
  273. package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -23
  274. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +8 -27
  275. package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -16
  276. package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -22
  277. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -32
  278. package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -32
  279. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +30 -32
  280. package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -12
  281. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -32
  282. package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -32
  283. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -32
  284. package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -16
  285. package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -12
  286. package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -16
  287. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -32
  288. package/static/assets/pdfjs/web/locale/th/viewer.ftl +38 -32
  289. package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -16
  290. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -32
  291. package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -12
  292. package/static/assets/pdfjs/web/locale/uk/viewer.ftl +0 -32
  293. package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -16
  294. package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -12
  295. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -32
  296. package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -12
  297. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -32
  298. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -32
  299. package/static/assets/pdfjs/web/viewer.css +586 -437
  300. package/static/assets/pdfjs/web/viewer.html +12 -23
  301. package/static/assets/pdfjs/web/viewer.mjs +955 -514
  302. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  303. package/static/assets/pdfjs/web/wasm/openjpeg.wasm +0 -0
  304. package/static/assets/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +10 -22
  305. package/static/{chunk-SPTF6FSM.js → chunk-27YQB3TE.js} +1 -1
  306. package/static/chunk-2I4CUFUA.js +1 -0
  307. package/static/chunk-2MTM6SWN.js +4 -0
  308. package/static/{chunk-7VRUZRJG.js → chunk-34MKICK5.js} +2 -2
  309. package/static/chunk-5O3DIUU3.js +1 -0
  310. package/static/{chunk-VJRTMDEJ.js → chunk-6NMVZIIT.js} +1 -1
  311. package/static/{chunk-L6MU6S2V.js → chunk-7DN7ZAPU.js} +1 -1
  312. package/static/{chunk-MVO4WZLK.js → chunk-7FUM3JGM.js} +1 -1
  313. package/static/{chunk-RSS6GYNE.js → chunk-7ITZXYYJ.js} +1 -1
  314. package/static/chunk-7P27WBGC.js +4 -0
  315. package/static/chunk-ATP3BFHV.js +562 -0
  316. package/static/chunk-AWQ2YTVC.js +1 -0
  317. package/static/chunk-DSOE3FEP.js +1 -0
  318. package/static/{chunk-2R6HHGUR.js → chunk-EFKMBLRE.js} +1 -1
  319. package/static/chunk-FUFKVHPU.js +1 -0
  320. package/static/{chunk-MRSWNAVB.js → chunk-HCDLWTMW.js} +1 -1
  321. package/static/chunk-IPAC4VAF.js +1 -0
  322. package/static/{chunk-ZC5NIT55.js → chunk-IQOALFYU.js} +1 -1
  323. package/static/chunk-JASU3CIH.js +1 -0
  324. package/static/{chunk-6OJZWYRZ.js → chunk-JQ5FTO2M.js} +1 -1
  325. package/static/chunk-JUNZFADM.js +1 -0
  326. package/static/{chunk-LLWSLOSX.js → chunk-LJUKI4SQ.js} +1 -1
  327. package/static/{chunk-WI7FOANP.js → chunk-LUWQFIWR.js} +1 -1
  328. package/static/{chunk-BIUNUYZ5.js → chunk-ORMRCEGT.js} +1 -1
  329. package/static/{chunk-IZL7JPTS.js → chunk-Q7D6RN4N.js} +1 -1
  330. package/static/{chunk-JYXLQRHG.js → chunk-QJX6ITLW.js} +1 -1
  331. package/static/{chunk-YJMN3B4N.js → chunk-QQ6UQQBR.js} +1 -1
  332. package/static/chunk-S2HDY3OL.js +1 -0
  333. package/static/{chunk-NE4NDO45.js → chunk-S75P2FFI.js} +1 -1
  334. package/static/{chunk-CRQNEHTX.js → chunk-T3EYFSVZ.js} +1 -1
  335. package/static/{chunk-MCLQFZ3S.js → chunk-U34OZUZ7.js} +1 -1
  336. package/static/chunk-Y7EH7G5K.js +1 -0
  337. package/static/{chunk-MGGT6MIJ.js → chunk-ZQQPUYLU.js} +1 -1
  338. package/static/index.html +2 -2
  339. package/static/main-7SQDDVMD.js +9 -0
  340. package/static/{styles-FYUSO6OJ.css → styles-A5VYX3CE.css} +1 -1
  341. package/server/applications/users/dto/user-password.dto.js.map +0 -1
  342. package/static/chunk-4U5A2DEP.js +0 -4
  343. package/static/chunk-54EAZ2UD.js +0 -1
  344. package/static/chunk-7ZRXJONB.js +0 -1
  345. package/static/chunk-F2J2IIJE.js +0 -1
  346. package/static/chunk-FNFGUIQH.js +0 -4
  347. package/static/chunk-GGLK52CG.js +0 -1
  348. package/static/chunk-HW2H3ISM.js +0 -559
  349. package/static/chunk-HX6BBYVD.js +0 -1
  350. package/static/chunk-JF7S3UYQ.js +0 -1
  351. package/static/chunk-KSHPKI4G.js +0 -1
  352. package/static/chunk-VPJ2V27B.js +0 -1
  353. package/static/chunk-VUI3KV7V.js +0 -1
  354. package/static/chunk-ZXS4V7J2.js +0 -1
  355. package/static/main-FFIWFD2F.js +0 -7
@@ -16,9 +16,18 @@ _export(exports, {
16
16
  get AuthConfig () {
17
17
  return AuthConfig;
18
18
  },
19
+ get AuthMethodLdapAttributesConfig () {
20
+ return AuthMethodLdapAttributesConfig;
21
+ },
19
22
  get AuthMethodLdapConfig () {
20
23
  return AuthMethodLdapConfig;
21
24
  },
25
+ get AuthMfaConfig () {
26
+ return AuthMfaConfig;
27
+ },
28
+ get AuthMfaTotpConfig () {
29
+ return AuthMfaTotpConfig;
30
+ },
22
31
  get AuthTokenAccessConfig () {
23
32
  return AuthTokenAccessConfig;
24
33
  },
@@ -37,7 +46,9 @@ _export(exports, {
37
46
  });
38
47
  const _classtransformer = require("class-transformer");
39
48
  const _classvalidator = require("class-validator");
49
+ const _appconstants = require("../app.constants");
40
50
  const _auth = require("./constants/auth");
51
+ const _authldap = require("./constants/auth-ldap");
41
52
  function _ts_decorate(decorators, target, key, desc) {
42
53
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
43
54
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -47,16 +58,42 @@ function _ts_decorate(decorators, target, key, desc) {
47
58
  function _ts_metadata(k, v) {
48
59
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
49
60
  }
61
+ let AuthMfaTotpConfig = class AuthMfaTotpConfig {
62
+ constructor(){
63
+ this.enabled = true;
64
+ this.issuer = _appconstants.SERVER_NAME;
65
+ }
66
+ };
67
+ _ts_decorate([
68
+ (0, _classvalidator.IsBoolean)()
69
+ ], AuthMfaTotpConfig.prototype, "enabled", void 0);
70
+ _ts_decorate([
71
+ (0, _classvalidator.IsString)()
72
+ ], AuthMfaTotpConfig.prototype, "issuer", void 0);
73
+ let AuthMfaConfig = class AuthMfaConfig {
74
+ constructor(){
75
+ this.totp = new AuthMfaTotpConfig();
76
+ }
77
+ };
78
+ _ts_decorate([
79
+ (0, _classvalidator.IsDefined)(),
80
+ (0, _classvalidator.IsNotEmptyObject)(),
81
+ (0, _classvalidator.IsObject)(),
82
+ (0, _classvalidator.ValidateNested)(),
83
+ (0, _classtransformer.Type)(()=>AuthMfaTotpConfig),
84
+ _ts_metadata("design:type", typeof AuthMfaTotpConfig === "undefined" ? Object : AuthMfaTotpConfig)
85
+ ], AuthMfaConfig.prototype, "totp", void 0);
50
86
  let AuthTokenAccessConfig = class AuthTokenAccessConfig {
51
87
  constructor(){
52
- this.name = 'sync-in-access';
88
+ this.// force default name
89
+ name = _auth.ACCESS_KEY;
53
90
  this.expiration = '30m';
54
- this.cookieMaxAge = '30m';
55
91
  }
56
92
  };
57
93
  _ts_decorate([
58
- (0, _classvalidator.IsString)(),
59
- (0, _classvalidator.IsNotEmpty)()
94
+ (0, _classtransformer.Exclude)({
95
+ toClassOnly: true
96
+ })
60
97
  ], AuthTokenAccessConfig.prototype, "name", void 0);
61
98
  _ts_decorate([
62
99
  (0, _classvalidator.IsString)(),
@@ -67,20 +104,17 @@ _ts_decorate([
67
104
  (0, _classvalidator.IsString)(),
68
105
  (0, _classvalidator.IsNotEmpty)()
69
106
  ], AuthTokenAccessConfig.prototype, "expiration", void 0);
70
- _ts_decorate([
71
- (0, _classvalidator.IsNotEmpty)(),
72
- (0, _classvalidator.IsString)()
73
- ], AuthTokenAccessConfig.prototype, "cookieMaxAge", void 0);
74
107
  let AuthTokenRefreshConfig = class AuthTokenRefreshConfig {
75
108
  constructor(){
76
- this.name = 'sync-in-refresh';
109
+ this.// force default name
110
+ name = _auth.REFRESH_KEY;
77
111
  this.expiration = '4h';
78
- this.cookieMaxAge = '4h';
79
112
  }
80
113
  };
81
114
  _ts_decorate([
82
- (0, _classvalidator.IsString)(),
83
- (0, _classvalidator.IsNotEmpty)()
115
+ (0, _classtransformer.Exclude)({
116
+ toClassOnly: true
117
+ })
84
118
  ], AuthTokenRefreshConfig.prototype, "name", void 0);
85
119
  _ts_decorate([
86
120
  (0, _classvalidator.IsString)(),
@@ -91,10 +125,6 @@ _ts_decorate([
91
125
  (0, _classvalidator.IsString)(),
92
126
  (0, _classvalidator.IsNotEmpty)()
93
127
  ], AuthTokenRefreshConfig.prototype, "expiration", void 0);
94
- _ts_decorate([
95
- (0, _classvalidator.IsNotEmpty)(),
96
- (0, _classvalidator.IsString)()
97
- ], AuthTokenRefreshConfig.prototype, "cookieMaxAge", void 0);
98
128
  let AuthTokenCsrfConfig = class AuthTokenCsrfConfig extends AuthTokenRefreshConfig {
99
129
  constructor(...args){
100
130
  super(...args), this.name = _auth.CSRF_KEY;
@@ -149,9 +179,28 @@ _ts_decorate([
149
179
  (0, _classtransformer.Type)(()=>AuthTokenWSConfig),
150
180
  _ts_metadata("design:type", typeof AuthTokenWSConfig === "undefined" ? Object : AuthTokenWSConfig)
151
181
  ], AuthTokenConfig.prototype, "ws", void 0);
182
+ let AuthMethodLdapAttributesConfig = class AuthMethodLdapAttributesConfig {
183
+ constructor(){
184
+ this.login = _authldap.LDAP_LOGIN_ATTR.UID;
185
+ this.email = _authldap.LDAP_COMMON_ATTR.MAIL;
186
+ }
187
+ };
188
+ _ts_decorate([
189
+ (0, _classvalidator.IsOptional)(),
190
+ (0, _classvalidator.IsString)(),
191
+ (0, _classtransformer.Transform)(({ value })=>value || _authldap.LDAP_LOGIN_ATTR.UID),
192
+ (0, _classvalidator.IsEnum)(_authldap.LDAP_LOGIN_ATTR),
193
+ _ts_metadata("design:type", typeof _authldap.LDAP_LOGIN_ATTR === "undefined" ? Object : _authldap.LDAP_LOGIN_ATTR)
194
+ ], AuthMethodLdapAttributesConfig.prototype, "login", void 0);
195
+ _ts_decorate([
196
+ (0, _classvalidator.IsOptional)(),
197
+ (0, _classvalidator.IsString)(),
198
+ (0, _classtransformer.Transform)(({ value })=>value || _authldap.LDAP_COMMON_ATTR.MAIL),
199
+ _ts_metadata("design:type", String)
200
+ ], AuthMethodLdapAttributesConfig.prototype, "email", void 0);
152
201
  let AuthMethodLdapConfig = class AuthMethodLdapConfig {
153
202
  constructor(){
154
- this.loginAttribute = 'uid';
203
+ this.attributes = new AuthMethodLdapAttributesConfig();
155
204
  }
156
205
  };
157
206
  _ts_decorate([
@@ -174,17 +223,18 @@ _ts_decorate([
174
223
  _ts_metadata("design:type", String)
175
224
  ], AuthMethodLdapConfig.prototype, "filter", void 0);
176
225
  _ts_decorate([
177
- (0, _classvalidator.IsString)(),
178
- (0, _classvalidator.IsNotEmpty)(),
179
- (0, _classvalidator.IsIn)([
180
- 'uid',
181
- 'mail'
182
- ])
183
- ], AuthMethodLdapConfig.prototype, "loginAttribute", void 0);
226
+ (0, _classvalidator.IsDefined)(),
227
+ (0, _classvalidator.IsNotEmptyObject)(),
228
+ (0, _classvalidator.IsObject)(),
229
+ (0, _classvalidator.ValidateNested)(),
230
+ (0, _classtransformer.Type)(()=>AuthMethodLdapAttributesConfig),
231
+ _ts_metadata("design:type", typeof AuthMethodLdapAttributesConfig === "undefined" ? Object : AuthMethodLdapAttributesConfig)
232
+ ], AuthMethodLdapConfig.prototype, "attributes", void 0);
184
233
  let AuthConfig = class AuthConfig {
185
234
  constructor(){
186
235
  this.method = 'mysql';
187
- this.sameSite = 'strict';
236
+ this.mfa = new AuthMfaConfig();
237
+ this.cookieSameSite = 'strict';
188
238
  }
189
239
  };
190
240
  _ts_decorate([
@@ -195,6 +245,19 @@ _ts_decorate([
195
245
  ]),
196
246
  _ts_metadata("design:type", String)
197
247
  ], AuthConfig.prototype, "method", void 0);
248
+ _ts_decorate([
249
+ (0, _classvalidator.IsOptional)(),
250
+ (0, _classvalidator.IsString)(),
251
+ _ts_metadata("design:type", String)
252
+ ], AuthConfig.prototype, "encryptionKey", void 0);
253
+ _ts_decorate([
254
+ (0, _classvalidator.IsDefined)(),
255
+ (0, _classvalidator.IsNotEmptyObject)(),
256
+ (0, _classvalidator.IsObject)(),
257
+ (0, _classvalidator.ValidateNested)(),
258
+ (0, _classtransformer.Type)(()=>AuthMfaConfig),
259
+ _ts_metadata("design:type", typeof AuthMfaConfig === "undefined" ? Object : AuthMfaConfig)
260
+ ], AuthConfig.prototype, "mfa", void 0);
198
261
  _ts_decorate([
199
262
  (0, _classvalidator.IsString)(),
200
263
  (0, _classvalidator.IsIn)([
@@ -202,7 +265,7 @@ _ts_decorate([
202
265
  'strict'
203
266
  ]),
204
267
  _ts_metadata("design:type", String)
205
- ], AuthConfig.prototype, "sameSite", void 0);
268
+ ], AuthConfig.prototype, "cookieSameSite", void 0);
206
269
  _ts_decorate([
207
270
  (0, _classvalidator.IsDefined)(),
208
271
  (0, _classvalidator.IsNotEmptyObject)(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/authentication/auth.config.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 { Transform, Type } from 'class-transformer'\nimport {\n ArrayNotEmpty,\n IsArray,\n IsDefined,\n IsIn,\n IsNotEmpty,\n IsNotEmptyObject,\n IsObject,\n IsOptional,\n IsString,\n ValidateIf,\n ValidateNested\n} from 'class-validator'\nimport { CSRF_KEY, WS_KEY } from './constants/auth'\n\nexport class AuthTokenAccessConfig {\n @IsString()\n @IsNotEmpty()\n name = 'sync-in-access'\n\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsString()\n @IsNotEmpty()\n expiration = '30m'\n\n @IsNotEmpty()\n @IsString()\n cookieMaxAge = '30m'\n}\n\nexport class AuthTokenRefreshConfig {\n @IsString()\n @IsNotEmpty()\n name = 'sync-in-refresh'\n\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsString()\n @IsNotEmpty()\n expiration = '4h'\n\n @IsNotEmpty()\n @IsString()\n cookieMaxAge = '4h'\n}\n\nexport class AuthTokenCsrfConfig extends AuthTokenRefreshConfig {\n @IsString()\n @IsNotEmpty()\n override name: string = CSRF_KEY\n}\n\nexport class AuthTokenWSConfig extends AuthTokenRefreshConfig {\n @IsString()\n @IsNotEmpty()\n override name: string = WS_KEY\n}\n\nexport class AuthTokenConfig {\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenAccessConfig)\n access: AuthTokenAccessConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenRefreshConfig)\n refresh: AuthTokenRefreshConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenCsrfConfig)\n csrf: AuthTokenCsrfConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenWSConfig)\n ws: AuthTokenWSConfig\n}\n\nexport class AuthMethodLdapConfig {\n @Transform(({ value }) => (Array.isArray(value) ? value.filter((v: string) => Boolean(v)) : value))\n @ArrayNotEmpty()\n @IsArray()\n @IsString({ each: true })\n servers: string[]\n\n @IsString()\n @IsNotEmpty()\n baseDN: string\n\n @IsOptional()\n @IsString()\n filter?: string\n\n @IsString()\n @IsNotEmpty()\n @IsIn(['uid', 'mail'])\n loginAttribute = 'uid'\n}\n\nexport class AuthConfig {\n @IsString()\n @IsIn(['mysql', 'ldap'])\n method: 'mysql' | 'ldap' = 'mysql'\n\n @IsString()\n @IsIn(['lax', 'strict'])\n sameSite: 'lax' | 'strict' = 'strict'\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenConfig)\n token: AuthTokenConfig\n\n @ValidateIf((o: AuthConfig) => o.method === 'ldap')\n @IsDefined()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthMethodLdapConfig)\n ldap: AuthMethodLdapConfig\n}\n"],"names":["AuthConfig","AuthMethodLdapConfig","AuthTokenAccessConfig","AuthTokenConfig","AuthTokenCsrfConfig","AuthTokenRefreshConfig","AuthTokenWSConfig","name","expiration","cookieMaxAge","CSRF_KEY","WS_KEY","loginAttribute","value","Array","isArray","filter","v","Boolean","each","method","sameSite","o"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAqHYA;eAAAA;;QArBAC;eAAAA;;QA9EAC;eAAAA;;QAgDAC;eAAAA;;QAZAC;eAAAA;;QAlBAC;eAAAA;;QAwBAC;eAAAA;;;kCA1DmB;gCAazB;sBAC0B;;;;;;;;;;AAE1B,IAAA,AAAMJ,wBAAN,MAAMA;;aAGXK,OAAO;aAQPC,aAAa;aAIbC,eAAe;;AACjB;;;;;;;;;;;;;;;;;;AAEO,IAAA,AAAMJ,yBAAN,MAAMA;;aAGXE,OAAO;aAQPC,aAAa;aAIbC,eAAe;;AACjB;;;;;;;;;;;;;;;;;;AAEO,IAAA,AAAML,sBAAN,MAAMA,4BAA4BC;;QAAlC,qBAGIE,OAAeG,cAAQ;;AAClC;;;;;;AAEO,IAAA,AAAMJ,oBAAN,MAAMA,0BAA0BD;;QAAhC,qBAGIE,OAAeI,YAAM;;AAChC;;;;;;AAEO,IAAA,AAAMR,kBAAN,MAAMA;AA4Bb;;;;;;oCAvBcD;;;;;;;;oCAOAG;;;;;;;;oCAOAD;;;;;;;;oCAOAE;;;AAIP,IAAA,AAAML,uBAAN,MAAMA;;aAkBXW,iBAAiB;;AACnB;;sCAlBc,EAAEC,KAAK,EAAE,GAAMC,MAAMC,OAAO,CAACF,SAASA,MAAMG,MAAM,CAAC,CAACC,IAAcC,QAAQD,MAAMJ;;;;QAGhFM,MAAM;;;;;;;;;;;;;;;;;;QAaX;QAAO;;;AAIT,IAAA,AAAMnB,aAAN,MAAMA;;aAGXoB,SAA2B;aAI3BC,WAA6B;;AAe/B;;;;QApBS;QAAS;;;;;;;QAIT;QAAO;;;;;;;;;oCAOFlB;;;;qCAGCmB,IAAkBA,EAAEF,MAAM,KAAK;;;;oCAIhCnB"}
1
+ {"version":3,"sources":["../../../backend/src/authentication/auth.config.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 { Exclude, Transform, Type } from 'class-transformer'\nimport {\n ArrayNotEmpty,\n IsArray,\n IsBoolean,\n IsDefined,\n IsEnum,\n IsIn,\n IsNotEmpty,\n IsNotEmptyObject,\n IsObject,\n IsOptional,\n IsString,\n ValidateIf,\n ValidateNested\n} from 'class-validator'\nimport { SERVER_NAME } from '../app.constants'\nimport { ACCESS_KEY, CSRF_KEY, REFRESH_KEY, WS_KEY } from './constants/auth'\nimport { LDAP_COMMON_ATTR, LDAP_LOGIN_ATTR } from './constants/auth-ldap'\n\nexport class AuthMfaTotpConfig {\n @IsBoolean()\n enabled = true\n\n @IsString()\n issuer = SERVER_NAME\n}\n\nexport class AuthMfaConfig {\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthMfaTotpConfig)\n totp: AuthMfaTotpConfig = new AuthMfaTotpConfig()\n}\n\nexport class AuthTokenAccessConfig {\n @Exclude({ toClassOnly: true })\n // force default name\n name = ACCESS_KEY\n\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsString()\n @IsNotEmpty()\n expiration = '30m'\n}\n\nexport class AuthTokenRefreshConfig {\n @Exclude({ toClassOnly: true })\n // force default name\n name = REFRESH_KEY\n\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsString()\n @IsNotEmpty()\n expiration = '4h'\n}\n\nexport class AuthTokenCsrfConfig extends AuthTokenRefreshConfig {\n @IsString()\n @IsNotEmpty()\n override name: string = CSRF_KEY\n}\n\nexport class AuthTokenWSConfig extends AuthTokenRefreshConfig {\n @IsString()\n @IsNotEmpty()\n override name: string = WS_KEY\n}\n\nexport class AuthTokenConfig {\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenAccessConfig)\n access: AuthTokenAccessConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenRefreshConfig)\n refresh: AuthTokenRefreshConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenCsrfConfig)\n csrf: AuthTokenCsrfConfig\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenWSConfig)\n ws: AuthTokenWSConfig\n}\n\nexport class AuthMethodLdapAttributesConfig {\n @IsOptional()\n @IsString()\n @Transform(({ value }) => value || LDAP_LOGIN_ATTR.UID)\n @IsEnum(LDAP_LOGIN_ATTR)\n login: LDAP_LOGIN_ATTR = LDAP_LOGIN_ATTR.UID\n\n @IsOptional()\n @IsString()\n @Transform(({ value }) => value || LDAP_COMMON_ATTR.MAIL)\n email: string = LDAP_COMMON_ATTR.MAIL\n}\n\nexport class AuthMethodLdapConfig {\n @Transform(({ value }) => (Array.isArray(value) ? value.filter((v: string) => Boolean(v)) : value))\n @ArrayNotEmpty()\n @IsArray()\n @IsString({ each: true })\n servers: string[]\n\n @IsString()\n @IsNotEmpty()\n baseDN: string\n\n @IsOptional()\n @IsString()\n filter?: string\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthMethodLdapAttributesConfig)\n attributes: AuthMethodLdapAttributesConfig = new AuthMethodLdapAttributesConfig()\n}\n\nexport class AuthConfig {\n @IsString()\n @IsIn(['mysql', 'ldap'])\n method: 'mysql' | 'ldap' = 'mysql'\n\n @IsOptional()\n @IsString()\n encryptionKey: string\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthMfaConfig)\n mfa: AuthMfaConfig = new AuthMfaConfig()\n\n @IsString()\n @IsIn(['lax', 'strict'])\n cookieSameSite: 'lax' | 'strict' = 'strict'\n\n @IsDefined()\n @IsNotEmptyObject()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthTokenConfig)\n token: AuthTokenConfig\n\n @ValidateIf((o: AuthConfig) => o.method === 'ldap')\n @IsDefined()\n @IsObject()\n @ValidateNested()\n @Type(() => AuthMethodLdapConfig)\n ldap: AuthMethodLdapConfig\n}\n"],"names":["AuthConfig","AuthMethodLdapAttributesConfig","AuthMethodLdapConfig","AuthMfaConfig","AuthMfaTotpConfig","AuthTokenAccessConfig","AuthTokenConfig","AuthTokenCsrfConfig","AuthTokenRefreshConfig","AuthTokenWSConfig","enabled","issuer","SERVER_NAME","totp","name","ACCESS_KEY","expiration","toClassOnly","REFRESH_KEY","CSRF_KEY","WS_KEY","login","LDAP_LOGIN_ATTR","UID","email","LDAP_COMMON_ATTR","MAIL","value","attributes","Array","isArray","filter","v","Boolean","each","method","mfa","cookieSameSite","o"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAiJYA;eAAAA;;QApCAC;eAAAA;;QAaAC;eAAAA;;QA5FAC;eAAAA;;QARAC;eAAAA;;QAiBAC;eAAAA;;QAwCAC;eAAAA;;QAZAC;eAAAA;;QAdAC;eAAAA;;QAoBAC;eAAAA;;;kCAvE4B;gCAelC;8BACqB;sBAC8B;0BACR;;;;;;;;;;AAE3C,IAAA,AAAML,oBAAN,MAAMA;;aAEXM,UAAU;aAGVC,SAASC,yBAAW;;AACtB;;;;;;;AAEO,IAAA,AAAMT,gBAAN,MAAMA;;aAMXU,OAA0B,IAAIT;;AAChC;;;;;;oCAFcA;;;AAIP,IAAA,AAAMC,wBAAN,MAAMA;;aAEX,qBAAqB;QACrBS,OAAOC,gBAAU;aAQjBC,aAAa;;AACf;;;QAXaC,aAAa;;;;;;;;;;;;AAanB,IAAA,AAAMT,yBAAN,MAAMA;;aAEX,qBAAqB;QACrBM,OAAOI,iBAAW;aAQlBF,aAAa;;AACf;;;QAXaC,aAAa;;;;;;;;;;;;AAanB,IAAA,AAAMV,sBAAN,MAAMA,4BAA4BC;;QAAlC,qBAGIM,OAAeK,cAAQ;;AAClC;;;;;;AAEO,IAAA,AAAMV,oBAAN,MAAMA,0BAA0BD;;QAAhC,qBAGIM,OAAeM,YAAM;;AAChC;;;;;;AAEO,IAAA,AAAMd,kBAAN,MAAMA;AA4Bb;;;;;;oCAvBcD;;;;;;;;oCAOAG;;;;;;;;oCAOAD;;;;;;;;oCAOAE;;;AAIP,IAAA,AAAMR,iCAAN,MAAMA;;aAKXoB,QAAyBC,yBAAe,CAACC,GAAG;aAK5CC,QAAgBC,0BAAgB,CAACC,IAAI;;AACvC;;;;sCARc,EAAEC,KAAK,EAAE,GAAKA,SAASL,yBAAe,CAACC,GAAG;;;;;;;sCAM1C,EAAEI,KAAK,EAAE,GAAKA,SAASF,0BAAgB,CAACC,IAAI;;;AAInD,IAAA,AAAMxB,uBAAN,MAAMA;;aAoBX0B,aAA6C,IAAI3B;;AACnD;;sCApBc,EAAE0B,KAAK,EAAE,GAAME,MAAMC,OAAO,CAACH,SAASA,MAAMI,MAAM,CAAC,CAACC,IAAcC,QAAQD,MAAML;;;;QAGhFO,MAAM;;;;;;;;;;;;;;;;;;;oCAeNjC;;;AAIP,IAAA,AAAMD,aAAN,MAAMA;;aAGXmC,SAA2B;aAW3BC,MAAqB,IAAIjC;aAIzBkC,iBAAmC;;AAerC;;;;QA/BS;QAAS;;;;;;;;;;;;;;oCAWJlC;;;;;;QAIL;QAAO;;;;;;;;;oCAOFG;;;;qCAGCgC,IAAkBA,EAAEH,MAAM,KAAK;;;;oCAIhCjC"}
@@ -14,13 +14,22 @@ Object.defineProperty(exports, "AuthController", {
14
14
  });
15
15
  const _common = require("@nestjs/common");
16
16
  const _fastify = require("fastify");
17
+ const _user = require("../applications/users/constants/user");
18
+ const _rolesdecorator = require("../applications/users/decorators/roles.decorator");
17
19
  const _userdecorator = require("../applications/users/decorators/user.decorator");
20
+ const _rolesguard = require("../applications/users/guards/roles.guard");
18
21
  const _usermodel = require("../applications/users/models/user.model");
22
+ const _auth = require("./constants/auth");
19
23
  const _routes = require("./constants/routes");
20
24
  const _authtokenskipdecorator = require("./decorators/auth-token-skip.decorator");
25
+ const _twofaverifydto = require("./dto/two-fa-verify.dto");
21
26
  const _authlocalguard = require("./guards/auth-local.guard");
22
27
  const _authtokenrefreshguard = require("./guards/auth-token-refresh.guard");
28
+ const _authtwofaguard = require("./guards/auth-two-fa-guard");
29
+ const _authrequestinterface = require("./interfaces/auth-request.interface");
30
+ const _tokeninterface = require("./interfaces/token.interface");
23
31
  const _authmanagerservice = require("./services/auth-manager.service");
32
+ const _authmethodtwofaservice = require("./services/auth-methods/auth-method-two-fa.service");
24
33
  function _ts_decorate(decorators, target, key, desc) {
25
34
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
26
35
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -37,26 +46,56 @@ function _ts_param(paramIndex, decorator) {
37
46
  }
38
47
  let AuthController = class AuthController {
39
48
  login(user, res) {
40
- return this.auth.setCookies(user, res);
49
+ return this.authManager.setCookies(user, res, true);
41
50
  }
42
51
  logout(res) {
43
- return this.auth.clearCookies(res);
52
+ return this.authManager.clearCookies(res);
44
53
  }
45
54
  refreshCookies(user, res) {
46
- return this.auth.refreshCookies(user, res);
55
+ return this.authManager.refreshCookies(user, res);
47
56
  }
48
57
  token(user) {
49
- return this.auth.getTokens(user);
58
+ return this.authManager.getTokens(user);
50
59
  }
51
60
  refreshToken(user) {
52
- return this.auth.getTokens(user, true);
61
+ return this.authManager.getTokens(user, true);
53
62
  }
54
- constructor(auth){
55
- this.auth = auth;
63
+ /* TWO-FA Part */ twoFaInit(user) {
64
+ return this.authMethod2FA.initTwoFactor(user);
65
+ }
66
+ twoFaEnable(body, req) {
67
+ return this.authMethod2FA.enableTwoFactor(body, req);
68
+ }
69
+ twoFaDisable(body, req) {
70
+ return this.authMethod2FA.disableTwoFactor(body, req);
71
+ }
72
+ async twoFaLogin(body, req, res) {
73
+ const [authStatus, user] = await this.authMethod2FA.verify(body, req, true);
74
+ if (authStatus.success) {
75
+ const loginResponseDto = await this.authManager.setCookies(user, res);
76
+ // clear the temporary 2FA cookie
77
+ res.clearCookie(_auth.ACCESS_KEY, {
78
+ path: _auth.TOKEN_PATHS[_tokeninterface.TOKEN_TYPE.ACCESS_2FA],
79
+ httpOnly: true
80
+ });
81
+ return {
82
+ ...loginResponseDto,
83
+ ...authStatus
84
+ };
85
+ }
86
+ return authStatus;
87
+ }
88
+ twoFaReset(userId) {
89
+ return this.authMethod2FA.adminResetUserTwoFa(userId);
90
+ }
91
+ constructor(authManager, authMethod2FA){
92
+ this.authManager = authManager;
93
+ this.authMethod2FA = authMethod2FA;
56
94
  }
57
95
  };
58
96
  _ts_decorate([
59
97
  (0, _common.Post)(_routes.AUTH_ROUTE.LOGIN),
98
+ (0, _authtokenskipdecorator.AuthTokenSkip)(),
60
99
  (0, _common.UseGuards)(_authlocalguard.AuthLocalGuard),
61
100
  _ts_param(0, (0, _userdecorator.GetUser)()),
62
101
  _ts_param(1, (0, _common.Res)({
@@ -71,6 +110,7 @@ _ts_decorate([
71
110
  ], AuthController.prototype, "login", null);
72
111
  _ts_decorate([
73
112
  (0, _common.Post)(_routes.AUTH_ROUTE.LOGOUT),
113
+ (0, _authtokenskipdecorator.AuthTokenSkip)(),
74
114
  _ts_param(0, (0, _common.Res)({
75
115
  passthrough: true
76
116
  })),
@@ -82,6 +122,7 @@ _ts_decorate([
82
122
  ], AuthController.prototype, "logout", null);
83
123
  _ts_decorate([
84
124
  (0, _common.Post)(_routes.AUTH_ROUTE.REFRESH),
125
+ (0, _authtokenskipdecorator.AuthTokenSkip)(),
85
126
  (0, _common.UseGuards)(_authtokenrefreshguard.AuthTokenRefreshGuard),
86
127
  _ts_param(0, (0, _userdecorator.GetUser)()),
87
128
  _ts_param(1, (0, _common.Res)({
@@ -96,6 +137,7 @@ _ts_decorate([
96
137
  ], AuthController.prototype, "refreshCookies", null);
97
138
  _ts_decorate([
98
139
  (0, _common.Post)(_routes.AUTH_ROUTE.TOKEN),
140
+ (0, _authtokenskipdecorator.AuthTokenSkip)(),
99
141
  (0, _common.UseGuards)(_authlocalguard.AuthLocalGuard),
100
142
  _ts_param(0, (0, _userdecorator.GetUser)()),
101
143
  _ts_metadata("design:type", Function),
@@ -106,6 +148,7 @@ _ts_decorate([
106
148
  ], AuthController.prototype, "token", null);
107
149
  _ts_decorate([
108
150
  (0, _common.Post)(_routes.AUTH_ROUTE.TOKEN_REFRESH),
151
+ (0, _authtokenskipdecorator.AuthTokenSkip)(),
109
152
  (0, _common.UseGuards)(_authtokenrefreshguard.AuthTokenRefreshGuard),
110
153
  _ts_param(0, (0, _userdecorator.GetUser)()),
111
154
  _ts_metadata("design:type", Function),
@@ -114,12 +157,77 @@ _ts_decorate([
114
157
  ]),
115
158
  _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
116
159
  ], AuthController.prototype, "refreshToken", null);
160
+ _ts_decorate([
161
+ (0, _common.Get)(`${_routes.AUTH_ROUTE.TWO_FA_BASE}/${_routes.AUTH_ROUTE.TWO_FA_ENABLE}`),
162
+ (0, _common.UseGuards)(_rolesguard.UserRolesGuard),
163
+ (0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.USER),
164
+ _ts_param(0, (0, _userdecorator.GetUser)()),
165
+ _ts_metadata("design:type", Function),
166
+ _ts_metadata("design:paramtypes", [
167
+ typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel
168
+ ]),
169
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
170
+ ], AuthController.prototype, "twoFaInit", null);
171
+ _ts_decorate([
172
+ (0, _common.Post)(`${_routes.AUTH_ROUTE.TWO_FA_BASE}/${_routes.AUTH_ROUTE.TWO_FA_ENABLE}`),
173
+ (0, _common.UseGuards)(_rolesguard.UserRolesGuard),
174
+ (0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.USER),
175
+ _ts_param(0, (0, _common.Body)()),
176
+ _ts_param(1, (0, _common.Req)()),
177
+ _ts_metadata("design:type", Function),
178
+ _ts_metadata("design:paramtypes", [
179
+ typeof _twofaverifydto.TwoFaVerifyWithPasswordDto === "undefined" ? Object : _twofaverifydto.TwoFaVerifyWithPasswordDto,
180
+ typeof _authrequestinterface.FastifyAuthenticatedRequest === "undefined" ? Object : _authrequestinterface.FastifyAuthenticatedRequest
181
+ ]),
182
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
183
+ ], AuthController.prototype, "twoFaEnable", null);
184
+ _ts_decorate([
185
+ (0, _common.Post)(`${_routes.AUTH_ROUTE.TWO_FA_BASE}/${_routes.AUTH_ROUTE.TWO_FA_DISABLE}`),
186
+ (0, _common.UseGuards)(_rolesguard.UserRolesGuard),
187
+ (0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.USER),
188
+ _ts_param(0, (0, _common.Body)()),
189
+ _ts_param(1, (0, _common.Req)()),
190
+ _ts_metadata("design:type", Function),
191
+ _ts_metadata("design:paramtypes", [
192
+ typeof _twofaverifydto.TwoFaVerifyWithPasswordDto === "undefined" ? Object : _twofaverifydto.TwoFaVerifyWithPasswordDto,
193
+ typeof _authrequestinterface.FastifyAuthenticatedRequest === "undefined" ? Object : _authrequestinterface.FastifyAuthenticatedRequest
194
+ ]),
195
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
196
+ ], AuthController.prototype, "twoFaDisable", null);
197
+ _ts_decorate([
198
+ (0, _common.Post)(`${_routes.AUTH_ROUTE.TWO_FA_BASE}/${_routes.AUTH_ROUTE.TWO_FA_LOGIN_VERIFY}`),
199
+ (0, _common.UseGuards)(_rolesguard.UserRolesGuard),
200
+ (0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.USER),
201
+ _ts_param(0, (0, _common.Body)()),
202
+ _ts_param(1, (0, _common.Req)()),
203
+ _ts_param(2, (0, _common.Res)({
204
+ passthrough: true
205
+ })),
206
+ _ts_metadata("design:type", Function),
207
+ _ts_metadata("design:paramtypes", [
208
+ typeof _twofaverifydto.TwoFaVerifyDto === "undefined" ? Object : _twofaverifydto.TwoFaVerifyDto,
209
+ typeof _authrequestinterface.FastifyAuthenticatedRequest === "undefined" ? Object : _authrequestinterface.FastifyAuthenticatedRequest,
210
+ typeof _fastify.FastifyReply === "undefined" ? Object : _fastify.FastifyReply
211
+ ]),
212
+ _ts_metadata("design:returntype", Promise)
213
+ ], AuthController.prototype, "twoFaLogin", null);
214
+ _ts_decorate([
215
+ (0, _common.Post)(`${_routes.AUTH_ROUTE.TWO_FA_BASE}/${_routes.AUTH_ROUTE.TWO_FA_ADMIN_RESET_USER}/:id`),
216
+ (0, _common.UseGuards)(_rolesguard.UserRolesGuard, _authtwofaguard.AuthTwoFaGuard),
217
+ (0, _rolesdecorator.UserHaveRole)(_user.USER_ROLE.ADMINISTRATOR),
218
+ _ts_param(0, (0, _common.Param)('id', _common.ParseIntPipe)),
219
+ _ts_metadata("design:type", Function),
220
+ _ts_metadata("design:paramtypes", [
221
+ Number
222
+ ]),
223
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
224
+ ], AuthController.prototype, "twoFaReset", null);
117
225
  AuthController = _ts_decorate([
118
226
  (0, _common.Controller)(_routes.AUTH_ROUTE.BASE),
119
- (0, _authtokenskipdecorator.AuthTokenSkip)(),
120
227
  _ts_metadata("design:type", Function),
121
228
  _ts_metadata("design:paramtypes", [
122
- typeof _authmanagerservice.AuthManager === "undefined" ? Object : _authmanagerservice.AuthManager
229
+ typeof _authmanagerservice.AuthManager === "undefined" ? Object : _authmanagerservice.AuthManager,
230
+ typeof _authmethodtwofaservice.AuthMethod2FA === "undefined" ? Object : _authmethodtwofaservice.AuthMethod2FA
123
231
  ])
124
232
  ], AuthController);
125
233
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/authentication/auth.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Controller, Post, Res, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { GetUser } from '../applications/users/decorators/user.decorator'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { AUTH_ROUTE } from './constants/routes'\nimport { AuthTokenSkip } from './decorators/auth-token-skip.decorator'\nimport { LoginResponseDto } from './dto/login-response.dto'\nimport { TokenResponseDto } from './dto/token-response.dto'\nimport { AuthLocalGuard } from './guards/auth-local.guard'\nimport { AuthTokenRefreshGuard } from './guards/auth-token-refresh.guard'\nimport { AuthManager } from './services/auth-manager.service'\n\n@Controller(AUTH_ROUTE.BASE)\n@AuthTokenSkip()\nexport class AuthController {\n constructor(private readonly auth: AuthManager) {}\n\n @Post(AUTH_ROUTE.LOGIN)\n @UseGuards(AuthLocalGuard)\n login(@GetUser() user: UserModel, @Res({ passthrough: true }) res: FastifyReply): Promise<LoginResponseDto> {\n return this.auth.setCookies(user, res)\n }\n\n @Post(AUTH_ROUTE.LOGOUT)\n logout(@Res({ passthrough: true }) res: FastifyReply) {\n return this.auth.clearCookies(res)\n }\n\n @Post(AUTH_ROUTE.REFRESH)\n @UseGuards(AuthTokenRefreshGuard)\n refreshCookies(@GetUser() user: UserModel, @Res({ passthrough: true }) res: FastifyReply): Promise<TokenResponseDto> {\n return this.auth.refreshCookies(user, res)\n }\n\n @Post(AUTH_ROUTE.TOKEN)\n @UseGuards(AuthLocalGuard)\n token(@GetUser() user: UserModel): Promise<TokenResponseDto> {\n return this.auth.getTokens(user)\n }\n\n @Post(AUTH_ROUTE.TOKEN_REFRESH)\n @UseGuards(AuthTokenRefreshGuard)\n refreshToken(@GetUser() user: UserModel): Promise<TokenResponseDto> {\n return this.auth.getTokens(user, true)\n }\n}\n"],"names":["AuthController","login","user","res","auth","setCookies","logout","clearCookies","refreshCookies","token","getTokens","refreshToken","LOGIN","passthrough","LOGOUT","REFRESH","TOKEN","TOKEN_REFRESH","BASE"],"mappings":"AAAA;;;;CAIC;;;;+BAgBYA;;;eAAAA;;;wBAdoC;yBACpB;+BACL;2BACE;wBACC;wCACG;gCAGC;uCACO;oCACV;;;;;;;;;;;;;;;AAIrB,IAAA,AAAMA,iBAAN,MAAMA;IAKXC,MAAM,AAAWC,IAAe,EAAE,AAA4BC,GAAiB,EAA6B;QAC1G,OAAO,IAAI,CAACC,IAAI,CAACC,UAAU,CAACH,MAAMC;IACpC;IAGAG,OAAO,AAA4BH,GAAiB,EAAE;QACpD,OAAO,IAAI,CAACC,IAAI,CAACG,YAAY,CAACJ;IAChC;IAIAK,eAAe,AAAWN,IAAe,EAAE,AAA4BC,GAAiB,EAA6B;QACnH,OAAO,IAAI,CAACC,IAAI,CAACI,cAAc,CAACN,MAAMC;IACxC;IAIAM,MAAM,AAAWP,IAAe,EAA6B;QAC3D,OAAO,IAAI,CAACE,IAAI,CAACM,SAAS,CAACR;IAC7B;IAIAS,aAAa,AAAWT,IAAe,EAA6B;QAClE,OAAO,IAAI,CAACE,IAAI,CAACM,SAAS,CAACR,MAAM;IACnC;IA7BA,YAAY,AAAiBE,IAAiB,CAAE;aAAnBA,OAAAA;IAAoB;AA8BnD;;yCA5BmBQ;;;;QAEwBC,aAAa;;;;;;;;;;yCAIrCC;;QACHD,aAAa;;;;;;;;;yCAIVE;;;;QAEiCF,aAAa;;;;;;;;;;yCAI9CG;;;;;;;;;;yCAMAC;;;;;;;;;;+CA5BIC"}
1
+ {"version":3,"sources":["../../../backend/src/authentication/auth.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Get, Param, ParseIntPipe, Post, Req, Res, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { USER_ROLE } from '../applications/users/constants/user'\nimport { UserHaveRole } from '../applications/users/decorators/roles.decorator'\nimport { GetUser } from '../applications/users/decorators/user.decorator'\nimport { UserRolesGuard } from '../applications/users/guards/roles.guard'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { ACCESS_KEY, TOKEN_PATHS } from './constants/auth'\nimport { AUTH_ROUTE } from './constants/routes'\nimport { AuthTokenSkip } from './decorators/auth-token-skip.decorator'\nimport { LoginResponseDto, LoginVerify2FaDto, TwoFaResponseDto } from './dto/login-response.dto'\nimport { TokenResponseDto } from './dto/token-response.dto'\nimport { TwoFaVerifyDto, TwoFaVerifyWithPasswordDto } from './dto/two-fa-verify.dto'\nimport { AuthLocalGuard } from './guards/auth-local.guard'\nimport { AuthTokenRefreshGuard } from './guards/auth-token-refresh.guard'\nimport { AuthTwoFaGuard } from './guards/auth-two-fa-guard'\nimport { FastifyAuthenticatedRequest } from './interfaces/auth-request.interface'\nimport { TOKEN_TYPE } from './interfaces/token.interface'\nimport { TwoFaSetup, TwoFaVerifyResult } from './interfaces/two-fa-setup.interface'\nimport { AuthManager } from './services/auth-manager.service'\nimport { AuthMethod2FA } from './services/auth-methods/auth-method-two-fa.service'\n\n@Controller(AUTH_ROUTE.BASE)\nexport class AuthController {\n constructor(\n private readonly authManager: AuthManager,\n private readonly authMethod2FA: AuthMethod2FA\n ) {}\n\n @Post(AUTH_ROUTE.LOGIN)\n @AuthTokenSkip()\n @UseGuards(AuthLocalGuard)\n login(@GetUser() user: UserModel, @Res({ passthrough: true }) res: FastifyReply): Promise<LoginResponseDto | LoginVerify2FaDto> {\n return this.authManager.setCookies(user, res, true)\n }\n\n @Post(AUTH_ROUTE.LOGOUT)\n @AuthTokenSkip()\n logout(@Res({ passthrough: true }) res: FastifyReply) {\n return this.authManager.clearCookies(res)\n }\n\n @Post(AUTH_ROUTE.REFRESH)\n @AuthTokenSkip()\n @UseGuards(AuthTokenRefreshGuard)\n refreshCookies(@GetUser() user: UserModel, @Res({ passthrough: true }) res: FastifyReply): Promise<TokenResponseDto> {\n return this.authManager.refreshCookies(user, res)\n }\n\n @Post(AUTH_ROUTE.TOKEN)\n @AuthTokenSkip()\n @UseGuards(AuthLocalGuard)\n token(@GetUser() user: UserModel): Promise<TokenResponseDto> {\n return this.authManager.getTokens(user)\n }\n\n @Post(AUTH_ROUTE.TOKEN_REFRESH)\n @AuthTokenSkip()\n @UseGuards(AuthTokenRefreshGuard)\n refreshToken(@GetUser() user: UserModel): Promise<TokenResponseDto> {\n return this.authManager.getTokens(user, true)\n }\n\n /* TWO-FA Part */\n\n @Get(`${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_ENABLE}`)\n @UseGuards(UserRolesGuard)\n @UserHaveRole(USER_ROLE.USER)\n twoFaInit(@GetUser() user: UserModel): Promise<TwoFaSetup> {\n return this.authMethod2FA.initTwoFactor(user)\n }\n\n @Post(`${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_ENABLE}`)\n @UseGuards(UserRolesGuard)\n @UserHaveRole(USER_ROLE.USER)\n twoFaEnable(@Body() body: TwoFaVerifyWithPasswordDto, @Req() req: FastifyAuthenticatedRequest): Promise<TwoFaVerifyResult> {\n return this.authMethod2FA.enableTwoFactor(body, req)\n }\n\n @Post(`${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_DISABLE}`)\n @UseGuards(UserRolesGuard)\n @UserHaveRole(USER_ROLE.USER)\n twoFaDisable(@Body() body: TwoFaVerifyWithPasswordDto, @Req() req: FastifyAuthenticatedRequest): Promise<TwoFaVerifyResult> {\n return this.authMethod2FA.disableTwoFactor(body, req)\n }\n\n @Post(`${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_LOGIN_VERIFY}`)\n @UseGuards(UserRolesGuard)\n @UserHaveRole(USER_ROLE.USER)\n async twoFaLogin(\n @Body() body: TwoFaVerifyDto,\n @Req() req: FastifyAuthenticatedRequest,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<TwoFaResponseDto | TwoFaVerifyResult> {\n const [authStatus, user] = await this.authMethod2FA.verify(body, req, true)\n if (authStatus.success) {\n const loginResponseDto = await this.authManager.setCookies(user, res)\n // clear the temporary 2FA cookie\n res.clearCookie(ACCESS_KEY, { path: TOKEN_PATHS[TOKEN_TYPE.ACCESS_2FA], httpOnly: true })\n return { ...loginResponseDto, ...authStatus } satisfies TwoFaResponseDto\n }\n return authStatus\n }\n\n @Post(`${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_ADMIN_RESET_USER}/:id`)\n @UseGuards(UserRolesGuard, AuthTwoFaGuard)\n @UserHaveRole(USER_ROLE.ADMINISTRATOR)\n twoFaReset(@Param('id', ParseIntPipe) userId: number): Promise<TwoFaVerifyResult> {\n return this.authMethod2FA.adminResetUserTwoFa(userId)\n }\n}\n"],"names":["AuthController","login","user","res","authManager","setCookies","logout","clearCookies","refreshCookies","token","getTokens","refreshToken","twoFaInit","authMethod2FA","initTwoFactor","twoFaEnable","body","req","enableTwoFactor","twoFaDisable","disableTwoFactor","twoFaLogin","authStatus","verify","success","loginResponseDto","clearCookie","ACCESS_KEY","path","TOKEN_PATHS","TOKEN_TYPE","ACCESS_2FA","httpOnly","twoFaReset","userId","adminResetUserTwoFa","LOGIN","passthrough","LOGOUT","REFRESH","TOKEN","TOKEN_REFRESH","AUTH_ROUTE","TWO_FA_BASE","TWO_FA_ENABLE","USER","TWO_FA_DISABLE","TWO_FA_LOGIN_VERIFY","TWO_FA_ADMIN_RESET_USER","ADMINISTRATOR","BASE"],"mappings":"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"}
@@ -10,7 +10,9 @@ const _config = require("@nestjs/config");
10
10
  const _jwt = require("@nestjs/jwt");
11
11
  const _passport = require("@nestjs/passport");
12
12
  const _testing = require("@nestjs/testing");
13
+ const _notificationsmanagerservice = require("../applications/notifications/services/notifications-manager.service");
13
14
  const _usermodel = require("../applications/users/models/user.model");
15
+ const _usersmanagerservice = require("../applications/users/services/users-manager.service");
14
16
  const _test = require("../applications/users/utils/test");
15
17
  const _functions = require("../common/functions");
16
18
  const _shared = require("../common/shared");
@@ -18,9 +20,12 @@ const _configenvironment = require("../configuration/config.environment");
18
20
  const _cacheservice = require("../infrastructure/cache/services/cache.service");
19
21
  const _constants = require("../infrastructure/database/constants");
20
22
  const _authcontroller = require("./auth.controller");
23
+ const _auth = require("./constants/auth");
21
24
  const _loginresponsedto = require("./dto/login-response.dto");
25
+ const _authtwofaguard = require("./guards/auth-two-fa-guard");
22
26
  const _tokeninterface = require("./interfaces/token.interface");
23
27
  const _authmanagerservice = require("./services/auth-manager.service");
28
+ const _authmethodtwofaservice = require("./services/auth-methods/auth-method-two-fa.service");
24
29
  describe(_authcontroller.AuthController.name, ()=>{
25
30
  let module;
26
31
  let authController;
@@ -44,6 +49,8 @@ describe(_authcontroller.AuthController.name, ()=>{
44
49
  _config.ConfigService,
45
50
  _authmanagerservice.AuthManager,
46
51
  _jwt.JwtService,
52
+ _authmethodtwofaservice.AuthMethod2FA,
53
+ _authtwofaguard.AuthTwoFaGuard,
47
54
  {
48
55
  provide: _constants.DB_TOKEN_PROVIDER,
49
56
  useValue: {}
@@ -51,6 +58,14 @@ describe(_authcontroller.AuthController.name, ()=>{
51
58
  {
52
59
  provide: _cacheservice.Cache,
53
60
  useValue: {}
61
+ },
62
+ {
63
+ provide: _usersmanagerservice.UsersManager,
64
+ useValue: {}
65
+ },
66
+ {
67
+ provide: _notificationsmanagerservice.NotificationsManager,
68
+ useValue: {}
54
69
  }
55
70
  ]
56
71
  }).compile();
@@ -88,7 +103,7 @@ describe(_authcontroller.AuthController.name, ()=>{
88
103
  clearCookie: jest.fn()
89
104
  };
90
105
  await expect(authController.logout(res)).resolves.not.toThrow();
91
- expect(res.clearCookie).toHaveBeenCalledTimes(4);
106
+ expect(res.clearCookie).toHaveBeenCalledTimes(Object.keys(_auth.TOKEN_PATHS).length);
92
107
  });
93
108
  it('should refresh JWT in cookies', async ()=>{
94
109
  userTest.exp = (0, _shared.currentTimeStamp)() + (0, _functions.convertHumanTimeToSeconds)('30s');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/authentication/auth.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { ConfigModule, ConfigService } from '@nestjs/config'\nimport { JwtService } from '@nestjs/jwt'\nimport { PassportModule } from '@nestjs/passport'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { generateUserTest } from '../applications/users/utils/test'\nimport { convertHumanTimeToSeconds } from '../common/functions'\nimport { currentTimeStamp } from '../common/shared'\nimport { exportConfiguration } from '../configuration/config.environment'\nimport { Cache } from '../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../infrastructure/database/constants'\nimport { AuthConfig } from './auth.config'\nimport { AuthController } from './auth.controller'\nimport { LoginResponseDto } from './dto/login-response.dto'\nimport { TOKEN_TYPE } from './interfaces/token.interface'\nimport { AuthManager } from './services/auth-manager.service'\n\ndescribe(AuthController.name, () => {\n let module: TestingModule\n let authController: AuthController\n let authConfig: AuthConfig\n let userTest: UserModel\n\n beforeAll(async () => {\n module = await Test.createTestingModule({\n imports: [await ConfigModule.forRoot({ load: [exportConfiguration], isGlobal: true }), PassportModule],\n controllers: [AuthController],\n providers: [ConfigService, AuthManager, JwtService, { provide: DB_TOKEN_PROVIDER, useValue: {} }, { provide: Cache, useValue: {} }]\n }).compile()\n\n module.useLogger(['fatal'])\n authConfig = module.get<ConfigService>(ConfigService).get<AuthConfig>('auth')\n authController = module.get<AuthController>(AuthController)\n userTest = new UserModel({ ...generateUserTest(), id: 888 }, false)\n })\n\n afterAll(async () => {\n await module.close()\n })\n\n it('should be defined', () => {\n expect(authConfig).toBeDefined()\n expect(authController).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should set JWT in cookies', async () => {\n const res: any = { setCookie: jest.fn() }\n const result = await authController.login(userTest, res)\n expect(result).toBeDefined()\n expect(result).toBeInstanceOf(LoginResponseDto)\n expect(res.setCookie).toHaveBeenCalledTimes(4)\n expect(result.token.access_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(), -1)\n expect(result.token.refresh_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.refresh.expiration) + currentTimeStamp(), -1)\n })\n\n it('should clear JWT in cookies', async () => {\n const res: any = { clearCookie: jest.fn() }\n await expect(authController.logout(res)).resolves.not.toThrow()\n expect(res.clearCookie).toHaveBeenCalledTimes(4)\n })\n\n it('should refresh JWT in cookies', async () => {\n userTest.exp = currentTimeStamp() + convertHumanTimeToSeconds('30s')\n const res: any = { setCookie: jest.fn() }\n const result = await authController.refreshCookies(userTest, res)\n expect(result).toBeDefined()\n expect(res.setCookie).toHaveBeenCalledTimes(4)\n expect(result.access_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(), -1)\n expect(result.refresh_expiration).toBe(userTest.exp)\n })\n\n it('should not refresh JWT in cookies', async () => {\n userTest.exp = currentTimeStamp() - 1\n const res: any = { setCookie: jest.fn() }\n await expect(authController.refreshCookies(userTest, res)).rejects.toThrow()\n })\n\n it('should get JWT in response body', async () => {\n const result = await authController.token(userTest)\n expect(result[TOKEN_TYPE.ACCESS]).toBeDefined()\n expect(result[TOKEN_TYPE.REFRESH]).toBeDefined()\n expect(result[`${TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(),\n -1\n )\n expect(result[`${TOKEN_TYPE.REFRESH}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.refresh.expiration) + currentTimeStamp(),\n -1\n )\n })\n\n it('should refresh JWT in response body', async () => {\n userTest.exp = currentTimeStamp() + convertHumanTimeToSeconds('30s')\n const result = await authController.refreshToken(userTest)\n expect(result[TOKEN_TYPE.ACCESS]).toBeDefined()\n expect(result[TOKEN_TYPE.REFRESH]).toBeDefined()\n expect(result[`${TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(),\n -1\n )\n expect(result[`${TOKEN_TYPE.REFRESH}_expiration`]).toBe(userTest.exp)\n })\n\n it('should not refresh JWT in response body', async () => {\n userTest.exp = currentTimeStamp() - 1\n await expect(authController.refreshToken(userTest)).rejects.toThrow()\n })\n})\n"],"names":["describe","AuthController","name","module","authController","authConfig","userTest","beforeAll","Test","createTestingModule","imports","ConfigModule","forRoot","load","exportConfiguration","isGlobal","PassportModule","controllers","providers","ConfigService","AuthManager","JwtService","provide","DB_TOKEN_PROVIDER","useValue","Cache","compile","useLogger","get","UserModel","generateUserTest","id","afterAll","close","it","expect","toBeDefined","res","setCookie","jest","fn","result","login","toBeInstanceOf","LoginResponseDto","toHaveBeenCalledTimes","token","access_expiration","toBeCloseTo","convertHumanTimeToSeconds","access","expiration","currentTimeStamp","refresh_expiration","refresh","clearCookie","logout","resolves","not","toThrow","exp","refreshCookies","toBe","rejects","TOKEN_TYPE","ACCESS","REFRESH","refreshToken"],"mappings":"AAAA;;;;CAIC;;;;wBAE2C;qBACjB;0BACI;yBACK;2BACV;sBACO;2BACS;wBACT;mCACG;8BACd;2BACY;gCAEH;kCACE;gCACN;oCACC;AAE5BA,SAASC,8BAAc,CAACC,IAAI,EAAE;IAC5B,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJC,UAAU;QACRJ,SAAS,MAAMK,aAAI,CAACC,mBAAmB,CAAC;YACtCC,SAAS;gBAAC,MAAMC,oBAAY,CAACC,OAAO,CAAC;oBAAEC,MAAM;wBAACC,sCAAmB;qBAAC;oBAAEC,UAAU;gBAAK;gBAAIC,wBAAc;aAAC;YACtGC,aAAa;gBAAChB,8BAAc;aAAC;YAC7BiB,WAAW;gBAACC,qBAAa;gBAAEC,+BAAW;gBAAEC,eAAU;gBAAE;oBAAEC,SAASC,4BAAiB;oBAAEC,UAAU,CAAC;gBAAE;gBAAG;oBAAEF,SAASG,mBAAK;oBAAED,UAAU,CAAC;gBAAE;aAAE;QACrI,GAAGE,OAAO;QAEVvB,OAAOwB,SAAS,CAAC;YAAC;SAAQ;QAC1BtB,aAAaF,OAAOyB,GAAG,CAAgBT,qBAAa,EAAES,GAAG,CAAa;QACtExB,iBAAiBD,OAAOyB,GAAG,CAAiB3B,8BAAc;QAC1DK,WAAW,IAAIuB,oBAAS,CAAC;YAAE,GAAGC,IAAAA,sBAAgB,GAAE;YAAEC,IAAI;QAAI,GAAG;IAC/D;IAEAC,SAAS;QACP,MAAM7B,OAAO8B,KAAK;IACpB;IAEAC,GAAG,qBAAqB;QACtBC,OAAO9B,YAAY+B,WAAW;QAC9BD,OAAO/B,gBAAgBgC,WAAW;QAClCD,OAAO7B,UAAU8B,WAAW;IAC9B;IAEAF,GAAG,6BAA6B;QAC9B,MAAMG,MAAW;YAAEC,WAAWC,KAAKC,EAAE;QAAG;QACxC,MAAMC,SAAS,MAAMrC,eAAesC,KAAK,CAACpC,UAAU+B;QACpDF,OAAOM,QAAQL,WAAW;QAC1BD,OAAOM,QAAQE,cAAc,CAACC,kCAAgB;QAC9CT,OAAOE,IAAIC,SAAS,EAAEO,qBAAqB,CAAC;QAC5CV,OAAOM,OAAOK,KAAK,CAACC,iBAAiB,EAAEC,WAAW,CAACC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACI,MAAM,CAACC,UAAU,IAAIC,IAAAA,wBAAgB,KAAI,CAAC;QACxIjB,OAAOM,OAAOK,KAAK,CAACO,kBAAkB,EAAEL,WAAW,CAACC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACQ,OAAO,CAACH,UAAU,IAAIC,IAAAA,wBAAgB,KAAI,CAAC;IAC5I;IAEAlB,GAAG,+BAA+B;QAChC,MAAMG,MAAW;YAAEkB,aAAahB,KAAKC,EAAE;QAAG;QAC1C,MAAML,OAAO/B,eAAeoD,MAAM,CAACnB,MAAMoB,QAAQ,CAACC,GAAG,CAACC,OAAO;QAC7DxB,OAAOE,IAAIkB,WAAW,EAAEV,qBAAqB,CAAC;IAChD;IAEAX,GAAG,iCAAiC;QAClC5B,SAASsD,GAAG,GAAGR,IAAAA,wBAAgB,MAAKH,IAAAA,oCAAyB,EAAC;QAC9D,MAAMZ,MAAW;YAAEC,WAAWC,KAAKC,EAAE;QAAG;QACxC,MAAMC,SAAS,MAAMrC,eAAeyD,cAAc,CAACvD,UAAU+B;QAC7DF,OAAOM,QAAQL,WAAW;QAC1BD,OAAOE,IAAIC,SAAS,EAAEO,qBAAqB,CAAC;QAC5CV,OAAOM,OAAOM,iBAAiB,EAAEC,WAAW,CAACC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACI,MAAM,CAACC,UAAU,IAAIC,IAAAA,wBAAgB,KAAI,CAAC;QAClIjB,OAAOM,OAAOY,kBAAkB,EAAES,IAAI,CAACxD,SAASsD,GAAG;IACrD;IAEA1B,GAAG,qCAAqC;QACtC5B,SAASsD,GAAG,GAAGR,IAAAA,wBAAgB,MAAK;QACpC,MAAMf,MAAW;YAAEC,WAAWC,KAAKC,EAAE;QAAG;QACxC,MAAML,OAAO/B,eAAeyD,cAAc,CAACvD,UAAU+B,MAAM0B,OAAO,CAACJ,OAAO;IAC5E;IAEAzB,GAAG,mCAAmC;QACpC,MAAMO,SAAS,MAAMrC,eAAe0C,KAAK,CAACxC;QAC1C6B,OAAOM,MAAM,CAACuB,0BAAU,CAACC,MAAM,CAAC,EAAE7B,WAAW;QAC7CD,OAAOM,MAAM,CAACuB,0BAAU,CAACE,OAAO,CAAC,EAAE9B,WAAW;QAC9CD,OAAOM,MAAM,CAAC,GAAGuB,0BAAU,CAACC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAEjB,WAAW,CAC3DC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACI,MAAM,CAACC,UAAU,IAAIC,IAAAA,wBAAgB,KAChF,CAAC;QAEHjB,OAAOM,MAAM,CAAC,GAAGuB,0BAAU,CAACE,OAAO,CAAC,WAAW,CAAC,CAAC,EAAElB,WAAW,CAC5DC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACQ,OAAO,CAACH,UAAU,IAAIC,IAAAA,wBAAgB,KACjF,CAAC;IAEL;IAEAlB,GAAG,uCAAuC;QACxC5B,SAASsD,GAAG,GAAGR,IAAAA,wBAAgB,MAAKH,IAAAA,oCAAyB,EAAC;QAC9D,MAAMR,SAAS,MAAMrC,eAAe+D,YAAY,CAAC7D;QACjD6B,OAAOM,MAAM,CAACuB,0BAAU,CAACC,MAAM,CAAC,EAAE7B,WAAW;QAC7CD,OAAOM,MAAM,CAACuB,0BAAU,CAACE,OAAO,CAAC,EAAE9B,WAAW;QAC9CD,OAAOM,MAAM,CAAC,GAAGuB,0BAAU,CAACC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAEjB,WAAW,CAC3DC,IAAAA,oCAAyB,EAAC5C,WAAWyC,KAAK,CAACI,MAAM,CAACC,UAAU,IAAIC,IAAAA,wBAAgB,KAChF,CAAC;QAEHjB,OAAOM,MAAM,CAAC,GAAGuB,0BAAU,CAACE,OAAO,CAAC,WAAW,CAAC,CAAC,EAAEJ,IAAI,CAACxD,SAASsD,GAAG;IACtE;IAEA1B,GAAG,2CAA2C;QAC5C5B,SAASsD,GAAG,GAAGR,IAAAA,wBAAgB,MAAK;QACpC,MAAMjB,OAAO/B,eAAe+D,YAAY,CAAC7D,WAAWyD,OAAO,CAACJ,OAAO;IACrE;AACF"}
1
+ {"version":3,"sources":["../../../backend/src/authentication/auth.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { ConfigModule, ConfigService } from '@nestjs/config'\nimport { JwtService } from '@nestjs/jwt'\nimport { PassportModule } from '@nestjs/passport'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { NotificationsManager } from '../applications/notifications/services/notifications-manager.service'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { UsersManager } from '../applications/users/services/users-manager.service'\nimport { generateUserTest } from '../applications/users/utils/test'\nimport { convertHumanTimeToSeconds } from '../common/functions'\nimport { currentTimeStamp } from '../common/shared'\nimport { exportConfiguration } from '../configuration/config.environment'\nimport { Cache } from '../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../infrastructure/database/constants'\nimport { AuthConfig } from './auth.config'\nimport { AuthController } from './auth.controller'\nimport { TOKEN_PATHS } from './constants/auth'\nimport { LoginResponseDto } from './dto/login-response.dto'\nimport { AuthTwoFaGuard } from './guards/auth-two-fa-guard'\nimport { TOKEN_TYPE } from './interfaces/token.interface'\nimport { AuthManager } from './services/auth-manager.service'\nimport { AuthMethod2FA } from './services/auth-methods/auth-method-two-fa.service'\n\ndescribe(AuthController.name, () => {\n let module: TestingModule\n let authController: AuthController\n let authConfig: AuthConfig\n let userTest: UserModel\n\n beforeAll(async () => {\n module = await Test.createTestingModule({\n imports: [await ConfigModule.forRoot({ load: [exportConfiguration], isGlobal: true }), PassportModule],\n controllers: [AuthController],\n providers: [\n ConfigService,\n AuthManager,\n JwtService,\n AuthMethod2FA,\n AuthTwoFaGuard,\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: Cache, useValue: {} },\n { provide: UsersManager, useValue: {} },\n { provide: NotificationsManager, useValue: {} }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n authConfig = module.get<ConfigService>(ConfigService).get<AuthConfig>('auth')\n authController = module.get<AuthController>(AuthController)\n userTest = new UserModel({ ...generateUserTest(), id: 888 }, false)\n })\n\n afterAll(async () => {\n await module.close()\n })\n\n it('should be defined', () => {\n expect(authConfig).toBeDefined()\n expect(authController).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should set JWT in cookies', async () => {\n const res: any = { setCookie: jest.fn() }\n const result = await authController.login(userTest, res)\n expect(result).toBeDefined()\n expect(result).toBeInstanceOf(LoginResponseDto)\n expect(res.setCookie).toHaveBeenCalledTimes(4)\n expect(result.token.access_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(), -1)\n expect(result.token.refresh_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.refresh.expiration) + currentTimeStamp(), -1)\n })\n\n it('should clear JWT in cookies', async () => {\n const res: any = { clearCookie: jest.fn() }\n await expect(authController.logout(res)).resolves.not.toThrow()\n expect(res.clearCookie).toHaveBeenCalledTimes(Object.keys(TOKEN_PATHS).length)\n })\n\n it('should refresh JWT in cookies', async () => {\n userTest.exp = currentTimeStamp() + convertHumanTimeToSeconds('30s')\n const res: any = { setCookie: jest.fn() }\n const result = await authController.refreshCookies(userTest, res)\n expect(result).toBeDefined()\n expect(res.setCookie).toHaveBeenCalledTimes(4)\n expect(result.access_expiration).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(), -1)\n expect(result.refresh_expiration).toBe(userTest.exp)\n })\n\n it('should not refresh JWT in cookies', async () => {\n userTest.exp = currentTimeStamp() - 1\n const res: any = { setCookie: jest.fn() }\n await expect(authController.refreshCookies(userTest, res)).rejects.toThrow()\n })\n\n it('should get JWT in response body', async () => {\n const result = await authController.token(userTest)\n expect(result[TOKEN_TYPE.ACCESS]).toBeDefined()\n expect(result[TOKEN_TYPE.REFRESH]).toBeDefined()\n expect(result[`${TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(),\n -1\n )\n expect(result[`${TOKEN_TYPE.REFRESH}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.refresh.expiration) + currentTimeStamp(),\n -1\n )\n })\n\n it('should refresh JWT in response body', async () => {\n userTest.exp = currentTimeStamp() + convertHumanTimeToSeconds('30s')\n const result = await authController.refreshToken(userTest)\n expect(result[TOKEN_TYPE.ACCESS]).toBeDefined()\n expect(result[TOKEN_TYPE.REFRESH]).toBeDefined()\n expect(result[`${TOKEN_TYPE.ACCESS}_expiration`]).toBeCloseTo(\n convertHumanTimeToSeconds(authConfig.token.access.expiration) + currentTimeStamp(),\n -1\n )\n expect(result[`${TOKEN_TYPE.REFRESH}_expiration`]).toBe(userTest.exp)\n })\n\n it('should not refresh JWT in response body', async () => {\n userTest.exp = currentTimeStamp() - 1\n await expect(authController.refreshToken(userTest)).rejects.toThrow()\n })\n})\n"],"names":["describe","AuthController","name","module","authController","authConfig","userTest","beforeAll","Test","createTestingModule","imports","ConfigModule","forRoot","load","exportConfiguration","isGlobal","PassportModule","controllers","providers","ConfigService","AuthManager","JwtService","AuthMethod2FA","AuthTwoFaGuard","provide","DB_TOKEN_PROVIDER","useValue","Cache","UsersManager","NotificationsManager","compile","useLogger","get","UserModel","generateUserTest","id","afterAll","close","it","expect","toBeDefined","res","setCookie","jest","fn","result","login","toBeInstanceOf","LoginResponseDto","toHaveBeenCalledTimes","token","access_expiration","toBeCloseTo","convertHumanTimeToSeconds","access","expiration","currentTimeStamp","refresh_expiration","refresh","clearCookie","logout","resolves","not","toThrow","Object","keys","TOKEN_PATHS","length","exp","refreshCookies","toBe","rejects","TOKEN_TYPE","ACCESS","REFRESH","refreshToken"],"mappings":"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"}
@@ -39,7 +39,8 @@ describe('Auth (e2e)', ()=>{
39
39
  });
40
40
  afterAll(async ()=>{
41
41
  await expect(adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, {
42
- deleteSpace: true
42
+ deleteSpace: true,
43
+ isGuest: false
43
44
  })).resolves.not.toThrow();
44
45
  await (0, _utils.dbCloseConnection)(app);
45
46
  await app.close();
@@ -324,13 +325,13 @@ describe('Auth (e2e)', ()=>{
324
325
  expect(cookie.content).toContain('HttpOnly');
325
326
  }
326
327
  expect(cookie.content).not.toContain('Secure');
327
- expect(cookie.content[cookie.content.length - 1].split('=')[1].toLowerCase()).toBe(authConfig.sameSite);
328
+ expect(cookie.content[cookie.content.length - 1].split('=')[1].toLowerCase()).toBe(authConfig.cookieSameSite);
328
329
  if (clear) {
329
330
  expect(cookie.content[0].split('=')[1]).toBe('');
330
331
  expect(cookie.content[1].split('=')[1]).toBe('0');
331
332
  expect(cookie.content[3].split('=')[1]).toBe('Thu, 01 Jan 1970 00:00:00 GMT');
332
333
  } else {
333
- expect(parseInt(cookie.content[1].split('=')[1])).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token[cookie.type].cookieMaxAge), -1);
334
+ expect(parseInt(cookie.content[1].split('=')[1])).toBeCloseTo((0, _functions.convertHumanTimeToSeconds)(authConfig.token[cookie.type].expiration), -1);
334
335
  expect(cookie.content[0].split('=')[1]).not.toBe('');
335
336
  }
336
337
  }