@sync-in/server 1.11.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/LICENSE +1 -1
- package/README.md +3 -11
- package/environment/environment.dist.min.yaml +1 -1
- package/environment/environment.dist.yaml +173 -28
- package/package.json +17 -16
- package/server/app.bootstrap.js +1 -5
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +1 -5
- package/server/app.constants.js.map +1 -1
- package/server/app.e2e-spec.js +1 -5
- package/server/app.e2e-spec.js.map +1 -1
- package/server/app.functions.js +1 -5
- package/server/app.functions.js.map +1 -1
- package/server/app.module.js +1 -5
- package/server/app.module.js.map +1 -1
- package/server/app.service.js +1 -5
- package/server/app.service.js.map +1 -1
- package/server/app.service.spec.js +2 -6
- package/server/app.service.spec.js.map +1 -1
- package/server/applications/admin/admin.module.js +1 -5
- package/server/applications/admin/admin.module.js.map +1 -1
- package/server/applications/admin/constants/routes.js +1 -5
- package/server/applications/admin/constants/routes.js.map +1 -1
- package/server/applications/admin/interfaces/check-update.interfaces.js +1 -5
- package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -1
- package/server/applications/admin/services/admin-scheduler.service.js +1 -5
- package/server/applications/admin/services/admin-scheduler.service.js.map +1 -1
- package/server/applications/admin/services/admin.service.js +13 -8
- package/server/applications/admin/services/admin.service.js.map +1 -1
- package/server/applications/admin/services/admin.service.spec.js +1 -5
- package/server/applications/admin/services/admin.service.spec.js.map +1 -1
- package/server/applications/admin/utils/check-update.js +1 -5
- package/server/applications/admin/utils/check-update.js.map +1 -1
- package/server/applications/applications.config.js +1 -5
- package/server/applications/applications.config.js.map +1 -1
- package/server/applications/applications.constants.js +5 -5
- package/server/applications/applications.constants.js.map +1 -1
- package/server/applications/applications.module.js +1 -5
- package/server/applications/applications.module.js.map +1 -1
- package/server/applications/comments/comments.controller.js +1 -5
- package/server/applications/comments/comments.controller.js.map +1 -1
- package/server/applications/comments/comments.controller.spec.js +1 -5
- package/server/applications/comments/comments.controller.spec.js.map +1 -1
- package/server/applications/comments/comments.module.js +1 -5
- package/server/applications/comments/comments.module.js.map +1 -1
- package/server/applications/comments/constants/routes.js +1 -5
- package/server/applications/comments/constants/routes.js.map +1 -1
- package/server/applications/comments/dto/comment.dto.js +1 -5
- package/server/applications/comments/dto/comment.dto.js.map +1 -1
- package/server/applications/comments/interfaces/comment-recent.interface.js +1 -5
- package/server/applications/comments/interfaces/comment-recent.interface.js.map +1 -1
- package/server/applications/comments/schemas/comment.interface.js +1 -5
- package/server/applications/comments/schemas/comment.interface.js.map +1 -1
- package/server/applications/comments/schemas/comments.schema.js +1 -5
- package/server/applications/comments/schemas/comments.schema.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.js +9 -7
- package/server/applications/comments/services/comments-manager.service.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js +10 -8
- package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
- package/server/applications/comments/services/comments-queries.service.js +1 -5
- package/server/applications/comments/services/comments-queries.service.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.js +29 -12
- package/server/applications/files/adapters/files-indexer-mysql.service.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +1 -5
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -1
- package/server/applications/files/constants/cache.js +1 -5
- package/server/applications/files/constants/cache.js.map +1 -1
- package/server/applications/files/constants/compress.js +1 -5
- package/server/applications/files/constants/compress.js.map +1 -1
- package/server/applications/files/constants/files.js +1 -5
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/indexing.js +1 -5
- package/server/applications/files/constants/indexing.js.map +1 -1
- package/server/applications/files/constants/operations.js +1 -5
- package/server/applications/files/constants/operations.js.map +1 -1
- package/server/applications/files/constants/routes.js +1 -5
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/constants/samples.js +1 -5
- package/server/applications/files/constants/samples.js.map +1 -1
- package/server/applications/files/dto/file-operations.dto.js +1 -5
- package/server/applications/files/dto/file-operations.dto.js.map +1 -1
- package/server/applications/files/events/file-task-event.js +1 -5
- package/server/applications/files/events/file-task-event.js.map +1 -1
- package/server/applications/files/files-tasks.controller.js +1 -5
- package/server/applications/files/files-tasks.controller.js.map +1 -1
- package/server/applications/files/files-tasks.controller.spec.js +1 -5
- package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
- package/server/applications/files/files.config.js +1 -5
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.js +1 -5
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +1 -5
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/files.module.js +1 -5
- package/server/applications/files/files.module.js.map +1 -1
- package/server/applications/files/interfaces/file-db-props.interface.js +1 -5
- package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-lock.interface.js +1 -5
- package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-parse-index.js +1 -5
- package/server/applications/files/interfaces/file-parse-index.js.map +1 -1
- package/server/applications/files/interfaces/file-props.interface.js +1 -5
- package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-recent-location.interface.js +1 -5
- package/server/applications/files/interfaces/file-recent-location.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-space.interface.js +1 -5
- package/server/applications/files/interfaces/file-space.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-tree.interface.js +1 -5
- package/server/applications/files/interfaces/file-tree.interface.js.map +1 -1
- package/server/applications/files/models/file-error.js +1 -5
- package/server/applications/files/models/file-error.js.map +1 -1
- package/server/applications/files/models/file-lock-error.js +1 -5
- package/server/applications/files/models/file-lock-error.js.map +1 -1
- package/server/applications/files/models/file-task.js +1 -5
- package/server/applications/files/models/file-task.js.map +1 -1
- package/server/applications/files/models/files-indexer.js +1 -5
- package/server/applications/files/models/files-indexer.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +21 -10
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.config.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.module.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js +1 -5
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -1
- package/server/applications/files/modules/file-editor-providers.interface.js +6 -0
- package/server/applications/files/modules/file-editor-providers.interface.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js +1 -5
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office-manager.service.js +57 -19
- package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.config.js +1 -5
- package/server/applications/files/modules/only-office/only-office.config.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.constants.js +1 -5
- package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.controller.js +1 -5
- package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.controller.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.dtos.js +1 -5
- package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.guard.js +1 -5
- package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.guard.spec.js +1 -5
- package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.interface.js +1 -5
- package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.module.js +1 -5
- package/server/applications/files/modules/only-office/only-office.module.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.routes.js +1 -5
- package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -1
- package/server/applications/files/modules/only-office/only-office.strategy.js +1 -5
- package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -1
- package/server/applications/files/schemas/file-content.interface.js +1 -5
- package/server/applications/files/schemas/file-content.interface.js.map +1 -1
- package/server/applications/files/schemas/file-recent.interface.js +1 -5
- package/server/applications/files/schemas/file-recent.interface.js.map +1 -1
- package/server/applications/files/schemas/file.interface.js +1 -5
- package/server/applications/files/schemas/file.interface.js.map +1 -1
- package/server/applications/files/schemas/files-content.schema.js +1 -5
- package/server/applications/files/schemas/files-content.schema.js.map +1 -1
- package/server/applications/files/schemas/files-recents.schema.js +1 -5
- package/server/applications/files/schemas/files-recents.schema.js.map +1 -1
- package/server/applications/files/schemas/files.schema.js +1 -5
- package/server/applications/files/schemas/files.schema.js.map +1 -1
- package/server/applications/files/services/files-content-manager.service.js +45 -16
- package/server/applications/files/services/files-content-manager.service.js.map +1 -1
- package/server/applications/files/services/files-lock-manager.service.js +53 -18
- package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
- package/server/applications/files/services/files-lock-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-lock-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +77 -24
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +5 -6
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.spec.js +1 -5
- package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
- package/server/applications/files/services/files-parser.service.js +13 -8
- package/server/applications/files/services/files-parser.service.js.map +1 -1
- package/server/applications/files/services/files-parser.service.spec.js +1 -5
- package/server/applications/files/services/files-parser.service.spec.js.map +1 -1
- package/server/applications/files/services/files-queries.service.js +29 -12
- package/server/applications/files/services/files-queries.service.js.map +1 -1
- package/server/applications/files/services/files-recents.service.js +1 -5
- package/server/applications/files/services/files-recents.service.js.map +1 -1
- package/server/applications/files/services/files-recents.service.spec.js +1 -5
- package/server/applications/files/services/files-recents.service.spec.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +77 -24
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.js +9 -7
- package/server/applications/files/services/files-search-manager.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-search-manager.service.spec.js.map +1 -1
- package/server/applications/files/services/files-tasks-manager.service.js +77 -24
- package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
- package/server/applications/files/services/files-tasks-manager.service.spec.js +1 -5
- package/server/applications/files/services/files-tasks-manager.service.spec.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/excel.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/excel.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/html.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/html.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/open-office.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/open-office.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/power-point.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/power-point.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/text.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/text.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/word.js +1 -5
- package/server/applications/files/utils/doc-textify/adapters/word.js.map +1 -1
- package/server/applications/files/utils/doc-textify/doc-textify.js +1 -5
- package/server/applications/files/utils/doc-textify/doc-textify.js.map +1 -1
- package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js +1 -5
- package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js.map +1 -1
- package/server/applications/files/utils/doc-textify/utils/clean.js +1 -5
- package/server/applications/files/utils/doc-textify/utils/clean.js.map +1 -1
- package/server/applications/files/utils/files-search.js +1 -5
- package/server/applications/files/utils/files-search.js.map +1 -1
- package/server/applications/files/utils/files-tree.js +1 -5
- package/server/applications/files/utils/files-tree.js.map +1 -1
- package/server/applications/files/utils/files.js +1 -5
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/files/utils/send-file.js +1 -5
- package/server/applications/files/utils/send-file.js.map +1 -1
- package/server/applications/files/utils/unzip-file.js +1 -5
- package/server/applications/files/utils/unzip-file.js.map +1 -1
- package/server/applications/files/utils/url-file.js +1 -5
- package/server/applications/files/utils/url-file.js.map +1 -1
- package/server/applications/links/constants/cache.js +1 -5
- package/server/applications/links/constants/cache.js.map +1 -1
- package/server/applications/links/constants/links.js +1 -5
- package/server/applications/links/constants/links.js.map +1 -1
- package/server/applications/links/constants/routes.js +1 -5
- package/server/applications/links/constants/routes.js.map +1 -1
- package/server/applications/links/dto/create-or-update-link.dto.js +1 -5
- package/server/applications/links/dto/create-or-update-link.dto.js.map +1 -1
- package/server/applications/links/interfaces/link-guest.interface.js +1 -5
- package/server/applications/links/interfaces/link-guest.interface.js.map +1 -1
- package/server/applications/links/interfaces/link-space.interface.js +1 -5
- package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
- package/server/applications/links/links.controller.js +1 -5
- package/server/applications/links/links.controller.js.map +1 -1
- package/server/applications/links/links.controller.spec.js +1 -5
- package/server/applications/links/links.controller.spec.js.map +1 -1
- package/server/applications/links/schemas/link.interface.js +1 -5
- package/server/applications/links/schemas/link.interface.js.map +1 -1
- package/server/applications/links/schemas/links.schema.js +1 -5
- package/server/applications/links/schemas/links.schema.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +55 -20
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +3 -7
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +1 -5
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/notifications/constants/notifications.js +1 -5
- package/server/applications/notifications/constants/notifications.js.map +1 -1
- package/server/applications/notifications/constants/routes.js +1 -5
- package/server/applications/notifications/constants/routes.js.map +1 -1
- package/server/applications/notifications/constants/websocket.js +1 -5
- package/server/applications/notifications/constants/websocket.js.map +1 -1
- package/server/applications/notifications/i18n/de.js +1 -9
- package/server/applications/notifications/i18n/de.js.map +1 -1
- package/server/applications/notifications/i18n/es.js +1 -5
- package/server/applications/notifications/i18n/es.js.map +1 -1
- package/server/applications/notifications/i18n/fr.js +1 -5
- package/server/applications/notifications/i18n/fr.js.map +1 -1
- package/server/applications/notifications/i18n/hi.js +1 -5
- package/server/applications/notifications/i18n/hi.js.map +1 -1
- package/server/applications/notifications/i18n/index.js +1 -5
- package/server/applications/notifications/i18n/index.js.map +1 -1
- package/server/applications/notifications/i18n/it.js +1 -5
- package/server/applications/notifications/i18n/it.js.map +1 -1
- package/server/applications/notifications/i18n/ja.js +1 -5
- package/server/applications/notifications/i18n/ja.js.map +1 -1
- package/server/applications/notifications/i18n/ko.js +1 -5
- package/server/applications/notifications/i18n/ko.js.map +1 -1
- package/server/applications/notifications/i18n/pl.js +1 -5
- package/server/applications/notifications/i18n/pl.js.map +1 -1
- package/server/applications/notifications/i18n/pt.js +1 -5
- package/server/applications/notifications/i18n/pt.js.map +1 -1
- package/server/applications/notifications/i18n/pt_br.js +1 -5
- package/server/applications/notifications/i18n/pt_br.js.map +1 -1
- package/server/applications/notifications/i18n/ru.js +1 -5
- package/server/applications/notifications/i18n/ru.js.map +1 -1
- package/server/applications/notifications/i18n/tr.js +1 -5
- package/server/applications/notifications/i18n/tr.js.map +1 -1
- package/server/applications/notifications/i18n/zh.js +1 -5
- package/server/applications/notifications/i18n/zh.js.map +1 -1
- package/server/applications/notifications/interfaces/notification-properties.interface.js +1 -5
- package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js +1 -5
- package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -1
- package/server/applications/notifications/mails/models.js +1 -5
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/mails/templates.js +1 -5
- package/server/applications/notifications/mails/templates.js.map +1 -1
- package/server/applications/notifications/mails/urls.js +1 -5
- package/server/applications/notifications/mails/urls.js.map +1 -1
- package/server/applications/notifications/notifications.controller.js +1 -5
- package/server/applications/notifications/notifications.controller.js.map +1 -1
- package/server/applications/notifications/notifications.controller.spec.js +1 -5
- package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
- package/server/applications/notifications/notifications.gateway.js +1 -5
- package/server/applications/notifications/notifications.gateway.js.map +1 -1
- package/server/applications/notifications/notifications.module.js +1 -5
- package/server/applications/notifications/notifications.module.js.map +1 -1
- package/server/applications/notifications/schemas/notification.interface.js +1 -5
- package/server/applications/notifications/schemas/notification.interface.js.map +1 -1
- package/server/applications/notifications/schemas/notifications.schema.js +1 -5
- package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js +25 -11
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.spec.js +20 -11
- package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
- package/server/applications/notifications/services/notifications-queries.service.js +1 -5
- package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
- package/server/applications/shares/constants/routes.js +1 -5
- package/server/applications/shares/constants/routes.js.map +1 -1
- package/server/applications/shares/constants/shares.js +1 -5
- package/server/applications/shares/constants/shares.js.map +1 -1
- package/server/applications/shares/dto/create-or-update-share.dto.js +1 -5
- package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
- package/server/applications/shares/interfaces/share-child.interface.js +1 -5
- package/server/applications/shares/interfaces/share-child.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-env.interface.js +1 -5
- package/server/applications/shares/interfaces/share-env.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-file.interface.js +1 -5
- package/server/applications/shares/interfaces/share-file.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-link.interface.js +1 -5
- package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
- package/server/applications/shares/interfaces/share-props.interface.js +1 -5
- package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
- package/server/applications/shares/models/share-child.model.js +1 -5
- package/server/applications/shares/models/share-child.model.js.map +1 -1
- package/server/applications/shares/schemas/share-members.interface.js +1 -5
- package/server/applications/shares/schemas/share-members.interface.js.map +1 -1
- package/server/applications/shares/schemas/share.interface.js +1 -5
- package/server/applications/shares/schemas/share.interface.js.map +1 -1
- package/server/applications/shares/schemas/shares-members.schema.js +1 -5
- package/server/applications/shares/schemas/shares-members.schema.js.map +1 -1
- package/server/applications/shares/schemas/shares.schema.js +1 -5
- package/server/applications/shares/schemas/shares.schema.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +214 -68
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +1 -5
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +49 -17
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/shares/shares.controller.js +1 -5
- package/server/applications/shares/shares.controller.js.map +1 -1
- package/server/applications/shares/shares.controller.spec.js +1 -5
- package/server/applications/shares/shares.controller.spec.js.map +1 -1
- package/server/applications/shares/shares.module.js +1 -5
- package/server/applications/shares/shares.module.js.map +1 -1
- package/server/applications/spaces/constants/cache.js +1 -5
- package/server/applications/spaces/constants/cache.js.map +1 -1
- package/server/applications/spaces/constants/routes.js +1 -5
- package/server/applications/spaces/constants/routes.js.map +1 -1
- package/server/applications/spaces/constants/spaces.js +1 -5
- package/server/applications/spaces/constants/spaces.js.map +1 -1
- package/server/applications/spaces/decorators/space-override-permission.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space-skip-guard.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-skip-guard.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space-skip-permissions.decorator.js +1 -5
- package/server/applications/spaces/decorators/space-skip-permissions.decorator.js.map +1 -1
- package/server/applications/spaces/decorators/space.decorator.js +1 -5
- package/server/applications/spaces/decorators/space.decorator.js.map +1 -1
- package/server/applications/spaces/dto/create-or-update-space.dto.js +1 -5
- package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/delete-space.dto.js +1 -5
- package/server/applications/spaces/dto/delete-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/search-space.dto.js +1 -5
- package/server/applications/spaces/dto/search-space.dto.js.map +1 -1
- package/server/applications/spaces/dto/space-roots.dto.js +1 -5
- package/server/applications/spaces/dto/space-roots.dto.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.js +17 -9
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +1 -5
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/spaces/interfaces/space-diff.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-diff.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-files.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-files.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-request.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-request.interface.js.map +1 -1
- package/server/applications/spaces/interfaces/space-trash.interface.js +1 -5
- package/server/applications/spaces/interfaces/space-trash.interface.js.map +1 -1
- package/server/applications/spaces/models/space-env.model.js +1 -5
- package/server/applications/spaces/models/space-env.model.js.map +1 -1
- package/server/applications/spaces/models/space-props.model.js +1 -5
- package/server/applications/spaces/models/space-props.model.js.map +1 -1
- package/server/applications/spaces/models/space-root-props.model.js +1 -5
- package/server/applications/spaces/models/space-root-props.model.js.map +1 -1
- package/server/applications/spaces/models/space.model.js +1 -5
- package/server/applications/spaces/models/space.model.js.map +1 -1
- package/server/applications/spaces/schemas/space-members.interface.js +1 -5
- package/server/applications/spaces/schemas/space-members.interface.js.map +1 -1
- package/server/applications/spaces/schemas/space-root.interface.js +1 -5
- package/server/applications/spaces/schemas/space-root.interface.js.map +1 -1
- package/server/applications/spaces/schemas/space.interface.js +1 -5
- package/server/applications/spaces/schemas/space.interface.js.map +1 -1
- package/server/applications/spaces/schemas/spaces-members.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces-members.schema.js.map +1 -1
- package/server/applications/spaces/schemas/spaces-roots.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces-roots.schema.js.map +1 -1
- package/server/applications/spaces/schemas/spaces.schema.js +1 -5
- package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js +77 -24
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.spec.js +1 -5
- package/server/applications/spaces/services/spaces-browser.service.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +193 -53
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.spec.js +1 -5
- package/server/applications/spaces/services/spaces-manager.service.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-queries.service.js +65 -21
- package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js +49 -17
- package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
- package/server/applications/spaces/spaces.controller.js +1 -5
- package/server/applications/spaces/spaces.controller.js.map +1 -1
- package/server/applications/spaces/spaces.controller.spec.js +1 -5
- package/server/applications/spaces/spaces.controller.spec.js.map +1 -1
- package/server/applications/spaces/spaces.module.js +1 -5
- package/server/applications/spaces/spaces.module.js.map +1 -1
- package/server/applications/spaces/utils/paths.js +1 -5
- package/server/applications/spaces/utils/paths.js.map +1 -1
- package/server/applications/spaces/utils/permissions.js +1 -5
- package/server/applications/spaces/utils/permissions.js.map +1 -1
- package/server/applications/spaces/utils/routes.js +1 -5
- package/server/applications/spaces/utils/routes.js.map +1 -1
- package/server/applications/sync/constants/auth.js +1 -5
- package/server/applications/sync/constants/auth.js.map +1 -1
- package/server/applications/sync/constants/routes.js +6 -5
- package/server/applications/sync/constants/routes.js.map +1 -1
- package/server/applications/sync/constants/store.js +1 -9
- package/server/applications/sync/constants/store.js.map +1 -1
- package/server/applications/sync/constants/sync.js +2 -6
- package/server/applications/sync/constants/sync.js.map +1 -1
- package/server/applications/sync/decorators/sync-context.decorator.js +1 -5
- package/server/applications/sync/decorators/sync-context.decorator.js.map +1 -1
- package/server/applications/sync/decorators/sync-environment.decorator.js +1 -5
- package/server/applications/sync/decorators/sync-environment.decorator.js.map +1 -1
- package/server/applications/sync/dtos/sync-client-auth.dto.js +12 -8
- package/server/applications/sync/dtos/sync-client-auth.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-client-info.dto.js +49 -0
- package/server/applications/sync/dtos/sync-client-info.dto.js.map +1 -0
- package/server/applications/sync/dtos/sync-client-registration.dto.js +34 -11
- package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-operations.dto.js +1 -5
- package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-path.dto.js +1 -5
- package/server/applications/sync/dtos/sync-path.dto.js.map +1 -1
- package/server/applications/sync/dtos/sync-upload.dto.js +1 -5
- package/server/applications/sync/dtos/sync-upload.dto.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js +1 -5
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +1 -5
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -1
- package/server/applications/sync/interfaces/store-manifest.interface.js +1 -5
- package/server/applications/sync/interfaces/store-manifest.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client-auth.interface.js +1 -25
- package/server/applications/sync/interfaces/sync-client-auth.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client-paths.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-client-paths.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-client.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-client.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-diff.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-diff.interface.js.map +1 -1
- package/server/applications/sync/interfaces/sync-path.interface.js +1 -5
- package/server/applications/sync/interfaces/sync-path.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-client.interface.js +1 -5
- package/server/applications/sync/schemas/sync-client.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-clients.schema.js +1 -5
- package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
- package/server/applications/sync/schemas/sync-path.interface.js +1 -5
- package/server/applications/sync/schemas/sync-path.interface.js.map +1 -1
- package/server/applications/sync/schemas/sync-paths.schema.js +1 -5
- package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.js +108 -44
- package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-clients-manager.service.spec.js +14 -17
- package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.js +29 -12
- package/server/applications/sync/services/sync-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.spec.js +1 -5
- package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js +27 -17
- package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +11 -15
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-queries.service.js +1 -5
- package/server/applications/sync/services/sync-queries.service.js.map +1 -1
- package/server/applications/sync/sync.config.js +1 -5
- package/server/applications/sync/sync.config.js.map +1 -1
- package/server/applications/sync/sync.controller.js +21 -6
- package/server/applications/sync/sync.controller.js.map +1 -1
- package/server/applications/sync/sync.controller.spec.js +1 -5
- package/server/applications/sync/sync.controller.spec.js.map +1 -1
- package/server/applications/sync/sync.module.js +1 -5
- package/server/applications/sync/sync.module.js.map +1 -1
- package/server/applications/sync/utils/functions.js +1 -5
- package/server/applications/sync/utils/functions.js.map +1 -1
- package/server/applications/sync/utils/normalizedMap.js +1 -5
- package/server/applications/sync/utils/normalizedMap.js.map +1 -1
- package/server/applications/sync/utils/routes.js +1 -5
- package/server/applications/sync/utils/routes.js.map +1 -1
- package/server/applications/users/admin-users.controller.js +2 -6
- package/server/applications/users/admin-users.controller.js.map +1 -1
- package/server/applications/users/admin-users.controller.spec.js +6 -10
- package/server/applications/users/admin-users.controller.spec.js.map +1 -1
- package/server/applications/users/constants/group.js +1 -5
- package/server/applications/users/constants/group.js.map +1 -1
- package/server/applications/users/constants/member.js +1 -5
- package/server/applications/users/constants/member.js.map +1 -1
- package/server/applications/users/constants/routes.js +1 -5
- package/server/applications/users/constants/routes.js.map +1 -1
- package/server/applications/users/constants/user.js +1 -5
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/constants/websocket.js +1 -5
- package/server/applications/users/constants/websocket.js.map +1 -1
- package/server/applications/users/decorators/permissions.decorator.js +1 -5
- package/server/applications/users/decorators/permissions.decorator.js.map +1 -1
- package/server/applications/users/decorators/roles.decorator.js +1 -5
- package/server/applications/users/decorators/roles.decorator.js.map +1 -1
- package/server/applications/users/decorators/user.decorator.js +1 -5
- package/server/applications/users/decorators/user.decorator.js.map +1 -1
- package/server/applications/users/dto/create-or-update-group.dto.js +1 -5
- package/server/applications/users/dto/create-or-update-group.dto.js.map +1 -1
- package/server/applications/users/dto/create-or-update-user.dto.js +1 -5
- package/server/applications/users/dto/create-or-update-user.dto.js.map +1 -1
- package/server/applications/users/dto/delete-user.dto.js +1 -5
- package/server/applications/users/dto/delete-user.dto.js.map +1 -1
- package/server/applications/users/dto/search-members.dto.js +1 -5
- package/server/applications/users/dto/search-members.dto.js.map +1 -1
- package/server/applications/users/dto/user-properties.dto.js +1 -5
- package/server/applications/users/dto/user-properties.dto.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.js +1 -5
- package/server/applications/users/guards/permissions.guard.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.spec.js +1 -5
- package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
- package/server/applications/users/guards/roles.guard.js +1 -5
- package/server/applications/users/guards/roles.guard.js.map +1 -1
- package/server/applications/users/guards/roles.guard.spec.js +1 -5
- package/server/applications/users/guards/roles.guard.spec.js.map +1 -1
- package/server/applications/users/interfaces/admin-group.interface.js +1 -5
- package/server/applications/users/interfaces/admin-group.interface.js.map +1 -1
- package/server/applications/users/interfaces/admin-user.interface.js +1 -5
- package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
- package/server/applications/users/interfaces/group-browse.interface.js +1 -5
- package/server/applications/users/interfaces/group-browse.interface.js.map +1 -1
- package/server/applications/users/interfaces/group-member.js +1 -5
- package/server/applications/users/interfaces/group-member.js.map +1 -1
- package/server/applications/users/interfaces/guest-user.interface.js +1 -5
- package/server/applications/users/interfaces/guest-user.interface.js.map +1 -1
- package/server/applications/users/interfaces/member.interface.js +1 -5
- package/server/applications/users/interfaces/member.interface.js.map +1 -1
- package/server/applications/users/interfaces/owner.interface.js +1 -5
- package/server/applications/users/interfaces/owner.interface.js.map +1 -1
- package/server/applications/users/interfaces/user-secrets.interface.js +1 -5
- package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -1
- package/server/applications/users/interfaces/websocket.interface.js +1 -5
- package/server/applications/users/interfaces/websocket.interface.js.map +1 -1
- package/server/applications/users/models/user.model.js +1 -5
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/schemas/group.interface.js +1 -5
- package/server/applications/users/schemas/group.interface.js.map +1 -1
- package/server/applications/users/schemas/groups.schema.js +1 -5
- package/server/applications/users/schemas/groups.schema.js.map +1 -1
- package/server/applications/users/schemas/user-group.interface.js +1 -5
- package/server/applications/users/schemas/user-group.interface.js.map +1 -1
- package/server/applications/users/schemas/user.interface.js +1 -5
- package/server/applications/users/schemas/user.interface.js.map +1 -1
- package/server/applications/users/schemas/users-groups.schema.js +1 -5
- package/server/applications/users/schemas/users-groups.schema.js.map +1 -1
- package/server/applications/users/schemas/users-guests.schema.js +1 -5
- package/server/applications/users/schemas/users-guests.schema.js.map +1 -1
- package/server/applications/users/schemas/users.schema.js +1 -5
- package/server/applications/users/schemas/users.schema.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +67 -23
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +3 -7
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/admin-users-queries.service.js +65 -21
- package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +81 -25
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +14 -12
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +49 -17
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.controller.js +2 -6
- package/server/applications/users/users.controller.js.map +1 -1
- package/server/applications/users/users.controller.spec.js +5 -9
- package/server/applications/users/users.controller.spec.js.map +1 -1
- package/server/applications/users/users.e2e-spec.js +3 -7
- package/server/applications/users/users.e2e-spec.js.map +1 -1
- package/server/applications/users/users.gateway.js +29 -12
- package/server/applications/users/users.gateway.js.map +1 -1
- package/server/applications/users/users.gateway.spec.js +1 -5
- package/server/applications/users/users.gateway.spec.js.map +1 -1
- package/server/applications/users/users.module.js +1 -5
- package/server/applications/users/users.module.js.map +1 -1
- package/server/applications/users/utils/avatar.js +1 -5
- package/server/applications/users/utils/avatar.js.map +1 -1
- package/server/applications/users/utils/test.js +1 -5
- package/server/applications/users/utils/test.js.map +1 -1
- package/server/applications/webdav/constants/routes.js +1 -5
- package/server/applications/webdav/constants/routes.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +1 -5
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/decorators/if-header.decorator.js +1 -5
- package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
- package/server/applications/webdav/decorators/webdav-context.decorator.js +1 -5
- package/server/applications/webdav/decorators/webdav-context.decorator.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.js +1 -5
- package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +1 -5
- package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.js +54 -20
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +54 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
- package/server/applications/webdav/interfaces/if-header.interface.js +1 -5
- package/server/applications/webdav/interfaces/if-header.interface.js.map +1 -1
- package/server/applications/webdav/interfaces/webdav.interface.js +1 -5
- package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
- package/server/applications/webdav/models/webdav-file.model.js +1 -5
- package/server/applications/webdav/models/webdav-file.model.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +74 -26
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.spec.js +15 -18
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.js +17 -9
- package/server/applications/webdav/services/webdav-spaces.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.spec.js +1 -5
- package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
- package/server/applications/webdav/utils/bootstrap.js +1 -5
- package/server/applications/webdav/utils/bootstrap.js.map +1 -1
- package/server/applications/webdav/utils/if-header.js +1 -5
- package/server/applications/webdav/utils/if-header.js.map +1 -1
- package/server/applications/webdav/utils/routes.js +1 -5
- package/server/applications/webdav/utils/routes.js.map +1 -1
- package/server/applications/webdav/utils/webdav.js +1 -5
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/applications/webdav/utils/xml.js +1 -5
- package/server/applications/webdav/utils/xml.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +1 -5
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/applications/webdav/webdav.controller.spec.js +1 -5
- package/server/applications/webdav/webdav.controller.spec.js.map +1 -1
- package/server/applications/webdav/webdav.e2e-spec.js +1 -5
- package/server/applications/webdav/webdav.e2e-spec.js.map +1 -1
- package/server/applications/webdav/webdav.module.js +1 -5
- package/server/applications/webdav/webdav.module.js.map +1 -1
- package/server/authentication/auth.config.js +23 -123
- package/server/authentication/auth.config.js.map +1 -1
- package/server/authentication/auth.controller.js +27 -21
- package/server/authentication/auth.controller.js.map +1 -1
- package/server/authentication/auth.controller.spec.js +6 -10
- package/server/authentication/auth.controller.spec.js.map +1 -1
- package/server/authentication/auth.e2e-spec.js +1 -5
- package/server/authentication/auth.e2e-spec.js.map +1 -1
- package/server/authentication/auth.module.js +17 -20
- package/server/authentication/auth.module.js.map +1 -1
- package/server/authentication/{services/auth-manager.service.js → auth.service.js} +41 -18
- package/server/authentication/auth.service.js.map +1 -0
- package/server/authentication/{services/auth-manager.service.spec.js → auth.service.spec.js} +6 -10
- package/server/authentication/auth.service.spec.js.map +1 -0
- package/server/authentication/constants/auth.js +1 -5
- package/server/authentication/constants/auth.js.map +1 -1
- package/server/authentication/constants/routes.js +41 -30
- package/server/authentication/constants/routes.js.map +1 -1
- package/server/authentication/constants/scope.js +2 -5
- package/server/authentication/constants/scope.js.map +1 -1
- package/server/authentication/decorators/auth-token-optional.decorator.js +1 -5
- package/server/authentication/decorators/auth-token-optional.decorator.js.map +1 -1
- package/server/authentication/decorators/auth-token-skip.decorator.js +1 -5
- package/server/authentication/decorators/auth-token-skip.decorator.js.map +1 -1
- package/server/authentication/dto/login-response.dto.js +1 -10
- package/server/authentication/dto/login-response.dto.js.map +1 -1
- package/server/authentication/dto/token-response.dto.js +1 -5
- package/server/authentication/dto/token-response.dto.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.guard.js +1 -5
- package/server/authentication/guards/auth-anonymous.guard.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.guard.spec.js +1 -5
- package/server/authentication/guards/auth-anonymous.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-anonymous.strategy.js +1 -5
- package/server/authentication/guards/auth-anonymous.strategy.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.js +1 -5
- package/server/authentication/guards/auth-basic.guard.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.spec.js +13 -14
- package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +10 -11
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-digest.guard.js +1 -5
- package/server/authentication/guards/auth-digest.guard.js.map +1 -1
- package/server/authentication/guards/auth-digest.strategy.js +1 -5
- package/server/authentication/guards/auth-digest.strategy.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.js +1 -5
- package/server/authentication/guards/auth-local.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.spec.js +9 -13
- package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-local.strategy.js +6 -10
- package/server/authentication/guards/auth-local.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.js +1 -5
- package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.spec.js +3 -7
- package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-access.strategy.js +3 -7
- package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.guard.js +1 -5
- package/server/authentication/guards/auth-token-refresh.guard.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.guard.spec.js +3 -7
- package/server/authentication/guards/auth-token-refresh.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js +3 -7
- package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
- package/server/authentication/guards/implementations/http-basic.strategy.js +1 -5
- package/server/authentication/guards/implementations/http-basic.strategy.js.map +1 -1
- package/server/authentication/guards/implementations/http-digest.strategy.js +1 -5
- package/server/authentication/guards/implementations/http-digest.strategy.js.map +1 -1
- package/server/authentication/interfaces/auth-request.interface.js +1 -5
- package/server/authentication/interfaces/auth-request.interface.js.map +1 -1
- package/server/authentication/interfaces/jwt-payload.interface.js +1 -5
- package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
- package/server/authentication/interfaces/token.interface.js +1 -5
- package/server/authentication/interfaces/token.interface.js.map +1 -1
- package/server/authentication/providers/auth-providers.constants.js +18 -0
- package/server/authentication/providers/auth-providers.constants.js.map +1 -0
- package/server/authentication/providers/auth-providers.models.js +14 -0
- package/server/authentication/providers/auth-providers.models.js.map +1 -0
- package/server/authentication/providers/auth-providers.utils.js +42 -0
- package/server/authentication/providers/auth-providers.utils.js.map +1 -0
- package/server/authentication/providers/ldap/auth-ldap.config.js +143 -0
- package/server/authentication/providers/ldap/auth-ldap.config.js.map +1 -0
- package/server/authentication/{constants/auth-ldap.js → providers/ldap/auth-ldap.constants.js} +12 -6
- package/server/authentication/providers/ldap/auth-ldap.constants.js.map +1 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.js +506 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.js.map +1 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js +674 -0
- package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-database.service.js → providers/mysql/auth-provider-mysql.service.js} +16 -14
- package/server/authentication/providers/mysql/auth-provider-mysql.service.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-database.service.spec.js → providers/mysql/auth-provider-mysql.service.spec.js} +15 -19
- package/server/authentication/providers/mysql/auth-provider-mysql.service.spec.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js +30 -0
- package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.config.js +149 -0
- package/server/authentication/providers/oidc/auth-oidc.config.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.constants.js +39 -0
- package/server/authentication/providers/oidc/auth-oidc.constants.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.controller.js +83 -0
- package/server/authentication/providers/oidc/auth-oidc.controller.js.map +1 -0
- package/server/authentication/providers/oidc/auth-oidc.interfaces.js +6 -0
- package/server/authentication/providers/oidc/auth-oidc.interfaces.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.module.js +36 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.module.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.js +373 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.js.map +1 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js +270 -0
- package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-two-fa.service.js → providers/two-fa/auth-provider-two-fa.service.js} +56 -38
- package/server/authentication/providers/two-fa/auth-provider-two-fa.service.js.map +1 -0
- package/server/authentication/{services/auth-methods/auth-method-two-fa.service.spec.js → providers/two-fa/auth-provider-two-fa.service.spec.js} +6 -10
- package/server/authentication/providers/two-fa/auth-provider-two-fa.service.spec.js.map +1 -0
- package/server/authentication/{guards → providers/two-fa}/auth-two-fa-guard.js +10 -14
- package/server/authentication/providers/two-fa/auth-two-fa-guard.js.map +1 -0
- package/server/authentication/providers/two-fa/auth-two-fa.config.js +57 -0
- package/server/authentication/providers/two-fa/auth-two-fa.config.js.map +1 -0
- package/server/authentication/{dto/two-fa-verify.dto.js → providers/two-fa/auth-two-fa.dtos.js} +8 -6
- package/server/authentication/providers/two-fa/auth-two-fa.dtos.js.map +1 -0
- package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js +6 -0
- package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js.map +1 -0
- package/server/authentication/utils/crypt-secret.js +1 -5
- package/server/authentication/utils/crypt-secret.js.map +1 -1
- package/server/common/constants.js +1 -5
- package/server/common/constants.js.map +1 -1
- package/server/common/decorators.js +1 -5
- package/server/common/decorators.js.map +1 -1
- package/server/common/functions.js +25 -9
- package/server/common/functions.js.map +1 -1
- package/server/common/i18n.js +1 -5
- package/server/common/i18n.js.map +1 -1
- package/server/common/image.js +1 -5
- package/server/common/image.js.map +1 -1
- package/server/common/interfaces.js +1 -5
- package/server/common/interfaces.js.map +1 -1
- package/server/common/qrcode.js +1 -5
- package/server/common/qrcode.js.map +1 -1
- package/server/common/shared.js +6 -6
- package/server/common/shared.js.map +1 -1
- package/server/configuration/config.constants.js +1 -5
- package/server/configuration/config.constants.js.map +1 -1
- package/server/configuration/config.environment.js +2 -6
- package/server/configuration/config.environment.js.map +1 -1
- package/server/configuration/config.interfaces.js +1 -5
- package/server/configuration/config.interfaces.js.map +1 -1
- package/server/configuration/config.loader.js +1 -5
- package/server/configuration/config.loader.js.map +1 -1
- package/server/configuration/config.logger.js +4 -8
- package/server/configuration/config.logger.js.map +1 -1
- package/server/configuration/config.validation.js +7 -5
- package/server/configuration/config.validation.js.map +1 -1
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +9 -7
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js +1 -5
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/cache.config.js +1 -5
- package/server/infrastructure/cache/cache.config.js.map +1 -1
- package/server/infrastructure/cache/cache.decorator.js +9 -7
- package/server/infrastructure/cache/cache.decorator.js.map +1 -1
- package/server/infrastructure/cache/cache.e2e-spec.js +1 -5
- package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
- package/server/infrastructure/cache/cache.module.js +1 -5
- package/server/infrastructure/cache/cache.module.js.map +1 -1
- package/server/infrastructure/cache/schemas/mysql-cache.interface.js +1 -5
- package/server/infrastructure/cache/schemas/mysql-cache.interface.js.map +1 -1
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js +1 -5
- package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
- package/server/infrastructure/cache/services/cache.service.js +1 -5
- package/server/infrastructure/cache/services/cache.service.js.map +1 -1
- package/server/infrastructure/context/context.module.js +1 -5
- package/server/infrastructure/context/context.module.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.js +1 -5
- package/server/infrastructure/context/interceptors/context.interceptor.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js +2 -6
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -1
- package/server/infrastructure/context/interfaces/context-store.interface.js +1 -5
- package/server/infrastructure/context/interfaces/context-store.interface.js.map +1 -1
- package/server/infrastructure/context/services/context-manager.service.js +1 -5
- package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
- package/server/infrastructure/context/services/context-manager.service.spec.js +1 -5
- package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -1
- package/server/infrastructure/database/columns.js +1 -5
- package/server/infrastructure/database/columns.js.map +1 -1
- package/server/infrastructure/database/configuration.js +1 -5
- package/server/infrastructure/database/configuration.js.map +1 -1
- package/server/infrastructure/database/constants.js +2 -6
- package/server/infrastructure/database/constants.js.map +1 -1
- package/server/infrastructure/database/database.config.js +1 -5
- package/server/infrastructure/database/database.config.js.map +1 -1
- package/server/infrastructure/database/database.logger.js +1 -5
- package/server/infrastructure/database/database.logger.js.map +1 -1
- package/server/infrastructure/database/database.module.js +1 -5
- package/server/infrastructure/database/database.module.js.map +1 -1
- package/server/infrastructure/database/interfaces/database.interface.js +1 -5
- package/server/infrastructure/database/interfaces/database.interface.js.map +1 -1
- package/server/infrastructure/database/schema.js +1 -5
- package/server/infrastructure/database/schema.js.map +1 -1
- package/server/infrastructure/database/scripts/create-user.js +1 -5
- package/server/infrastructure/database/scripts/create-user.js.map +1 -1
- package/server/infrastructure/database/scripts/db.js +1 -5
- package/server/infrastructure/database/scripts/db.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/main.js +1 -5
- package/server/infrastructure/database/scripts/seed/main.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/usersgroups.js +1 -5
- package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
- package/server/infrastructure/database/utils.js +1 -5
- package/server/infrastructure/database/utils.js.map +1 -1
- package/server/infrastructure/mailer/interfaces/mail.interface.js +1 -5
- package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
- package/server/infrastructure/mailer/mailer.config.js +1 -5
- package/server/infrastructure/mailer/mailer.config.js.map +1 -1
- package/server/infrastructure/mailer/mailer.module.js +1 -5
- package/server/infrastructure/mailer/mailer.module.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.js +1 -5
- package/server/infrastructure/mailer/mailer.service.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.spec.js +2 -6
- package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.constants.js +1 -5
- package/server/infrastructure/scheduler/scheduler.constants.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js +1 -5
- package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
- package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
- package/server/infrastructure/websocket/adapters/redis.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/redis.adapter.js.map +1 -1
- package/server/infrastructure/websocket/adapters/web-socket.adapter.js +1 -5
- package/server/infrastructure/websocket/adapters/web-socket.adapter.js.map +1 -1
- package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js +1 -5
- package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js.map +1 -1
- package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js +1 -5
- package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js.map +1 -1
- package/server/infrastructure/websocket/utils.js +1 -5
- package/server/infrastructure/websocket/utils.js.map +1 -1
- package/server/infrastructure/websocket/web-socket.config.js +1 -5
- package/server/infrastructure/websocket/web-socket.config.js.map +1 -1
- package/server/main.js +5 -0
- package/server/main.js.map +1 -1
- package/static/assets/pdfjs/build/pdf.mjs +724 -745
- 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 +706 -193
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +5 -5
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +1 -0
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +5 -0
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +28 -0
- package/static/assets/pdfjs/web/locale/ml/viewer.ftl +4 -0
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -3
- package/static/assets/pdfjs/web/viewer.css +207 -65
- package/static/assets/pdfjs/web/viewer.html +11 -10
- package/static/assets/pdfjs/web/viewer.mjs +850 -270
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/assets/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
- package/static/assets/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
- package/static/assets/pdfjs/web/wasm/jbig2.wasm +0 -0
- package/static/chunk-22TZP6HW.js +1 -0
- package/static/{chunk-G7TLKY5X.js → chunk-27ATUHBH.js} +1 -1
- package/static/{chunk-CQOQXVYG.js → chunk-2CKLZ3FM.js} +1 -1
- package/static/{chunk-FVFOX6OP.js → chunk-2QZPX7LO.js} +1 -1
- package/static/{chunk-32AVRWC3.js → chunk-2R6IBBPZ.js} +1 -1
- package/static/{chunk-76JDXKD7.js → chunk-4FIGEBNL.js} +1 -1
- package/static/{chunk-ACCGBDUZ.js → chunk-4P3JABAP.js} +4 -4
- package/static/chunk-5CZOSAMZ.js +1 -0
- package/static/{chunk-2PDTP6N4.js → chunk-677WUBCT.js} +1 -1
- package/static/{chunk-K5VO5XTG.js → chunk-74CAHBFM.js} +1 -1
- package/static/{chunk-WTWGBCFO.js → chunk-7GWW6MJO.js} +1 -1
- package/static/{chunk-JXZOYX4N.js → chunk-A4UGPSWX.js} +1 -1
- package/static/{chunk-44D7RWET.js → chunk-AHO37FKW.js} +1 -1
- package/static/{chunk-WB2DECOA.js → chunk-AQCXMKP3.js} +1 -1
- package/static/chunk-B6PDYCRO.js +3 -0
- package/static/{chunk-JVGN5V5E.js → chunk-CU76ATCF.js} +1 -1
- package/static/{chunk-Q5K4ZUHK.js → chunk-CWYHOPOP.js} +1 -1
- package/static/{chunk-IOX3ANJR.js → chunk-E5WI5725.js} +1 -1
- package/static/{chunk-NUG54Y65.js → chunk-FC5HTKVM.js} +1 -1
- package/static/{chunk-LRK6RNPR.js → chunk-FOSM7EYI.js} +1 -1
- package/static/{chunk-B4UP2EQM.js → chunk-GAZO25PI.js} +1 -1
- package/static/{chunk-3WBCGTYW.js → chunk-GB7ABR5N.js} +1 -1
- package/static/{chunk-XFZ37WVK.js → chunk-GEHFKZQ5.js} +1 -1
- package/static/{chunk-4CQLN5HL.js → chunk-GQFMWVFD.js} +1 -1
- package/static/{chunk-YBEH442D.js → chunk-GVNTC564.js} +1 -1
- package/static/{chunk-WO6GBHBZ.js → chunk-HGL3NYP2.js} +2 -2
- package/static/{chunk-IAWRRL6J.js → chunk-HLIWPWRA.js} +1 -1
- package/static/{chunk-6LHJBXUE.js → chunk-HNYB3M4S.js} +1 -1
- package/static/{chunk-5WTIUYFF.js → chunk-HUXAUQMN.js} +1 -1
- package/static/{chunk-VBH3Y2M5.js → chunk-I2XA6PPK.js} +1 -1
- package/static/{chunk-I3XI72AV.js → chunk-ISV3BO6R.js} +1 -1
- package/static/{chunk-P7X53PEP.js → chunk-JV3AGU5B.js} +1 -1
- package/static/{chunk-ZFAXICUH.js → chunk-K25E7YGG.js} +1 -1
- package/static/{chunk-CAD3RHAY.js → chunk-K46PUTZB.js} +1 -1
- package/static/{chunk-GYFLVCFN.js → chunk-KERFLJ56.js} +1 -7
- package/static/{chunk-WSTGWBVW.js → chunk-KJD3KFF3.js} +1 -1
- package/static/{chunk-R4P4NBUL.js → chunk-KPKSI23S.js} +1 -1
- package/static/{chunk-M7IFVC5D.js → chunk-KZS7CTNR.js} +1 -1
- package/static/{chunk-P2IJCGWD.js → chunk-L5IHUVXL.js} +1 -1
- package/static/{chunk-DXESTGOH.js → chunk-L7RRX2M3.js} +1 -1
- package/static/{chunk-WE3ISL7O.js → chunk-LGWJ2WKU.js} +1 -1
- package/static/{chunk-OKI3N5AI.js → chunk-MLC7JK2H.js} +2 -2
- package/static/{chunk-NG7QWUFM.js → chunk-MOHNYW2A.js} +1 -1
- package/static/{chunk-SQYWQUL4.js → chunk-NCDUOVMW.js} +1 -1
- package/static/chunk-NGUAJIGI.js +1 -0
- package/static/{chunk-OYPJUVD6.js → chunk-NIPP6JDI.js} +1 -1
- package/static/{chunk-Y433XOAJ.js → chunk-NMTBMHUL.js} +1 -1
- package/static/chunk-O4XXMZFX.js +4 -0
- package/static/{chunk-IOP3ON2H.js → chunk-OANZITPM.js} +1 -1
- package/static/{chunk-WJFKUJJX.js → chunk-OGE4SAHU.js} +1 -1
- package/static/{chunk-7EHP6HO3.js → chunk-OI3ME22C.js} +1 -1
- package/static/{chunk-D4XDSS6P.js → chunk-Q3EGCMF5.js} +1 -1
- package/static/{chunk-TQBCGNFG.js → chunk-QF2NSHZA.js} +1 -1
- package/static/{chunk-RBBMH2FM.js → chunk-QKN6LAAA.js} +1 -1
- package/static/{chunk-J45SD6RC.js → chunk-QRFESU5O.js} +2 -2
- package/static/chunk-QVRVFYJH.js +1 -0
- package/static/{chunk-BAHNSFET.js → chunk-RFJIPIOK.js} +1 -1
- package/static/{chunk-IZ7TCHUW.js → chunk-RLL634K4.js} +1 -1
- package/static/{chunk-MOWL3ILT.js → chunk-RS2OFKWP.js} +1 -1
- package/static/{chunk-WM56LPJ3.js → chunk-RWAAC3A4.js} +1 -1
- package/static/{chunk-F3GMI6OL.js → chunk-S5Y64DDS.js} +1 -1
- package/static/{chunk-VNNLMUK7.js → chunk-SLG5KDU6.js} +1 -1
- package/static/chunk-TJ4CVFEL.js +1 -0
- package/static/{chunk-SAN35XTD.js → chunk-TWCGKSYE.js} +1 -1
- package/static/{chunk-EUKVDBBK.js → chunk-UMDRE4S7.js} +1 -1
- package/static/{chunk-YKCUUBZP.js → chunk-VRIOLRYR.js} +4 -4
- package/static/chunk-VS4O2XDP.js +1 -0
- package/static/{chunk-2MRTBCSV.js → chunk-VSBFNFOM.js} +1 -1
- package/static/{chunk-CTPKDDVI.js → chunk-WN4WXCVK.js} +1 -1
- package/static/{chunk-2AA3WMW5.js → chunk-WX7RXW7K.js} +1 -1
- package/static/{chunk-J2BUPRCZ.js → chunk-XC4POKR3.js} +2 -2
- package/static/{chunk-AXLDYLIO.js → chunk-Y4AUYQTG.js} +1 -1
- package/static/{chunk-RPHWIW7S.js → chunk-YMIXHRJQ.js} +1 -7
- package/static/{chunk-AFNUBQMD.js → chunk-ZUNKFAKP.js} +1 -1
- package/static/index.html +3 -3
- package/static/main-QN4UCOC5.js +5 -0
- package/static/{styles-PD6764CP.css → styles-46GLIE7Y.css} +1 -1
- package/server/authentication/constants/auth-ldap.js.map +0 -1
- package/server/authentication/dto/two-fa-verify.dto.js.map +0 -1
- package/server/authentication/guards/auth-two-fa-guard.js.map +0 -1
- package/server/authentication/interfaces/two-fa-setup.interface.js +0 -10
- package/server/authentication/interfaces/two-fa-setup.interface.js.map +0 -1
- package/server/authentication/models/auth-method.js +0 -18
- package/server/authentication/models/auth-method.js.map +0 -1
- package/server/authentication/services/auth-manager.service.js.map +0 -1
- package/server/authentication/services/auth-manager.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +0 -326
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +0 -534
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +0 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +0 -1
- package/static/chunk-3I6NPM62.js +0 -1
- package/static/chunk-GCPX3EFC.js +0 -1
- package/static/chunk-KBUIDMCK.js +0 -1
- package/static/chunk-KY6MNZLC.js +0 -1
- package/static/chunk-MPWD4VMY.js +0 -1
- package/static/chunk-QQAF3MLL.js +0 -1
- package/static/chunk-VHZKPUWE.js +0 -4
- package/static/chunk-YWLMFOB4.js +0 -3
- package/static/main-ZXEMCBMI.js +0 -11
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _common = require("@nestjs/common");
|
|
6
|
+
const _testing = require("@nestjs/testing");
|
|
7
|
+
const _openidclient = require("openid-client");
|
|
8
|
+
const _user = require("../../../applications/users/constants/user");
|
|
9
|
+
const _adminusersmanagerservice = require("../../../applications/users/services/admin-users-manager.service");
|
|
10
|
+
const _usersmanagerservice = require("../../../applications/users/services/users-manager.service");
|
|
11
|
+
const _authoidcconstants = require("./auth-oidc.constants");
|
|
12
|
+
const _authprovideroidcservice = require("./auth-provider-oidc.service");
|
|
13
|
+
jest.mock('../../../configuration/config.environment', ()=>({
|
|
14
|
+
configuration: {
|
|
15
|
+
auth: {
|
|
16
|
+
oidc: {
|
|
17
|
+
issuerUrl: 'https://issuer.example.test',
|
|
18
|
+
clientId: 'client-id',
|
|
19
|
+
clientSecret: 'client-secret',
|
|
20
|
+
redirectUri: 'https://api.example.test/auth/oidc/callback',
|
|
21
|
+
security: {
|
|
22
|
+
scope: 'openid profile email',
|
|
23
|
+
tokenSigningAlg: 'RS256',
|
|
24
|
+
userInfoSigningAlg: 'RS256',
|
|
25
|
+
tokenEndpointAuthMethod: 'client_secret_basic',
|
|
26
|
+
skipSubjectCheck: false
|
|
27
|
+
},
|
|
28
|
+
options: {
|
|
29
|
+
enablePasswordAuth: false,
|
|
30
|
+
autoCreateUser: true,
|
|
31
|
+
adminRoleOrGroup: 'admins',
|
|
32
|
+
autoCreatePermissions: [
|
|
33
|
+
'read'
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
jest.mock('openid-client', ()=>{
|
|
41
|
+
let AuthorizationResponseError = class AuthorizationResponseError extends Error {
|
|
42
|
+
constructor(message, options){
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = 'authorization_response_error';
|
|
45
|
+
this.error_description = options?.cause?.get('error_description') ?? message;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
allowInsecureRequests: jest.fn(),
|
|
50
|
+
authorizationCodeGrant: jest.fn(),
|
|
51
|
+
AuthorizationResponseError,
|
|
52
|
+
calculatePKCECodeChallenge: jest.fn(),
|
|
53
|
+
ClientSecretBasic: jest.fn(),
|
|
54
|
+
ClientSecretPost: jest.fn(),
|
|
55
|
+
Configuration: class {
|
|
56
|
+
},
|
|
57
|
+
discovery: jest.fn(),
|
|
58
|
+
fetchUserInfo: jest.fn(),
|
|
59
|
+
IDToken: class {
|
|
60
|
+
},
|
|
61
|
+
None: jest.fn(),
|
|
62
|
+
randomNonce: jest.fn(),
|
|
63
|
+
randomPKCECodeVerifier: jest.fn(),
|
|
64
|
+
randomState: jest.fn(),
|
|
65
|
+
skipSubjectCheck: Symbol('skipSubjectCheck'),
|
|
66
|
+
UserInfoResponse: class {
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
describe(_authprovideroidcservice.AuthProviderOIDC.name, ()=>{
|
|
71
|
+
let service;
|
|
72
|
+
let usersManager;
|
|
73
|
+
let adminUsersManager;
|
|
74
|
+
const makeConfig = (supportsPKCE = true)=>({
|
|
75
|
+
serverMetadata: ()=>({
|
|
76
|
+
supportsPKCE: ()=>supportsPKCE,
|
|
77
|
+
authorization_endpoint: 'https://issuer.example.test/authorize'
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
const makeReply = ()=>({
|
|
81
|
+
header: jest.fn().mockReturnThis(),
|
|
82
|
+
setCookie: jest.fn(),
|
|
83
|
+
clearCookie: jest.fn()
|
|
84
|
+
});
|
|
85
|
+
beforeAll(async ()=>{
|
|
86
|
+
usersManager = {
|
|
87
|
+
findUser: jest.fn(),
|
|
88
|
+
logUser: jest.fn(),
|
|
89
|
+
updateAccesses: jest.fn().mockResolvedValue(undefined),
|
|
90
|
+
fromUserId: jest.fn()
|
|
91
|
+
};
|
|
92
|
+
adminUsersManager = {
|
|
93
|
+
createUserOrGuest: jest.fn(),
|
|
94
|
+
updateUserOrGuest: jest.fn()
|
|
95
|
+
};
|
|
96
|
+
const module = await _testing.Test.createTestingModule({
|
|
97
|
+
providers: [
|
|
98
|
+
{
|
|
99
|
+
provide: _usersmanagerservice.UsersManager,
|
|
100
|
+
useValue: usersManager
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
provide: _adminusersmanagerservice.AdminUsersManager,
|
|
104
|
+
useValue: adminUsersManager
|
|
105
|
+
},
|
|
106
|
+
_authprovideroidcservice.AuthProviderOIDC
|
|
107
|
+
]
|
|
108
|
+
}).compile();
|
|
109
|
+
module.useLogger([
|
|
110
|
+
'fatal'
|
|
111
|
+
]);
|
|
112
|
+
service = module.get(_authprovideroidcservice.AuthProviderOIDC);
|
|
113
|
+
});
|
|
114
|
+
beforeEach(()=>{
|
|
115
|
+
jest.restoreAllMocks();
|
|
116
|
+
jest.clearAllMocks();
|
|
117
|
+
});
|
|
118
|
+
it('returns null when user is not found', async ()=>{
|
|
119
|
+
usersManager.findUser.mockResolvedValue(null);
|
|
120
|
+
const result = await service.validateUser('john', 'secret');
|
|
121
|
+
expect(result).toBeNull();
|
|
122
|
+
expect(usersManager.findUser).toHaveBeenCalledWith('john', false);
|
|
123
|
+
expect(usersManager.logUser).not.toHaveBeenCalled();
|
|
124
|
+
});
|
|
125
|
+
it('allows local password auth for guest users', async ()=>{
|
|
126
|
+
const guestUser = {
|
|
127
|
+
id: 1,
|
|
128
|
+
isGuest: true,
|
|
129
|
+
isAdmin: false
|
|
130
|
+
};
|
|
131
|
+
usersManager.findUser.mockResolvedValue(guestUser);
|
|
132
|
+
usersManager.logUser.mockResolvedValue(guestUser);
|
|
133
|
+
const result = await service.validateUser('guest', 'secret');
|
|
134
|
+
expect(usersManager.logUser).toHaveBeenCalledWith(guestUser, 'secret', undefined, undefined);
|
|
135
|
+
expect(result).toBe(guestUser);
|
|
136
|
+
});
|
|
137
|
+
it('builds the authorization url with PKCE data and cookies', async ()=>{
|
|
138
|
+
jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(true));
|
|
139
|
+
_openidclient.randomState.mockReturnValue('state-1');
|
|
140
|
+
_openidclient.randomNonce.mockReturnValue('nonce-1');
|
|
141
|
+
_openidclient.randomPKCECodeVerifier.mockReturnValue('verifier-1');
|
|
142
|
+
_openidclient.calculatePKCECodeChallenge.mockResolvedValue('challenge-1');
|
|
143
|
+
const reply = makeReply();
|
|
144
|
+
const authUrl = await service.getAuthorizationUrl(reply);
|
|
145
|
+
expect(reply.header).toHaveBeenCalled();
|
|
146
|
+
expect(reply.setCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.State, 'state-1', expect.any(Object));
|
|
147
|
+
expect(reply.setCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.Nonce, 'nonce-1', expect.any(Object));
|
|
148
|
+
expect(reply.setCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.CodeVerifier, 'verifier-1', expect.any(Object));
|
|
149
|
+
const url = new URL(authUrl);
|
|
150
|
+
expect(url.searchParams.get('code_challenge')).toBe('challenge-1');
|
|
151
|
+
expect(url.searchParams.get('client_id')).toBe('client-id');
|
|
152
|
+
});
|
|
153
|
+
it('handles callback success and clears cookies', async ()=>{
|
|
154
|
+
const config = makeConfig(true);
|
|
155
|
+
jest.spyOn(service, 'getConfig').mockResolvedValue(config);
|
|
156
|
+
const processSpy = jest.spyOn(service, 'processUserInfo').mockResolvedValue({
|
|
157
|
+
id: 7
|
|
158
|
+
});
|
|
159
|
+
_openidclient.authorizationCodeGrant.mockResolvedValue({
|
|
160
|
+
claims: ()=>({
|
|
161
|
+
sub: 'subject-1'
|
|
162
|
+
}),
|
|
163
|
+
access_token: 'access-token'
|
|
164
|
+
});
|
|
165
|
+
_openidclient.fetchUserInfo.mockResolvedValue({
|
|
166
|
+
sub: 'subject-1',
|
|
167
|
+
email: 'a@b.c',
|
|
168
|
+
preferred_username: 'alice'
|
|
169
|
+
});
|
|
170
|
+
const req = {
|
|
171
|
+
cookies: {
|
|
172
|
+
[_authoidcconstants.OAuthCookie.State]: 'state-1',
|
|
173
|
+
[_authoidcconstants.OAuthCookie.Nonce]: 'nonce-1',
|
|
174
|
+
[_authoidcconstants.OAuthCookie.CodeVerifier]: 'verifier-1'
|
|
175
|
+
},
|
|
176
|
+
ip: '127.0.0.1'
|
|
177
|
+
};
|
|
178
|
+
const reply = makeReply();
|
|
179
|
+
const result = await service.handleCallback(req, reply, {
|
|
180
|
+
code: 'abc'
|
|
181
|
+
});
|
|
182
|
+
expect(result).toEqual({
|
|
183
|
+
id: 7
|
|
184
|
+
});
|
|
185
|
+
expect(processSpy).toHaveBeenCalledWith({
|
|
186
|
+
sub: 'subject-1',
|
|
187
|
+
email: 'a@b.c',
|
|
188
|
+
preferred_username: 'alice'
|
|
189
|
+
}, '127.0.0.1');
|
|
190
|
+
expect(reply.clearCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.State, {
|
|
191
|
+
path: '/'
|
|
192
|
+
});
|
|
193
|
+
expect(reply.clearCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.Nonce, {
|
|
194
|
+
path: '/'
|
|
195
|
+
});
|
|
196
|
+
expect(reply.clearCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.CodeVerifier, {
|
|
197
|
+
path: '/'
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
it('rejects callback when state is missing', async ()=>{
|
|
201
|
+
jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(false));
|
|
202
|
+
const reply = makeReply();
|
|
203
|
+
const req = {
|
|
204
|
+
cookies: {},
|
|
205
|
+
ip: '127.0.0.1'
|
|
206
|
+
};
|
|
207
|
+
await expect(service.handleCallback(req, reply, {
|
|
208
|
+
code: 'abc'
|
|
209
|
+
})).rejects.toMatchObject({
|
|
210
|
+
status: _common.HttpStatus.BAD_REQUEST
|
|
211
|
+
});
|
|
212
|
+
expect(reply.clearCookie).toHaveBeenCalledWith(_authoidcconstants.OAuthCookie.State, {
|
|
213
|
+
path: '/'
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
it('maps AuthorizationResponseError to BAD_REQUEST', async ()=>{
|
|
217
|
+
jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(false));
|
|
218
|
+
_openidclient.authorizationCodeGrant.mockRejectedValue(new _openidclient.AuthorizationResponseError('access_denied', {
|
|
219
|
+
cause: new URLSearchParams('error=access_denied&error_description=No access')
|
|
220
|
+
}));
|
|
221
|
+
const req = {
|
|
222
|
+
cookies: {
|
|
223
|
+
[_authoidcconstants.OAuthCookie.State]: 'state-1',
|
|
224
|
+
[_authoidcconstants.OAuthCookie.Nonce]: 'nonce-1'
|
|
225
|
+
},
|
|
226
|
+
ip: '127.0.0.1'
|
|
227
|
+
};
|
|
228
|
+
const reply = makeReply();
|
|
229
|
+
await expect(service.handleCallback(req, reply, {
|
|
230
|
+
code: 'abc'
|
|
231
|
+
})).rejects.toMatchObject({
|
|
232
|
+
status: _common.HttpStatus.BAD_REQUEST,
|
|
233
|
+
message: 'No access'
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
it('builds the redirect callback url with token expirations', ()=>{
|
|
237
|
+
const url = service.getRedirectCallbackUrl(10, 20);
|
|
238
|
+
const parsed = new URL(url);
|
|
239
|
+
expect(parsed.hash).toContain('access_expiration=10');
|
|
240
|
+
expect(parsed.hash).toContain('refresh_expiration=20');
|
|
241
|
+
});
|
|
242
|
+
it('creates identities with admin role when claims match', async ()=>{
|
|
243
|
+
usersManager.findUser.mockResolvedValue(null);
|
|
244
|
+
adminUsersManager.createUserOrGuest.mockResolvedValue({
|
|
245
|
+
id: 10,
|
|
246
|
+
login: 'bob'
|
|
247
|
+
});
|
|
248
|
+
usersManager.fromUserId.mockResolvedValue({
|
|
249
|
+
id: 10,
|
|
250
|
+
role: _user.USER_ROLE.ADMINISTRATOR,
|
|
251
|
+
login: 'bob',
|
|
252
|
+
setFullName: jest.fn()
|
|
253
|
+
});
|
|
254
|
+
const userInfo = {
|
|
255
|
+
sub: 'x',
|
|
256
|
+
email: 'b@c.d',
|
|
257
|
+
preferred_username: 'bob',
|
|
258
|
+
groups: [
|
|
259
|
+
'admins'
|
|
260
|
+
]
|
|
261
|
+
};
|
|
262
|
+
const result = await service.processUserInfo(userInfo, '127.0.0.1');
|
|
263
|
+
expect(adminUsersManager.createUserOrGuest).toHaveBeenCalledWith(expect.objectContaining({
|
|
264
|
+
role: _user.USER_ROLE.ADMINISTRATOR
|
|
265
|
+
}), _user.USER_ROLE.ADMINISTRATOR);
|
|
266
|
+
expect(result.role).toBe(_user.USER_ROLE.ADMINISTRATOR);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=auth-provider-oidc.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/authentication/providers/oidc/auth-provider-oidc.service.spec.ts"],"sourcesContent":["import { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport {\n authorizationCodeGrant,\n AuthorizationResponseError,\n calculatePKCECodeChallenge,\n fetchUserInfo,\n randomNonce,\n randomPKCECodeVerifier,\n randomState\n} from 'openid-client'\nimport { USER_ROLE } from '../../../applications/users/constants/user'\nimport { AdminUsersManager } from '../../../applications/users/services/admin-users-manager.service'\nimport { UsersManager } from '../../../applications/users/services/users-manager.service'\nimport { OAuthCookie } from './auth-oidc.constants'\nimport { AuthProviderOIDC } from './auth-provider-oidc.service'\n\njest.mock('../../../configuration/config.environment', () => ({\n configuration: {\n auth: {\n oidc: {\n issuerUrl: 'https://issuer.example.test',\n clientId: 'client-id',\n clientSecret: 'client-secret',\n redirectUri: 'https://api.example.test/auth/oidc/callback',\n security: {\n scope: 'openid profile email',\n tokenSigningAlg: 'RS256',\n userInfoSigningAlg: 'RS256',\n tokenEndpointAuthMethod: 'client_secret_basic',\n skipSubjectCheck: false\n },\n options: {\n enablePasswordAuth: false,\n autoCreateUser: true,\n adminRoleOrGroup: 'admins',\n autoCreatePermissions: ['read']\n }\n }\n }\n }\n}))\n\njest.mock('openid-client', () => {\n class AuthorizationResponseError extends Error {\n code: string\n error_description: string\n constructor(message: string, options: { cause: URLSearchParams }) {\n super(message)\n this.code = 'authorization_response_error'\n this.error_description = options?.cause?.get('error_description') ?? message\n }\n }\n\n return {\n allowInsecureRequests: jest.fn(),\n authorizationCodeGrant: jest.fn(),\n AuthorizationResponseError,\n calculatePKCECodeChallenge: jest.fn(),\n ClientSecretBasic: jest.fn(),\n ClientSecretPost: jest.fn(),\n Configuration: class {},\n discovery: jest.fn(),\n fetchUserInfo: jest.fn(),\n IDToken: class {},\n None: jest.fn(),\n randomNonce: jest.fn(),\n randomPKCECodeVerifier: jest.fn(),\n randomState: jest.fn(),\n skipSubjectCheck: Symbol('skipSubjectCheck'),\n UserInfoResponse: class {}\n }\n})\n\ndescribe(AuthProviderOIDC.name, () => {\n let service: AuthProviderOIDC\n let usersManager: {\n findUser: jest.Mock\n logUser: jest.Mock\n updateAccesses: jest.Mock\n fromUserId: jest.Mock\n }\n let adminUsersManager: {\n createUserOrGuest: jest.Mock\n updateUserOrGuest: jest.Mock\n }\n\n const makeConfig = (supportsPKCE = true) => ({\n serverMetadata: () => ({\n supportsPKCE: () => supportsPKCE,\n authorization_endpoint: 'https://issuer.example.test/authorize'\n })\n })\n\n const makeReply = () => ({\n header: jest.fn().mockReturnThis(),\n setCookie: jest.fn(),\n clearCookie: jest.fn()\n })\n\n beforeAll(async () => {\n usersManager = {\n findUser: jest.fn(),\n logUser: jest.fn(),\n updateAccesses: jest.fn().mockResolvedValue(undefined),\n fromUserId: jest.fn()\n }\n adminUsersManager = {\n createUserOrGuest: jest.fn(),\n updateUserOrGuest: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [{ provide: UsersManager, useValue: usersManager }, { provide: AdminUsersManager, useValue: adminUsersManager }, AuthProviderOIDC]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<AuthProviderOIDC>(AuthProviderOIDC)\n })\n\n beforeEach(() => {\n jest.restoreAllMocks()\n jest.clearAllMocks()\n })\n\n it('returns null when user is not found', async () => {\n usersManager.findUser.mockResolvedValue(null)\n\n const result = await service.validateUser('john', 'secret')\n\n expect(result).toBeNull()\n expect(usersManager.findUser).toHaveBeenCalledWith('john', false)\n expect(usersManager.logUser).not.toHaveBeenCalled()\n })\n\n it('allows local password auth for guest users', async () => {\n const guestUser = { id: 1, isGuest: true, isAdmin: false } as any\n usersManager.findUser.mockResolvedValue(guestUser)\n usersManager.logUser.mockResolvedValue(guestUser)\n\n const result = await service.validateUser('guest', 'secret')\n\n expect(usersManager.logUser).toHaveBeenCalledWith(guestUser, 'secret', undefined, undefined)\n expect(result).toBe(guestUser)\n })\n\n it('builds the authorization url with PKCE data and cookies', async () => {\n jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(true) as any)\n ;(randomState as jest.Mock).mockReturnValue('state-1')\n ;(randomNonce as jest.Mock).mockReturnValue('nonce-1')\n ;(randomPKCECodeVerifier as jest.Mock).mockReturnValue('verifier-1')\n ;(calculatePKCECodeChallenge as jest.Mock).mockResolvedValue('challenge-1')\n const reply = makeReply()\n\n const authUrl = await service.getAuthorizationUrl(reply as any)\n\n expect(reply.header).toHaveBeenCalled()\n expect(reply.setCookie).toHaveBeenCalledWith(OAuthCookie.State, 'state-1', expect.any(Object))\n expect(reply.setCookie).toHaveBeenCalledWith(OAuthCookie.Nonce, 'nonce-1', expect.any(Object))\n expect(reply.setCookie).toHaveBeenCalledWith(OAuthCookie.CodeVerifier, 'verifier-1', expect.any(Object))\n const url = new URL(authUrl)\n expect(url.searchParams.get('code_challenge')).toBe('challenge-1')\n expect(url.searchParams.get('client_id')).toBe('client-id')\n })\n\n it('handles callback success and clears cookies', async () => {\n const config = makeConfig(true)\n jest.spyOn(service, 'getConfig').mockResolvedValue(config as any)\n const processSpy = jest.spyOn(service as any, 'processUserInfo').mockResolvedValue({ id: 7 } as any)\n ;(authorizationCodeGrant as jest.Mock).mockResolvedValue({\n claims: () => ({ sub: 'subject-1' }),\n access_token: 'access-token'\n })\n ;(fetchUserInfo as jest.Mock).mockResolvedValue({ sub: 'subject-1', email: 'a@b.c', preferred_username: 'alice' })\n const req = {\n cookies: {\n [OAuthCookie.State]: 'state-1',\n [OAuthCookie.Nonce]: 'nonce-1',\n [OAuthCookie.CodeVerifier]: 'verifier-1'\n },\n ip: '127.0.0.1'\n }\n const reply = makeReply()\n\n const result = await service.handleCallback(req as any, reply as any, { code: 'abc' })\n\n expect(result).toEqual({ id: 7 })\n expect(processSpy).toHaveBeenCalledWith({ sub: 'subject-1', email: 'a@b.c', preferred_username: 'alice' }, '127.0.0.1')\n expect(reply.clearCookie).toHaveBeenCalledWith(OAuthCookie.State, { path: '/' })\n expect(reply.clearCookie).toHaveBeenCalledWith(OAuthCookie.Nonce, { path: '/' })\n expect(reply.clearCookie).toHaveBeenCalledWith(OAuthCookie.CodeVerifier, { path: '/' })\n })\n\n it('rejects callback when state is missing', async () => {\n jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(false) as any)\n const reply = makeReply()\n const req = { cookies: {}, ip: '127.0.0.1' }\n\n await expect(service.handleCallback(req as any, reply as any, { code: 'abc' })).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n expect(reply.clearCookie).toHaveBeenCalledWith(OAuthCookie.State, { path: '/' })\n })\n\n it('maps AuthorizationResponseError to BAD_REQUEST', async () => {\n jest.spyOn(service, 'getConfig').mockResolvedValue(makeConfig(false) as any)\n ;(authorizationCodeGrant as jest.Mock).mockRejectedValue(\n new AuthorizationResponseError('access_denied', {\n cause: new URLSearchParams('error=access_denied&error_description=No access')\n })\n )\n const req = {\n cookies: {\n [OAuthCookie.State]: 'state-1',\n [OAuthCookie.Nonce]: 'nonce-1'\n },\n ip: '127.0.0.1'\n }\n const reply = makeReply()\n\n await expect(service.handleCallback(req as any, reply as any, { code: 'abc' })).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'No access'\n })\n })\n\n it('builds the redirect callback url with token expirations', () => {\n const url = service.getRedirectCallbackUrl(10, 20)\n const parsed = new URL(url)\n expect(parsed.hash).toContain('access_expiration=10')\n expect(parsed.hash).toContain('refresh_expiration=20')\n })\n\n it('creates identities with admin role when claims match', async () => {\n usersManager.findUser.mockResolvedValue(null)\n adminUsersManager.createUserOrGuest.mockResolvedValue({ id: 10, login: 'bob' })\n usersManager.fromUserId.mockResolvedValue({ id: 10, role: USER_ROLE.ADMINISTRATOR, login: 'bob', setFullName: jest.fn() } as any)\n const userInfo = { sub: 'x', email: 'b@c.d', preferred_username: 'bob', groups: ['admins'] }\n\n const result = await (service as any).processUserInfo(userInfo, '127.0.0.1')\n\n expect(adminUsersManager.createUserOrGuest).toHaveBeenCalledWith(\n expect.objectContaining({ role: USER_ROLE.ADMINISTRATOR }),\n USER_ROLE.ADMINISTRATOR\n )\n expect(result.role).toBe(USER_ROLE.ADMINISTRATOR)\n })\n})\n"],"names":["jest","mock","configuration","auth","oidc","issuerUrl","clientId","clientSecret","redirectUri","security","scope","tokenSigningAlg","userInfoSigningAlg","tokenEndpointAuthMethod","skipSubjectCheck","options","enablePasswordAuth","autoCreateUser","adminRoleOrGroup","autoCreatePermissions","AuthorizationResponseError","Error","message","code","error_description","cause","get","allowInsecureRequests","fn","authorizationCodeGrant","calculatePKCECodeChallenge","ClientSecretBasic","ClientSecretPost","Configuration","discovery","fetchUserInfo","IDToken","None","randomNonce","randomPKCECodeVerifier","randomState","Symbol","UserInfoResponse","describe","AuthProviderOIDC","name","service","usersManager","adminUsersManager","makeConfig","supportsPKCE","serverMetadata","authorization_endpoint","makeReply","header","mockReturnThis","setCookie","clearCookie","beforeAll","findUser","logUser","updateAccesses","mockResolvedValue","undefined","fromUserId","createUserOrGuest","updateUserOrGuest","module","Test","createTestingModule","providers","provide","UsersManager","useValue","AdminUsersManager","compile","useLogger","beforeEach","restoreAllMocks","clearAllMocks","it","result","validateUser","expect","toBeNull","toHaveBeenCalledWith","not","toHaveBeenCalled","guestUser","id","isGuest","isAdmin","toBe","spyOn","mockReturnValue","reply","authUrl","getAuthorizationUrl","OAuthCookie","State","any","Object","Nonce","CodeVerifier","url","URL","searchParams","config","processSpy","claims","sub","access_token","email","preferred_username","req","cookies","ip","handleCallback","toEqual","path","rejects","toMatchObject","status","HttpStatus","BAD_REQUEST","mockRejectedValue","URLSearchParams","getRedirectCallbackUrl","parsed","hash","toContain","login","role","USER_ROLE","ADMINISTRATOR","setFullName","userInfo","groups","processUserInfo","objectContaining"],"mappings":"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"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
-
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
-
* See the LICENSE file for licensing details
|
|
5
|
-
*/ "use strict";
|
|
1
|
+
"use strict";
|
|
6
2
|
Object.defineProperty(exports, "__esModule", {
|
|
7
3
|
value: true
|
|
8
4
|
});
|
|
9
|
-
Object.defineProperty(exports, "
|
|
5
|
+
Object.defineProperty(exports, "AuthProvider2FA", {
|
|
10
6
|
enumerable: true,
|
|
11
7
|
get: function() {
|
|
12
|
-
return
|
|
8
|
+
return AuthProvider2FA;
|
|
13
9
|
}
|
|
14
10
|
});
|
|
15
11
|
const _common = require("@nestjs/common");
|
|
@@ -33,7 +29,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
33
29
|
function _ts_metadata(k, v) {
|
|
34
30
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
35
31
|
}
|
|
36
|
-
let
|
|
32
|
+
let AuthProvider2FA = class AuthProvider2FA {
|
|
37
33
|
async initTwoFactor(user) {
|
|
38
34
|
const { secret, qrDataUrl } = this.generateSecretAndQr(user.email);
|
|
39
35
|
// store encrypted secret in cache for 5 minutes
|
|
@@ -89,7 +85,10 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
89
85
|
const user = await this.loadUser(req.user.id, req.ip);
|
|
90
86
|
secret = secret || user.secrets.twoFaSecret;
|
|
91
87
|
const auth = verifyDto.isRecoveryCode ? await this.validateRecoveryCode(req.user.id, verifyDto.code, user.secrets.recoveryCodes) : this.validateTwoFactorCode(verifyDto.code, secret);
|
|
92
|
-
this.usersManager.updateAccesses(user, req.ip, auth.success, true).catch((e)=>this.logger.error(
|
|
88
|
+
this.usersManager.updateAccesses(user, req.ip, auth.success, true).catch((e)=>this.logger.error({
|
|
89
|
+
tag: this.verify.name,
|
|
90
|
+
msg: `${e}`
|
|
91
|
+
}));
|
|
93
92
|
return fromLogin ? [
|
|
94
93
|
auth,
|
|
95
94
|
user
|
|
@@ -109,14 +108,20 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
109
108
|
} catch (e) {
|
|
110
109
|
auth.success = false;
|
|
111
110
|
auth.message = e.message;
|
|
112
|
-
this.logger.error(
|
|
111
|
+
this.logger.error({
|
|
112
|
+
tag: this.adminResetUserTwoFa.name,
|
|
113
|
+
msg: `${e}`
|
|
114
|
+
});
|
|
113
115
|
}
|
|
114
116
|
return auth;
|
|
115
117
|
}
|
|
116
118
|
async loadUser(userId, ip) {
|
|
117
119
|
const user = await this.usersManager.fromUserId(userId);
|
|
118
120
|
if (!user) {
|
|
119
|
-
this.logger.warn(
|
|
121
|
+
this.logger.warn({
|
|
122
|
+
tag: this.loadUser.name,
|
|
123
|
+
msg: `User ${userId} (${ip}) not found`
|
|
124
|
+
});
|
|
120
125
|
throw new _common.HttpException(`User not found`, _common.HttpStatus.NOT_FOUND);
|
|
121
126
|
}
|
|
122
127
|
this.usersManager.validateUserAccess(user, ip);
|
|
@@ -126,7 +131,10 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
126
131
|
// This function works with any authentication method, provided that
|
|
127
132
|
// the authentication service implements proper user password updates in the database.
|
|
128
133
|
if (!await this.usersManager.compareUserPassword(user.id, password)) {
|
|
129
|
-
this.usersManager.updateAccesses(user, ip, false, true).catch((e)=>this.logger.error(
|
|
134
|
+
this.usersManager.updateAccesses(user, ip, false, true).catch((e)=>this.logger.error({
|
|
135
|
+
tag: this.verifyUserPassword.name,
|
|
136
|
+
msg: `${e}`
|
|
137
|
+
}));
|
|
130
138
|
throw new _common.HttpException('Incorrect code or password', _common.HttpStatus.BAD_REQUEST);
|
|
131
139
|
}
|
|
132
140
|
}
|
|
@@ -147,7 +155,10 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
147
155
|
});
|
|
148
156
|
if (!auth.success) auth.message = 'Incorrect code or password';
|
|
149
157
|
} catch (e) {
|
|
150
|
-
this.logger.error(
|
|
158
|
+
this.logger.error({
|
|
159
|
+
tag: this.validateTwoFactorCode.name,
|
|
160
|
+
msg: `${e}`
|
|
161
|
+
});
|
|
151
162
|
auth.message = e.message;
|
|
152
163
|
}
|
|
153
164
|
return auth;
|
|
@@ -159,28 +170,32 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
159
170
|
};
|
|
160
171
|
if (!encryptedCodes || encryptedCodes.length === 0) {
|
|
161
172
|
auth.message = 'Invalid code';
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (auth.success) {
|
|
173
|
-
// update recovery codes
|
|
174
|
-
await this.usersManager.updateSecrets(userId, {
|
|
175
|
-
recoveryCodes: encryptedCodes
|
|
176
|
-
});
|
|
177
|
-
} else {
|
|
178
|
-
auth.message = 'Invalid code';
|
|
173
|
+
return auth;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
for (const encCode of encryptedCodes){
|
|
177
|
+
const decryptedCode = this.decryptSecret(encCode);
|
|
178
|
+
if (code === decryptedCode) {
|
|
179
|
+
auth.success = true;
|
|
180
|
+
// removed used code
|
|
181
|
+
encryptedCodes.splice(encryptedCodes.indexOf(encCode), 1);
|
|
182
|
+
break;
|
|
179
183
|
}
|
|
180
|
-
} catch (e) {
|
|
181
|
-
this.logger.error(`${this.validateRecoveryCode.name} - ${e}`);
|
|
182
|
-
auth.message = e.message;
|
|
183
184
|
}
|
|
185
|
+
if (auth.success) {
|
|
186
|
+
// update recovery codes
|
|
187
|
+
await this.usersManager.updateSecrets(userId, {
|
|
188
|
+
recoveryCodes: encryptedCodes
|
|
189
|
+
});
|
|
190
|
+
} else {
|
|
191
|
+
auth.message = 'Invalid code';
|
|
192
|
+
}
|
|
193
|
+
} catch (e) {
|
|
194
|
+
this.logger.error({
|
|
195
|
+
tag: this.validateRecoveryCode.name,
|
|
196
|
+
msg: `${e}`
|
|
197
|
+
});
|
|
198
|
+
auth.message = e.message;
|
|
184
199
|
}
|
|
185
200
|
return auth;
|
|
186
201
|
}
|
|
@@ -228,17 +243,20 @@ let AuthMethod2FA = class AuthMethod2FA {
|
|
|
228
243
|
};
|
|
229
244
|
this.notificationsManager.sendEmailNotification([
|
|
230
245
|
req.user
|
|
231
|
-
], notification).catch((e)=>this.logger.error(
|
|
246
|
+
], notification).catch((e)=>this.logger.error({
|
|
247
|
+
tag: this.sendEmailNotification.name,
|
|
248
|
+
msg: `${e}`
|
|
249
|
+
}));
|
|
232
250
|
}
|
|
233
251
|
constructor(cache, usersManager, notificationsManager){
|
|
234
252
|
this.cache = cache;
|
|
235
253
|
this.usersManager = usersManager;
|
|
236
254
|
this.notificationsManager = notificationsManager;
|
|
237
|
-
this.logger = new _common.Logger(
|
|
255
|
+
this.logger = new _common.Logger(AuthProvider2FA.name);
|
|
238
256
|
this.cacheKeyPrefix = 'auth-2fa-pending-user-';
|
|
239
257
|
}
|
|
240
258
|
};
|
|
241
|
-
|
|
259
|
+
AuthProvider2FA = _ts_decorate([
|
|
242
260
|
(0, _common.Injectable)(),
|
|
243
261
|
_ts_metadata("design:type", Function),
|
|
244
262
|
_ts_metadata("design:paramtypes", [
|
|
@@ -246,6 +264,6 @@ AuthMethod2FA = _ts_decorate([
|
|
|
246
264
|
typeof _usersmanagerservice.UsersManager === "undefined" ? Object : _usersmanagerservice.UsersManager,
|
|
247
265
|
typeof _notificationsmanagerservice.NotificationsManager === "undefined" ? Object : _notificationsmanagerservice.NotificationsManager
|
|
248
266
|
])
|
|
249
|
-
],
|
|
267
|
+
], AuthProvider2FA);
|
|
250
268
|
|
|
251
|
-
//# sourceMappingURL=auth-
|
|
269
|
+
//# sourceMappingURL=auth-provider-two-fa.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/authentication/providers/two-fa/auth-provider-two-fa.service.ts"],"sourcesContent":["import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { Totp } from 'time2fa'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../../applications/notifications/constants/notifications'\nimport { NotificationContent } from '../../../applications/notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../../applications/notifications/services/notifications-manager.service'\nimport { UserModel } from '../../../applications/users/models/user.model'\nimport { UsersManager } from '../../../applications/users/services/users-manager.service'\nimport { ACTION } from '../../../common/constants'\nimport { generateShortUUID } from '../../../common/functions'\nimport { qrcodeToDataURL } from '../../../common/qrcode'\nimport { configuration } from '../../../configuration/config.environment'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { TWO_FA_CODE_LENGTH } from '../../constants/auth'\nimport { FastifyAuthenticatedRequest } from '../../interfaces/auth-request.interface'\nimport { decryptSecret, encryptSecret } from '../../utils/crypt-secret'\nimport { TwoFaVerifyDto, TwoFaVerifyWithPasswordDto } from './auth-two-fa.dtos'\nimport { TwoFaEnableResult, TwoFaSetup, TwoFaVerifyResult } from './auth-two-fa.interfaces'\n\n@Injectable()\nexport class AuthProvider2FA {\n private readonly logger = new Logger(AuthProvider2FA.name)\n private readonly cacheKeyPrefix = 'auth-2fa-pending-user-'\n\n constructor(\n private readonly cache: Cache,\n private readonly usersManager: UsersManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async initTwoFactor(user: UserModel): Promise<TwoFaSetup> {\n const { secret, qrDataUrl } = this.generateSecretAndQr(user.email)\n // store encrypted secret in cache for 5 minutes\n await this.cache.set(this.getCacheKey(user.id), this.encryptSecret(secret), 300)\n return { secret, qrDataUrl }\n }\n\n async enableTwoFactor(body: TwoFaVerifyWithPasswordDto, req: FastifyAuthenticatedRequest): Promise<TwoFaEnableResult> {\n // retrieve encrypted secret from cache\n const secret: string = await this.cache.get(this.getCacheKey(req.user.id))\n if (!secret) {\n throw new HttpException('The secret has expired', HttpStatus.BAD_REQUEST)\n }\n // load user\n const [auth, user] = await this.verify(body, req, true, secret)\n if (!auth.success) {\n throw new HttpException(auth.message, HttpStatus.FORBIDDEN)\n }\n // verify user password\n await this.verifyUserPassword(user, body.password, req.ip)\n // generate recovery codes\n const recoveryCodes = this.generateRecoveryCodes()\n // store and enable TwoFA & recovery codes\n await this.usersManager.updateSecrets(user.id, {\n twoFaSecret: secret,\n recoveryCodes: recoveryCodes.map((code) => this.encryptSecret(code))\n })\n this.sendEmailNotification(req, ACTION.ADD)\n return { ...auth, recoveryCodes: recoveryCodes }\n }\n\n async disableTwoFactor(body: TwoFaVerifyWithPasswordDto, req: FastifyAuthenticatedRequest): Promise<TwoFaVerifyResult> {\n // load user\n const [auth, user] = await this.verify(body, req, true)\n if (!auth.success) {\n throw new HttpException(auth.message, HttpStatus.FORBIDDEN)\n }\n // verify user password\n await this.verifyUserPassword(user, body.password, req.ip)\n // store and disable TwoFA & recovery codes\n await this.usersManager.updateSecrets(user.id, { twoFaSecret: undefined, recoveryCodes: undefined })\n this.sendEmailNotification(req, ACTION.DELETE)\n return auth\n }\n\n async verify(verifyDto: TwoFaVerifyDto, req: FastifyAuthenticatedRequest, fromLogin?: false, secret?: string): Promise<TwoFaVerifyResult>\n async verify(verifyDto: TwoFaVerifyDto, req: FastifyAuthenticatedRequest, fromLogin: true, secret?: string): Promise<[TwoFaVerifyResult, UserModel]>\n async verify(\n verifyDto: TwoFaVerifyDto,\n req: FastifyAuthenticatedRequest,\n fromLogin = false,\n secret?: string\n ): Promise<TwoFaVerifyResult | [TwoFaVerifyResult, UserModel]> {\n const user = await this.loadUser(req.user.id, req.ip)\n secret = secret || user.secrets.twoFaSecret\n const auth = verifyDto.isRecoveryCode\n ? await this.validateRecoveryCode(req.user.id, verifyDto.code, user.secrets.recoveryCodes)\n : this.validateTwoFactorCode(verifyDto.code, secret)\n this.usersManager.updateAccesses(user, req.ip, auth.success, true).catch((e: Error) => this.logger.error({ tag: this.verify.name, msg: `${e}` }))\n return fromLogin ? [auth, user] : auth\n }\n\n async adminResetUserTwoFa(userId: number) {\n const auth: TwoFaVerifyResult = { success: false, message: '' }\n try {\n await this.usersManager.updateSecrets(userId, { twoFaSecret: undefined, recoveryCodes: undefined })\n auth.success = true\n } catch (e) {\n auth.success = false\n auth.message = e.message\n this.logger.error({ tag: this.adminResetUserTwoFa.name, msg: `${e}` })\n }\n return auth\n }\n\n async loadUser(userId: number, ip: string) {\n const user: UserModel = await this.usersManager.fromUserId(userId)\n if (!user) {\n this.logger.warn({ tag: this.loadUser.name, msg: `User ${userId} (${ip}) not found` })\n throw new HttpException(`User not found`, HttpStatus.NOT_FOUND)\n }\n this.usersManager.validateUserAccess(user, ip)\n return user\n }\n\n async verifyUserPassword(user: UserModel, password: string, ip: string) {\n // This function works with any authentication method, provided that\n // the authentication service implements proper user password updates in the database.\n if (!(await this.usersManager.compareUserPassword(user.id, password))) {\n this.usersManager\n .updateAccesses(user, ip, false, true)\n .catch((e: Error) => this.logger.error({ tag: this.verifyUserPassword.name, msg: `${e}` }))\n throw new HttpException('Incorrect code or password', HttpStatus.BAD_REQUEST)\n }\n }\n\n validateTwoFactorCode(code: string, encryptedSecret: string): TwoFaVerifyResult {\n const auth: TwoFaVerifyResult = { success: false, message: '' }\n if (!encryptedSecret) {\n auth.message = 'Incorrect code or password'\n return auth\n }\n try {\n auth.success = Totp.validate({ passcode: code, secret: this.decryptSecret(encryptedSecret), drift: 1 })\n if (!auth.success) auth.message = 'Incorrect code or password'\n } catch (e) {\n this.logger.error({ tag: this.validateTwoFactorCode.name, msg: `${e}` })\n auth.message = e.message\n }\n return auth\n }\n\n async validateRecoveryCode(userId: number, code: string, encryptedCodes: string[]): Promise<TwoFaVerifyResult> {\n const auth: TwoFaVerifyResult = { success: false, message: '' }\n if (!encryptedCodes || encryptedCodes.length === 0) {\n auth.message = 'Invalid code'\n return auth\n }\n try {\n for (const encCode of encryptedCodes) {\n const decryptedCode = this.decryptSecret(encCode)\n if (code === decryptedCode) {\n auth.success = true\n // removed used code\n encryptedCodes.splice(encryptedCodes.indexOf(encCode), 1)\n break\n }\n }\n if (auth.success) {\n // update recovery codes\n await this.usersManager.updateSecrets(userId, { recoveryCodes: encryptedCodes })\n } else {\n auth.message = 'Invalid code'\n }\n } catch (e) {\n this.logger.error({ tag: this.validateRecoveryCode.name, msg: `${e}` })\n auth.message = e.message\n }\n return auth\n }\n\n private generateSecretAndQr(userEmail: string): TwoFaSetup {\n // Generate secret + otpauth URL + QR (DataURL)\n // Totp.generateKey returns { issuer, user, config, secret, url }\n const key = Totp.generateKey({ issuer: configuration.auth.mfa.totp.issuer, user: userEmail }, { digits: TWO_FA_CODE_LENGTH })\n const qrDataUrl = qrcodeToDataURL(key.url)\n return { secret: key.secret, qrDataUrl: qrDataUrl }\n }\n\n private getCacheKey(userId: number): string {\n return `${this.cacheKeyPrefix}${userId}`\n }\n\n private encryptSecret(secret: string): string {\n if (configuration.auth.encryptionKey) {\n return encryptSecret(secret, configuration.auth.encryptionKey)\n }\n return secret\n }\n\n private decryptSecret(secret: string): string {\n if (configuration.auth.encryptionKey) {\n return decryptSecret(secret, configuration.auth.encryptionKey)\n }\n return secret\n }\n\n private generateRecoveryCodes(count = 5): string[] {\n return Array.from({ length: count }, () => generateShortUUID())\n }\n\n private sendEmailNotification(req: FastifyAuthenticatedRequest, action: ACTION) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.AUTH_2FA,\n event: NOTIFICATION_APP_EVENT.AUTH_2FA[action],\n element: req.headers['user-agent'],\n url: req.ip\n }\n this.notificationsManager\n .sendEmailNotification([req.user], notification)\n .catch((e: Error) => this.logger.error({ tag: this.sendEmailNotification.name, msg: `${e}` }))\n }\n}\n"],"names":["AuthProvider2FA","initTwoFactor","user","secret","qrDataUrl","generateSecretAndQr","email","cache","set","getCacheKey","id","encryptSecret","enableTwoFactor","body","req","get","HttpException","HttpStatus","BAD_REQUEST","auth","verify","success","message","FORBIDDEN","verifyUserPassword","password","ip","recoveryCodes","generateRecoveryCodes","usersManager","updateSecrets","twoFaSecret","map","code","sendEmailNotification","ACTION","ADD","disableTwoFactor","undefined","DELETE","verifyDto","fromLogin","loadUser","secrets","isRecoveryCode","validateRecoveryCode","validateTwoFactorCode","updateAccesses","catch","e","logger","error","tag","name","msg","adminResetUserTwoFa","userId","fromUserId","warn","NOT_FOUND","validateUserAccess","compareUserPassword","encryptedSecret","Totp","validate","passcode","decryptSecret","drift","encryptedCodes","length","encCode","decryptedCode","splice","indexOf","userEmail","key","generateKey","issuer","configuration","mfa","totp","digits","TWO_FA_CODE_LENGTH","qrcodeToDataURL","url","cacheKeyPrefix","encryptionKey","count","Array","from","generateShortUUID","action","notification","app","NOTIFICATION_APP","AUTH_2FA","event","NOTIFICATION_APP_EVENT","element","headers","notificationsManager","Logger"],"mappings":"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"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
-
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
-
* See the LICENSE file for licensing details
|
|
5
|
-
*/ "use strict";
|
|
1
|
+
"use strict";
|
|
6
2
|
Object.defineProperty(exports, "__esModule", {
|
|
7
3
|
value: true
|
|
8
4
|
});
|
|
@@ -13,7 +9,7 @@ const _notificationsmanagerservice = require("../../../applications/notification
|
|
|
13
9
|
const _usersmanagerservice = require("../../../applications/users/services/users-manager.service");
|
|
14
10
|
const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
|
|
15
11
|
const _cryptsecret = require("../../utils/crypt-secret");
|
|
16
|
-
const
|
|
12
|
+
const _authprovidertwofaservice = require("./auth-provider-two-fa.service");
|
|
17
13
|
function _getRequireWildcardCache(nodeInterop) {
|
|
18
14
|
if (typeof WeakMap !== "function") return null;
|
|
19
15
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -57,7 +53,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
57
53
|
}
|
|
58
54
|
jest.mock('../../utils/crypt-secret');
|
|
59
55
|
jest.mock('../../../common/qrcode');
|
|
60
|
-
describe(
|
|
56
|
+
describe(_authprovidertwofaservice.AuthProvider2FA.name, ()=>{
|
|
61
57
|
let service;
|
|
62
58
|
let cache;
|
|
63
59
|
let usersManager;
|
|
@@ -87,7 +83,7 @@ describe(_authmethodtwofaservice.AuthMethod2FA.name, ()=>{
|
|
|
87
83
|
beforeEach(async ()=>{
|
|
88
84
|
const module = await _testing.Test.createTestingModule({
|
|
89
85
|
providers: [
|
|
90
|
-
|
|
86
|
+
_authprovidertwofaservice.AuthProvider2FA,
|
|
91
87
|
{
|
|
92
88
|
provide: _cacheservice.Cache,
|
|
93
89
|
useValue: {
|
|
@@ -116,7 +112,7 @@ describe(_authmethodtwofaservice.AuthMethod2FA.name, ()=>{
|
|
|
116
112
|
module.useLogger([
|
|
117
113
|
'fatal'
|
|
118
114
|
]);
|
|
119
|
-
service = module.get(
|
|
115
|
+
service = module.get(_authprovidertwofaservice.AuthProvider2FA);
|
|
120
116
|
cache = module.get(_cacheservice.Cache);
|
|
121
117
|
usersManager = module.get(_usersmanagerservice.UsersManager);
|
|
122
118
|
notificationsManager = module.get(_notificationsmanagerservice.NotificationsManager);
|
|
@@ -384,4 +380,4 @@ describe(_authmethodtwofaservice.AuthMethod2FA.name, ()=>{
|
|
|
384
380
|
});
|
|
385
381
|
});
|
|
386
382
|
|
|
387
|
-
//# sourceMappingURL=auth-
|
|
383
|
+
//# sourceMappingURL=auth-provider-two-fa.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/authentication/providers/two-fa/auth-provider-two-fa.service.spec.ts"],"sourcesContent":["import { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Totp } from 'time2fa'\nimport { NotificationsManager } from '../../../applications/notifications/services/notifications-manager.service'\nimport { UserModel } from '../../../applications/users/models/user.model'\nimport { UsersManager } from '../../../applications/users/services/users-manager.service'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { FastifyAuthenticatedRequest } from '../../interfaces/auth-request.interface'\nimport { decryptSecret, encryptSecret } from '../../utils/crypt-secret'\nimport { AuthProvider2FA } from './auth-provider-two-fa.service'\nimport { TwoFaVerifyDto, TwoFaVerifyWithPasswordDto } from './auth-two-fa.dtos'\n\njest.mock('../../utils/crypt-secret')\njest.mock('../../../common/qrcode')\n\ndescribe(AuthProvider2FA.name, () => {\n let service: AuthProvider2FA\n let cache: jest.Mocked<Cache>\n let usersManager: jest.Mocked<UsersManager>\n let notificationsManager: jest.Mocked<NotificationsManager>\n\n const mockUser: Partial<UserModel> = {\n id: 1,\n login: 'testuser',\n email: 'test@example.com',\n secrets: {\n twoFaSecret: 'encrypted-secret',\n recoveryCodes: ['encrypted-code-1', 'encrypted-code-2']\n }\n }\n\n const mockRequest: Partial<FastifyAuthenticatedRequest> = {\n user: { id: 1, login: 'testuser' } as any,\n ip: '127.0.0.1',\n headers: { 'user-agent': 'test-agent' }\n }\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n AuthProvider2FA,\n {\n provide: Cache,\n useValue: {\n get: jest.fn(),\n set: jest.fn()\n }\n },\n {\n provide: UsersManager,\n useValue: {\n fromUserId: jest.fn(),\n validateUserAccess: jest.fn(),\n compareUserPassword: jest.fn(),\n updateAccesses: jest.fn().mockResolvedValue(undefined),\n updateSecrets: jest.fn()\n }\n },\n {\n provide: NotificationsManager,\n useValue: {\n sendEmailNotification: jest.fn().mockResolvedValue(undefined)\n }\n }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<AuthProvider2FA>(AuthProvider2FA)\n cache = module.get(Cache)\n usersManager = module.get(UsersManager)\n notificationsManager = module.get(NotificationsManager)\n ;(encryptSecret as jest.Mock).mockImplementation((secret: string) => `encrypted-${secret}`)\n ;(decryptSecret as jest.Mock).mockImplementation((secret: string) => secret.replace('encrypted-', ''))\n\n const { qrcodeToDataURL } = await import('../../../common/qrcode')\n ;(qrcodeToDataURL as jest.Mock).mockReturnValue('data:image/png;base64,mock')\n })\n\n afterEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('initTwoFactor', () => {\n it('should generate secret and QR code and store in cache', async () => {\n const result = await service.initTwoFactor(mockUser as UserModel)\n\n expect(result).toHaveProperty('secret')\n expect(result).toHaveProperty('qrDataUrl')\n expect(result.qrDataUrl).toBe('data:image/png;base64,mock')\n expect(cache.set).toHaveBeenCalledWith(`auth-2fa-pending-user-${mockUser.id}`, expect.any(String), 300)\n })\n })\n\n describe('enableTwoFactor', () => {\n const enableDto: TwoFaVerifyWithPasswordDto = {\n code: '123456',\n password: 'password123',\n isRecoveryCode: false\n }\n\n it('should throw error if secret has expired', async () => {\n cache.get.mockResolvedValue(null)\n\n await expect(service.enableTwoFactor(enableDto, mockRequest as FastifyAuthenticatedRequest)).rejects.toThrow(\n new HttpException('The secret has expired', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should throw error if verification fails', async () => {\n cache.get.mockResolvedValue('encrypted-secret')\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: false, message: 'Invalid code' })\n\n await expect(service.enableTwoFactor(enableDto, mockRequest as FastifyAuthenticatedRequest)).rejects.toThrow(\n new HttpException('Invalid code', HttpStatus.FORBIDDEN)\n )\n })\n\n it('should throw error if password is incorrect', async () => {\n cache.get.mockResolvedValue('encrypted-secret')\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n usersManager.compareUserPassword.mockResolvedValue(false)\n\n await expect(service.enableTwoFactor(enableDto, mockRequest as FastifyAuthenticatedRequest)).rejects.toThrow(\n new HttpException('Incorrect code or password', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should enable 2FA and return recovery codes on success', async () => {\n cache.get.mockResolvedValue('encrypted-secret')\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n usersManager.compareUserPassword.mockResolvedValue(true)\n\n const result = await service.enableTwoFactor(enableDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(true)\n expect(result.recoveryCodes).toHaveLength(5)\n expect(usersManager.updateSecrets).toHaveBeenCalledWith(mockUser.id, {\n twoFaSecret: 'encrypted-secret',\n recoveryCodes: expect.any(Array)\n })\n expect(notificationsManager.sendEmailNotification).toHaveBeenCalledWith([mockRequest.user], {\n app: 'auth_2fa',\n event: 'Two-factor authentication (2FA) on your account has been enabled',\n element: 'test-agent',\n url: '127.0.0.1'\n })\n })\n })\n\n describe('disableTwoFactor', () => {\n const disableDto: TwoFaVerifyWithPasswordDto = {\n code: '123456',\n password: 'password123',\n isRecoveryCode: false\n }\n\n it('should throw error if verification fails', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: false, message: 'Invalid code' })\n\n await expect(service.disableTwoFactor(disableDto, mockRequest as FastifyAuthenticatedRequest)).rejects.toThrow(\n new HttpException('Invalid code', HttpStatus.FORBIDDEN)\n )\n })\n\n it('should throw error if password is incorrect', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n usersManager.compareUserPassword.mockResolvedValue(false)\n\n await expect(service.disableTwoFactor(disableDto, mockRequest as FastifyAuthenticatedRequest)).rejects.toThrow(\n new HttpException('Incorrect code or password', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should disable 2FA on success', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n usersManager.compareUserPassword.mockResolvedValue(true)\n\n const result = await service.disableTwoFactor(disableDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(true)\n expect(usersManager.updateSecrets).toHaveBeenCalledWith(mockUser.id, {\n twoFaSecret: undefined,\n recoveryCodes: undefined\n })\n expect(notificationsManager.sendEmailNotification).toHaveBeenCalledWith([mockRequest.user], {\n app: 'auth_2fa',\n event: 'Two-factor authentication (2FA) on your account has been disabled',\n element: 'test-agent',\n url: '127.0.0.1'\n })\n })\n })\n\n describe('verify', () => {\n const verifyDto: TwoFaVerifyDto = {\n code: '123456',\n isRecoveryCode: false\n }\n\n it('should verify 2FA code successfully', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n\n const result = await service.verify(verifyDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(true)\n expect(usersManager.updateAccesses).toHaveBeenCalledWith(mockUser, mockRequest.ip, true, true)\n })\n\n it('should verify recovery code successfully', async () => {\n const recoveryDto: TwoFaVerifyDto = { code: 'code-1', isRecoveryCode: true }\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n usersManager.updateSecrets.mockResolvedValue(undefined)\n\n await service.verify(recoveryDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(usersManager.updateSecrets).toHaveBeenCalled()\n })\n\n it('should fail when recovery codes are empty', async () => {\n const recoveryDto: TwoFaVerifyDto = { code: 'code-1', isRecoveryCode: true }\n const userWithoutCodes = { ...mockUser, secrets: { ...mockUser.secrets, recoveryCodes: [] } }\n usersManager.fromUserId.mockResolvedValue(userWithoutCodes as UserModel)\n\n const result = await service.verify(recoveryDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Invalid code')\n })\n\n it('should fail when recovery code does not match', async () => {\n const recoveryDto: TwoFaVerifyDto = { code: 'wrong-code', isRecoveryCode: true }\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n\n const result = await service.verify(recoveryDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Invalid code')\n })\n\n it('should handle errors during recovery code validation', async () => {\n const recoveryDto: TwoFaVerifyDto = { code: 'code-1', isRecoveryCode: true }\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n usersManager.updateSecrets.mockRejectedValue(new Error())\n\n const result = await service.verify(recoveryDto, mockRequest as FastifyAuthenticatedRequest)\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Invalid code')\n })\n\n it('should return user when fromLogin is true', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n jest.spyOn(service, 'validateTwoFactorCode').mockReturnValue({ success: true, message: '' })\n\n const result = await service.verify(verifyDto, mockRequest as FastifyAuthenticatedRequest, true)\n\n expect(Array.isArray(result)).toBe(true)\n expect(result[0].success).toBe(true)\n expect(result[1]).toBe(mockUser)\n })\n })\n\n describe('adminResetUserTwoFa', () => {\n it('should reset user 2FA successfully', async () => {\n usersManager.updateSecrets.mockResolvedValue(undefined)\n\n const result = await service.adminResetUserTwoFa(1)\n\n expect(result.success).toBe(true)\n expect(usersManager.updateSecrets).toHaveBeenCalledWith(1, {\n twoFaSecret: undefined,\n recoveryCodes: undefined\n })\n })\n\n it('should handle errors during reset', async () => {\n usersManager.updateSecrets.mockRejectedValue(new Error('Database error'))\n\n const result = await service.adminResetUserTwoFa(1)\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Database error')\n })\n })\n\n describe('loadUser', () => {\n it('should load and validate user successfully', async () => {\n usersManager.fromUserId.mockResolvedValue(mockUser as UserModel)\n\n const result = await service.loadUser(1, '127.0.0.1')\n\n expect(result).toBe(mockUser)\n expect(usersManager.validateUserAccess).toHaveBeenCalledWith(mockUser, '127.0.0.1')\n })\n\n it('should throw error if user not found', async () => {\n usersManager.fromUserId.mockResolvedValue(null)\n\n await expect(service.loadUser(1, '127.0.0.1')).rejects.toThrow(new HttpException('User not found', HttpStatus.NOT_FOUND))\n })\n })\n\n describe('verifyUserPassword', () => {\n it('should verify password successfully', async () => {\n usersManager.compareUserPassword.mockResolvedValue(true)\n\n await expect(service.verifyUserPassword(mockUser as UserModel, 'password123', '127.0.0.1')).resolves.not.toThrow()\n })\n\n it('should throw error if password is incorrect', async () => {\n usersManager.compareUserPassword.mockResolvedValue(false)\n\n await expect(service.verifyUserPassword(mockUser as UserModel, 'wrong-password', '127.0.0.1')).rejects.toThrow(\n new HttpException('Incorrect code or password', HttpStatus.BAD_REQUEST)\n )\n expect(usersManager.updateAccesses).toHaveBeenCalledWith(mockUser, '127.0.0.1', false, true)\n })\n })\n\n describe('validateTwoFactorCode', () => {\n it('should validate code successfully', () => {\n jest.spyOn(Totp, 'validate').mockReturnValue(true)\n\n const result = service.validateTwoFactorCode('123456', 'encrypted-secret')\n\n expect(result.success).toBe(true)\n expect(result.message).toBe('')\n })\n\n it('should fail validation for incorrect code', () => {\n jest.spyOn(Totp, 'validate').mockReturnValue(false)\n\n const result = service.validateTwoFactorCode('wrong-code', 'encrypted-secret')\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Incorrect code or password')\n })\n\n it('should return error if secret is not provided', () => {\n const result = service.validateTwoFactorCode('123456', '')\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Incorrect code or password')\n })\n\n it('should handle validation errors', () => {\n jest.spyOn(Totp, 'validate').mockImplementation(() => {\n throw new Error('Validation error')\n })\n\n const result = service.validateTwoFactorCode('123456', 'encrypted-secret')\n\n expect(result.success).toBe(false)\n expect(result.message).toBe('Validation error')\n })\n })\n})\n"],"names":["jest","mock","describe","AuthProvider2FA","name","service","cache","usersManager","notificationsManager","mockUser","id","login","email","secrets","twoFaSecret","recoveryCodes","mockRequest","user","ip","headers","beforeEach","module","Test","createTestingModule","providers","provide","Cache","useValue","get","fn","set","UsersManager","fromUserId","validateUserAccess","compareUserPassword","updateAccesses","mockResolvedValue","undefined","updateSecrets","NotificationsManager","sendEmailNotification","compile","useLogger","encryptSecret","mockImplementation","secret","decryptSecret","replace","qrcodeToDataURL","mockReturnValue","afterEach","clearAllMocks","it","expect","toBeDefined","result","initTwoFactor","toHaveProperty","qrDataUrl","toBe","toHaveBeenCalledWith","any","String","enableDto","code","password","isRecoveryCode","enableTwoFactor","rejects","toThrow","HttpException","HttpStatus","BAD_REQUEST","spyOn","success","message","FORBIDDEN","toHaveLength","Array","app","event","element","url","disableDto","disableTwoFactor","verifyDto","verify","recoveryDto","toHaveBeenCalled","userWithoutCodes","mockRejectedValue","Error","isArray","adminResetUserTwoFa","loadUser","NOT_FOUND","verifyUserPassword","resolves","not","Totp","validateTwoFactorCode"],"mappings":"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"}
|