@sync-in/server 1.9.6 → 1.10.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 +38 -4
- package/README.md +2 -2
- package/environment/environment.dist.yaml +15 -5
- package/package.json +14 -16
- package/server/app.bootstrap.js +4 -23
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +3 -2
- package/server/app.constants.js.map +1 -1
- package/server/applications/comments/services/comments-queries.service.js +5 -9
- package/server/applications/comments/services/comments-queries.service.js.map +1 -1
- package/server/applications/files/constants/cache.js +2 -5
- package/server/applications/files/constants/cache.js.map +1 -1
- package/server/applications/files/constants/files.js +4 -0
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/operations.js +4 -0
- package/server/applications/files/constants/operations.js.map +1 -1
- package/server/applications/files/constants/routes.js +1 -26
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/files.config.js +15 -39
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.js +4 -4
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.module.js +12 -9
- package/server/applications/files/files.module.js.map +1 -1
- package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
- package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +32 -0
- package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +280 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +552 -0
- package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.config.js +40 -0
- package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js +110 -0
- package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js +128 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +47 -0
- package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -0
- package/server/applications/files/{interfaces/only-office-config.interface.js → modules/collabora-online/collabora-online.dtos.js} +1 -1
- package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.guard.js → modules/collabora-online/collabora-online.guard.js} +7 -21
- package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +86 -0
- package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js +10 -0
- package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.module.js +41 -0
- package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js +35 -0
- package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +59 -0
- package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -0
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js +28 -0
- package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -0
- package/server/applications/files/{decorators → modules/only-office}/only-office-environment.decorator.js +5 -5
- package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -0
- package/server/applications/files/{services/files-only-office-manager.service.js → modules/only-office/only-office-manager.service.js} +101 -97
- package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +477 -0
- package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.config.js +51 -0
- package/server/applications/files/modules/only-office/only-office.config.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.constants.js +417 -0
- package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -0
- package/server/applications/files/{files-only-office.controller.js → modules/only-office/only-office.controller.js} +35 -52
- package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -0
- package/server/applications/files/{files-only-office.controller.spec.js → modules/only-office/only-office.controller.spec.js} +24 -21
- package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.dtos.js +10 -0
- package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.guard.js +40 -0
- package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.guard.spec.js → modules/only-office/only-office.guard.spec.js} +15 -21
- package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.interface.js +10 -0
- package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.module.js +41 -0
- package/server/applications/files/modules/only-office/only-office.module.js.map +1 -0
- package/server/applications/files/modules/only-office/only-office.routes.js +45 -0
- package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -0
- package/server/applications/files/{guards/files-only-office.strategy.js → modules/only-office/only-office.strategy.js} +11 -11
- package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -0
- package/server/applications/files/services/files-lock-manager.service.js +25 -33
- package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +17 -16
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +2 -2
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.spec.js +3 -1
- package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +2 -2
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/utils/files.js +10 -2
- package/server/applications/files/utils/files.js.map +1 -1
- package/server/applications/links/constants/routes.js +5 -0
- package/server/applications/links/constants/routes.js.map +1 -1
- package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
- package/server/applications/links/links.controller.js +25 -5
- package/server/applications/links/links.controller.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +43 -21
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +4 -3
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +9 -2
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +3 -0
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +2 -1
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +1 -0
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/spaces/constants/spaces.js +2 -2
- package/server/applications/spaces/constants/spaces.js.map +1 -1
- package/server/applications/spaces/decorators/space-override-permission.decorator.js +18 -0
- package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -0
- package/server/applications/spaces/guards/space.guard.js +40 -33
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +10 -15
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/users/users.e2e-spec.js +0 -1
- package/server/applications/users/users.e2e-spec.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +11 -0
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.js +9 -8
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
- package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +40 -17
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.spec.js +2157 -1289
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/utils/bootstrap.js +45 -0
- package/server/applications/webdav/utils/bootstrap.js.map +1 -0
- package/server/applications/webdav/utils/webdav.js +8 -4
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +5 -5
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/applications/webdav/webdav.e2e-spec.js +131 -2
- package/server/applications/webdav/webdav.e2e-spec.js.map +1 -1
- package/server/authentication/auth.e2e-spec.js +12 -6
- package/server/authentication/auth.e2e-spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.spec.js +23 -0
- package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +3 -3
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-digest.strategy.js +32 -11
- package/server/authentication/guards/auth-digest.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.js +8 -3
- package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
- package/server/authentication/guards/implementations/http-basic.strategy.js +76 -0
- package/server/authentication/guards/implementations/http-basic.strategy.js.map +1 -0
- package/server/authentication/guards/implementations/http-digest.strategy.js +155 -0
- package/server/authentication/guards/implementations/http-digest.strategy.js.map +1 -0
- package/server/authentication/services/auth-manager.service.js +1 -2
- package/server/authentication/services/auth-manager.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js +350 -4
- package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +1 -1
- package/server/configuration/config.environment.js +5 -1
- package/server/configuration/config.environment.js.map +1 -1
- package/server/configuration/config.interfaces.js.map +1 -1
- package/static/3rdpartylicenses.txt +507 -507
- package/static/assets/pdfjs/build/pdf.mjs +93 -33
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
- package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.worker.mjs +166 -54
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/images/checkmark.svg +5 -0
- package/static/assets/pdfjs/web/images/pages_closeButton.svg +3 -0
- package/static/assets/pdfjs/web/images/pages_selected.svg +7 -0
- package/static/assets/pdfjs/web/images/pages_viewArrow.svg +3 -0
- package/static/assets/pdfjs/web/images/pages_viewButton.svg +3 -0
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +6 -2
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +82 -17
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/eu/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/fur/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +3 -5
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hr/viewer.ftl +66 -0
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +3 -8
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/id/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +0 -14
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +1 -3
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +4 -2
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/pt-PT/viewer.ftl +35 -0
- package/static/assets/pdfjs/web/locale/rm/viewer.ftl +0 -5
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +4 -6
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -5
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sq/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/th/viewer.ftl +2 -2
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +0 -2
- package/static/assets/pdfjs/web/viewer.css +1778 -835
- package/static/assets/pdfjs/web/viewer.html +167 -86
- package/static/assets/pdfjs/web/viewer.mjs +1106 -801
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/chunk-27V66YJV.js +2 -0
- package/static/{chunk-2F42MZQ5.js → chunk-2GXOVGTD.js} +1 -1
- package/static/{chunk-HLKZCMKV.js → chunk-2RWLNKZH.js} +1 -1
- package/static/chunk-2YQ4SX3A.js +13 -0
- package/static/{chunk-LFAQLJZK.js → chunk-3MVPXC3U.js} +1 -1
- package/static/chunk-3QTROEHV.js +1 -0
- package/static/{chunk-JYHTSSKW.js → chunk-3VRUIWQG.js} +1 -1
- package/static/{chunk-2CAAJBRO.js → chunk-3ZBAQTHJ.js} +1 -1
- package/static/chunk-3ZLBVUCX.js +2 -0
- package/static/chunk-46TJLPJY.js +1 -0
- package/static/chunk-4NIYCYRS.js +2 -0
- package/static/chunk-6OEOADR6.js +1 -0
- package/static/{chunk-BJARRIS6.js → chunk-76M3BMK6.js} +11 -11
- package/static/{chunk-ANH4VNOS.js → chunk-76REYAEA.js} +1 -1
- package/static/{chunk-7HL5Z6PF.js → chunk-7HJFIMNF.js} +1 -1
- package/static/{chunk-XIQXRSZ2.js → chunk-7KAYOR3A.js} +1 -1
- package/static/chunk-AALPWGPB.js +3 -0
- package/static/{chunk-Z2KBIZ5D.js → chunk-ARS47O5X.js} +1 -1
- package/static/chunk-BCN4T5DO.js +2 -0
- package/static/{chunk-DU4Q4RWJ.js → chunk-CMNMPG6Z.js} +1 -1
- package/static/{chunk-UO7ATVQG.js → chunk-CN5YVRFT.js} +1 -1
- package/static/{chunk-BX3QZ7IL.js → chunk-CSVPAZHK.js} +1 -1
- package/static/chunk-CVXLHSO5.js +1 -0
- package/static/{chunk-O233BXWK.js → chunk-D2MLAO5N.js} +1 -1
- package/static/{chunk-NHMYAVJK.js → chunk-D5FQ72R4.js} +1 -1
- package/static/{chunk-IBC7CFBQ.js → chunk-DVCN3P7Q.js} +1 -1
- package/static/{chunk-25PWAXTJ.js → chunk-EKWB5W72.js} +1 -1
- package/static/{chunk-ZCOEP4O2.js → chunk-FTFEQDWH.js} +1 -1
- package/static/{chunk-EPDWJEPD.js → chunk-FWQJ4ZCD.js} +1 -1
- package/static/chunk-G7RZN7HN.js +1 -0
- package/static/{chunk-X5UDV4ZB.js → chunk-HZAB6F4Q.js} +1 -1
- package/static/{chunk-FEQUP26G.js → chunk-IHS5LSJJ.js} +1 -1
- package/static/{chunk-DQAQUSVW.js → chunk-IMFO2MI7.js} +1 -1
- package/static/{chunk-ODAQRAPO.js → chunk-J7474P3L.js} +1 -1
- package/static/{chunk-DK2LAJEL.js → chunk-JAJ7VXMB.js} +1 -1
- package/static/{chunk-AYYJZMBE.js → chunk-JNTNMIUH.js} +1 -1
- package/static/chunk-JRXG43AA.js +2 -0
- package/static/{chunk-3AR5VNJE.js → chunk-KAUCN24H.js} +1 -1
- package/static/{chunk-3WS72A6C.js → chunk-KDUAB76O.js} +1 -1
- package/static/chunk-KEZNIIFH.js +1 -0
- package/static/chunk-LTJNLOX2.js +1 -0
- package/static/chunk-LWSCODLD.js +1 -0
- package/static/{chunk-GRV44RYI.js → chunk-LZUHREOF.js} +1 -1
- package/static/chunk-NIKNG2FX.js +1 -0
- package/static/chunk-NNZWSNAW.js +1 -0
- package/static/chunk-NWKBB7J4.js +1 -0
- package/static/{chunk-B4TDS6AQ.js → chunk-PDG7DOEF.js} +1 -1
- package/static/{chunk-NQCKX2AD.js → chunk-PPJCVBJH.js} +1 -1
- package/static/chunk-PVYVY3GD.js +1 -0
- package/static/chunk-Q5X5TPAG.js +1 -0
- package/static/chunk-QGHNJVJ6.js +1 -0
- package/static/{chunk-5HYSNQR4.js → chunk-QJ22N76V.js} +1 -1
- package/static/{chunk-TOCCCZP2.js → chunk-QTPIEEZW.js} +1 -1
- package/static/{chunk-D6QWQHWE.js → chunk-R4VMWCM5.js} +1 -1
- package/static/{chunk-7H5O4BLV.js → chunk-R4VYKZVJ.js} +1 -1
- package/static/{chunk-QKMN3S4M.js → chunk-RBTLSPYJ.js} +1 -1
- package/static/chunk-RJULB733.js +1 -0
- package/static/{chunk-E5C4QRNQ.js → chunk-RNVPQQKT.js} +5 -5
- package/static/chunk-RTNEBRKJ.js +1 -0
- package/static/{chunk-IIKL33TV.js → chunk-S44QIK3G.js} +1 -1
- package/static/{chunk-SF6Q6VRC.js → chunk-S6H2ELRY.js} +1 -1
- package/static/{chunk-4GBA6EJ4.js → chunk-SDJNZULP.js} +1 -1
- package/static/chunk-SNOOCDJD.js +1 -0
- package/static/chunk-SPQH3ATC.js +5 -0
- package/static/{chunk-5KVI243T.js → chunk-TNCKNU6I.js} +1 -1
- package/static/{chunk-7QYALK5T.js → chunk-TTWMFWEC.js} +1 -1
- package/static/{chunk-OVUMPMVM.js → chunk-U5E5H2DD.js} +1 -1
- package/static/{chunk-5NFH4E2B.js → chunk-UOK3LKSX.js} +1 -1
- package/static/{chunk-5ATJIR5S.js → chunk-VBTZDHZ3.js} +1 -1
- package/static/{chunk-CHMDM2ZW.js → chunk-VD5JHSDS.js} +1 -1
- package/static/chunk-VZFZUI6D.js +1 -0
- package/static/{chunk-GYYJ4FWN.js → chunk-WFMEUST4.js} +1 -1
- package/static/{chunk-BVKDW5XO.js → chunk-WRK2FTKU.js} +1 -1
- package/static/{chunk-GLPKRULI.js → chunk-WZPF4LS2.js} +1 -1
- package/static/chunk-X7NHX5C7.js +1 -0
- package/static/{chunk-FSGT46LM.js → chunk-XSURUW7C.js} +1 -1
- package/static/{chunk-KAAFVHYE.js → chunk-XX3JPJUM.js} +1 -1
- package/static/{chunk-C5T7RZSD.js → chunk-XZHWESIY.js} +1 -1
- package/static/chunk-ZCSHU3D7.js +1 -0
- package/static/{chunk-QUUQOBTF.js → chunk-ZEJLIGAY.js} +1 -1
- package/static/{chunk-GENTF6JM.js → chunk-ZHUBWKA2.js} +1 -1
- package/static/chunk-ZOMRIN3G.js +2 -0
- package/static/{chunk-2U5VKTML.js → chunk-ZU5MQTFN.js} +1 -1
- package/static/index.html +2 -2
- package/static/main-5O3KLGIR.js +11 -0
- package/static/{styles-S5HVK4H5.css → styles-XLLEY5Y3.css} +1 -1
- package/server/applications/files/constants/only-office.js +0 -531
- package/server/applications/files/constants/only-office.js.map +0 -1
- package/server/applications/files/decorators/only-office-environment.decorator.js.map +0 -1
- package/server/applications/files/files-only-office.controller.js.map +0 -1
- package/server/applications/files/files-only-office.controller.spec.js.map +0 -1
- package/server/applications/files/guards/files-only-office.guard.js.map +0 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js.map +0 -1
- package/server/applications/files/guards/files-only-office.strategy.js.map +0 -1
- package/server/applications/files/interfaces/only-office-config.interface.js.map +0 -1
- package/server/applications/files/services/files-only-office-manager.service.js.map +0 -1
- package/server/applications/files/services/files-only-office-manager.service.spec.js +0 -58
- package/server/applications/files/services/files-only-office-manager.service.spec.js.map +0 -1
- package/static/chunk-42L6C5MT.js +0 -1
- package/static/chunk-4ZKAVMB4.js +0 -1
- package/static/chunk-5GIWZKNS.js +0 -1
- package/static/chunk-5WCQBTXW.js +0 -1
- package/static/chunk-B2A4HNDC.js +0 -1
- package/static/chunk-BSB4VROD.js +0 -2
- package/static/chunk-CUC7R6C2.js +0 -1
- package/static/chunk-DHFQIFOF.js +0 -1
- package/static/chunk-DRHPEERW.js +0 -2
- package/static/chunk-FCGTI42I.js +0 -1
- package/static/chunk-FCR5AEHR.js +0 -3
- package/static/chunk-HB5DC7RJ.js +0 -1
- package/static/chunk-ITVA26X2.js +0 -2
- package/static/chunk-KWKZN53T.js +0 -1
- package/static/chunk-LBXOAKBD.js +0 -1
- package/static/chunk-LZKI5P5T.js +0 -1
- package/static/chunk-MGMDT4VN.js +0 -1
- package/static/chunk-MWUUM2NK.js +0 -13
- package/static/chunk-MYM43ENO.js +0 -1
- package/static/chunk-NAH4V2R6.js +0 -2
- package/static/chunk-PCFH5HCI.js +0 -2
- package/static/chunk-Q6B4OVER.js +0 -5
- package/static/chunk-QV5LQKTS.js +0 -1
- package/static/chunk-S4UTSOPV.js +0 -1
- package/static/chunk-SRBOO7AO.js +0 -1
- package/static/chunk-VZPCXSRG.js +0 -2
- package/static/chunk-XKEBQNQJ.js +0 -1
- package/static/chunk-YYTDPI5S.js +0 -1
- package/static/main-ODUA232E.js +0 -11
- /package/static/assets/pdfjs/web/images/{toolbarButton-sidebarToggle.svg → toolbarButton-viewsManagerToggle.svg} +0 -0
|
@@ -6,22 +6,16 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", {
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
_export(exports, {
|
|
16
|
-
get FilesConfig () {
|
|
9
|
+
Object.defineProperty(exports, "FilesConfig", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
17
12
|
return FilesConfig;
|
|
18
|
-
},
|
|
19
|
-
get FilesOnlyOfficeConfig () {
|
|
20
|
-
return FilesOnlyOfficeConfig;
|
|
21
13
|
}
|
|
22
14
|
});
|
|
23
15
|
const _classtransformer = require("class-transformer");
|
|
24
16
|
const _classvalidator = require("class-validator");
|
|
17
|
+
const _collaboraonlineconfig = require("./modules/collabora-online/collabora-online.config");
|
|
18
|
+
const _onlyofficeconfig = require("./modules/only-office/only-office.config");
|
|
25
19
|
function _ts_decorate(decorators, target, key, desc) {
|
|
26
20
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
27
21
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -31,37 +25,13 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
31
25
|
function _ts_metadata(k, v) {
|
|
32
26
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
27
|
}
|
|
34
|
-
let FilesOnlyOfficeConfig = class FilesOnlyOfficeConfig {
|
|
35
|
-
constructor(){
|
|
36
|
-
this.enabled = false;
|
|
37
|
-
this.externalServer = null;
|
|
38
|
-
this.verifySSL = false;
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
_ts_decorate([
|
|
42
|
-
(0, _classvalidator.IsBoolean)()
|
|
43
|
-
], FilesOnlyOfficeConfig.prototype, "enabled", void 0);
|
|
44
|
-
_ts_decorate([
|
|
45
|
-
(0, _classvalidator.IsOptional)(),
|
|
46
|
-
(0, _classvalidator.IsString)(),
|
|
47
|
-
_ts_metadata("design:type", String)
|
|
48
|
-
], FilesOnlyOfficeConfig.prototype, "externalServer", void 0);
|
|
49
|
-
_ts_decorate([
|
|
50
|
-
(0, _classvalidator.ValidateIf)((o)=>o.enabled),
|
|
51
|
-
(0, _classvalidator.IsString)(),
|
|
52
|
-
(0, _classvalidator.IsNotEmpty)(),
|
|
53
|
-
_ts_metadata("design:type", String)
|
|
54
|
-
], FilesOnlyOfficeConfig.prototype, "secret", void 0);
|
|
55
|
-
_ts_decorate([
|
|
56
|
-
(0, _classvalidator.IsBoolean)(),
|
|
57
|
-
_ts_metadata("design:type", Boolean)
|
|
58
|
-
], FilesOnlyOfficeConfig.prototype, "verifySSL", void 0);
|
|
59
28
|
let FilesConfig = class FilesConfig {
|
|
60
29
|
constructor(){
|
|
61
30
|
this.maxUploadSize = 5368709120; // 5 GB
|
|
62
31
|
this.contentIndexing = true;
|
|
63
32
|
this.showHiddenFiles = false;
|
|
64
|
-
this.onlyoffice = new
|
|
33
|
+
this.onlyoffice = new _onlyofficeconfig.OnlyOfficeConfig();
|
|
34
|
+
this.collabora = new _collaboraonlineconfig.CollaboraOnlineConfig();
|
|
65
35
|
}
|
|
66
36
|
};
|
|
67
37
|
_ts_decorate([
|
|
@@ -99,8 +69,14 @@ _ts_decorate([
|
|
|
99
69
|
_ts_decorate([
|
|
100
70
|
(0, _classvalidator.IsNotEmptyObject)(),
|
|
101
71
|
(0, _classvalidator.ValidateNested)(),
|
|
102
|
-
(0, _classtransformer.Type)(()=>
|
|
103
|
-
_ts_metadata("design:type", typeof
|
|
72
|
+
(0, _classtransformer.Type)(()=>_onlyofficeconfig.OnlyOfficeConfig),
|
|
73
|
+
_ts_metadata("design:type", typeof _onlyofficeconfig.OnlyOfficeConfig === "undefined" ? Object : _onlyofficeconfig.OnlyOfficeConfig)
|
|
104
74
|
], FilesConfig.prototype, "onlyoffice", void 0);
|
|
75
|
+
_ts_decorate([
|
|
76
|
+
(0, _classvalidator.IsNotEmptyObject)(),
|
|
77
|
+
(0, _classvalidator.ValidateNested)(),
|
|
78
|
+
(0, _classtransformer.Type)(()=>_collaboraonlineconfig.CollaboraOnlineConfig),
|
|
79
|
+
_ts_metadata("design:type", typeof _collaboraonlineconfig.CollaboraOnlineConfig === "undefined" ? Object : _collaboraonlineconfig.CollaboraOnlineConfig)
|
|
80
|
+
], FilesConfig.prototype, "collabora", void 0);
|
|
105
81
|
|
|
106
82
|
//# sourceMappingURL=files.config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.config.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 { Type } from 'class-transformer'\nimport { IsBoolean, IsInt, IsNotEmpty, IsNotEmptyObject,
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.config.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 { Type } from 'class-transformer'\nimport { IsBoolean, IsInt, IsNotEmpty, IsNotEmptyObject, IsString, ValidateNested } from 'class-validator'\nimport { CollaboraOnlineConfig } from './modules/collabora-online/collabora-online.config'\nimport { OnlyOfficeConfig } from './modules/only-office/only-office.config'\n\nexport class FilesConfig {\n @IsNotEmpty()\n @IsString()\n dataPath: string\n\n @IsNotEmpty()\n @IsString()\n usersPath: string\n\n @IsNotEmpty()\n @IsString()\n spacesPath: string\n\n @IsNotEmpty()\n @IsString()\n tmpPath: string\n\n @IsInt()\n maxUploadSize: number = 5368709120 // 5 GB\n\n @IsBoolean()\n contentIndexing: boolean = true\n\n @IsBoolean()\n showHiddenFiles: boolean = false\n\n @IsNotEmptyObject()\n @ValidateNested()\n @Type(() => OnlyOfficeConfig)\n onlyoffice: OnlyOfficeConfig = new OnlyOfficeConfig()\n\n @IsNotEmptyObject()\n @ValidateNested()\n @Type(() => CollaboraOnlineConfig)\n collabora: CollaboraOnlineConfig = new CollaboraOnlineConfig()\n}\n"],"names":["FilesConfig","maxUploadSize","contentIndexing","showHiddenFiles","onlyoffice","OnlyOfficeConfig","collabora","CollaboraOnlineConfig"],"mappings":"AAAA;;;;CAIC;;;;+BAOYA;;;eAAAA;;;kCALQ;gCACoE;uCACnD;kCACL;;;;;;;;;;AAE1B,IAAA,AAAMA,cAAN,MAAMA;;aAkBXC,gBAAwB,YAAW,OAAO;aAG1CC,kBAA2B;aAG3BC,kBAA2B;aAK3BC,aAA+B,IAAIC,kCAAgB;aAKnDC,YAAmC,IAAIC,4CAAqB;;AAC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAPcF,kCAAgB;;;;;;oCAKhBE,4CAAqB"}
|
|
@@ -83,8 +83,8 @@ let FilesController = class FilesController {
|
|
|
83
83
|
async lock(user, space) {
|
|
84
84
|
return this.filesMethods.lock(user, space);
|
|
85
85
|
}
|
|
86
|
-
async unlock(user, space,
|
|
87
|
-
return this.filesMethods.unlock(user, space,
|
|
86
|
+
async unlock(user, space, forceAsFileOwner) {
|
|
87
|
+
return this.filesMethods.unlock(user, space, forceAsFileOwner);
|
|
88
88
|
}
|
|
89
89
|
async unlockRequest(user, space) {
|
|
90
90
|
return this.filesMethods.unlockRequest(user, space);
|
|
@@ -98,7 +98,7 @@ let FilesController = class FilesController {
|
|
|
98
98
|
}
|
|
99
99
|
async compressAsTask(req, compressFileDto) {
|
|
100
100
|
if (compressFileDto.compressInDirectory) {
|
|
101
|
-
_spaceguard.SpaceGuard.checkPermissions(req, this.logger);
|
|
101
|
+
await _spaceguard.SpaceGuard.checkPermissions(req, this.logger);
|
|
102
102
|
}
|
|
103
103
|
return this.filesTasksManager.createTask(_operations.FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name);
|
|
104
104
|
}
|
|
@@ -263,7 +263,7 @@ _ts_decorate([
|
|
|
263
263
|
(0, _common.Unlock)(`${_routes.FILES_ROUTE.OPERATION}/*`),
|
|
264
264
|
_ts_param(0, (0, _userdecorator.GetUser)()),
|
|
265
265
|
_ts_param(1, (0, _spacedecorator.GetSpace)()),
|
|
266
|
-
_ts_param(2, (0, _common.Query)(
|
|
266
|
+
_ts_param(2, (0, _common.Query)(_operations.FORCE_AS_FILE_OWNER, new _common.ParseBoolPipe({
|
|
267
267
|
optional: true
|
|
268
268
|
}))),
|
|
269
269
|
_ts_metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Lock,\n Logger,\n Move,\n ParseBoolPipe,\n ParseIntPipe,\n Patch,\n Post,\n Put,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n Unlock,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileLockProps } from './interfaces/file-props.interface'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadCreate(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Put(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadOverwrite(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Patch(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadContent(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n @Lock(`${FILES_ROUTE.OPERATION}/*`)\n async lock(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileLockProps> {\n return this.filesMethods.lock(user, space)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/*`)\n async unlock(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('forceAsOwner', new ParseBoolPipe({ optional: true })) forceAsOwner?: boolean\n ): Promise<void> {\n return this.filesMethods.unlock(user, space, forceAsOwner)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UNLOCK_REQUEST}/*`)\n @UseInterceptors(ContextInterceptor)\n async unlockRequest(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.unlockRequest(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.GET_SIZE}/*`)\n async getSize(@GetSpace() space: SpaceEnv): Promise<{ size: number }> {\n return this.filesMethods.getSize(space)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","uploadCreate","upload","uploadOverwrite","uploadContent","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","lock","unlock","forceAsOwner","unlockRequest","getSize","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","ParseBoolPipe","UNLOCK_REQUEST","GET_SIZE","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Lock,\n Logger,\n Move,\n ParseBoolPipe,\n ParseIntPipe,\n Patch,\n Post,\n Put,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n Unlock,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION, FORCE_AS_FILE_OWNER } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileLockProps } from './interfaces/file-props.interface'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadCreate(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Put(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadOverwrite(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Patch(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadContent(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n @Lock(`${FILES_ROUTE.OPERATION}/*`)\n async lock(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileLockProps> {\n return this.filesMethods.lock(user, space)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/*`)\n async unlock(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query(FORCE_AS_FILE_OWNER, new ParseBoolPipe({ optional: true })) forceAsFileOwner?: boolean\n ): Promise<void> {\n return this.filesMethods.unlock(user, space, forceAsFileOwner)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UNLOCK_REQUEST}/*`)\n @UseInterceptors(ContextInterceptor)\n async unlockRequest(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.unlockRequest(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.GET_SIZE}/*`)\n async getSize(@GetSpace() space: SpaceEnv): Promise<{ size: number }> {\n return this.filesMethods.getSize(space)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Can be used to create or download an archive of files; permissions are checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n await SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","uploadCreate","upload","uploadOverwrite","uploadContent","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","lock","unlock","forceAsFileOwner","unlockRequest","getSize","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","ParseBoolPipe","UNLOCK_REQUEST","GET_SIZE","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
|
|
@@ -13,18 +13,17 @@ Object.defineProperty(exports, "FilesModule", {
|
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
|
+
const _configenvironment = require("../../configuration/config.environment");
|
|
16
17
|
const _filesindexermysqlservice = require("./adapters/files-indexer-mysql.service");
|
|
17
|
-
const _filesonlyofficecontroller = require("./files-only-office.controller");
|
|
18
18
|
const _filestaskscontroller = require("./files-tasks.controller");
|
|
19
19
|
const _filescontroller = require("./files.controller");
|
|
20
|
-
const _filesonlyofficeguard = require("./guards/files-only-office.guard");
|
|
21
|
-
const _filesonlyofficestrategy = require("./guards/files-only-office.strategy");
|
|
22
20
|
const _filesindexer = require("./models/files-indexer");
|
|
21
|
+
const _collaboraonlinemodule = require("./modules/collabora-online/collabora-online.module");
|
|
22
|
+
const _onlyofficemodule = require("./modules/only-office/only-office.module");
|
|
23
23
|
const _filescontentmanagerservice = require("./services/files-content-manager.service");
|
|
24
24
|
const _fileslockmanagerservice = require("./services/files-lock-manager.service");
|
|
25
25
|
const _filesmanagerservice = require("./services/files-manager.service");
|
|
26
26
|
const _filesmethodsservice = require("./services/files-methods.service");
|
|
27
|
-
const _filesonlyofficemanagerservice = require("./services/files-only-office-manager.service");
|
|
28
27
|
const _filesparserservice = require("./services/files-parser.service");
|
|
29
28
|
const _filesqueriesservice = require("./services/files-queries.service");
|
|
30
29
|
const _filesrecentsservice = require("./services/files-recents.service");
|
|
@@ -41,10 +40,17 @@ let FilesModule = class FilesModule {
|
|
|
41
40
|
};
|
|
42
41
|
FilesModule = _ts_decorate([
|
|
43
42
|
(0, _common.Module)({
|
|
43
|
+
imports: [
|
|
44
|
+
..._configenvironment.configuration.applications.files.onlyoffice.enabled ? [
|
|
45
|
+
_onlyofficemodule.OnlyOfficeModule
|
|
46
|
+
] : [],
|
|
47
|
+
..._configenvironment.configuration.applications.files.collabora.enabled ? [
|
|
48
|
+
_collaboraonlinemodule.CollaboraOnlineModule
|
|
49
|
+
] : []
|
|
50
|
+
],
|
|
44
51
|
controllers: [
|
|
45
52
|
_filescontroller.FilesController,
|
|
46
|
-
_filestaskscontroller.FilesTasksController
|
|
47
|
-
_filesonlyofficecontroller.FilesOnlyOfficeController
|
|
53
|
+
_filestaskscontroller.FilesTasksController
|
|
48
54
|
],
|
|
49
55
|
providers: [
|
|
50
56
|
_filesmethodsservice.FilesMethods,
|
|
@@ -54,9 +60,6 @@ FilesModule = _ts_decorate([
|
|
|
54
60
|
_filestasksmanagerservice.FilesTasksManager,
|
|
55
61
|
_filesschedulerservice.FilesScheduler,
|
|
56
62
|
_filesrecentsservice.FilesRecents,
|
|
57
|
-
_filesonlyofficemanagerservice.FilesOnlyOfficeManager,
|
|
58
|
-
_filesonlyofficeguard.FilesOnlyOfficeGuard,
|
|
59
|
-
_filesonlyofficestrategy.FilesOnlyOfficeStrategy,
|
|
60
63
|
_filesparserservice.FilesParser,
|
|
61
64
|
_filescontentmanagerservice.FilesContentManager,
|
|
62
65
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.module.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 { Module } from '@nestjs/common'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.module.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 { Module } from '@nestjs/common'\nimport { configuration } from '../../configuration/config.environment'\nimport { FilesIndexerMySQL } from './adapters/files-indexer-mysql.service'\nimport { FilesTasksController } from './files-tasks.controller'\nimport { FilesController } from './files.controller'\nimport { FilesIndexer } from './models/files-indexer'\nimport { CollaboraOnlineModule } from './modules/collabora-online/collabora-online.module'\nimport { OnlyOfficeModule } from './modules/only-office/only-office.module'\nimport { FilesContentManager } from './services/files-content-manager.service'\nimport { FilesLockManager } from './services/files-lock-manager.service'\nimport { FilesManager } from './services/files-manager.service'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesParser } from './services/files-parser.service'\nimport { FilesQueries } from './services/files-queries.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesScheduler } from './services/files-scheduler.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Module({\n imports: [\n ...(configuration.applications.files.onlyoffice.enabled ? [OnlyOfficeModule] : []),\n ...(configuration.applications.files.collabora.enabled ? [CollaboraOnlineModule] : [])\n ],\n controllers: [FilesController, FilesTasksController],\n providers: [\n FilesMethods,\n FilesManager,\n FilesQueries,\n FilesLockManager,\n FilesTasksManager,\n FilesScheduler,\n FilesRecents,\n FilesParser,\n FilesContentManager,\n { provide: FilesIndexer, useClass: FilesIndexerMySQL },\n FilesSearchManager\n ],\n exports: [FilesManager, FilesQueries, FilesLockManager, FilesMethods, FilesRecents]\n})\nexport class FilesModule {}\n"],"names":["FilesModule","imports","configuration","applications","files","onlyoffice","enabled","OnlyOfficeModule","collabora","CollaboraOnlineModule","controllers","FilesController","FilesTasksController","providers","FilesMethods","FilesManager","FilesQueries","FilesLockManager","FilesTasksManager","FilesScheduler","FilesRecents","FilesParser","FilesContentManager","provide","FilesIndexer","useClass","FilesIndexerMySQL","FilesSearchManager","exports"],"mappings":"AAAA;;;;CAIC;;;;+BA0CYA;;;eAAAA;;;wBAxCU;mCACO;0CACI;sCACG;iCACL;8BACH;uCACS;kCACL;4CACG;yCACH;qCACJ;qCACA;oCACD;qCACC;qCACA;uCACE;2CACI;0CACD;;;;;;;AAuB3B,IAAA,AAAMA,cAAN,MAAMA;AAAa;;;QApBxBC,SAAS;eACHC,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;gBAACC,kCAAgB;aAAC,GAAG,EAAE;eAC7EL,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACI,SAAS,CAACF,OAAO,GAAG;gBAACG,4CAAqB;aAAC,GAAG,EAAE;SACtF;QACDC,aAAa;YAACC,gCAAe;YAAEC,0CAAoB;SAAC;QACpDC,WAAW;YACTC,iCAAY;YACZC,iCAAY;YACZC,iCAAY;YACZC,yCAAgB;YAChBC,2CAAiB;YACjBC,qCAAc;YACdC,iCAAY;YACZC,+BAAW;YACXC,+CAAmB;YACnB;gBAAEC,SAASC,0BAAY;gBAAEC,UAAUC,2CAAiB;YAAC;YACrDC,6CAAkB;SACnB;QACDC,SAAS;YAACb,iCAAY;YAAEC,iCAAY;YAAEC,yCAAgB;YAAEH,iCAAY;YAAEM,iCAAY;SAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-lock.interface.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 { Owner } from '../../users/interfaces/owner.interface'\nimport { LOCK_DEPTH } from '../../webdav/constants/webdav'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-lock.interface.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 { SERVER_NAME } from '../../../common/shared'\nimport { Owner } from '../../users/interfaces/owner.interface'\nimport { LOCK_DEPTH, LOCK_SCOPE, WEBDAV_APP_LOCK } from '../../webdav/constants/webdav'\nimport { COLLABORA_APP_LOCK } from '../modules/collabora-online/collabora-online.constants'\nimport { ONLY_OFFICE_APP_LOCK } from '../modules/only-office/only-office.constants'\n\nexport type LOCK_APP = typeof WEBDAV_APP_LOCK | typeof COLLABORA_APP_LOCK | typeof ONLY_OFFICE_APP_LOCK | typeof SERVER_NAME\n\n// Optional lock parameters\nexport interface FileLockOptions {\n // Only locktype write is currently implemented in RFC\n lockRoot: string // Used with webdav (uri)\n lockToken: string\n lockScope: LOCK_SCOPE\n lockInfo?: string // Provided by some WebDAV clients to identify the locking application.\n}\n\nexport interface FileLock {\n owner: Owner\n dbFilePath: string\n key: string\n depth: LOCK_DEPTH\n expiration: number\n app: LOCK_APP // Known application (internal)\n options?: FileLockOptions\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileLockProps {\n owner:
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileLockProps {\n owner: Owner\n app: string\n info?: string\n isExclusive: boolean\n}\n\nexport interface FileProps extends Omit<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash'> {\n id: number\n name: string\n path: string\n isDir: boolean\n size: number\n ctime: number\n mtime: number\n mime: string\n inTrash?: boolean\n // used with shares\n origin?: {\n ownerId: number\n ownerLogin: string\n spaceId: number\n spaceAlias: string\n spaceExternalRootId: number\n spaceRootExternalPath: string\n shareExternalId: number\n }\n // root can be a share or a space root\n // enabled, and description are only used for shares\n root?: Pick<SpaceRoot, 'id' | 'alias' | 'permissions'> &\n Partial<Pick<SpaceRoot, 'name' | 'externalPath'>> &\n Partial<Pick<Share, 'enabled' | 'description'>> & {\n owner: Owner\n }\n lock?: FileLockProps\n // used by the file browser to enrich files\n spaces?: Pick<Space, 'id' | 'alias' | 'name'>[]\n shares?: Pick<Share, 'id' | 'alias' | 'name' | 'type'>[]\n syncs?: Pick<SyncPath, 'clientId' | 'id'> & { clientName: string }[]\n hasComments?: boolean\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
|
package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
function _export(target, all) {
|
|
10
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
_export(exports, {
|
|
16
|
+
get CollaboraOnlineContext () {
|
|
17
|
+
return CollaboraOnlineContext;
|
|
18
|
+
},
|
|
19
|
+
get CollaboraOnlineEnvironment () {
|
|
20
|
+
return CollaboraOnlineEnvironment;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const _common = require("@nestjs/common");
|
|
24
|
+
const _spaceguard = require("../../../spaces/guards/space.guard");
|
|
25
|
+
const _collaboraonlineconstants = require("./collabora-online.constants");
|
|
26
|
+
const _collaboraonlineguard = require("./collabora-online.guard");
|
|
27
|
+
const CollaboraOnlineContext = ()=>(0, _common.SetMetadata)(_collaboraonlineconstants.COLLABORA_CONTEXT, true);
|
|
28
|
+
const CollaboraOnlineEnvironment = ()=>{
|
|
29
|
+
return (0, _common.applyDecorators)(CollaboraOnlineContext(), (0, _common.UseGuards)(_collaboraonlineguard.CollaboraOnlineGuard, _spaceguard.SpaceGuard));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=collabora-online-environment.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../backend/src/applications/files/modules/collabora-online/collabora-online-environment.decorator.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 { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common'\nimport { SpaceGuard } from '../../../spaces/guards/space.guard'\nimport { COLLABORA_CONTEXT } from './collabora-online.constants'\nimport { CollaboraOnlineGuard } from './collabora-online.guard'\n\nexport const CollaboraOnlineContext = () => SetMetadata(COLLABORA_CONTEXT, true)\nexport const CollaboraOnlineEnvironment = () => {\n return applyDecorators(CollaboraOnlineContext(), UseGuards(CollaboraOnlineGuard, SpaceGuard))\n}\n"],"names":["CollaboraOnlineContext","CollaboraOnlineEnvironment","SetMetadata","COLLABORA_CONTEXT","applyDecorators","UseGuards","CollaboraOnlineGuard","SpaceGuard"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAOYA;eAAAA;;QACAC;eAAAA;;;wBAN2C;4BAC7B;0CACO;sCACG;AAE9B,MAAMD,yBAAyB,IAAME,IAAAA,mBAAW,EAACC,2CAAiB,EAAE;AACpE,MAAMF,6BAA6B;IACxC,OAAOG,IAAAA,uBAAe,EAACJ,0BAA0BK,IAAAA,iBAAS,EAACC,0CAAoB,EAAEC,sBAAU;AAC7F"}
|
package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
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
|
+
Object.defineProperty(exports, "CollaboraOnlineManager", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
12
|
+
return CollaboraOnlineManager;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const _common = require("@nestjs/common");
|
|
16
|
+
const _jwt = require("@nestjs/jwt");
|
|
17
|
+
const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
|
|
18
|
+
const _nodeos = /*#__PURE__*/ _interop_require_default(require("node:os"));
|
|
19
|
+
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
20
|
+
const _functions = require("../../../../common/functions");
|
|
21
|
+
const _configenvironment = require("../../../../configuration/config.environment");
|
|
22
|
+
const _contextmanagerservice = require("../../../../infrastructure/context/services/context-manager.service");
|
|
23
|
+
const _spaces = require("../../../spaces/constants/spaces");
|
|
24
|
+
const _permissions = require("../../../spaces/utils/permissions");
|
|
25
|
+
const _avatar = require("../../../users/utils/avatar");
|
|
26
|
+
const _webdav = require("../../../webdav/constants/webdav");
|
|
27
|
+
const _operations = require("../../constants/operations");
|
|
28
|
+
const _filelockerror = require("../../models/file-lock-error");
|
|
29
|
+
const _fileslockmanagerservice = require("../../services/files-lock-manager.service");
|
|
30
|
+
const _files = require("../../utils/files");
|
|
31
|
+
const _collaboraonlineconstants = require("./collabora-online.constants");
|
|
32
|
+
const _collaboraonlineroutes = require("./collabora-online.routes");
|
|
33
|
+
function _interop_require_default(obj) {
|
|
34
|
+
return obj && obj.__esModule ? obj : {
|
|
35
|
+
default: obj
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
39
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
40
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
41
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
42
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
43
|
+
}
|
|
44
|
+
function _ts_metadata(k, v) {
|
|
45
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
46
|
+
}
|
|
47
|
+
let CollaboraOnlineManager = class CollaboraOnlineManager {
|
|
48
|
+
async getSettings(user, space) {
|
|
49
|
+
await this.checkSpace(space);
|
|
50
|
+
const fileExtension = _nodepath.default.extname(space.realPath).slice(1);
|
|
51
|
+
if (!_collaboraonlineconstants.COLLABORA_ONLINE_EXTENSIONS.has(fileExtension)) {
|
|
52
|
+
throw new _common.HttpException('Document not supported', _common.HttpStatus.BAD_REQUEST);
|
|
53
|
+
}
|
|
54
|
+
let hasLock = false;
|
|
55
|
+
let mode = (0, _permissions.haveSpaceEnvPermissions)(space, _spaces.SPACE_OPERATION.MODIFY) ? _operations.FILE_MODE.EDIT : _operations.FILE_MODE.VIEW;
|
|
56
|
+
if (mode === _operations.FILE_MODE.EDIT) {
|
|
57
|
+
// Check lock conflicts
|
|
58
|
+
try {
|
|
59
|
+
await this.filesLockManager.checkConflicts(space.dbFile, _webdav.DEPTH.RESOURCE, {
|
|
60
|
+
userId: user.id,
|
|
61
|
+
app: _collaboraonlineconstants.COLLABORA_APP_LOCK,
|
|
62
|
+
lockScope: _webdav.LOCK_SCOPE.SHARED
|
|
63
|
+
});
|
|
64
|
+
} catch (e) {
|
|
65
|
+
if (e instanceof _filelockerror.LockConflict) {
|
|
66
|
+
hasLock = this.filesLockManager.convertLockToFileLockProps(e.lock);
|
|
67
|
+
mode = _operations.FILE_MODE.VIEW;
|
|
68
|
+
} else {
|
|
69
|
+
this.logger.error(`${this.getSettings.name} - ${e}`);
|
|
70
|
+
throw new _common.HttpException('Unable to check file lock', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const dbFileHash = (0, _files.genUniqHashFromFileDBProps)(space.dbFile);
|
|
75
|
+
const authToken = await this.genAuthToken(user, space, dbFileHash);
|
|
76
|
+
return {
|
|
77
|
+
documentServerUrl: this.getDocumentUrl(dbFileHash, authToken),
|
|
78
|
+
mode: mode,
|
|
79
|
+
hasLock: hasLock
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async checkFileInfo(req) {
|
|
83
|
+
const fStats = await _promises.default.stat(req.space.realPath);
|
|
84
|
+
return {
|
|
85
|
+
BaseFileName: (0, _files.fileName)(req.space.realPath),
|
|
86
|
+
Version: (0, _files.genEtag)(null, req.space.realPath, false),
|
|
87
|
+
OwnerId: `${req.space.dbFile.ownerId || req.user.id}`,
|
|
88
|
+
Size: fStats.size,
|
|
89
|
+
LastModifiedTime: fStats.mtime.toISOString(),
|
|
90
|
+
UserId: `${req.user.id}`,
|
|
91
|
+
UserFriendlyName: `${req.user.fullName} (${req.user.email})`,
|
|
92
|
+
ReadOnly: false,
|
|
93
|
+
UserExtraInfo: {
|
|
94
|
+
avatar: await (0, _avatar.getAvatarBase64)(req.user.login)
|
|
95
|
+
},
|
|
96
|
+
UserCanNotWriteRelative: true,
|
|
97
|
+
UserCanWrite: (0, _permissions.haveSpaceEnvPermissions)(req.space, _spaces.SPACE_OPERATION.MODIFY),
|
|
98
|
+
UserCanRename: false,
|
|
99
|
+
SupportsUpdate: true,
|
|
100
|
+
SupportsRename: false,
|
|
101
|
+
SupportsExport: true,
|
|
102
|
+
SupportsCoauth: true,
|
|
103
|
+
SupportsLocks: true,
|
|
104
|
+
SupportsGetLock: true
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async saveDocument(req) {
|
|
108
|
+
await this.checkSpace(req.space);
|
|
109
|
+
await this.checkTimeStampFromHeaders(req);
|
|
110
|
+
const tmpFilePath = await (0, _files.uniqueFilePathFromDir)(_nodepath.default.join(_nodeos.default.tmpdir(), (0, _files.fileName)(req.space.realPath)));
|
|
111
|
+
try {
|
|
112
|
+
await (0, _files.writeFromStream)(tmpFilePath, req.raw);
|
|
113
|
+
} catch (e) {
|
|
114
|
+
throw new Error(`unable to save document : ${e.message}`);
|
|
115
|
+
}
|
|
116
|
+
// try to verify the downloaded size
|
|
117
|
+
const contentLength = parseInt(req.headers['content-length'], 10);
|
|
118
|
+
if (!isNaN(contentLength) && contentLength !== 0) {
|
|
119
|
+
const tmpFileSize = await (0, _files.fileSize)(tmpFilePath);
|
|
120
|
+
if (tmpFileSize !== contentLength) {
|
|
121
|
+
this.logger.error(`${this.saveDocument.name} - document size differs (${tmpFileSize} != ${contentLength})`);
|
|
122
|
+
throw new _common.HttpException('Size Mismatch', _common.HttpStatus.BAD_REQUEST);
|
|
123
|
+
}
|
|
124
|
+
} else if (contentLength === 0) {
|
|
125
|
+
this.logger.warn(`${this.saveDocument.name} - content length is 0 : ${req.space.url}`);
|
|
126
|
+
}
|
|
127
|
+
// copy contents to avoid inode changes (dbFileHash in some cases)
|
|
128
|
+
try {
|
|
129
|
+
// todo: versioning
|
|
130
|
+
await (0, _files.copyFileContent)(tmpFilePath, req.space.realPath);
|
|
131
|
+
await (0, _files.removeFiles)(tmpFilePath);
|
|
132
|
+
const fStats = await _promises.default.stat(req.space.realPath);
|
|
133
|
+
return {
|
|
134
|
+
LastModifiedTime: fStats.mtime.toISOString()
|
|
135
|
+
};
|
|
136
|
+
} catch (e) {
|
|
137
|
+
this.logger.error(`${this.saveDocument.name} - unable to save document: ${e}`);
|
|
138
|
+
throw new _common.HttpException('Unable to save document', _common.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async manageLock(req, res) {
|
|
142
|
+
const lockAction = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.Action];
|
|
143
|
+
switch(lockAction){
|
|
144
|
+
case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.LOCK:
|
|
145
|
+
{
|
|
146
|
+
const reqLockToken = this.lockTokenFromHeaders(req);
|
|
147
|
+
const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
|
|
148
|
+
if (currentLock) {
|
|
149
|
+
await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const [ok, fileLock] = await this.filesLockManager.create(req.user, req.space.dbFile, _collaboraonlineconstants.COLLABORA_APP_LOCK, _webdav.DEPTH.RESOURCE, {
|
|
153
|
+
lockRoot: null,
|
|
154
|
+
lockToken: reqLockToken,
|
|
155
|
+
lockScope: _webdav.LOCK_SCOPE.SHARED // Collabora uses one lock for the session
|
|
156
|
+
}, this.expiration);
|
|
157
|
+
if (!ok) {
|
|
158
|
+
this.lockConflict(res, fileLock.options.lockToken);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.UNLOCK:
|
|
164
|
+
{
|
|
165
|
+
const reqLockToken = this.lockTokenFromHeaders(req);
|
|
166
|
+
const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
|
|
167
|
+
if (currentLock) {
|
|
168
|
+
await this.filesLockManager.removeLock(currentLock.key);
|
|
169
|
+
} else {
|
|
170
|
+
throw new _common.HttpException('Lock not found', _common.HttpStatus.CONFLICT);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.GET_LOCK:
|
|
175
|
+
{
|
|
176
|
+
const lock = await this.filesLockManager.getLocksByPath(req.space.dbFile);
|
|
177
|
+
if (lock.length) {
|
|
178
|
+
res.header(_collaboraonlineconstants.COLLABORA_HEADERS.LockToken, lock[0].options.lockToken);
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case _collaboraonlineconstants.COLLABORA_LOCK_ACTION.REFRESH_LOCK:
|
|
183
|
+
{
|
|
184
|
+
const reqLockToken = this.lockTokenFromHeaders(req);
|
|
185
|
+
const currentLock = await this.filesLockManager.isLockedWithToken(reqLockToken, req.space.dbFile.path);
|
|
186
|
+
if (currentLock) {
|
|
187
|
+
await this.filesLockManager.refreshLockTimeout(currentLock, this.expiration);
|
|
188
|
+
} else {
|
|
189
|
+
throw new _common.HttpException('Lock not found', _common.HttpStatus.CONFLICT);
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
default:
|
|
194
|
+
this.logger.warn(`${this.manageLock.name} - Unknown lock action: ${lockAction}`);
|
|
195
|
+
throw new _common.HttpException('Unknown lock action', _common.HttpStatus.BAD_REQUEST);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
getDocumentUrl(dbFileHash, token) {
|
|
199
|
+
const collaboraBase = this.externalCollaboraOnlineServer || this.contextManager.headerOriginUrl();
|
|
200
|
+
// Example:
|
|
201
|
+
// - external: https://collabora.domain.com
|
|
202
|
+
// - internal (via nginx proxy): https://domain.com/*
|
|
203
|
+
const editorUrl = new URL(_collaboraonlineconstants.COLLABORA_URI, collaboraBase);
|
|
204
|
+
// → /browser/dist/cool.html
|
|
205
|
+
const wopiSrcUrl = new URL(`${_collaboraonlineroutes.API_COLLABORA_ONLINE_FILES}/${dbFileHash}`, this.contextManager.headerOriginUrl());
|
|
206
|
+
// → https://domain.com/wopi/files/888
|
|
207
|
+
editorUrl.searchParams.set(_collaboraonlineconstants.COLLABORA_WOPI_SRC_QUERY_PARAM_NAME, wopiSrcUrl.toString());
|
|
208
|
+
editorUrl.searchParams.set(_collaboraonlineconstants.COLLABORA_TOKEN_QUERY_PARAM_NAME, token);
|
|
209
|
+
return editorUrl.toString();
|
|
210
|
+
}
|
|
211
|
+
genAuthToken(user, space, dbFileHash) {
|
|
212
|
+
// use refresh expiration to allow long sessions
|
|
213
|
+
return this.jwt.signAsync({
|
|
214
|
+
identity: {
|
|
215
|
+
id: user.id,
|
|
216
|
+
login: user.login,
|
|
217
|
+
email: user.email,
|
|
218
|
+
fullName: user.fullName,
|
|
219
|
+
language: user.language,
|
|
220
|
+
role: user.role,
|
|
221
|
+
applications: user.applications,
|
|
222
|
+
spaceUrl: space.url,
|
|
223
|
+
dbFileHash: dbFileHash
|
|
224
|
+
}
|
|
225
|
+
}, {
|
|
226
|
+
secret: _configenvironment.configuration.auth.token.access.secret,
|
|
227
|
+
expiresIn: this.expiration
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
lockTokenFromHeaders(req) {
|
|
231
|
+
const lockToken = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.LockToken];
|
|
232
|
+
if (!lockToken) {
|
|
233
|
+
throw new _common.HttpException('Lock token is required', _common.HttpStatus.CONFLICT);
|
|
234
|
+
}
|
|
235
|
+
return lockToken;
|
|
236
|
+
}
|
|
237
|
+
lockConflict(res, currentLockToken) {
|
|
238
|
+
res.header(_collaboraonlineconstants.COLLABORA_HEADERS.LockToken, currentLockToken);
|
|
239
|
+
throw new _common.HttpException('The file is locked', _common.HttpStatus.CONFLICT);
|
|
240
|
+
}
|
|
241
|
+
async checkTimeStampFromHeaders(req) {
|
|
242
|
+
const timestamp = req.headers[_collaboraonlineconstants.COLLABORA_HEADERS.Timestamp];
|
|
243
|
+
if (!timestamp) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const fStats = await _promises.default.stat(req.space.realPath);
|
|
247
|
+
if (fStats.mtime.toISOString() !== timestamp) {
|
|
248
|
+
throw new _common.HttpException({
|
|
249
|
+
LOOLStatusCode: 1010
|
|
250
|
+
}, _common.HttpStatus.CONFLICT);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async checkSpace(space) {
|
|
254
|
+
if (!await (0, _files.isPathExists)(space.realPath)) {
|
|
255
|
+
throw new _common.HttpException('Document not found', _common.HttpStatus.NOT_FOUND);
|
|
256
|
+
}
|
|
257
|
+
if (await (0, _files.isPathIsDir)(space.realPath)) {
|
|
258
|
+
throw new _common.HttpException('Document must be a file', _common.HttpStatus.BAD_REQUEST);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
constructor(contextManager, jwt, filesLockManager){
|
|
262
|
+
this.contextManager = contextManager;
|
|
263
|
+
this.jwt = jwt;
|
|
264
|
+
this.filesLockManager = filesLockManager;
|
|
265
|
+
this.logger = new _common.Logger(CollaboraOnlineManager.name);
|
|
266
|
+
this.externalCollaboraOnlineServer = _configenvironment.configuration.applications.files.collabora.externalServer || null;
|
|
267
|
+
this.expiration = (0, _functions.convertHumanTimeToSeconds)(_configenvironment.configuration.auth.token.refresh.expiration);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
CollaboraOnlineManager = _ts_decorate([
|
|
271
|
+
(0, _common.Injectable)(),
|
|
272
|
+
_ts_metadata("design:type", Function),
|
|
273
|
+
_ts_metadata("design:paramtypes", [
|
|
274
|
+
typeof _contextmanagerservice.ContextManager === "undefined" ? Object : _contextmanagerservice.ContextManager,
|
|
275
|
+
typeof _jwt.JwtService === "undefined" ? Object : _jwt.JwtService,
|
|
276
|
+
typeof _fileslockmanagerservice.FilesLockManager === "undefined" ? Object : _fileslockmanagerservice.FilesLockManager
|
|
277
|
+
])
|
|
278
|
+
], CollaboraOnlineManager);
|
|
279
|
+
|
|
280
|
+
//# sourceMappingURL=collabora-online-manager.service.js.map
|