@protontech/drive-sdk 0.1.0 → 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/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 +1 -1
- package/dist/internal/events/eventManager.js +0 -1
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +34 -25
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +6 -6
- 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.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 +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 +4 -4
- package/dist/internal/sharing/events.js +0 -1
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +39 -40
- 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 +3 -3
- package/dist/internal/upload/manager.d.ts +4 -4
- package/dist/internal/upload/manager.js +7 -5
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +137 -123
- 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 +8 -6
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +16 -11
- 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.js +4 -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 +51 -46
- package/src/internal/events/eventManager.ts +6 -5
- package/src/internal/events/index.ts +24 -14
- 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 +7 -5
- 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 +2 -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 +45 -49
- package/src/internal/sharing/events.ts +9 -6
- 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 +78 -78
- package/src/internal/upload/manager.test.ts +170 -153
- package/src/internal/upload/manager.ts +59 -35
- 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 +27 -21
- package/src/version.ts +0 -1
|
@@ -4,7 +4,7 @@ const crypto_1 = require("../../crypto");
|
|
|
4
4
|
const interface_1 = require("../../interface");
|
|
5
5
|
const telemetry_1 = require("../../tests/telemetry");
|
|
6
6
|
const cryptoService_1 = require("./cryptoService");
|
|
7
|
-
describe(
|
|
7
|
+
describe('nodesCryptoService', () => {
|
|
8
8
|
let telemetry;
|
|
9
9
|
let driveCrypto;
|
|
10
10
|
let account;
|
|
@@ -15,13 +15,13 @@ describe("nodesCryptoService", () => {
|
|
|
15
15
|
telemetry = (0, telemetry_1.getMockTelemetry)();
|
|
16
16
|
driveCrypto = {
|
|
17
17
|
decryptKey: jest.fn(async () => Promise.resolve({
|
|
18
|
-
passphrase:
|
|
19
|
-
key:
|
|
20
|
-
passphraseSessionKey:
|
|
18
|
+
passphrase: 'pass',
|
|
19
|
+
key: 'decryptedKey',
|
|
20
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
21
21
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
22
22
|
})),
|
|
23
23
|
decryptNodeName: jest.fn(async () => Promise.resolve({
|
|
24
|
-
name:
|
|
24
|
+
name: 'name',
|
|
25
25
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
26
26
|
})),
|
|
27
27
|
decryptNodeHashKey: jest.fn(async () => Promise.resolve({
|
|
@@ -29,15 +29,15 @@ describe("nodesCryptoService", () => {
|
|
|
29
29
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
30
30
|
})),
|
|
31
31
|
decryptExtendedAttributes: jest.fn(async () => Promise.resolve({
|
|
32
|
-
extendedAttributes:
|
|
32
|
+
extendedAttributes: '{}',
|
|
33
33
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
34
34
|
})),
|
|
35
35
|
encryptNodeName: jest.fn(async () => Promise.resolve({
|
|
36
|
-
armoredNodeName:
|
|
36
|
+
armoredNodeName: 'armoredName',
|
|
37
37
|
})),
|
|
38
38
|
// @ts-expect-error No need to implement all methods for mocking
|
|
39
39
|
decryptAndVerifySessionKey: jest.fn(async () => Promise.resolve({
|
|
40
|
-
sessionKey:
|
|
40
|
+
sessionKey: 'contentKeyPacketSessionKey',
|
|
41
41
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
42
42
|
})),
|
|
43
43
|
};
|
|
@@ -48,19 +48,19 @@ describe("nodesCryptoService", () => {
|
|
|
48
48
|
// @ts-expect-error No need to implement all methods for mocking
|
|
49
49
|
sharesService = {
|
|
50
50
|
getMyFilesShareMemberEmailKey: jest.fn(async () => ({
|
|
51
|
-
email:
|
|
52
|
-
addressKey:
|
|
51
|
+
email: 'email',
|
|
52
|
+
addressKey: 'key',
|
|
53
53
|
})),
|
|
54
54
|
getVolumeMetricContext: jest.fn().mockResolvedValue('own_volume'),
|
|
55
55
|
};
|
|
56
56
|
cryptoService = new cryptoService_1.NodesCryptoService(telemetry, driveCrypto, account, sharesService);
|
|
57
57
|
});
|
|
58
|
-
const parentKey =
|
|
58
|
+
const parentKey = 'parentKey';
|
|
59
59
|
function verifyLogEventVerificationError(options = {}) {
|
|
60
60
|
expect(telemetry.logEvent).toHaveBeenCalledTimes(1);
|
|
61
61
|
expect(telemetry.logEvent).toHaveBeenCalledWith({
|
|
62
|
-
eventName:
|
|
63
|
-
volumeType:
|
|
62
|
+
eventName: 'verificationError',
|
|
63
|
+
volumeType: 'own_volume',
|
|
64
64
|
fromBefore2024: false,
|
|
65
65
|
addressMatchingDefaultShare: false,
|
|
66
66
|
...options,
|
|
@@ -69,132 +69,143 @@ describe("nodesCryptoService", () => {
|
|
|
69
69
|
function verifyLogEventDecryptionError(options = {}) {
|
|
70
70
|
expect(telemetry.logEvent).toHaveBeenCalledTimes(1);
|
|
71
71
|
expect(telemetry.logEvent).toHaveBeenCalledWith({
|
|
72
|
-
eventName:
|
|
73
|
-
volumeType:
|
|
72
|
+
eventName: 'decryptionError',
|
|
73
|
+
volumeType: 'own_volume',
|
|
74
74
|
fromBefore2024: false,
|
|
75
75
|
...options,
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
|
-
describe(
|
|
78
|
+
describe('folder node', () => {
|
|
79
79
|
const encryptedNode = {
|
|
80
|
-
uid:
|
|
81
|
-
parentUid:
|
|
80
|
+
uid: 'volumeId~nodeId',
|
|
81
|
+
parentUid: 'volumeId~parentId',
|
|
82
82
|
encryptedCrypto: {
|
|
83
|
-
signatureEmail:
|
|
84
|
-
nameSignatureEmail:
|
|
85
|
-
armoredKey:
|
|
86
|
-
armoredNodePassphrase:
|
|
87
|
-
armoredNodePassphraseSignature:
|
|
83
|
+
signatureEmail: 'signatureEmail',
|
|
84
|
+
nameSignatureEmail: 'nameSignatureEmail',
|
|
85
|
+
armoredKey: 'armoredKey',
|
|
86
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
87
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
88
88
|
folder: {
|
|
89
|
-
armoredHashKey:
|
|
90
|
-
armoredExtendedAttributes:
|
|
89
|
+
armoredHashKey: 'armoredHashKey',
|
|
90
|
+
armoredExtendedAttributes: 'folderArmoredExtendedAttributes',
|
|
91
91
|
},
|
|
92
92
|
},
|
|
93
93
|
};
|
|
94
94
|
function verifyResult(result, expectedNode = {}, expectedKeys = {}) {
|
|
95
95
|
expect(result).toMatchObject({
|
|
96
96
|
node: {
|
|
97
|
-
name: { ok: true, value:
|
|
98
|
-
keyAuthor: { ok: true, value:
|
|
99
|
-
nameAuthor: { ok: true, value:
|
|
97
|
+
name: { ok: true, value: 'name' },
|
|
98
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
99
|
+
nameAuthor: { ok: true, value: 'nameSignatureEmail' },
|
|
100
100
|
folder: {
|
|
101
|
-
extendedAttributes:
|
|
101
|
+
extendedAttributes: '{}',
|
|
102
102
|
},
|
|
103
103
|
activeRevision: undefined,
|
|
104
104
|
errors: undefined,
|
|
105
105
|
...expectedNode,
|
|
106
106
|
},
|
|
107
|
-
...expectedKeys === 'noKeys'
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
107
|
+
...(expectedKeys === 'noKeys'
|
|
108
|
+
? {}
|
|
109
|
+
: {
|
|
110
|
+
keys: {
|
|
111
|
+
passphrase: 'pass',
|
|
112
|
+
key: 'decryptedKey',
|
|
113
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
114
|
+
hashKey: new Uint8Array(),
|
|
115
|
+
...expectedKeys,
|
|
116
|
+
},
|
|
117
|
+
}),
|
|
116
118
|
});
|
|
117
119
|
}
|
|
118
|
-
describe(
|
|
119
|
-
it(
|
|
120
|
+
describe('should decrypt successfuly', () => {
|
|
121
|
+
it('same author everywhere', async () => {
|
|
120
122
|
const encryptedNode = {
|
|
121
123
|
encryptedCrypto: {
|
|
122
|
-
signatureEmail:
|
|
123
|
-
nameSignatureEmail:
|
|
124
|
-
armoredKey:
|
|
125
|
-
armoredNodePassphrase:
|
|
126
|
-
armoredNodePassphraseSignature:
|
|
124
|
+
signatureEmail: 'signatureEmail',
|
|
125
|
+
nameSignatureEmail: 'signatureEmail',
|
|
126
|
+
armoredKey: 'armoredKey',
|
|
127
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
128
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
127
129
|
folder: {
|
|
128
|
-
armoredHashKey:
|
|
129
|
-
armoredExtendedAttributes:
|
|
130
|
+
armoredHashKey: 'armoredHashKey',
|
|
131
|
+
armoredExtendedAttributes: 'folderArmoredExtendedAttributes',
|
|
130
132
|
},
|
|
131
133
|
},
|
|
132
134
|
};
|
|
133
135
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
134
136
|
verifyResult(result, {
|
|
135
|
-
keyAuthor: { ok: true, value:
|
|
136
|
-
nameAuthor: { ok: true, value:
|
|
137
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
138
|
+
nameAuthor: { ok: true, value: 'signatureEmail' },
|
|
137
139
|
});
|
|
138
140
|
expect(account.getPublicKeys).toHaveBeenCalledTimes(1);
|
|
139
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
141
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
140
142
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
141
143
|
});
|
|
142
|
-
it(
|
|
144
|
+
it('different authors on key and name', async () => {
|
|
143
145
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
144
146
|
verifyResult(result);
|
|
145
147
|
expect(account.getPublicKeys).toHaveBeenCalledTimes(2);
|
|
146
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
147
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
148
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
149
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('nameSignatureEmail');
|
|
148
150
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
149
151
|
});
|
|
150
152
|
});
|
|
151
|
-
describe(
|
|
152
|
-
it(
|
|
153
|
+
describe('should decrypt with verification issues', () => {
|
|
154
|
+
it('on node key', async () => {
|
|
153
155
|
driveCrypto.decryptKey = jest.fn(async () => Promise.resolve({
|
|
154
|
-
passphrase:
|
|
155
|
-
key:
|
|
156
|
-
passphraseSessionKey:
|
|
156
|
+
passphrase: 'pass',
|
|
157
|
+
key: 'decryptedKey',
|
|
158
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
157
159
|
verified: crypto_1.VERIFICATION_STATUS.NOT_SIGNED,
|
|
158
160
|
}));
|
|
159
161
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
160
162
|
verifyResult(result, {
|
|
161
|
-
keyAuthor: {
|
|
163
|
+
keyAuthor: {
|
|
164
|
+
ok: false,
|
|
165
|
+
error: { claimedAuthor: 'signatureEmail', error: 'Missing signature for key' },
|
|
166
|
+
},
|
|
162
167
|
});
|
|
163
168
|
verifyLogEventVerificationError({
|
|
164
169
|
field: 'nodeKey',
|
|
165
170
|
});
|
|
166
171
|
});
|
|
167
|
-
it(
|
|
172
|
+
it('on node name', async () => {
|
|
168
173
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.resolve({
|
|
169
|
-
name:
|
|
174
|
+
name: 'name',
|
|
170
175
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
171
176
|
}));
|
|
172
177
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
173
178
|
verifyResult(result, {
|
|
174
|
-
nameAuthor: {
|
|
179
|
+
nameAuthor: {
|
|
180
|
+
ok: false,
|
|
181
|
+
error: { claimedAuthor: 'nameSignatureEmail', error: 'Signature verification for name failed' },
|
|
182
|
+
},
|
|
175
183
|
});
|
|
176
184
|
verifyLogEventVerificationError({
|
|
177
185
|
field: 'nodeName',
|
|
178
186
|
});
|
|
179
187
|
});
|
|
180
|
-
it(
|
|
188
|
+
it('on hash key', async () => {
|
|
181
189
|
driveCrypto.decryptNodeHashKey = jest.fn(async () => Promise.resolve({
|
|
182
190
|
hashKey: new Uint8Array(),
|
|
183
191
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
184
192
|
}));
|
|
185
193
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
186
194
|
verifyResult(result, {
|
|
187
|
-
keyAuthor: {
|
|
195
|
+
keyAuthor: {
|
|
196
|
+
ok: false,
|
|
197
|
+
error: { claimedAuthor: 'signatureEmail', error: 'Signature verification for hash key failed' },
|
|
198
|
+
},
|
|
188
199
|
});
|
|
189
200
|
verifyLogEventVerificationError({
|
|
190
201
|
field: 'nodeHashKey',
|
|
191
202
|
});
|
|
192
203
|
});
|
|
193
|
-
it(
|
|
204
|
+
it('on node key and hash key reports error from node key', async () => {
|
|
194
205
|
driveCrypto.decryptKey = jest.fn(async () => Promise.resolve({
|
|
195
|
-
passphrase:
|
|
196
|
-
key:
|
|
197
|
-
passphraseSessionKey:
|
|
206
|
+
passphrase: 'pass',
|
|
207
|
+
key: 'decryptedKey',
|
|
208
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
198
209
|
verified: crypto_1.VERIFICATION_STATUS.NOT_SIGNED,
|
|
199
210
|
}));
|
|
200
211
|
driveCrypto.decryptNodeHashKey = jest.fn(async () => Promise.resolve({
|
|
@@ -203,34 +214,49 @@ describe("nodesCryptoService", () => {
|
|
|
203
214
|
}));
|
|
204
215
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
205
216
|
verifyResult(result, {
|
|
206
|
-
keyAuthor: {
|
|
217
|
+
keyAuthor: {
|
|
218
|
+
ok: false,
|
|
219
|
+
error: { claimedAuthor: 'signatureEmail', error: 'Missing signature for key' },
|
|
220
|
+
},
|
|
207
221
|
});
|
|
208
222
|
verifyLogEventVerificationError({
|
|
209
223
|
field: 'nodeKey',
|
|
210
224
|
});
|
|
211
225
|
});
|
|
212
|
-
it(
|
|
226
|
+
it('on folder extended attributes', async () => {
|
|
213
227
|
driveCrypto.decryptExtendedAttributes = jest.fn(async () => Promise.resolve({
|
|
214
|
-
extendedAttributes:
|
|
228
|
+
extendedAttributes: '{}',
|
|
215
229
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
216
230
|
}));
|
|
217
231
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
218
232
|
verifyResult(result, {
|
|
219
|
-
keyAuthor: {
|
|
233
|
+
keyAuthor: {
|
|
234
|
+
ok: false,
|
|
235
|
+
error: {
|
|
236
|
+
claimedAuthor: 'signatureEmail',
|
|
237
|
+
error: 'Signature verification for attributes failed',
|
|
238
|
+
},
|
|
239
|
+
},
|
|
220
240
|
});
|
|
221
241
|
verifyLogEventVerificationError({
|
|
222
242
|
field: 'nodeExtendedAttributes',
|
|
223
243
|
});
|
|
224
244
|
});
|
|
225
245
|
});
|
|
226
|
-
describe(
|
|
227
|
-
it(
|
|
228
|
-
const error = new Error(
|
|
246
|
+
describe('should decrypt with decryption issues', () => {
|
|
247
|
+
it('on node key', async () => {
|
|
248
|
+
const error = new Error('Decryption error');
|
|
229
249
|
driveCrypto.decryptKey = jest.fn(async () => Promise.reject(error));
|
|
230
250
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
231
251
|
verifyResult(result, {
|
|
232
|
-
keyAuthor: {
|
|
233
|
-
|
|
252
|
+
keyAuthor: {
|
|
253
|
+
ok: false,
|
|
254
|
+
error: {
|
|
255
|
+
claimedAuthor: 'signatureEmail',
|
|
256
|
+
error: 'Failed to decrypt node key: Decryption error',
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
errors: [new Error('Decryption error')],
|
|
234
260
|
folder: undefined,
|
|
235
261
|
}, 'noKeys');
|
|
236
262
|
verifyLogEventDecryptionError({
|
|
@@ -238,21 +264,24 @@ describe("nodesCryptoService", () => {
|
|
|
238
264
|
error,
|
|
239
265
|
});
|
|
240
266
|
});
|
|
241
|
-
it(
|
|
242
|
-
const error = new Error(
|
|
267
|
+
it('on node name', async () => {
|
|
268
|
+
const error = new Error('Decryption error');
|
|
243
269
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.reject(error));
|
|
244
270
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
245
271
|
verifyResult(result, {
|
|
246
272
|
name: { ok: false, error },
|
|
247
|
-
nameAuthor: {
|
|
273
|
+
nameAuthor: {
|
|
274
|
+
ok: false,
|
|
275
|
+
error: { claimedAuthor: 'nameSignatureEmail', error: 'Decryption error' },
|
|
276
|
+
},
|
|
248
277
|
}, 'noKeys');
|
|
249
278
|
verifyLogEventDecryptionError({
|
|
250
279
|
field: 'nodeName',
|
|
251
280
|
error,
|
|
252
281
|
});
|
|
253
282
|
});
|
|
254
|
-
it(
|
|
255
|
-
const error = new Error(
|
|
283
|
+
it('on hash key', async () => {
|
|
284
|
+
const error = new Error('Decryption error');
|
|
256
285
|
driveCrypto.decryptNodeHashKey = jest.fn(async () => Promise.reject(error));
|
|
257
286
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
258
287
|
verifyResult(result, {
|
|
@@ -263,8 +292,8 @@ describe("nodesCryptoService", () => {
|
|
|
263
292
|
error,
|
|
264
293
|
});
|
|
265
294
|
});
|
|
266
|
-
it(
|
|
267
|
-
const error = new Error(
|
|
295
|
+
it('on folder extended attributes', async () => {
|
|
296
|
+
const error = new Error('Decryption error');
|
|
268
297
|
driveCrypto.decryptExtendedAttributes = jest.fn(async () => Promise.reject(error));
|
|
269
298
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
270
299
|
verifyResult(result, {
|
|
@@ -277,187 +306,216 @@ describe("nodesCryptoService", () => {
|
|
|
277
306
|
});
|
|
278
307
|
});
|
|
279
308
|
});
|
|
280
|
-
it(
|
|
281
|
-
account.getPublicKeys = jest.fn().mockRejectedValue(new Error(
|
|
309
|
+
it('should fail when keys cannot be loaded', async () => {
|
|
310
|
+
account.getPublicKeys = jest.fn().mockRejectedValue(new Error('Failed to load keys'));
|
|
282
311
|
const result = cryptoService.decryptNode(encryptedNode, parentKey);
|
|
283
|
-
await expect(result).rejects.toThrow(
|
|
312
|
+
await expect(result).rejects.toThrow('Failed to load keys');
|
|
284
313
|
});
|
|
285
314
|
});
|
|
286
|
-
describe(
|
|
315
|
+
describe('file node', () => {
|
|
287
316
|
const encryptedNode = {
|
|
288
|
-
uid:
|
|
289
|
-
parentUid:
|
|
317
|
+
uid: 'volumeId~nodeId',
|
|
318
|
+
parentUid: 'volumeId~parentId',
|
|
290
319
|
encryptedCrypto: {
|
|
291
|
-
signatureEmail:
|
|
292
|
-
nameSignatureEmail:
|
|
293
|
-
armoredKey:
|
|
294
|
-
armoredNodePassphrase:
|
|
295
|
-
armoredNodePassphraseSignature:
|
|
320
|
+
signatureEmail: 'signatureEmail',
|
|
321
|
+
nameSignatureEmail: 'nameSignatureEmail',
|
|
322
|
+
armoredKey: 'armoredKey',
|
|
323
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
324
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
296
325
|
file: {
|
|
297
|
-
base64ContentKeyPacket:
|
|
326
|
+
base64ContentKeyPacket: 'base64ContentKeyPacket',
|
|
298
327
|
},
|
|
299
328
|
activeRevision: {
|
|
300
|
-
uid:
|
|
301
|
-
state:
|
|
302
|
-
signatureEmail:
|
|
303
|
-
armoredExtendedAttributes:
|
|
329
|
+
uid: 'revisionUid',
|
|
330
|
+
state: 'active',
|
|
331
|
+
signatureEmail: 'revisionSignatureEmail',
|
|
332
|
+
armoredExtendedAttributes: 'encryptedExtendedAttributes',
|
|
304
333
|
},
|
|
305
334
|
},
|
|
306
335
|
};
|
|
307
336
|
function verifyResult(result, expectedNode = {}, expectedKeys = {}) {
|
|
308
337
|
expect(result).toMatchObject({
|
|
309
338
|
node: {
|
|
310
|
-
name: { ok: true, value:
|
|
311
|
-
keyAuthor: { ok: true, value:
|
|
312
|
-
nameAuthor: { ok: true, value:
|
|
339
|
+
name: { ok: true, value: 'name' },
|
|
340
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
341
|
+
nameAuthor: { ok: true, value: 'nameSignatureEmail' },
|
|
313
342
|
folder: undefined,
|
|
314
343
|
activeRevision: {
|
|
315
|
-
ok: true,
|
|
316
|
-
|
|
344
|
+
ok: true,
|
|
345
|
+
value: {
|
|
346
|
+
uid: 'revisionUid',
|
|
317
347
|
state: interface_1.RevisionState.Active,
|
|
318
348
|
creationTime: undefined,
|
|
319
|
-
extendedAttributes:
|
|
320
|
-
contentAuthor: { ok: true, value:
|
|
321
|
-
}
|
|
349
|
+
extendedAttributes: '{}',
|
|
350
|
+
contentAuthor: { ok: true, value: 'revisionSignatureEmail' },
|
|
351
|
+
},
|
|
322
352
|
},
|
|
323
353
|
errors: undefined,
|
|
324
354
|
...expectedNode,
|
|
325
355
|
},
|
|
326
|
-
...expectedKeys === 'noKeys'
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
356
|
+
...(expectedKeys === 'noKeys'
|
|
357
|
+
? {}
|
|
358
|
+
: {
|
|
359
|
+
keys: {
|
|
360
|
+
passphrase: 'pass',
|
|
361
|
+
key: 'decryptedKey',
|
|
362
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
363
|
+
hashKey: undefined,
|
|
364
|
+
contentKeyPacketSessionKey: 'contentKeyPacketSessionKey',
|
|
365
|
+
...expectedKeys,
|
|
366
|
+
},
|
|
367
|
+
}),
|
|
336
368
|
});
|
|
337
369
|
}
|
|
338
|
-
describe(
|
|
339
|
-
it(
|
|
370
|
+
describe('should decrypt successfuly', () => {
|
|
371
|
+
it('same author everywhere', async () => {
|
|
340
372
|
const encryptedNode = {
|
|
341
373
|
encryptedCrypto: {
|
|
342
|
-
signatureEmail:
|
|
343
|
-
nameSignatureEmail:
|
|
344
|
-
armoredKey:
|
|
345
|
-
armoredNodePassphrase:
|
|
346
|
-
armoredNodePassphraseSignature:
|
|
374
|
+
signatureEmail: 'signatureEmail',
|
|
375
|
+
nameSignatureEmail: 'signatureEmail',
|
|
376
|
+
armoredKey: 'armoredKey',
|
|
377
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
378
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
347
379
|
file: {
|
|
348
|
-
base64ContentKeyPacket:
|
|
380
|
+
base64ContentKeyPacket: 'base64ContentKeyPacket',
|
|
349
381
|
},
|
|
350
382
|
activeRevision: {
|
|
351
|
-
uid:
|
|
352
|
-
state:
|
|
353
|
-
signatureEmail:
|
|
354
|
-
armoredExtendedAttributes:
|
|
383
|
+
uid: 'revisionUid',
|
|
384
|
+
state: 'active',
|
|
385
|
+
signatureEmail: 'signatureEmail',
|
|
386
|
+
armoredExtendedAttributes: 'encryptedExtendedAttributes',
|
|
355
387
|
},
|
|
356
388
|
},
|
|
357
389
|
};
|
|
358
390
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
359
391
|
verifyResult(result, {
|
|
360
|
-
keyAuthor: { ok: true, value:
|
|
361
|
-
nameAuthor: { ok: true, value:
|
|
392
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
393
|
+
nameAuthor: { ok: true, value: 'signatureEmail' },
|
|
362
394
|
activeRevision: {
|
|
363
|
-
ok: true,
|
|
364
|
-
|
|
395
|
+
ok: true,
|
|
396
|
+
value: {
|
|
397
|
+
uid: 'revisionUid',
|
|
365
398
|
state: interface_1.RevisionState.Active,
|
|
366
399
|
// @ts-expect-error Ignore mocked data.
|
|
367
400
|
creationTime: undefined,
|
|
368
|
-
extendedAttributes:
|
|
369
|
-
contentAuthor: { ok: true, value:
|
|
370
|
-
}
|
|
401
|
+
extendedAttributes: '{}',
|
|
402
|
+
contentAuthor: { ok: true, value: 'signatureEmail' },
|
|
403
|
+
},
|
|
371
404
|
},
|
|
372
405
|
});
|
|
373
406
|
expect(account.getPublicKeys).toHaveBeenCalledTimes(2); // node + revision
|
|
374
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
407
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
375
408
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
376
409
|
});
|
|
377
|
-
it(
|
|
410
|
+
it('different authors on key and name', async () => {
|
|
378
411
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
379
412
|
verifyResult(result);
|
|
380
413
|
expect(account.getPublicKeys).toHaveBeenCalledTimes(3);
|
|
381
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
382
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
383
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
414
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
415
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('nameSignatureEmail');
|
|
416
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('revisionSignatureEmail');
|
|
384
417
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
385
418
|
});
|
|
386
419
|
});
|
|
387
|
-
describe(
|
|
388
|
-
it(
|
|
420
|
+
describe('should decrypt with verification issues', () => {
|
|
421
|
+
it('on node key', async () => {
|
|
389
422
|
driveCrypto.decryptKey = jest.fn(async () => Promise.resolve({
|
|
390
|
-
passphrase:
|
|
391
|
-
key:
|
|
392
|
-
passphraseSessionKey:
|
|
423
|
+
passphrase: 'pass',
|
|
424
|
+
key: 'decryptedKey',
|
|
425
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
393
426
|
verified: crypto_1.VERIFICATION_STATUS.NOT_SIGNED,
|
|
394
427
|
}));
|
|
395
428
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
396
429
|
verifyResult(result, {
|
|
397
|
-
keyAuthor: {
|
|
430
|
+
keyAuthor: {
|
|
431
|
+
ok: false,
|
|
432
|
+
error: { claimedAuthor: 'signatureEmail', error: 'Missing signature for key' },
|
|
433
|
+
},
|
|
398
434
|
});
|
|
399
435
|
verifyLogEventVerificationError({
|
|
400
436
|
field: 'nodeKey',
|
|
401
437
|
});
|
|
402
438
|
});
|
|
403
|
-
it(
|
|
439
|
+
it('on node name', async () => {
|
|
404
440
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.resolve({
|
|
405
|
-
name:
|
|
441
|
+
name: 'name',
|
|
406
442
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
407
443
|
}));
|
|
408
444
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
409
445
|
verifyResult(result, {
|
|
410
|
-
nameAuthor: {
|
|
446
|
+
nameAuthor: {
|
|
447
|
+
ok: false,
|
|
448
|
+
error: { claimedAuthor: 'nameSignatureEmail', error: 'Signature verification for name failed' },
|
|
449
|
+
},
|
|
411
450
|
});
|
|
412
451
|
verifyLogEventVerificationError({
|
|
413
452
|
field: 'nodeName',
|
|
414
453
|
});
|
|
415
454
|
});
|
|
416
|
-
it(
|
|
455
|
+
it('on folder extended attributes', async () => {
|
|
417
456
|
driveCrypto.decryptExtendedAttributes = jest.fn(async () => Promise.resolve({
|
|
418
|
-
extendedAttributes:
|
|
457
|
+
extendedAttributes: '{}',
|
|
419
458
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
420
459
|
}));
|
|
421
460
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
422
461
|
verifyResult(result, {
|
|
423
462
|
activeRevision: {
|
|
424
|
-
ok: true,
|
|
425
|
-
|
|
426
|
-
|
|
463
|
+
ok: true,
|
|
464
|
+
value: {
|
|
465
|
+
uid: 'revisionUid',
|
|
466
|
+
extendedAttributes: '{}',
|
|
427
467
|
state: interface_1.RevisionState.Active,
|
|
428
468
|
// @ts-expect-error Ignore mocked data.
|
|
429
469
|
creationTime: undefined,
|
|
430
|
-
contentAuthor: {
|
|
431
|
-
|
|
470
|
+
contentAuthor: {
|
|
471
|
+
ok: false,
|
|
472
|
+
error: {
|
|
473
|
+
claimedAuthor: 'revisionSignatureEmail',
|
|
474
|
+
error: 'Signature verification for attributes failed',
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
},
|
|
432
478
|
},
|
|
433
479
|
});
|
|
434
480
|
verifyLogEventVerificationError({
|
|
435
481
|
field: 'nodeExtendedAttributes',
|
|
436
482
|
});
|
|
437
483
|
});
|
|
438
|
-
it(
|
|
484
|
+
it('on content key packet', async () => {
|
|
439
485
|
driveCrypto.decryptAndVerifySessionKey = jest.fn(async () => Promise.resolve({
|
|
440
|
-
sessionKey:
|
|
486
|
+
sessionKey: 'contentKeyPacketSessionKey',
|
|
441
487
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
442
488
|
}));
|
|
443
489
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
444
490
|
verifyResult(result, {
|
|
445
|
-
keyAuthor: {
|
|
491
|
+
keyAuthor: {
|
|
492
|
+
ok: false,
|
|
493
|
+
error: {
|
|
494
|
+
claimedAuthor: 'signatureEmail',
|
|
495
|
+
error: 'Signature verification for content key failed',
|
|
496
|
+
},
|
|
497
|
+
},
|
|
446
498
|
});
|
|
447
499
|
verifyLogEventVerificationError({
|
|
448
500
|
field: 'nodeContentKey',
|
|
449
501
|
});
|
|
450
502
|
});
|
|
451
503
|
});
|
|
452
|
-
describe(
|
|
453
|
-
it(
|
|
454
|
-
const error = new Error(
|
|
504
|
+
describe('should decrypt with decryption issues', () => {
|
|
505
|
+
it('on node key', async () => {
|
|
506
|
+
const error = new Error('Decryption error');
|
|
455
507
|
driveCrypto.decryptKey = jest.fn(async () => Promise.reject(error));
|
|
456
508
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
457
509
|
verifyResult(result, {
|
|
458
|
-
keyAuthor: {
|
|
510
|
+
keyAuthor: {
|
|
511
|
+
ok: false,
|
|
512
|
+
error: {
|
|
513
|
+
claimedAuthor: 'signatureEmail',
|
|
514
|
+
error: 'Failed to decrypt node key: Decryption error',
|
|
515
|
+
},
|
|
516
|
+
},
|
|
459
517
|
activeRevision: { ok: false, error: new Error('Failed to decrypt node key: Decryption error') },
|
|
460
|
-
errors: [new Error(
|
|
518
|
+
errors: [new Error('Decryption error')],
|
|
461
519
|
folder: undefined,
|
|
462
520
|
}, 'noKeys');
|
|
463
521
|
verifyLogEventDecryptionError({
|
|
@@ -465,37 +523,49 @@ describe("nodesCryptoService", () => {
|
|
|
465
523
|
error,
|
|
466
524
|
});
|
|
467
525
|
});
|
|
468
|
-
it(
|
|
469
|
-
const error = new Error(
|
|
526
|
+
it('on node name', async () => {
|
|
527
|
+
const error = new Error('Decryption error');
|
|
470
528
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.reject(error));
|
|
471
529
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
472
530
|
verifyResult(result, {
|
|
473
531
|
name: { ok: false, error },
|
|
474
|
-
nameAuthor: {
|
|
532
|
+
nameAuthor: {
|
|
533
|
+
ok: false,
|
|
534
|
+
error: { claimedAuthor: 'nameSignatureEmail', error: 'Decryption error' },
|
|
535
|
+
},
|
|
475
536
|
}, 'noKeys');
|
|
476
537
|
verifyLogEventDecryptionError({
|
|
477
538
|
field: 'nodeName',
|
|
478
539
|
error,
|
|
479
540
|
});
|
|
480
541
|
});
|
|
481
|
-
it(
|
|
482
|
-
const error = new Error(
|
|
542
|
+
it('on file extended attributes', async () => {
|
|
543
|
+
const error = new Error('Decryption error');
|
|
483
544
|
driveCrypto.decryptExtendedAttributes = jest.fn(async () => Promise.reject(error));
|
|
484
545
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
485
546
|
verifyResult(result, {
|
|
486
|
-
activeRevision: {
|
|
547
|
+
activeRevision: {
|
|
548
|
+
ok: false,
|
|
549
|
+
error: new Error('Failed to decrypt active revision: Decryption error'),
|
|
550
|
+
},
|
|
487
551
|
});
|
|
488
552
|
verifyLogEventDecryptionError({
|
|
489
553
|
field: 'nodeExtendedAttributes',
|
|
490
554
|
error,
|
|
491
555
|
});
|
|
492
556
|
});
|
|
493
|
-
it(
|
|
494
|
-
const error = new Error(
|
|
557
|
+
it('on content key packet', async () => {
|
|
558
|
+
const error = new Error('Decryption error');
|
|
495
559
|
driveCrypto.decryptAndVerifySessionKey = jest.fn(async () => Promise.reject(error));
|
|
496
560
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
497
561
|
verifyResult(result, {
|
|
498
|
-
keyAuthor: {
|
|
562
|
+
keyAuthor: {
|
|
563
|
+
ok: false,
|
|
564
|
+
error: {
|
|
565
|
+
claimedAuthor: 'signatureEmail',
|
|
566
|
+
error: 'Failed to decrypt content key: Decryption error',
|
|
567
|
+
},
|
|
568
|
+
},
|
|
499
569
|
errors: [error],
|
|
500
570
|
}, {
|
|
501
571
|
contentKeyPacketSessionKey: undefined,
|
|
@@ -506,64 +576,64 @@ describe("nodesCryptoService", () => {
|
|
|
506
576
|
});
|
|
507
577
|
});
|
|
508
578
|
});
|
|
509
|
-
it(
|
|
510
|
-
account.getPublicKeys = jest.fn().mockRejectedValue(new Error(
|
|
579
|
+
it('should fail when keys cannot be loaded', async () => {
|
|
580
|
+
account.getPublicKeys = jest.fn().mockRejectedValue(new Error('Failed to load keys'));
|
|
511
581
|
const result = cryptoService.decryptNode(encryptedNode, parentKey);
|
|
512
|
-
await expect(result).rejects.toThrow(
|
|
582
|
+
await expect(result).rejects.toThrow('Failed to load keys');
|
|
513
583
|
});
|
|
514
584
|
});
|
|
515
|
-
describe(
|
|
585
|
+
describe('album node', () => {
|
|
516
586
|
const encryptedNode = {
|
|
517
|
-
uid:
|
|
518
|
-
parentUid:
|
|
587
|
+
uid: 'volumeId~nodeId',
|
|
588
|
+
parentUid: 'volumeId~parentId',
|
|
519
589
|
encryptedCrypto: {
|
|
520
|
-
signatureEmail:
|
|
521
|
-
nameSignatureEmail:
|
|
522
|
-
armoredKey:
|
|
523
|
-
armoredNodePassphrase:
|
|
524
|
-
armoredNodePassphraseSignature:
|
|
590
|
+
signatureEmail: 'signatureEmail',
|
|
591
|
+
nameSignatureEmail: 'nameSignatureEmail',
|
|
592
|
+
armoredKey: 'armoredKey',
|
|
593
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
594
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
525
595
|
},
|
|
526
596
|
};
|
|
527
|
-
it(
|
|
597
|
+
it('should decrypt successfuly', async () => {
|
|
528
598
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
529
599
|
expect(result).toMatchObject({
|
|
530
600
|
node: {
|
|
531
|
-
name: { ok: true, value:
|
|
532
|
-
keyAuthor: { ok: true, value:
|
|
533
|
-
nameAuthor: { ok: true, value:
|
|
601
|
+
name: { ok: true, value: 'name' },
|
|
602
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
603
|
+
nameAuthor: { ok: true, value: 'nameSignatureEmail' },
|
|
534
604
|
folder: undefined,
|
|
535
605
|
activeRevision: undefined,
|
|
536
606
|
errors: undefined,
|
|
537
607
|
},
|
|
538
608
|
keys: {
|
|
539
|
-
passphrase:
|
|
540
|
-
key:
|
|
541
|
-
passphraseSessionKey:
|
|
609
|
+
passphrase: 'pass',
|
|
610
|
+
key: 'decryptedKey',
|
|
611
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
542
612
|
hashKey: new Uint8Array(),
|
|
543
|
-
}
|
|
613
|
+
},
|
|
544
614
|
});
|
|
545
615
|
expect(account.getPublicKeys).toHaveBeenCalledTimes(2);
|
|
546
616
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
547
617
|
});
|
|
548
618
|
});
|
|
549
|
-
describe(
|
|
619
|
+
describe('anonymous node', () => {
|
|
550
620
|
const encryptedNode = {
|
|
551
|
-
uid:
|
|
552
|
-
parentUid:
|
|
621
|
+
uid: 'volumeId~nodeId',
|
|
622
|
+
parentUid: 'volumeId~parentId',
|
|
553
623
|
encryptedCrypto: {
|
|
554
624
|
signatureEmail: undefined,
|
|
555
625
|
nameSignatureEmail: undefined,
|
|
556
|
-
armoredKey:
|
|
557
|
-
armoredNodePassphrase:
|
|
558
|
-
armoredNodePassphraseSignature:
|
|
626
|
+
armoredKey: 'armoredKey',
|
|
627
|
+
armoredNodePassphrase: 'armoredNodePassphrase',
|
|
628
|
+
armoredNodePassphraseSignature: 'armoredNodePassphraseSignature',
|
|
559
629
|
file: {
|
|
560
|
-
base64ContentKeyPacket:
|
|
630
|
+
base64ContentKeyPacket: 'base64ContentKeyPacket',
|
|
561
631
|
},
|
|
562
632
|
activeRevision: {
|
|
563
|
-
uid:
|
|
564
|
-
state:
|
|
565
|
-
signatureEmail:
|
|
566
|
-
armoredExtendedAttributes:
|
|
633
|
+
uid: 'revisionUid',
|
|
634
|
+
state: 'active',
|
|
635
|
+
signatureEmail: 'revisionSignatureEmail',
|
|
636
|
+
armoredExtendedAttributes: 'encryptedExtendedAttributes',
|
|
567
637
|
},
|
|
568
638
|
},
|
|
569
639
|
};
|
|
@@ -574,67 +644,78 @@ describe("nodesCryptoService", () => {
|
|
|
574
644
|
function verifyResult(result, expectedNode = {}, expectedKeys = {}) {
|
|
575
645
|
expect(result).toMatchObject({
|
|
576
646
|
node: {
|
|
577
|
-
name: { ok: true, value:
|
|
578
|
-
keyAuthor: { ok: true, value:
|
|
579
|
-
nameAuthor: { ok: true, value:
|
|
647
|
+
name: { ok: true, value: 'name' },
|
|
648
|
+
keyAuthor: { ok: true, value: 'signatureEmail' },
|
|
649
|
+
nameAuthor: { ok: true, value: 'nameSignatureEmail' },
|
|
580
650
|
folder: undefined,
|
|
581
651
|
activeRevision: {
|
|
582
|
-
ok: true,
|
|
583
|
-
|
|
652
|
+
ok: true,
|
|
653
|
+
value: {
|
|
654
|
+
uid: 'revisionUid',
|
|
584
655
|
state: interface_1.RevisionState.Active,
|
|
585
656
|
creationTime: undefined,
|
|
586
|
-
extendedAttributes:
|
|
587
|
-
contentAuthor: { ok: true, value:
|
|
588
|
-
}
|
|
657
|
+
extendedAttributes: '{}',
|
|
658
|
+
contentAuthor: { ok: true, value: 'revisionSignatureEmail' },
|
|
659
|
+
},
|
|
589
660
|
},
|
|
590
661
|
errors: undefined,
|
|
591
662
|
...expectedNode,
|
|
592
663
|
},
|
|
593
|
-
...expectedKeys === 'noKeys'
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
664
|
+
...(expectedKeys === 'noKeys'
|
|
665
|
+
? {}
|
|
666
|
+
: {
|
|
667
|
+
keys: {
|
|
668
|
+
passphrase: 'pass',
|
|
669
|
+
key: 'decryptedKey',
|
|
670
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
671
|
+
hashKey: undefined,
|
|
672
|
+
contentKeyPacketSessionKey: 'contentKeyPacketSessionKey',
|
|
673
|
+
...expectedKeys,
|
|
674
|
+
},
|
|
675
|
+
}),
|
|
603
676
|
});
|
|
604
677
|
}
|
|
605
|
-
describe(
|
|
606
|
-
it(
|
|
678
|
+
describe('should decrypt with verification issues', () => {
|
|
679
|
+
it('on node key and name with access to parent node', async () => {
|
|
607
680
|
driveCrypto.decryptKey = jest.fn(async () => Promise.resolve({
|
|
608
|
-
passphrase:
|
|
609
|
-
key:
|
|
610
|
-
passphraseSessionKey:
|
|
681
|
+
passphrase: 'pass',
|
|
682
|
+
key: 'decryptedKey',
|
|
683
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
611
684
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
612
685
|
}));
|
|
613
686
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.resolve({
|
|
614
|
-
name:
|
|
687
|
+
name: 'name',
|
|
615
688
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
616
689
|
}));
|
|
617
690
|
const result = await cryptoService.decryptNode(encryptedNode, parentKey);
|
|
618
691
|
verifyResult(result, {
|
|
619
|
-
keyAuthor: {
|
|
620
|
-
|
|
692
|
+
keyAuthor: {
|
|
693
|
+
ok: false,
|
|
694
|
+
error: { claimedAuthor: undefined, error: 'Signature verification for key failed' },
|
|
695
|
+
},
|
|
696
|
+
nameAuthor: {
|
|
697
|
+
ok: false,
|
|
698
|
+
error: { claimedAuthor: undefined, error: 'Signature verification for name failed' },
|
|
699
|
+
},
|
|
621
700
|
});
|
|
622
701
|
verifyLogEventVerificationError({
|
|
623
702
|
field: 'nodeName',
|
|
624
703
|
addressMatchingDefaultShare: undefined,
|
|
625
704
|
});
|
|
626
705
|
expect(driveCrypto.decryptKey).toHaveBeenCalledWith(encryptedNode.encryptedCrypto.armoredKey, encryptedNode.encryptedCrypto.armoredNodePassphrase, encryptedNode.encryptedCrypto.armoredNodePassphraseSignature, [parentKey], [parentKey]);
|
|
627
|
-
expect(driveCrypto.decryptNodeName).toHaveBeenCalledWith(encryptedNode.encryptedName, parentKey, [
|
|
706
|
+
expect(driveCrypto.decryptNodeName).toHaveBeenCalledWith(encryptedNode.encryptedName, parentKey, [
|
|
707
|
+
parentKey,
|
|
708
|
+
]);
|
|
628
709
|
});
|
|
629
|
-
it(
|
|
710
|
+
it('on anonymous node key and name without access to parent node', async () => {
|
|
630
711
|
driveCrypto.decryptKey = jest.fn(async () => Promise.resolve({
|
|
631
|
-
passphrase:
|
|
632
|
-
key:
|
|
633
|
-
passphraseSessionKey:
|
|
712
|
+
passphrase: 'pass',
|
|
713
|
+
key: 'decryptedKey',
|
|
714
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
634
715
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
635
716
|
}));
|
|
636
717
|
driveCrypto.decryptNodeName = jest.fn(async () => Promise.resolve({
|
|
637
|
-
name:
|
|
718
|
+
name: 'name',
|
|
638
719
|
verified: crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
639
720
|
}));
|
|
640
721
|
const result = await cryptoService.decryptNode(encryptedNodeWithoutParent, parentKey);
|
|
@@ -704,8 +785,7 @@ describe("nodesCryptoService", () => {
|
|
|
704
785
|
email: 'test@example.com',
|
|
705
786
|
addressKey: 'addressKey',
|
|
706
787
|
};
|
|
707
|
-
await expect(cryptoService.moveNode(node, keys, parentKeys, address))
|
|
708
|
-
.rejects.toThrow('Moving item to a non-folder is not allowed');
|
|
788
|
+
await expect(cryptoService.moveNode(node, keys, parentKeys, address)).rejects.toThrow('Moving item to a non-folder is not allowed');
|
|
709
789
|
});
|
|
710
790
|
it('should throw error when node has invalid name', async () => {
|
|
711
791
|
const node = {
|
|
@@ -724,8 +804,7 @@ describe("nodesCryptoService", () => {
|
|
|
724
804
|
email: 'test@example.com',
|
|
725
805
|
addressKey: 'addressKey',
|
|
726
806
|
};
|
|
727
|
-
await expect(cryptoService.moveNode(node, keys, parentKeys, address))
|
|
728
|
-
.rejects.toThrow('Cannot move item without a valid name, please rename the item first');
|
|
807
|
+
await expect(cryptoService.moveNode(node, keys, parentKeys, address)).rejects.toThrow('Cannot move item without a valid name, please rename the item first');
|
|
729
808
|
});
|
|
730
809
|
});
|
|
731
810
|
});
|