@sync-in/server 1.5.2 → 1.6.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 (228) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -0
  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 +6 -4
  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 +85 -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.js +37 -4
  109. package/server/authentication/constants/auth.js.map +1 -1
  110. package/server/authentication/constants/routes.js +21 -0
  111. package/server/authentication/constants/routes.js.map +1 -1
  112. package/server/authentication/constants/scope.js +20 -0
  113. package/server/authentication/constants/scope.js.map +1 -0
  114. package/server/authentication/dto/login-response.dto.js +27 -4
  115. package/server/authentication/dto/login-response.dto.js.map +1 -1
  116. package/server/authentication/dto/token-response.dto.js +5 -0
  117. package/server/authentication/dto/token-response.dto.js.map +1 -1
  118. package/server/{applications/users/dto/user-password.dto.js → authentication/dto/two-fa-verify.dto.js} +27 -9
  119. package/server/authentication/dto/two-fa-verify.dto.js.map +1 -0
  120. package/server/authentication/guards/auth-basic.strategy.js +6 -5
  121. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  122. package/server/authentication/guards/auth-token-access.strategy.js +3 -2
  123. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  124. package/server/authentication/guards/auth-token-refresh.strategy.js +3 -2
  125. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  126. package/server/authentication/guards/auth-two-fa-guard.js +81 -0
  127. package/server/authentication/guards/auth-two-fa-guard.js.map +1 -0
  128. package/server/authentication/interfaces/jwt-payload.interface.js +5 -0
  129. package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
  130. package/server/authentication/interfaces/token.interface.js +2 -0
  131. package/server/authentication/interfaces/token.interface.js.map +1 -1
  132. package/server/authentication/interfaces/two-fa-setup.interface.js +10 -0
  133. package/server/authentication/interfaces/two-fa-setup.interface.js.map +1 -0
  134. package/server/authentication/models/auth-method.js.map +1 -1
  135. package/server/authentication/services/auth-manager.service.js +72 -49
  136. package/server/authentication/services/auth-manager.service.js.map +1 -1
  137. package/server/authentication/services/auth-methods/auth-method-database.service.js +3 -3
  138. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
  139. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +5 -0
  140. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
  141. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +100 -27
  142. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  143. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +11 -12
  144. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
  145. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +251 -0
  146. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -0
  147. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +41 -0
  148. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -0
  149. package/server/authentication/utils/crypt-secret.js +68 -0
  150. package/server/authentication/utils/crypt-secret.js.map +1 -0
  151. package/server/common/functions.js +18 -2
  152. package/server/common/functions.js.map +1 -1
  153. package/server/common/qrcode.js +34 -0
  154. package/server/common/qrcode.js.map +1 -0
  155. package/server/common/shared.js +18 -0
  156. package/server/common/shared.js.map +1 -1
  157. package/server/configuration/config.environment.js +23 -6
  158. package/server/configuration/config.environment.js.map +1 -1
  159. package/server/configuration/config.interfaces.js +10 -0
  160. package/server/configuration/config.interfaces.js.map +1 -0
  161. package/server/configuration/config.loader.js.map +1 -1
  162. package/server/configuration/config.validation.js +13 -13
  163. package/server/configuration/config.validation.js.map +1 -1
  164. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +6 -6
  165. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  166. package/server/infrastructure/cache/schemas/mysql-cache.schema.js +2 -1
  167. package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
  168. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  169. package/server/infrastructure/database/columns.js +39 -0
  170. package/server/infrastructure/database/columns.js.map +1 -0
  171. package/server/infrastructure/database/database.config.js +0 -1
  172. package/server/infrastructure/database/database.config.js.map +1 -1
  173. package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
  174. package/server/infrastructure/mailer/mailer.config.js +12 -0
  175. package/server/infrastructure/mailer/mailer.config.js.map +1 -1
  176. package/server/infrastructure/mailer/mailer.service.js +2 -1
  177. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  178. package/static/assets/mimes/text-x-c.svg +1 -0
  179. package/static/chunk-2TZUZMCM.js +4 -0
  180. package/static/chunk-2XJ5Z2GZ.js +1 -0
  181. package/static/{chunk-7VRUZRJG.js → chunk-5M4YJZUB.js} +2 -2
  182. package/static/{chunk-MRSWNAVB.js → chunk-5ZGQYTS2.js} +1 -1
  183. package/static/chunk-6BFNMDUD.js +1 -0
  184. package/static/chunk-6IRL673W.js +559 -0
  185. package/static/{chunk-2R6HHGUR.js → chunk-ABGR5AYC.js} +1 -1
  186. package/static/chunk-CN27VAGB.js +1 -0
  187. package/static/{chunk-MVO4WZLK.js → chunk-DNMO47SY.js} +1 -1
  188. package/static/{chunk-MGGT6MIJ.js → chunk-EI4PVI2W.js} +1 -1
  189. package/static/chunk-ET6QDNNM.js +1 -0
  190. package/static/{chunk-L6MU6S2V.js → chunk-G2TKYYWK.js} +1 -1
  191. package/static/chunk-G3FOG2QB.js +1 -0
  192. package/static/{chunk-MCLQFZ3S.js → chunk-GCUWGVYT.js} +1 -1
  193. package/static/{chunk-RSS6GYNE.js → chunk-HME7LAEY.js} +1 -1
  194. package/static/chunk-IEUANP3Q.js +1 -0
  195. package/static/{chunk-VJRTMDEJ.js → chunk-IIFHIIC6.js} +1 -1
  196. package/static/{chunk-YJMN3B4N.js → chunk-KPZ7FEMO.js} +1 -1
  197. package/static/{chunk-JYXLQRHG.js → chunk-M57NVD4V.js} +1 -1
  198. package/static/chunk-NN3VQOS7.js +1 -0
  199. package/static/chunk-NW3CTYUW.js +1 -0
  200. package/static/{chunk-6OJZWYRZ.js → chunk-O3ANXCPE.js} +1 -1
  201. package/static/{chunk-ZC5NIT55.js → chunk-QFOMEU3T.js} +1 -1
  202. package/static/{chunk-BIUNUYZ5.js → chunk-RKNTQYMU.js} +1 -1
  203. package/static/{chunk-VUI3KV7V.js → chunk-UQ4TRQCE.js} +1 -1
  204. package/static/{chunk-WI7FOANP.js → chunk-WINILGQN.js} +1 -1
  205. package/static/{chunk-NE4NDO45.js → chunk-X7MFVDBY.js} +1 -1
  206. package/static/chunk-XCBLEI2E.js +1 -0
  207. package/static/{chunk-CRQNEHTX.js → chunk-XLWCV4HI.js} +1 -1
  208. package/static/chunk-XPIYOZBX.js +4 -0
  209. package/static/{chunk-LLWSLOSX.js → chunk-YD74UCFG.js} +1 -1
  210. package/static/{chunk-IZL7JPTS.js → chunk-YDFVKH2D.js} +1 -1
  211. package/static/{chunk-SPTF6FSM.js → chunk-YVJDYSDE.js} +1 -1
  212. package/static/index.html +2 -2
  213. package/static/main-QNBKYA6L.js +9 -0
  214. package/static/{styles-FYUSO6OJ.css → styles-A5VYX3CE.css} +1 -1
  215. package/server/applications/users/dto/user-password.dto.js.map +0 -1
  216. package/static/chunk-4U5A2DEP.js +0 -4
  217. package/static/chunk-54EAZ2UD.js +0 -1
  218. package/static/chunk-7ZRXJONB.js +0 -1
  219. package/static/chunk-F2J2IIJE.js +0 -1
  220. package/static/chunk-FNFGUIQH.js +0 -4
  221. package/static/chunk-GGLK52CG.js +0 -1
  222. package/static/chunk-HW2H3ISM.js +0 -559
  223. package/static/chunk-HX6BBYVD.js +0 -1
  224. package/static/chunk-JF7S3UYQ.js +0 -1
  225. package/static/chunk-KSHPKI4G.js +0 -1
  226. package/static/chunk-VPJ2V27B.js +0 -1
  227. package/static/chunk-ZXS4V7J2.js +0 -1
  228. package/static/main-FFIWFD2F.js +0 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/authentication/auth.e2e-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 { ConfigService } from '@nestjs/config'\nimport { JwtService } from '@nestjs/jwt'\nimport { NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { appBootstrap } from '../app.bootstrap'\nimport { USER_ROLE } from '../applications/users/constants/user'\nimport { DeleteUserDto } from '../applications/users/dto/delete-user.dto'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { AdminUsersManager } from '../applications/users/services/admin-users-manager.service'\nimport { generateUserTest } from '../applications/users/utils/test'\nimport { convertHumanTimeToSeconds, transformAndValidate } from '../common/functions'\nimport { currentTimeStamp, decodeUrl } from '../common/shared'\nimport { dbCheckConnection, dbCloseConnection } from '../infrastructure/database/utils'\nimport { AuthConfig } from './auth.config'\nimport { CSRF_ERROR, TOKEN_PATHS, TOKEN_TYPES } from './constants/auth'\nimport { API_AUTH_LOGIN, API_AUTH_LOGOUT, API_AUTH_REFRESH, API_AUTH_TOKEN, API_AUTH_TOKEN_REFRESH } from './constants/routes'\nimport { TokenResponseDto } from './dto/token-response.dto'\nimport { JwtPayload } from './interfaces/jwt-payload.interface'\nimport { TOKEN_TYPE } from './interfaces/token.interface'\n\ndescribe('Auth (e2e)', () => {\n let app: NestFastifyApplication\n let authConfig: AuthConfig\n let jwtService: JwtService\n let adminUsersManager: AdminUsersManager\n let userTest: UserModel\n let refreshToken: string\n let csrfToken: string\n\n beforeAll(async () => {\n app = await appBootstrap()\n await app.init()\n await app.getHttpAdapter().getInstance().ready()\n authConfig = app.get<ConfigService>(ConfigService).get<AuthConfig>('auth')\n jwtService = app.get<JwtService>(JwtService)\n adminUsersManager = app.get<AdminUsersManager>(AdminUsersManager)\n userTest = new UserModel(generateUserTest(false), false)\n })\n\n afterAll(async () => {\n await expect(\n adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, { deleteSpace: true } satisfies DeleteUserDto)\n ).resolves.not.toThrow()\n await dbCloseConnection(app)\n await app.close()\n })\n\n it('should be defined', () => {\n expect(authConfig).toBeDefined()\n expect(jwtService).toBeDefined()\n expect(adminUsersManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should get the database connection', async () => {\n expect(await dbCheckConnection(app)).toBe(true)\n })\n\n it(`POST ${API_AUTH_LOGIN} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGIN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_LOGIN} => 201`, async () => {\n const userId = (await adminUsersManager.createUserOrGuest({ ...userTest }, USER_ROLE.USER)).id\n expect(userId).toBeDefined()\n userTest.id = userId\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGIN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(201)\n expect(Object.keys(res.json())).toEqual(expect.arrayContaining(['user', 'token']))\n expect(res.headers['set-cookie']).toHaveLength(4)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n /* Access cookie\n [\n 'sync-in-access=value,\n 'Max-Age=3600',\n 'Path=/',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* Refresh cookie\n [\n 'sync-in-refresh=value,\n 'Max-Age=14400',\n 'Path=/api/auth/refresh',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* WS cookie\n [\n 'sync-in-ws=value,\n 'Max-Age=14400',\n 'Path=/socket.io',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* CSRF cookie\n [\n 'sync-in-csrf=value,\n 'Max-Age=14400',\n 'Path=/',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n cookiesChecks(cookies)\n // Verify token\n for (const cookie of cookies) {\n const token = cookie.content[0].substring(cookie.content[0].indexOf('=') + 1)\n if (cookie.type === TOKEN_TYPE.CSRF) {\n // needed for the following tests\n csrfToken = decodeUrl(token)\n continue\n }\n const decodedToken: JwtPayload = await jwtService.verifyAsync(token, {\n secret: authConfig.token[cookie.type].secret\n })\n expect(decodedToken.iat).toBeCloseTo(currentTimeStamp(), -1)\n expect(decodedToken.exp).toBeCloseTo(currentTimeStamp() + convertHumanTimeToSeconds(authConfig.token[cookie.type].expiration), -1)\n expect(decodedToken.identity.id).toBe(userTest.id)\n if (cookie.type === TOKEN_TYPE.REFRESH) {\n // needed for the following tests\n refreshToken = token\n }\n }\n })\n\n it(`POST ${API_AUTH_LOGOUT} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGOUT,\n body: null\n })\n expect(res.statusCode).toEqual(201)\n expect(res.headers['set-cookie']).toHaveLength(4)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n /* Access cookie\n [\n 'sync-in-access=',\n 'Max-Age=0',\n 'Path=/',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* Refresh cookie\n [\n 'sync-in-refresh=',\n 'Max-Age=0',\n 'Path=/api/auth/refresh',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* WS cookie\n [\n 'sync-in-ws=',\n 'Max-Age=0',\n 'Path=/socket.io',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* CSRF cookie\n [\n 'sync-in-csrf=',\n 'Max-Age=0',\n 'Path=/api/auth/refresh',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n cookiesChecks(cookies, true)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n headers: { [authConfig.token.csrf.name]: csrfToken },\n url: API_AUTH_REFRESH,\n cookies: { [authConfig.token.refresh.name]: refreshToken }\n })\n expect(res.statusCode).toEqual(201)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n cookiesChecks(cookies)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 401 (with CSRF)`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_REFRESH,\n headers: { [authConfig.token.csrf.name]: csrfToken },\n cookies: { [authConfig.token.refresh.name]: 'bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 403 (without CSRF)`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_REFRESH,\n cookies: { [authConfig.token.refresh.name]: refreshToken }\n })\n expect(res.statusCode).toEqual(403)\n expect(res.json().message).toEqual(CSRF_ERROR.MISSING_HEADERS)\n })\n\n it(`POST ${API_AUTH_TOKEN} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN,\n body: { login: userTest.login, password: 'bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_TOKEN} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(201)\n const content = res.json()\n expect(() => transformAndValidate(TokenResponseDto, content)).not.toThrow()\n for (const type of TOKEN_TYPES.filter((p) => p === TOKEN_TYPE.ACCESS || p === TOKEN_TYPE.REFRESH)) {\n expect(content[type]).toBeDefined()\n expect(content[`${type}_expiration`]).toBeCloseTo(currentTimeStamp() + convertHumanTimeToSeconds(authConfig.token[type].expiration), -1)\n }\n })\n\n it(`POST ${API_AUTH_TOKEN_REFRESH} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN_REFRESH,\n headers: { authorization: 'Bearer bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_TOKEN_REFRESH} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN_REFRESH,\n headers: { authorization: `Bearer ${refreshToken}` }\n })\n expect(res.statusCode).toEqual(201)\n expect(() => transformAndValidate(TokenResponseDto, res.json())).not.toThrow()\n })\n\n function getCookies(setCookie: string[]): { type: TOKEN_TYPE; content: string[] }[] {\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = []\n for (const c of setCookie) {\n const cookieName = c.split('=')[0]\n const cookieValues = c.split('; ')\n switch (cookieName) {\n case authConfig.token.access.name:\n cookies.push({ type: TOKEN_TYPE.ACCESS, content: cookieValues })\n break\n case authConfig.token.refresh.name:\n cookies.push({ type: TOKEN_TYPE.REFRESH, content: cookieValues })\n break\n case authConfig.token.ws.name:\n cookies.push({ type: TOKEN_TYPE.WS, content: cookieValues })\n break\n case authConfig.token.csrf.name:\n cookies.push({ type: TOKEN_TYPE.CSRF, content: cookieValues })\n break\n }\n }\n return cookies\n }\n\n function cookiesChecks(cookies: { type: TOKEN_TYPE; content: string[] }[], clear = false) {\n for (const cookie of cookies) {\n expect(cookie.content[0].split('=')[0]).toBe(authConfig.token[cookie.type].name)\n expect(cookie.content[2].split('=')[1]).toBe(TOKEN_PATHS[cookie.type])\n if (cookie.type === TOKEN_TYPE.CSRF) {\n expect(cookie.content).not.toContain('HttpOnly')\n } else {\n expect(cookie.content).toContain('HttpOnly')\n }\n expect(cookie.content).not.toContain('Secure')\n expect(cookie.content[cookie.content.length - 1].split('=')[1].toLowerCase()).toBe(authConfig.sameSite)\n if (clear) {\n expect(cookie.content[0].split('=')[1]).toBe('')\n expect(cookie.content[1].split('=')[1]).toBe('0')\n expect(cookie.content[3].split('=')[1]).toBe('Thu, 01 Jan 1970 00:00:00 GMT')\n } else {\n expect(parseInt(cookie.content[1].split('=')[1])).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token[cookie.type].cookieMaxAge), -1)\n expect(cookie.content[0].split('=')[1]).not.toBe('')\n }\n }\n }\n})\n"],"names":["describe","app","authConfig","jwtService","adminUsersManager","userTest","refreshToken","csrfToken","beforeAll","appBootstrap","init","getHttpAdapter","getInstance","ready","get","ConfigService","JwtService","AdminUsersManager","UserModel","generateUserTest","afterAll","expect","deleteUserOrGuest","id","login","deleteSpace","resolves","not","toThrow","dbCloseConnection","close","it","toBeDefined","dbCheckConnection","toBe","API_AUTH_LOGIN","res","inject","method","url","body","password","statusCode","toEqual","userId","createUserOrGuest","USER_ROLE","USER","Object","keys","json","arrayContaining","headers","toHaveLength","cookies","getCookies","cookiesChecks","cookie","token","content","substring","indexOf","type","TOKEN_TYPE","CSRF","decodeUrl","decodedToken","verifyAsync","secret","iat","toBeCloseTo","currentTimeStamp","exp","convertHumanTimeToSeconds","expiration","identity","REFRESH","API_AUTH_LOGOUT","API_AUTH_REFRESH","csrf","name","refresh","message","CSRF_ERROR","MISSING_HEADERS","API_AUTH_TOKEN","transformAndValidate","TokenResponseDto","TOKEN_TYPES","filter","p","ACCESS","API_AUTH_TOKEN_REFRESH","authorization","setCookie","c","cookieName","split","cookieValues","access","push","ws","WS","clear","TOKEN_PATHS","toContain","length","toLowerCase","sameSite","parseInt","cookieMaxAge"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../backend/src/authentication/auth.e2e-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 { ConfigService } from '@nestjs/config'\nimport { JwtService } from '@nestjs/jwt'\nimport { NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { appBootstrap } from '../app.bootstrap'\nimport { USER_ROLE } from '../applications/users/constants/user'\nimport { DeleteUserDto } from '../applications/users/dto/delete-user.dto'\nimport { UserModel } from '../applications/users/models/user.model'\nimport { AdminUsersManager } from '../applications/users/services/admin-users-manager.service'\nimport { generateUserTest } from '../applications/users/utils/test'\nimport { convertHumanTimeToSeconds, transformAndValidate } from '../common/functions'\nimport { currentTimeStamp, decodeUrl } from '../common/shared'\nimport { dbCheckConnection, dbCloseConnection } from '../infrastructure/database/utils'\nimport { AuthConfig } from './auth.config'\nimport { CSRF_ERROR, TOKEN_PATHS, TOKEN_TYPES } from './constants/auth'\nimport { API_AUTH_LOGIN, API_AUTH_LOGOUT, API_AUTH_REFRESH, API_AUTH_TOKEN, API_AUTH_TOKEN_REFRESH } from './constants/routes'\nimport { TokenResponseDto } from './dto/token-response.dto'\nimport { JwtPayload } from './interfaces/jwt-payload.interface'\nimport { TOKEN_TYPE } from './interfaces/token.interface'\n\ndescribe('Auth (e2e)', () => {\n let app: NestFastifyApplication\n let authConfig: AuthConfig\n let jwtService: JwtService\n let adminUsersManager: AdminUsersManager\n let userTest: UserModel\n let refreshToken: string\n let csrfToken: string\n\n beforeAll(async () => {\n app = await appBootstrap()\n await app.init()\n await app.getHttpAdapter().getInstance().ready()\n authConfig = app.get<ConfigService>(ConfigService).get<AuthConfig>('auth')\n jwtService = app.get<JwtService>(JwtService)\n adminUsersManager = app.get<AdminUsersManager>(AdminUsersManager)\n userTest = new UserModel(generateUserTest(false), false)\n })\n\n afterAll(async () => {\n await expect(\n adminUsersManager.deleteUserOrGuest(userTest.id, userTest.login, { deleteSpace: true, isGuest: false } satisfies DeleteUserDto)\n ).resolves.not.toThrow()\n await dbCloseConnection(app)\n await app.close()\n })\n\n it('should be defined', () => {\n expect(authConfig).toBeDefined()\n expect(jwtService).toBeDefined()\n expect(adminUsersManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should get the database connection', async () => {\n expect(await dbCheckConnection(app)).toBe(true)\n })\n\n it(`POST ${API_AUTH_LOGIN} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGIN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_LOGIN} => 201`, async () => {\n const userId = (await adminUsersManager.createUserOrGuest({ ...userTest }, USER_ROLE.USER)).id\n expect(userId).toBeDefined()\n userTest.id = userId\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGIN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(201)\n expect(Object.keys(res.json())).toEqual(expect.arrayContaining(['user', 'token']))\n expect(res.headers['set-cookie']).toHaveLength(4)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n /* Access cookie\n [\n 'sync-in-access=value,\n 'Max-Age=3600',\n 'Path=/',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* Refresh cookie\n [\n 'sync-in-refresh=value,\n 'Max-Age=14400',\n 'Path=/api/auth/refresh',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* WS cookie\n [\n 'sync-in-ws=value,\n 'Max-Age=14400',\n 'Path=/socket.io',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* CSRF cookie\n [\n 'sync-in-csrf=value,\n 'Max-Age=14400',\n 'Path=/',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n cookiesChecks(cookies)\n // Verify token\n for (const cookie of cookies) {\n const token = cookie.content[0].substring(cookie.content[0].indexOf('=') + 1)\n if (cookie.type === TOKEN_TYPE.CSRF) {\n // needed for the following tests\n csrfToken = decodeUrl(token)\n continue\n }\n const decodedToken: JwtPayload = await jwtService.verifyAsync(token, {\n secret: authConfig.token[cookie.type].secret\n })\n expect(decodedToken.iat).toBeCloseTo(currentTimeStamp(), -1)\n expect(decodedToken.exp).toBeCloseTo(currentTimeStamp() + convertHumanTimeToSeconds(authConfig.token[cookie.type].expiration), -1)\n expect(decodedToken.identity.id).toBe(userTest.id)\n if (cookie.type === TOKEN_TYPE.REFRESH) {\n // needed for the following tests\n refreshToken = token\n }\n }\n })\n\n it(`POST ${API_AUTH_LOGOUT} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_LOGOUT,\n body: null\n })\n expect(res.statusCode).toEqual(201)\n expect(res.headers['set-cookie']).toHaveLength(4)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n /* Access cookie\n [\n 'sync-in-access=',\n 'Max-Age=0',\n 'Path=/',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* Refresh cookie\n [\n 'sync-in-refresh=',\n 'Max-Age=0',\n 'Path=/api/auth/refresh',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* WS cookie\n [\n 'sync-in-ws=',\n 'Max-Age=0',\n 'Path=/socket.io',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n /* CSRF cookie\n [\n 'sync-in-csrf=',\n 'Max-Age=0',\n 'Path=/api/auth/refresh',\n 'Expires=Thu, 01 Jan 1970 00:00:00 GMT',\n 'HttpOnly',\n 'Secure',\n 'SameSite=Strict'\n ]\n */\n cookiesChecks(cookies, true)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n headers: { [authConfig.token.csrf.name]: csrfToken },\n url: API_AUTH_REFRESH,\n cookies: { [authConfig.token.refresh.name]: refreshToken }\n })\n expect(res.statusCode).toEqual(201)\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = getCookies(res.headers['set-cookie'] as string[])\n cookiesChecks(cookies)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 401 (with CSRF)`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_REFRESH,\n headers: { [authConfig.token.csrf.name]: csrfToken },\n cookies: { [authConfig.token.refresh.name]: 'bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_REFRESH} => 403 (without CSRF)`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_REFRESH,\n cookies: { [authConfig.token.refresh.name]: refreshToken }\n })\n expect(res.statusCode).toEqual(403)\n expect(res.json().message).toEqual(CSRF_ERROR.MISSING_HEADERS)\n })\n\n it(`POST ${API_AUTH_TOKEN} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN,\n body: { login: userTest.login, password: 'bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_TOKEN} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN,\n body: { login: userTest.login, password: userTest.password }\n })\n expect(res.statusCode).toEqual(201)\n const content = res.json()\n expect(() => transformAndValidate(TokenResponseDto, content)).not.toThrow()\n for (const type of TOKEN_TYPES.filter((p) => p === TOKEN_TYPE.ACCESS || p === TOKEN_TYPE.REFRESH)) {\n expect(content[type]).toBeDefined()\n expect(content[`${type}_expiration`]).toBeCloseTo(currentTimeStamp() + convertHumanTimeToSeconds(authConfig.token[type].expiration), -1)\n }\n })\n\n it(`POST ${API_AUTH_TOKEN_REFRESH} => 401`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN_REFRESH,\n headers: { authorization: 'Bearer bar' }\n })\n expect(res.statusCode).toEqual(401)\n })\n\n it(`POST ${API_AUTH_TOKEN_REFRESH} => 201`, async () => {\n const res = await app.inject({\n method: 'POST',\n url: API_AUTH_TOKEN_REFRESH,\n headers: { authorization: `Bearer ${refreshToken}` }\n })\n expect(res.statusCode).toEqual(201)\n expect(() => transformAndValidate(TokenResponseDto, res.json())).not.toThrow()\n })\n\n function getCookies(setCookie: string[]): { type: TOKEN_TYPE; content: string[] }[] {\n const cookies: { type: TOKEN_TYPE; content: string[] }[] = []\n for (const c of setCookie) {\n const cookieName = c.split('=')[0]\n const cookieValues = c.split('; ')\n switch (cookieName) {\n case authConfig.token.access.name:\n cookies.push({ type: TOKEN_TYPE.ACCESS, content: cookieValues })\n break\n case authConfig.token.refresh.name:\n cookies.push({ type: TOKEN_TYPE.REFRESH, content: cookieValues })\n break\n case authConfig.token.ws.name:\n cookies.push({ type: TOKEN_TYPE.WS, content: cookieValues })\n break\n case authConfig.token.csrf.name:\n cookies.push({ type: TOKEN_TYPE.CSRF, content: cookieValues })\n break\n }\n }\n return cookies\n }\n\n function cookiesChecks(cookies: { type: TOKEN_TYPE; content: string[] }[], clear = false) {\n for (const cookie of cookies) {\n expect(cookie.content[0].split('=')[0]).toBe(authConfig.token[cookie.type].name)\n expect(cookie.content[2].split('=')[1]).toBe(TOKEN_PATHS[cookie.type])\n if (cookie.type === TOKEN_TYPE.CSRF) {\n expect(cookie.content).not.toContain('HttpOnly')\n } else {\n expect(cookie.content).toContain('HttpOnly')\n }\n expect(cookie.content).not.toContain('Secure')\n expect(cookie.content[cookie.content.length - 1].split('=')[1].toLowerCase()).toBe(authConfig.cookieSameSite)\n if (clear) {\n expect(cookie.content[0].split('=')[1]).toBe('')\n expect(cookie.content[1].split('=')[1]).toBe('0')\n expect(cookie.content[3].split('=')[1]).toBe('Thu, 01 Jan 1970 00:00:00 GMT')\n } else {\n expect(parseInt(cookie.content[1].split('=')[1])).toBeCloseTo(convertHumanTimeToSeconds(authConfig.token[cookie.type].expiration), -1)\n expect(cookie.content[0].split('=')[1]).not.toBe('')\n }\n }\n }\n})\n"],"names":["describe","app","authConfig","jwtService","adminUsersManager","userTest","refreshToken","csrfToken","beforeAll","appBootstrap","init","getHttpAdapter","getInstance","ready","get","ConfigService","JwtService","AdminUsersManager","UserModel","generateUserTest","afterAll","expect","deleteUserOrGuest","id","login","deleteSpace","isGuest","resolves","not","toThrow","dbCloseConnection","close","it","toBeDefined","dbCheckConnection","toBe","API_AUTH_LOGIN","res","inject","method","url","body","password","statusCode","toEqual","userId","createUserOrGuest","USER_ROLE","USER","Object","keys","json","arrayContaining","headers","toHaveLength","cookies","getCookies","cookiesChecks","cookie","token","content","substring","indexOf","type","TOKEN_TYPE","CSRF","decodeUrl","decodedToken","verifyAsync","secret","iat","toBeCloseTo","currentTimeStamp","exp","convertHumanTimeToSeconds","expiration","identity","REFRESH","API_AUTH_LOGOUT","API_AUTH_REFRESH","csrf","name","refresh","message","CSRF_ERROR","MISSING_HEADERS","API_AUTH_TOKEN","transformAndValidate","TokenResponseDto","TOKEN_TYPES","filter","p","ACCESS","API_AUTH_TOKEN_REFRESH","authorization","setCookie","c","cookieName","split","cookieValues","access","push","ws","WS","clear","TOKEN_PATHS","toContain","length","toLowerCase","cookieSameSite","parseInt"],"mappings":"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"}
@@ -33,6 +33,7 @@ const _authmethod = require("./models/auth-method");
33
33
  const _authmanagerservice = require("./services/auth-manager.service");
34
34
  const _authmethoddatabaseservice = require("./services/auth-methods/auth-method-database.service");
35
35
  const _authmethodldapservice = require("./services/auth-methods/auth-method-ldap.service");
36
+ const _authmethodtwofaservice = require("./services/auth-methods/auth-method-two-fa.service");
36
37
  function _ts_decorate(decorators, target, key, desc) {
37
38
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
38
39
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -69,6 +70,7 @@ AuthModule = _ts_decorate([
69
70
  _authbasicstrategy.AuthBasicStrategy,
70
71
  _authanonymousstrategy.AuthAnonymousStrategy,
71
72
  _authmanagerservice.AuthManager,
73
+ _authmethodtwofaservice.AuthMethod2FA,
72
74
  {
73
75
  provide: _authmethod.AuthMethod,
74
76
  useClass: _configenvironment.configuration.auth.method === 'ldap' ? _authmethodldapservice.AuthMethodLdapService : _authmethoddatabaseservice.AuthMethodDatabase
@@ -76,7 +78,8 @@ AuthModule = _ts_decorate([
76
78
  ],
77
79
  exports: [
78
80
  _authmanagerservice.AuthManager,
79
- _authmethod.AuthMethod
81
+ _authmethod.AuthMethod,
82
+ _authmethodtwofaservice.AuthMethod2FA
80
83
  ]
81
84
  })
82
85
  ], AuthModule);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../backend/src/authentication/auth.module.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 { Global, Module } from '@nestjs/common'\nimport { APP_GUARD } from '@nestjs/core'\nimport { JwtModule } from '@nestjs/jwt'\nimport { PassportModule } from '@nestjs/passport'\nimport { UsersModule } from '../applications/users/users.module'\nimport { configuration } from '../configuration/config.environment'\nimport { AuthController } from './auth.controller'\nimport { AuthAnonymousGuard } from './guards/auth-anonymous.guard'\nimport { AuthAnonymousStrategy } from './guards/auth-anonymous.strategy'\nimport { AuthBasicGuard } from './guards/auth-basic.guard'\nimport { AuthBasicStrategy } from './guards/auth-basic.strategy'\nimport { AuthLocalGuard } from './guards/auth-local.guard'\nimport { AuthLocalStrategy } from './guards/auth-local.strategy'\nimport { AuthTokenAccessGuard } from './guards/auth-token-access.guard'\nimport { AuthTokenAccessStrategy } from './guards/auth-token-access.strategy'\nimport { AuthTokenRefreshGuard } from './guards/auth-token-refresh.guard'\nimport { AuthTokenRefreshStrategy } from './guards/auth-token-refresh.strategy'\nimport { AuthMethod } from './models/auth-method'\nimport { AuthManager } from './services/auth-manager.service'\nimport { AuthMethodDatabase } from './services/auth-methods/auth-method-database.service'\nimport { AuthMethodLdapService } from './services/auth-methods/auth-method-ldap.service'\n\n@Global()\n@Module({\n imports: [JwtModule.register({ global: true }), UsersModule, PassportModule],\n controllers: [AuthController],\n providers: [\n {\n provide: APP_GUARD,\n useClass: AuthTokenAccessGuard\n },\n AuthTokenRefreshGuard,\n AuthLocalGuard,\n AuthBasicGuard,\n AuthAnonymousGuard,\n AuthLocalStrategy,\n AuthTokenAccessStrategy,\n AuthTokenRefreshStrategy,\n AuthBasicStrategy,\n AuthAnonymousStrategy,\n AuthManager,\n { provide: AuthMethod, useClass: configuration.auth.method === 'ldap' ? AuthMethodLdapService : AuthMethodDatabase }\n ],\n exports: [AuthManager, AuthMethod]\n})\nexport class AuthModule {}\n"],"names":["AuthModule","imports","JwtModule","register","global","UsersModule","PassportModule","controllers","AuthController","providers","provide","APP_GUARD","useClass","AuthTokenAccessGuard","AuthTokenRefreshGuard","AuthLocalGuard","AuthBasicGuard","AuthAnonymousGuard","AuthLocalStrategy","AuthTokenAccessStrategy","AuthTokenRefreshStrategy","AuthBasicStrategy","AuthAnonymousStrategy","AuthManager","AuthMethod","configuration","auth","method","AuthMethodLdapService","AuthMethodDatabase","exports"],"mappings":"AAAA;;;;CAIC;;;;+BA+CYA;;;eAAAA;;;wBA7CkB;sBACL;qBACA;0BACK;6BACH;mCACE;gCACC;oCACI;uCACG;gCACP;mCACG;gCACH;mCACG;sCACG;yCACG;uCACF;0CACG;4BACd;oCACC;2CACO;uCACG;;;;;;;AAyB/B,IAAA,AAAMA,aAAN,MAAMA;AAAY;;;;QArBvBC,SAAS;YAACC,cAAS,CAACC,QAAQ,CAAC;gBAAEC,QAAQ;YAAK;YAAIC,wBAAW;YAAEC,wBAAc;SAAC;QAC5EC,aAAa;YAACC,8BAAc;SAAC;QAC7BC,WAAW;YACT;gBACEC,SAASC,eAAS;gBAClBC,UAAUC,0CAAoB;YAChC;YACAC,4CAAqB;YACrBC,8BAAc;YACdC,8BAAc;YACdC,sCAAkB;YAClBC,oCAAiB;YACjBC,gDAAuB;YACvBC,kDAAwB;YACxBC,oCAAiB;YACjBC,4CAAqB;YACrBC,+BAAW;YACX;gBAAEb,SAASc,sBAAU;gBAAEZ,UAAUa,gCAAa,CAACC,IAAI,CAACC,MAAM,KAAK,SAASC,4CAAqB,GAAGC,6CAAkB;YAAC;SACpH;QACDC,SAAS;YAACP,+BAAW;YAAEC,sBAAU;SAAC"}
1
+ {"version":3,"sources":["../../../backend/src/authentication/auth.module.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 { Global, Module } from '@nestjs/common'\nimport { APP_GUARD } from '@nestjs/core'\nimport { JwtModule } from '@nestjs/jwt'\nimport { PassportModule } from '@nestjs/passport'\nimport { UsersModule } from '../applications/users/users.module'\nimport { configuration } from '../configuration/config.environment'\nimport { AuthController } from './auth.controller'\nimport { AuthAnonymousGuard } from './guards/auth-anonymous.guard'\nimport { AuthAnonymousStrategy } from './guards/auth-anonymous.strategy'\nimport { AuthBasicGuard } from './guards/auth-basic.guard'\nimport { AuthBasicStrategy } from './guards/auth-basic.strategy'\nimport { AuthLocalGuard } from './guards/auth-local.guard'\nimport { AuthLocalStrategy } from './guards/auth-local.strategy'\nimport { AuthTokenAccessGuard } from './guards/auth-token-access.guard'\nimport { AuthTokenAccessStrategy } from './guards/auth-token-access.strategy'\nimport { AuthTokenRefreshGuard } from './guards/auth-token-refresh.guard'\nimport { AuthTokenRefreshStrategy } from './guards/auth-token-refresh.strategy'\nimport { AuthMethod } from './models/auth-method'\nimport { AuthManager } from './services/auth-manager.service'\nimport { AuthMethodDatabase } from './services/auth-methods/auth-method-database.service'\nimport { AuthMethodLdapService } from './services/auth-methods/auth-method-ldap.service'\nimport { AuthMethod2FA } from './services/auth-methods/auth-method-two-fa.service'\n\n@Global()\n@Module({\n imports: [JwtModule.register({ global: true }), UsersModule, PassportModule],\n controllers: [AuthController],\n providers: [\n {\n provide: APP_GUARD,\n useClass: AuthTokenAccessGuard\n },\n AuthTokenRefreshGuard,\n AuthLocalGuard,\n AuthBasicGuard,\n AuthAnonymousGuard,\n AuthLocalStrategy,\n AuthTokenAccessStrategy,\n AuthTokenRefreshStrategy,\n AuthBasicStrategy,\n AuthAnonymousStrategy,\n AuthManager,\n AuthMethod2FA,\n { provide: AuthMethod, useClass: configuration.auth.method === 'ldap' ? AuthMethodLdapService : AuthMethodDatabase }\n ],\n exports: [AuthManager, AuthMethod, AuthMethod2FA]\n})\nexport class AuthModule {}\n"],"names":["AuthModule","imports","JwtModule","register","global","UsersModule","PassportModule","controllers","AuthController","providers","provide","APP_GUARD","useClass","AuthTokenAccessGuard","AuthTokenRefreshGuard","AuthLocalGuard","AuthBasicGuard","AuthAnonymousGuard","AuthLocalStrategy","AuthTokenAccessStrategy","AuthTokenRefreshStrategy","AuthBasicStrategy","AuthAnonymousStrategy","AuthManager","AuthMethod2FA","AuthMethod","configuration","auth","method","AuthMethodLdapService","AuthMethodDatabase","exports"],"mappings":"AAAA;;;;CAIC;;;;+BAiDYA;;;eAAAA;;;wBA/CkB;sBACL;qBACA;0BACK;6BACH;mCACE;gCACC;oCACI;uCACG;gCACP;mCACG;gCACH;mCACG;sCACG;yCACG;uCACF;0CACG;4BACd;oCACC;2CACO;uCACG;wCACR;;;;;;;AA0BvB,IAAA,AAAMA,aAAN,MAAMA;AAAY;;;;QAtBvBC,SAAS;YAACC,cAAS,CAACC,QAAQ,CAAC;gBAAEC,QAAQ;YAAK;YAAIC,wBAAW;YAAEC,wBAAc;SAAC;QAC5EC,aAAa;YAACC,8BAAc;SAAC;QAC7BC,WAAW;YACT;gBACEC,SAASC,eAAS;gBAClBC,UAAUC,0CAAoB;YAChC;YACAC,4CAAqB;YACrBC,8BAAc;YACdC,8BAAc;YACdC,sCAAkB;YAClBC,oCAAiB;YACjBC,gDAAuB;YACvBC,kDAAwB;YACxBC,oCAAiB;YACjBC,4CAAqB;YACrBC,+BAAW;YACXC,qCAAa;YACb;gBAAEd,SAASe,sBAAU;gBAAEb,UAAUc,gCAAa,CAACC,IAAI,CAACC,MAAM,KAAK,SAASC,4CAAqB,GAAGC,6CAAkB;YAAC;SACpH;QACDC,SAAS;YAACR,+BAAW;YAAEE,sBAAU;YAAED,qCAAa;SAAC"}
@@ -13,31 +13,60 @@ function _export(target, all) {
13
13
  });
14
14
  }
15
15
  _export(exports, {
16
+ get ACCESS_KEY () {
17
+ return ACCESS_KEY;
18
+ },
16
19
  get CSRF_ERROR () {
17
20
  return CSRF_ERROR;
18
21
  },
19
22
  get CSRF_KEY () {
20
23
  return CSRF_KEY;
21
24
  },
25
+ get REFRESH_KEY () {
26
+ return REFRESH_KEY;
27
+ },
28
+ get TOKEN_2FA_TYPES () {
29
+ return TOKEN_2FA_TYPES;
30
+ },
22
31
  get TOKEN_PATHS () {
23
32
  return TOKEN_PATHS;
24
33
  },
25
34
  get TOKEN_TYPES () {
26
35
  return TOKEN_TYPES;
27
36
  },
37
+ get TWO_FA_CODE_LENGTH () {
38
+ return TWO_FA_CODE_LENGTH;
39
+ },
40
+ get TWO_FA_HEADER_CODE () {
41
+ return TWO_FA_HEADER_CODE;
42
+ },
43
+ get TWO_FA_HEADER_PASSWORD () {
44
+ return TWO_FA_HEADER_PASSWORD;
45
+ },
46
+ get TWO_FA_VERIFY_EXPIRATION () {
47
+ return TWO_FA_VERIFY_EXPIRATION;
48
+ },
28
49
  get WS_KEY () {
29
50
  return WS_KEY;
30
51
  }
31
52
  });
32
53
  const _tokeninterface = require("../interfaces/token.interface");
33
54
  const _routes = require("./routes");
55
+ const ACCESS_KEY = 'sync-in-access';
56
+ const REFRESH_KEY = 'sync-in-refresh';
34
57
  const CSRF_KEY = 'sync-in-csrf';
35
58
  const WS_KEY = 'sync-in-ws';
59
+ const TWO_FA_CODE_LENGTH = 6;
60
+ const TWO_FA_VERIFY_EXPIRATION = '5m';
61
+ const TWO_FA_HEADER_CODE = 'sync-in-two-fa-code';
62
+ const TWO_FA_HEADER_PASSWORD = 'sync-in-two-fa-password';
36
63
  const TOKEN_PATHS = {
37
- access: '/',
38
- refresh: _routes.API_AUTH_REFRESH,
39
- ws: _routes.API_AUTH_WS,
40
- csrf: '/'
64
+ [_tokeninterface.TOKEN_TYPE.ACCESS]: '/',
65
+ [_tokeninterface.TOKEN_TYPE.REFRESH]: _routes.API_AUTH_REFRESH,
66
+ [_tokeninterface.TOKEN_TYPE.WS]: _routes.API_AUTH_WS,
67
+ [_tokeninterface.TOKEN_TYPE.CSRF]: '/',
68
+ [_tokeninterface.TOKEN_TYPE.ACCESS_2FA]: _routes.API_TWO_FA_LOGIN_VERIFY,
69
+ [_tokeninterface.TOKEN_TYPE.CSRF_2FA]: '/'
41
70
  };
42
71
  const TOKEN_TYPES = [
43
72
  _tokeninterface.TOKEN_TYPE.REFRESH,
@@ -45,6 +74,10 @@ const TOKEN_TYPES = [
45
74
  _tokeninterface.TOKEN_TYPE.WS,
46
75
  _tokeninterface.TOKEN_TYPE.CSRF
47
76
  ];
77
+ const TOKEN_2FA_TYPES = [
78
+ _tokeninterface.TOKEN_TYPE.ACCESS_2FA,
79
+ _tokeninterface.TOKEN_TYPE.CSRF_2FA
80
+ ];
48
81
  const CSRF_ERROR = {
49
82
  MISSING_JWT: 'Missing CSRF in JWT',
50
83
  MISSING_HEADERS: 'Missing CSRF in headers',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/constants/auth.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 { TOKEN_TYPE } from '../interfaces/token.interface'\nimport { API_AUTH_REFRESH, API_AUTH_WS } from './routes'\n\nexport const CSRF_KEY = 'sync-in-csrf'\nexport const WS_KEY = 'sync-in-ws'\n\nexport const TOKEN_PATHS = { access: '/', refresh: API_AUTH_REFRESH, ws: API_AUTH_WS, csrf: '/' } as const\nexport const TOKEN_TYPES: TOKEN_TYPE[] = [TOKEN_TYPE.REFRESH, TOKEN_TYPE.ACCESS, TOKEN_TYPE.WS, TOKEN_TYPE.CSRF] as const\n\nexport const CSRF_ERROR = {\n MISSING_JWT: 'Missing CSRF in JWT',\n MISSING_HEADERS: 'Missing CSRF in headers',\n MISMATCH: 'CSRF mismatch'\n} as const\n"],"names":["CSRF_ERROR","CSRF_KEY","TOKEN_PATHS","TOKEN_TYPES","WS_KEY","access","refresh","API_AUTH_REFRESH","ws","API_AUTH_WS","csrf","TOKEN_TYPE","REFRESH","ACCESS","WS","CSRF","MISSING_JWT","MISSING_HEADERS","MISMATCH"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAWYA;eAAAA;;QANAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QAHAC;eAAAA;;;gCAJc;wBACmB;AAEvC,MAAMH,WAAW;AACjB,MAAMG,SAAS;AAEf,MAAMF,cAAc;IAAEG,QAAQ;IAAKC,SAASC,wBAAgB;IAAEC,IAAIC,mBAAW;IAAEC,MAAM;AAAI;AACzF,MAAMP,cAA4B;IAACQ,0BAAU,CAACC,OAAO;IAAED,0BAAU,CAACE,MAAM;IAAEF,0BAAU,CAACG,EAAE;IAAEH,0BAAU,CAACI,IAAI;CAAC;AAEzG,MAAMf,aAAa;IACxBgB,aAAa;IACbC,iBAAiB;IACjBC,UAAU;AACZ"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/constants/auth.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 { TOKEN_TYPE } from '../interfaces/token.interface'\nimport { API_AUTH_REFRESH, API_AUTH_WS, API_TWO_FA_LOGIN_VERIFY } from './routes'\n\nexport const ACCESS_KEY = 'sync-in-access'\nexport const REFRESH_KEY = 'sync-in-refresh'\nexport const CSRF_KEY = 'sync-in-csrf'\nexport const WS_KEY = 'sync-in-ws'\n\nexport const TWO_FA_CODE_LENGTH = 6\nexport const TWO_FA_VERIFY_EXPIRATION = '5m'\nexport const TWO_FA_HEADER_CODE = 'sync-in-two-fa-code'\nexport const TWO_FA_HEADER_PASSWORD = 'sync-in-two-fa-password'\n\nexport const TOKEN_PATHS = {\n [TOKEN_TYPE.ACCESS]: '/',\n [TOKEN_TYPE.REFRESH]: API_AUTH_REFRESH,\n [TOKEN_TYPE.WS]: API_AUTH_WS,\n [TOKEN_TYPE.CSRF]: '/',\n [TOKEN_TYPE.ACCESS_2FA]: API_TWO_FA_LOGIN_VERIFY,\n [TOKEN_TYPE.CSRF_2FA]: '/'\n} as const\n\nexport const TOKEN_TYPES: TOKEN_TYPE[] = [TOKEN_TYPE.REFRESH, TOKEN_TYPE.ACCESS, TOKEN_TYPE.WS, TOKEN_TYPE.CSRF] as const\nexport const TOKEN_2FA_TYPES: TOKEN_TYPE[] = [TOKEN_TYPE.ACCESS_2FA, TOKEN_TYPE.CSRF_2FA] as const\n\nexport const CSRF_ERROR = {\n MISSING_JWT: 'Missing CSRF in JWT',\n MISSING_HEADERS: 'Missing CSRF in headers',\n MISMATCH: 'CSRF mismatch'\n} as const\n"],"names":["ACCESS_KEY","CSRF_ERROR","CSRF_KEY","REFRESH_KEY","TOKEN_2FA_TYPES","TOKEN_PATHS","TOKEN_TYPES","TWO_FA_CODE_LENGTH","TWO_FA_HEADER_CODE","TWO_FA_HEADER_PASSWORD","TWO_FA_VERIFY_EXPIRATION","WS_KEY","TOKEN_TYPE","ACCESS","REFRESH","API_AUTH_REFRESH","WS","API_AUTH_WS","CSRF","ACCESS_2FA","API_TWO_FA_LOGIN_VERIFY","CSRF_2FA","MISSING_JWT","MISSING_HEADERS","MISMATCH"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAKYA;eAAAA;;QAsBAC;eAAAA;;QApBAC;eAAAA;;QADAC;eAAAA;;QAmBAC;eAAAA;;QAVAC;eAAAA;;QASAC;eAAAA;;QAdAC;eAAAA;;QAEAC;eAAAA;;QACAC;eAAAA;;QAFAC;eAAAA;;QAHAC;eAAAA;;;gCANc;wBAC4C;AAEhE,MAAMX,aAAa;AACnB,MAAMG,cAAc;AACpB,MAAMD,WAAW;AACjB,MAAMS,SAAS;AAEf,MAAMJ,qBAAqB;AAC3B,MAAMG,2BAA2B;AACjC,MAAMF,qBAAqB;AAC3B,MAAMC,yBAAyB;AAE/B,MAAMJ,cAAc;IACzB,CAACO,0BAAU,CAACC,MAAM,CAAC,EAAE;IACrB,CAACD,0BAAU,CAACE,OAAO,CAAC,EAAEC,wBAAgB;IACtC,CAACH,0BAAU,CAACI,EAAE,CAAC,EAAEC,mBAAW;IAC5B,CAACL,0BAAU,CAACM,IAAI,CAAC,EAAE;IACnB,CAACN,0BAAU,CAACO,UAAU,CAAC,EAAEC,+BAAuB;IAChD,CAACR,0BAAU,CAACS,QAAQ,CAAC,EAAE;AACzB;AAEO,MAAMf,cAA4B;IAACM,0BAAU,CAACE,OAAO;IAAEF,0BAAU,CAACC,MAAM;IAAED,0BAAU,CAACI,EAAE;IAAEJ,0BAAU,CAACM,IAAI;CAAC;AACzG,MAAMd,kBAAgC;IAACQ,0BAAU,CAACO,UAAU;IAAEP,0BAAU,CAACS,QAAQ;CAAC;AAElF,MAAMpB,aAAa;IACxBqB,aAAa;IACbC,iBAAiB;IACjBC,UAAU;AACZ"}
@@ -31,6 +31,18 @@ _export(exports, {
31
31
  get API_AUTH_WS () {
32
32
  return API_AUTH_WS;
33
33
  },
34
+ get API_TWO_FA_ADMIN_RESET_USER () {
35
+ return API_TWO_FA_ADMIN_RESET_USER;
36
+ },
37
+ get API_TWO_FA_DISABLE () {
38
+ return API_TWO_FA_DISABLE;
39
+ },
40
+ get API_TWO_FA_ENABLE () {
41
+ return API_TWO_FA_ENABLE;
42
+ },
43
+ get API_TWO_FA_LOGIN_VERIFY () {
44
+ return API_TWO_FA_LOGIN_VERIFY;
45
+ },
34
46
  get AUTH_ROUTE () {
35
47
  return AUTH_ROUTE;
36
48
  }
@@ -43,6 +55,11 @@ var AUTH_ROUTE = /*#__PURE__*/ function(AUTH_ROUTE) {
43
55
  AUTH_ROUTE["TOKEN"] = "token";
44
56
  AUTH_ROUTE["TOKEN_REFRESH"] = "token/refresh";
45
57
  AUTH_ROUTE["WS"] = "socket.io";
58
+ AUTH_ROUTE["TWO_FA_BASE"] = "2fa";
59
+ AUTH_ROUTE["TWO_FA_ENABLE"] = "enable";
60
+ AUTH_ROUTE["TWO_FA_DISABLE"] = "disable";
61
+ AUTH_ROUTE["TWO_FA_LOGIN_VERIFY"] = "login/verify";
62
+ AUTH_ROUTE["TWO_FA_ADMIN_RESET_USER"] = "reset/user";
46
63
  return AUTH_ROUTE;
47
64
  }({});
48
65
  const API_AUTH_LOGIN = `${"/api/auth"}/${"login"}`;
@@ -51,5 +68,9 @@ const API_AUTH_REFRESH = `${"/api/auth"}/${"refresh"}`;
51
68
  const API_AUTH_TOKEN = `${"/api/auth"}/${"token"}`;
52
69
  const API_AUTH_TOKEN_REFRESH = `${"/api/auth"}/${"token/refresh"}`;
53
70
  const API_AUTH_WS = `/${"socket.io"}`;
71
+ const API_TWO_FA_ENABLE = `${"/api/auth"}/${"2fa"}/${"enable"}`;
72
+ const API_TWO_FA_DISABLE = `${"/api/auth"}/${"2fa"}/${"disable"}`;
73
+ const API_TWO_FA_LOGIN_VERIFY = `${"/api/auth"}/${"2fa"}/${"login/verify"}`;
74
+ const API_TWO_FA_ADMIN_RESET_USER = `${"/api/auth"}/${"2fa"}/${"reset/user"}`;
54
75
 
55
76
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/constants/routes.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport enum AUTH_ROUTE {\n BASE = '/api/auth',\n LOGIN = 'login',\n LOGOUT = 'logout',\n REFRESH = 'refresh',\n TOKEN = 'token',\n TOKEN_REFRESH = `${AUTH_ROUTE.TOKEN}/refresh`,\n WS = 'socket.io'\n}\n\nexport const API_AUTH_LOGIN = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.LOGIN}`\nexport const API_AUTH_LOGOUT = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.LOGOUT}`\nexport const API_AUTH_REFRESH = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.REFRESH}`\nexport const API_AUTH_TOKEN = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TOKEN}`\nexport const API_AUTH_TOKEN_REFRESH = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TOKEN_REFRESH}`\nexport const API_AUTH_WS = `/${AUTH_ROUTE.WS}`\n"],"names":["API_AUTH_LOGIN","API_AUTH_LOGOUT","API_AUTH_REFRESH","API_AUTH_TOKEN","API_AUTH_TOKEN_REFRESH","API_AUTH_WS","AUTH_ROUTE"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAYYA;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QAfDC;eAAAA;;;AAAL,IAAA,AAAKA,oCAAAA;;;;;;;;WAAAA;;AAUL,MAAMN,iBAAiB,eAAmB,CAAC,WAAoB;AAC/D,MAAMC,kBAAkB,eAAmB,CAAC,YAAqB;AACjE,MAAMC,mBAAmB,eAAmB,CAAC,aAAsB;AACnE,MAAMC,iBAAiB,eAAmB,CAAC,WAAoB;AAC/D,MAAMC,yBAAyB,eAAmB,CAAC,mBAA4B;AAC/E,MAAMC,cAAc,CAAC,CAAC,eAAiB"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/constants/routes.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport enum AUTH_ROUTE {\n BASE = '/api/auth',\n LOGIN = 'login',\n LOGOUT = 'logout',\n REFRESH = 'refresh',\n TOKEN = 'token',\n TOKEN_REFRESH = `${AUTH_ROUTE.TOKEN}/refresh`,\n WS = 'socket.io',\n TWO_FA_BASE = '2fa',\n TWO_FA_ENABLE = 'enable',\n TWO_FA_DISABLE = 'disable',\n TWO_FA_LOGIN_VERIFY = 'login/verify',\n TWO_FA_ADMIN_RESET_USER = 'reset/user'\n}\n\nexport const API_AUTH_LOGIN = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.LOGIN}`\nexport const API_AUTH_LOGOUT = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.LOGOUT}`\nexport const API_AUTH_REFRESH = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.REFRESH}`\nexport const API_AUTH_TOKEN = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TOKEN}`\nexport const API_AUTH_TOKEN_REFRESH = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TOKEN_REFRESH}`\nexport const API_AUTH_WS = `/${AUTH_ROUTE.WS}`\nexport const API_TWO_FA_ENABLE = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_ENABLE}`\nexport const API_TWO_FA_DISABLE = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_DISABLE}`\nexport const API_TWO_FA_LOGIN_VERIFY = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_LOGIN_VERIFY}`\nexport const API_TWO_FA_ADMIN_RESET_USER = `${AUTH_ROUTE.BASE}/${AUTH_ROUTE.TWO_FA_BASE}/${AUTH_ROUTE.TWO_FA_ADMIN_RESET_USER}`\n"],"names":["API_AUTH_LOGIN","API_AUTH_LOGOUT","API_AUTH_REFRESH","API_AUTH_TOKEN","API_AUTH_TOKEN_REFRESH","API_AUTH_WS","API_TWO_FA_ADMIN_RESET_USER","API_TWO_FA_DISABLE","API_TWO_FA_ENABLE","API_TWO_FA_LOGIN_VERIFY","AUTH_ROUTE"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAiBYA;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QACAC;eAAAA;;QAIAC;eAAAA;;QAFAC;eAAAA;;QADAC;eAAAA;;QAEAC;eAAAA;;QAvBDC;eAAAA;;;AAAL,IAAA,AAAKA,oCAAAA;;;;;;;;;;;;;WAAAA;;AAeL,MAAMV,iBAAiB,eAAmB,CAAC,WAAoB;AAC/D,MAAMC,kBAAkB,eAAmB,CAAC,YAAqB;AACjE,MAAMC,mBAAmB,eAAmB,CAAC,aAAsB;AACnE,MAAMC,iBAAiB,eAAmB,CAAC,WAAoB;AAC/D,MAAMC,yBAAyB,eAAmB,CAAC,mBAA4B;AAC/E,MAAMC,cAAc,CAAC,CAAC,eAAiB;AACvC,MAAMG,oBAAoB,eAAmB,CAAC,QAAyB,CAAC,YAA4B;AACpG,MAAMD,qBAAqB,eAAmB,CAAC,QAAyB,CAAC,aAA6B;AACtG,MAAME,0BAA0B,eAAmB,CAAC,QAAyB,CAAC,kBAAkC;AAChH,MAAMH,8BAA8B,eAAmB,CAAC,QAAyB,CAAC,gBAAsC"}
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "AUTH_SCOPE", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return AUTH_SCOPE;
13
+ }
14
+ });
15
+ var AUTH_SCOPE = /*#__PURE__*/ function(AUTH_SCOPE) {
16
+ AUTH_SCOPE["WEBDAV"] = "webdav";
17
+ return AUTH_SCOPE;
18
+ }({});
19
+
20
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../backend/src/authentication/constants/scope.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport enum AUTH_SCOPE {\n WEBDAV = 'webdav'\n}\n"],"names":["AUTH_SCOPE"],"mappings":"AAAA;;;;CAIC;;;;+BAEWA;;;eAAAA;;;AAAL,IAAA,AAAKA,oCAAAA;;WAAAA"}
@@ -6,18 +6,41 @@
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- Object.defineProperty(exports, "LoginResponseDto", {
10
- enumerable: true,
11
- get: function() {
9
+ function _export(target, all) {
10
+ for(var name in all)Object.defineProperty(target, name, {
11
+ enumerable: true,
12
+ get: Object.getOwnPropertyDescriptor(all, name).get
13
+ });
14
+ }
15
+ _export(exports, {
16
+ get LoginResponseDto () {
12
17
  return LoginResponseDto;
18
+ },
19
+ get LoginVerify2FaDto () {
20
+ return LoginVerify2FaDto;
21
+ },
22
+ get TwoFaResponseDto () {
23
+ return TwoFaResponseDto;
13
24
  }
14
25
  });
15
26
  const _tokenresponsedto = require("./token-response.dto");
16
27
  let LoginResponseDto = class LoginResponseDto {
17
- constructor(user){
28
+ constructor(user, serverConfig){
29
+ this.server = serverConfig;
18
30
  this.user = user;
19
31
  this.token = new _tokenresponsedto.TokenResponseDto();
20
32
  }
21
33
  };
34
+ let LoginVerify2FaDto = class LoginVerify2FaDto {
35
+ constructor(serverConfig){
36
+ this.user = {
37
+ twoFaEnabled: true
38
+ };
39
+ this.server = serverConfig;
40
+ this.token = new _tokenresponsedto.TokenResponseDto();
41
+ }
42
+ };
43
+ let TwoFaResponseDto = class TwoFaResponseDto extends LoginResponseDto {
44
+ };
22
45
 
23
46
  //# sourceMappingURL=login-response.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/dto/login-response.dto.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 { UserModel } from '../../applications/users/models/user.model'\nimport { TokenResponseDto } from './token-response.dto'\n\nexport class LoginResponseDto {\n user: UserModel\n token: TokenResponseDto\n\n constructor(user: UserModel) {\n this.user = user\n this.token = new TokenResponseDto()\n }\n}\n"],"names":["LoginResponseDto","user","token","TokenResponseDto"],"mappings":"AAAA;;;;CAIC;;;;+BAKYA;;;eAAAA;;;kCAFoB;AAE1B,IAAA,AAAMA,mBAAN,MAAMA;IAIX,YAAYC,IAAe,CAAE;QAC3B,IAAI,CAACA,IAAI,GAAGA;QACZ,IAAI,CAACC,KAAK,GAAG,IAAIC,kCAAgB;IACnC;AACF"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/dto/login-response.dto.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 { UserModel } from '../../applications/users/models/user.model'\nimport { ServerConfig } from '../../configuration/config.interfaces'\nimport { TokenResponseDto } from './token-response.dto'\n\nexport class LoginResponseDto {\n server: ServerConfig\n user: UserModel\n token: TokenResponseDto\n\n constructor(user: UserModel, serverConfig: ServerConfig) {\n this.server = serverConfig\n this.user = user\n this.token = new TokenResponseDto()\n }\n}\n\nexport class LoginVerify2FaDto {\n server: ServerConfig\n user = { twoFaEnabled: true }\n token: TokenResponseDto\n\n constructor(serverConfig: ServerConfig) {\n this.server = serverConfig\n this.token = new TokenResponseDto()\n }\n}\n\nexport class TwoFaResponseDto extends LoginResponseDto {\n success: boolean\n message: string\n}\n"],"names":["LoginResponseDto","LoginVerify2FaDto","TwoFaResponseDto","user","serverConfig","server","token","TokenResponseDto","twoFaEnabled"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAMYA;eAAAA;;QAYAC;eAAAA;;QAWAC;eAAAA;;;kCAzBoB;AAE1B,IAAA,AAAMF,mBAAN,MAAMA;IAKX,YAAYG,IAAe,EAAEC,YAA0B,CAAE;QACvD,IAAI,CAACC,MAAM,GAAGD;QACd,IAAI,CAACD,IAAI,GAAGA;QACZ,IAAI,CAACG,KAAK,GAAG,IAAIC,kCAAgB;IACnC;AACF;AAEO,IAAA,AAAMN,oBAAN,MAAMA;IAKX,YAAYG,YAA0B,CAAE;aAHxCD,OAAO;YAAEK,cAAc;QAAK;QAI1B,IAAI,CAACH,MAAM,GAAGD;QACd,IAAI,CAACE,KAAK,GAAG,IAAIC,kCAAgB;IACnC;AACF;AAEO,IAAA,AAAML,mBAAN,MAAMA,yBAAyBF;AAGtC"}
@@ -40,5 +40,10 @@ _ts_decorate([
40
40
  (0, _classvalidator.IsInt)(),
41
41
  _ts_metadata("design:type", Number)
42
42
  ], TokenResponseDto.prototype, "refresh_expiration", void 0);
43
+ _ts_decorate([
44
+ (0, _classvalidator.IsOptional)(),
45
+ (0, _classvalidator.IsInt)(),
46
+ _ts_metadata("design:type", Number)
47
+ ], TokenResponseDto.prototype, "access_2fa_expiration", void 0);
43
48
 
44
49
  //# sourceMappingURL=token-response.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/dto/token-response.dto.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 { IsInt, IsString } from 'class-validator'\n\nexport class TokenResponseDto {\n @IsString()\n access: string\n\n @IsString()\n refresh: string\n\n @IsInt()\n access_expiration: number\n\n @IsInt()\n refresh_expiration: number\n}\n"],"names":["TokenResponseDto"],"mappings":"AAAA;;;;CAIC;;;;+BAIYA;;;eAAAA;;;gCAFmB;;;;;;;;;;AAEzB,IAAA,AAAMA,mBAAN,MAAMA;AAYb"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/dto/token-response.dto.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 { IsInt, IsOptional, IsString } from 'class-validator'\n\nexport class TokenResponseDto {\n @IsString()\n access: string\n\n @IsString()\n refresh: string\n\n @IsInt()\n access_expiration: number\n\n @IsInt()\n refresh_expiration: number\n\n @IsOptional()\n @IsInt()\n access_2fa_expiration?: number\n}\n"],"names":["TokenResponseDto"],"mappings":"AAAA;;;;CAIC;;;;+BAIYA;;;eAAAA;;;gCAF+B;;;;;;;;;;AAErC,IAAA,AAAMA,mBAAN,MAAMA;AAgBb"}
@@ -6,14 +6,21 @@
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- Object.defineProperty(exports, "UserPasswordDto", {
10
- enumerable: true,
11
- get: function() {
12
- return UserPasswordDto;
9
+ function _export(target, all) {
10
+ for(var name in all)Object.defineProperty(target, name, {
11
+ enumerable: true,
12
+ get: Object.getOwnPropertyDescriptor(all, name).get
13
+ });
14
+ }
15
+ _export(exports, {
16
+ get TwoFaVerifyDto () {
17
+ return TwoFaVerifyDto;
18
+ },
19
+ get TwoFaVerifyWithPasswordDto () {
20
+ return TwoFaVerifyWithPasswordDto;
13
21
  }
14
22
  });
15
23
  const _classvalidator = require("class-validator");
16
- const _user = require("../constants/user");
17
24
  function _ts_decorate(decorators, target, key, desc) {
18
25
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
26
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -23,13 +30,24 @@ function _ts_decorate(decorators, target, key, desc) {
23
30
  function _ts_metadata(k, v) {
24
31
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
25
32
  }
26
- let UserPasswordDto = class UserPasswordDto {
33
+ let TwoFaVerifyDto = class TwoFaVerifyDto {
27
34
  };
28
35
  _ts_decorate([
36
+ (0, _classvalidator.IsString)(),
29
37
  (0, _classvalidator.IsNotEmpty)(),
38
+ _ts_metadata("design:type", String)
39
+ ], TwoFaVerifyDto.prototype, "code", void 0);
40
+ _ts_decorate([
41
+ (0, _classvalidator.IsOptional)(),
42
+ (0, _classvalidator.IsBoolean)(),
43
+ _ts_metadata("design:type", Boolean)
44
+ ], TwoFaVerifyDto.prototype, "isRecoveryCode", void 0);
45
+ let TwoFaVerifyWithPasswordDto = class TwoFaVerifyWithPasswordDto extends TwoFaVerifyDto {
46
+ };
47
+ _ts_decorate([
30
48
  (0, _classvalidator.IsString)(),
31
- (0, _classvalidator.MinLength)(_user.USER_PASSWORD_MIN_LENGTH),
49
+ (0, _classvalidator.IsNotEmpty)(),
32
50
  _ts_metadata("design:type", String)
33
- ], UserPasswordDto.prototype, "password", void 0);
51
+ ], TwoFaVerifyWithPasswordDto.prototype, "password", void 0);
34
52
 
35
- //# sourceMappingURL=user-password.dto.js.map
53
+ //# sourceMappingURL=two-fa-verify.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../backend/src/authentication/dto/two-fa-verify.dto.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 { IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator'\n\nexport class TwoFaVerifyDto {\n @IsString()\n @IsNotEmpty()\n code!: string\n\n @IsOptional()\n @IsBoolean()\n isRecoveryCode?: boolean\n}\n\nexport class TwoFaVerifyWithPasswordDto extends TwoFaVerifyDto {\n @IsString()\n @IsNotEmpty()\n password!: string\n}\n"],"names":["TwoFaVerifyDto","TwoFaVerifyWithPasswordDto"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAIYA;eAAAA;;QAUAC;eAAAA;;;gCAZ+C;;;;;;;;;;AAErD,IAAA,AAAMD,iBAAN,MAAMA;AAQb;;;;;;;;;;;AAEO,IAAA,AAAMC,6BAAN,MAAMA,mCAAmCD;AAIhD"}
@@ -20,6 +20,7 @@ const _passporthttp = require("passport-http");
20
20
  const _appconstants = require("../../app.constants");
21
21
  const _usermodel = require("../../applications/users/models/user.model");
22
22
  const _cacheservice = require("../../infrastructure/cache/services/cache.service");
23
+ const _scope = require("../constants/scope");
23
24
  const _authmethod = require("../models/auth-method");
24
25
  function _ts_decorate(decorators, target, key, desc) {
25
26
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -35,7 +36,7 @@ let AuthBasicStrategy = class AuthBasicStrategy extends (0, _passport.PassportSt
35
36
  this.logger.assign({
36
37
  user: loginOrEmail
37
38
  });
38
- const authBasicUser = `auth-webdav-${req.headers['authorization'].split(' ').at(-1).toLowerCase()}`;
39
+ const authBasicUser = `${this.CACHE_KEY_PREFIX}-${req.headers['authorization'].split(' ').at(-1).toLowerCase()}`;
39
40
  const userFromCache = await this.cache.get(authBasicUser);
40
41
  if (userFromCache === null) {
41
42
  // not authorized
@@ -43,9 +44,10 @@ let AuthBasicStrategy = class AuthBasicStrategy extends (0, _passport.PassportSt
43
44
  }
44
45
  if (userFromCache !== undefined) {
45
46
  // cached
47
+ // warning: plainToInstance do not use constructor to instantiate class
46
48
  return (0, _classtransformer.plainToInstance)(_usermodel.UserModel, userFromCache);
47
49
  }
48
- const userFromDB = await this.authMethod.validateUser(loginOrEmail, password, req.ip);
50
+ const userFromDB = await this.authMethod.validateUser(loginOrEmail, password, req.ip, _scope.AUTH_SCOPE.WEBDAV);
49
51
  if (userFromDB !== null) {
50
52
  userFromDB.removePassword();
51
53
  }
@@ -54,17 +56,16 @@ let AuthBasicStrategy = class AuthBasicStrategy extends (0, _passport.PassportSt
54
56
  '_'
55
57
  ]
56
58
  }) : null;
57
- this.cache.set(authBasicUser, userToCache, AuthBasicStrategy.CACHE_TTL).catch((e)=>this.logger.error(`${this.validate.name} - ${e}`));
59
+ this.cache.set(authBasicUser, userToCache, this.CACHE_TTL).catch((e)=>this.logger.error(`${this.validate.name} - ${e}`));
58
60
  return userFromDB;
59
61
  }
60
62
  constructor(authMethod, cache, logger){
61
63
  super({
62
64
  passReqToCallback: true,
63
65
  realm: _appconstants.SERVER_NAME
64
- }), this.authMethod = authMethod, this.cache = cache, this.logger = logger;
66
+ }), this.authMethod = authMethod, this.cache = cache, this.logger = logger, this.CACHE_TTL = 900, this.CACHE_KEY_PREFIX = 'auth-webdav';
65
67
  }
66
68
  };
67
- AuthBasicStrategy.CACHE_TTL = 900;
68
69
  AuthBasicStrategy = _ts_decorate([
69
70
  (0, _common.Injectable)(),
70
71
  _ts_metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/guards/auth-basic.strategy.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 { Injectable } from '@nestjs/common'\nimport { AbstractStrategy, PassportStrategy } from '@nestjs/passport'\nimport { instanceToPlain, plainToInstance } from 'class-transformer'\nimport { FastifyRequest } from 'fastify'\nimport { PinoLogger } from 'nestjs-pino'\nimport { BasicStrategy } from 'passport-http'\nimport { SERVER_NAME } from '../../app.constants'\nimport { UserModel } from '../../applications/users/models/user.model'\nimport { Cache } from '../../infrastructure/cache/services/cache.service'\nimport { AuthMethod } from '../models/auth-method'\n\n@Injectable()\nexport class AuthBasicStrategy extends PassportStrategy(BasicStrategy, 'basic') implements AbstractStrategy {\n static readonly CACHE_TTL = 900\n\n constructor(\n private readonly authMethod: AuthMethod,\n private readonly cache: Cache,\n private readonly logger: PinoLogger\n ) {\n super({ passReqToCallback: true, realm: SERVER_NAME })\n }\n\n async validate(req: FastifyRequest, loginOrEmail: string, password: string): Promise<Omit<UserModel, 'password'> | null> {\n this.logger.assign({ user: loginOrEmail })\n const authBasicUser = `auth-webdav-${req.headers['authorization'].split(' ').at(-1).toLowerCase()}`\n const userFromCache: any = await this.cache.get(authBasicUser)\n if (userFromCache === null) {\n // not authorized\n return null\n }\n if (userFromCache !== undefined) {\n // cached\n return plainToInstance(UserModel, userFromCache)\n }\n const userFromDB: UserModel = await this.authMethod.validateUser(loginOrEmail, password, req.ip)\n if (userFromDB !== null) {\n userFromDB.removePassword()\n }\n const userToCache: Record<string, any> | null = userFromDB ? instanceToPlain(userFromDB, { excludePrefixes: ['_'] }) : null\n this.cache.set(authBasicUser, userToCache, AuthBasicStrategy.CACHE_TTL).catch((e: Error) => this.logger.error(`${this.validate.name} - ${e}`))\n return userFromDB\n }\n}\n"],"names":["AuthBasicStrategy","PassportStrategy","BasicStrategy","validate","req","loginOrEmail","password","logger","assign","user","authBasicUser","headers","split","at","toLowerCase","userFromCache","cache","get","undefined","plainToInstance","UserModel","userFromDB","authMethod","validateUser","ip","removePassword","userToCache","instanceToPlain","excludePrefixes","set","CACHE_TTL","catch","e","error","name","passReqToCallback","realm","SERVER_NAME"],"mappings":"AAAA;;;;CAIC;;;;+BAcYA;;;eAAAA;;;wBAZc;0BACwB;kCACF;4BAEtB;8BACG;8BACF;2BACF;8BACJ;4BACK;;;;;;;;;;AAGpB,IAAA,AAAMA,oBAAN,MAAMA,0BAA0BC,IAAAA,0BAAgB,EAACC,2BAAa,EAAE;IAWrE,MAAMC,SAASC,GAAmB,EAAEC,YAAoB,EAAEC,QAAgB,EAA+C;QACvH,IAAI,CAACC,MAAM,CAACC,MAAM,CAAC;YAAEC,MAAMJ;QAAa;QACxC,MAAMK,gBAAgB,CAAC,YAAY,EAAEN,IAAIO,OAAO,CAAC,gBAAgB,CAACC,KAAK,CAAC,KAAKC,EAAE,CAAC,CAAC,GAAGC,WAAW,IAAI;QACnG,MAAMC,gBAAqB,MAAM,IAAI,CAACC,KAAK,CAACC,GAAG,CAACP;QAChD,IAAIK,kBAAkB,MAAM;YAC1B,iBAAiB;YACjB,OAAO;QACT;QACA,IAAIA,kBAAkBG,WAAW;YAC/B,SAAS;YACT,OAAOC,IAAAA,iCAAe,EAACC,oBAAS,EAAEL;QACpC;QACA,MAAMM,aAAwB,MAAM,IAAI,CAACC,UAAU,CAACC,YAAY,CAAClB,cAAcC,UAAUF,IAAIoB,EAAE;QAC/F,IAAIH,eAAe,MAAM;YACvBA,WAAWI,cAAc;QAC3B;QACA,MAAMC,cAA0CL,aAAaM,IAAAA,iCAAe,EAACN,YAAY;YAAEO,iBAAiB;gBAAC;aAAI;QAAC,KAAK;QACvH,IAAI,CAACZ,KAAK,CAACa,GAAG,CAACnB,eAAegB,aAAa1B,kBAAkB8B,SAAS,EAAEC,KAAK,CAAC,CAACC,IAAa,IAAI,CAACzB,MAAM,CAAC0B,KAAK,CAAC,GAAG,IAAI,CAAC9B,QAAQ,CAAC+B,IAAI,CAAC,GAAG,EAAEF,GAAG;QAC5I,OAAOX;IACT;IA3BA,YACE,AAAiBC,UAAsB,EACvC,AAAiBN,KAAY,EAC7B,AAAiBT,MAAkB,CACnC;QACA,KAAK,CAAC;YAAE4B,mBAAmB;YAAMC,OAAOC,yBAAW;QAAC,SAJnCf,aAAAA,iBACAN,QAAAA,YACAT,SAAAA;IAGnB;AAsBF;AA/BaP,kBACK8B,YAAY"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/guards/auth-basic.strategy.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 { Injectable } from '@nestjs/common'\nimport { AbstractStrategy, PassportStrategy } from '@nestjs/passport'\nimport { instanceToPlain, plainToInstance } from 'class-transformer'\nimport { FastifyRequest } from 'fastify'\nimport { PinoLogger } from 'nestjs-pino'\nimport { BasicStrategy } from 'passport-http'\nimport { SERVER_NAME } from '../../app.constants'\nimport { UserModel } from '../../applications/users/models/user.model'\nimport { Cache } from '../../infrastructure/cache/services/cache.service'\nimport { AUTH_SCOPE } from '../constants/scope'\nimport { AuthMethod } from '../models/auth-method'\n\n@Injectable()\nexport class AuthBasicStrategy extends PassportStrategy(BasicStrategy, 'basic') implements AbstractStrategy {\n private readonly CACHE_TTL = 900\n private readonly CACHE_KEY_PREFIX = 'auth-webdav'\n\n constructor(\n private readonly authMethod: AuthMethod,\n private readonly cache: Cache,\n private readonly logger: PinoLogger\n ) {\n super({ passReqToCallback: true, realm: SERVER_NAME })\n }\n\n async validate(req: FastifyRequest, loginOrEmail: string, password: string): Promise<Omit<UserModel, 'password'> | null> {\n this.logger.assign({ user: loginOrEmail })\n const authBasicUser = `${this.CACHE_KEY_PREFIX}-${req.headers['authorization'].split(' ').at(-1).toLowerCase()}`\n const userFromCache: any = await this.cache.get(authBasicUser)\n if (userFromCache === null) {\n // not authorized\n return null\n }\n if (userFromCache !== undefined) {\n // cached\n // warning: plainToInstance do not use constructor to instantiate class\n return plainToInstance(UserModel, userFromCache)\n }\n const userFromDB: UserModel = await this.authMethod.validateUser(loginOrEmail, password, req.ip, AUTH_SCOPE.WEBDAV)\n if (userFromDB !== null) {\n userFromDB.removePassword()\n }\n const userToCache: Record<string, any> | null = userFromDB ? instanceToPlain(userFromDB, { excludePrefixes: ['_'] }) : null\n this.cache.set(authBasicUser, userToCache, this.CACHE_TTL).catch((e: Error) => this.logger.error(`${this.validate.name} - ${e}`))\n return userFromDB\n }\n}\n"],"names":["AuthBasicStrategy","PassportStrategy","BasicStrategy","validate","req","loginOrEmail","password","logger","assign","user","authBasicUser","CACHE_KEY_PREFIX","headers","split","at","toLowerCase","userFromCache","cache","get","undefined","plainToInstance","UserModel","userFromDB","authMethod","validateUser","ip","AUTH_SCOPE","WEBDAV","removePassword","userToCache","instanceToPlain","excludePrefixes","set","CACHE_TTL","catch","e","error","name","passReqToCallback","realm","SERVER_NAME"],"mappings":"AAAA;;;;CAIC;;;;+BAeYA;;;eAAAA;;;wBAbc;0BACwB;kCACF;4BAEtB;8BACG;8BACF;2BACF;8BACJ;uBACK;4BACA;;;;;;;;;;AAGpB,IAAA,AAAMA,oBAAN,MAAMA,0BAA0BC,IAAAA,0BAAgB,EAACC,2BAAa,EAAE;IAYrE,MAAMC,SAASC,GAAmB,EAAEC,YAAoB,EAAEC,QAAgB,EAA+C;QACvH,IAAI,CAACC,MAAM,CAACC,MAAM,CAAC;YAAEC,MAAMJ;QAAa;QACxC,MAAMK,gBAAgB,GAAG,IAAI,CAACC,gBAAgB,CAAC,CAAC,EAAEP,IAAIQ,OAAO,CAAC,gBAAgB,CAACC,KAAK,CAAC,KAAKC,EAAE,CAAC,CAAC,GAAGC,WAAW,IAAI;QAChH,MAAMC,gBAAqB,MAAM,IAAI,CAACC,KAAK,CAACC,GAAG,CAACR;QAChD,IAAIM,kBAAkB,MAAM;YAC1B,iBAAiB;YACjB,OAAO;QACT;QACA,IAAIA,kBAAkBG,WAAW;YAC/B,SAAS;YACT,uEAAuE;YACvE,OAAOC,IAAAA,iCAAe,EAACC,oBAAS,EAAEL;QACpC;QACA,MAAMM,aAAwB,MAAM,IAAI,CAACC,UAAU,CAACC,YAAY,CAACnB,cAAcC,UAAUF,IAAIqB,EAAE,EAAEC,iBAAU,CAACC,MAAM;QAClH,IAAIL,eAAe,MAAM;YACvBA,WAAWM,cAAc;QAC3B;QACA,MAAMC,cAA0CP,aAAaQ,IAAAA,iCAAe,EAACR,YAAY;YAAES,iBAAiB;gBAAC;aAAI;QAAC,KAAK;QACvH,IAAI,CAACd,KAAK,CAACe,GAAG,CAACtB,eAAemB,aAAa,IAAI,CAACI,SAAS,EAAEC,KAAK,CAAC,CAACC,IAAa,IAAI,CAAC5B,MAAM,CAAC6B,KAAK,CAAC,GAAG,IAAI,CAACjC,QAAQ,CAACkC,IAAI,CAAC,GAAG,EAAEF,GAAG;QAC/H,OAAOb;IACT;IA5BA,YACE,AAAiBC,UAAsB,EACvC,AAAiBN,KAAY,EAC7B,AAAiBV,MAAkB,CACnC;QACA,KAAK,CAAC;YAAE+B,mBAAmB;YAAMC,OAAOC,yBAAW;QAAC,SAJnCjB,aAAAA,iBACAN,QAAAA,YACAV,SAAAA,aANF0B,YAAY,UACZtB,mBAAmB;IAQpC;AAuBF"}
@@ -17,6 +17,7 @@ const _passport = require("@nestjs/passport");
17
17
  const _nestjspino = require("nestjs-pino");
18
18
  const _passportjwt = require("passport-jwt");
19
19
  const _usermodel = require("../../applications/users/models/user.model");
20
+ const _configenvironment = require("../../configuration/config.environment");
20
21
  const _tokeninterface = require("../interfaces/token.interface");
21
22
  const _authmanagerservice = require("../services/auth-manager.service");
22
23
  function _ts_decorate(decorators, target, key, desc) {
@@ -48,11 +49,11 @@ let AuthTokenAccessStrategy = class AuthTokenAccessStrategy extends (0, _passpor
48
49
  AuthTokenAccessStrategy.extractJWTFromCookie,
49
50
  _passportjwt.ExtractJwt.fromAuthHeaderAsBearerToken()
50
51
  ]),
51
- secretOrKey: authManager.authConfig.token.access.secret,
52
+ secretOrKey: _configenvironment.configuration.auth.token.access.secret,
52
53
  ignoreExpiration: false,
53
54
  passReqToCallback: true
54
55
  }), this.authManager = authManager, this.logger = logger;
55
- AuthTokenAccessStrategy.accessCookieName = authManager.authConfig.token.access.name;
56
+ AuthTokenAccessStrategy.accessCookieName = _configenvironment.configuration.auth.token.access.name;
56
57
  }
57
58
  };
58
59
  AuthTokenAccessStrategy = _ts_decorate([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/authentication/guards/auth-token-access.strategy.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 { Injectable } from '@nestjs/common'\nimport { AbstractStrategy, PassportStrategy } from '@nestjs/passport'\nimport { FastifyRequest } from 'fastify'\nimport { PinoLogger } from 'nestjs-pino'\nimport { ExtractJwt, Strategy } from 'passport-jwt'\nimport { UserModel } from '../../applications/users/models/user.model'\nimport { JwtPayload } from '../interfaces/jwt-payload.interface'\nimport { TOKEN_TYPE } from '../interfaces/token.interface'\nimport { AuthManager } from '../services/auth-manager.service'\n\n@Injectable()\nexport class AuthTokenAccessStrategy extends PassportStrategy(Strategy, 'tokenAccess') implements AbstractStrategy {\n private static accessCookieName: string\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly logger: PinoLogger\n ) {\n super({\n jwtFromRequest: ExtractJwt.fromExtractors([AuthTokenAccessStrategy.extractJWTFromCookie, ExtractJwt.fromAuthHeaderAsBearerToken()]),\n secretOrKey: authManager.authConfig.token.access.secret,\n ignoreExpiration: false,\n passReqToCallback: true\n })\n AuthTokenAccessStrategy.accessCookieName = authManager.authConfig.token.access.name\n }\n\n validate(req: FastifyRequest, jwtPayload: JwtPayload): UserModel {\n this.logger.assign({ user: jwtPayload.identity.login })\n this.authManager.csrfValidation(req, jwtPayload, TOKEN_TYPE.ACCESS)\n return new UserModel(jwtPayload.identity)\n }\n\n static extractJWTFromCookie(req: FastifyRequest): string | null {\n if (typeof req.cookies === 'object' && req.cookies[AuthTokenAccessStrategy.accessCookieName] !== undefined) {\n return req.cookies[AuthTokenAccessStrategy.accessCookieName]\n }\n return null\n }\n}\n"],"names":["AuthTokenAccessStrategy","PassportStrategy","Strategy","validate","req","jwtPayload","logger","assign","user","identity","login","authManager","csrfValidation","TOKEN_TYPE","ACCESS","UserModel","extractJWTFromCookie","cookies","accessCookieName","undefined","jwtFromRequest","ExtractJwt","fromExtractors","fromAuthHeaderAsBearerToken","secretOrKey","authConfig","token","access","secret","ignoreExpiration","passReqToCallback","name"],"mappings":"AAAA;;;;CAIC;;;;+BAaYA;;;eAAAA;;;wBAXc;0BACwB;4BAExB;6BACU;2BACX;gCAEC;oCACC;;;;;;;;;;AAGrB,IAAA,AAAMA,0BAAN,MAAMA,gCAAgCC,IAAAA,0BAAgB,EAACC,qBAAQ,EAAE;IAgBtEC,SAASC,GAAmB,EAAEC,UAAsB,EAAa;QAC/D,IAAI,CAACC,MAAM,CAACC,MAAM,CAAC;YAAEC,MAAMH,WAAWI,QAAQ,CAACC,KAAK;QAAC;QACrD,IAAI,CAACC,WAAW,CAACC,cAAc,CAACR,KAAKC,YAAYQ,0BAAU,CAACC,MAAM;QAClE,OAAO,IAAIC,oBAAS,CAACV,WAAWI,QAAQ;IAC1C;IAEA,OAAOO,qBAAqBZ,GAAmB,EAAiB;QAC9D,IAAI,OAAOA,IAAIa,OAAO,KAAK,YAAYb,IAAIa,OAAO,CAACjB,wBAAwBkB,gBAAgB,CAAC,KAAKC,WAAW;YAC1G,OAAOf,IAAIa,OAAO,CAACjB,wBAAwBkB,gBAAgB,CAAC;QAC9D;QACA,OAAO;IACT;IAxBA,YACE,AAAiBP,WAAwB,EACzC,AAAiBL,MAAkB,CACnC;QACA,KAAK,CAAC;YACJc,gBAAgBC,uBAAU,CAACC,cAAc,CAAC;gBAACtB,wBAAwBgB,oBAAoB;gBAAEK,uBAAU,CAACE,2BAA2B;aAAG;YAClIC,aAAab,YAAYc,UAAU,CAACC,KAAK,CAACC,MAAM,CAACC,MAAM;YACvDC,kBAAkB;YAClBC,mBAAmB;QACrB,SARiBnB,cAAAA,kBACAL,SAAAA;QAQjBN,wBAAwBkB,gBAAgB,GAAGP,YAAYc,UAAU,CAACC,KAAK,CAACC,MAAM,CAACI,IAAI;IACrF;AAcF"}
1
+ {"version":3,"sources":["../../../../backend/src/authentication/guards/auth-token-access.strategy.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 { Injectable } from '@nestjs/common'\nimport { AbstractStrategy, PassportStrategy } from '@nestjs/passport'\nimport { FastifyRequest } from 'fastify'\nimport { PinoLogger } from 'nestjs-pino'\nimport { ExtractJwt, Strategy } from 'passport-jwt'\nimport { UserModel } from '../../applications/users/models/user.model'\nimport { configuration } from '../../configuration/config.environment'\nimport { JwtPayload } from '../interfaces/jwt-payload.interface'\nimport { TOKEN_TYPE } from '../interfaces/token.interface'\nimport { AuthManager } from '../services/auth-manager.service'\n\n@Injectable()\nexport class AuthTokenAccessStrategy extends PassportStrategy(Strategy, 'tokenAccess') implements AbstractStrategy {\n private static accessCookieName: string\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly logger: PinoLogger\n ) {\n super({\n jwtFromRequest: ExtractJwt.fromExtractors([AuthTokenAccessStrategy.extractJWTFromCookie, ExtractJwt.fromAuthHeaderAsBearerToken()]),\n secretOrKey: configuration.auth.token.access.secret,\n ignoreExpiration: false,\n passReqToCallback: true\n })\n AuthTokenAccessStrategy.accessCookieName = configuration.auth.token.access.name\n }\n\n validate(req: FastifyRequest, jwtPayload: JwtPayload): UserModel {\n this.logger.assign({ user: jwtPayload.identity.login })\n this.authManager.csrfValidation(req, jwtPayload, TOKEN_TYPE.ACCESS)\n return new UserModel(jwtPayload.identity)\n }\n\n static extractJWTFromCookie(req: FastifyRequest): string | null {\n if (typeof req.cookies === 'object' && req.cookies[AuthTokenAccessStrategy.accessCookieName] !== undefined) {\n return req.cookies[AuthTokenAccessStrategy.accessCookieName]\n }\n return null\n }\n}\n"],"names":["AuthTokenAccessStrategy","PassportStrategy","Strategy","validate","req","jwtPayload","logger","assign","user","identity","login","authManager","csrfValidation","TOKEN_TYPE","ACCESS","UserModel","extractJWTFromCookie","cookies","accessCookieName","undefined","jwtFromRequest","ExtractJwt","fromExtractors","fromAuthHeaderAsBearerToken","secretOrKey","configuration","auth","token","access","secret","ignoreExpiration","passReqToCallback","name"],"mappings":"AAAA;;;;CAIC;;;;+BAcYA;;;eAAAA;;;wBAZc;0BACwB;4BAExB;6BACU;2BACX;mCACI;gCAEH;oCACC;;;;;;;;;;AAGrB,IAAA,AAAMA,0BAAN,MAAMA,gCAAgCC,IAAAA,0BAAgB,EAACC,qBAAQ,EAAE;IAgBtEC,SAASC,GAAmB,EAAEC,UAAsB,EAAa;QAC/D,IAAI,CAACC,MAAM,CAACC,MAAM,CAAC;YAAEC,MAAMH,WAAWI,QAAQ,CAACC,KAAK;QAAC;QACrD,IAAI,CAACC,WAAW,CAACC,cAAc,CAACR,KAAKC,YAAYQ,0BAAU,CAACC,MAAM;QAClE,OAAO,IAAIC,oBAAS,CAACV,WAAWI,QAAQ;IAC1C;IAEA,OAAOO,qBAAqBZ,GAAmB,EAAiB;QAC9D,IAAI,OAAOA,IAAIa,OAAO,KAAK,YAAYb,IAAIa,OAAO,CAACjB,wBAAwBkB,gBAAgB,CAAC,KAAKC,WAAW;YAC1G,OAAOf,IAAIa,OAAO,CAACjB,wBAAwBkB,gBAAgB,CAAC;QAC9D;QACA,OAAO;IACT;IAxBA,YACE,AAAiBP,WAAwB,EACzC,AAAiBL,MAAkB,CACnC;QACA,KAAK,CAAC;YACJc,gBAAgBC,uBAAU,CAACC,cAAc,CAAC;gBAACtB,wBAAwBgB,oBAAoB;gBAAEK,uBAAU,CAACE,2BAA2B;aAAG;YAClIC,aAAaC,gCAAa,CAACC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACC,MAAM;YACnDC,kBAAkB;YAClBC,mBAAmB;QACrB,SARiBpB,cAAAA,kBACAL,SAAAA;QAQjBN,wBAAwBkB,gBAAgB,GAAGO,gCAAa,CAACC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACI,IAAI;IACjF;AAcF"}
@@ -17,6 +17,7 @@ const _passport = require("@nestjs/passport");
17
17
  const _nestjspino = require("nestjs-pino");
18
18
  const _passportjwt = require("passport-jwt");
19
19
  const _usermodel = require("../../applications/users/models/user.model");
20
+ const _configenvironment = require("../../configuration/config.environment");
20
21
  const _tokeninterface = require("../interfaces/token.interface");
21
22
  const _authmanagerservice = require("../services/auth-manager.service");
22
23
  function _ts_decorate(decorators, target, key, desc) {
@@ -52,11 +53,11 @@ let AuthTokenRefreshStrategy = class AuthTokenRefreshStrategy extends (0, _passp
52
53
  AuthTokenRefreshStrategy.extractJWTFromCookie,
53
54
  _passportjwt.ExtractJwt.fromAuthHeaderAsBearerToken()
54
55
  ]),
55
- secretOrKey: authManager.authConfig.token.refresh.secret,
56
+ secretOrKey: _configenvironment.configuration.auth.token.refresh.secret,
56
57
  ignoreExpiration: false,
57
58
  passReqToCallback: true
58
59
  }), this.authManager = authManager, this.logger = logger;
59
- AuthTokenRefreshStrategy.refreshCookieName = authManager.authConfig.token.refresh.name;
60
+ AuthTokenRefreshStrategy.refreshCookieName = _configenvironment.configuration.auth.token.refresh.name;
60
61
  }
61
62
  };
62
63
  AuthTokenRefreshStrategy = _ts_decorate([