@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.
- package/CHANGELOG.md +24 -8
- package/package.json +12 -12
- package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +2 -2
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.spec.js +2 -4
- package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
- package/server/applications/files/services/files-recents.service.js +4 -0
- package/server/applications/files/services/files-recents.service.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +23 -4
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/services/files-tasks-manager.service.js +1 -1
- package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
- package/server/applications/files/utils/send-file.js +18 -9
- package/server/applications/files/utils/send-file.js.map +1 -1
- package/server/applications/files/utils/url-file.js +6 -6
- package/server/applications/files/utils/url-file.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +1 -1
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +6 -4
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +15 -12
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js +9 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +4 -0
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/users.controller.js +4 -1
- package/server/applications/users/users.controller.js.map +1 -1
- package/static/assets/pdfjs/build/pdf.mjs +35 -20
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
- package/static/assets/pdfjs/build/pdf.worker.mjs +1488 -52
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/bg/viewer.ftl +4 -0
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -15
- package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -4
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -14
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -15
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -15
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -15
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +2 -14
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +7 -2
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +3 -12
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +4 -12
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +2 -14
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -1
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/sq/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/th/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +2 -12
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -12
- package/static/assets/pdfjs/web/viewer.css +53 -41
- package/static/assets/pdfjs/web/viewer.html +493 -132
- package/static/assets/pdfjs/web/viewer.mjs +225 -150
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/{chunk-LYZGJZNP.js → chunk-25PWAXTJ.js} +1 -1
- package/static/{chunk-YMAN4LIU.js → chunk-2CAAJBRO.js} +1 -1
- package/static/{chunk-GRLHFXGB.js → chunk-2F42MZQ5.js} +1 -1
- package/static/{chunk-6B3GGAV3.js → chunk-2U5VKTML.js} +1 -1
- package/static/{chunk-HKRGIRKB.js → chunk-3AR5VNJE.js} +1 -1
- package/static/chunk-3WS72A6C.js +1 -0
- package/static/chunk-4GBA6EJ4.js +1 -0
- package/static/{chunk-FNOTGWRW.js → chunk-4ZKAVMB4.js} +1 -1
- package/static/{chunk-XQGPSNQB.js → chunk-5ATJIR5S.js} +1 -1
- package/static/{chunk-HMOB6XC5.js → chunk-5GIWZKNS.js} +1 -1
- package/static/{chunk-ZCOWBVOT.js → chunk-5HYSNQR4.js} +1 -1
- package/static/{chunk-BHZEPHRI.js → chunk-5KVI243T.js} +1 -1
- package/static/{chunk-Q556XB3S.js → chunk-5NFH4E2B.js} +1 -1
- package/static/{chunk-XCLK7NJL.js → chunk-7H5O4BLV.js} +1 -1
- package/static/{chunk-RDNTK4YH.js → chunk-7HL5Z6PF.js} +1 -1
- package/static/{chunk-V6FA5QY4.js → chunk-7QYALK5T.js} +1 -1
- package/static/{chunk-GNZPP2VO.js → chunk-ANH4VNOS.js} +1 -1
- package/static/{chunk-EIYRBM4J.js → chunk-AYYJZMBE.js} +1 -1
- package/static/chunk-B2A4HNDC.js +1 -0
- package/static/{chunk-NOPACN4F.js → chunk-B4TDS6AQ.js} +1 -1
- package/static/chunk-BJARRIS6.js +562 -0
- package/static/{chunk-PXRT4L57.js → chunk-BVKDW5XO.js} +1 -1
- package/static/{chunk-7CKHC72R.js → chunk-BX3QZ7IL.js} +1 -1
- package/static/{chunk-MIA5YBOI.js → chunk-C5T7RZSD.js} +1 -1
- package/static/{chunk-ACUF7IKP.js → chunk-CHMDM2ZW.js} +1 -1
- package/static/{chunk-U4RW6XG5.js → chunk-CUC7R6C2.js} +1 -1
- package/static/{chunk-XOF4UW3S.js → chunk-D6QWQHWE.js} +1 -1
- package/static/{chunk-6NEBGCAZ.js → chunk-DK2LAJEL.js} +1 -1
- package/static/{chunk-C3AAEQKW.js → chunk-DQAQUSVW.js} +1 -1
- package/static/{chunk-NN4ONTOT.js → chunk-DU4Q4RWJ.js} +1 -1
- package/static/{chunk-M4XL3JN5.js → chunk-E5C4QRNQ.js} +2 -2
- package/static/{chunk-BU4ZICZR.js → chunk-EPDWJEPD.js} +1 -1
- package/static/{chunk-I2S3XPC5.js → chunk-FCR5AEHR.js} +2 -2
- package/static/{chunk-4PZPHJ7L.js → chunk-FEQUP26G.js} +1 -1
- package/static/{chunk-ZXXHFBGL.js → chunk-FSGT46LM.js} +1 -1
- package/static/{chunk-QMHUIHSR.js → chunk-GENTF6JM.js} +1 -1
- package/static/{chunk-DQ3GEMPM.js → chunk-GLPKRULI.js} +1 -1
- package/static/{chunk-AZ5TF5Y3.js → chunk-GRV44RYI.js} +1 -1
- package/static/{chunk-JY2I3HGL.js → chunk-GYYJ4FWN.js} +1 -1
- package/static/{chunk-ERDZ7IVF.js → chunk-HB5DC7RJ.js} +1 -1
- package/static/{chunk-DJDRX53V.js → chunk-HLKZCMKV.js} +1 -1
- package/static/{chunk-HNMGPG72.js → chunk-IBC7CFBQ.js} +1 -1
- package/static/{chunk-5E3TYOL3.js → chunk-IIKL33TV.js} +1 -1
- package/static/{chunk-TGLJFALR.js → chunk-JYHTSSKW.js} +1 -1
- package/static/{chunk-VQJYCYWI.js → chunk-KAAFVHYE.js} +1 -1
- package/static/{chunk-VK7XMFVE.js → chunk-KWKZN53T.js} +1 -1
- package/static/{chunk-KDEEERWZ.js → chunk-LBXOAKBD.js} +1 -1
- package/static/{chunk-Y5RLD72B.js → chunk-LFAQLJZK.js} +1 -1
- package/static/chunk-MGMDT4VN.js +1 -0
- package/static/chunk-MWUUM2NK.js +13 -0
- package/static/{chunk-JMYAD7E2.js → chunk-NHMYAVJK.js} +1 -1
- package/static/{chunk-HHWXIK2M.js → chunk-NQCKX2AD.js} +1 -1
- package/static/{chunk-HCSWO7BO.js → chunk-O233BXWK.js} +1 -1
- package/static/{chunk-2TB2INBF.js → chunk-ODAQRAPO.js} +1 -1
- package/static/{chunk-RK2ONYTL.js → chunk-OVUMPMVM.js} +1 -1
- package/static/chunk-Q6B4OVER.js +5 -0
- package/static/{chunk-3YDYZLF7.js → chunk-QKMN3S4M.js} +1 -1
- package/static/{chunk-23UUFZSR.js → chunk-QUUQOBTF.js} +1 -1
- package/static/chunk-QV5LQKTS.js +1 -0
- package/static/{chunk-NKGKBQBX.js → chunk-S4UTSOPV.js} +1 -1
- package/static/{chunk-5S6KPQRA.js → chunk-SF6Q6VRC.js} +1 -1
- package/static/{chunk-BODMMLVB.js → chunk-TOCCCZP2.js} +1 -1
- package/static/{chunk-3WLBVJ2S.js → chunk-UO7ATVQG.js} +1 -1
- package/static/{chunk-AADK5D2H.js → chunk-X5UDV4ZB.js} +1 -1
- package/static/{chunk-S2VBGI6Q.js → chunk-XIQXRSZ2.js} +1 -1
- package/static/chunk-YYTDPI5S.js +1 -0
- package/static/{chunk-EL6QL4TP.js → chunk-Z2KBIZ5D.js} +1 -1
- package/static/{chunk-K657XPXA.js → chunk-ZCOEP4O2.js} +1 -1
- package/static/index.html +2 -2
- package/static/main-ODUA232E.js +11 -0
- package/static/{styles-Q4OZOSSK.css → styles-S5HVK4H5.css} +1 -1
- package/static/chunk-5XUIPWOH.js +0 -1
- package/static/chunk-EDJAISWO.js +0 -13
- package/static/chunk-H6WOTGQ5.js +0 -1
- package/static/chunk-HC7F57NA.js +0 -1
- package/static/chunk-IOIBQGHN.js +0 -562
- package/static/chunk-J6YSFHLZ.js +0 -1
- package/static/chunk-JWPXQOS3.js +0 -5
- package/static/chunk-QVFPHTOH.js +0 -1
- package/static/chunk-YCTCESL4.js +0 -1
- 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":"AAAA;;;;CAIC;;;;+BA+BYA;;;eAAAA;;;wBA7BwH;oBACpG;gCAEa;sCACF;0BACK;wBACrB;sBACe;sCACR;gCACN;+BACL;wCACmB;uCAC0B;kCACpC;mCACuF;kCACnF;4BACN;2BAML;qCACG;wBACS;;;;;;;;;;;;;;;AAK/B,IAAA,AAAMA,kBAAN,MAAMA;IAKXC,GAAG,AAAWC,IAAe,EAA4C;QACvE,OAAO,IAAI,CAACC,YAAY,CAACF,EAAE,CAACC;IAC9B;IAKAE,iBAAiB,AAAWF,IAAe,EAAgD;QACzF,OAAO,IAAI,CAACC,YAAY,CAACC,gBAAgB,CAACF;IAC5C;IAKAG,oBAAoB,AAAWH,IAAe,EAAE,AAAQI,kBAAsC,EAA4B;QACxH,OAAO,IAAI,CAACH,YAAY,CAACE,mBAAmB,CAACH,MAAMI;IACrD;IAIAC,kBAAkB,AAAWL,IAAe,EAAE,AAAeM,IAAY,EAAiB;QACxF,OAAO,IAAI,CAACL,YAAY,CAACI,iBAAiB,CAACL,MAAMM;IACnD;IAIAC,eAAe,AAAWP,IAAe,EAAE,AAAQQ,eAAgC,EAAE;QACnF,OAAO,IAAI,CAACP,YAAY,CAACM,cAAc,CAACP,MAAMQ;IAChD;IAIAC,eAAe,AAAWT,IAAe,EAAE,AAAQU,eAAsC,EAAE;QACzF,OAAO,IAAI,CAACT,YAAY,CAACQ,cAAc,CAACT,MAAMU;IAChD;IAIAC,mBAAmB,AAAWX,IAAe,EAAE,AAAQY,mBAAwC,EAAE;QAC/F,OAAO,IAAI,CAACX,YAAY,CAACU,kBAAkB,CAACX,MAAMY;IACpD;IAIAC,sBAAsB,AAAWb,IAAe,EAAE,AAAQc,sBAA8C,EAAE;QACxG,OAAO,IAAI,CAACb,YAAY,CAACY,qBAAqB,CAACb,MAAMc;IACvD;IAEA,MAGMC,OAAO,AAAWf,IAAe,EAAE,AAAgBgB,KAAoB,EAA2B;QACtG,MAAMC,OAAgBD,UAAU;QAChC,MAAM,CAACE,MAAMC,KAAK,GAAG,MAAM,IAAI,CAAClB,YAAY,CAACmB,SAAS,CAACH,OAAOjB,KAAKgB,KAAK,GAAGA,OAAO,OAAOC,QAAQjB,KAAKqB,IAAI,IAAIC,eAAS,CAACC,IAAI;QAC5H,OAAO,IAAIC,sBAAc,CAACC,IAAAA,oBAAgB,EAACP,OAAO;YAAEQ,MAAMP;YAAMQ,aAAaC,IAAAA,0CAAgC,EAACC,6BAAqB;QAAE;IACvI;IAGAC,aAAa,AAAOC,GAAgC,EAAE;QACpD,OAAO,IAAI,CAAC9B,YAAY,CAAC6B,YAAY,CAACC;IACxC;IAGAC,UAAU,AAAWhC,IAAe,EAAE;QACpC,OAAO,IAAI,CAACC,YAAY,CAACmB,SAAS,CAACpB,KAAKgB,KAAK,EAAE;IACjD;IAGAiB,cAAc,AAAWjC,IAAe,EAAE,AAAQkC,gBAAkC,EAAqB;QACvG,OAAO,IAAI,CAACjC,YAAY,CAACgC,aAAa,CAACjC,MAAMkC;IAC/C;IAGAC,aAAa,AAAWnC,IAAe,EAAE,AAAeM,IAAa,EAAwB;QAC3F,OAAO,IAAI,CAACL,YAAY,CAACkC,YAAY,CAACnC,MAAMM;IAC9C;IAKA8B,oBAAoB,AAAWpC,IAAe,EAAE,AAAQqC,0BAAsD,EAAwB;QACpI,OAAO,IAAI,CAACpC,YAAY,CAACmC,mBAAmB,CAACpC,MAAMqC;IACrD;IAGAC,oBACE,AAAWtC,IAAe,EAC1B,AAA2BuC,OAAe,EAC1C,AAAQF,0BAAsD,EACxC;QACtB,OAAO,IAAI,CAACpC,YAAY,CAACqC,mBAAmB,CAACtC,MAAMuC,SAASF;IAC9D;IAGAG,oBAAoB,AAAWxC,IAAe,EAAE,AAA2BuC,OAAe,EAAiB;QACzG,OAAO,IAAI,CAACtC,YAAY,CAACuC,mBAAmB,CAACxC,MAAMuC;IACrD;IAGAE,mBAAmB,AAAWzC,IAAe,EAAE,AAA2BuC,OAAe,EAAiB;QACxG,OAAO,IAAI,CAACtC,YAAY,CAACwC,kBAAkB,CAACzC,MAAMuC;IACpD;IAGAG,gBAAgB,AAAW1C,IAAe,EAAE,AAAgCuC,OAAe,EAAE,AAAQI,OAAiB,EAAiB;QACrI,OAAO,IAAI,CAAC1C,YAAY,CAACyC,eAAe,CAAC1C,MAAMuC,SAASI;IAC1D;IAGAC,oBACE,AAAW5C,IAAe,EAC1B,AAAgCuC,OAAe,EAC/C,AAA+BM,MAAc,EAC9B;QACf,OAAO,IAAI,CAAC5C,YAAY,CAAC2C,mBAAmB,CAAC5C,MAAMuC,SAASM;IAC9D;IAGAC,4BACE,AAAW9C,IAAe,EAC1B,AAAgCuC,OAAe,EAC/C,AAA+BM,MAAc,EAC7C,AAAQE,sBAA8C,EACvC;QACf,OAAO,IAAI,CAAC9C,YAAY,CAAC6C,2BAA2B,CAAC9C,MAAMuC,SAASM,QAAQE;IAC9E;IAGAC,WAAW,AAAWhD,IAAe,EAAwB;QAC3D,OAAO,IAAI,CAACC,YAAY,CAAC+C,UAAU,CAAChD;IACtC;IAGAiD,SAAS,AAAWjD,IAAe,EAAE,AAA2BkD,OAAe,EAAsB;QACnG,OAAO,IAAI,CAACjD,YAAY,CAACgD,QAAQ,CAACjD,MAAMkD;IAC1C;IAKAC,YAAY,AAAWnD,IAAe,EAAE,AAAQoD,cAA6B,EAAsB;QACjG,OAAO,IAAI,CAACnD,YAAY,CAACkD,WAAW,CAACnD,MAAMoD;IAC7C;IAGAC,YAAY,AAAWrD,IAAe,EAAE,AAA2BkD,OAAe,EAAE,AAAQI,cAA6B,EAAsB;QAC7I,OAAO,IAAI,CAACrD,YAAY,CAACoD,WAAW,CAACrD,MAAMkD,SAASI;IACtD;IAGAC,YAAY,AAAWvD,IAAe,EAAE,AAA2BkD,OAAe,EAAiB;QACjG,OAAO,IAAI,CAACjD,YAAY,CAACsD,WAAW,CAACvD,MAAMkD;IAC7C;IA5JA,YAAY,AAAiBjD,YAA0B,CAAE;aAA5BA,eAAAA;IAA6B;AA6J5D;;yCA3JmBuD;sDACOC;;;;;;;;;wBAKhBC,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACC,aAAa;sDAC3BpC;;;;;;;;;;yBAMfmC,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACC,aAAa;sDAC5BpC;;;;;;;;;;;;2BAMbmC,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACC,aAAa,CAAC,MAAM;sDACrCpC;;;;;;;;;;;wBAKhBmC,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACE,QAAQ;sDACtBC;;;;;;;;;;;wBAKhBH,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACI,QAAQ;;;;;;;;;;;;wBAMtCJ,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACK,YAAY;sDAC1BF;;;;;;;;;;;wBAKhBH,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACM,gBAAgB;sDAC9BzC;;;;;;;;;;;wBAKhBmC,mBAAW,CAACO,MAAM,CAAC,OAAO;sDACVR;;;;;;;;;;;;wBAQhBC,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACO,MAAM;;;;;;;;;0BAKlCP,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACO,MAAM;;;;;;;;;;;;;;;;;;;;wBAUtCP,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,CAAC,EAAER,mBAAW,CAACS,MAAM,CAAC,OAAO;;;;;;;;;;;yBAKjET,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM;wEACTE;;;;;;;;;;;;wBAM5BV,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,IAAI;;;;;;;;;;;;;2BAStCR,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,IAAI;;;;;;;;;;;2BAKzCR,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,CAAC,EAAER,mBAAW,CAACW,YAAY,CAAC,IAAI;;;;;;;;;;;0BAKtEX,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,UAAU,EAAER,mBAAW,CAACY,KAAK;;;;;;;;;;;;;2BAKjEZ,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,UAAU,EAAER,mBAAW,CAACY,KAAK,CAAC,QAAQ;;;;;;;;;;;;;0BAS5EZ,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACQ,MAAM,CAAC,UAAU,EAAER,mBAAW,CAACY,KAAK,CAAC,QAAQ;;;;;;;;;;;;;;;wBAU7EZ,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACa,MAAM;;;;;;;;;wBAKpCb,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACa,MAAM,CAAC,IAAI;;;;;;;;;;;yBAKxCb,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACa,MAAM;wEACTC;;;;;;;;;;;;wBAM5Bd,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACa,MAAM,CAAC,IAAI;;;;;;;;;;;;;2BAKtCb,mBAAW,CAACF,EAAE,CAAC,CAAC,EAAEE,mBAAW,CAACa,MAAM,CAAC,IAAI;;;;;;;;;;;gDA7J9BE;;sDAEAlD"}
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
* pdfjsVersion = 5.4.
|
|
25
|
-
* pdfjsBuild =
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
6573
|
+
firstElementChild
|
|
6574
6574
|
} = annotation.container;
|
|
6575
|
-
if (
|
|
6576
|
-
|
|
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.
|
|
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.
|
|
16068
|
-
const build = "
|
|
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.
|
|
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?.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
26199
|
-
const pathElement = defs.
|
|
26213
|
+
const defs = element.firstElementChild;
|
|
26214
|
+
const pathElement = defs.firstElementChild;
|
|
26200
26215
|
this.#updateProperties(pathElement, path);
|
|
26201
26216
|
}
|
|
26202
26217
|
}
|