@sync-in/server 1.9.1 → 1.9.6

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 (177) hide show
  1. package/CHANGELOG.md +24 -8
  2. package/package.json +12 -12
  3. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  4. package/server/applications/files/services/files-manager.service.js +2 -2
  5. package/server/applications/files/services/files-manager.service.js.map +1 -1
  6. package/server/applications/files/services/files-methods.service.spec.js +2 -4
  7. package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
  8. package/server/applications/files/services/files-recents.service.js +4 -0
  9. package/server/applications/files/services/files-recents.service.js.map +1 -1
  10. package/server/applications/files/services/files-scheduler.service.js +23 -4
  11. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  12. package/server/applications/files/services/files-tasks-manager.service.js +1 -1
  13. package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
  14. package/server/applications/files/utils/send-file.js +18 -9
  15. package/server/applications/files/utils/send-file.js.map +1 -1
  16. package/server/applications/files/utils/url-file.js +6 -6
  17. package/server/applications/files/utils/url-file.js.map +1 -1
  18. package/server/applications/links/services/links-manager.service.js +1 -1
  19. package/server/applications/links/services/links-manager.service.js.map +1 -1
  20. package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
  21. package/server/applications/shares/services/shares-manager.service.js +6 -4
  22. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  23. package/server/applications/spaces/services/spaces-manager.service.js +15 -12
  24. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  25. package/server/applications/spaces/services/spaces-scheduler.service.js +9 -1
  26. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  27. package/server/applications/users/services/admin-users-manager.service.js +4 -0
  28. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  29. package/server/applications/users/users.controller.js +4 -1
  30. package/server/applications/users/users.controller.js.map +1 -1
  31. package/static/assets/pdfjs/build/pdf.mjs +35 -20
  32. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  33. package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
  34. package/static/assets/pdfjs/build/pdf.worker.mjs +1488 -52
  35. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  36. package/static/assets/pdfjs/version +1 -1
  37. package/static/assets/pdfjs/web/locale/be/viewer.ftl +2 -12
  38. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +4 -0
  39. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -15
  40. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -4
  41. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -14
  42. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +2 -12
  43. package/static/assets/pdfjs/web/locale/da/viewer.ftl +2 -12
  44. package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -12
  45. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -12
  46. package/static/assets/pdfjs/web/locale/el/viewer.ftl +2 -12
  47. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +0 -12
  48. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -12
  49. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +2 -12
  50. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -12
  51. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +2 -12
  52. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +2 -12
  53. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -12
  54. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -12
  55. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -12
  56. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -12
  57. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -12
  58. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +0 -12
  59. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +2 -12
  60. package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -12
  61. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -12
  62. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -12
  63. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -15
  64. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -12
  65. package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -15
  66. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -15
  67. package/static/assets/pdfjs/web/locale/it/viewer.ftl +2 -14
  68. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +7 -2
  69. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +0 -12
  70. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -12
  71. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +3 -12
  72. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -12
  73. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +2 -12
  74. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -12
  75. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +0 -12
  76. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +4 -12
  77. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +2 -12
  78. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +2 -12
  79. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -12
  80. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +2 -14
  81. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +0 -12
  82. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -1
  83. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -12
  84. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +2 -12
  85. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +2 -12
  86. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -12
  87. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +2 -12
  88. package/static/assets/pdfjs/web/locale/th/viewer.ftl +0 -12
  89. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +2 -12
  90. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -12
  91. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +2 -12
  92. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -12
  93. package/static/assets/pdfjs/web/viewer.css +53 -41
  94. package/static/assets/pdfjs/web/viewer.html +493 -132
  95. package/static/assets/pdfjs/web/viewer.mjs +225 -150
  96. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  97. package/static/{chunk-LYZGJZNP.js → chunk-25PWAXTJ.js} +1 -1
  98. package/static/{chunk-YMAN4LIU.js → chunk-2CAAJBRO.js} +1 -1
  99. package/static/{chunk-GRLHFXGB.js → chunk-2F42MZQ5.js} +1 -1
  100. package/static/{chunk-6B3GGAV3.js → chunk-2U5VKTML.js} +1 -1
  101. package/static/{chunk-HKRGIRKB.js → chunk-3AR5VNJE.js} +1 -1
  102. package/static/chunk-3WS72A6C.js +1 -0
  103. package/static/chunk-4GBA6EJ4.js +1 -0
  104. package/static/{chunk-FNOTGWRW.js → chunk-4ZKAVMB4.js} +1 -1
  105. package/static/{chunk-XQGPSNQB.js → chunk-5ATJIR5S.js} +1 -1
  106. package/static/{chunk-HMOB6XC5.js → chunk-5GIWZKNS.js} +1 -1
  107. package/static/{chunk-ZCOWBVOT.js → chunk-5HYSNQR4.js} +1 -1
  108. package/static/{chunk-BHZEPHRI.js → chunk-5KVI243T.js} +1 -1
  109. package/static/{chunk-Q556XB3S.js → chunk-5NFH4E2B.js} +1 -1
  110. package/static/{chunk-XCLK7NJL.js → chunk-7H5O4BLV.js} +1 -1
  111. package/static/{chunk-RDNTK4YH.js → chunk-7HL5Z6PF.js} +1 -1
  112. package/static/{chunk-V6FA5QY4.js → chunk-7QYALK5T.js} +1 -1
  113. package/static/{chunk-GNZPP2VO.js → chunk-ANH4VNOS.js} +1 -1
  114. package/static/{chunk-EIYRBM4J.js → chunk-AYYJZMBE.js} +1 -1
  115. package/static/chunk-B2A4HNDC.js +1 -0
  116. package/static/{chunk-NOPACN4F.js → chunk-B4TDS6AQ.js} +1 -1
  117. package/static/chunk-BJARRIS6.js +562 -0
  118. package/static/{chunk-PXRT4L57.js → chunk-BVKDW5XO.js} +1 -1
  119. package/static/{chunk-7CKHC72R.js → chunk-BX3QZ7IL.js} +1 -1
  120. package/static/{chunk-MIA5YBOI.js → chunk-C5T7RZSD.js} +1 -1
  121. package/static/{chunk-ACUF7IKP.js → chunk-CHMDM2ZW.js} +1 -1
  122. package/static/{chunk-U4RW6XG5.js → chunk-CUC7R6C2.js} +1 -1
  123. package/static/{chunk-XOF4UW3S.js → chunk-D6QWQHWE.js} +1 -1
  124. package/static/{chunk-6NEBGCAZ.js → chunk-DK2LAJEL.js} +1 -1
  125. package/static/{chunk-C3AAEQKW.js → chunk-DQAQUSVW.js} +1 -1
  126. package/static/{chunk-NN4ONTOT.js → chunk-DU4Q4RWJ.js} +1 -1
  127. package/static/{chunk-M4XL3JN5.js → chunk-E5C4QRNQ.js} +2 -2
  128. package/static/{chunk-BU4ZICZR.js → chunk-EPDWJEPD.js} +1 -1
  129. package/static/{chunk-I2S3XPC5.js → chunk-FCR5AEHR.js} +2 -2
  130. package/static/{chunk-4PZPHJ7L.js → chunk-FEQUP26G.js} +1 -1
  131. package/static/{chunk-ZXXHFBGL.js → chunk-FSGT46LM.js} +1 -1
  132. package/static/{chunk-QMHUIHSR.js → chunk-GENTF6JM.js} +1 -1
  133. package/static/{chunk-DQ3GEMPM.js → chunk-GLPKRULI.js} +1 -1
  134. package/static/{chunk-AZ5TF5Y3.js → chunk-GRV44RYI.js} +1 -1
  135. package/static/{chunk-JY2I3HGL.js → chunk-GYYJ4FWN.js} +1 -1
  136. package/static/{chunk-ERDZ7IVF.js → chunk-HB5DC7RJ.js} +1 -1
  137. package/static/{chunk-DJDRX53V.js → chunk-HLKZCMKV.js} +1 -1
  138. package/static/{chunk-HNMGPG72.js → chunk-IBC7CFBQ.js} +1 -1
  139. package/static/{chunk-5E3TYOL3.js → chunk-IIKL33TV.js} +1 -1
  140. package/static/{chunk-TGLJFALR.js → chunk-JYHTSSKW.js} +1 -1
  141. package/static/{chunk-VQJYCYWI.js → chunk-KAAFVHYE.js} +1 -1
  142. package/static/{chunk-VK7XMFVE.js → chunk-KWKZN53T.js} +1 -1
  143. package/static/{chunk-KDEEERWZ.js → chunk-LBXOAKBD.js} +1 -1
  144. package/static/{chunk-Y5RLD72B.js → chunk-LFAQLJZK.js} +1 -1
  145. package/static/chunk-MGMDT4VN.js +1 -0
  146. package/static/chunk-MWUUM2NK.js +13 -0
  147. package/static/{chunk-JMYAD7E2.js → chunk-NHMYAVJK.js} +1 -1
  148. package/static/{chunk-HHWXIK2M.js → chunk-NQCKX2AD.js} +1 -1
  149. package/static/{chunk-HCSWO7BO.js → chunk-O233BXWK.js} +1 -1
  150. package/static/{chunk-2TB2INBF.js → chunk-ODAQRAPO.js} +1 -1
  151. package/static/{chunk-RK2ONYTL.js → chunk-OVUMPMVM.js} +1 -1
  152. package/static/chunk-Q6B4OVER.js +5 -0
  153. package/static/{chunk-3YDYZLF7.js → chunk-QKMN3S4M.js} +1 -1
  154. package/static/{chunk-23UUFZSR.js → chunk-QUUQOBTF.js} +1 -1
  155. package/static/chunk-QV5LQKTS.js +1 -0
  156. package/static/{chunk-NKGKBQBX.js → chunk-S4UTSOPV.js} +1 -1
  157. package/static/{chunk-5S6KPQRA.js → chunk-SF6Q6VRC.js} +1 -1
  158. package/static/{chunk-BODMMLVB.js → chunk-TOCCCZP2.js} +1 -1
  159. package/static/{chunk-3WLBVJ2S.js → chunk-UO7ATVQG.js} +1 -1
  160. package/static/{chunk-AADK5D2H.js → chunk-X5UDV4ZB.js} +1 -1
  161. package/static/{chunk-S2VBGI6Q.js → chunk-XIQXRSZ2.js} +1 -1
  162. package/static/chunk-YYTDPI5S.js +1 -0
  163. package/static/{chunk-EL6QL4TP.js → chunk-Z2KBIZ5D.js} +1 -1
  164. package/static/{chunk-K657XPXA.js → chunk-ZCOEP4O2.js} +1 -1
  165. package/static/index.html +2 -2
  166. package/static/main-ODUA232E.js +11 -0
  167. package/static/{styles-Q4OZOSSK.css → styles-S5HVK4H5.css} +1 -1
  168. package/static/chunk-5XUIPWOH.js +0 -1
  169. package/static/chunk-EDJAISWO.js +0 -13
  170. package/static/chunk-H6WOTGQ5.js +0 -1
  171. package/static/chunk-HC7F57NA.js +0 -1
  172. package/static/chunk-IOIBQGHN.js +0 -562
  173. package/static/chunk-J6YSFHLZ.js +0 -1
  174. package/static/chunk-JWPXQOS3.js +0 -5
  175. package/static/chunk-QVFPHTOH.js +0 -1
  176. package/static/chunk-YCTCESL4.js +0 -1
  177. package/static/main-56PZQ6TJ.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-users-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log(\n `${this.createUserOrGuest.name} - ${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n )\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error(`${this.createUserOrGuest.name} - unable to create user *${createUserDto.login}* : ${e}`)\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was deleted`)\n } else {\n this.logger.error(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was not deleted : not found`)\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error(`${this.deleteUserOrGuest.name} - unable to delete *${userLogin}* (${userId}) : ${e}`)\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserOrGuestFromAdmin(userId: number, deleteUserDto: DeleteUserDto): Promise<void> {\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n if (userToDelete.isGuest !== deleteUserDto.isGuest) {\n throw new HttpException('User mismatch', HttpStatus.BAD_REQUEST)\n }\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: deleteUserDto.isGuest ? true : deleteUserDto.deleteSpace,\n isGuest: deleteUserDto.isGuest\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error(`${this.createGroup.name} - missing group name : ${JSON.stringify(createGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log(`${this.createGroup.name} - group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`)\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error(`${this.createGroup.name} - group was not created : ${JSON.stringify(createGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log(`${this.deleteGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deleteGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, res: FastifyReply): Promise<LoginResponseDto> {\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log(`${this.deleteUserSpace.name} - user space *${userLogin}* was deleted`)\n } else {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* does not exist : ${userSpace}`)\n }\n } catch (e) {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* (${userSpace}) was not deleted : ${e}`)\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (!(await isPathExists(currentUserSpace))) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${oldLogin}* does not exist : ${currentUserSpace}`)\n return false\n }\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${newLogin}* already exists : ${newUserSpace}`)\n return false\n }\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error(`${this.renameUserSpace.name} - unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`)\n return false\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","name","JSON","stringify","anonymizePassword","clearWhiteListCaches","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserOrGuestFromAdmin","userToDelete","from","BAD_REQUEST","createGuest","createGuestDto","push","updateGuest","updateGuestDto","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","admin","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","checkOnly","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","groupName","exists","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/users/services/admin-users-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { LoginResponseDto } from '../../../authentication/dto/login-response.dto'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { anonymizePassword, hashPassword } from '../../../common/functions'\nimport { isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { GROUP_TYPE } from '../constants/group'\nimport { USER_ROLE } from '../constants/user'\nimport type { CreateOrUpdateGroupDto } from '../dto/create-or-update-group.dto'\nimport type { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from '../dto/create-or-update-user.dto'\nimport type { DeleteUserDto } from '../dto/delete-user.dto'\nimport type { SearchMembersDto } from '../dto/search-members.dto'\nimport type { AdminGroup } from '../interfaces/admin-group.interface'\nimport type { AdminUser } from '../interfaces/admin-user.interface'\nimport type { GroupBrowse } from '../interfaces/group-browse.interface'\nimport type { GuestUser } from '../interfaces/guest-user.interface'\nimport type { Member } from '../interfaces/member.interface'\nimport { UserModel } from '../models/user.model'\nimport type { Group } from '../schemas/group.interface'\nimport type { User } from '../schemas/user.interface'\nimport { AdminUsersQueries } from './admin-users-queries.service'\n\n@Injectable()\nexport class AdminUsersManager {\n private readonly logger = new Logger(AdminUsersManager.name)\n\n constructor(\n private readonly authManager: AuthManager,\n private readonly adminQueries: AdminUsersQueries\n ) {}\n\n listUsers(): Promise<AdminUser[]> {\n return this.adminQueries.listUsers()\n }\n\n async getUser(userId: number): Promise<AdminUser> {\n const user: AdminUser = await this.adminQueries.listUsers(userId)\n this.checkUser(user, true)\n return user\n }\n\n async getGuest(guestId: number): Promise<GuestUser> {\n const user: GuestUser = await this.adminQueries.usersQueries.listGuests(guestId, 0, true)\n this.checkUser(user, true)\n return user\n }\n\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE.GUEST, asAdmin: boolean): Promise<GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin: true): Promise<AdminUser | GuestUser>\n async createUserOrGuest(createUserDto: CreateUserDto, userRole: USER_ROLE, asAdmin?: false): Promise<UserModel>\n async createUserOrGuest(\n createUserDto: CreateUserDto,\n userRole: USER_ROLE = USER_ROLE.USER,\n asAdmin = false\n ): Promise<UserModel | AdminUser | GuestUser> {\n await this.loginOrEmailAlreadyUsed(createUserDto.login, createUserDto.email)\n try {\n createUserDto.password = await hashPassword(createUserDto.password)\n const userId: number = await this.adminQueries.usersQueries.createUserOrGuest(createUserDto, userRole)\n const user = new UserModel({ ...createUserDto, id: userId, role: userRole })\n this.logger.log(\n `${this.createUserOrGuest.name} - ${USER_ROLE[userRole]} (${userId}) was created : ${JSON.stringify(anonymizePassword(createUserDto))}`\n )\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n await user.makePaths()\n if (userRole <= USER_ROLE.USER) {\n return asAdmin ? this.getUser(user.id) : user\n } else {\n return asAdmin ? this.getGuest(user.id) : user\n }\n } catch (e) {\n this.logger.error(`${this.createUserOrGuest.name} - unable to create user *${createUserDto.login}* : ${e}`)\n throw new HttpException('Unable to create user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto): Promise<AdminUser>\n async updateUserOrGuest(userId: number, updateUserDto: UpdateUserDto, userRole: USER_ROLE.GUEST): Promise<GuestUser>\n async updateUserOrGuest(\n userId: number,\n updateUserDto: UpdateUserDto,\n userRole: USER_ROLE.USER | USER_ROLE.GUEST = USER_ROLE.USER\n ): Promise<AdminUser | GuestUser> {\n const user: AdminUser & GuestUser = userRole === USER_ROLE.USER ? await this.getUser(userId) : await this.getGuest(userId)\n const updateUser: Partial<User> = {}\n const updateUserGroups: { add: number[]; delete: number[] } = { add: [], delete: [] }\n const updateGuestManagers: { add: number[]; delete: number[] } = { add: [], delete: [] }\n for (const [k, v] of Object.entries(updateUserDto)) {\n switch (k as keyof UpdateUserDto) {\n case 'login':\n if (user.login === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(v)) {\n throw new HttpException('Login already used', HttpStatus.FORBIDDEN)\n }\n if (!(await this.renameUserSpace(user.login, v))) {\n throw new HttpException('Unable to rename user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n updateUser.login = v\n break\n case 'email':\n if (user.email === v) {\n break\n }\n if (await this.adminQueries.usersQueries.checkUserExists(null, v)) {\n throw new HttpException('Email already used', HttpStatus.FORBIDDEN)\n }\n updateUser.email = v\n break\n case 'isActive':\n updateUser.isActive = v\n if (v) {\n updateUser.passwordAttempts = 0\n }\n break\n case 'password':\n updateUser.password = await hashPassword(updateUserDto.password)\n break\n case 'groups':\n if (userRole === USER_ROLE.USER) {\n const currentGroups: number[] = user.groups?.length ? user.groups.map((g) => g.id) : []\n updateUserGroups.add = v.filter((id: number) => currentGroups.indexOf(id) === -1)\n updateUserGroups.delete = currentGroups.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n case 'managers':\n if (userRole === USER_ROLE.GUEST) {\n const currentManagers: number[] = user.managers?.length ? user.managers.map((m) => m.id) : []\n updateGuestManagers.add = v.filter((id: number) => currentManagers.indexOf(id) === -1)\n updateGuestManagers.delete = currentManagers.filter((id: number) => v.indexOf(id) === -1)\n }\n break\n default:\n updateUser[k] = v\n }\n }\n if (Object.keys(updateUser).length) {\n // force the type for security reason\n const forceRole = userRole === USER_ROLE.GUEST ? USER_ROLE.GUEST : undefined\n if (!(await this.adminQueries.usersQueries.updateUserOrGuest(user.id, updateUser, forceRole))) {\n throw new HttpException('Unable to update user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n if (userRole === USER_ROLE.USER) {\n if (updateUserGroups.add.length || updateUserGroups.delete.length) {\n try {\n await this.adminQueries.updateUserGroups(user.id, updateUserGroups)\n } catch {\n throw new HttpException('Unable to update user groups', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getUser(userId)\n } else {\n if (updateGuestManagers.add.length || updateGuestManagers.delete.length) {\n try {\n await this.adminQueries.updateGuestManagers(user.id, updateGuestManagers)\n } catch {\n throw new HttpException('Unable to update guest managers', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n return this.getGuest(userId)\n }\n }\n\n async deleteUserOrGuest(userId: number, userLogin: string, deleteUserDto: DeleteUserDto): Promise<void> {\n try {\n if (await this.adminQueries.deleteUser(userId, userLogin)) {\n this.logger.log(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was deleted`)\n } else {\n this.logger.error(`${this.deleteUserOrGuest.name} - *${userLogin}* (${userId}) was not deleted : not found`)\n }\n if (deleteUserDto.deleteSpace) {\n await this.deleteUserSpace(userLogin, deleteUserDto.isGuest)\n }\n } catch (e) {\n this.logger.error(`${this.deleteUserOrGuest.name} - unable to delete *${userLogin}* (${userId}) : ${e}`)\n throw new HttpException('Unable to delete user', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async deleteUserOrGuestFromAdmin(userId: number, deleteUserDto: DeleteUserDto): Promise<void> {\n const userToDelete: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n if (userToDelete.isGuest !== deleteUserDto.isGuest) {\n throw new HttpException('User mismatch', HttpStatus.BAD_REQUEST)\n }\n await this.deleteUserOrGuest(userToDelete.id, userToDelete.login, {\n deleteSpace: deleteUserDto.isGuest ? true : deleteUserDto.deleteSpace,\n isGuest: deleteUserDto.isGuest\n } satisfies DeleteUserDto)\n }\n\n listGuests(): Promise<AdminUser[]> {\n return this.adminQueries.usersQueries.listGuests(null, null, true)\n }\n\n createGuest(user: UserModel, createGuestDto: CreateUserDto): Promise<GuestUser> {\n if (!createGuestDto.managers.length) {\n createGuestDto.managers.push(user.id)\n }\n return this.createUserOrGuest(createGuestDto, USER_ROLE.GUEST, true)\n }\n\n updateGuest(guestId: number, updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n if (!Object.keys(updateGuestDto).length) {\n throw new HttpException('No changes to update', HttpStatus.BAD_REQUEST)\n }\n if (updateGuestDto.managers && !updateGuestDto.managers.length) {\n throw new HttpException('Guest must have at least one manager', HttpStatus.BAD_REQUEST)\n }\n return this.updateUserOrGuest(guestId, updateGuestDto, USER_ROLE.GUEST)\n }\n\n async browseGroups(name?: string, type: GROUP_TYPE = GROUP_TYPE.USER): Promise<GroupBrowse> {\n if (name) {\n const group: Pick<Group, 'id' | 'name' | 'type'> = await this.adminQueries.groupFromName(name)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return { parentGroup: group, members: await this.adminQueries.browseGroupMembers(group.id, type) }\n }\n return { parentGroup: undefined, members: await this.adminQueries.browseRootGroupMembers(type) }\n }\n\n async getGroup(groupId: number): Promise<AdminGroup> {\n const group = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n return group\n }\n\n async createGroup(createGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (!createGroupDto.name) {\n this.logger.error(`${this.createGroup.name} - missing group name : ${JSON.stringify(createGroupDto)}`)\n throw new HttpException('Group name is missing', HttpStatus.BAD_REQUEST)\n }\n await this.checkGroupNameExists(createGroupDto.name)\n try {\n const groupId: number = await this.adminQueries.createGroup(createGroupDto)\n this.logger.log(`${this.createGroup.name} - group (${groupId}) was created : ${JSON.stringify(createGroupDto)}`)\n return this.adminQueries.groupFromId(groupId)\n } catch (e) {\n this.logger.error(`${this.createGroup.name} - group was not created : ${JSON.stringify(createGroupDto)} : ${e}`)\n throw new HttpException('Unable to create group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async updateGroup(groupId: number, updateGroupDto: CreateOrUpdateGroupDto): Promise<AdminGroup> {\n if (updateGroupDto.name) {\n await this.checkGroupNameExists(updateGroupDto.name)\n }\n if (!(await this.adminQueries.updateGroup(groupId, updateGroupDto))) {\n throw new HttpException('Unable to update group', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n // Clear whitelist caches when the group’s visibility is changed\n if (updateGroupDto.visibility !== undefined) {\n this.adminQueries.usersQueries.clearWhiteListCaches('*')\n }\n return this.adminQueries.groupFromId(groupId)\n }\n\n async deleteGroup(groupId: number): Promise<void> {\n if (await this.adminQueries.deleteGroup(groupId)) {\n this.logger.log(`${this.deleteGroup.name} - group (${groupId}) was deleted`)\n } else {\n this.logger.warn(`${this.deleteGroup.name} - group (${groupId}) does not exist`)\n throw new HttpException('Unable to delete group', HttpStatus.BAD_REQUEST)\n }\n }\n\n async addUsersToGroup(groupId: number, userIds: number[]): Promise<void> {\n const group: AdminGroup = await this.adminQueries.groupFromId(groupId)\n if (!group) {\n throw new HttpException('Group not found', HttpStatus.NOT_FOUND)\n }\n try {\n await this.adminQueries.addUsersToGroup(groupId, userIds, group.type === GROUP_TYPE.USER ? USER_ROLE.USER : undefined)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async updateUserFromGroup(groupId: number, userId: number, updateUserFromGroupDto: UpdateUserFromGroupDto): Promise<void> {\n try {\n await this.adminQueries.updateUserFromGroup(groupId, userId, updateUserFromGroupDto.role)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n async removeUserFromGroup(groupId: number, userId: number): Promise<void> {\n try {\n await this.adminQueries.removeUserFromGroup(groupId, userId)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n }\n\n searchMembers(searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.adminQueries.usersQueries.searchUsersOrGroups(searchMembersDto)\n }\n\n async impersonateUser(admin: UserModel, userId: number, res: FastifyReply): Promise<LoginResponseDto> {\n if (admin.id === userId) {\n throw new HttpException('You are already logged in', HttpStatus.BAD_REQUEST)\n }\n const user: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(userId))\n user.impersonatedFromId = admin.id\n user.impersonatedClientId = admin.clientId\n return this.authManager.setCookies(user, res)\n }\n\n async logoutImpersonateUser(user: UserModel, res: FastifyReply): Promise<LoginResponseDto> {\n if (!user.impersonatedFromId) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const admin: UserModel = this.checkUser(await this.adminQueries.usersQueries.from(user.impersonatedFromId))\n if (!admin.isAdmin) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n admin.clientId = user.impersonatedClientId\n return this.authManager.setCookies(admin, res)\n }\n\n async deleteUserSpace(userLogin: string, isGuest = false): Promise<void> {\n const userSpace: string = UserModel.getHomePath(userLogin, isGuest)\n try {\n if (await isPathExists(userSpace)) {\n await removeFiles(userSpace)\n this.logger.log(`${this.deleteUserSpace.name} - user space *${userLogin}* was deleted`)\n } else {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* does not exist : ${userSpace}`)\n }\n } catch (e) {\n this.logger.warn(`${this.deleteUserSpace.name} - user space *${userLogin}* (${userSpace}) was not deleted : ${e}`)\n throw new HttpException('Unable to delete user space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n checkUser(user: User | AdminUser | GuestUser, checkOnly: true): void\n checkUser(user: User | AdminUser | GuestUser, checkOnly?: false): UserModel\n checkUser(user: User | AdminUser | GuestUser, checkOnly = false): UserModel | void {\n if (!user) {\n throw new HttpException('User not found', HttpStatus.NOT_FOUND)\n }\n if (!checkOnly) {\n return new UserModel(user, true)\n }\n }\n\n private async renameUserSpace(oldLogin: string, newLogin: string): Promise<boolean> {\n const currentUserSpace: string = UserModel.getHomePath(oldLogin)\n if (!(await isPathExists(currentUserSpace))) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${oldLogin}* does not exist : ${currentUserSpace}`)\n return false\n }\n const newUserSpace: string = UserModel.getHomePath(newLogin)\n if (await isPathExists(newUserSpace)) {\n this.logger.warn(`${this.renameUserSpace.name} - user space *${newLogin}* already exists : ${newUserSpace}`)\n return false\n }\n try {\n await moveFiles(currentUserSpace, newUserSpace)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newUserSpace, currentUserSpace, true)\n this.logger.error(`${this.renameUserSpace.name} - unable to rename user space from *${currentUserSpace}* to *${newUserSpace}* : ${e}`)\n return false\n }\n }\n\n private async checkGroupNameExists(groupName: string): Promise<void> {\n if (await this.adminQueries.usersQueries.checkGroupNameExists(groupName)) {\n throw new HttpException('Name already used', HttpStatus.BAD_REQUEST)\n }\n }\n\n private async loginOrEmailAlreadyUsed(login: string, email: string) {\n const exists = await this.adminQueries.usersQueries.checkUserExists(login, email)\n if (exists) {\n throw new HttpException(`${exists.login === login ? 'Login' : 'Email'} already used`, HttpStatus.BAD_REQUEST)\n }\n }\n}\n"],"names":["AdminUsersManager","listUsers","adminQueries","getUser","userId","user","checkUser","getGuest","guestId","usersQueries","listGuests","createUserOrGuest","createUserDto","userRole","USER_ROLE","USER","asAdmin","loginOrEmailAlreadyUsed","login","email","password","hashPassword","UserModel","id","role","logger","log","name","JSON","stringify","anonymizePassword","clearWhiteListCaches","makePaths","e","error","HttpException","HttpStatus","INTERNAL_SERVER_ERROR","updateUserOrGuest","updateUserDto","updateUser","updateUserGroups","add","delete","updateGuestManagers","k","v","Object","entries","checkUserExists","FORBIDDEN","renameUserSpace","isActive","passwordAttempts","currentGroups","groups","length","map","g","filter","indexOf","GUEST","currentManagers","managers","m","keys","forceRole","undefined","deleteUserOrGuest","userLogin","deleteUserDto","deleteUser","deleteSpace","deleteUserSpace","isGuest","deleteUserOrGuestFromAdmin","userToDelete","from","BAD_REQUEST","createGuest","createGuestDto","push","updateGuest","updateGuestDto","browseGroups","type","GROUP_TYPE","group","groupFromName","NOT_FOUND","parentGroup","members","browseGroupMembers","browseRootGroupMembers","getGroup","groupId","groupFromId","createGroup","createGroupDto","checkGroupNameExists","updateGroup","updateGroupDto","visibility","deleteGroup","warn","addUsersToGroup","userIds","message","updateUserFromGroup","updateUserFromGroupDto","removeUserFromGroup","searchMembers","searchMembersDto","searchUsersOrGroups","impersonateUser","admin","res","impersonatedFromId","impersonatedClientId","clientId","authManager","setCookies","logoutImpersonateUser","isAdmin","userSpace","getHomePath","isPathExists","removeFiles","checkOnly","oldLogin","newLogin","currentUserSpace","newUserSpace","moveFiles","groupName","exists","Logger"],"mappings":"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"}
@@ -16,6 +16,7 @@ const _common = require("@nestjs/common");
16
16
  const _fs = require("fs");
17
17
  const _authtwofaguard = require("../../authentication/guards/auth-two-fa-guard");
18
18
  const _authrequestinterface = require("../../authentication/interfaces/auth-request.interface");
19
+ const _sendfile = require("../files/utils/send-file");
19
20
  const _routes = require("./constants/routes");
20
21
  const _user = require("./constants/user");
21
22
  const _permissionsdecorator = require("./decorators/permissions.decorator");
@@ -29,6 +30,7 @@ const _permissionsguard = require("./guards/permissions.guard");
29
30
  const _rolesguard = require("./guards/roles.guard");
30
31
  const _usermodel = require("./models/user.model");
31
32
  const _usersmanagerservice = require("./services/users-manager.service");
33
+ const _avatar = require("./utils/avatar");
32
34
  function _ts_decorate(decorators, target, key, desc) {
33
35
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
34
36
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -72,7 +74,8 @@ let UsersController = class UsersController {
72
74
  const isMe = login === 'me';
73
75
  const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= _user.USER_ROLE.USER);
74
76
  return new _common.StreamableFile((0, _fs.createReadStream)(path), {
75
- type: mime
77
+ type: mime,
78
+ disposition: (0, _sendfile.makeContentDispositionAttachment)(_avatar.USER_AVATAR_FILE_NAME)
76
79
  });
77
80
  }
78
81
  updateAvatar(req) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/users/users.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, Delete, Get, Header, Param, ParseIntPipe, Patch, Post, Put, Req, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { createReadStream } from 'fs'\nimport { LoginResponseDto } from '../../authentication/dto/login-response.dto'\nimport { AuthTwoFaGuardWithoutPassword } from '../../authentication/guards/auth-two-fa-guard'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { USERS_ROUTE } from './constants/routes'\nimport { USER_PERMISSION, USER_ROLE } from './constants/user'\nimport { UserHavePermission } from './decorators/permissions.decorator'\nimport { UserHaveRole } from './decorators/roles.decorator'\nimport { GetUser } from './decorators/user.decorator'\nimport { UserCreateOrUpdateGroupDto } from './dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from './dto/create-or-update-user.dto'\nimport { SearchMembersDto } from './dto/search-members.dto'\nimport { UserAppPasswordDto, UserLanguageDto, UserNotificationDto, UserStorageIndexingDto, UserUpdatePasswordDto } from './dto/user-properties.dto'\nimport { UserPermissionsGuard } from './guards/permissions.guard'\nimport { UserRolesGuard } from './guards/roles.guard'\nimport { GroupBrowse } from './interfaces/group-browse.interface'\nimport { GroupMember } from './interfaces/group-member'\nimport { GuestUser } from './interfaces/guest-user.interface'\nimport { Member } from './interfaces/member.interface'\nimport { UserAppPassword } from './interfaces/user-secrets.interface'\nimport { UserModel } from './models/user.model'\nimport { UsersManager } from './services/users-manager.service'\n\n@Controller(USERS_ROUTE.BASE)\n@UseGuards(UserRolesGuard)\n@UserHaveRole(USER_ROLE.USER)\nexport class UsersController {\n constructor(private readonly usersManager: UsersManager) {}\n\n @Get(USERS_ROUTE.ME)\n @UserHaveRole(USER_ROLE.LINK)\n me(@GetUser() user: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n return this.usersManager.me(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n listAppPasswords(@GetUser() user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n return this.usersManager.listAppPasswords(user)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n generateAppPassword(@GetUser() user: UserModel, @Body() userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n return this.usersManager.generateAppPassword(user, userAppPasswordDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}/:name`)\n @UserHaveRole(USER_ROLE.USER)\n deleteAppPassword(@GetUser() user: UserModel, @Param('name') name: string): Promise<void> {\n return this.usersManager.deleteAppPassword(user, name)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.LANGUAGE}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateLanguage(@GetUser() user: UserModel, @Body() userLanguageDto: UserLanguageDto) {\n return this.usersManager.updateLanguage(user, userLanguageDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.PASSWORD}`)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n updatePassword(@GetUser() user: UserModel, @Body() userPasswordDto: UserUpdatePasswordDto) {\n return this.usersManager.updatePassword(user, userPasswordDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.NOTIFICATION}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateNotification(@GetUser() user: UserModel, @Body() userNotificationDto: UserNotificationDto) {\n return this.usersManager.updateNotification(user, userNotificationDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.STORAGE_INDEXING}`)\n @UserHaveRole(USER_ROLE.USER)\n updateStorageIndexing(@GetUser() user: UserModel, @Body() userStorageIndexingDto: UserStorageIndexingDto) {\n return this.usersManager.updateStorageIndexing(user, userStorageIndexingDto)\n }\n\n @Get(`${USERS_ROUTE.AVATAR}/:login`)\n @UserHaveRole(USER_ROLE.LINK)\n @Header('cache-control', 'public,max-age=86400')\n async avatar(@GetUser() user: UserModel, @Param('login') login: 'me' | string): Promise<StreamableFile> {\n const isMe: boolean = login === 'me'\n const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= USER_ROLE.USER)\n return new StreamableFile(createReadStream(path), { type: mime })\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n updateAvatar(@Req() req: FastifyAuthenticatedRequest) {\n return this.usersManager.updateAvatar(req)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n genAvatar(@GetUser() user: UserModel) {\n return this.usersManager.getAvatar(user.login, true)\n }\n\n @Search()\n searchMembers(@GetUser() user: UserModel, @Body() searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersManager.searchMembers(user, searchMembersDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.BROWSE}/:name?`)\n browseGroups(@GetUser() user: UserModel, @Param('name') name?: string): Promise<GroupBrowse> {\n return this.usersManager.browseGroups(user, name)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}`)\n @UserHavePermission(USER_PERMISSION.PERSONAL_GROUPS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createPersonalGroup(@GetUser() user: UserModel, @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n return this.usersManager.createPersonalGroup(user, userCreateOrUpdateGroupDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n updatePersonalGroup(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) groupId: number,\n @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto\n ): Promise<GroupMember> {\n return this.usersManager.updatePersonalGroup(user, groupId, userCreateOrUpdateGroupDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n deletePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.deletePersonalGroup(user, groupId)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.GROUPS_LEAVE}/:id`)\n leavePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.leavePersonalGroup(user, groupId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}`)\n addUsersToGroup(@GetUser() user: UserModel, @Param('groupId', ParseIntPipe) groupId: number, @Body() userIds: number[]): Promise<void> {\n return this.usersManager.addUsersToGroup(user, groupId, userIds)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n removeUserFromGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number\n ): Promise<void> {\n return this.usersManager.removeUserFromGroup(user, groupId, userId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n updateUserFromPersonalGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number,\n @Body() updateUserFromGroupDto: UpdateUserFromGroupDto\n ): Promise<void> {\n return this.usersManager.updateUserFromPersonalGroup(user, groupId, userId, updateUserFromGroupDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n listGuests(@GetUser() user: UserModel): Promise<GuestUser[]> {\n return this.usersManager.listGuests(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n getGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<GuestUser> {\n return this.usersManager.getGuest(user, guestId)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n @UserHavePermission(USER_PERMISSION.GUESTS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createGuest(@GetUser() user: UserModel, @Body() createGuestDto: CreateUserDto): Promise<GuestUser> {\n return this.usersManager.createGuest(user, createGuestDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n updateGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number, @Body() updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n return this.usersManager.updateGuest(user, guestId, updateGuestDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n deleteGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<void> {\n return this.usersManager.deleteGuest(user, guestId)\n }\n}\n"],"names":["UsersController","me","user","usersManager","listAppPasswords","generateAppPassword","userAppPasswordDto","deleteAppPassword","name","updateLanguage","userLanguageDto","updatePassword","userPasswordDto","updateNotification","userNotificationDto","updateStorageIndexing","userStorageIndexingDto","avatar","login","isMe","path","mime","getAvatar","role","USER_ROLE","USER","StreamableFile","createReadStream","type","updateAvatar","req","genAvatar","searchMembers","searchMembersDto","browseGroups","createPersonalGroup","userCreateOrUpdateGroupDto","updatePersonalGroup","groupId","deletePersonalGroup","leavePersonalGroup","addUsersToGroup","userIds","removeUserFromGroup","userId","updateUserFromPersonalGroup","updateUserFromGroupDto","listGuests","getGuest","guestId","createGuest","createGuestDto","updateGuest","updateGuestDto","deleteGuest","ME","LINK","USERS_ROUTE","APP_PASSWORDS","LANGUAGE","GUEST","PASSWORD","NOTIFICATION","STORAGE_INDEXING","AVATAR","GROUPS","BROWSE","PERSONAL_GROUPS_ADMIN","GROUPS_LEAVE","USERS","GUESTS","GUESTS_ADMIN","BASE"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/users/users.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, Delete, Get, Header, Param, ParseIntPipe, Patch, Post, Put, Req, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { createReadStream } from 'fs'\nimport { LoginResponseDto } from '../../authentication/dto/login-response.dto'\nimport { AuthTwoFaGuardWithoutPassword } from '../../authentication/guards/auth-two-fa-guard'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { makeContentDispositionAttachment } from '../files/utils/send-file'\nimport { USERS_ROUTE } from './constants/routes'\nimport { USER_PERMISSION, USER_ROLE } from './constants/user'\nimport { UserHavePermission } from './decorators/permissions.decorator'\nimport { UserHaveRole } from './decorators/roles.decorator'\nimport { GetUser } from './decorators/user.decorator'\nimport { UserCreateOrUpdateGroupDto } from './dto/create-or-update-group.dto'\nimport { CreateUserDto, UpdateUserDto, UpdateUserFromGroupDto } from './dto/create-or-update-user.dto'\nimport { SearchMembersDto } from './dto/search-members.dto'\nimport { UserAppPasswordDto, UserLanguageDto, UserNotificationDto, UserStorageIndexingDto, UserUpdatePasswordDto } from './dto/user-properties.dto'\nimport { UserPermissionsGuard } from './guards/permissions.guard'\nimport { UserRolesGuard } from './guards/roles.guard'\nimport { GroupBrowse } from './interfaces/group-browse.interface'\nimport { GroupMember } from './interfaces/group-member'\nimport { GuestUser } from './interfaces/guest-user.interface'\nimport { Member } from './interfaces/member.interface'\nimport { UserAppPassword } from './interfaces/user-secrets.interface'\nimport { UserModel } from './models/user.model'\nimport { UsersManager } from './services/users-manager.service'\nimport { USER_AVATAR_FILE_NAME } from './utils/avatar'\n\n@Controller(USERS_ROUTE.BASE)\n@UseGuards(UserRolesGuard)\n@UserHaveRole(USER_ROLE.USER)\nexport class UsersController {\n constructor(private readonly usersManager: UsersManager) {}\n\n @Get(USERS_ROUTE.ME)\n @UserHaveRole(USER_ROLE.LINK)\n me(@GetUser() user: UserModel): Promise<Omit<LoginResponseDto, 'token'>> {\n return this.usersManager.me(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n listAppPasswords(@GetUser() user: UserModel): Promise<Omit<UserAppPassword, 'password'>[]> {\n return this.usersManager.listAppPasswords(user)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}`)\n @UserHaveRole(USER_ROLE.USER)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n generateAppPassword(@GetUser() user: UserModel, @Body() userAppPasswordDto: UserAppPasswordDto): Promise<UserAppPassword> {\n return this.usersManager.generateAppPassword(user, userAppPasswordDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.APP_PASSWORDS}/:name`)\n @UserHaveRole(USER_ROLE.USER)\n deleteAppPassword(@GetUser() user: UserModel, @Param('name') name: string): Promise<void> {\n return this.usersManager.deleteAppPassword(user, name)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.LANGUAGE}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateLanguage(@GetUser() user: UserModel, @Body() userLanguageDto: UserLanguageDto) {\n return this.usersManager.updateLanguage(user, userLanguageDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.PASSWORD}`)\n @UseGuards(AuthTwoFaGuardWithoutPassword)\n updatePassword(@GetUser() user: UserModel, @Body() userPasswordDto: UserUpdatePasswordDto) {\n return this.usersManager.updatePassword(user, userPasswordDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.NOTIFICATION}`)\n @UserHaveRole(USER_ROLE.GUEST)\n updateNotification(@GetUser() user: UserModel, @Body() userNotificationDto: UserNotificationDto) {\n return this.usersManager.updateNotification(user, userNotificationDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.STORAGE_INDEXING}`)\n @UserHaveRole(USER_ROLE.USER)\n updateStorageIndexing(@GetUser() user: UserModel, @Body() userStorageIndexingDto: UserStorageIndexingDto) {\n return this.usersManager.updateStorageIndexing(user, userStorageIndexingDto)\n }\n\n @Get(`${USERS_ROUTE.AVATAR}/:login`)\n @UserHaveRole(USER_ROLE.LINK)\n @Header('cache-control', 'public,max-age=86400')\n async avatar(@GetUser() user: UserModel, @Param('login') login: 'me' | string): Promise<StreamableFile> {\n const isMe: boolean = login === 'me'\n const [path, mime] = await this.usersManager.getAvatar(isMe ? user.login : login, false, isMe && user.role <= USER_ROLE.USER)\n return new StreamableFile(createReadStream(path), { type: mime, disposition: makeContentDispositionAttachment(USER_AVATAR_FILE_NAME) })\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n updateAvatar(@Req() req: FastifyAuthenticatedRequest) {\n return this.usersManager.updateAvatar(req)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.AVATAR}`)\n genAvatar(@GetUser() user: UserModel) {\n return this.usersManager.getAvatar(user.login, true)\n }\n\n @Search()\n searchMembers(@GetUser() user: UserModel, @Body() searchMembersDto: SearchMembersDto): Promise<Member[]> {\n return this.usersManager.searchMembers(user, searchMembersDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.BROWSE}/:name?`)\n browseGroups(@GetUser() user: UserModel, @Param('name') name?: string): Promise<GroupBrowse> {\n return this.usersManager.browseGroups(user, name)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}`)\n @UserHavePermission(USER_PERMISSION.PERSONAL_GROUPS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createPersonalGroup(@GetUser() user: UserModel, @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto): Promise<GroupMember> {\n return this.usersManager.createPersonalGroup(user, userCreateOrUpdateGroupDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n updatePersonalGroup(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) groupId: number,\n @Body() userCreateOrUpdateGroupDto: UserCreateOrUpdateGroupDto\n ): Promise<GroupMember> {\n return this.usersManager.updatePersonalGroup(user, groupId, userCreateOrUpdateGroupDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:id`)\n deletePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.deletePersonalGroup(user, groupId)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/${USERS_ROUTE.GROUPS_LEAVE}/:id`)\n leavePersonalGroup(@GetUser() user: UserModel, @Param('id', ParseIntPipe) groupId: number): Promise<void> {\n return this.usersManager.leavePersonalGroup(user, groupId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}`)\n addUsersToGroup(@GetUser() user: UserModel, @Param('groupId', ParseIntPipe) groupId: number, @Body() userIds: number[]): Promise<void> {\n return this.usersManager.addUsersToGroup(user, groupId, userIds)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n removeUserFromGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number\n ): Promise<void> {\n return this.usersManager.removeUserFromGroup(user, groupId, userId)\n }\n\n @Patch(`${USERS_ROUTE.ME}/${USERS_ROUTE.GROUPS}/:groupId/${USERS_ROUTE.USERS}/:userId`)\n updateUserFromPersonalGroup(\n @GetUser() user: UserModel,\n @Param('groupId', ParseIntPipe) groupId: number,\n @Param('userId', ParseIntPipe) userId: number,\n @Body() updateUserFromGroupDto: UpdateUserFromGroupDto\n ): Promise<void> {\n return this.usersManager.updateUserFromPersonalGroup(user, groupId, userId, updateUserFromGroupDto)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n listGuests(@GetUser() user: UserModel): Promise<GuestUser[]> {\n return this.usersManager.listGuests(user)\n }\n\n @Get(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n getGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<GuestUser> {\n return this.usersManager.getGuest(user, guestId)\n }\n\n @Post(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}`)\n @UserHavePermission(USER_PERMISSION.GUESTS_ADMIN)\n @UseGuards(UserPermissionsGuard)\n createGuest(@GetUser() user: UserModel, @Body() createGuestDto: CreateUserDto): Promise<GuestUser> {\n return this.usersManager.createGuest(user, createGuestDto)\n }\n\n @Put(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n updateGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number, @Body() updateGuestDto: UpdateUserDto): Promise<GuestUser> {\n return this.usersManager.updateGuest(user, guestId, updateGuestDto)\n }\n\n @Delete(`${USERS_ROUTE.ME}/${USERS_ROUTE.GUESTS}/:id`)\n deleteGuest(@GetUser() user: UserModel, @Param('id', ParseIntPipe) guestId: number): Promise<void> {\n return this.usersManager.deleteGuest(user, guestId)\n }\n}\n"],"names":["UsersController","me","user","usersManager","listAppPasswords","generateAppPassword","userAppPasswordDto","deleteAppPassword","name","updateLanguage","userLanguageDto","updatePassword","userPasswordDto","updateNotification","userNotificationDto","updateStorageIndexing","userStorageIndexingDto","avatar","login","isMe","path","mime","getAvatar","role","USER_ROLE","USER","StreamableFile","createReadStream","type","disposition","makeContentDispositionAttachment","USER_AVATAR_FILE_NAME","updateAvatar","req","genAvatar","searchMembers","searchMembersDto","browseGroups","createPersonalGroup","userCreateOrUpdateGroupDto","updatePersonalGroup","groupId","deletePersonalGroup","leavePersonalGroup","addUsersToGroup","userIds","removeUserFromGroup","userId","updateUserFromPersonalGroup","updateUserFromGroupDto","listGuests","getGuest","guestId","createGuest","createGuestDto","updateGuest","updateGuestDto","deleteGuest","ME","LINK","USERS_ROUTE","APP_PASSWORDS","LANGUAGE","GUEST","PASSWORD","NOTIFICATION","STORAGE_INDEXING","AVATAR","GROUPS","BROWSE","PERSONAL_GROUPS_ADMIN","GROUPS_LEAVE","USERS","GUESTS","GUESTS_ADMIN","BASE"],"mappings":"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"}
@@ -21,8 +21,8 @@
21
21
  */
22
22
 
23
23
  /**
24
- * pdfjsVersion = 5.4.394
25
- * pdfjsBuild = 2cc809ade
24
+ * pdfjsVersion = 5.4.449
25
+ * pdfjsBuild = f44e5f0e6
26
26
  */
27
27
  /******/ // The require scope
28
28
  /******/ var __webpack_require__ = {};
@@ -1847,7 +1847,7 @@ function renderRichText({
1847
1847
  intent: "richText"
1848
1848
  });
1849
1849
  }
1850
- fragment.firstChild.classList.add("richText", className);
1850
+ fragment.firstElementChild.classList.add("richText", className);
1851
1851
  container.append(fragment);
1852
1852
  }
1853
1853
  function makePathFromDrawOPS(data) {
@@ -6323,11 +6323,11 @@ class AnnotationEditor {
6323
6323
  if (nextFirstPosition !== firstPosition) {
6324
6324
  if (nextFirstPosition < firstPosition) {
6325
6325
  for (let i = 0; i < firstPosition - nextFirstPosition; i++) {
6326
- this.#resizersDiv.append(this.#resizersDiv.firstChild);
6326
+ this.#resizersDiv.append(this.#resizersDiv.firstElementChild);
6327
6327
  }
6328
6328
  } else if (nextFirstPosition > firstPosition) {
6329
6329
  for (let i = 0; i < nextFirstPosition - firstPosition; i++) {
6330
- this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);
6330
+ this.#resizersDiv.firstElementChild.before(this.#resizersDiv.lastElementChild);
6331
6331
  }
6332
6332
  }
6333
6333
  let i = 0;
@@ -6339,7 +6339,7 @@ class AnnotationEditor {
6339
6339
  }
6340
6340
  this.#setResizerTabIndex(0);
6341
6341
  this.#isResizerEnabledForKeyboard = true;
6342
- this.#resizersDiv.firstChild.focus({
6342
+ this.#resizersDiv.firstElementChild.focus({
6343
6343
  focusVisible: true
6344
6344
  });
6345
6345
  event.preventDefault();
@@ -6570,10 +6570,10 @@ class AnnotationEditor {
6570
6570
  }
6571
6571
  resetAnnotationElement(annotation) {
6572
6572
  const {
6573
- firstChild
6573
+ firstElementChild
6574
6574
  } = annotation.container;
6575
- if (firstChild?.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) {
6576
- firstChild.remove();
6575
+ if (firstElementChild?.nodeName === "DIV" && firstElementChild.classList.contains("annotationContent")) {
6576
+ firstElementChild.remove();
6577
6577
  }
6578
6578
  }
6579
6579
  }
@@ -7217,6 +7217,9 @@ class FontFaceObject {
7217
7217
  get disableFontFace() {
7218
7218
  return this.#fontData.disableFontFace ?? false;
7219
7219
  }
7220
+ set disableFontFace(value) {
7221
+ shadow(this, "disableFontFace", !!value);
7222
+ }
7220
7223
  get fontExtraProperties() {
7221
7224
  return this.#fontData.fontExtraProperties ?? false;
7222
7225
  }
@@ -7250,6 +7253,9 @@ class FontFaceObject {
7250
7253
  get bbox() {
7251
7254
  return this.#fontData.bbox;
7252
7255
  }
7256
+ set bbox(bbox) {
7257
+ shadow(this, "bbox", bbox);
7258
+ }
7253
7259
  get fontMatrix() {
7254
7260
  return this.#fontData.fontMatrix;
7255
7261
  }
@@ -14408,7 +14414,7 @@ function getDocument(src = {}) {
14408
14414
  }
14409
14415
  const docParams = {
14410
14416
  docId,
14411
- apiVersion: "5.4.394",
14417
+ apiVersion: "5.4.449",
14412
14418
  data,
14413
14419
  password,
14414
14420
  disableAutoFetch,
@@ -14666,6 +14672,9 @@ class PDFDocumentProxy {
14666
14672
  saveDocument() {
14667
14673
  return this._transport.saveDocument();
14668
14674
  }
14675
+ extractPages(pageInfos) {
14676
+ return this._transport.extractPages(pageInfos);
14677
+ }
14669
14678
  getDownloadInfo() {
14670
14679
  return this._transport.downloadInfoCapability.promise;
14671
14680
  }
@@ -15734,6 +15743,11 @@ class WorkerTransport {
15734
15743
  this.annotationStorage.resetModified();
15735
15744
  });
15736
15745
  }
15746
+ extractPages(pageInfos) {
15747
+ return this.messageHandler.sendWithPromise("ExtractPages", {
15748
+ pageInfos
15749
+ });
15750
+ }
15737
15751
  getPage(pageNumber) {
15738
15752
  if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) {
15739
15753
  return Promise.reject(new Error("Invalid page request."));
@@ -15850,7 +15864,8 @@ class WorkerTransport {
15850
15864
  info: results[0],
15851
15865
  metadata: results[1] ? new Metadata(results[1]) : null,
15852
15866
  contentDispositionFilename: this._fullReader?.filename ?? null,
15853
- contentLength: this._fullReader?.contentLength ?? null
15867
+ contentLength: this._fullReader?.contentLength ?? null,
15868
+ hasStructTree: results[2]
15854
15869
  }));
15855
15870
  this.#methodPromises.set(name, promise);
15856
15871
  return promise;
@@ -16064,8 +16079,8 @@ class InternalRenderTask {
16064
16079
  }
16065
16080
  }
16066
16081
  }
16067
- const version = "5.4.394";
16068
- const build = "2cc809ade";
16082
+ const version = "5.4.449";
16083
+ const build = "f44e5f0e6";
16069
16084
 
16070
16085
  ;// ./src/display/editor/color_picker.js
16071
16086
 
@@ -16198,13 +16213,13 @@ class ColorPicker {
16198
16213
  return;
16199
16214
  }
16200
16215
  if (event.target === this.#button) {
16201
- this.#dropdown.firstChild?.focus();
16216
+ this.#dropdown.firstElementChild?.focus();
16202
16217
  return;
16203
16218
  }
16204
16219
  event.target.nextSibling?.focus();
16205
16220
  }
16206
16221
  _moveToPrevious(event) {
16207
- if (event.target === this.#dropdown?.firstChild || event.target === this.#button) {
16222
+ if (event.target === this.#dropdown?.firstElementChild || event.target === this.#button) {
16208
16223
  if (this.#isDropdownVisible) {
16209
16224
  this._hideDropdownFromKeyboard();
16210
16225
  }
@@ -16220,14 +16235,14 @@ class ColorPicker {
16220
16235
  this.#openDropdown(event);
16221
16236
  return;
16222
16237
  }
16223
- this.#dropdown.firstChild?.focus();
16238
+ this.#dropdown.firstElementChild?.focus();
16224
16239
  }
16225
16240
  _moveToEnd(event) {
16226
16241
  if (!this.#isDropdownVisible) {
16227
16242
  this.#openDropdown(event);
16228
16243
  return;
16229
16244
  }
16230
- this.#dropdown.lastChild?.focus();
16245
+ this.#dropdown.lastElementChild?.focus();
16231
16246
  }
16232
16247
  #keyDown(event) {
16233
16248
  ColorPicker._keyboardManager.exec(this, event);
@@ -25663,7 +25678,7 @@ class AnnotationEditorLayer {
25663
25678
  return;
25664
25679
  }
25665
25680
  if (editor.parent && editor.annotationElementId) {
25666
- this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId);
25681
+ this.#uiManager.addDeletedAnnotationElement(editor);
25667
25682
  AnnotationEditor.deleteAnnotationElement(editor);
25668
25683
  editor.annotationElementId = null;
25669
25684
  }
@@ -26195,8 +26210,8 @@ class DrawLayer {
26195
26210
  }
26196
26211
  }
26197
26212
  if (path) {
26198
- const defs = element.firstChild;
26199
- const pathElement = defs.firstChild;
26213
+ const defs = element.firstElementChild;
26214
+ const pathElement = defs.firstElementChild;
26200
26215
  this.#updateProperties(pathElement, path);
26201
26216
  }
26202
26217
  }