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