@protontech/drive-sdk 0.0.13 → 0.1.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/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/memoryCache.js +0 -1
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/cache/memoryCache.test.js +2 -4
- package/dist/cache/memoryCache.test.js.map +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +36 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/driveCrypto.d.ts +2 -5
- package/dist/crypto/driveCrypto.js +7 -12
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +14 -14
- package/dist/crypto/openPGPCrypto.js +5 -3
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +222 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +58 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +11 -7
- package/dist/interface/index.js +2 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/result.js.map +1 -1
- package/dist/interface/sharing.d.ts +2 -0
- package/dist/interface/sharing.js.map +1 -1
- package/dist/interface/telemetry.js +0 -8
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/interface/thumbnail.js.map +1 -1
- package/dist/interface/upload.d.ts +7 -1
- package/dist/internal/apiService/apiService.d.ts +1 -1
- package/dist/internal/apiService/apiService.js +7 -11
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +55 -48
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
- package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
- package/dist/internal/apiService/errors.js +14 -8
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +17 -12
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/apiService/transformers.js +1 -1
- package/dist/internal/asyncIteratorMap.test.js +2 -2
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/asyncIteratorRace.d.ts +13 -0
- package/dist/internal/asyncIteratorRace.js +59 -0
- package/dist/internal/asyncIteratorRace.js.map +1 -0
- package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
- package/dist/internal/asyncIteratorRace.test.js +119 -0
- package/dist/internal/asyncIteratorRace.test.js.map +1 -0
- package/dist/internal/batch.d.ts +1 -0
- package/dist/internal/batch.js +12 -0
- package/dist/internal/batch.js.map +1 -0
- package/dist/internal/batch.test.d.ts +1 -0
- package/dist/internal/batch.test.js +41 -0
- package/dist/internal/batch.test.js.map +1 -0
- package/dist/internal/batchLoading.js.map +1 -1
- package/dist/internal/batchLoading.test.js +13 -13
- package/dist/internal/batchLoading.test.js.map +1 -1
- package/dist/internal/devices/apiService.d.ts +3 -3
- package/dist/internal/devices/apiService.js +2 -2
- package/dist/internal/devices/apiService.js.map +1 -1
- package/dist/internal/devices/cryptoService.js +1 -2
- package/dist/internal/devices/cryptoService.js.map +1 -1
- package/dist/internal/devices/index.d.ts +5 -5
- package/dist/internal/devices/index.js.map +1 -1
- package/dist/internal/devices/interface.d.ts +3 -3
- package/dist/internal/devices/manager.js +2 -2
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +38 -7
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/apiService.d.ts +4 -4
- package/dist/internal/download/apiService.js +32 -32
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/cryptoService.d.ts +4 -4
- package/dist/internal/download/cryptoService.js +6 -5
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +6 -6
- package/dist/internal/download/fileDownloader.js +3 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +1 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/index.d.ts +5 -5
- package/dist/internal/download/index.js +5 -5
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +3 -4
- package/dist/internal/download/telemetry.d.ts +3 -3
- package/dist/internal/download/telemetry.js +4 -2
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +8 -8
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
- package/dist/internal/download/thumbnailDownloader.js +6 -6
- package/dist/internal/download/thumbnailDownloader.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -1
- package/dist/internal/errors.js +1 -3
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +5 -7
- package/dist/internal/events/apiService.js +19 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +9 -12
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.d.ts +1 -0
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -106
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +177 -83
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +16 -36
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +12 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +9 -19
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +4 -3
- package/dist/internal/nodes/apiService.js +36 -15
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +60 -41
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +14 -5
- package/dist/internal/nodes/cache.js +31 -7
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +31 -9
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +2 -2
- package/dist/internal/nodes/cryptoCache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.test.js +24 -4
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -4
- package/dist/internal/nodes/cryptoService.js +11 -17
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +320 -241
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +8 -84
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +35 -279
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
- package/dist/internal/nodes/extendedAttributes.js +3 -1
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +7 -10
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +12 -13
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +24 -32
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.d.ts +22 -7
- package/dist/internal/nodes/nodesAccess.js +65 -16
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +165 -101
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +7 -9
- package/dist/internal/nodes/nodesManagement.js +21 -33
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +42 -21
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +3 -3
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +1 -1
- package/dist/internal/photos/apiService.js +3 -6
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/cache.d.ts +1 -1
- package/dist/internal/photos/index.d.ts +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/photosTimeline.d.ts +3 -3
- package/dist/internal/photos/photosTimeline.js +1 -2
- package/dist/internal/photos/photosTimeline.js.map +1 -1
- package/dist/internal/sdkEvents.d.ts +1 -1
- package/dist/internal/sdkEvents.js +2 -7
- package/dist/internal/sdkEvents.js.map +1 -1
- package/dist/internal/sdkEvents.test.js +8 -8
- package/dist/internal/shares/apiService.d.ts +2 -2
- package/dist/internal/shares/apiService.js +5 -3
- package/dist/internal/shares/apiService.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +4 -2
- package/dist/internal/shares/cache.js +14 -6
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/cache.test.js.map +1 -1
- package/dist/internal/shares/cryptoCache.d.ts +2 -2
- package/dist/internal/shares/cryptoCache.test.js +8 -2
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +3 -3
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +42 -42
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +4 -4
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/interface.d.ts +2 -2
- package/dist/internal/shares/manager.d.ts +8 -7
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +71 -63
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +4 -4
- package/dist/internal/sharing/apiService.js +5 -3
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +1 -1
- package/dist/internal/sharing/cache.test.js +33 -33
- package/dist/internal/sharing/cryptoService.d.ts +3 -3
- package/dist/internal/sharing/cryptoService.js +3 -4
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +39 -39
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +24 -56
- package/dist/internal/sharing/events.js +45 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +85 -189
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +8 -9
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +8 -4
- package/dist/internal/sharing/sharingAccess.d.ts +6 -6
- package/dist/internal/sharing/sharingAccess.js +8 -4
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +45 -39
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +5 -6
- package/dist/internal/sharing/sharingManagement.js +12 -16
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +305 -286
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/uids.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +5 -6
- package/dist/internal/upload/apiService.js +8 -5
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/blockVerifier.d.ts +3 -3
- package/dist/internal/upload/blockVerifier.js +1 -1
- package/dist/internal/upload/blockVerifier.js.map +1 -1
- package/dist/internal/upload/chunkStreamReader.test.js +6 -6
- package/dist/internal/upload/cryptoService.d.ts +4 -4
- package/dist/internal/upload/cryptoService.js +4 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/digests.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +6 -6
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +6 -6
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +5 -3
- package/dist/internal/upload/manager.d.ts +8 -8
- package/dist/internal/upload/manager.js +23 -52
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +185 -147
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +6 -6
- package/dist/internal/upload/streamUploader.js +9 -8
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +17 -12
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +3 -3
- package/dist/internal/upload/telemetry.js +5 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +8 -8
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +27 -170
- package/dist/protonDriveClient.js +37 -198
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/telemetry.js +18 -15
- package/dist/telemetry.js.map +1 -1
- package/dist/tests/logger.js.map +1 -1
- package/dist/tests/telemetry.d.ts +1 -1
- package/dist/transformers.js +4 -2
- package/dist/transformers.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/interface.ts +22 -22
- package/src/cache/memoryCache.test.ts +7 -7
- package/src/cache/memoryCache.ts +5 -5
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/driveCrypto.test.ts +15 -15
- package/src/crypto/driveCrypto.ts +120 -156
- package/src/crypto/hmac.ts +1 -1
- package/src/crypto/interface.ts +63 -72
- package/src/crypto/openPGPCrypto.ts +76 -94
- package/src/crypto/utils.ts +1 -1
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +84 -0
- package/src/diagnostic/index.ts +40 -0
- package/src/diagnostic/integrityVerificationStream.ts +55 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +249 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
- package/src/diagnostic/telemetry.ts +74 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +25 -22
- package/src/index.ts +3 -3
- package/src/interface/account.ts +10 -10
- package/src/interface/author.ts +6 -6
- package/src/interface/config.ts +28 -0
- package/src/interface/devices.ts +6 -6
- package/src/interface/download.ts +12 -9
- package/src/interface/events.ts +76 -25
- package/src/interface/httpClient.ts +11 -27
- package/src/interface/index.ts +81 -20
- package/src/interface/nodes.ts +67 -60
- package/src/interface/result.ts +1 -3
- package/src/interface/sharing.ts +60 -56
- package/src/interface/telemetry.ts +74 -74
- package/src/interface/thumbnail.ts +5 -6
- package/src/interface/upload.ts +25 -11
- package/src/internal/apiService/apiService.test.ts +109 -76
- package/src/internal/apiService/apiService.ts +40 -26
- package/src/internal/apiService/coreTypes.ts +2474 -2463
- package/src/internal/apiService/driveTypes.ts +1868 -1822
- package/src/internal/apiService/errorCodes.ts +4 -4
- package/src/internal/apiService/errors.test.ts +25 -23
- package/src/internal/apiService/errors.ts +15 -9
- package/src/internal/apiService/index.ts +1 -1
- package/src/internal/apiService/transformers.ts +2 -2
- package/src/internal/asyncIteratorMap.test.ts +4 -4
- package/src/internal/asyncIteratorMap.ts +1 -1
- package/src/internal/asyncIteratorRace.test.ts +149 -0
- package/src/internal/asyncIteratorRace.ts +79 -0
- package/src/internal/batch.test.ts +50 -0
- package/src/internal/batch.ts +9 -0
- package/src/internal/batchLoading.test.ts +13 -14
- package/src/internal/batchLoading.ts +8 -8
- package/src/internal/devices/apiService.ts +58 -51
- package/src/internal/devices/cryptoService.ts +22 -17
- package/src/internal/devices/index.ts +17 -10
- package/src/internal/devices/interface.ts +21 -12
- package/src/internal/devices/manager.test.ts +40 -9
- package/src/internal/devices/manager.ts +3 -3
- package/src/internal/download/apiService.ts +72 -52
- package/src/internal/download/cryptoService.ts +34 -18
- package/src/internal/download/fileDownloader.test.ts +25 -9
- package/src/internal/download/fileDownloader.ts +38 -20
- package/src/internal/download/index.ts +19 -19
- package/src/internal/download/interface.ts +19 -20
- package/src/internal/download/queue.ts +3 -3
- package/src/internal/download/telemetry.test.ts +11 -11
- package/src/internal/download/telemetry.ts +24 -14
- package/src/internal/download/thumbnailDownloader.test.ts +11 -6
- package/src/internal/download/thumbnailDownloader.ts +43 -32
- package/src/internal/errors.ts +7 -5
- package/src/internal/events/apiService.ts +46 -36
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +26 -48
- package/src/internal/events/eventManager.test.ts +211 -93
- package/src/internal/events/eventManager.ts +72 -117
- package/src/internal/events/index.ts +71 -91
- package/src/internal/events/interface.ts +92 -29
- package/src/internal/events/volumeEventManager.test.ts +239 -0
- package/src/internal/events/volumeEventManager.ts +68 -57
- package/src/internal/nodes/apiService.test.ts +197 -147
- package/src/internal/nodes/apiService.ts +288 -174
- package/src/internal/nodes/cache.test.ts +48 -20
- package/src/internal/nodes/cache.ts +79 -45
- package/src/internal/nodes/cryptoCache.test.ts +34 -14
- package/src/internal/nodes/cryptoCache.ts +10 -5
- package/src/internal/nodes/cryptoService.test.ts +492 -351
- package/src/internal/nodes/cryptoService.ts +171 -89
- package/src/internal/nodes/events.test.ts +48 -344
- package/src/internal/nodes/events.ts +48 -254
- package/src/internal/nodes/extendedAttributes.test.ts +28 -24
- package/src/internal/nodes/extendedAttributes.ts +20 -15
- package/src/internal/nodes/index.test.ts +51 -55
- package/src/internal/nodes/index.ts +32 -22
- package/src/internal/nodes/interface.ts +44 -31
- package/src/internal/nodes/nodesAccess.test.ts +237 -130
- package/src/internal/nodes/nodesAccess.ts +113 -50
- package/src/internal/nodes/nodesManagement.test.ts +64 -39
- package/src/internal/nodes/nodesManagement.ts +51 -62
- package/src/internal/nodes/nodesRevisions.ts +7 -7
- package/src/internal/nodes/validations.ts +2 -2
- package/src/internal/photos/albums.ts +5 -5
- package/src/internal/photos/apiService.ts +4 -7
- package/src/internal/photos/cache.ts +1 -1
- package/src/internal/photos/index.ts +8 -8
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/photosTimeline.ts +4 -5
- package/src/internal/sdkEvents.test.ts +10 -10
- package/src/internal/sdkEvents.ts +5 -13
- package/src/internal/shares/apiService.ts +44 -33
- package/src/internal/shares/cache.test.ts +6 -4
- package/src/internal/shares/cache.ts +25 -14
- package/src/internal/shares/cryptoCache.test.ts +17 -11
- package/src/internal/shares/cryptoCache.ts +4 -4
- package/src/internal/shares/cryptoService.test.ts +72 -74
- package/src/internal/shares/cryptoService.ts +48 -23
- package/src/internal/shares/index.ts +23 -11
- package/src/internal/shares/interface.ts +8 -8
- package/src/internal/shares/manager.test.ts +88 -80
- package/src/internal/shares/manager.ts +27 -23
- package/src/internal/sharing/apiService.ts +283 -175
- package/src/internal/sharing/cache.test.ts +35 -35
- package/src/internal/sharing/cache.ts +3 -3
- package/src/internal/sharing/cryptoService.test.ts +58 -46
- package/src/internal/sharing/cryptoService.ts +121 -83
- package/src/internal/sharing/events.test.ts +97 -207
- package/src/internal/sharing/events.ts +46 -157
- package/src/internal/sharing/index.ts +24 -16
- package/src/internal/sharing/interface.ts +46 -42
- package/src/internal/sharing/sharingAccess.test.ts +71 -65
- package/src/internal/sharing/sharingAccess.ts +39 -21
- package/src/internal/sharing/sharingManagement.test.ts +405 -335
- package/src/internal/sharing/sharingManagement.ts +144 -75
- package/src/internal/uids.ts +1 -1
- package/src/internal/upload/apiService.ts +168 -119
- package/src/internal/upload/blockVerifier.ts +8 -6
- package/src/internal/upload/chunkStreamReader.test.ts +7 -7
- package/src/internal/upload/cryptoService.ts +42 -36
- package/src/internal/upload/digests.ts +2 -2
- package/src/internal/upload/fileUploader.test.ts +15 -3
- package/src/internal/upload/fileUploader.ts +39 -17
- package/src/internal/upload/index.ts +17 -18
- package/src/internal/upload/interface.ts +79 -77
- package/src/internal/upload/manager.test.ts +222 -175
- package/src/internal/upload/manager.ts +74 -80
- package/src/internal/upload/queue.ts +3 -3
- package/src/internal/upload/streamUploader.test.ts +40 -27
- package/src/internal/upload/streamUploader.ts +87 -71
- package/src/internal/upload/telemetry.test.ts +11 -11
- package/src/internal/upload/telemetry.ts +25 -15
- package/src/internal/wait.test.ts +1 -1
- package/src/internal/wait.ts +3 -3
- package/src/protonDriveClient.ts +189 -276
- package/src/protonDrivePhotosClient.ts +20 -13
- package/src/telemetry.ts +60 -52
- package/src/tests/logger.ts +1 -1
- package/src/tests/telemetry.ts +2 -2
- package/src/transformers.ts +27 -21
- package/src/version.ts +0 -1
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
|
@@ -3,30 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const logger_1 = require("../../tests/logger");
|
|
4
4
|
const interface_1 = require("../../interface");
|
|
5
5
|
const sharingManagement_1 = require("./sharingManagement");
|
|
6
|
-
describe(
|
|
6
|
+
describe('SharingManagement', () => {
|
|
7
7
|
let apiService;
|
|
8
8
|
let cryptoService;
|
|
9
9
|
let accountService;
|
|
10
10
|
let sharesService;
|
|
11
11
|
let nodesService;
|
|
12
|
-
let nodesEvents;
|
|
13
12
|
let sharingManagement;
|
|
14
13
|
beforeEach(() => {
|
|
15
14
|
// @ts-expect-error No need to implement all methods for mocking
|
|
16
15
|
apiService = {
|
|
17
|
-
createStandardShare: jest.fn().mockReturnValue(
|
|
16
|
+
createStandardShare: jest.fn().mockReturnValue('newShareId'),
|
|
18
17
|
getShareInvitations: jest.fn().mockResolvedValue([]),
|
|
19
18
|
getShareExternalInvitations: jest.fn().mockResolvedValue([]),
|
|
20
19
|
getShareMembers: jest.fn().mockResolvedValue([]),
|
|
21
20
|
inviteProtonUser: jest.fn().mockImplementation((_, invitation) => ({
|
|
22
21
|
...invitation,
|
|
23
|
-
uid:
|
|
22
|
+
uid: 'created-invitation',
|
|
24
23
|
})),
|
|
25
24
|
updateInvitation: jest.fn(),
|
|
26
25
|
deleteInvitation: jest.fn(),
|
|
27
26
|
inviteExternalUser: jest.fn().mockImplementation((_, invitation) => ({
|
|
28
27
|
...invitation,
|
|
29
|
-
uid:
|
|
28
|
+
uid: 'created-external-invitation',
|
|
30
29
|
state: interface_1.NonProtonInvitationState.Pending,
|
|
31
30
|
})),
|
|
32
31
|
updateExternalInvitation: jest.fn(),
|
|
@@ -39,14 +38,18 @@ describe("SharingManagement", () => {
|
|
|
39
38
|
resendInvitationEmail: jest.fn(),
|
|
40
39
|
resendExternalInvitationEmail: jest.fn(),
|
|
41
40
|
createPublicLink: jest.fn().mockResolvedValue({
|
|
42
|
-
uid:
|
|
43
|
-
publicUrl:
|
|
41
|
+
uid: 'publicLinkUid',
|
|
42
|
+
publicUrl: 'publicLinkUrl',
|
|
44
43
|
}),
|
|
45
44
|
updatePublicLink: jest.fn(),
|
|
46
45
|
};
|
|
47
46
|
// @ts-expect-error No need to implement all methods for mocking
|
|
48
47
|
cryptoService = {
|
|
49
|
-
generateShareKeys: jest
|
|
48
|
+
generateShareKeys: jest
|
|
49
|
+
.fn()
|
|
50
|
+
.mockResolvedValue({
|
|
51
|
+
shareKey: { encrypted: 'encrypted-key', decrypted: { passphraseSessionKey: 'pass-session-key' } },
|
|
52
|
+
}),
|
|
50
53
|
decryptShare: jest.fn().mockImplementation((share) => share),
|
|
51
54
|
decryptInvitation: jest.fn().mockImplementation((invitation) => invitation),
|
|
52
55
|
decryptExternalInvitation: jest.fn().mockImplementation((invitation) => invitation),
|
|
@@ -54,13 +57,13 @@ describe("SharingManagement", () => {
|
|
|
54
57
|
encryptInvitation: jest.fn().mockImplementation(() => { }),
|
|
55
58
|
encryptExternalInvitation: jest.fn().mockImplementation((invitation) => ({
|
|
56
59
|
...invitation,
|
|
57
|
-
base64ExternalInvitationSignature:
|
|
60
|
+
base64ExternalInvitationSignature: 'extenral-signature',
|
|
58
61
|
})),
|
|
59
62
|
decryptPublicLink: jest.fn().mockImplementation((publicLink) => publicLink),
|
|
60
|
-
generatePublicLinkPassword: jest.fn().mockResolvedValue(
|
|
63
|
+
generatePublicLinkPassword: jest.fn().mockResolvedValue('generatedPassword'),
|
|
61
64
|
encryptPublicLink: jest.fn().mockImplementation(() => ({
|
|
62
|
-
crypto:
|
|
63
|
-
srp:
|
|
65
|
+
crypto: 'publicLinkCrypto',
|
|
66
|
+
srp: 'publicLinkSrp',
|
|
64
67
|
})),
|
|
65
68
|
};
|
|
66
69
|
// @ts-expect-error No need to implement all methods for mocking
|
|
@@ -69,36 +72,43 @@ describe("SharingManagement", () => {
|
|
|
69
72
|
};
|
|
70
73
|
// @ts-expect-error No need to implement all methods for mocking
|
|
71
74
|
sharesService = {
|
|
72
|
-
loadEncryptedShare: jest
|
|
73
|
-
|
|
75
|
+
loadEncryptedShare: jest
|
|
76
|
+
.fn()
|
|
77
|
+
.mockResolvedValue({
|
|
78
|
+
id: 'shareId',
|
|
79
|
+
addressId: 'addressId',
|
|
80
|
+
creatorEmail: 'address@example.com',
|
|
81
|
+
passphraseSessionKey: 'sharePassphraseSessionKey',
|
|
82
|
+
}),
|
|
83
|
+
getContextShareMemberEmailKey: jest
|
|
84
|
+
.fn()
|
|
85
|
+
.mockResolvedValue({ email: 'volume-email', addressId: 'addressId', addressKey: 'volume-key' }),
|
|
74
86
|
};
|
|
75
87
|
// @ts-expect-error No need to implement all methods for mocking
|
|
76
88
|
nodesService = {
|
|
77
|
-
getNode: jest
|
|
78
|
-
|
|
89
|
+
getNode: jest
|
|
90
|
+
.fn()
|
|
91
|
+
.mockImplementation((nodeUid) => ({ nodeUid, shareId: 'shareId', name: { ok: true, value: 'name' } })),
|
|
92
|
+
getNodeKeys: jest.fn().mockImplementation((nodeUid) => ({ key: 'node-key' })),
|
|
79
93
|
getNodePrivateAndSessionKeys: jest.fn().mockImplementation((nodeUid) => ({})),
|
|
80
|
-
getRootNodeEmailKey: jest.fn().mockResolvedValue({ email:
|
|
81
|
-
|
|
82
|
-
nodesEvents = {
|
|
83
|
-
nodeUpdated: jest.fn(),
|
|
94
|
+
getRootNodeEmailKey: jest.fn().mockResolvedValue({ email: 'volume-email', addressKey: 'volume-key' }),
|
|
95
|
+
notifyNodeChanged: jest.fn(),
|
|
84
96
|
};
|
|
85
|
-
sharingManagement = new sharingManagement_1.SharingManagement((0, logger_1.getMockLogger)(), apiService, cryptoService, accountService, sharesService, nodesService
|
|
97
|
+
sharingManagement = new sharingManagement_1.SharingManagement((0, logger_1.getMockLogger)(), apiService, cryptoService, accountService, sharesService, nodesService);
|
|
86
98
|
});
|
|
87
|
-
describe(
|
|
88
|
-
it(
|
|
89
|
-
nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid:
|
|
90
|
-
const sharingInfo = await sharingManagement.getSharingInfo(
|
|
99
|
+
describe('getSharingInfo', () => {
|
|
100
|
+
it('should return empty sharing info for unshared node', async () => {
|
|
101
|
+
nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid: 'nodeUid', shareId: undefined });
|
|
102
|
+
const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
|
|
91
103
|
expect(sharingInfo).toEqual(undefined);
|
|
92
104
|
expect(apiService.getShareInvitations).not.toHaveBeenCalled();
|
|
93
105
|
expect(apiService.getShareExternalInvitations).not.toHaveBeenCalled();
|
|
94
106
|
expect(apiService.getShareMembers).not.toHaveBeenCalled();
|
|
95
107
|
});
|
|
96
|
-
it(
|
|
97
|
-
const invitation = { uid:
|
|
98
|
-
apiService.getShareInvitations = jest.fn().mockResolvedValue([
|
|
99
|
-
|
|
100
|
-
]);
|
|
101
|
-
const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
|
|
108
|
+
it('should return invitations', async () => {
|
|
109
|
+
const invitation = { uid: 'invitaiton', addedByEmail: 'email' };
|
|
110
|
+
apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
|
|
111
|
+
const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
|
|
102
112
|
expect(sharingInfo).toEqual({
|
|
103
113
|
protonInvitations: [invitation],
|
|
104
114
|
nonProtonInvitations: [],
|
|
@@ -107,12 +117,10 @@ describe("SharingManagement", () => {
|
|
|
107
117
|
});
|
|
108
118
|
expect(cryptoService.decryptInvitation).toHaveBeenCalledWith(invitation);
|
|
109
119
|
});
|
|
110
|
-
it(
|
|
111
|
-
const externalInvitation = { uid:
|
|
112
|
-
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
|
|
113
|
-
|
|
114
|
-
]);
|
|
115
|
-
const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
|
|
120
|
+
it('should return external invitations', async () => {
|
|
121
|
+
const externalInvitation = { uid: 'external-invitation', addedByEmail: 'email' };
|
|
122
|
+
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
|
|
123
|
+
const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
|
|
116
124
|
expect(sharingInfo).toEqual({
|
|
117
125
|
protonInvitations: [],
|
|
118
126
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -121,12 +129,10 @@ describe("SharingManagement", () => {
|
|
|
121
129
|
});
|
|
122
130
|
expect(cryptoService.decryptExternalInvitation).toHaveBeenCalledWith(externalInvitation);
|
|
123
131
|
});
|
|
124
|
-
it(
|
|
125
|
-
const member = { uid:
|
|
126
|
-
apiService.getShareMembers = jest.fn().mockResolvedValue([
|
|
127
|
-
|
|
128
|
-
]);
|
|
129
|
-
const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
|
|
132
|
+
it('should return members', async () => {
|
|
133
|
+
const member = { uid: 'member', addedByEmail: 'email' };
|
|
134
|
+
apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
|
|
135
|
+
const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
|
|
130
136
|
expect(sharingInfo).toEqual({
|
|
131
137
|
protonInvitations: [],
|
|
132
138
|
nonProtonInvitations: [],
|
|
@@ -135,12 +141,12 @@ describe("SharingManagement", () => {
|
|
|
135
141
|
});
|
|
136
142
|
expect(cryptoService.decryptMember).toHaveBeenCalledWith(member);
|
|
137
143
|
});
|
|
138
|
-
it(
|
|
144
|
+
it('should return public link', async () => {
|
|
139
145
|
const publicLink = {
|
|
140
146
|
uid: 'shared~publicLink',
|
|
141
147
|
};
|
|
142
148
|
apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
|
|
143
|
-
const sharingInfo = await sharingManagement.getSharingInfo(
|
|
149
|
+
const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
|
|
144
150
|
expect(sharingInfo).toEqual({
|
|
145
151
|
protonInvitations: [],
|
|
146
152
|
nonProtonInvitations: [],
|
|
@@ -150,124 +156,134 @@ describe("SharingManagement", () => {
|
|
|
150
156
|
expect(cryptoService.decryptPublicLink).toHaveBeenCalledWith(publicLink);
|
|
151
157
|
});
|
|
152
158
|
});
|
|
153
|
-
describe(
|
|
154
|
-
const nodeUid =
|
|
155
|
-
it(
|
|
156
|
-
nodesService.getNode = jest
|
|
157
|
-
|
|
159
|
+
describe('shareNode with share creation', () => {
|
|
160
|
+
const nodeUid = 'volumeId~nodeUid';
|
|
161
|
+
it('should create share if no exists', async () => {
|
|
162
|
+
nodesService.getNode = jest
|
|
163
|
+
.fn()
|
|
164
|
+
.mockImplementation((nodeUid) => ({
|
|
165
|
+
nodeUid,
|
|
166
|
+
parentUid: 'parentUid',
|
|
167
|
+
name: { ok: true, value: 'name' },
|
|
168
|
+
}));
|
|
169
|
+
nodesService.notifyNodeChanged = jest.fn();
|
|
170
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
|
|
158
171
|
expect(sharingInfo).toEqual({
|
|
159
|
-
protonInvitations: [
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
172
|
+
protonInvitations: [
|
|
173
|
+
{
|
|
174
|
+
uid: 'created-invitation',
|
|
175
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
176
|
+
inviteeEmail: 'email',
|
|
177
|
+
role: 'viewer',
|
|
178
|
+
},
|
|
179
|
+
],
|
|
165
180
|
nonProtonInvitations: [],
|
|
166
181
|
members: [],
|
|
167
182
|
publicLink: undefined,
|
|
168
183
|
});
|
|
169
184
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
170
185
|
expect(apiService.inviteProtonUser).toHaveBeenCalled();
|
|
171
|
-
expect(
|
|
172
|
-
uid: nodeUid,
|
|
173
|
-
shareId: "newShareId",
|
|
174
|
-
isShared: true,
|
|
175
|
-
});
|
|
186
|
+
expect(nodesService.notifyNodeChanged).toHaveBeenCalledWith(nodeUid);
|
|
176
187
|
});
|
|
177
188
|
});
|
|
178
|
-
describe(
|
|
179
|
-
const nodeUid =
|
|
189
|
+
describe('shareNode with share re-use', () => {
|
|
190
|
+
const nodeUid = 'volumeId~nodeUid';
|
|
180
191
|
let invitation;
|
|
181
192
|
let externalInvitation;
|
|
182
193
|
let member;
|
|
183
194
|
beforeEach(async () => {
|
|
184
195
|
invitation = {
|
|
185
|
-
uid:
|
|
186
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
187
|
-
inviteeEmail:
|
|
196
|
+
uid: 'invitation',
|
|
197
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
198
|
+
inviteeEmail: 'internal-email',
|
|
188
199
|
role: interface_1.MemberRole.Viewer,
|
|
189
200
|
invitationTime: new Date(),
|
|
190
201
|
};
|
|
191
202
|
externalInvitation = {
|
|
192
|
-
uid:
|
|
193
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
194
|
-
inviteeEmail:
|
|
203
|
+
uid: 'external-invitation',
|
|
204
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
205
|
+
inviteeEmail: 'external-email',
|
|
195
206
|
role: interface_1.MemberRole.Viewer,
|
|
196
207
|
invitationTime: new Date(),
|
|
197
208
|
state: interface_1.NonProtonInvitationState.Pending,
|
|
198
209
|
};
|
|
199
210
|
member = {
|
|
200
|
-
uid:
|
|
201
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
202
|
-
inviteeEmail:
|
|
211
|
+
uid: 'member',
|
|
212
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
213
|
+
inviteeEmail: 'member-email',
|
|
203
214
|
role: interface_1.MemberRole.Viewer,
|
|
204
215
|
invitationTime: new Date(),
|
|
205
216
|
};
|
|
206
|
-
apiService.getShareInvitations = jest.fn().mockResolvedValue([
|
|
207
|
-
|
|
208
|
-
]);
|
|
209
|
-
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
|
|
210
|
-
externalInvitation,
|
|
211
|
-
]);
|
|
212
|
-
apiService.getShareMembers = jest.fn().mockResolvedValue([
|
|
213
|
-
member,
|
|
214
|
-
]);
|
|
217
|
+
apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
|
|
218
|
+
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
|
|
219
|
+
apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
|
|
215
220
|
});
|
|
216
|
-
describe(
|
|
221
|
+
describe('invitations', () => {
|
|
217
222
|
beforeEach(() => {
|
|
218
223
|
accountService.hasProtonAccount = jest.fn().mockResolvedValue(true);
|
|
219
224
|
});
|
|
220
|
-
it(
|
|
221
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [
|
|
225
|
+
it('should share node with proton email with default role', async () => {
|
|
226
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
|
|
222
227
|
expect(sharingInfo).toEqual({
|
|
223
|
-
protonInvitations: [
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
228
|
+
protonInvitations: [
|
|
229
|
+
invitation,
|
|
230
|
+
{
|
|
231
|
+
uid: 'created-invitation',
|
|
232
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
233
|
+
inviteeEmail: 'email',
|
|
234
|
+
role: 'viewer',
|
|
235
|
+
},
|
|
236
|
+
],
|
|
229
237
|
nonProtonInvitations: [externalInvitation],
|
|
230
238
|
members: [member],
|
|
231
239
|
publicLink: undefined,
|
|
232
240
|
});
|
|
233
241
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
234
242
|
expect(apiService.inviteProtonUser).toHaveBeenCalled();
|
|
235
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
236
243
|
});
|
|
237
|
-
it(
|
|
238
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
244
|
+
it('should share node with proton email with specific role', async () => {
|
|
245
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
246
|
+
users: [{ email: 'email', role: interface_1.MemberRole.Editor }],
|
|
247
|
+
});
|
|
239
248
|
expect(sharingInfo).toEqual({
|
|
240
|
-
protonInvitations: [
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
249
|
+
protonInvitations: [
|
|
250
|
+
invitation,
|
|
251
|
+
{
|
|
252
|
+
uid: 'created-invitation',
|
|
253
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
254
|
+
inviteeEmail: 'email',
|
|
255
|
+
role: 'editor',
|
|
256
|
+
},
|
|
257
|
+
],
|
|
246
258
|
nonProtonInvitations: [externalInvitation],
|
|
247
259
|
members: [member],
|
|
248
260
|
publicLink: undefined,
|
|
249
261
|
});
|
|
250
262
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
251
263
|
expect(apiService.inviteProtonUser).toHaveBeenCalled();
|
|
252
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
253
264
|
});
|
|
254
|
-
it(
|
|
255
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
265
|
+
it('should update existing role', async () => {
|
|
266
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
267
|
+
users: [{ email: 'internal-email', role: interface_1.MemberRole.Editor }],
|
|
268
|
+
});
|
|
256
269
|
expect(sharingInfo).toEqual({
|
|
257
|
-
protonInvitations: [
|
|
270
|
+
protonInvitations: [
|
|
271
|
+
{
|
|
258
272
|
...invitation,
|
|
259
|
-
role:
|
|
260
|
-
}
|
|
273
|
+
role: 'editor',
|
|
274
|
+
},
|
|
275
|
+
],
|
|
261
276
|
nonProtonInvitations: [externalInvitation],
|
|
262
277
|
members: [member],
|
|
263
278
|
publicLink: undefined,
|
|
264
279
|
});
|
|
265
280
|
expect(apiService.updateInvitation).toHaveBeenCalled();
|
|
266
281
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
267
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
268
282
|
});
|
|
269
|
-
it(
|
|
270
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
283
|
+
it('should be no-op if no change', async () => {
|
|
284
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
285
|
+
users: [{ email: 'internal-email', role: interface_1.MemberRole.Viewer }],
|
|
286
|
+
});
|
|
271
287
|
expect(sharingInfo).toEqual({
|
|
272
288
|
protonInvitations: [invitation],
|
|
273
289
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -276,66 +292,76 @@ describe("SharingManagement", () => {
|
|
|
276
292
|
});
|
|
277
293
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
278
294
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
279
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
280
295
|
});
|
|
281
296
|
});
|
|
282
|
-
describe(
|
|
297
|
+
describe('external invitations', () => {
|
|
283
298
|
beforeEach(() => {
|
|
284
299
|
accountService.hasProtonAccount = jest.fn().mockResolvedValue(false);
|
|
285
300
|
});
|
|
286
|
-
it(
|
|
287
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [
|
|
301
|
+
it('should share node with external email with default role', async () => {
|
|
302
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
|
|
288
303
|
expect(sharingInfo).toEqual({
|
|
289
304
|
protonInvitations: [invitation],
|
|
290
|
-
nonProtonInvitations: [
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
305
|
+
nonProtonInvitations: [
|
|
306
|
+
externalInvitation,
|
|
307
|
+
{
|
|
308
|
+
uid: 'created-external-invitation',
|
|
309
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
310
|
+
inviteeEmail: 'email',
|
|
311
|
+
role: 'viewer',
|
|
312
|
+
state: 'pending',
|
|
313
|
+
},
|
|
314
|
+
],
|
|
297
315
|
members: [member],
|
|
298
316
|
publicLink: undefined,
|
|
299
317
|
});
|
|
300
318
|
expect(apiService.updateExternalInvitation).not.toHaveBeenCalled();
|
|
301
319
|
expect(apiService.inviteExternalUser).toHaveBeenCalled();
|
|
302
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
303
320
|
});
|
|
304
|
-
it(
|
|
305
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
321
|
+
it('should share node with external email with specific role', async () => {
|
|
322
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
323
|
+
users: [{ email: 'email', role: interface_1.MemberRole.Editor }],
|
|
324
|
+
});
|
|
306
325
|
expect(sharingInfo).toEqual({
|
|
307
326
|
protonInvitations: [invitation],
|
|
308
|
-
nonProtonInvitations: [
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
327
|
+
nonProtonInvitations: [
|
|
328
|
+
externalInvitation,
|
|
329
|
+
{
|
|
330
|
+
uid: 'created-external-invitation',
|
|
331
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
332
|
+
inviteeEmail: 'email',
|
|
333
|
+
role: 'editor',
|
|
334
|
+
state: 'pending',
|
|
335
|
+
},
|
|
336
|
+
],
|
|
315
337
|
members: [member],
|
|
316
338
|
publicLink: undefined,
|
|
317
339
|
});
|
|
318
340
|
expect(apiService.updateExternalInvitation).not.toHaveBeenCalled();
|
|
319
341
|
expect(apiService.inviteExternalUser).toHaveBeenCalled();
|
|
320
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
321
342
|
});
|
|
322
|
-
it(
|
|
323
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
343
|
+
it('should update existing role', async () => {
|
|
344
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
345
|
+
users: [{ email: 'external-email', role: interface_1.MemberRole.Editor }],
|
|
346
|
+
});
|
|
324
347
|
expect(sharingInfo).toEqual({
|
|
325
348
|
protonInvitations: [invitation],
|
|
326
|
-
nonProtonInvitations: [
|
|
349
|
+
nonProtonInvitations: [
|
|
350
|
+
{
|
|
327
351
|
...externalInvitation,
|
|
328
|
-
role:
|
|
329
|
-
}
|
|
352
|
+
role: 'editor',
|
|
353
|
+
},
|
|
354
|
+
],
|
|
330
355
|
members: [member],
|
|
331
356
|
publicLink: undefined,
|
|
332
357
|
});
|
|
333
358
|
expect(apiService.updateExternalInvitation).toHaveBeenCalled();
|
|
334
359
|
expect(apiService.inviteExternalUser).not.toHaveBeenCalled();
|
|
335
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
336
360
|
});
|
|
337
|
-
it(
|
|
338
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
361
|
+
it('should be no-op if no change', async () => {
|
|
362
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
363
|
+
users: [{ email: 'external-email', role: interface_1.MemberRole.Viewer }],
|
|
364
|
+
});
|
|
339
365
|
expect(sharingInfo).toEqual({
|
|
340
366
|
protonInvitations: [invitation],
|
|
341
367
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -344,63 +370,70 @@ describe("SharingManagement", () => {
|
|
|
344
370
|
});
|
|
345
371
|
expect(apiService.updateExternalInvitation).not.toHaveBeenCalled();
|
|
346
372
|
expect(apiService.inviteExternalUser).not.toHaveBeenCalled();
|
|
347
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
348
373
|
});
|
|
349
374
|
});
|
|
350
|
-
describe(
|
|
375
|
+
describe('mix of internal and external invitations', () => {
|
|
351
376
|
beforeEach(() => {
|
|
352
|
-
accountService.hasProtonAccount = jest.fn()
|
|
353
|
-
.mockResolvedValueOnce(true)
|
|
354
|
-
.mockResolvedValueOnce(false);
|
|
377
|
+
accountService.hasProtonAccount = jest.fn().mockResolvedValueOnce(true).mockResolvedValueOnce(false);
|
|
355
378
|
});
|
|
356
|
-
it(
|
|
357
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [
|
|
379
|
+
it('should share node with proton and external email with default role', async () => {
|
|
380
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email', 'email2'] });
|
|
358
381
|
expect(sharingInfo).toEqual({
|
|
359
|
-
protonInvitations: [
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
382
|
+
protonInvitations: [
|
|
383
|
+
invitation,
|
|
384
|
+
{
|
|
385
|
+
uid: 'created-invitation',
|
|
386
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
387
|
+
inviteeEmail: 'email',
|
|
388
|
+
role: 'viewer',
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
nonProtonInvitations: [
|
|
392
|
+
externalInvitation,
|
|
393
|
+
{
|
|
394
|
+
uid: 'created-external-invitation',
|
|
395
|
+
addedByEmail: { ok: true, value: 'volume-email' },
|
|
396
|
+
inviteeEmail: 'email2',
|
|
397
|
+
role: 'viewer',
|
|
398
|
+
state: 'pending',
|
|
399
|
+
},
|
|
400
|
+
],
|
|
372
401
|
members: [member],
|
|
373
402
|
publicLink: undefined,
|
|
374
403
|
});
|
|
375
404
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
376
|
-
expect(apiService.inviteProtonUser).toHaveBeenCalledWith(
|
|
377
|
-
inviteeEmail:
|
|
405
|
+
expect(apiService.inviteProtonUser).toHaveBeenCalledWith('shareId', expect.objectContaining({
|
|
406
|
+
inviteeEmail: 'email',
|
|
378
407
|
}), expect.anything());
|
|
379
|
-
expect(apiService.inviteExternalUser).toHaveBeenCalledWith(
|
|
380
|
-
inviteeEmail:
|
|
408
|
+
expect(apiService.inviteExternalUser).toHaveBeenCalledWith('shareId', expect.objectContaining({
|
|
409
|
+
inviteeEmail: 'email2',
|
|
381
410
|
}), expect.anything());
|
|
382
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
383
411
|
});
|
|
384
412
|
});
|
|
385
|
-
describe(
|
|
386
|
-
it(
|
|
387
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
413
|
+
describe('members', () => {
|
|
414
|
+
it('should update member via proton user', async () => {
|
|
415
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
416
|
+
users: [{ email: 'member-email', role: interface_1.MemberRole.Editor }],
|
|
417
|
+
});
|
|
388
418
|
expect(sharingInfo).toEqual({
|
|
389
419
|
protonInvitations: [invitation],
|
|
390
420
|
nonProtonInvitations: [externalInvitation],
|
|
391
|
-
members: [
|
|
421
|
+
members: [
|
|
422
|
+
{
|
|
392
423
|
...member,
|
|
393
|
-
role:
|
|
394
|
-
}
|
|
424
|
+
role: 'editor',
|
|
425
|
+
},
|
|
426
|
+
],
|
|
395
427
|
publicLink: undefined,
|
|
396
428
|
});
|
|
397
429
|
expect(apiService.updateMember).toHaveBeenCalled();
|
|
398
430
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
399
431
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
400
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
401
432
|
});
|
|
402
|
-
it(
|
|
403
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
433
|
+
it('should be no-op if no change via proton user', async () => {
|
|
434
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
435
|
+
users: [{ email: 'member-email', role: interface_1.MemberRole.Viewer }],
|
|
436
|
+
});
|
|
404
437
|
expect(sharingInfo).toEqual({
|
|
405
438
|
protonInvitations: [invitation],
|
|
406
439
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -410,26 +443,30 @@ describe("SharingManagement", () => {
|
|
|
410
443
|
expect(apiService.updateMember).not.toHaveBeenCalled();
|
|
411
444
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
412
445
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
413
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
414
446
|
});
|
|
415
|
-
it(
|
|
416
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
447
|
+
it('should update member via non-proton user', async () => {
|
|
448
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
449
|
+
users: [{ email: 'member-email', role: interface_1.MemberRole.Editor }],
|
|
450
|
+
});
|
|
417
451
|
expect(sharingInfo).toEqual({
|
|
418
452
|
protonInvitations: [invitation],
|
|
419
453
|
nonProtonInvitations: [externalInvitation],
|
|
420
|
-
members: [
|
|
454
|
+
members: [
|
|
455
|
+
{
|
|
421
456
|
...member,
|
|
422
|
-
role:
|
|
423
|
-
}
|
|
457
|
+
role: 'editor',
|
|
458
|
+
},
|
|
459
|
+
],
|
|
424
460
|
publicLink: undefined,
|
|
425
461
|
});
|
|
426
462
|
expect(apiService.updateMember).toHaveBeenCalled();
|
|
427
463
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
428
464
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
429
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
430
465
|
});
|
|
431
|
-
it(
|
|
432
|
-
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
466
|
+
it('should be no-op if no change via non-proton user', async () => {
|
|
467
|
+
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
468
|
+
users: [{ email: 'member-email', role: interface_1.MemberRole.Viewer }],
|
|
469
|
+
});
|
|
433
470
|
expect(sharingInfo).toEqual({
|
|
434
471
|
protonInvitations: [invitation],
|
|
435
472
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -439,11 +476,10 @@ describe("SharingManagement", () => {
|
|
|
439
476
|
expect(apiService.updateMember).not.toHaveBeenCalled();
|
|
440
477
|
expect(apiService.updateInvitation).not.toHaveBeenCalled();
|
|
441
478
|
expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
|
|
442
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
443
479
|
});
|
|
444
480
|
});
|
|
445
|
-
describe(
|
|
446
|
-
it(
|
|
481
|
+
describe('public link', () => {
|
|
482
|
+
it('should share node with public link', async () => {
|
|
447
483
|
jest.useFakeTimers();
|
|
448
484
|
jest.setSystemTime(new Date('2025-01-01'));
|
|
449
485
|
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
@@ -458,32 +494,33 @@ describe("SharingManagement", () => {
|
|
|
458
494
|
nonProtonInvitations: [externalInvitation],
|
|
459
495
|
members: [member],
|
|
460
496
|
publicLink: {
|
|
461
|
-
uid:
|
|
497
|
+
uid: 'publicLinkUid',
|
|
462
498
|
role: interface_1.MemberRole.Viewer,
|
|
463
|
-
url:
|
|
499
|
+
url: 'publicLinkUrl#generatedPassword',
|
|
464
500
|
creationTime: new Date(),
|
|
465
501
|
expirationTime: undefined,
|
|
466
502
|
customPassword: undefined,
|
|
467
|
-
creatorEmail:
|
|
503
|
+
creatorEmail: 'volume-email',
|
|
504
|
+
numberOfInitializedDownloads: 0,
|
|
468
505
|
},
|
|
469
506
|
});
|
|
470
507
|
expect(cryptoService.generatePublicLinkPassword).toHaveBeenCalled();
|
|
471
|
-
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
|
|
472
|
-
expect(apiService.createPublicLink).toHaveBeenCalledWith(
|
|
508
|
+
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith('volume-email', 'sharePassphraseSessionKey', 'generatedPassword');
|
|
509
|
+
expect(apiService.createPublicLink).toHaveBeenCalledWith('shareId', expect.objectContaining({
|
|
473
510
|
role: interface_1.MemberRole.Viewer,
|
|
474
511
|
includesCustomPassword: false,
|
|
475
512
|
expirationTime: undefined,
|
|
476
|
-
crypto:
|
|
477
|
-
srp:
|
|
513
|
+
crypto: 'publicLinkCrypto',
|
|
514
|
+
srp: 'publicLinkSrp',
|
|
478
515
|
}));
|
|
479
516
|
});
|
|
480
|
-
it(
|
|
517
|
+
it('should share node with custom password and expiration', async () => {
|
|
481
518
|
jest.useFakeTimers();
|
|
482
519
|
jest.setSystemTime(new Date('2025-01-01'));
|
|
483
520
|
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
484
521
|
publicLink: {
|
|
485
522
|
role: interface_1.MemberRole.Viewer,
|
|
486
|
-
customPassword:
|
|
523
|
+
customPassword: 'customPassword',
|
|
487
524
|
expiration: new Date('2025-01-02'),
|
|
488
525
|
},
|
|
489
526
|
});
|
|
@@ -492,42 +529,43 @@ describe("SharingManagement", () => {
|
|
|
492
529
|
nonProtonInvitations: [externalInvitation],
|
|
493
530
|
members: [member],
|
|
494
531
|
publicLink: {
|
|
495
|
-
uid:
|
|
532
|
+
uid: 'publicLinkUid',
|
|
496
533
|
role: interface_1.MemberRole.Viewer,
|
|
497
|
-
url:
|
|
534
|
+
url: 'publicLinkUrl#generatedPassword',
|
|
498
535
|
creationTime: new Date(),
|
|
499
536
|
expirationTime: new Date('2025-01-02'),
|
|
500
|
-
customPassword:
|
|
501
|
-
creatorEmail:
|
|
537
|
+
customPassword: 'customPassword',
|
|
538
|
+
creatorEmail: 'volume-email',
|
|
539
|
+
numberOfInitializedDownloads: 0,
|
|
502
540
|
},
|
|
503
541
|
});
|
|
504
542
|
expect(cryptoService.generatePublicLinkPassword).toHaveBeenCalled();
|
|
505
|
-
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
|
|
506
|
-
expect(apiService.createPublicLink).toHaveBeenCalledWith(
|
|
543
|
+
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith('volume-email', 'sharePassphraseSessionKey', 'generatedPasswordcustomPassword');
|
|
544
|
+
expect(apiService.createPublicLink).toHaveBeenCalledWith('shareId', expect.objectContaining({
|
|
507
545
|
role: interface_1.MemberRole.Viewer,
|
|
508
546
|
includesCustomPassword: true,
|
|
509
547
|
expirationTime: 1735776000,
|
|
510
|
-
crypto:
|
|
511
|
-
srp:
|
|
548
|
+
crypto: 'publicLinkCrypto',
|
|
549
|
+
srp: 'publicLinkSrp',
|
|
512
550
|
}));
|
|
513
551
|
});
|
|
514
|
-
it(
|
|
552
|
+
it('should update public link with custom password and expiration', async () => {
|
|
515
553
|
jest.useFakeTimers();
|
|
516
554
|
jest.setSystemTime(new Date('2025-01-01'));
|
|
517
555
|
const publicLink = {
|
|
518
556
|
uid: 'publicLinkUid',
|
|
519
|
-
url:
|
|
557
|
+
url: 'publicLinkUrl#generatedpas', // Generated password must be 12 chararacters long.
|
|
520
558
|
creationTime: new Date('2025-01-01'),
|
|
521
559
|
role: interface_1.MemberRole.Viewer,
|
|
522
560
|
customPassword: undefined,
|
|
523
561
|
expirationTime: undefined,
|
|
524
|
-
creatorEmail:
|
|
562
|
+
creatorEmail: 'publicLinkCreatorEmail',
|
|
525
563
|
};
|
|
526
564
|
apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
|
|
527
565
|
const sharingInfo = await sharingManagement.shareNode(nodeUid, {
|
|
528
566
|
publicLink: {
|
|
529
567
|
role: interface_1.MemberRole.Editor,
|
|
530
|
-
customPassword:
|
|
568
|
+
customPassword: 'customPassword',
|
|
531
569
|
expiration: new Date('2025-01-02'),
|
|
532
570
|
},
|
|
533
571
|
});
|
|
@@ -536,43 +574,43 @@ describe("SharingManagement", () => {
|
|
|
536
574
|
nonProtonInvitations: [externalInvitation],
|
|
537
575
|
members: [member],
|
|
538
576
|
publicLink: {
|
|
539
|
-
uid:
|
|
577
|
+
uid: 'publicLinkUid',
|
|
540
578
|
role: interface_1.MemberRole.Editor,
|
|
541
|
-
url:
|
|
579
|
+
url: 'publicLinkUrl#generatedpas',
|
|
542
580
|
creationTime: new Date('2025-01-01'),
|
|
543
581
|
expirationTime: new Date('2025-01-02'),
|
|
544
|
-
customPassword:
|
|
545
|
-
creatorEmail:
|
|
582
|
+
customPassword: 'customPassword',
|
|
583
|
+
creatorEmail: 'publicLinkCreatorEmail',
|
|
546
584
|
},
|
|
547
585
|
});
|
|
548
|
-
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
|
|
549
|
-
expect(apiService.updatePublicLink).toHaveBeenCalledWith(
|
|
586
|
+
expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith('publicLinkCreatorEmail', 'sharePassphraseSessionKey', 'generatedpascustomPassword');
|
|
587
|
+
expect(apiService.updatePublicLink).toHaveBeenCalledWith('publicLinkUid', expect.objectContaining({
|
|
550
588
|
role: interface_1.MemberRole.Editor,
|
|
551
589
|
includesCustomPassword: true,
|
|
552
590
|
expirationTime: 1735776000,
|
|
553
|
-
crypto:
|
|
554
|
-
srp:
|
|
591
|
+
crypto: 'publicLinkCrypto',
|
|
592
|
+
srp: 'publicLinkSrp',
|
|
555
593
|
}));
|
|
556
594
|
});
|
|
557
|
-
it(
|
|
595
|
+
it('should not allow updating legacy public link', async () => {
|
|
558
596
|
apiService.getPublicLink = jest.fn().mockResolvedValue({
|
|
559
597
|
uid: 'publicLinkUid',
|
|
560
|
-
url:
|
|
598
|
+
url: 'publicLinkUrl#aaa', // Legacy public links doesn't have 12 chars.
|
|
561
599
|
});
|
|
562
600
|
await expect(sharingManagement.shareNode(nodeUid, {
|
|
563
601
|
publicLink: true,
|
|
564
|
-
})).rejects.toThrow(
|
|
602
|
+
})).rejects.toThrow('Legacy public link cannot be updated. Please re-create a new public link.');
|
|
565
603
|
});
|
|
566
|
-
it(
|
|
604
|
+
it('should not allow updating legacy public link without generated password', async () => {
|
|
567
605
|
apiService.getPublicLink = jest.fn().mockResolvedValue({
|
|
568
606
|
uid: 'publicLinkUid',
|
|
569
|
-
url:
|
|
607
|
+
url: 'publicLinkUrl',
|
|
570
608
|
});
|
|
571
609
|
await expect(sharingManagement.shareNode(nodeUid, {
|
|
572
610
|
publicLink: true,
|
|
573
|
-
})).rejects.toThrow(
|
|
611
|
+
})).rejects.toThrow('Legacy public link cannot be updated. Please re-create a new public link.');
|
|
574
612
|
});
|
|
575
|
-
it(
|
|
613
|
+
it('should not allow creating public link with expiration in the past', async () => {
|
|
576
614
|
jest.useFakeTimers();
|
|
577
615
|
jest.setSystemTime(new Date('2025-01-01'));
|
|
578
616
|
await expect(sharingManagement.shareNode(nodeUid, {
|
|
@@ -580,60 +618,55 @@ describe("SharingManagement", () => {
|
|
|
580
618
|
role: interface_1.MemberRole.Viewer,
|
|
581
619
|
expiration: new Date('2024-01-01'),
|
|
582
620
|
},
|
|
583
|
-
})).rejects.toThrow(
|
|
621
|
+
})).rejects.toThrow('Expiration date cannot be in the past');
|
|
584
622
|
expect(apiService.createStandardShare).not.toHaveBeenCalled();
|
|
585
623
|
expect(apiService.createPublicLink).not.toHaveBeenCalled();
|
|
586
624
|
});
|
|
587
625
|
});
|
|
588
626
|
});
|
|
589
|
-
describe(
|
|
590
|
-
const nodeUid =
|
|
627
|
+
describe('unshareNode', () => {
|
|
628
|
+
const nodeUid = 'volumeId~nodeUid';
|
|
591
629
|
let invitation;
|
|
592
630
|
let externalInvitation;
|
|
593
631
|
let member;
|
|
594
632
|
let publicLink;
|
|
595
633
|
beforeEach(async () => {
|
|
596
634
|
invitation = {
|
|
597
|
-
uid:
|
|
598
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
599
|
-
inviteeEmail:
|
|
635
|
+
uid: 'invitation',
|
|
636
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
637
|
+
inviteeEmail: 'internal-email',
|
|
600
638
|
role: interface_1.MemberRole.Viewer,
|
|
601
639
|
invitationTime: new Date(),
|
|
602
640
|
};
|
|
603
641
|
externalInvitation = {
|
|
604
|
-
uid:
|
|
605
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
606
|
-
inviteeEmail:
|
|
642
|
+
uid: 'external-invitation',
|
|
643
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
644
|
+
inviteeEmail: 'external-email',
|
|
607
645
|
role: interface_1.MemberRole.Viewer,
|
|
608
646
|
invitationTime: new Date(),
|
|
609
647
|
state: interface_1.NonProtonInvitationState.Pending,
|
|
610
648
|
};
|
|
611
649
|
member = {
|
|
612
|
-
uid:
|
|
613
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
614
|
-
inviteeEmail:
|
|
650
|
+
uid: 'member',
|
|
651
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
652
|
+
inviteeEmail: 'member-email',
|
|
615
653
|
role: interface_1.MemberRole.Viewer,
|
|
616
654
|
invitationTime: new Date(),
|
|
617
655
|
};
|
|
618
656
|
publicLink = {
|
|
619
|
-
uid:
|
|
657
|
+
uid: 'publicLink',
|
|
620
658
|
creationTime: new Date(),
|
|
621
659
|
role: interface_1.MemberRole.Viewer,
|
|
622
|
-
url:
|
|
660
|
+
url: 'url',
|
|
661
|
+
numberOfInitializedDownloads: 0,
|
|
623
662
|
};
|
|
624
|
-
apiService.getShareInvitations = jest.fn().mockResolvedValue([
|
|
625
|
-
|
|
626
|
-
]);
|
|
627
|
-
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
|
|
628
|
-
externalInvitation,
|
|
629
|
-
]);
|
|
630
|
-
apiService.getShareMembers = jest.fn().mockResolvedValue([
|
|
631
|
-
member,
|
|
632
|
-
]);
|
|
663
|
+
apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
|
|
664
|
+
apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
|
|
665
|
+
apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
|
|
633
666
|
apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
|
|
634
667
|
});
|
|
635
|
-
it(
|
|
636
|
-
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: [
|
|
668
|
+
it('should delete invitation', async () => {
|
|
669
|
+
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['internal-email'] });
|
|
637
670
|
expect(sharingInfo).toEqual({
|
|
638
671
|
protonInvitations: [],
|
|
639
672
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -645,10 +678,9 @@ describe("SharingManagement", () => {
|
|
|
645
678
|
expect(apiService.deleteExternalInvitation).not.toHaveBeenCalled();
|
|
646
679
|
expect(apiService.removeMember).not.toHaveBeenCalled();
|
|
647
680
|
expect(apiService.removePublicLink).not.toHaveBeenCalled();
|
|
648
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
649
681
|
});
|
|
650
|
-
it(
|
|
651
|
-
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: [
|
|
682
|
+
it('should delete external invitation', async () => {
|
|
683
|
+
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['external-email'] });
|
|
652
684
|
expect(sharingInfo).toEqual({
|
|
653
685
|
protonInvitations: [invitation],
|
|
654
686
|
nonProtonInvitations: [],
|
|
@@ -660,10 +692,9 @@ describe("SharingManagement", () => {
|
|
|
660
692
|
expect(apiService.deleteExternalInvitation).toHaveBeenCalled();
|
|
661
693
|
expect(apiService.removeMember).not.toHaveBeenCalled();
|
|
662
694
|
expect(apiService.removePublicLink).not.toHaveBeenCalled();
|
|
663
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
664
695
|
});
|
|
665
|
-
it(
|
|
666
|
-
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: [
|
|
696
|
+
it('should remove member', async () => {
|
|
697
|
+
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['member-email'] });
|
|
667
698
|
expect(sharingInfo).toEqual({
|
|
668
699
|
protonInvitations: [invitation],
|
|
669
700
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -675,10 +706,9 @@ describe("SharingManagement", () => {
|
|
|
675
706
|
expect(apiService.deleteExternalInvitation).not.toHaveBeenCalled();
|
|
676
707
|
expect(apiService.removeMember).toHaveBeenCalled();
|
|
677
708
|
expect(apiService.removePublicLink).not.toHaveBeenCalled();
|
|
678
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
679
709
|
});
|
|
680
|
-
it(
|
|
681
|
-
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: [
|
|
710
|
+
it('should be no-op if not shared with email', async () => {
|
|
711
|
+
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['non-existing-email'] });
|
|
682
712
|
expect(sharingInfo).toEqual({
|
|
683
713
|
protonInvitations: [invitation],
|
|
684
714
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -690,10 +720,9 @@ describe("SharingManagement", () => {
|
|
|
690
720
|
expect(apiService.deleteExternalInvitation).not.toHaveBeenCalled();
|
|
691
721
|
expect(apiService.removeMember).not.toHaveBeenCalled();
|
|
692
722
|
expect(apiService.removePublicLink).not.toHaveBeenCalled();
|
|
693
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
694
723
|
});
|
|
695
|
-
it(
|
|
696
|
-
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { publicLink:
|
|
724
|
+
it('should remove public link', async () => {
|
|
725
|
+
const sharingInfo = await sharingManagement.unshareNode(nodeUid, { publicLink: 'remove' });
|
|
697
726
|
expect(sharingInfo).toEqual({
|
|
698
727
|
protonInvitations: [invitation],
|
|
699
728
|
nonProtonInvitations: [externalInvitation],
|
|
@@ -705,9 +734,8 @@ describe("SharingManagement", () => {
|
|
|
705
734
|
expect(apiService.deleteExternalInvitation).not.toHaveBeenCalled();
|
|
706
735
|
expect(apiService.removeMember).not.toHaveBeenCalled();
|
|
707
736
|
expect(apiService.removePublicLink).toHaveBeenCalled();
|
|
708
|
-
expect(nodesEvents.nodeUpdated).not.toHaveBeenCalled();
|
|
709
737
|
});
|
|
710
|
-
it(
|
|
738
|
+
it('should remove share if all is removed', async () => {
|
|
711
739
|
const sharingInfo = await sharingManagement.unshareNode(nodeUid);
|
|
712
740
|
expect(sharingInfo).toEqual(undefined);
|
|
713
741
|
expect(apiService.deleteShare).toHaveBeenCalled();
|
|
@@ -715,16 +743,12 @@ describe("SharingManagement", () => {
|
|
|
715
743
|
expect(apiService.deleteExternalInvitation).not.toHaveBeenCalled();
|
|
716
744
|
expect(apiService.removeMember).not.toHaveBeenCalled();
|
|
717
745
|
expect(apiService.removePublicLink).not.toHaveBeenCalled();
|
|
718
|
-
expect(
|
|
719
|
-
uid: nodeUid,
|
|
720
|
-
shareId: undefined,
|
|
721
|
-
isShared: false,
|
|
722
|
-
});
|
|
746
|
+
expect(nodesService.notifyNodeChanged).toHaveBeenCalled();
|
|
723
747
|
});
|
|
724
|
-
it(
|
|
748
|
+
it('should remove share if everything is manually removed', async () => {
|
|
725
749
|
const sharingInfo = await sharingManagement.unshareNode(nodeUid, {
|
|
726
|
-
users: [
|
|
727
|
-
publicLink:
|
|
750
|
+
users: ['internal-email', 'external-email', 'member-email'],
|
|
751
|
+
publicLink: 'remove',
|
|
728
752
|
});
|
|
729
753
|
expect(sharingInfo).toEqual(undefined);
|
|
730
754
|
expect(apiService.deleteShare).toHaveBeenCalled();
|
|
@@ -732,26 +756,21 @@ describe("SharingManagement", () => {
|
|
|
732
756
|
expect(apiService.deleteExternalInvitation).toHaveBeenCalled();
|
|
733
757
|
expect(apiService.removeMember).toHaveBeenCalled();
|
|
734
758
|
expect(apiService.removePublicLink).toHaveBeenCalled();
|
|
735
|
-
expect(nodesEvents.nodeUpdated).toHaveBeenCalledWith({
|
|
736
|
-
uid: nodeUid,
|
|
737
|
-
shareId: undefined,
|
|
738
|
-
isShared: false,
|
|
739
|
-
});
|
|
740
759
|
});
|
|
741
760
|
});
|
|
742
|
-
describe(
|
|
743
|
-
const nodeUid =
|
|
761
|
+
describe('resendInvitationEmail', () => {
|
|
762
|
+
const nodeUid = 'volumeId~nodeUid';
|
|
744
763
|
const invitation = {
|
|
745
|
-
uid:
|
|
746
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
747
|
-
inviteeEmail:
|
|
764
|
+
uid: 'invitation',
|
|
765
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
766
|
+
inviteeEmail: 'internal-email',
|
|
748
767
|
role: interface_1.MemberRole.Viewer,
|
|
749
768
|
invitationTime: new Date(),
|
|
750
769
|
};
|
|
751
770
|
const externalInvitation = {
|
|
752
|
-
uid:
|
|
753
|
-
addedByEmail: (0, interface_1.resultOk)(
|
|
754
|
-
inviteeEmail:
|
|
771
|
+
uid: 'external-invitation',
|
|
772
|
+
addedByEmail: (0, interface_1.resultOk)('added-email'),
|
|
773
|
+
inviteeEmail: 'external-email',
|
|
755
774
|
role: interface_1.MemberRole.Viewer,
|
|
756
775
|
invitationTime: new Date(),
|
|
757
776
|
state: interface_1.NonProtonInvitationState.Pending,
|
|
@@ -762,24 +781,24 @@ describe("SharingManagement", () => {
|
|
|
762
781
|
apiService.getShareMembers = jest.fn().mockResolvedValue([]);
|
|
763
782
|
apiService.getPublicLink = jest.fn().mockResolvedValue(undefined);
|
|
764
783
|
});
|
|
765
|
-
it(
|
|
784
|
+
it('should resend email for proton invitation', async () => {
|
|
766
785
|
await sharingManagement.resendInvitationEmail(nodeUid, invitation.uid);
|
|
767
786
|
expect(apiService.resendInvitationEmail).toHaveBeenCalledWith(invitation.uid);
|
|
768
787
|
expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();
|
|
769
788
|
});
|
|
770
|
-
it(
|
|
789
|
+
it('should resend email for external invitation', async () => {
|
|
771
790
|
await sharingManagement.resendInvitationEmail(nodeUid, externalInvitation.uid);
|
|
772
791
|
expect(apiService.resendExternalInvitationEmail).toHaveBeenCalledWith(externalInvitation.uid);
|
|
773
792
|
expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
|
|
774
793
|
});
|
|
775
|
-
it(
|
|
794
|
+
it('should throw error when no sharing found for node', async () => {
|
|
776
795
|
nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid, shareId: undefined });
|
|
777
|
-
await expect(sharingManagement.resendInvitationEmail(nodeUid, invitation.uid)).rejects.toThrow(
|
|
796
|
+
await expect(sharingManagement.resendInvitationEmail(nodeUid, invitation.uid)).rejects.toThrow('Node is not shared');
|
|
778
797
|
expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
|
|
779
798
|
expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();
|
|
780
799
|
});
|
|
781
|
-
it(
|
|
782
|
-
await expect(sharingManagement.resendInvitationEmail(nodeUid,
|
|
800
|
+
it('should log when no invitation found', async () => {
|
|
801
|
+
await expect(sharingManagement.resendInvitationEmail(nodeUid, 'non-existent-uid')).rejects.toThrow('Invitation not found');
|
|
783
802
|
expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
|
|
784
803
|
expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();
|
|
785
804
|
});
|