@sync-in/server 1.9.6 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -4
- package/environment/environment.dist.yaml +15 -5
- package/package.json +13 -14
- package/server/app.bootstrap.js +1 -1
- 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/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/webdav/constants/webdav.js +4 -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/webdav.js +8 -4
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +4 -4
- package/server/applications/webdav/webdav.controller.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/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-BVKDW5XO.js → chunk-27Z3SYRL.js} +1 -1
- package/static/{chunk-HLKZCMKV.js → chunk-2RWLNKZH.js} +1 -1
- package/static/chunk-2YQ4SX3A.js +13 -0
- package/static/{chunk-GENTF6JM.js → chunk-3JYMJQYT.js} +1 -1
- package/static/chunk-3QTROEHV.js +1 -0
- package/static/{chunk-C5T7RZSD.js → chunk-3RPUQ22U.js} +1 -1
- package/static/{chunk-EPDWJEPD.js → chunk-3WZ6F3LC.js} +1 -1
- package/static/chunk-3ZLBVUCX.js +2 -0
- package/static/{chunk-SF6Q6VRC.js → chunk-45AZ6ZML.js} +1 -1
- package/static/chunk-46TJLPJY.js +1 -0
- package/static/chunk-4NIYCYRS.js +2 -0
- package/static/{chunk-GLPKRULI.js → chunk-4TPFERL6.js} +1 -1
- package/static/{chunk-KAAFVHYE.js → chunk-5O66CLTD.js} +1 -1
- package/static/chunk-6OEOADR6.js +1 -0
- package/static/chunk-6WMXMIE4.js +1 -0
- package/static/{chunk-QKMN3S4M.js → chunk-7VRYTDX4.js} +1 -1
- package/static/{chunk-Z2KBIZ5D.js → chunk-ARS47O5X.js} +1 -1
- package/static/chunk-B6HQYQYG.js +1 -0
- package/static/chunk-BCN4T5DO.js +2 -0
- package/static/{chunk-7HL5Z6PF.js → chunk-CCZWPM7Q.js} +1 -1
- package/static/{chunk-DU4Q4RWJ.js → chunk-CMNMPG6Z.js} +1 -1
- package/static/{chunk-BX3QZ7IL.js → chunk-CSVPAZHK.js} +1 -1
- package/static/{chunk-BJARRIS6.js → chunk-D55YR5X7.js} +4 -4
- package/static/{chunk-NHMYAVJK.js → chunk-D5FQ72R4.js} +1 -1
- package/static/{chunk-7QYALK5T.js → chunk-DGCVA6BM.js} +1 -1
- package/static/{chunk-IBC7CFBQ.js → chunk-DVCN3P7Q.js} +1 -1
- package/static/chunk-E32J777S.js +5 -0
- package/static/{chunk-FEQUP26G.js → chunk-FIUF2JM4.js} +1 -1
- package/static/{chunk-ODAQRAPO.js → chunk-G3PL6YX3.js} +1 -1
- package/static/chunk-G7RZN7HN.js +1 -0
- package/static/{chunk-IIKL33TV.js → chunk-GQHXYX6Z.js} +1 -1
- package/static/{chunk-5HYSNQR4.js → chunk-GWRAGN3M.js} +1 -1
- package/static/{chunk-ANH4VNOS.js → chunk-GXWGB7WO.js} +1 -1
- package/static/{chunk-25PWAXTJ.js → chunk-HGODIZTV.js} +1 -1
- package/static/{chunk-X5UDV4ZB.js → chunk-HZAB6F4Q.js} +1 -1
- package/static/chunk-I3FR3A45.js +1 -0
- package/static/{chunk-JYHTSSKW.js → chunk-I5SPA4G2.js} +1 -1
- package/static/{chunk-DQAQUSVW.js → chunk-IMFO2MI7.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-KPOQLDWF.js +1 -0
- package/static/{chunk-UO7ATVQG.js → chunk-KWFELZTM.js} +1 -1
- package/static/{chunk-2CAAJBRO.js → chunk-L3BIP4AA.js} +1 -1
- package/static/{chunk-DK2LAJEL.js → chunk-LGIVVJDD.js} +1 -1
- package/static/{chunk-5ATJIR5S.js → chunk-LNLBIJZD.js} +1 -1
- package/static/chunk-LTJNLOX2.js +1 -0
- package/static/{chunk-GRV44RYI.js → chunk-LZUHREOF.js} +1 -1
- package/static/{chunk-XIQXRSZ2.js → chunk-NIR4YE2E.js} +1 -1
- package/static/{chunk-TOCCCZP2.js → chunk-NJJURHX4.js} +1 -1
- package/static/chunk-NNZWSNAW.js +1 -0
- package/static/chunk-NWKBB7J4.js +1 -0
- package/static/chunk-O3YLAEVE.js +3 -0
- package/static/chunk-OUHCDDT6.js +1 -0
- package/static/{chunk-B4TDS6AQ.js → chunk-PDG7DOEF.js} +1 -1
- package/static/chunk-POUWUMC4.js +1 -0
- package/static/{chunk-NQCKX2AD.js → chunk-PPJCVBJH.js} +1 -1
- package/static/{chunk-ZCOEP4O2.js → chunk-PQZLR4P3.js} +1 -1
- package/static/chunk-PVYVY3GD.js +1 -0
- package/static/chunk-Q5X5TPAG.js +1 -0
- package/static/{chunk-LFAQLJZK.js → chunk-QHJT5H4M.js} +1 -1
- package/static/{chunk-D6QWQHWE.js → chunk-R4VMWCM5.js} +1 -1
- package/static/{chunk-O233BXWK.js → chunk-R7PLNX75.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-GYYJ4FWN.js → chunk-S3TTWPQA.js} +1 -1
- package/static/{chunk-4GBA6EJ4.js → chunk-SDJNZULP.js} +1 -1
- package/static/chunk-SNOOCDJD.js +1 -0
- package/static/chunk-T42BV6TR.js +1 -0
- package/static/{chunk-5KVI243T.js → chunk-TNCKNU6I.js} +1 -1
- package/static/{chunk-OVUMPMVM.js → chunk-ULSPQ3HP.js} +1 -1
- package/static/{chunk-5NFH4E2B.js → chunk-UOK3LKSX.js} +1 -1
- package/static/{chunk-CHMDM2ZW.js → chunk-VD5JHSDS.js} +1 -1
- package/static/{chunk-2F42MZQ5.js → chunk-XBKCQCBI.js} +1 -1
- package/static/{chunk-2U5VKTML.js → chunk-XEWLBWFF.js} +1 -1
- package/static/{chunk-FSGT46LM.js → chunk-XTVNHFKX.js} +1 -1
- package/static/chunk-ZCSHU3D7.js +1 -0
- package/static/{chunk-QUUQOBTF.js → chunk-ZEJLIGAY.js} +1 -1
- package/static/{chunk-7H5O4BLV.js → chunk-ZHOE5VEY.js} +1 -1
- package/static/chunk-ZOMRIN3G.js +2 -0
- package/static/index.html +2 -2
- package/static/main-YKDNJ7LK.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
|
@@ -0,0 +1,477 @@
|
|
|
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 _axios = require("@nestjs/axios");
|
|
10
|
+
const _common = require("@nestjs/common");
|
|
11
|
+
const _jwt = require("@nestjs/jwt");
|
|
12
|
+
const _testing = require("@nestjs/testing");
|
|
13
|
+
const _stream = require("stream");
|
|
14
|
+
const _cacheservice = require("../../../../infrastructure/cache/services/cache.service");
|
|
15
|
+
const _contextmanagerservice = require("../../../../infrastructure/context/services/context-manager.service");
|
|
16
|
+
const _webdav = require("../../../webdav/constants/webdav");
|
|
17
|
+
const _operations = require("../../constants/operations");
|
|
18
|
+
const _filelockerror = require("../../models/file-lock-error");
|
|
19
|
+
const _fileslockmanagerservice = require("../../services/files-lock-manager.service");
|
|
20
|
+
const _files = /*#__PURE__*/ _interop_require_wildcard(require("../../utils/files"));
|
|
21
|
+
const _onlyofficemanagerservice = require("./only-office-manager.service");
|
|
22
|
+
const _onlyofficeconstants = require("./only-office.constants");
|
|
23
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
24
|
+
if (typeof WeakMap !== "function") return null;
|
|
25
|
+
var cacheBabelInterop = new WeakMap();
|
|
26
|
+
var cacheNodeInterop = new WeakMap();
|
|
27
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
28
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
29
|
+
})(nodeInterop);
|
|
30
|
+
}
|
|
31
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
32
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
33
|
+
return obj;
|
|
34
|
+
}
|
|
35
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
36
|
+
return {
|
|
37
|
+
default: obj
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
41
|
+
if (cache && cache.has(obj)) {
|
|
42
|
+
return cache.get(obj);
|
|
43
|
+
}
|
|
44
|
+
var newObj = {
|
|
45
|
+
__proto__: null
|
|
46
|
+
};
|
|
47
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
48
|
+
for(var key in obj){
|
|
49
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
50
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
51
|
+
if (desc && (desc.get || desc.set)) {
|
|
52
|
+
Object.defineProperty(newObj, key, desc);
|
|
53
|
+
} else {
|
|
54
|
+
newObj[key] = obj[key];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
newObj.default = obj;
|
|
59
|
+
if (cache) {
|
|
60
|
+
cache.set(obj, newObj);
|
|
61
|
+
}
|
|
62
|
+
return newObj;
|
|
63
|
+
}
|
|
64
|
+
jest.mock('../../utils/files');
|
|
65
|
+
jest.mock('../../../users/utils/avatar', ()=>({
|
|
66
|
+
getAvatarBase64: jest.fn().mockResolvedValue('data:image/png;base64,iVBORw0KGgo=')
|
|
67
|
+
}));
|
|
68
|
+
describe(_onlyofficemanagerservice.OnlyOfficeManager.name, ()=>{
|
|
69
|
+
let service;
|
|
70
|
+
let cache;
|
|
71
|
+
let httpService;
|
|
72
|
+
let jwtService;
|
|
73
|
+
let filesLockManager;
|
|
74
|
+
const mockUser = {
|
|
75
|
+
id: 1,
|
|
76
|
+
login: 'testuser',
|
|
77
|
+
email: 'test@example.com',
|
|
78
|
+
fullName: 'Test User',
|
|
79
|
+
language: 'en',
|
|
80
|
+
role: 'user',
|
|
81
|
+
applications: []
|
|
82
|
+
};
|
|
83
|
+
const mockSpaceEnv = {
|
|
84
|
+
realPath: '/real/path/document.docx',
|
|
85
|
+
relativeUrl: '/document.docx',
|
|
86
|
+
url: 'space/document.docx',
|
|
87
|
+
dbFile: {
|
|
88
|
+
directory: '/space',
|
|
89
|
+
name: 'document.docx',
|
|
90
|
+
storageId: 1,
|
|
91
|
+
storageTypeId: 1
|
|
92
|
+
},
|
|
93
|
+
permissions: 'r,m,d',
|
|
94
|
+
envPermissions: 'r,m,d'
|
|
95
|
+
};
|
|
96
|
+
const mockRequest = {
|
|
97
|
+
headers: {
|
|
98
|
+
'user-agent': 'Mozilla/5.0'
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
beforeEach(async ()=>{
|
|
102
|
+
const module = await _testing.Test.createTestingModule({
|
|
103
|
+
providers: [
|
|
104
|
+
_onlyofficemanagerservice.OnlyOfficeManager,
|
|
105
|
+
{
|
|
106
|
+
provide: _cacheservice.Cache,
|
|
107
|
+
useValue: {
|
|
108
|
+
get: jest.fn(),
|
|
109
|
+
set: jest.fn(),
|
|
110
|
+
del: jest.fn()
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
provide: _axios.HttpService,
|
|
115
|
+
useValue: {
|
|
116
|
+
axiosRef: jest.fn()
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
provide: _jwt.JwtService,
|
|
121
|
+
useValue: {
|
|
122
|
+
signAsync: jest.fn(),
|
|
123
|
+
verifyAsync: jest.fn()
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
provide: _contextmanagerservice.ContextManager,
|
|
128
|
+
useValue: {
|
|
129
|
+
headerOriginUrl: jest.fn().mockReturnValue('http://localhost:3000')
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
provide: _fileslockmanagerservice.FilesLockManager,
|
|
134
|
+
useValue: {
|
|
135
|
+
checkConflicts: jest.fn(),
|
|
136
|
+
convertLockToFileLockProps: jest.fn(),
|
|
137
|
+
create: jest.fn(),
|
|
138
|
+
getLocksByPath: jest.fn(),
|
|
139
|
+
removeLock: jest.fn(),
|
|
140
|
+
isPathLocked: jest.fn()
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}).compile();
|
|
145
|
+
module.useLogger([
|
|
146
|
+
'fatal'
|
|
147
|
+
]);
|
|
148
|
+
service = module.get(_onlyofficemanagerservice.OnlyOfficeManager);
|
|
149
|
+
cache = module.get(_cacheservice.Cache);
|
|
150
|
+
httpService = module.get(_axios.HttpService);
|
|
151
|
+
jwtService = module.get(_jwt.JwtService);
|
|
152
|
+
filesLockManager = module.get(_fileslockmanagerservice.FilesLockManager);
|
|
153
|
+
});
|
|
154
|
+
afterEach(()=>{
|
|
155
|
+
jest.clearAllMocks();
|
|
156
|
+
});
|
|
157
|
+
describe('getSettings', ()=>{
|
|
158
|
+
beforeEach(()=>{
|
|
159
|
+
;
|
|
160
|
+
_files.isPathExists.mockResolvedValue(true);
|
|
161
|
+
_files.isPathIsDir.mockResolvedValue(false);
|
|
162
|
+
filesLockManager.checkConflicts.mockResolvedValue(undefined);
|
|
163
|
+
jwtService.signAsync.mockResolvedValue('mock-token');
|
|
164
|
+
cache.get.mockResolvedValue(null);
|
|
165
|
+
cache.set.mockResolvedValue(undefined);
|
|
166
|
+
_files.genEtag.mockReturnValue('mock-etag');
|
|
167
|
+
});
|
|
168
|
+
it('should return OnlyOffice settings for editable document', async ()=>{
|
|
169
|
+
const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest);
|
|
170
|
+
expect(result).toBeDefined();
|
|
171
|
+
expect(result.config.documentType).toBe('word');
|
|
172
|
+
expect(result.config.editorConfig.mode).toBe(_operations.FILE_MODE.EDIT);
|
|
173
|
+
expect(result.config.document.permissions.edit).toBe(true);
|
|
174
|
+
expect(result.hasLock).toBe(false);
|
|
175
|
+
});
|
|
176
|
+
it('should throw error if document does not exist', async ()=>{
|
|
177
|
+
;
|
|
178
|
+
_files.isPathExists.mockResolvedValue(false);
|
|
179
|
+
await expect(service.getSettings(mockUser, mockSpaceEnv, mockRequest)).rejects.toThrow(new _common.HttpException('Document not found', _common.HttpStatus.BAD_REQUEST));
|
|
180
|
+
});
|
|
181
|
+
it('should throw error if path is a directory', async ()=>{
|
|
182
|
+
;
|
|
183
|
+
_files.isPathIsDir.mockResolvedValue(true);
|
|
184
|
+
await expect(service.getSettings(mockUser, mockSpaceEnv, mockRequest)).rejects.toThrow(new _common.HttpException('Document must be a file', _common.HttpStatus.BAD_REQUEST));
|
|
185
|
+
});
|
|
186
|
+
it('should throw error if document extension is not supported', async ()=>{
|
|
187
|
+
const unsupportedSpaceEnv = {
|
|
188
|
+
...mockSpaceEnv,
|
|
189
|
+
realPath: '/real/path/document.xyz'
|
|
190
|
+
};
|
|
191
|
+
await expect(service.getSettings(mockUser, unsupportedSpaceEnv, mockRequest)).rejects.toThrow(new _common.HttpException('Document not supported', _common.HttpStatus.BAD_REQUEST));
|
|
192
|
+
});
|
|
193
|
+
it('should set mode to VIEW when file has lock conflict', async ()=>{
|
|
194
|
+
const mockLock = {
|
|
195
|
+
key: 'lock-key',
|
|
196
|
+
app: _onlyofficeconstants.ONLY_OFFICE_APP_LOCK,
|
|
197
|
+
owner: {
|
|
198
|
+
id: 2,
|
|
199
|
+
login: 'otheruser'
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const lockError = new _filelockerror.LockConflict(mockLock, 'File is locked');
|
|
203
|
+
filesLockManager.checkConflicts.mockRejectedValue(lockError);
|
|
204
|
+
filesLockManager.convertLockToFileLockProps.mockReturnValue({
|
|
205
|
+
owner: {
|
|
206
|
+
id: 2,
|
|
207
|
+
login: 'otheruser'
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest);
|
|
211
|
+
expect(result.config.editorConfig.mode).toBe(_operations.FILE_MODE.VIEW);
|
|
212
|
+
expect(result.config.document.permissions.edit).toBe(false);
|
|
213
|
+
expect(result.hasLock).toBeDefined();
|
|
214
|
+
});
|
|
215
|
+
it('should set mode to VIEW when user does not have modify permissions', async ()=>{
|
|
216
|
+
const viewOnlySpaceEnv = {
|
|
217
|
+
...mockSpaceEnv,
|
|
218
|
+
permissions: 'r',
|
|
219
|
+
envPermissions: 'r'
|
|
220
|
+
};
|
|
221
|
+
const result = await service.getSettings(mockUser, viewOnlySpaceEnv, mockRequest);
|
|
222
|
+
expect(result.config.editorConfig.mode).toBe(_operations.FILE_MODE.VIEW);
|
|
223
|
+
expect(result.config.document.permissions.edit).toBe(false);
|
|
224
|
+
});
|
|
225
|
+
it('should detect mobile user agent', async ()=>{
|
|
226
|
+
const mobileRequest = {
|
|
227
|
+
headers: {
|
|
228
|
+
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)'
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const result = await service.getSettings(mockUser, mockSpaceEnv, mobileRequest);
|
|
232
|
+
expect(result.config.type).toBe('mobile');
|
|
233
|
+
});
|
|
234
|
+
it('should use cached document key', async ()=>{
|
|
235
|
+
cache.get.mockResolvedValue('cached-doc-key');
|
|
236
|
+
const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest);
|
|
237
|
+
expect(result.config.document.key).toBe('cached-doc-key');
|
|
238
|
+
expect(cache.set).not.toHaveBeenCalled();
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe('callBack', ()=>{
|
|
242
|
+
const mockToken = 'mock-callback-token';
|
|
243
|
+
beforeEach(()=>{
|
|
244
|
+
filesLockManager.removeLock.mockResolvedValue(undefined);
|
|
245
|
+
filesLockManager.getLocksByPath.mockResolvedValue([]);
|
|
246
|
+
filesLockManager.isPathLocked.mockResolvedValue(false);
|
|
247
|
+
cache.del.mockResolvedValue(true);
|
|
248
|
+
_files.uniqueFilePathFromDir.mockResolvedValue('/tmp/temp-file.docx');
|
|
249
|
+
_files.writeFromStream.mockResolvedValue(undefined);
|
|
250
|
+
_files.fileSize.mockResolvedValue(12);
|
|
251
|
+
_files.copyFileContent.mockResolvedValue(undefined);
|
|
252
|
+
_files.removeFiles.mockResolvedValue(undefined);
|
|
253
|
+
});
|
|
254
|
+
it('should handle status 1 (document being edited)', async ()=>{
|
|
255
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
256
|
+
status: 1,
|
|
257
|
+
actions: [],
|
|
258
|
+
users: [
|
|
259
|
+
'1'
|
|
260
|
+
]
|
|
261
|
+
});
|
|
262
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
263
|
+
expect(result).toEqual({
|
|
264
|
+
error: 0
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
it('should handle status 2 (document closed with changes)', async ()=>{
|
|
268
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
269
|
+
status: 2,
|
|
270
|
+
actions: [],
|
|
271
|
+
users: [],
|
|
272
|
+
notmodified: false,
|
|
273
|
+
url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'
|
|
274
|
+
});
|
|
275
|
+
const mockStream = _stream.Readable.from([
|
|
276
|
+
'mock content'
|
|
277
|
+
]);
|
|
278
|
+
httpService.axiosRef.mockResolvedValue({
|
|
279
|
+
data: mockStream,
|
|
280
|
+
headers: {
|
|
281
|
+
'content-length': '12'
|
|
282
|
+
},
|
|
283
|
+
status: 200,
|
|
284
|
+
statusText: 'OK',
|
|
285
|
+
config: {}
|
|
286
|
+
});
|
|
287
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
288
|
+
expect(result).toEqual({
|
|
289
|
+
error: 0
|
|
290
|
+
});
|
|
291
|
+
expect(httpService.axiosRef).toHaveBeenCalled();
|
|
292
|
+
});
|
|
293
|
+
it('should handle status 2 (document closed without changes)', async ()=>{
|
|
294
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
295
|
+
status: 2,
|
|
296
|
+
actions: [],
|
|
297
|
+
users: [],
|
|
298
|
+
notmodified: true
|
|
299
|
+
});
|
|
300
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
301
|
+
expect(result).toEqual({
|
|
302
|
+
error: 0
|
|
303
|
+
});
|
|
304
|
+
expect(httpService.axiosRef).not.toHaveBeenCalled();
|
|
305
|
+
});
|
|
306
|
+
it('should handle status 3 (error saving document)', async ()=>{
|
|
307
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
308
|
+
status: 3,
|
|
309
|
+
actions: [],
|
|
310
|
+
url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'
|
|
311
|
+
});
|
|
312
|
+
const mockStream = _stream.Readable.from([
|
|
313
|
+
'mock content'
|
|
314
|
+
]);
|
|
315
|
+
httpService.axiosRef.mockResolvedValue({
|
|
316
|
+
data: mockStream,
|
|
317
|
+
headers: {
|
|
318
|
+
'content-length': '12'
|
|
319
|
+
},
|
|
320
|
+
status: 200,
|
|
321
|
+
statusText: 'OK',
|
|
322
|
+
config: {}
|
|
323
|
+
});
|
|
324
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
325
|
+
expect(result).toEqual({
|
|
326
|
+
error: 0
|
|
327
|
+
});
|
|
328
|
+
expect(httpService.axiosRef).toHaveBeenCalled();
|
|
329
|
+
});
|
|
330
|
+
it('should handle status 4 (document closed with no changes)', async ()=>{
|
|
331
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
332
|
+
status: 4,
|
|
333
|
+
actions: []
|
|
334
|
+
});
|
|
335
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
336
|
+
expect(result).toEqual({
|
|
337
|
+
error: 0
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
it('should handle status 6 (force save)', async ()=>{
|
|
341
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
342
|
+
status: 6,
|
|
343
|
+
actions: [],
|
|
344
|
+
url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'
|
|
345
|
+
});
|
|
346
|
+
const mockStream = _stream.Readable.from([
|
|
347
|
+
'mock content'
|
|
348
|
+
]);
|
|
349
|
+
httpService.axiosRef.mockResolvedValue({
|
|
350
|
+
data: mockStream,
|
|
351
|
+
headers: {
|
|
352
|
+
'content-length': '12'
|
|
353
|
+
},
|
|
354
|
+
status: 200,
|
|
355
|
+
statusText: 'OK',
|
|
356
|
+
config: {}
|
|
357
|
+
});
|
|
358
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
359
|
+
expect(result).toEqual({
|
|
360
|
+
error: 0
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
it('should handle status 7 (error force saving)', async ()=>{
|
|
364
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
365
|
+
status: 7,
|
|
366
|
+
actions: [],
|
|
367
|
+
url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'
|
|
368
|
+
});
|
|
369
|
+
const mockStream = _stream.Readable.from([
|
|
370
|
+
'mock content'
|
|
371
|
+
]);
|
|
372
|
+
httpService.axiosRef.mockResolvedValue({
|
|
373
|
+
data: mockStream,
|
|
374
|
+
headers: {
|
|
375
|
+
'content-length': '12'
|
|
376
|
+
},
|
|
377
|
+
status: 200,
|
|
378
|
+
statusText: 'OK',
|
|
379
|
+
config: {}
|
|
380
|
+
});
|
|
381
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
382
|
+
expect(result).toEqual({
|
|
383
|
+
error: 0
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
it('should handle user connect action (type 1)', async ()=>{
|
|
387
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
388
|
+
status: 1,
|
|
389
|
+
actions: [
|
|
390
|
+
{
|
|
391
|
+
type: 1,
|
|
392
|
+
userid: '1'
|
|
393
|
+
}
|
|
394
|
+
],
|
|
395
|
+
users: [
|
|
396
|
+
'1'
|
|
397
|
+
]
|
|
398
|
+
});
|
|
399
|
+
filesLockManager.create.mockResolvedValue([
|
|
400
|
+
true,
|
|
401
|
+
{}
|
|
402
|
+
]);
|
|
403
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
404
|
+
expect(result).toEqual({
|
|
405
|
+
error: 0
|
|
406
|
+
});
|
|
407
|
+
expect(filesLockManager.create).toHaveBeenCalledWith(mockUser, mockSpaceEnv.dbFile, _onlyofficeconstants.ONLY_OFFICE_APP_LOCK, _webdav.DEPTH.RESOURCE, {
|
|
408
|
+
lockRoot: null,
|
|
409
|
+
lockToken: null,
|
|
410
|
+
lockScope: _webdav.LOCK_SCOPE.SHARED
|
|
411
|
+
}, expect.any(Number));
|
|
412
|
+
});
|
|
413
|
+
it('should handle user disconnect action (type 0)', async ()=>{
|
|
414
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
415
|
+
status: 1,
|
|
416
|
+
actions: [
|
|
417
|
+
{
|
|
418
|
+
type: 0,
|
|
419
|
+
userid: '1'
|
|
420
|
+
}
|
|
421
|
+
],
|
|
422
|
+
users: undefined
|
|
423
|
+
});
|
|
424
|
+
filesLockManager.getLocksByPath.mockResolvedValue([
|
|
425
|
+
{
|
|
426
|
+
key: 'lock-key',
|
|
427
|
+
owner: {
|
|
428
|
+
id: 1
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
]);
|
|
432
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
433
|
+
expect(result).toEqual({
|
|
434
|
+
error: 0
|
|
435
|
+
});
|
|
436
|
+
expect(filesLockManager.removeLock).toHaveBeenCalledWith('lock-key');
|
|
437
|
+
});
|
|
438
|
+
it('should return error when callback fails', async ()=>{
|
|
439
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
440
|
+
status: 2,
|
|
441
|
+
actions: [],
|
|
442
|
+
notmodified: false,
|
|
443
|
+
url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'
|
|
444
|
+
});
|
|
445
|
+
httpService.axiosRef.mockRejectedValue(new Error('Network error'));
|
|
446
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
447
|
+
expect(result).toHaveProperty('error');
|
|
448
|
+
expect(result.error).not.toBe(0);
|
|
449
|
+
});
|
|
450
|
+
it('should throw error when file lock creation fails', async ()=>{
|
|
451
|
+
jwtService.verifyAsync.mockResolvedValue({
|
|
452
|
+
status: 1,
|
|
453
|
+
actions: [
|
|
454
|
+
{
|
|
455
|
+
type: 1,
|
|
456
|
+
userid: '1'
|
|
457
|
+
}
|
|
458
|
+
],
|
|
459
|
+
users: [
|
|
460
|
+
'1'
|
|
461
|
+
]
|
|
462
|
+
});
|
|
463
|
+
filesLockManager.create.mockResolvedValue([
|
|
464
|
+
false,
|
|
465
|
+
null
|
|
466
|
+
]);
|
|
467
|
+
const result = await service.callBack(mockUser, mockSpaceEnv, mockToken);
|
|
468
|
+
expect(result).toHaveProperty('error');
|
|
469
|
+
expect(result.error).not.toBe(0);
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
it('should be defined', ()=>{
|
|
473
|
+
expect(service).toBeDefined();
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
//# sourceMappingURL=only-office-manager.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../backend/src/applications/files/modules/only-office/only-office-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { HttpException, HttpStatus } from '@nestjs/common'\nimport { JwtService } from '@nestjs/jwt'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { AxiosResponse } from 'axios'\nimport { Readable } from 'stream'\nimport { Cache } from '../../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../../infrastructure/context/services/context-manager.service'\nimport type { SpaceEnv } from '../../../spaces/models/space-env.model'\nimport type { UserModel } from '../../../users/models/user.model'\nimport { DEPTH, LOCK_SCOPE } from '../../../webdav/constants/webdav'\nimport { FILE_MODE } from '../../constants/operations'\nimport { LockConflict } from '../../models/file-lock-error'\nimport { FilesLockManager } from '../../services/files-lock-manager.service'\nimport * as filesUtils from '../../utils/files'\nimport { OnlyOfficeManager } from './only-office-manager.service'\nimport { ONLY_OFFICE_APP_LOCK } from './only-office.constants'\n\njest.mock('../../utils/files')\njest.mock('../../../users/utils/avatar', () => ({\n getAvatarBase64: jest.fn().mockResolvedValue('data:image/png;base64,iVBORw0KGgo=')\n}))\n\ndescribe(OnlyOfficeManager.name, () => {\n let service: OnlyOfficeManager\n let cache: jest.Mocked<Cache>\n let httpService: jest.Mocked<HttpService>\n let jwtService: jest.Mocked<JwtService>\n let filesLockManager: jest.Mocked<FilesLockManager>\n\n const mockUser = {\n id: 1,\n login: 'testuser',\n email: 'test@example.com',\n fullName: 'Test User',\n language: 'en',\n role: 'user',\n applications: []\n } as unknown as UserModel\n\n const mockSpaceEnv = {\n realPath: '/real/path/document.docx',\n relativeUrl: '/document.docx',\n url: 'space/document.docx',\n dbFile: {\n directory: '/space',\n name: 'document.docx',\n storageId: 1,\n storageTypeId: 1\n },\n permissions: 'r,m,d',\n envPermissions: 'r,m,d'\n } as unknown as SpaceEnv\n\n const mockRequest = {\n headers: {\n 'user-agent': 'Mozilla/5.0'\n }\n } as any\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n OnlyOfficeManager,\n {\n provide: Cache,\n useValue: {\n get: jest.fn(),\n set: jest.fn(),\n del: jest.fn()\n }\n },\n {\n provide: HttpService,\n useValue: {\n axiosRef: jest.fn()\n }\n },\n {\n provide: JwtService,\n useValue: {\n signAsync: jest.fn(),\n verifyAsync: jest.fn()\n }\n },\n {\n provide: ContextManager,\n useValue: {\n headerOriginUrl: jest.fn().mockReturnValue('http://localhost:3000')\n }\n },\n {\n provide: FilesLockManager,\n useValue: {\n checkConflicts: jest.fn(),\n convertLockToFileLockProps: jest.fn(),\n create: jest.fn(),\n getLocksByPath: jest.fn(),\n removeLock: jest.fn(),\n isPathLocked: jest.fn()\n }\n }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<OnlyOfficeManager>(OnlyOfficeManager)\n cache = module.get(Cache)\n httpService = module.get(HttpService)\n jwtService = module.get(JwtService)\n filesLockManager = module.get(FilesLockManager)\n })\n\n afterEach(() => {\n jest.clearAllMocks()\n })\n\n describe('getSettings', () => {\n beforeEach(() => {\n ;(filesUtils.isPathExists as jest.Mock).mockResolvedValue(true)\n ;(filesUtils.isPathIsDir as jest.Mock).mockResolvedValue(false)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n jwtService.signAsync.mockResolvedValue('mock-token')\n cache.get.mockResolvedValue(null)\n cache.set.mockResolvedValue(undefined)\n ;(filesUtils.genEtag as jest.Mock).mockReturnValue('mock-etag')\n })\n\n it('should return OnlyOffice settings for editable document', async () => {\n const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest)\n\n expect(result).toBeDefined()\n expect(result.config.documentType).toBe('word')\n expect(result.config.editorConfig.mode).toBe(FILE_MODE.EDIT)\n expect(result.config.document.permissions.edit).toBe(true)\n expect(result.hasLock).toBe(false)\n })\n\n it('should throw error if document does not exist', async () => {\n ;(filesUtils.isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(service.getSettings(mockUser, mockSpaceEnv, mockRequest)).rejects.toThrow(\n new HttpException('Document not found', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should throw error if path is a directory', async () => {\n ;(filesUtils.isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n await expect(service.getSettings(mockUser, mockSpaceEnv, mockRequest)).rejects.toThrow(\n new HttpException('Document must be a file', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should throw error if document extension is not supported', async () => {\n const unsupportedSpaceEnv = {\n ...mockSpaceEnv,\n realPath: '/real/path/document.xyz'\n } as unknown as SpaceEnv\n\n await expect(service.getSettings(mockUser, unsupportedSpaceEnv, mockRequest)).rejects.toThrow(\n new HttpException('Document not supported', HttpStatus.BAD_REQUEST)\n )\n })\n\n it('should set mode to VIEW when file has lock conflict', async () => {\n const mockLock = {\n key: 'lock-key',\n app: ONLY_OFFICE_APP_LOCK,\n owner: { id: 2, login: 'otheruser' }\n } as any\n const lockError = new LockConflict(mockLock, 'File is locked')\n filesLockManager.checkConflicts.mockRejectedValue(lockError)\n filesLockManager.convertLockToFileLockProps.mockReturnValue({\n owner: { id: 2, login: 'otheruser' }\n } as any)\n\n const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest)\n\n expect(result.config.editorConfig.mode).toBe(FILE_MODE.VIEW)\n expect(result.config.document.permissions.edit).toBe(false)\n expect(result.hasLock).toBeDefined()\n })\n\n it('should set mode to VIEW when user does not have modify permissions', async () => {\n const viewOnlySpaceEnv = {\n ...mockSpaceEnv,\n permissions: 'r',\n envPermissions: 'r'\n } as unknown as SpaceEnv\n\n const result = await service.getSettings(mockUser, viewOnlySpaceEnv, mockRequest)\n\n expect(result.config.editorConfig.mode).toBe(FILE_MODE.VIEW)\n expect(result.config.document.permissions.edit).toBe(false)\n })\n\n it('should detect mobile user agent', async () => {\n const mobileRequest = {\n headers: {\n 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)'\n }\n } as any\n\n const result = await service.getSettings(mockUser, mockSpaceEnv, mobileRequest)\n\n expect(result.config.type).toBe('mobile')\n })\n\n it('should use cached document key', async () => {\n cache.get.mockResolvedValue('cached-doc-key')\n\n const result = await service.getSettings(mockUser, mockSpaceEnv, mockRequest)\n\n expect(result.config.document.key).toBe('cached-doc-key')\n expect(cache.set).not.toHaveBeenCalled()\n })\n })\n\n describe('callBack', () => {\n const mockToken = 'mock-callback-token'\n\n beforeEach(() => {\n filesLockManager.removeLock.mockResolvedValue(undefined)\n filesLockManager.getLocksByPath.mockResolvedValue([])\n filesLockManager.isPathLocked.mockResolvedValue(false)\n cache.del.mockResolvedValue(true)\n ;(filesUtils.uniqueFilePathFromDir as jest.Mock).mockResolvedValue('/tmp/temp-file.docx')\n ;(filesUtils.writeFromStream as jest.Mock).mockResolvedValue(undefined)\n ;(filesUtils.fileSize as jest.Mock).mockResolvedValue(12)\n ;(filesUtils.copyFileContent as jest.Mock).mockResolvedValue(undefined)\n ;(filesUtils.removeFiles as jest.Mock).mockResolvedValue(undefined)\n })\n\n it('should handle status 1 (document being edited)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 1,\n actions: [],\n users: ['1']\n })\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n })\n\n it('should handle status 2 (document closed with changes)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 2,\n actions: [],\n users: [],\n notmodified: false,\n url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'\n })\n\n const mockStream = Readable.from(['mock content'])\n httpService.axiosRef.mockResolvedValue({\n data: mockStream,\n headers: { 'content-length': '12' },\n status: 200,\n statusText: 'OK',\n config: {} as any\n } as AxiosResponse)\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n expect(httpService.axiosRef).toHaveBeenCalled()\n })\n\n it('should handle status 2 (document closed without changes)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 2,\n actions: [],\n users: [],\n notmodified: true\n })\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n expect(httpService.axiosRef).not.toHaveBeenCalled()\n })\n\n it('should handle status 3 (error saving document)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 3,\n actions: [],\n url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'\n })\n\n const mockStream = Readable.from(['mock content'])\n httpService.axiosRef.mockResolvedValue({\n data: mockStream,\n headers: { 'content-length': '12' },\n status: 200,\n statusText: 'OK',\n config: {} as any\n } as AxiosResponse)\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n expect(httpService.axiosRef).toHaveBeenCalled()\n })\n\n it('should handle status 4 (document closed with no changes)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 4,\n actions: []\n })\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n })\n\n it('should handle status 6 (force save)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 6,\n actions: [],\n url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'\n })\n\n const mockStream = Readable.from(['mock content'])\n httpService.axiosRef.mockResolvedValue({\n data: mockStream,\n headers: { 'content-length': '12' },\n status: 200,\n statusText: 'OK',\n config: {} as any\n } as AxiosResponse)\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n })\n\n it('should handle status 7 (error force saving)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 7,\n actions: [],\n url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'\n })\n\n const mockStream = Readable.from(['mock content'])\n httpService.axiosRef.mockResolvedValue({\n data: mockStream,\n headers: { 'content-length': '12' },\n status: 200,\n statusText: 'OK',\n config: {} as any\n } as AxiosResponse)\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n })\n\n it('should handle user connect action (type 1)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 1,\n actions: [{ type: 1, userid: '1' }],\n users: ['1']\n })\n filesLockManager.create.mockResolvedValue([true, {} as any])\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n expect(filesLockManager.create).toHaveBeenCalledWith(\n mockUser,\n mockSpaceEnv.dbFile,\n ONLY_OFFICE_APP_LOCK,\n DEPTH.RESOURCE,\n {\n lockRoot: null,\n lockToken: null,\n lockScope: LOCK_SCOPE.SHARED\n },\n expect.any(Number)\n )\n })\n\n it('should handle user disconnect action (type 0)', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 1,\n actions: [{ type: 0, userid: '1' }],\n users: undefined\n })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock-key', owner: { id: 1 } }] as any)\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toEqual({ error: 0 })\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('lock-key')\n })\n\n it('should return error when callback fails', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 2,\n actions: [],\n notmodified: false,\n url: 'http://onlyoffice/document.docx?md5=abc123&expires=1739400549&shardkey=-33120641&filename=document.docx'\n })\n httpService.axiosRef.mockRejectedValue(new Error('Network error'))\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toHaveProperty('error')\n expect(result.error).not.toBe(0)\n })\n\n it('should throw error when file lock creation fails', async () => {\n jwtService.verifyAsync.mockResolvedValue({\n status: 1,\n actions: [{ type: 1, userid: '1' }],\n users: ['1']\n })\n filesLockManager.create.mockResolvedValue([false, null])\n\n const result = await service.callBack(mockUser, mockSpaceEnv, mockToken)\n\n expect(result).toHaveProperty('error')\n expect(result.error).not.toBe(0)\n })\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["jest","mock","getAvatarBase64","fn","mockResolvedValue","describe","OnlyOfficeManager","name","service","cache","httpService","jwtService","filesLockManager","mockUser","id","login","email","fullName","language","role","applications","mockSpaceEnv","realPath","relativeUrl","url","dbFile","directory","storageId","storageTypeId","permissions","envPermissions","mockRequest","headers","beforeEach","module","Test","createTestingModule","providers","provide","Cache","useValue","get","set","del","HttpService","axiosRef","JwtService","signAsync","verifyAsync","ContextManager","headerOriginUrl","mockReturnValue","FilesLockManager","checkConflicts","convertLockToFileLockProps","create","getLocksByPath","removeLock","isPathLocked","compile","useLogger","afterEach","clearAllMocks","filesUtils","isPathExists","isPathIsDir","undefined","genEtag","it","result","getSettings","expect","toBeDefined","config","documentType","toBe","editorConfig","mode","FILE_MODE","EDIT","document","edit","hasLock","rejects","toThrow","HttpException","HttpStatus","BAD_REQUEST","unsupportedSpaceEnv","mockLock","key","app","ONLY_OFFICE_APP_LOCK","owner","lockError","LockConflict","mockRejectedValue","VIEW","viewOnlySpaceEnv","mobileRequest","type","not","toHaveBeenCalled","mockToken","uniqueFilePathFromDir","writeFromStream","fileSize","copyFileContent","removeFiles","status","actions","users","callBack","toEqual","error","notmodified","mockStream","Readable","from","data","statusText","userid","toHaveBeenCalledWith","DEPTH","RESOURCE","lockRoot","lockToken","lockScope","LOCK_SCOPE","SHARED","any","Number","Error","toHaveProperty"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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, "OnlyOfficeConfig", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
12
|
+
return OnlyOfficeConfig;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const _classvalidator = require("class-validator");
|
|
16
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
17
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
18
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
19
|
+
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;
|
|
20
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
21
|
+
}
|
|
22
|
+
function _ts_metadata(k, v) {
|
|
23
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
24
|
+
}
|
|
25
|
+
let OnlyOfficeConfig = class OnlyOfficeConfig {
|
|
26
|
+
constructor(){
|
|
27
|
+
this.enabled = false;
|
|
28
|
+
this.externalServer = null;
|
|
29
|
+
this.verifySSL = false;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
_ts_decorate([
|
|
33
|
+
(0, _classvalidator.IsBoolean)()
|
|
34
|
+
], OnlyOfficeConfig.prototype, "enabled", void 0);
|
|
35
|
+
_ts_decorate([
|
|
36
|
+
(0, _classvalidator.IsOptional)(),
|
|
37
|
+
(0, _classvalidator.IsString)(),
|
|
38
|
+
_ts_metadata("design:type", String)
|
|
39
|
+
], OnlyOfficeConfig.prototype, "externalServer", void 0);
|
|
40
|
+
_ts_decorate([
|
|
41
|
+
(0, _classvalidator.ValidateIf)((o)=>o.enabled),
|
|
42
|
+
(0, _classvalidator.IsString)(),
|
|
43
|
+
(0, _classvalidator.IsNotEmpty)(),
|
|
44
|
+
_ts_metadata("design:type", String)
|
|
45
|
+
], OnlyOfficeConfig.prototype, "secret", void 0);
|
|
46
|
+
_ts_decorate([
|
|
47
|
+
(0, _classvalidator.IsBoolean)(),
|
|
48
|
+
_ts_metadata("design:type", Boolean)
|
|
49
|
+
], OnlyOfficeConfig.prototype, "verifySSL", void 0);
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=only-office.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../backend/src/applications/files/modules/only-office/only-office.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 { IsBoolean, IsNotEmpty, IsOptional, IsString, ValidateIf } from 'class-validator'\n\nexport class OnlyOfficeConfig {\n @IsBoolean()\n enabled = false\n\n @IsOptional()\n @IsString()\n externalServer: string = null\n\n @ValidateIf((o: OnlyOfficeConfig) => o.enabled)\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsBoolean()\n verifySSL: boolean = false\n}\n"],"names":["OnlyOfficeConfig","enabled","externalServer","verifySSL","o"],"mappings":"AAAA;;;;CAIC;;;;+BAIYA;;;eAAAA;;;gCAF2D;;;;;;;;;;AAEjE,IAAA,AAAMA,mBAAN,MAAMA;;aAEXC,UAAU;aAIVC,iBAAyB;aAQzBC,YAAqB;;AACvB;;;;;;;;;;qCAPeC,IAAwBA,EAAEH,OAAO"}
|