@sync-in/server 1.4.0 → 1.5.1
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 +26 -0
- package/README.md +2 -1
- package/package.json +5 -5
- 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/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.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/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/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/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-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/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
- package/server/infrastructure/context/interceptors/context.interceptor.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-N2LYWNTC.js → chunk-2456KVFZ.js} +1 -1
- package/static/{chunk-YCINY2YI.js → chunk-2LVCLKCK.js} +1 -1
- package/static/{chunk-5YKWZT33.js → chunk-2V5S7DWD.js} +1 -1
- package/static/{chunk-3GC2BQZD.js → chunk-44YDXGNZ.js} +1 -1
- package/static/{chunk-W3QXNDI5.js → chunk-4LSJLWYV.js} +1 -1
- package/static/{chunk-T55FAU2O.js → chunk-4UT5VH7R.js} +1 -1
- package/static/{chunk-VMQMD36Z.js → chunk-5GOMMRRE.js} +1 -1
- package/static/{chunk-TXPODW5Q.js → chunk-5J4VRDKB.js} +1 -1
- package/static/{chunk-FQ4AFNGE.js → chunk-6PVKNZ7Q.js} +1 -1
- package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
- package/static/{chunk-X43VWRFP.js → chunk-DFQKHCDR.js} +1 -1
- package/static/{chunk-TDQAEVZN.js → chunk-EE2TDTY4.js} +1 -1
- package/static/{chunk-MOVWEZ7J.js → chunk-ESNDJ5T6.js} +1 -1
- package/static/{chunk-TCFKH6K6.js → chunk-GDKKLLEU.js} +1 -1
- package/static/{chunk-VHYIXL7R.js → chunk-GSR2MCQG.js} +1 -1
- package/static/{chunk-LJIGRUEF.js → chunk-HR7KS5BR.js} +1 -1
- package/static/chunk-HW2H3ISM.js +559 -0
- package/static/{chunk-HZA7R43P.js → chunk-IMB3C547.js} +1 -1
- package/static/{chunk-B2Y2RNFP.js → chunk-J4ALHUDX.js} +1 -1
- package/static/{chunk-PF4K7MVG.js → chunk-KP6LSQTK.js} +1 -1
- package/static/{chunk-C23BPTJZ.js → chunk-LUZCOHFN.js} +1 -1
- package/static/{chunk-GBCYYDCI.js → chunk-MHSCCXVL.js} +1 -1
- package/static/{chunk-PY3BGNJN.js → chunk-OMRQYBXV.js} +1 -1
- package/static/chunk-P7CTJ5BG.js +27 -0
- package/static/{chunk-Y2CDUS4J.js → chunk-P7PX67IR.js} +4 -4
- package/static/{chunk-VMUOUCEI.js → chunk-PPO7DBVO.js} +1 -1
- package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
- package/static/{chunk-WWIC7UW3.js → chunk-SLGGINMR.js} +1 -1
- package/static/{chunk-KZQCFEPT.js → chunk-UHD5XD3G.js} +1 -1
- package/static/{chunk-TNW2CGK6.js → chunk-UPYYAJCJ.js} +1 -1
- package/static/{chunk-6F55D74O.js → chunk-VHYPQ3D4.js} +1 -1
- package/static/{chunk-DGVNNICG.js → chunk-YQSDS6BO.js} +1 -1
- package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
- package/static/index.html +1 -1
- package/static/main-FYD34UEC.js +7 -0
- package/static/chunk-RSNLYAN6.js +0 -560
- package/static/chunk-WHMS3PJ3.js +0 -24
- package/static/chunk-ZZ3LHYOY.js +0 -1
- package/static/main-7LDKYVXO.js +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-spaces.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 { SpacesBrowser } from '../../spaces/services/spaces-browser.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\ndescribe(WebDAVSpaces.name, () => {\n let service: WebDAVSpaces\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n { provide: SpacesBrowser, useValue: {} },\n {\n provide: SpacesManager,\n useValue: {}\n },\n WebDAVSpaces\n ]\n }).compile()\n\n service = module.get<WebDAVSpaces>(WebDAVSpaces)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","WebDAVSpaces","name","service","beforeAll","module","Test","createTestingModule","providers","provide","SpacesBrowser","useValue","SpacesManager","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;yBAEmC;sCACN;sCACA;qCACD;AAE7BA,SAASC,iCAAY,CAACC,IAAI,EAAE;IAC1B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACT;oBAAEC,SAASC,mCAAa;oBAAEC,UAAU,CAAC;gBAAE;gBACvC;oBACEF,SAASG,mCAAa;oBACtBD,UAAU,CAAC;gBACb;gBACAV,iCAAY;aACb;QACH,GAAGY,OAAO;QAEVV,UAAUE,OAAOS,GAAG,CAAeb,iCAAY;IACjD;IAEAc,GAAG,qBAAqB;QACtBC,OAAOb,SAASc,WAAW;IAC7B;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-spaces.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 { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpacesBrowser } from '../../spaces/services/spaces-browser.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { canAccessToSpaceUrl } from '../../spaces/utils/permissions'\nimport { WEBDAV_NS } from '../constants/routes'\nimport { DEPTH } from '../constants/webdav'\nimport type { FastifyDAVRequest } from '../interfaces/webdav.interface'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\n// mocks for file utils and permissions\njest.mock('../../files/utils/files', () => ({\n getProps: jest.fn(),\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn()\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n canAccessToSpaceUrl: jest.fn()\n}))\n// mock for WEBDAV path-to-space segments\njest.mock('../utils/routes', () => ({\n WEBDAV_PATH_TO_SPACE_SEGMENTS: jest.fn(() => ['files', 'personal'])\n}))\n\n// small helper to collect results from an AsyncGenerator\nasync function collectGenerator<T>(gen: AsyncGenerator<T>): Promise<T[]> {\n const all: T[] = []\n for await (const item of gen) {\n all.push(item)\n }\n return all\n}\n\ndescribe(WebDAVSpaces.name, () => {\n let service: WebDAVSpaces\n let spacesManager: jest.Mocked<SpacesManager>\n let spacesBrowser: jest.Mocked<SpacesBrowser>\n\n const user = { id: 1, login: 'john', isAdmin: false } as any\n\n beforeAll(async () => {\n const spacesManagerMock: Partial<jest.Mocked<SpacesManager>> = {\n spaceEnv: jest.fn(),\n listSpaces: jest.fn(),\n listTrashes: jest.fn()\n }\n const spacesBrowserMock: Partial<jest.Mocked<SpacesBrowser>> = {\n browse: jest.fn()\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [{ provide: SpacesBrowser, useValue: spacesBrowserMock }, { provide: SpacesManager, useValue: spacesManagerMock }, WebDAVSpaces]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVSpaces>(WebDAVSpaces)\n spacesManager = module.get(SpacesManager) as jest.Mocked<SpacesManager>\n spacesBrowser = module.get(SpacesBrowser) as jest.Mocked<SpacesBrowser>\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('spaceEnv', () => {\n it('returns space when manager resolves', async () => {\n const fakeSpace = { alias: 'personal', id: 0 } as any\n ;(spacesManager.spaceEnv as jest.Mock).mockResolvedValue(fakeSpace)\n\n const res = await service.spaceEnv(user as any, '/webdav/personal')\n expect(res).toBe(fakeSpace)\n expect(spacesManager.spaceEnv).toHaveBeenCalled()\n })\n\n it('returns null when manager throws', async () => {\n ;(spacesManager.spaceEnv as jest.Mock).mockRejectedValue(new Error('boom'))\n\n const res = await service.spaceEnv(user as any, '/webdav/personal')\n expect(res).toBeNull()\n })\n\n it('returns null when space not found', async () => {\n ;(spacesManager.spaceEnv as jest.Mock).mockResolvedValue(null)\n\n const res = await service.spaceEnv(user as any, '/webdav/personal')\n expect(res).toBeNull()\n })\n })\n\n describe('propfind - server root', () => {\n it('yields server root and webdav child when depth=1', async () => {\n const req = { user, dav: { url: '/', depth: DEPTH.MEMBERS } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.SERVER as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.SERVER, WEBDAV_NS.WEBDAV])\n })\n\n it('yields only server root when depth=0', async () => {\n const req = { user, dav: { url: '/', depth: DEPTH.RESOURCE } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.SERVER as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.SERVER])\n })\n })\n\n describe('propfind - webdav listing', () => {\n it('filters repositories by user access', async () => {\n ;(canAccessToSpaceUrl as jest.Mock).mockImplementation((_u: any, repos: string[]) => repos?.includes(SPACE_REPOSITORY.FILES))\n const req = { user, dav: { url: '/webdav', depth: DEPTH.MEMBERS } } as unknown as FastifyDAVRequest\n\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.WEBDAV as any))\n // should list only roots that include FILES in their repository (personal, spaces), not server/webdav\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.WEBDAV, 'personal', 'spaces'])\n })\n\n it('lists only itself when depth=0', async () => {\n const req = { user, dav: { url: '/webdav', depth: DEPTH.RESOURCE } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.WEBDAV as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.WEBDAV])\n })\n })\n\n describe('propfind - spaces listing', () => {\n it('yields spaces root then user spaces when depth=1', async () => {\n const now = new Date()\n ;(spacesManager.listSpaces as jest.Mock).mockResolvedValue([\n { id: 10, name: 'Team A', alias: 'team-a', createdAt: now.toISOString(), modifiedAt: now.toISOString() },\n { id: 11, name: 'Team B', alias: 'team-b', createdAt: now.toISOString(), modifiedAt: now.toISOString() }\n ])\n\n const req = { user, dav: { url: '/webdav/spaces', depth: DEPTH.MEMBERS } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.SPACES as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.SPACES, 'Team A', 'Team B'])\n })\n\n it('yields only spaces root when depth=0', async () => {\n ;(spacesManager.listSpaces as jest.Mock).mockResolvedValue([])\n const req = { user, dav: { url: '/webdav/spaces', depth: DEPTH.RESOURCE } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.SPACES as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.SPACES])\n })\n })\n\n describe('propfind - trashes listing', () => {\n it('yields trash root then each trash bucket when depth=1', async () => {\n ;(spacesManager.listTrashes as jest.Mock).mockResolvedValue([\n { id: 1, alias: 'personal', nb: 2, mtime: 3, ctime: 4, name: 'Personal files' },\n { id: 2, alias: 'team-a', nb: 5, mtime: 6, ctime: 7, name: 'Team A' }\n ])\n const req = { user, dav: { url: '/webdav/trash', depth: DEPTH.MEMBERS } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.TRASH as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.TRASH, 'personal (2)', 'team-a (5)'])\n })\n\n it('yields only trash root when depth=0', async () => {\n ;(spacesManager.listTrashes as jest.Mock).mockResolvedValue([])\n const req = { user, dav: { url: '/webdav/trash', depth: DEPTH.RESOURCE } } as unknown as FastifyDAVRequest\n const items = await collectGenerator(service.propfind(req, WEBDAV_NS.TRASH as any))\n expect(items.map((i: any) => i.name)).toEqual([WEBDAV_NS.TRASH])\n })\n })\n\n describe('propfind - files listing (shares list)', () => {\n it('yields shares root and children when inSharesList=true and depth=1', async () => {\n ;(spacesBrowser.browse as jest.Mock).mockResolvedValue({\n files: [{ id: 1, name: 'doc.txt', isDir: false, size: 12, ctime: 1, mtime: 2, mime: 'text/plain' }]\n })\n\n const req = {\n user,\n dav: { url: '/webdav/files/personal', depth: DEPTH.MEMBERS },\n space: { inSharesList: true, realPath: '/any/ignored' }\n } as unknown as FastifyDAVRequest\n\n const items = await collectGenerator(service.propfind(req, SPACE_REPOSITORY.FILES))\n expect(items.map((i: any) => i.name)).toEqual(['shares', 'doc.txt'])\n })\n })\n\n describe('propfind - files listing (path cases)', () => {\n it('throws 404 when path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n const req = {\n user,\n dav: { url: '/webdav/files/personal/current', depth: DEPTH.RESOURCE },\n space: { inSharesList: false, realPath: '/path/not/found' }\n } as unknown as FastifyDAVRequest\n\n await expect(collectGenerator(service.propfind(req, SPACE_REPOSITORY.FILES))).rejects.toBeInstanceOf(HttpException)\n await expect(collectGenerator(service.propfind(req, SPACE_REPOSITORY.FILES))).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('yields current directory and children when path exists and is dir', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({\n id: 100,\n name: 'current',\n isDir: true,\n size: 0,\n ctime: Date.now(),\n mtime: Date.now(),\n mime: undefined\n })\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n ;(spacesBrowser.browse as jest.Mock).mockResolvedValue({\n files: [{ id: 2, name: 'child.txt', isDir: false, size: 1, ctime: 1, mtime: 2, mime: 'text/plain' }]\n })\n\n const req = {\n user,\n dav: { url: '/webdav/files/personal/current', depth: DEPTH.MEMBERS },\n space: { inSharesList: false, realPath: '/path/current' }\n } as unknown as FastifyDAVRequest\n\n const items = await collectGenerator(service.propfind(req, SPACE_REPOSITORY.FILES))\n expect(items.map((i: any) => i.name)).toEqual(['current', 'child.txt'])\n })\n\n it('does not list children when path exists but is not a directory', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({\n id: 101,\n name: 'current',\n isDir: false,\n size: 123,\n ctime: Date.now(),\n mtime: Date.now(),\n mime: 'text/plain'\n })\n ;(isPathIsDir as jest.Mock).mockResolvedValue(false)\n ;(spacesBrowser.browse as jest.Mock).mockResolvedValue({ files: [] })\n\n const req = {\n user,\n dav: { url: '/webdav/files/personal/current', depth: DEPTH.MEMBERS },\n space: { inSharesList: false, realPath: '/path/current' }\n } as unknown as FastifyDAVRequest\n\n const items = await collectGenerator(service.propfind(req, SPACE_REPOSITORY.FILES))\n expect(items.map((i: any) => i.name)).toEqual(['current'])\n expect(spacesBrowser.browse).not.toHaveBeenCalled()\n })\n })\n\n describe('propfind - unknown space', () => {\n it('throws not found for unknown space', () => {\n const req = { user, dav: { url: '/webdav/unknown', depth: DEPTH.RESOURCE } } as unknown as FastifyDAVRequest\n try {\n service.propfind(req, 'unknown' as any)\n fail('Expected HttpException to be thrown')\n } catch (err) {\n expect(err).toBeInstanceOf(HttpException)\n expect((err as HttpException).getStatus()).toBe(HttpStatus.NOT_FOUND)\n }\n })\n })\n})\n"],"names":["jest","mock","getProps","fn","isPathExists","isPathIsDir","canAccessToSpaceUrl","WEBDAV_PATH_TO_SPACE_SEGMENTS","collectGenerator","gen","all","item","push","describe","WebDAVSpaces","name","service","spacesManager","spacesBrowser","user","id","login","isAdmin","beforeAll","spacesManagerMock","spaceEnv","listSpaces","listTrashes","spacesBrowserMock","browse","module","Test","createTestingModule","providers","provide","SpacesBrowser","useValue","SpacesManager","compile","useLogger","get","beforeEach","clearAllMocks","it","expect","toBeDefined","fakeSpace","alias","mockResolvedValue","res","toBe","toHaveBeenCalled","mockRejectedValue","Error","toBeNull","req","dav","url","depth","DEPTH","MEMBERS","items","propfind","WEBDAV_NS","SERVER","map","i","toEqual","WEBDAV","RESOURCE","mockImplementation","_u","repos","includes","SPACE_REPOSITORY","FILES","now","Date","createdAt","toISOString","modifiedAt","SPACES","nb","mtime","ctime","TRASH","files","isDir","size","mime","space","inSharesList","realPath","rejects","toBeInstanceOf","HttpException","toMatchObject","status","HttpStatus","NOT_FOUND","undefined","not","fail","err","getStatus"],"mappings":"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"}
|
|
@@ -37,14 +37,14 @@ function _ts_param(paramIndex, decorator) {
|
|
|
37
37
|
}
|
|
38
38
|
let WebDAVController = class WebDAVController {
|
|
39
39
|
serverOptions() {
|
|
40
|
-
// OPTIONS method is handled in the `DavProtocolGuard
|
|
40
|
+
// OPTIONS method is handled in the `DavProtocolGuard`, return empty response with headers
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
serverPropFind(req, res) {
|
|
44
44
|
return this.webdavMethods.propfind(req, res, _routes.WEBDAV_NS.SERVER);
|
|
45
45
|
}
|
|
46
46
|
webdavOptions() {
|
|
47
|
-
// OPTIONS method is handled in the `DavProtocolGuard
|
|
47
|
+
// OPTIONS method is handled in the `DavProtocolGuard`, return empty response with headers
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
async webdavPropfind(req, res) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/webdav/webdav.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { All, Controller, HttpStatus, Options, Param, Propfind, Req, Res, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { HTTP_METHOD } from '../applications.constants'\nimport { SPACE_REPOSITORY } from '../spaces/constants/spaces'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { WEBDAV_BASE_PATH, WEBDAV_NS } from './constants/routes'\nimport { WebDAVEnvironment } from './decorators/webdav-context.decorator'\nimport { FastifyDAVRequest } from './interfaces/webdav.interface'\nimport { WebDAVMethods } from './services/webdav-methods.service'\n\n@Controller()\n@WebDAVEnvironment()\nexport class WebDAVController {\n constructor(private readonly webdavMethods: WebDAVMethods) {}\n\n @Options()\n serverOptions() {\n // OPTIONS method is handled in the `DavProtocolGuard
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/webdav/webdav.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { All, Controller, HttpStatus, Options, Param, Propfind, Req, Res, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { HTTP_METHOD } from '../applications.constants'\nimport { SPACE_REPOSITORY } from '../spaces/constants/spaces'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { WEBDAV_BASE_PATH, WEBDAV_NS } from './constants/routes'\nimport { WebDAVEnvironment } from './decorators/webdav-context.decorator'\nimport { FastifyDAVRequest } from './interfaces/webdav.interface'\nimport { WebDAVMethods } from './services/webdav-methods.service'\n\n@Controller()\n@WebDAVEnvironment()\nexport class WebDAVController {\n constructor(private readonly webdavMethods: WebDAVMethods) {}\n\n @Options()\n serverOptions() {\n // OPTIONS method is handled in the `DavProtocolGuard`, return empty response with headers\n return\n }\n\n @Propfind()\n serverPropFind(@Req() req: FastifyDAVRequest, @Res({ passthrough: true }) res: FastifyReply) {\n return this.webdavMethods.propfind(req, res, WEBDAV_NS.SERVER)\n }\n\n @Options(WEBDAV_BASE_PATH)\n webdavOptions() {\n // OPTIONS method is handled in the `DavProtocolGuard`, return empty response with headers\n return\n }\n\n @Propfind(WEBDAV_BASE_PATH)\n async webdavPropfind(@Req() req: FastifyDAVRequest, @Res({ passthrough: true }) res: FastifyReply) {\n return this.webdavMethods.propfind(req, res, WEBDAV_NS.WEBDAV)\n }\n\n @Options(`${WEBDAV_BASE_PATH}/:repository(^(${WEBDAV_NS.SPACES}|${WEBDAV_NS.TRASH})$)`)\n repositoriesOptions() {\n // OPTIONS method is handled in the `DavProtocolGuard`\n return\n }\n\n @Propfind(`${WEBDAV_BASE_PATH}/:repository(^(${WEBDAV_NS.SPACES}|${WEBDAV_NS.TRASH})$)`)\n async repositoriesPropfind(@Req() req: FastifyDAVRequest, @Res({ passthrough: true }) res: FastifyReply, @Param('repository') repository: string) {\n return this.webdavMethods.propfind(req, res, repository)\n }\n\n @All(`${WEBDAV_BASE_PATH}/*`)\n @UseGuards(SpaceGuard)\n async files(@Req() req: FastifyDAVRequest, @Res({ passthrough: true }) res: FastifyReply) {\n // OPTIONS method is handled in the `DavProtocolGuard`\n switch (req.method) {\n case HTTP_METHOD.PROPFIND:\n return this.webdavMethods.propfind(req, res, SPACE_REPOSITORY.FILES)\n case HTTP_METHOD.HEAD:\n case HTTP_METHOD.GET:\n return this.webdavMethods.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n case HTTP_METHOD.PUT:\n return this.webdavMethods.put(req, res)\n case HTTP_METHOD.DELETE:\n return this.webdavMethods.delete(req, res)\n case HTTP_METHOD.LOCK:\n return this.webdavMethods.lock(req, res)\n case HTTP_METHOD.UNLOCK:\n return this.webdavMethods.unlock(req, res)\n case HTTP_METHOD.PROPPATCH:\n return this.webdavMethods.proppatch(req, res)\n case HTTP_METHOD.MKCOL:\n return this.webdavMethods.mkcol(req, res)\n case HTTP_METHOD.COPY:\n case HTTP_METHOD.MOVE:\n return this.webdavMethods.copyMove(req, res)\n default:\n return res.status(HttpStatus.METHOD_NOT_ALLOWED).send()\n }\n }\n}\n"],"names":["WebDAVController","serverOptions","serverPropFind","req","res","webdavMethods","propfind","WEBDAV_NS","SERVER","webdavOptions","webdavPropfind","WEBDAV","repositoriesOptions","repositoriesPropfind","repository","files","method","HTTP_METHOD","PROPFIND","SPACE_REPOSITORY","FILES","HEAD","GET","headOrGet","PUT","put","DELETE","delete","LOCK","lock","UNLOCK","unlock","PROPPATCH","proppatch","MKCOL","mkcol","COPY","MOVE","copyMove","status","HttpStatus","METHOD_NOT_ALLOWED","send","passthrough","WEBDAV_BASE_PATH","SPACES","TRASH"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-basic.guard.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 { ExecutionContext, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-basic.guard.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 { ExecutionContext, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard, IAuthGuard } from '@nestjs/passport'\nimport { FastifyRequest } from 'fastify'\nimport { HTTP_METHOD } from '../../applications/applications.constants'\nimport { WEBDAV_BASE_PATH } from '../../applications/webdav/constants/routes'\n\n@Injectable()\nexport class AuthBasicGuard extends AuthGuard('basic') implements IAuthGuard {\n private readonly logger = new Logger(AuthBasicGuard.name)\n\n canActivate(ctx: ExecutionContext) {\n // allow options method on server (webdav)\n const req: FastifyRequest = this.getRequest(ctx)\n if (req.method === HTTP_METHOD.OPTIONS) {\n // only allow options method to skip auth check on the server and webdav paths (including child uris)\n const segments = req.originalUrl.split('/').filter(Boolean)\n if (!segments.length || segments[0] === WEBDAV_BASE_PATH) {\n return true\n }\n }\n return super.canActivate(ctx)\n }\n\n handleRequest<TUser = any>(err: any, user: any, info: Error, ctx: ExecutionContext, status?: any): TUser {\n const req = this.getRequest(ctx)\n req.raw.user = user?.login || 'unauthorized'\n if (info) {\n this.logger.warn(`<${req.raw.user}> <${req.ip}> ${info}`)\n }\n return super.handleRequest(err, user, info, ctx, status)\n }\n}\n"],"names":["AuthBasicGuard","AuthGuard","canActivate","ctx","req","getRequest","method","HTTP_METHOD","OPTIONS","segments","originalUrl","split","filter","Boolean","length","WEBDAV_BASE_PATH","handleRequest","err","user","info","status","raw","login","logger","warn","ip","Logger","name"],"mappings":"AAAA;;;;CAIC;;;;+BASYA;;;eAAAA;;;wBAPwC;0BACf;uCAEV;wBACK;;;;;;;AAG1B,IAAA,AAAMA,iBAAN,MAAMA,uBAAuBC,IAAAA,mBAAS,EAAC;IAG5CC,YAAYC,GAAqB,EAAE;QACjC,0CAA0C;QAC1C,MAAMC,MAAsB,IAAI,CAACC,UAAU,CAACF;QAC5C,IAAIC,IAAIE,MAAM,KAAKC,kCAAW,CAACC,OAAO,EAAE;YACtC,qGAAqG;YACrG,MAAMC,WAAWL,IAAIM,WAAW,CAACC,KAAK,CAAC,KAAKC,MAAM,CAACC;YACnD,IAAI,CAACJ,SAASK,MAAM,IAAIL,QAAQ,CAAC,EAAE,KAAKM,wBAAgB,EAAE;gBACxD,OAAO;YACT;QACF;QACA,OAAO,KAAK,CAACb,YAAYC;IAC3B;IAEAa,cAA2BC,GAAQ,EAAEC,IAAS,EAAEC,IAAW,EAAEhB,GAAqB,EAAEiB,MAAY,EAAS;QACvG,MAAMhB,MAAM,IAAI,CAACC,UAAU,CAACF;QAC5BC,IAAIiB,GAAG,CAACH,IAAI,GAAGA,MAAMI,SAAS;QAC9B,IAAIH,MAAM;YACR,IAAI,CAACI,MAAM,CAACC,IAAI,CAAC,CAAC,CAAC,EAAEpB,IAAIiB,GAAG,CAACH,IAAI,CAAC,GAAG,EAAEd,IAAIqB,EAAE,CAAC,EAAE,EAAEN,MAAM;QAC1D;QACA,OAAO,KAAK,CAACH,cAAcC,KAAKC,MAAMC,MAAMhB,KAAKiB;IACnD;;QAvBK,qBACYG,SAAS,IAAIG,cAAM,CAAC1B,eAAe2B,IAAI;;AAuB1D"}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
4
|
* See the LICENSE file for licensing details
|
|
5
5
|
*/ // import { ExecutionContext, Injectable, Logger } from '@nestjs/common'
|
|
6
|
-
// import { AuthGuard } from '@nestjs/passport'
|
|
7
|
-
// import { IAuthGuard } from '@nestjs/passport/dist/auth.guard'
|
|
6
|
+
// import { AuthGuard, IAuthGuard } from '@nestjs/passport'
|
|
8
7
|
//
|
|
9
8
|
// @Injectable()
|
|
10
9
|
// export class AuthDigestGuard extends AuthGuard('digest') implements IAuthGuard {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-digest.guard.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\n// import { ExecutionContext, Injectable, Logger } from '@nestjs/common'\n// import { AuthGuard
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-digest.guard.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\n// import { ExecutionContext, Injectable, Logger } from '@nestjs/common'\n// import { AuthGuard, IAuthGuard } from '@nestjs/passport'\n//\n// @Injectable()\n// export class AuthDigestGuard extends AuthGuard('digest') implements IAuthGuard {\n// private readonly logger = new Logger(AuthDigestGuard.name)\n//\n// handleRequest<TUser = any>(err: any, user: any, info: Error, ctx: ExecutionContext, status?: any): TUser {\n// const request = this.getRequest(ctx)\n// request.raw.user = user ? user.login : 'unauthorized'\n// if (info) {\n// this.logger.warn(`<${request.raw.user}> <${request.ip}> ${info}`)\n// }\n// return super.handleRequest(err, user, info, ctx, status)\n// }\n// }\n"],"names":[],"mappings":"AAAA;;;;CAIC,GAED,wEAAwE;AACxE,2DAA2D;AAC3D,EAAE;AACF,gBAAgB;AAChB,mFAAmF;AACnF,+DAA+D;AAC/D,EAAE;AACF,+GAA+G;AAC/G,2CAA2C;AAC3C,4DAA4D;AAC5D,kBAAkB;AAClB,0EAA0E;AAC1E,QAAQ;AACR,+DAA+D;AAC/D,MAAM;AACN,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-local.guard.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 { ExecutionContext, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/authentication/guards/auth-local.guard.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 { ExecutionContext, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard, IAuthGuard } from '@nestjs/passport'\n\n@Injectable()\nexport class AuthLocalGuard extends AuthGuard('local') implements IAuthGuard {\n private readonly logger = new Logger(AuthLocalGuard.name)\n\n handleRequest<TUser = any>(err: any, user: any, info: Error, ctx: ExecutionContext, status?: any): TUser {\n const req = this.getRequest(ctx)\n req.raw.user = user?.login || 'unauthorized'\n if (info) {\n this.logger.warn(`<${req.raw.user}> <${req.ip}> ${info}`)\n }\n return super.handleRequest(err, user, info, ctx, status)\n }\n}\n"],"names":["AuthLocalGuard","AuthGuard","handleRequest","err","user","info","ctx","status","req","getRequest","raw","login","logger","warn","ip","Logger","name"],"mappings":"AAAA;;;;CAIC;;;;+BAMYA;;;eAAAA;;;wBAJwC;0BACf;;;;;;;AAG/B,IAAA,AAAMA,iBAAN,MAAMA,uBAAuBC,IAAAA,mBAAS,EAAC;IAG5CC,cAA2BC,GAAQ,EAAEC,IAAS,EAAEC,IAAW,EAAEC,GAAqB,EAAEC,MAAY,EAAS;QACvG,MAAMC,MAAM,IAAI,CAACC,UAAU,CAACH;QAC5BE,IAAIE,GAAG,CAACN,IAAI,GAAGA,MAAMO,SAAS;QAC9B,IAAIN,MAAM;YACR,IAAI,CAACO,MAAM,CAACC,IAAI,CAAC,CAAC,CAAC,EAAEL,IAAIE,GAAG,CAACN,IAAI,CAAC,GAAG,EAAEI,IAAIM,EAAE,CAAC,EAAE,EAAET,MAAM;QAC1D;QACA,OAAO,KAAK,CAACH,cAAcC,KAAKC,MAAMC,MAAMC,KAAKC;IACnD;;QAVK,qBACYK,SAAS,IAAIG,cAAM,CAACf,eAAegB,IAAI;;AAU1D"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
+
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
+
* See the LICENSE file for licensing details
|
|
5
|
+
*/ "use strict";
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
const _testing = require("@nestjs/testing");
|
|
10
|
+
const _rxjs = require("rxjs");
|
|
11
|
+
const _contextinterceptor = require("./context.interceptor");
|
|
12
|
+
const _contextmanagerservice = require("../services/context-manager.service");
|
|
13
|
+
// Helper to create a minimal ExecutionContext with Fastify-like request
|
|
14
|
+
function createHttpExecutionContext(request) {
|
|
15
|
+
return {
|
|
16
|
+
switchToHttp: ()=>({
|
|
17
|
+
getRequest: ()=>request,
|
|
18
|
+
getResponse: ()=>({}),
|
|
19
|
+
getNext: ()=>({})
|
|
20
|
+
}),
|
|
21
|
+
getType: ()=>'http',
|
|
22
|
+
getClass: ()=>({}),
|
|
23
|
+
getHandler: ()=>({}),
|
|
24
|
+
switchToRpc: ()=>({}),
|
|
25
|
+
switchToWs: ()=>({}),
|
|
26
|
+
getArgByIndex: ()=>({}),
|
|
27
|
+
getArgs: ()=>[]
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
describe('ContextInterceptor', ()=>{
|
|
31
|
+
let interceptor;
|
|
32
|
+
let contextManager;
|
|
33
|
+
beforeEach(async ()=>{
|
|
34
|
+
contextManager = {
|
|
35
|
+
// By default, run will execute the provided callback and return its result
|
|
36
|
+
run: jest.fn((_ctx, cb)=>cb())
|
|
37
|
+
};
|
|
38
|
+
const module = await _testing.Test.createTestingModule({
|
|
39
|
+
providers: [
|
|
40
|
+
_contextinterceptor.ContextInterceptor,
|
|
41
|
+
{
|
|
42
|
+
provide: _contextmanagerservice.ContextManager,
|
|
43
|
+
useValue: contextManager
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}).compile();
|
|
47
|
+
interceptor = module.get(_contextinterceptor.ContextInterceptor);
|
|
48
|
+
});
|
|
49
|
+
it('should pass headerOriginUrl from Origin header to ContextManager.run and forward next.handle()', (done)=>{
|
|
50
|
+
const origin = 'https://example.com';
|
|
51
|
+
const request = {
|
|
52
|
+
headers: {
|
|
53
|
+
origin,
|
|
54
|
+
host: 'ignored-host'
|
|
55
|
+
},
|
|
56
|
+
protocol: 'http'
|
|
57
|
+
};
|
|
58
|
+
const context = createHttpExecutionContext(request);
|
|
59
|
+
const next = {
|
|
60
|
+
handle: jest.fn(()=>(0, _rxjs.of)('ok'))
|
|
61
|
+
};
|
|
62
|
+
const result$ = interceptor.intercept(context, next);
|
|
63
|
+
expect(contextManager.run).toHaveBeenCalledTimes(1);
|
|
64
|
+
const [ctxArg, cbArg] = contextManager.run.mock.calls[0];
|
|
65
|
+
expect(ctxArg).toEqual({
|
|
66
|
+
headerOriginUrl: origin
|
|
67
|
+
});
|
|
68
|
+
expect(typeof cbArg).toBe('function');
|
|
69
|
+
// next.handle is invoked synchronously by ContextManager.run; assert in subscription to keep flow consistent
|
|
70
|
+
result$.subscribe({
|
|
71
|
+
next: (val)=>{
|
|
72
|
+
expect(next.handle).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(val).toBe('ok');
|
|
74
|
+
done();
|
|
75
|
+
},
|
|
76
|
+
error: done
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('should build headerOriginUrl from protocol and host when Origin header is missing', (done)=>{
|
|
80
|
+
const request = {
|
|
81
|
+
headers: {
|
|
82
|
+
host: 'my-host.local:3000'
|
|
83
|
+
},
|
|
84
|
+
protocol: 'http'
|
|
85
|
+
};
|
|
86
|
+
const context = createHttpExecutionContext(request);
|
|
87
|
+
const next = {
|
|
88
|
+
handle: jest.fn(()=>(0, _rxjs.of)({
|
|
89
|
+
status: 'passed'
|
|
90
|
+
}))
|
|
91
|
+
};
|
|
92
|
+
const result$ = interceptor.intercept(context, next);
|
|
93
|
+
expect(contextManager.run).toHaveBeenCalledTimes(1);
|
|
94
|
+
const [ctxArg, cbArg] = contextManager.run.mock.calls[0];
|
|
95
|
+
expect(ctxArg).toEqual({
|
|
96
|
+
headerOriginUrl: 'http://my-host.local:3000'
|
|
97
|
+
});
|
|
98
|
+
expect(typeof cbArg).toBe('function');
|
|
99
|
+
result$.subscribe({
|
|
100
|
+
next: (val)=>{
|
|
101
|
+
expect(next.handle).toHaveBeenCalledTimes(1);
|
|
102
|
+
expect(val).toEqual({
|
|
103
|
+
status: 'passed'
|
|
104
|
+
});
|
|
105
|
+
done();
|
|
106
|
+
},
|
|
107
|
+
error: done
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('should return the observable produced by next.handle() within ContextManager.run callback', (done)=>{
|
|
111
|
+
// Ensure run executes the callback and returns its result
|
|
112
|
+
contextManager.run.mockImplementation((_ctx, cb)=>cb());
|
|
113
|
+
const request = {
|
|
114
|
+
headers: {
|
|
115
|
+
origin: 'https://origin.test'
|
|
116
|
+
},
|
|
117
|
+
protocol: 'https'
|
|
118
|
+
};
|
|
119
|
+
const context = createHttpExecutionContext(request);
|
|
120
|
+
const next = {
|
|
121
|
+
handle: jest.fn(()=>(0, _rxjs.of)(123))
|
|
122
|
+
};
|
|
123
|
+
const result$ = interceptor.intercept(context, next);
|
|
124
|
+
result$.subscribe({
|
|
125
|
+
next: (val)=>{
|
|
126
|
+
expect(val).toBe(123);
|
|
127
|
+
expect(next.handle).toHaveBeenCalledTimes(1);
|
|
128
|
+
done();
|
|
129
|
+
},
|
|
130
|
+
error: done
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
//# sourceMappingURL=context.interceptor.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/infrastructure/context/interceptors/context.interceptor.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 { CallHandler, ExecutionContext } from '@nestjs/common'\nimport { of } from 'rxjs'\nimport { ContextInterceptor } from './context.interceptor'\nimport { ContextManager } from '../services/context-manager.service'\n\n// Helper to create a minimal ExecutionContext with Fastify-like request\nfunction createHttpExecutionContext(request: any): ExecutionContext {\n return {\n switchToHttp: () => ({\n getRequest: () => request,\n getResponse: () => ({}) as any,\n getNext: () => ({}) as any\n }),\n getType: () => 'http' as any,\n getClass: () => ({}) as any,\n getHandler: () => ({}) as any,\n switchToRpc: () => ({}) as any,\n switchToWs: () => ({}) as any,\n getArgByIndex: () => ({}) as any,\n getArgs: () => [] as any\n } as ExecutionContext\n}\n\ndescribe('ContextInterceptor', () => {\n let interceptor: ContextInterceptor\n let contextManager: { run: jest.Mock }\n\n beforeEach(async () => {\n contextManager = {\n // By default, run will execute the provided callback and return its result\n run: jest.fn((_ctx: any, cb: () => any) => cb())\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n ContextInterceptor,\n {\n provide: ContextManager,\n useValue: contextManager\n }\n ]\n }).compile()\n\n interceptor = module.get(ContextInterceptor)\n })\n\n it('should pass headerOriginUrl from Origin header to ContextManager.run and forward next.handle()', (done) => {\n const origin = 'https://example.com'\n const request = {\n headers: { origin, host: 'ignored-host' },\n protocol: 'http'\n }\n\n const context = createHttpExecutionContext(request)\n const next: CallHandler = { handle: jest.fn(() => of('ok')) }\n\n const result$ = interceptor.intercept(context, next)\n\n expect(contextManager.run).toHaveBeenCalledTimes(1)\n const [ctxArg, cbArg] = contextManager.run.mock.calls[0]\n expect(ctxArg).toEqual({ headerOriginUrl: origin })\n expect(typeof cbArg).toBe('function')\n // next.handle is invoked synchronously by ContextManager.run; assert in subscription to keep flow consistent\n result$.subscribe({\n next: (val) => {\n expect(next.handle).toHaveBeenCalledTimes(1)\n expect(val).toBe('ok')\n done()\n },\n error: done\n })\n })\n\n it('should build headerOriginUrl from protocol and host when Origin header is missing', (done) => {\n const request = {\n headers: { host: 'my-host.local:3000' },\n protocol: 'http'\n }\n\n const context = createHttpExecutionContext(request)\n const next: CallHandler = { handle: jest.fn(() => of({ status: 'passed' })) }\n\n const result$ = interceptor.intercept(context, next)\n\n expect(contextManager.run).toHaveBeenCalledTimes(1)\n const [ctxArg, cbArg] = contextManager.run.mock.calls[0]\n expect(ctxArg).toEqual({ headerOriginUrl: 'http://my-host.local:3000' })\n expect(typeof cbArg).toBe('function')\n\n result$.subscribe({\n next: (val) => {\n expect(next.handle).toHaveBeenCalledTimes(1)\n expect(val).toEqual({ status: 'passed' })\n done()\n },\n error: done\n })\n })\n\n it('should return the observable produced by next.handle() within ContextManager.run callback', (done) => {\n // Ensure run executes the callback and returns its result\n contextManager.run.mockImplementation((_ctx: any, cb: () => any) => cb())\n\n const request = {\n headers: { origin: 'https://origin.test' },\n protocol: 'https'\n }\n\n const context = createHttpExecutionContext(request)\n const next: CallHandler = { handle: jest.fn(() => of(123)) }\n\n const result$ = interceptor.intercept(context, next)\n\n result$.subscribe({\n next: (val) => {\n expect(val).toBe(123)\n expect(next.handle).toHaveBeenCalledTimes(1)\n done()\n },\n error: done\n })\n })\n})\n"],"names":["createHttpExecutionContext","request","switchToHttp","getRequest","getResponse","getNext","getType","getClass","getHandler","switchToRpc","switchToWs","getArgByIndex","getArgs","describe","interceptor","contextManager","beforeEach","run","jest","fn","_ctx","cb","module","Test","createTestingModule","providers","ContextInterceptor","provide","ContextManager","useValue","compile","get","it","done","origin","headers","host","protocol","context","next","handle","of","result$","intercept","expect","toHaveBeenCalledTimes","ctxArg","cbArg","mock","calls","toEqual","headerOriginUrl","toBe","subscribe","val","error","status","mockImplementation"],"mappings":"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"}
|
|
@@ -51,32 +51,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
51
51
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
52
52
|
THE SOFTWARE.
|
|
53
53
|
|
|
54
|
-
--------------------------------------------------------------------------------
|
|
55
|
-
Package: @videogular/ngx-videogular
|
|
56
|
-
License: "MIT"
|
|
57
|
-
|
|
58
|
-
MIT License
|
|
59
|
-
|
|
60
|
-
Copyright (c) 2021 Videogular
|
|
61
|
-
|
|
62
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
63
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
64
|
-
in the Software without restriction, including without limitation the rights
|
|
65
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
66
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
67
|
-
furnished to do so, subject to the following conditions:
|
|
68
|
-
|
|
69
|
-
The above copyright notice and this permission notice shall be included in all
|
|
70
|
-
copies or substantial portions of the Software.
|
|
71
|
-
|
|
72
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
73
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
74
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
75
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
76
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
77
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
78
|
-
SOFTWARE.
|
|
79
|
-
|
|
80
54
|
--------------------------------------------------------------------------------
|
|
81
55
|
Package: @fortawesome/free-brands-svg-icons
|
|
82
56
|
License: "(CC-BY-4.0 AND MIT)"
|
|
@@ -523,6 +497,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
523
497
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
524
498
|
SOFTWARE.
|
|
525
499
|
|
|
500
|
+
--------------------------------------------------------------------------------
|
|
501
|
+
Package: @videogular/ngx-videogular
|
|
502
|
+
License: "MIT"
|
|
503
|
+
|
|
504
|
+
MIT License
|
|
505
|
+
|
|
506
|
+
Copyright (c) 2021 Videogular
|
|
507
|
+
|
|
508
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
509
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
510
|
+
in the Software without restriction, including without limitation the rights
|
|
511
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
512
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
513
|
+
furnished to do so, subject to the following conditions:
|
|
514
|
+
|
|
515
|
+
The above copyright notice and this permission notice shall be included in all
|
|
516
|
+
copies or substantial portions of the Software.
|
|
517
|
+
|
|
518
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
519
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
520
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
521
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
522
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
523
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
524
|
+
SOFTWARE.
|
|
525
|
+
|
|
526
526
|
--------------------------------------------------------------------------------
|
|
527
527
|
Package: ngx-window-token
|
|
528
528
|
License: "MIT"
|