@sync-in/server 1.3.9 → 1.5.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 +34 -0
- package/README.md +5 -3
- package/environment/environment.dist.yaml +2 -0
- package/package.json +6 -6
- package/server/app.bootstrap.js +9 -0
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.service.spec.js +44 -19
- package/server/app.service.spec.js.map +1 -1
- package/server/applications/comments/comments.controller.spec.js +103 -4
- package/server/applications/comments/comments.controller.spec.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
- package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
- package/server/applications/files/constants/files.js +0 -23
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/only-office.js +8 -0
- package/server/applications/files/constants/only-office.js.map +1 -1
- package/server/applications/files/constants/routes.js +6 -1
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/files-only-office.controller.js +11 -0
- package/server/applications/files/files-only-office.controller.js.map +1 -1
- package/server/applications/files/files-only-office.controller.spec.js +97 -3
- package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
- package/server/applications/files/files-tasks.controller.spec.js +91 -1
- package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
- package/server/applications/files/files.config.js +5 -0
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +268 -46
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
- package/server/applications/files/guards/files-only-office.strategy.js +0 -1
- package/server/applications/files/guards/files-only-office.strategy.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +5 -0
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/links/links.controller.spec.js +91 -58
- package/server/applications/links/links.controller.spec.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +4 -6
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +378 -14
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +1 -1
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/notifications/notifications.controller.spec.js +56 -1
- package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
- package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +153 -18
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js +7 -7
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +17 -17
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
- package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
- package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
- package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/sync/utils/routes.js +1 -1
- package/server/applications/sync/utils/routes.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.js +4 -4
- package/server/applications/users/guards/permissions.guard.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.spec.js +6 -6
- package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
- package/server/applications/users/guards/roles.guard.js +1 -1
- package/server/applications/users/guards/roles.guard.js.map +1 -1
- package/server/applications/users/models/user.model.js +1 -1
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +22 -24
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +1 -1
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +938 -49
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
- package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
- package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
- package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
- package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +2 -2
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.spec.js +38 -2
- package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +0 -1
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-digest.guard.js +1 -2
- package/server/authentication/guards/auth-digest.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.spec.js +7 -5
- package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-local.strategy.js +0 -1
- package/server/authentication/guards/auth-local.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.spec.js +30 -0
- package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-access.strategy.js +0 -1
- package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js +0 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +8 -6
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +2 -2
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +500 -5
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
- package/server/configuration/config.loader.js +0 -3
- package/server/configuration/config.loader.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
- package/server/infrastructure/context/services/context-manager.service.spec.js +98 -0
- package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -0
- package/server/infrastructure/database/constants.js +0 -1
- package/server/infrastructure/database/constants.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/usersgroups.js +3 -3
- package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.js +20 -19
- package/server/infrastructure/mailer/mailer.service.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.spec.js +176 -0
- package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -0
- package/static/3rdpartylicenses.txt +26 -26
- package/static/assets/pdfjs/build/pdf.mjs +1177 -255
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
- package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/debugger.css +31 -0
- package/static/assets/pdfjs/web/debugger.mjs +144 -2
- package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
- package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
- package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
- package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
- package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
- package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
- package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
- package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
- package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
- package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
- package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
- package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
- package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
- package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
- package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/viewer.css +649 -120
- package/static/assets/pdfjs/web/viewer.html +19 -0
- package/static/assets/pdfjs/web/viewer.mjs +489 -38
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/chunk-22EANI6R.js +1 -0
- package/static/{chunk-KFM544CA.js → chunk-2UWN7IQF.js} +1 -1
- package/static/{chunk-N3T57OCA.js → chunk-2VSPDSJS.js} +1 -1
- package/static/{chunk-HUWQHCUX.js → chunk-34UZ7SYI.js} +1 -1
- package/static/{chunk-MWFRZBJD.js → chunk-45UQJGGY.js} +1 -1
- package/static/{chunk-LYTD6AJE.js → chunk-5TEXH3LJ.js} +1 -1
- package/static/{chunk-4KESSWTF.js → chunk-66FMKVJX.js} +1 -1
- package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
- package/static/chunk-CK4BY2NX.js +27 -0
- package/static/{chunk-QTW62OKJ.js → chunk-CSBDAY77.js} +1 -1
- package/static/{chunk-XUZSYWRF.js → chunk-CXXPLBDZ.js} +1 -1
- package/static/{chunk-ZTXJC5IC.js → chunk-EILQG525.js} +1 -1
- package/static/{chunk-FJFNDK67.js → chunk-ENWABUR4.js} +1 -1
- package/static/{chunk-WL65GYD5.js → chunk-FR4AOLYL.js} +4 -4
- package/static/chunk-HW2H3ISM.js +559 -0
- package/static/{chunk-BW5PQAKK.js → chunk-HYMDGBZL.js} +1 -1
- package/static/{chunk-WLPYIJFI.js → chunk-IML5UYQG.js} +1 -1
- package/static/{chunk-Z5X7LVMZ.js → chunk-IPSMJHMQ.js} +1 -1
- package/static/{chunk-3S4WNZ2T.js → chunk-JVCWYSNP.js} +1 -1
- package/static/{chunk-CLSVDV7J.js → chunk-KGPCIUD2.js} +1 -1
- package/static/{chunk-O4AQBQBF.js → chunk-KQZJSEM3.js} +1 -1
- package/static/{chunk-MK7WZG3F.js → chunk-NPEMJJIU.js} +1 -1
- package/static/{chunk-4TEHM3AS.js → chunk-OEFBC4GG.js} +1 -1
- package/static/{chunk-O67RFAWU.js → chunk-P734A3XZ.js} +1 -1
- package/static/{chunk-SRLMFJ7C.js → chunk-RASR4CK6.js} +1 -1
- package/static/{chunk-S5WXHO6D.js → chunk-RFMOUC22.js} +1 -1
- package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
- package/static/{chunk-3FX6ISDY.js → chunk-SBOQGGZX.js} +1 -1
- package/static/{chunk-NV2MEIWP.js → chunk-SJAFPXQV.js} +1 -1
- package/static/{chunk-PYSFXLMV.js → chunk-XTYGMF2V.js} +1 -1
- package/static/{chunk-ZFKCGL6X.js → chunk-YCWMV2YR.js} +1 -1
- package/static/{chunk-LB7B5RIV.js → chunk-YGD22MWQ.js} +1 -1
- package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
- package/static/{chunk-SKDQM65G.js → chunk-ZVY37DKS.js} +1 -1
- package/static/index.html +2 -2
- package/static/main-N5CZRHAO.js +7 -0
- package/static/styles-FYUSO6OJ.css +1 -0
- package/static/chunk-AY2GOSJ2.js +0 -24
- package/static/chunk-RSNLYAN6.js +0 -560
- package/static/chunk-ZZ3LHYOY.js +0 -1
- package/static/main-RREKR34B.js +0 -10
- package/static/styles-3DONJ2Z4.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/shares/services/shares-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SharesManager } from './shares-manager.service'\nimport { SharesQueries } from './shares-queries.service'\n\ndescribe(SharesManager.name, () => {\n let service: SharesManager\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n {\n provide: Cache,\n useValue: {}\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n SpacesQueries,\n FilesQueries,\n UsersQueries,\n SharesManager,\n SharesQueries,\n LinksQueries\n ]\n }).compile()\n\n service = module.get<SharesManager>(SharesManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","SharesManager","name","service","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","ContextManager","NotificationsManager","SpacesQueries","FilesQueries","UsersQueries","SharesQueries","LinksQueries","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;yBAEmC;8BACd;uCACS;2BACG;qCACL;qCACA;6CACQ;sCACP;qCACD;sCACC;sCACA;AAE9BA,SAASC,mCAAa,CAACC,IAAI,EAAE;IAC3B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACT;oBAAEC,SAASC,4BAAiB;oBAAEC,UAAU,CAAC;gBAAE;gBAC3C;oBACEF,SAASG,mBAAK;oBACdD,UAAU,CAAC;gBACb;gBACA;oBAAEF,SAASI,qCAAc;oBAAEF,UAAU,CAAC;gBAAE;gBACxC;oBACEF,SAASK,iDAAoB;oBAC7BH,UAAU,CAAC;gBACb;gBACAI,mCAAa;gBACbC,iCAAY;gBACZC,iCAAY;gBACZhB,mCAAa;gBACbiB,mCAAa;gBACbC,iCAAY;aACb;QACH,GAAGC,OAAO;QAEVjB,UAAUE,OAAOgB,GAAG,CAAgBpB,mCAAa;IACnD;IAEAqB,GAAG,qBAAqB;QACtBC,OAAOpB,SAASqB,WAAW;IAC7B;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/shares/services/shares-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport * as commonFunctions from '../../../common/functions'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport * as permissionsUtils from '../../spaces/utils/permissions'\nimport { GUEST_PERMISSION } from '../../users/constants/user'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SHARE_ALL_OPERATIONS } from '../constants/shares'\nimport { SharesManager } from './shares-manager.service'\nimport { SharesQueries } from './shares-queries.service'\n\n// Mock classes and utility modules used by SharesManager\njest.mock('../../spaces/models/space-env.model', () => ({\n SpaceEnv: jest.fn().mockImplementation(() => ({\n setPermissions: jest.fn(),\n envPermissions: 'ENV_PERMS'\n }))\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n havePermission: jest.fn(),\n haveSpacePermission: jest.fn(),\n removePermissions: jest.fn(() => 'trimmed')\n}))\n\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return {\n ...actual,\n generateShortUUID: jest.fn(),\n hashPassword: jest.fn(),\n intersectPermissions: jest.fn()\n }\n})\n\ndescribe(SharesManager.name, () => {\n let service: SharesManager\n\n // Mocks\n const contextManagerMock = {\n get: jest.fn()\n }\n\n const notificationsManagerMock = {\n create: jest.fn().mockResolvedValue(undefined),\n sendEmailNotification: jest.fn().mockResolvedValue(undefined)\n }\n\n const spacesQueriesMock = {\n permissions: jest.fn()\n }\n\n const usersQueriesMock = {\n createUserOrGuest: jest.fn(),\n deleteGuestLink: jest.fn(),\n usersWhitelist: jest.fn().mockResolvedValue([]),\n groupsWhitelist: jest.fn().mockResolvedValue([]),\n allUserIdsFromGroupsAndSubGroups: jest.fn().mockResolvedValue([])\n }\n\n const linksQueriesMock = {\n isUniqueUUID: jest.fn(),\n isReservedUUID: jest.fn(),\n allLinksFromSpaceOrShare: jest.fn(),\n createLinkToSpaceOrShare: jest.fn(),\n updateLinkFromSpaceOrShare: jest.fn(),\n linkFromShare: jest.fn(),\n linkFromSpace: jest.fn()\n }\n\n const sharesQueriesMock = {\n permissions: jest.fn(),\n listShareLinks: jest.fn(),\n getShareWithMembers: jest.fn(),\n createShare: jest.fn(),\n updateShare: jest.fn(),\n selectShares: jest.fn(),\n deleteShare: jest.fn(),\n updateMember: jest.fn(),\n updateMembers: jest.fn(),\n shareExistsForOwner: jest.fn(),\n childExistsForShareOwner: jest.fn()\n }\n\n const user = { id: 1, isAdmin: false } as any\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: ContextManager, useValue: contextManagerMock },\n { provide: NotificationsManager, useValue: notificationsManagerMock },\n { provide: SpacesQueries, useValue: spacesQueriesMock },\n { provide: UsersQueries, useValue: usersQueriesMock },\n { provide: LinksQueries, useValue: linksQueriesMock },\n { provide: SharesQueries, useValue: sharesQueriesMock },\n SharesManager\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SharesManager>(SharesManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('setAllowedPermissions', () => {\n it('sets all operations when the user is the file owner (personal space case)', async () => {\n const share: any = { file: { ownerId: user.id, permissions: '' } }\n await service.setAllowedPermissions(user, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('uses space permissions when file has a space alias', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce({ any: 'thing' })\n const share: any = {\n file: { ownerId: 999, space: { alias: 'space-1', root: { alias: 'root' } }, permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(spacesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'space-1', 'root')\n expect(share.file.ownerId).toBeNull()\n expect(share.file.permissions).toBe('ENV_PERMS')\n })\n\n it('uses parent share permissions when parent alias is present', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'PARENT_PERMS' })\n const share: any = {\n ownerId: 77,\n parent: { alias: 'parent-share' },\n file: { permissions: undefined }\n }\n await service.setAllowedPermissions(user, share)\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(user.id, 'parent-share', +user.isAdmin)\n expect(share.file.permissions).toBe('PARENT_PERMS')\n })\n\n it('throws Bad Request when missing required information', async () => {\n const share: any = { file: {}, parent: {} }\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Missing information', HttpStatus.BAD_REQUEST))\n })\n })\n\n describe('getShareWithMembers', () => {\n it('returns the share and calls setAllowedPermissions', async () => {\n const share: any = { id: 10, file: {} }\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(share)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareWithMembers(user, 10, true)\n\n expect(result).toBe(share)\n expect(spy).toHaveBeenCalledWith(user, share, true)\n })\n\n it('throws Forbidden when share is not found or not authorized', async () => {\n sharesQueriesMock.getShareWithMembers.mockResolvedValueOnce(null)\n await expect(service.getShareWithMembers(user, 99, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('generateLinkUUID', () => {\n it('loops until a unique UUID is found', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('aaa').mockReturnValueOnce('bbb')\n\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(false).mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(2)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(1, user.id, 'aaa')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenNthCalledWith(2, user.id, 'bbb')\n expect(uuid).toBe('bbb')\n })\n })\n\n describe('getShareLink', () => {\n it('returns the share link and trims unsupported permissions', async () => {\n const shareLink: any = { id: 5, file: { permissions: 'ORIG' } }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const result = await service.getShareLink(user, 5)\n\n expect(spy).toHaveBeenCalledWith(user, shareLink)\n expect(result).toBe(shareLink)\n expect(result.file.permissions).toBe('trimmed')\n expect((permissionsUtils.removePermissions as jest.Mock).mock.calls[0][0]).toBe('ORIG')\n })\n\n it('throws Forbidden when link is not found', async () => {\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(null)\n await expect(service.getShareLink(user, 123)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('updateLinkFromSpaceOrShare (from API)', () => {\n it('intersects permissions and returns updated link object', async () => {\n const baseLink: any = {\n id: 42,\n name: 'old',\n email: 'x@x',\n requireAuth: false,\n limitAccess: null,\n expiresAt: null,\n permissions: 'OLD',\n shareName: 'OldShare',\n shareDescription: 'OldDesc'\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(baseLink)\n jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ file: { permissions: 'SHARE_PERMS' } } as any)\n ;(commonFunctions.intersectPermissions as jest.Mock).mockReturnValue('INTERSECTED')\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto: any = {\n permissions: 'NEW_PERMS',\n language: 'fr',\n isActive: false\n }\n\n const result = await service.updateLinkFromSpaceOrShare(user, 7, 55, 1 as any, dto, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n expect(result.permissions).toBe('INTERSECTED')\n expect(result.language).toBe('fr')\n expect(result.isActive).toBe(false)\n })\n })\n\n describe('createGuestLink', () => {\n it('creates guest link with hashed password and returns created user info', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValue('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(99)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SHARES, 'plaintext', 'en', true)\n\n expect(usersQueriesMock.createUserOrGuest).toHaveBeenCalled()\n expect(guest.id).toBe(99)\n expect(guest.password).toBe('HASHED')\n expect(guest.role).toBeDefined()\n expect(guest.permissions).toBe(GUEST_PERMISSION.SHARES)\n expect(guest.language).toBe('en')\n expect(guest.isActive).toBe(true)\n })\n\n it('generates a random password and defaults isActive when not provided', async () => {\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValue('HASHED-RAND')\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('RANDOMSEQ')\n usersQueriesMock.createUserOrGuest.mockResolvedValueOnce(123)\n\n const guest = await service.createGuestLink(GUEST_PERMISSION.SPACES)\n\n expect(commonFunctions.hashPassword).toHaveBeenCalled()\n expect(guest.id).toBe(123)\n expect(guest.isActive).toBe(true)\n expect(guest.language).toBeNull()\n })\n })\n\n describe('getLinkFromSpaceOrShare', () => {\n it('returns a link guest for SPACE type', async () => {\n const lg = { id: 1 }\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 11, 22, LINK_TYPE.SPACE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromSpace).toHaveBeenCalledWith(user.id, 11, 22)\n expect(linksQueriesMock.linkFromShare).not.toHaveBeenCalled()\n })\n\n it('returns a link guest for SHARE type', async () => {\n const lg = { id: 2 }\n linksQueriesMock.linkFromShare.mockResolvedValueOnce(lg)\n\n const res = await service.getLinkFromSpaceOrShare(user, 33, 44, LINK_TYPE.SHARE)\n\n expect(res).toBe(lg)\n expect(linksQueriesMock.linkFromShare).toHaveBeenCalledWith(user.id, 33, 44, +user.isAdmin)\n expect(linksQueriesMock.linkFromSpace).not.toHaveBeenCalled()\n })\n\n it('throws when link not found', async () => {\n linksQueriesMock.linkFromSpace.mockResolvedValueOnce(null)\n\n await expect(service.getLinkFromSpaceOrShare(user, 55, 66, LINK_TYPE.SPACE)).rejects.toEqual(\n new HttpException('Link not found', HttpStatus.NOT_FOUND)\n )\n })\n })\n\n describe('updateLinkFromSpaceOrShare (additional branches)', () => {\n it('returns null when no diff and not from API', async () => {\n const link: any = { id: 1, name: 'n', email: 'e', requireAuth: false, limitAccess: null, expiresAt: null }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, {}, false)\n\n expect(result).toBeNull()\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).not.toHaveBeenCalled()\n })\n\n it('hashes password and does not leak it when fromAPI is true', async () => {\n const link: any = { id: 1 }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(link)\n ;(commonFunctions.hashPassword as jest.Mock).mockResolvedValueOnce('HASHED')\n ;(linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mockImplementation(async (_link: any, _spaceOrShareId: number, updateUser: any) => {\n // Assert at call time before the service deletes the password\n expect(updateUser).toMatchObject({ password: 'HASHED' })\n return\n })\n\n const result = await service.updateLinkFromSpaceOrShare(user, 1, 2, LINK_TYPE.SHARE, { password: 'secret' }, true)\n\n expect(linksQueriesMock.updateLinkFromSpaceOrShare).toHaveBeenCalled()\n // The returned link must not leak password\n expect(result).toBe(link)\n expect((result as any).password).toBeUndefined()\n })\n\n it('updates multiple link/user fields and ignores equal expiresAt', async () => {\n const base = {\n id: 9,\n name: 'a',\n email: 'b',\n requireAuth: false,\n limitAccess: null,\n expiresAt: { date: '2025-01-01' }\n }\n jest.spyOn(service, 'getLinkFromSpaceOrShare').mockResolvedValueOnce(base as any)\n linksQueriesMock.updateLinkFromSpaceOrShare.mockResolvedValueOnce(undefined)\n\n const dto = {\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5,\n expiresAt: { date: '2025-01-01' } // equal, should be ignored\n }\n\n await service.updateLinkFromSpaceOrShare(user, 9, 99, LINK_TYPE.SHARE, dto as any, false)\n\n const [, , , updateLink] = (linksQueriesMock.updateLinkFromSpaceOrShare as jest.Mock).mock.calls[0].slice(0, 5)\n expect(updateLink).toMatchObject({\n name: 'a2',\n email: 'b2',\n requireAuth: true,\n limitAccess: 5\n })\n expect(updateLink.expiresAt).toBeUndefined()\n })\n })\n\n describe('setAllowedPermissions (additional branches)', () => {\n it('sets all operations when share has externalPath and user is admin', async () => {\n const admin = { id: 10, isAdmin: true } as any\n const share: any = { externalPath: '/ext', file: {} }\n await service.setAllowedPermissions(admin, share)\n expect(share.file.permissions).toBe(SHARE_ALL_OPERATIONS)\n })\n\n it('throws NOT_FOUND when space permissions are missing', async () => {\n spacesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { file: { space: { alias: 'space-x', root: { alias: 'r' } } } }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Space not found', HttpStatus.NOT_FOUND))\n })\n\n it('throws NOT_FOUND when parent share permissions are missing', async () => {\n sharesQueriesMock.permissions.mockResolvedValueOnce(null)\n const share: any = { ownerId: 42, parent: { alias: 'parent' }, file: {} }\n\n await expect(service.setAllowedPermissions(user, share)).rejects.toEqual(new HttpException('Share not found', HttpStatus.NOT_FOUND))\n })\n\n it('uses owner permissions when asAdmin is true', async () => {\n const asAdminUser = { id: 3, isAdmin: false } as any\n sharesQueriesMock.permissions.mockResolvedValueOnce({ permissions: 'ADMIN_PARENT' })\n const share: any = { ownerId: 77, parent: { alias: 'pa' }, file: {} }\n\n await service.setAllowedPermissions(asAdminUser, share, true)\n\n expect(sharesQueriesMock.permissions).toHaveBeenCalledWith(77, 'pa', +asAdminUser.isAdmin)\n expect(share.file.permissions).toBe('ADMIN_PARENT')\n })\n })\n\n describe('getShareLink (additional branch)', () => {\n it('does not trim permissions if file.permissions is falsy', async () => {\n const shareLink: any = { id: 7, file: {} }\n sharesQueriesMock.listShareLinks.mockResolvedValueOnce(shareLink)\n const spy = jest.spyOn(service, 'setAllowedPermissions').mockResolvedValueOnce(void 0)\n\n const res = await service.getShareLink(user, 7)\n\n expect(spy).toHaveBeenCalled()\n expect(res).toBe(shareLink)\n expect(permissionsUtils.removePermissions).not.toHaveBeenCalled()\n })\n })\n\n describe('deleteShare', () => {\n it('throws Forbidden when user is not admin and not owner', async () => {\n sharesQueriesMock.shareExistsForOwner.mockResolvedValueOnce(false)\n\n await expect(service.deleteShare({ id: 2, isAdmin: false } as any, 123)).rejects.toEqual(\n new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n )\n })\n\n it('deletes links and removes shares when authorized (asAdmin)', async () => {\n const deleteLinksSpy = jest.spyOn(service, 'deleteAllLinkMembers').mockResolvedValue(void 0)\n const removeSpy = jest.spyOn<any, any>(service as any, 'removeShareFromOwners').mockResolvedValue(void 0)\n\n await service.deleteShare(user, 456, true)\n\n expect(deleteLinksSpy).toHaveBeenCalledWith(456, expect.anything())\n expect(removeSpy).toHaveBeenCalledWith(456, 'all', false, user.id)\n })\n })\n\n describe('child share wrappers', () => {\n it('getChildShare returns share link when isLink = true', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(99)\n const getShareLinkSpy = jest.spyOn(service, 'getShareLink').mockResolvedValueOnce({ id: 99 } as any)\n\n const res = await service.getChildShare(user, 1, 99, true)\n expect(res).toEqual({ id: 99 })\n expect(getShareLinkSpy).toHaveBeenCalledWith(user, 99, true)\n })\n\n it('getChildShare returns child share when isLink = false', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(100)\n const getShareSpy = jest.spyOn(service, 'getShareWithMembers').mockResolvedValueOnce({ id: 100 } as any)\n\n const res = await service.getChildShare(user, 1, 100, false)\n expect(res).toEqual({ id: 100 })\n expect(getShareSpy).toHaveBeenCalledWith(user, 100, true)\n })\n\n it('updateChildShare forwards update and deleteChildShare forwards delete', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValue(200)\n const updateSpy = jest.spyOn(service, 'updateShare').mockResolvedValueOnce({ id: 200 } as any)\n const deleteSpy = jest.spyOn(service, 'deleteShare').mockResolvedValueOnce(void 0)\n\n await service.updateChildShare(user, 1, 200, {} as any)\n expect(updateSpy).toHaveBeenCalledWith(user, 200, {} as any, true)\n\n await service.deleteChildShare(user, 1, 200)\n expect(deleteSpy).toHaveBeenCalledWith(user, 200, true)\n })\n\n it('throws Forbidden when not allowed to manage child share', async () => {\n sharesQueriesMock.childExistsForShareOwner.mockResolvedValueOnce(null)\n await expect(service.getChildShare(user, 1, 2, false)).rejects.toEqual(new HttpException('Not authorized', HttpStatus.FORBIDDEN))\n })\n })\n\n describe('createOrUpdateLinksAsMembers', () => {\n it('creates new links for id < 0 and notifies guest', async () => {\n const createLinkSpy = jest.spyOn<any, any>(service as any, 'createLinkFromSpaceOrShare').mockResolvedValue(void 0)\n const notifySpy = jest.spyOn<any, any>(service as any, 'notifyGuestLink').mockResolvedValue(void 0)\n\n const links = [{ id: -1, linkSettings: { uuid: 'u', email: 'e', permissions: 'p' }, permissions: 'p' }] as any\n\n const res = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, links)\n\n expect(res).toEqual([])\n expect(createLinkSpy).toHaveBeenCalled()\n expect(notifySpy).toHaveBeenCalled()\n })\n\n it('updates modified links and returns them along with unmodified ones', async () => {\n const updateLinkSpy = jest.spyOn(service, 'updateLinkFromSpaceOrShare').mockResolvedValue(void 0)\n\n const members = await service.createOrUpdateLinksAsMembers(user, { id: 1, name: 'S' } as any, LINK_TYPE.SHARE, [\n { id: 2, linkId: 2, permissions: 'p', linkSettings: { name: 'new' } },\n { id: 3, linkId: 3, permissions: 'q' } // unmodified\n ] as any)\n\n expect(updateLinkSpy).toHaveBeenCalledWith(user, 2, 1, LINK_TYPE.SHARE, { name: 'new' })\n expect(members).toHaveLength(2)\n expect(members.map((m: any) => m.id)).toEqual([2, 3])\n })\n })\n\n describe('generateLinkUUID (additional)', () => {\n it('returns immediately when the first UUID is unique', async () => {\n ;(commonFunctions.generateShortUUID as jest.Mock).mockReturnValueOnce('only-one')\n linksQueriesMock.isUniqueUUID.mockResolvedValueOnce(true)\n\n const { uuid } = await service.generateLinkUUID(user.id)\n\n expect(uuid).toBe('only-one')\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledTimes(1)\n expect(linksQueriesMock.isUniqueUUID).toHaveBeenCalledWith(user.id, 'only-one')\n })\n })\n})\n"],"names":["jest","mock","SpaceEnv","fn","mockImplementation","setPermissions","envPermissions","havePermission","haveSpacePermission","removePermissions","actual","requireActual","generateShortUUID","hashPassword","intersectPermissions","describe","SharesManager","name","service","contextManagerMock","get","notificationsManagerMock","create","mockResolvedValue","undefined","sendEmailNotification","spacesQueriesMock","permissions","usersQueriesMock","createUserOrGuest","deleteGuestLink","usersWhitelist","groupsWhitelist","allUserIdsFromGroupsAndSubGroups","linksQueriesMock","isUniqueUUID","isReservedUUID","allLinksFromSpaceOrShare","createLinkToSpaceOrShare","updateLinkFromSpaceOrShare","linkFromShare","linkFromSpace","sharesQueriesMock","listShareLinks","getShareWithMembers","createShare","updateShare","selectShares","deleteShare","updateMember","updateMembers","shareExistsForOwner","childExistsForShareOwner","user","id","isAdmin","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","ContextManager","NotificationsManager","SpacesQueries","UsersQueries","LinksQueries","SharesQueries","compile","useLogger","beforeEach","clearAllMocks","it","expect","toBeDefined","share","file","ownerId","setAllowedPermissions","toBe","SHARE_ALL_OPERATIONS","mockResolvedValueOnce","any","space","alias","root","toHaveBeenCalledWith","toBeNull","parent","rejects","toEqual","HttpException","HttpStatus","BAD_REQUEST","spy","spyOn","result","FORBIDDEN","commonFunctions","mockReturnValueOnce","uuid","generateLinkUUID","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","shareLink","getShareLink","permissionsUtils","calls","baseLink","email","requireAuth","limitAccess","expiresAt","shareName","shareDescription","mockReturnValue","dto","language","isActive","toHaveBeenCalled","guest","createGuestLink","GUEST_PERMISSION","SHARES","password","role","SPACES","lg","res","getLinkFromSpaceOrShare","LINK_TYPE","SPACE","not","SHARE","NOT_FOUND","link","_link","_spaceOrShareId","updateUser","toMatchObject","toBeUndefined","base","date","updateLink","slice","admin","externalPath","asAdminUser","deleteLinksSpy","removeSpy","anything","getShareLinkSpy","getChildShare","getShareSpy","updateSpy","deleteSpy","updateChildShare","deleteChildShare","createLinkSpy","notifySpy","links","linkSettings","createOrUpdateLinksAsMembers","updateLinkSpy","members","linkId","toHaveLength","map","m"],"mappings":"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"}
|
|
@@ -13,18 +13,22 @@ const _functions = require("../../../common/functions");
|
|
|
13
13
|
const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
|
|
14
14
|
const _contextmanagerservice = require("../../../infrastructure/context/services/context-manager.service");
|
|
15
15
|
const _constants = require("../../../infrastructure/database/constants");
|
|
16
|
+
const _routes = require("../../files/constants/routes");
|
|
17
|
+
const _onlyofficeenvironmentdecorator = require("../../files/decorators/only-office-environment.decorator");
|
|
16
18
|
const _filesqueriesservice = require("../../files/services/files-queries.service");
|
|
17
19
|
const _linksqueriesservice = require("../../links/services/links-queries.service");
|
|
18
20
|
const _notificationsmanagerservice = require("../../notifications/services/notifications-manager.service");
|
|
19
21
|
const _shares = require("../../shares/constants/shares");
|
|
20
22
|
const _sharesmanagerservice = require("../../shares/services/shares-manager.service");
|
|
21
23
|
const _sharesqueriesservice = require("../../shares/services/shares-queries.service");
|
|
24
|
+
const _synccontextdecorator = require("../../sync/decorators/sync-context.decorator");
|
|
22
25
|
const _user = require("../../users/constants/user");
|
|
23
26
|
const _usermodel = require("../../users/models/user.model");
|
|
24
27
|
const _usersqueriesservice = require("../../users/services/users-queries.service");
|
|
25
28
|
const _test = require("../../users/utils/test");
|
|
26
29
|
const _webdavcontextdecorator = require("../../webdav/decorators/webdav-context.decorator");
|
|
27
30
|
const _spaces = require("../constants/spaces");
|
|
31
|
+
const _spaceskipguarddecorator = require("../decorators/space-skip-guard.decorator");
|
|
28
32
|
const _spaceskippermissionsdecorator = require("../decorators/space-skip-permissions.decorator");
|
|
29
33
|
const _spacesmanagerservice = require("../services/spaces-manager.service");
|
|
30
34
|
const _spacesqueriesservice = require("../services/spaces-queries.service");
|
|
@@ -399,15 +403,43 @@ describe(_spaceguard.SpaceGuard.name, ()=>{
|
|
|
399
403
|
'*': 'files/personal'
|
|
400
404
|
}
|
|
401
405
|
});
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
406
|
+
await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({
|
|
407
|
+
status: _common.HttpStatus.INSUFFICIENT_STORAGE
|
|
408
|
+
}));
|
|
409
|
+
});
|
|
410
|
+
it('should fail if request content-length header exceed the quota', async ()=>{
|
|
411
|
+
userTest.role = _user.USER_ROLE.USER;
|
|
412
|
+
const storageQuota = 12;
|
|
413
|
+
const storageUsage = 11;
|
|
414
|
+
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
415
|
+
enabled: true,
|
|
416
|
+
envPermissions: `${_spaces.SPACE_OPERATION.ADD}`,
|
|
417
|
+
storageQuota: storageQuota,
|
|
418
|
+
storageUsage: storageUsage,
|
|
419
|
+
willExceedQuota: (contentLength)=>contentLength > storageQuota - storageUsage
|
|
420
|
+
});
|
|
421
|
+
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
422
|
+
method: 'POST',
|
|
423
|
+
headers: {
|
|
424
|
+
'content-length': 13
|
|
425
|
+
},
|
|
426
|
+
user: userTest,
|
|
427
|
+
params: {
|
|
428
|
+
'*': 'files/personal'
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({
|
|
432
|
+
status: _common.HttpStatus.INSUFFICIENT_STORAGE
|
|
433
|
+
}));
|
|
434
|
+
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
435
|
+
method: 'POST',
|
|
436
|
+
user: userTest,
|
|
437
|
+
headers: {},
|
|
438
|
+
params: {
|
|
439
|
+
'*': 'files/personal'
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
411
443
|
});
|
|
412
444
|
it('should fail with space disabled', async ()=>{
|
|
413
445
|
userTest.role = _user.USER_ROLE.USER;
|
|
@@ -421,21 +453,16 @@ describe(_spaceguard.SpaceGuard.name, ()=>{
|
|
|
421
453
|
'*': 'files/personal'
|
|
422
454
|
}
|
|
423
455
|
});
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
} catch (e) {
|
|
428
|
-
thrown = true;
|
|
429
|
-
expect(e).toBeInstanceOf(_common.HttpException);
|
|
430
|
-
expect(e.status).toBe(_common.HttpStatus.FORBIDDEN);
|
|
431
|
-
}
|
|
432
|
-
expect(thrown).toBe(true);
|
|
456
|
+
await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({
|
|
457
|
+
status: _common.HttpStatus.FORBIDDEN
|
|
458
|
+
});
|
|
433
459
|
});
|
|
434
460
|
it('should validate (or not) the webdav routes', async ()=>{
|
|
435
461
|
userTest.role = _user.USER_ROLE.USER;
|
|
436
462
|
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
437
463
|
enabled: true
|
|
438
464
|
});
|
|
465
|
+
const spyUrlSegment = jest.spyOn(spacesGuard, 'urlSegmentsFromContext');
|
|
439
466
|
(0, _webdavcontextdecorator.WebDAVContext)()(context.getHandler());
|
|
440
467
|
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
441
468
|
user: userTest,
|
|
@@ -444,6 +471,10 @@ describe(_spaceguard.SpaceGuard.name, ()=>{
|
|
|
444
471
|
}
|
|
445
472
|
});
|
|
446
473
|
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
474
|
+
expect(spyUrlSegment.mock.results[0].value).toEqual([
|
|
475
|
+
'files',
|
|
476
|
+
'personal'
|
|
477
|
+
]);
|
|
447
478
|
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
448
479
|
user: userTest,
|
|
449
480
|
params: {
|
|
@@ -451,6 +482,110 @@ describe(_spaceguard.SpaceGuard.name, ()=>{
|
|
|
451
482
|
}
|
|
452
483
|
});
|
|
453
484
|
await expect(spacesGuard.canActivate(context)).rejects.toThrow(_common.HttpException);
|
|
485
|
+
// reset context
|
|
486
|
+
spyUrlSegment.mockRestore();
|
|
487
|
+
context = (0, _tsjest.createMock)();
|
|
488
|
+
});
|
|
489
|
+
it('should validate (or not) the sync routes', async ()=>{
|
|
490
|
+
userTest.role = _user.USER_ROLE.USER;
|
|
491
|
+
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
492
|
+
enabled: true
|
|
493
|
+
});
|
|
494
|
+
const spyUrlSegment = jest.spyOn(spacesGuard, 'urlSegmentsFromContext');
|
|
495
|
+
(0, _synccontextdecorator.SyncContext)()(context.getHandler());
|
|
496
|
+
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
497
|
+
user: userTest,
|
|
498
|
+
params: {
|
|
499
|
+
'*': 'personal/foo'
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
503
|
+
expect(spyUrlSegment.mock.results[0].value).toEqual([
|
|
504
|
+
'files',
|
|
505
|
+
'personal',
|
|
506
|
+
'foo'
|
|
507
|
+
]);
|
|
508
|
+
context.switchToHttp().getRequest.mockReturnValueOnce({
|
|
509
|
+
user: userTest,
|
|
510
|
+
params: {
|
|
511
|
+
'*': 'sync/files'
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
await expect(spacesGuard.canActivate(context)).rejects.toThrow(_common.HttpException);
|
|
515
|
+
// reset context
|
|
516
|
+
spyUrlSegment.mockRestore();
|
|
517
|
+
context = (0, _tsjest.createMock)();
|
|
518
|
+
});
|
|
519
|
+
it('should require the modify permission when using the POST method on the OnlyOffice callback URL', async ()=>{
|
|
520
|
+
userTest.role = _user.USER_ROLE.USER;
|
|
521
|
+
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
522
|
+
enabled: true,
|
|
523
|
+
envPermissions: `${_spaces.SPACE_OPERATION.MODIFY}`
|
|
524
|
+
});
|
|
525
|
+
(0, _onlyofficeenvironmentdecorator.OnlyOfficeContext)()(context.getHandler());
|
|
526
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
527
|
+
method: 'POST',
|
|
528
|
+
user: userTest,
|
|
529
|
+
originalUrl: _routes.API_FILES_ONLY_OFFICE_CALLBACK,
|
|
530
|
+
params: {
|
|
531
|
+
'*': 'files/personal/root'
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
535
|
+
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
536
|
+
enabled: true,
|
|
537
|
+
envPermissions: `${_spaces.SPACE_OPERATION.ADD}`
|
|
538
|
+
});
|
|
539
|
+
await expect(spacesGuard.canActivate(context)).rejects.toThrow(_common.HttpException);
|
|
540
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
541
|
+
method: 'POST',
|
|
542
|
+
user: userTest,
|
|
543
|
+
originalUrl: '',
|
|
544
|
+
params: {
|
|
545
|
+
'*': 'files/personal/root'
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
549
|
+
// reset context
|
|
550
|
+
context = (0, _tsjest.createMock)();
|
|
551
|
+
});
|
|
552
|
+
it('should pass if skipSpaceGuard context is enabled', async ()=>{
|
|
553
|
+
userTest.role = _user.USER_ROLE.USER;
|
|
554
|
+
userTest.applications = [
|
|
555
|
+
_user.USER_PERMISSION.PERSONAL_SPACE
|
|
556
|
+
];
|
|
557
|
+
spacesManager.spaceEnv = jest.fn().mockReturnValue({
|
|
558
|
+
enabled: true
|
|
559
|
+
});
|
|
560
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
561
|
+
user: userTest,
|
|
562
|
+
params: {
|
|
563
|
+
'*': 'shares/personal'
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({
|
|
567
|
+
status: _common.HttpStatus.FORBIDDEN
|
|
568
|
+
});
|
|
569
|
+
(0, _spaceskipguarddecorator.SkipSpaceGuard)()(context.getHandler());
|
|
570
|
+
expect(await spacesGuard.canActivate(context)).toBe(true);
|
|
571
|
+
// reset context
|
|
572
|
+
context = (0, _tsjest.createMock)();
|
|
573
|
+
});
|
|
574
|
+
it('coverage only', async ()=>{
|
|
575
|
+
userTest.role = _user.USER_ROLE.USER;
|
|
576
|
+
userTest.applications = [
|
|
577
|
+
_user.USER_PERMISSION.PERSONAL_SPACE
|
|
578
|
+
];
|
|
579
|
+
spacesManager.spaceEnv = jest.fn().mockRejectedValueOnce(new Error('error'));
|
|
580
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
581
|
+
user: userTest,
|
|
582
|
+
params: {
|
|
583
|
+
'*': 'files/personal'
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({
|
|
587
|
+
status: _common.HttpStatus.BAD_REQUEST
|
|
588
|
+
});
|
|
454
589
|
});
|
|
455
590
|
});
|
|
456
591
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/spaces/guards/space.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { createMock, DeepMocked } from '@golevelup/ts-jest'\nimport { ExecutionContext, HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { intersectPermissions } from '../../../common/functions'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SHARE_ALL_OPERATIONS } from '../../shares/constants/shares'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { USER_PERMISSION, USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { WebDAVContext } from '../../webdav/decorators/webdav-context.decorator'\nimport { SPACE_ALIAS, SPACE_ALL_OPERATIONS, SPACE_OPERATION, SPACE_PERMS_SEP, SPACE_REPOSITORY } from '../constants/spaces'\nimport { SkipSpacePermissionsCheck } from '../decorators/space-skip-permissions.decorator'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpacesManager } from '../services/spaces-manager.service'\nimport { SpacesQueries } from '../services/spaces-queries.service'\nimport { SpaceGuard } from './space.guard'\n\ndescribe(SpaceGuard.name, () => {\n let spacesGuard: SpaceGuard\n let spacesManager: SpacesManager\n let spacesQueries: SpacesQueries\n let userTest: UserModel\n let context: DeepMocked<ExecutionContext>\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n {\n provide: Cache,\n useValue: {}\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n SpaceGuard,\n SpacesManager,\n SpacesQueries,\n SharesManager,\n SharesQueries,\n FilesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n spacesManager = module.get<SpacesManager>(SpacesManager)\n spacesQueries = module.get<SpacesQueries>(SpacesQueries)\n spacesGuard = module.get<SpaceGuard>(SpaceGuard)\n // mocks\n spacesManager['setQuotaExceeded'] = jest.fn()\n userTest = new UserModel(generateUserTest())\n context = createMock<ExecutionContext>()\n })\n\n it('should be defined', () => {\n expect(spacesGuard).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should pass for a personal space', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.name).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: userTest.id, path: 'root/foo/bar' })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(true)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toEqual(expect.arrayContaining(['root', 'foo', 'bar']))\n })\n\n it('should pass for a common space', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: ':a:d:m:so',\n role: 0\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject({ id: 0, alias: '', name: '', permissions: 'a:d:m:so' })\n expect(req.space.dbFile).toMatchObject({ inTrash: false, spaceId: fakeSpace.id, spaceExternalRootId: null, path: '.' })\n expect(req.space.permissions).toBe(SHARE_ALL_OPERATIONS)\n expect(req.space.envPermissions).not.toContain('d')\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: fakeSpace.root.owner.id, path: fakeSpace.root.file.path })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(\n intersectPermissions(fakeSpace.permissions, fakeSpace.root.permissions)\n .split(SPACE_PERMS_SEP)\n .filter((p) => p !== SPACE_OPERATION.DELETE)\n .join(SPACE_PERMS_SEP)\n )\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root with a path', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root/path' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({\n inTrash: false,\n ownerId: fakeSpace.root.owner.id,\n path: `${fakeSpace.root.file.path}/${req.space.paths[0]}`\n })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(fakeSpace.root.permissions)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(1)\n })\n\n it('should pass for a space in shares repository', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.alias).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.name).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toBeUndefined()\n expect(req.space.permissions).toBe('')\n expect(req.space.envPermissions).toBe('')\n expect(req.space.inFilesRepository).toBe(false)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(true)\n expect(req.space.inSharesList).toBe(true)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should not pass if the space is not found or not valid', async () => {\n const fakeSpace = null\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/foo' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n })\n\n it('should validate (or not) the access to the space depending on the user permissions', async () => {\n // we only check the `spacesManager.checkAccessToSpace` function, ignores the `spacesManager.spaceEnv`\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n for (const url of ['', 'shares/personal', 'shares/toto']) {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': url }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n // should pass because it is a standard user\n // should not pass because user is a guest (and dot not have the permission to access to a personal space)\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({ enabled: true }) // only for user role\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n for (const userRole of [USER_ROLE.USER, USER_ROLE.GUEST]) {\n userTest.role = userRole\n if (userRole === USER_ROLE.USER) {\n expect(await spacesGuard.canActivate(context)).toBe(true)\n } else {\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n }\n })\n\n it('should check user permissions on route', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation (only modify)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allows modification\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'PATCH',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n\n // does not allow guest (on personal space)\n userTest.role = USER_ROLE.GUEST\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allow if SkipSpacePermissionsCheck is enabled\n userTest.role = USER_ROLE.USER\n SkipSpacePermissionsCheck()(context.getHandler())\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation but pass\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should fail with quota exceeded', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n quotaIsExceeded: true\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n let thrown = false\n try {\n await spacesGuard.canActivate(context)\n } catch (e) {\n thrown = true\n expect(e).toBeInstanceOf(HttpException)\n expect(e.status).toBe(HttpStatus.INSUFFICIENT_STORAGE)\n }\n expect(thrown).toBe(true)\n })\n\n it('should fail with space disabled', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: false\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n let thrown = false\n try {\n await spacesGuard.canActivate(context)\n } catch (e) {\n thrown = true\n expect(e).toBeInstanceOf(HttpException)\n expect(e.status).toBe(HttpStatus.FORBIDDEN)\n }\n expect(thrown).toBe(true)\n })\n\n it('should validate (or not) the webdav routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n WebDAVContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n })\n})\n"],"names":["describe","SpaceGuard","name","spacesGuard","spacesManager","spacesQueries","userTest","context","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","ContextManager","NotificationsManager","SpacesManager","SpacesQueries","SharesManager","SharesQueries","FilesQueries","UsersQueries","LinksQueries","compile","get","jest","fn","UserModel","generateUserTest","createMock","it","expect","toBeDefined","switchToHttp","getRequest","mockReturnValue","user","params","canActivate","toBe","req","space","id","repository","SPACE_REPOSITORY","FILES","alias","SPACE_ALIAS","PERSONAL","enabled","root","toBeUndefined","dbFile","toMatchObject","inTrash","ownerId","path","permissions","SPACE_ALL_OPERATIONS","envPermissions","inFilesRepository","inPersonalSpace","inTrashRepository","inSharesRepository","inSharesList","paths","toEqual","arrayContaining","fakeSpace","role","mockReturnValueOnce","spaceId","spaceExternalRootId","SHARE_ALL_OPERATIONS","not","toContain","toHaveLength","owner","login","file","externalPath","intersectPermissions","split","SPACE_PERMS_SEP","filter","p","SPACE_OPERATION","DELETE","join","SHARES","rejects","toThrow","HttpException","applications","USER_PERMISSION","PERSONAL_SPACE","url","spaceEnv","userRole","USER_ROLE","USER","GUEST","MODIFY","method","SkipSpacePermissionsCheck","getHandler","ADD","quotaIsExceeded","thrown","e","toBeInstanceOf","status","HttpStatus","INSUFFICIENT_STORAGE","FORBIDDEN","WebDAVContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/spaces/guards/space.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { createMock, DeepMocked } from '@golevelup/ts-jest'\nimport { ExecutionContext, HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { intersectPermissions } from '../../../common/functions'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { API_FILES_ONLY_OFFICE_CALLBACK } from '../../files/constants/routes'\nimport { OnlyOfficeContext } from '../../files/decorators/only-office-environment.decorator'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { LinksQueries } from '../../links/services/links-queries.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SHARE_ALL_OPERATIONS } from '../../shares/constants/shares'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SyncContext } from '../../sync/decorators/sync-context.decorator'\nimport { USER_PERMISSION, USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { generateUserTest } from '../../users/utils/test'\nimport { WebDAVContext } from '../../webdav/decorators/webdav-context.decorator'\nimport { SPACE_ALIAS, SPACE_ALL_OPERATIONS, SPACE_OPERATION, SPACE_PERMS_SEP, SPACE_REPOSITORY } from '../constants/spaces'\nimport { SkipSpaceGuard } from '../decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../decorators/space-skip-permissions.decorator'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpacesManager } from '../services/spaces-manager.service'\nimport { SpacesQueries } from '../services/spaces-queries.service'\nimport { SpaceGuard } from './space.guard'\n\ndescribe(SpaceGuard.name, () => {\n let spacesGuard: SpaceGuard\n let spacesManager: SpacesManager\n let spacesQueries: SpacesQueries\n let userTest: UserModel\n let context: DeepMocked<ExecutionContext>\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n {\n provide: Cache,\n useValue: {}\n },\n { provide: ContextManager, useValue: {} },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n SpaceGuard,\n SpacesManager,\n SpacesQueries,\n SharesManager,\n SharesQueries,\n FilesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n spacesManager = module.get<SpacesManager>(SpacesManager)\n spacesQueries = module.get<SpacesQueries>(SpacesQueries)\n spacesGuard = module.get<SpaceGuard>(SpaceGuard)\n // mocks\n spacesManager['setQuotaExceeded'] = jest.fn()\n userTest = new UserModel(generateUserTest())\n context = createMock<ExecutionContext>()\n })\n\n it('should be defined', () => {\n expect(spacesGuard).toBeDefined()\n expect(spacesManager).toBeDefined()\n expect(userTest).toBeDefined()\n })\n\n it('should pass for a personal space', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.name).toBe(SPACE_ALIAS.PERSONAL)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: userTest.id, path: 'root/foo/bar' })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(true)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toEqual(expect.arrayContaining(['root', 'foo', 'bar']))\n })\n\n it('should pass for a common space', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: ':a:d:m:so',\n role: 0\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject({ id: 0, alias: '', name: '', permissions: 'a:d:m:so' })\n expect(req.space.dbFile).toMatchObject({ inTrash: false, spaceId: fakeSpace.id, spaceExternalRootId: null, path: '.' })\n expect(req.space.permissions).toBe(SHARE_ALL_OPERATIONS)\n expect(req.space.envPermissions).not.toContain('d')\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({ inTrash: false, ownerId: fakeSpace.root.owner.id, path: fakeSpace.root.file.path })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(\n intersectPermissions(fakeSpace.permissions, fakeSpace.root.permissions)\n .split(SPACE_PERMS_SEP)\n .filter((p) => p !== SPACE_OPERATION.DELETE)\n .join(SPACE_PERMS_SEP)\n )\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should pass for a common space root with a path', async () => {\n const fakeSpace = {\n id: -1,\n alias: 'test',\n name: 'Test',\n enabled: true,\n permissions: 'a:d:m:so',\n role: 1,\n root: {\n id: -2,\n alias: 'root',\n name: 'Root',\n permissions: 'a:d:so',\n owner: { id: -3, login: 'johaven' },\n file: { id: -4, path: 'code', inTrash: false },\n externalPath: null\n }\n }\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/test/root/path' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(fakeSpace.id)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.FILES)\n expect(req.space.alias).toBe(fakeSpace.alias)\n expect(req.space.name).toBe(fakeSpace.name)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toMatchObject(fakeSpace.root)\n expect(req.space.dbFile).toMatchObject({\n inTrash: false,\n ownerId: fakeSpace.root.owner.id,\n path: `${fakeSpace.root.file.path}/${req.space.paths[0]}`\n })\n expect(req.space.permissions).toBe(SPACE_ALL_OPERATIONS)\n expect(req.space.envPermissions).toBe(fakeSpace.root.permissions)\n expect(req.space.inFilesRepository).toBe(true)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(false)\n expect(req.space.inSharesList).toBe(false)\n expect(req.space.paths).toHaveLength(1)\n })\n\n it('should pass for a space in shares repository', async () => {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n const req: any = context.switchToHttp().getRequest()\n expect(req.space.id).toBe(0)\n expect(req.space.repository).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.alias).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.name).toBe(SPACE_REPOSITORY.SHARES)\n expect(req.space.enabled).toBe(true)\n expect(req.space.root).toBeUndefined()\n expect(req.space.dbFile).toBeUndefined()\n expect(req.space.permissions).toBe('')\n expect(req.space.envPermissions).toBe('')\n expect(req.space.inFilesRepository).toBe(false)\n expect(req.space.inPersonalSpace).toBe(false)\n expect(req.space.inTrashRepository).toBe(false)\n expect(req.space.inSharesRepository).toBe(true)\n expect(req.space.inSharesList).toBe(true)\n expect(req.space.paths).toHaveLength(0)\n })\n\n it('should not pass if the space is not found or not valid', async () => {\n const fakeSpace = null\n spacesQueries.permissions = jest.fn().mockReturnValueOnce(fakeSpace)\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/foo' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n })\n\n it('should validate (or not) the access to the space depending on the user permissions', async () => {\n // we only check the `spacesManager.checkAccessToSpace` function, ignores the `spacesManager.spaceEnv`\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n for (const url of ['', 'shares/personal', 'shares/toto']) {\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': url }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n // should pass because it is a standard user\n // should not pass because user is a guest (and dot not have the permission to access to a personal space)\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({ enabled: true }) // only for user role\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal/root/foo/bar' }\n })\n for (const userRole of [USER_ROLE.USER, USER_ROLE.GUEST]) {\n userTest.role = userRole\n if (userRole === USER_ROLE.USER) {\n expect(await spacesGuard.canActivate(context)).toBe(true)\n } else {\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n }\n }\n })\n\n it('should check user permissions on route', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation (only modify)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allows modification\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'PATCH',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n\n // does not allow guest (on personal space)\n userTest.role = USER_ROLE.GUEST\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n\n // allow if SkipSpacePermissionsCheck is enabled\n userTest.role = USER_ROLE.USER\n SkipSpacePermissionsCheck()(context.getHandler())\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.MODIFY}`\n } as Partial<SpaceEnv>)\n // does not allow creation but pass\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should fail with quota exceeded', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n quotaIsExceeded: true\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n })\n\n it('should fail if request content-length header exceed the quota', async () => {\n userTest.role = USER_ROLE.USER\n const storageQuota = 12\n const storageUsage = 11\n spacesManager.spaceEnv = jest.fn().mockReturnValue({\n enabled: true,\n envPermissions: `${SPACE_OPERATION.ADD}`,\n storageQuota: storageQuota,\n storageUsage: storageUsage,\n willExceedQuota: (contentLength: number) => contentLength > storageQuota - storageUsage\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n headers: { 'content-length': 13 },\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toEqual(expect.objectContaining({ status: HttpStatus.INSUFFICIENT_STORAGE }))\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n headers: {},\n params: { '*': 'files/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n })\n\n it('should fail with space disabled', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValueOnce({\n enabled: false\n } as Partial<SpaceEnv>)\n context.switchToHttp().getRequest.mockReturnValueOnce({\n method: 'POST',\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n })\n\n it('should validate (or not) the webdav routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n WebDAVContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/personal' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'webdav/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should validate (or not) the sync routes', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n const spyUrlSegment = jest.spyOn(spacesGuard as any, 'urlSegmentsFromContext')\n SyncContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'personal/foo' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n expect(spyUrlSegment.mock.results[0].value).toEqual(['files', 'personal', 'foo'])\n context.switchToHttp().getRequest.mockReturnValueOnce({\n user: userTest,\n params: { '*': 'sync/files' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n // reset context\n spyUrlSegment.mockRestore()\n context = createMock<ExecutionContext>()\n })\n\n it('should require the modify permission when using the POST method on the OnlyOffice callback URL', async () => {\n userTest.role = USER_ROLE.USER\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.MODIFY}` })\n OnlyOfficeContext()(context.getHandler())\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: API_FILES_ONLY_OFFICE_CALLBACK,\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true, envPermissions: `${SPACE_OPERATION.ADD}` })\n await expect(spacesGuard.canActivate(context)).rejects.toThrow(HttpException)\n context.switchToHttp().getRequest.mockReturnValue({\n method: 'POST',\n user: userTest,\n originalUrl: '',\n params: { '*': 'files/personal/root' }\n })\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('should pass if skipSpaceGuard context is enabled', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockReturnValue({ enabled: true })\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'shares/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.FORBIDDEN })\n SkipSpaceGuard()(context.getHandler())\n expect(await spacesGuard.canActivate(context)).toBe(true)\n // reset context\n context = createMock<ExecutionContext>()\n })\n\n it('coverage only', async () => {\n userTest.role = USER_ROLE.USER\n userTest.applications = [USER_PERMISSION.PERSONAL_SPACE]\n spacesManager.spaceEnv = jest.fn().mockRejectedValueOnce(new Error('error'))\n context.switchToHttp().getRequest.mockReturnValue({\n user: userTest,\n params: { '*': 'files/personal' }\n })\n await expect(spacesGuard.canActivate(context)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n})\n"],"names":["describe","SpaceGuard","name","spacesGuard","spacesManager","spacesQueries","userTest","context","beforeAll","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","ContextManager","NotificationsManager","SpacesManager","SpacesQueries","SharesManager","SharesQueries","FilesQueries","UsersQueries","LinksQueries","compile","get","jest","fn","UserModel","generateUserTest","createMock","it","expect","toBeDefined","switchToHttp","getRequest","mockReturnValue","user","params","canActivate","toBe","req","space","id","repository","SPACE_REPOSITORY","FILES","alias","SPACE_ALIAS","PERSONAL","enabled","root","toBeUndefined","dbFile","toMatchObject","inTrash","ownerId","path","permissions","SPACE_ALL_OPERATIONS","envPermissions","inFilesRepository","inPersonalSpace","inTrashRepository","inSharesRepository","inSharesList","paths","toEqual","arrayContaining","fakeSpace","role","mockReturnValueOnce","spaceId","spaceExternalRootId","SHARE_ALL_OPERATIONS","not","toContain","toHaveLength","owner","login","file","externalPath","intersectPermissions","split","SPACE_PERMS_SEP","filter","p","SPACE_OPERATION","DELETE","join","SHARES","rejects","toThrow","HttpException","applications","USER_PERMISSION","PERSONAL_SPACE","url","spaceEnv","userRole","USER_ROLE","USER","GUEST","MODIFY","method","SkipSpacePermissionsCheck","getHandler","ADD","quotaIsExceeded","objectContaining","status","HttpStatus","INSUFFICIENT_STORAGE","storageQuota","storageUsage","willExceedQuota","contentLength","headers","FORBIDDEN","spyUrlSegment","spyOn","WebDAVContext","mock","results","value","mockRestore","SyncContext","OnlyOfficeContext","originalUrl","API_FILES_ONLY_OFFICE_CALLBACK","SkipSpaceGuard","mockRejectedValueOnce","Error","BAD_REQUEST"],"mappings":"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"}
|
|
@@ -15,11 +15,11 @@ Object.defineProperty(exports, "SpacesBrowser", {
|
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
16
|
const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
|
|
17
17
|
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
18
|
-
const
|
|
18
|
+
const _configenvironment = require("../../../configuration/config.environment");
|
|
19
19
|
const _fileslockmanagerservice = require("../../files/services/files-lock-manager.service");
|
|
20
20
|
const _filesqueriesservice = require("../../files/services/files-queries.service");
|
|
21
21
|
const _filesrecentsservice = require("../../files/services/files-recents.service");
|
|
22
|
-
const
|
|
22
|
+
const _files = require("../../files/utils/files");
|
|
23
23
|
const _sharesqueriesservice = require("../../shares/services/shares-queries.service");
|
|
24
24
|
const _user = require("../../users/constants/user");
|
|
25
25
|
const _webdav = require("../../webdav/constants/webdav");
|
|
@@ -122,14 +122,14 @@ let SpacesBrowser = class SpacesBrowser {
|
|
|
122
122
|
this.logger.log(`${this.parsePath.name} - ignore special file : ${element.name}`);
|
|
123
123
|
continue;
|
|
124
124
|
}
|
|
125
|
-
if (
|
|
125
|
+
if (!_configenvironment.configuration.applications.files.showHiddenFiles && element.name[0] === '.') {
|
|
126
126
|
this.logger.verbose(`${this.parsePath.name} - ignore filtered file : ${element.name}`);
|
|
127
127
|
continue;
|
|
128
128
|
}
|
|
129
129
|
const realPath = _nodepath.default.join(space.realPath, element.name);
|
|
130
130
|
const filePath = _nodepath.default.join(space.relativeUrl, element.name);
|
|
131
131
|
try {
|
|
132
|
-
yield await (0,
|
|
132
|
+
yield await (0, _files.getProps)(realPath, filePath, isDir);
|
|
133
133
|
} catch (e) {
|
|
134
134
|
this.logger.warn(`${this.parsePath.name} - unable get stats from ${realPath} : ${e}`);
|
|
135
135
|
}
|
|
@@ -143,7 +143,7 @@ let SpacesBrowser = class SpacesBrowser {
|
|
|
143
143
|
const realPath = (0, _paths.realPathFromRootFile)(f);
|
|
144
144
|
f.path = f.root.name;
|
|
145
145
|
try {
|
|
146
|
-
const fileProps = await (0,
|
|
146
|
+
const fileProps = await (0, _files.getProps)(realPath, f.path);
|
|
147
147
|
if (options.withShares) {
|
|
148
148
|
fileProps.shares = f.shares;
|
|
149
149
|
}
|
|
@@ -172,8 +172,8 @@ let SpacesBrowser = class SpacesBrowser {
|
|
|
172
172
|
this.logger.error(`${this.updateRootFile.name} - ${JSON.stringify(f)} - ${e}`);
|
|
173
173
|
return {
|
|
174
174
|
...f,
|
|
175
|
-
name: (0,
|
|
176
|
-
path: (0,
|
|
175
|
+
name: (0, _files.fileName)(f.path),
|
|
176
|
+
path: (0, _files.dirName)(f.path),
|
|
177
177
|
...{
|
|
178
178
|
root: {
|
|
179
179
|
...f.root,
|