@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
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
|
-
import { DriveCrypto, PrivateKey, PublicKey, SessionKey, VERIFICATION_STATUS } from
|
|
4
|
-
import {
|
|
3
|
+
import { DriveCrypto, PrivateKey, PublicKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
|
|
4
|
+
import {
|
|
5
|
+
resultOk,
|
|
6
|
+
resultError,
|
|
7
|
+
Result,
|
|
8
|
+
Author,
|
|
9
|
+
AnonymousUser,
|
|
10
|
+
ProtonDriveAccount,
|
|
11
|
+
ProtonDriveTelemetry,
|
|
12
|
+
Logger,
|
|
13
|
+
MetricsDecryptionErrorField,
|
|
14
|
+
MetricVerificationErrorField,
|
|
15
|
+
} from '../../interface';
|
|
5
16
|
import { ValidationError } from '../../errors';
|
|
6
|
-
import { getErrorMessage, getVerificationMessage } from
|
|
7
|
-
import { splitNodeUid } from
|
|
8
|
-
import {
|
|
17
|
+
import { getErrorMessage, getVerificationMessage } from '../errors';
|
|
18
|
+
import { splitNodeUid } from '../uids';
|
|
19
|
+
import {
|
|
20
|
+
EncryptedNode,
|
|
21
|
+
EncryptedNodeFolderCrypto,
|
|
22
|
+
DecryptedUnparsedNode,
|
|
23
|
+
DecryptedNode,
|
|
24
|
+
DecryptedNodeKeys,
|
|
25
|
+
SharesService,
|
|
26
|
+
EncryptedRevision,
|
|
27
|
+
DecryptedUnparsedRevision,
|
|
28
|
+
} from './interface';
|
|
9
29
|
|
|
10
30
|
/**
|
|
11
31
|
* Provides crypto operations for nodes metadata.
|
|
12
|
-
*
|
|
32
|
+
*
|
|
13
33
|
* The node crypto service is responsible for decrypting and encrypting node
|
|
14
34
|
* metadata. It should export high-level actions only, such as "decrypt node"
|
|
15
35
|
* instead of low-level operations like "decrypt node key". Low-level operations
|
|
@@ -36,11 +56,14 @@ export class NodesCryptoService {
|
|
|
36
56
|
this.shareService = shareService;
|
|
37
57
|
}
|
|
38
58
|
|
|
39
|
-
async decryptNode(
|
|
59
|
+
async decryptNode(
|
|
60
|
+
node: EncryptedNode,
|
|
61
|
+
parentKey: PrivateKey,
|
|
62
|
+
): Promise<{ node: DecryptedUnparsedNode; keys?: DecryptedNodeKeys }> {
|
|
40
63
|
const commonNodeMetadata = {
|
|
41
64
|
...node,
|
|
42
65
|
encryptedCrypto: undefined,
|
|
43
|
-
}
|
|
66
|
+
};
|
|
44
67
|
|
|
45
68
|
const signatureEmailKeys = node.encryptedCrypto.signatureEmail
|
|
46
69
|
? await this.account.getPublicKeys(node.encryptedCrypto.signatureEmail)
|
|
@@ -53,9 +76,7 @@ export class NodesCryptoService {
|
|
|
53
76
|
const nodeParentKeys = node.parentUid ? [parentKey] : [];
|
|
54
77
|
|
|
55
78
|
// Anonymous uploads (without signature email set) use parent key instead.
|
|
56
|
-
const keyVerificationKeys = node.encryptedCrypto.signatureEmail
|
|
57
|
-
? signatureEmailKeys
|
|
58
|
-
: nodeParentKeys;
|
|
79
|
+
const keyVerificationKeys = node.encryptedCrypto.signatureEmail ? signatureEmailKeys : nodeParentKeys;
|
|
59
80
|
|
|
60
81
|
let nameVerificationKeys;
|
|
61
82
|
const nameSignatureEmail = node.encryptedCrypto.nameSignatureEmail;
|
|
@@ -89,13 +110,11 @@ export class NodesCryptoService {
|
|
|
89
110
|
error: errorMessage,
|
|
90
111
|
}),
|
|
91
112
|
nameAuthor,
|
|
92
|
-
activeRevision:
|
|
93
|
-
? resultError(new Error(errorMessage))
|
|
94
|
-
: undefined,
|
|
113
|
+
activeRevision: 'file' in node.encryptedCrypto ? resultError(new Error(errorMessage)) : undefined,
|
|
95
114
|
folder: undefined,
|
|
96
115
|
errors: [error],
|
|
97
116
|
},
|
|
98
|
-
}
|
|
117
|
+
};
|
|
99
118
|
}
|
|
100
119
|
|
|
101
120
|
const errors = [];
|
|
@@ -104,7 +123,7 @@ export class NodesCryptoService {
|
|
|
104
123
|
let hashKeyAuthor;
|
|
105
124
|
let folder;
|
|
106
125
|
let folderExtendedAttributesAuthor;
|
|
107
|
-
if (
|
|
126
|
+
if ('folder' in node.encryptedCrypto) {
|
|
108
127
|
try {
|
|
109
128
|
const hashKeyResult = await this.decryptHashKey(node, key, signatureEmailKeys);
|
|
110
129
|
hashKey = hashKeyResult.hashKey;
|
|
@@ -123,7 +142,7 @@ export class NodesCryptoService {
|
|
|
123
142
|
node.encryptedCrypto.folder.armoredExtendedAttributes,
|
|
124
143
|
key,
|
|
125
144
|
folderExtendedAttributesVerificationKeys,
|
|
126
|
-
node.encryptedCrypto.signatureEmail
|
|
145
|
+
node.encryptedCrypto.signatureEmail,
|
|
127
146
|
);
|
|
128
147
|
folder = {
|
|
129
148
|
extendedAttributes: extendedAttributesResult.extendedAttributes,
|
|
@@ -138,9 +157,11 @@ export class NodesCryptoService {
|
|
|
138
157
|
let activeRevision: Result<DecryptedUnparsedRevision, Error> | undefined;
|
|
139
158
|
let contentKeyPacketSessionKey;
|
|
140
159
|
let contentKeyPacketAuthor;
|
|
141
|
-
if (
|
|
160
|
+
if ('file' in node.encryptedCrypto) {
|
|
142
161
|
try {
|
|
143
|
-
activeRevision = resultOk(
|
|
162
|
+
activeRevision = resultOk(
|
|
163
|
+
await this.decryptRevision(node.uid, node.encryptedCrypto.activeRevision, key),
|
|
164
|
+
);
|
|
144
165
|
} catch (error: unknown) {
|
|
145
166
|
void this.reportDecryptionError(node, 'nodeExtendedAttributes', error);
|
|
146
167
|
const message = getErrorMessage(error);
|
|
@@ -159,13 +180,15 @@ export class NodesCryptoService {
|
|
|
159
180
|
);
|
|
160
181
|
|
|
161
182
|
contentKeyPacketSessionKey = keySessionKeyResult.sessionKey;
|
|
162
|
-
contentKeyPacketAuthor =
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
contentKeyPacketAuthor =
|
|
184
|
+
keySessionKeyResult.verified &&
|
|
185
|
+
(await this.handleClaimedAuthor(
|
|
186
|
+
node,
|
|
187
|
+
'nodeContentKey',
|
|
188
|
+
c('Property').t`content key`,
|
|
189
|
+
keySessionKeyResult.verified,
|
|
190
|
+
node.encryptedCrypto.signatureEmail,
|
|
191
|
+
));
|
|
169
192
|
} catch (error: unknown) {
|
|
170
193
|
void this.reportDecryptionError(node, 'nodeContentKey', error);
|
|
171
194
|
const message = getErrorMessage(error);
|
|
@@ -217,11 +240,17 @@ export class NodesCryptoService {
|
|
|
217
240
|
hashKey,
|
|
218
241
|
},
|
|
219
242
|
};
|
|
220
|
-
}
|
|
243
|
+
}
|
|
221
244
|
|
|
222
|
-
private async decryptKey(
|
|
223
|
-
|
|
224
|
-
|
|
245
|
+
private async decryptKey(
|
|
246
|
+
node: EncryptedNode,
|
|
247
|
+
parentKey: PrivateKey,
|
|
248
|
+
verificationKeys: PublicKey[],
|
|
249
|
+
): Promise<
|
|
250
|
+
DecryptedNodeKeys & {
|
|
251
|
+
author: Author;
|
|
252
|
+
}
|
|
253
|
+
> {
|
|
225
254
|
const key = await this.driveCrypto.decryptKey(
|
|
226
255
|
node.encryptedCrypto.armoredKey,
|
|
227
256
|
node.encryptedCrypto.armoredNodePassphrase,
|
|
@@ -234,13 +263,24 @@ export class NodesCryptoService {
|
|
|
234
263
|
passphrase: key.passphrase,
|
|
235
264
|
key: key.key,
|
|
236
265
|
passphraseSessionKey: key.passphraseSessionKey,
|
|
237
|
-
author: await this.handleClaimedAuthor(
|
|
266
|
+
author: await this.handleClaimedAuthor(
|
|
267
|
+
node,
|
|
268
|
+
'nodeKey',
|
|
269
|
+
c('Property').t`key`,
|
|
270
|
+
key.verified,
|
|
271
|
+
node.encryptedCrypto.signatureEmail,
|
|
272
|
+
verificationKeys.length === 0,
|
|
273
|
+
),
|
|
238
274
|
};
|
|
239
|
-
}
|
|
275
|
+
}
|
|
240
276
|
|
|
241
|
-
private async decryptName(
|
|
242
|
-
|
|
243
|
-
|
|
277
|
+
private async decryptName(
|
|
278
|
+
node: EncryptedNode,
|
|
279
|
+
parentKey: PrivateKey,
|
|
280
|
+
verificationKeys: PublicKey[],
|
|
281
|
+
): Promise<{
|
|
282
|
+
name: Result<string, Error>;
|
|
283
|
+
author: Author;
|
|
244
284
|
}> {
|
|
245
285
|
const nameSignatureEmail = node.encryptedCrypto.nameSignatureEmail;
|
|
246
286
|
|
|
@@ -253,8 +293,15 @@ export class NodesCryptoService {
|
|
|
253
293
|
|
|
254
294
|
return {
|
|
255
295
|
name: resultOk(name),
|
|
256
|
-
author: await this.handleClaimedAuthor(
|
|
257
|
-
|
|
296
|
+
author: await this.handleClaimedAuthor(
|
|
297
|
+
node,
|
|
298
|
+
'nodeName',
|
|
299
|
+
c('Property').t`name`,
|
|
300
|
+
verified,
|
|
301
|
+
nameSignatureEmail,
|
|
302
|
+
verificationKeys.length === 0,
|
|
303
|
+
),
|
|
304
|
+
};
|
|
258
305
|
} catch (error: unknown) {
|
|
259
306
|
void this.reportDecryptionError(node, 'nodeName', error);
|
|
260
307
|
const errorMessage = getErrorMessage(error);
|
|
@@ -264,19 +311,23 @@ export class NodesCryptoService {
|
|
|
264
311
|
claimedAuthor: nameSignatureEmail,
|
|
265
312
|
error: errorMessage,
|
|
266
313
|
}),
|
|
267
|
-
}
|
|
314
|
+
};
|
|
268
315
|
}
|
|
269
|
-
}
|
|
316
|
+
}
|
|
270
317
|
|
|
271
318
|
async getNameSessionKey(node: { encryptedName: string }, parentKey: PrivateKey): Promise<SessionKey> {
|
|
272
319
|
return this.driveCrypto.decryptSessionKey(node.encryptedName, parentKey);
|
|
273
320
|
}
|
|
274
321
|
|
|
275
|
-
private async decryptHashKey(
|
|
276
|
-
|
|
277
|
-
|
|
322
|
+
private async decryptHashKey(
|
|
323
|
+
node: EncryptedNode,
|
|
324
|
+
nodeKey: PrivateKey,
|
|
325
|
+
addressKeys: PublicKey[],
|
|
326
|
+
): Promise<{
|
|
327
|
+
hashKey: Uint8Array;
|
|
328
|
+
author: Author;
|
|
278
329
|
}> {
|
|
279
|
-
if (!(
|
|
330
|
+
if (!('folder' in node.encryptedCrypto)) {
|
|
280
331
|
// This is developer error.
|
|
281
332
|
throw new Error('Node is not a folder');
|
|
282
333
|
}
|
|
@@ -289,19 +340,26 @@ export class NodesCryptoService {
|
|
|
289
340
|
|
|
290
341
|
return {
|
|
291
342
|
hashKey,
|
|
292
|
-
author: await this.handleClaimedAuthor(
|
|
293
|
-
|
|
343
|
+
author: await this.handleClaimedAuthor(
|
|
344
|
+
node,
|
|
345
|
+
'nodeHashKey',
|
|
346
|
+
c('Property').t`hash key`,
|
|
347
|
+
verified,
|
|
348
|
+
node.encryptedCrypto.signatureEmail,
|
|
349
|
+
),
|
|
350
|
+
};
|
|
294
351
|
}
|
|
295
352
|
|
|
296
|
-
async decryptRevision(
|
|
353
|
+
async decryptRevision(
|
|
354
|
+
nodeUid: string,
|
|
355
|
+
encryptedRevision: EncryptedRevision,
|
|
356
|
+
nodeKey: PrivateKey,
|
|
357
|
+
): Promise<DecryptedUnparsedRevision> {
|
|
297
358
|
const verificationKeys = encryptedRevision.signatureEmail
|
|
298
359
|
? await this.account.getPublicKeys(encryptedRevision.signatureEmail)
|
|
299
360
|
: [nodeKey];
|
|
300
361
|
|
|
301
|
-
const {
|
|
302
|
-
extendedAttributes,
|
|
303
|
-
author: contentAuthor,
|
|
304
|
-
} = await this.decryptExtendedAttributes(
|
|
362
|
+
const { extendedAttributes, author: contentAuthor } = await this.decryptExtendedAttributes(
|
|
305
363
|
{ uid: nodeUid, creationTime: encryptedRevision.creationTime },
|
|
306
364
|
encryptedRevision.armoredExtendedAttributes,
|
|
307
365
|
nodeKey,
|
|
@@ -317,23 +375,23 @@ export class NodesCryptoService {
|
|
|
317
375
|
contentAuthor,
|
|
318
376
|
extendedAttributes,
|
|
319
377
|
thumbnails: encryptedRevision.thumbnails,
|
|
320
|
-
}
|
|
378
|
+
};
|
|
321
379
|
}
|
|
322
380
|
|
|
323
381
|
private async decryptExtendedAttributes(
|
|
324
|
-
node: { uid: string
|
|
382
|
+
node: { uid: string; creationTime: Date },
|
|
325
383
|
encryptedExtendedAttributes: string | undefined,
|
|
326
384
|
nodeKey: PrivateKey,
|
|
327
385
|
addressKeys: PublicKey[],
|
|
328
386
|
signatureEmail?: string,
|
|
329
387
|
): Promise<{
|
|
330
|
-
extendedAttributes?: string
|
|
331
|
-
author: Author
|
|
388
|
+
extendedAttributes?: string;
|
|
389
|
+
author: Author;
|
|
332
390
|
}> {
|
|
333
391
|
if (!encryptedExtendedAttributes) {
|
|
334
392
|
return {
|
|
335
393
|
author: resultOk(signatureEmail) as Author,
|
|
336
|
-
}
|
|
394
|
+
};
|
|
337
395
|
}
|
|
338
396
|
|
|
339
397
|
const { extendedAttributes, verified } = await this.driveCrypto.decryptExtendedAttributes(
|
|
@@ -344,25 +402,27 @@ export class NodesCryptoService {
|
|
|
344
402
|
|
|
345
403
|
return {
|
|
346
404
|
extendedAttributes,
|
|
347
|
-
author: await this.handleClaimedAuthor(
|
|
348
|
-
|
|
405
|
+
author: await this.handleClaimedAuthor(
|
|
406
|
+
node,
|
|
407
|
+
'nodeExtendedAttributes',
|
|
408
|
+
c('Property').t`attributes`,
|
|
409
|
+
verified,
|
|
410
|
+
signatureEmail,
|
|
411
|
+
),
|
|
412
|
+
};
|
|
349
413
|
}
|
|
350
414
|
|
|
351
415
|
async createFolder(
|
|
352
|
-
parentKeys: { key: PrivateKey
|
|
353
|
-
address: { email: string
|
|
416
|
+
parentKeys: { key: PrivateKey; hashKey: Uint8Array },
|
|
417
|
+
address: { email: string; addressKey: PrivateKey },
|
|
354
418
|
name: string,
|
|
355
419
|
extendedAttributes?: string,
|
|
356
420
|
): Promise<{
|
|
357
|
-
encryptedCrypto: Required<EncryptedNodeFolderCrypto> & { encryptedName: string
|
|
358
|
-
keys: DecryptedNodeKeys
|
|
421
|
+
encryptedCrypto: Required<EncryptedNodeFolderCrypto> & { encryptedName: string; hash: string };
|
|
422
|
+
keys: DecryptedNodeKeys;
|
|
359
423
|
}> {
|
|
360
424
|
const { email, addressKey } = address;
|
|
361
|
-
const [
|
|
362
|
-
nodeKeys,
|
|
363
|
-
{ armoredNodeName },
|
|
364
|
-
hash,
|
|
365
|
-
] = await Promise.all([
|
|
425
|
+
const [nodeKeys, { armoredNodeName }, hash] = await Promise.all([
|
|
366
426
|
this.driveCrypto.generateKey([parentKeys.key], addressKey),
|
|
367
427
|
this.driveCrypto.encryptNodeName(name, undefined, parentKeys.key, addressKey),
|
|
368
428
|
this.driveCrypto.generateLookupHash(name, parentKeys.hashKey),
|
|
@@ -398,18 +458,23 @@ export class NodesCryptoService {
|
|
|
398
458
|
}
|
|
399
459
|
|
|
400
460
|
async encryptNewName(
|
|
401
|
-
parentKeys: { key: PrivateKey
|
|
461
|
+
parentKeys: { key: PrivateKey; hashKey?: Uint8Array },
|
|
402
462
|
nodeNameSessionKey: SessionKey,
|
|
403
|
-
address: { email: string
|
|
463
|
+
address: { email: string; addressKey: PrivateKey },
|
|
404
464
|
newName: string,
|
|
405
465
|
): Promise<{
|
|
406
|
-
signatureEmail: string
|
|
407
|
-
armoredNodeName: string
|
|
408
|
-
hash?: string
|
|
466
|
+
signatureEmail: string;
|
|
467
|
+
armoredNodeName: string;
|
|
468
|
+
hash?: string;
|
|
409
469
|
}> {
|
|
410
470
|
const { email, addressKey } = address;
|
|
411
471
|
|
|
412
|
-
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
472
|
+
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
473
|
+
newName,
|
|
474
|
+
nodeNameSessionKey,
|
|
475
|
+
parentKeys.key,
|
|
476
|
+
addressKey,
|
|
477
|
+
);
|
|
413
478
|
|
|
414
479
|
const hash = parentKeys.hashKey
|
|
415
480
|
? await this.driveCrypto.generateLookupHash(newName, parentKeys.hashKey)
|
|
@@ -419,20 +484,20 @@ export class NodesCryptoService {
|
|
|
419
484
|
armoredNodeName,
|
|
420
485
|
hash,
|
|
421
486
|
};
|
|
422
|
-
}
|
|
487
|
+
}
|
|
423
488
|
|
|
424
489
|
async moveNode(
|
|
425
490
|
node: Pick<DecryptedNode, 'name'>,
|
|
426
|
-
keys: { passphrase: string
|
|
427
|
-
parentKeys: { key: PrivateKey
|
|
428
|
-
address: { email: string
|
|
491
|
+
keys: { passphrase: string; passphraseSessionKey: SessionKey; nameSessionKey: SessionKey },
|
|
492
|
+
parentKeys: { key: PrivateKey; hashKey: Uint8Array },
|
|
493
|
+
address: { email: string; addressKey: PrivateKey },
|
|
429
494
|
): Promise<{
|
|
430
|
-
encryptedName: string
|
|
431
|
-
hash: string
|
|
432
|
-
armoredNodePassphrase: string
|
|
433
|
-
armoredNodePassphraseSignature: string
|
|
434
|
-
signatureEmail: string
|
|
435
|
-
nameSignatureEmail: string
|
|
495
|
+
encryptedName: string;
|
|
496
|
+
hash: string;
|
|
497
|
+
armoredNodePassphrase: string;
|
|
498
|
+
armoredNodePassphraseSignature: string;
|
|
499
|
+
signatureEmail: string;
|
|
500
|
+
nameSignatureEmail: string;
|
|
436
501
|
}> {
|
|
437
502
|
if (!parentKeys.hashKey) {
|
|
438
503
|
throw new ValidationError('Moving item to a non-folder is not allowed');
|
|
@@ -442,9 +507,19 @@ export class NodesCryptoService {
|
|
|
442
507
|
}
|
|
443
508
|
|
|
444
509
|
const { email, addressKey } = address;
|
|
445
|
-
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
510
|
+
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
511
|
+
node.name.value,
|
|
512
|
+
keys.nameSessionKey,
|
|
513
|
+
parentKeys.key,
|
|
514
|
+
addressKey,
|
|
515
|
+
);
|
|
446
516
|
const hash = await this.driveCrypto.generateLookupHash(node.name.value, parentKeys.hashKey);
|
|
447
|
-
const { armoredPassphrase, armoredPassphraseSignature } = await this.driveCrypto.encryptPassphrase(
|
|
517
|
+
const { armoredPassphrase, armoredPassphraseSignature } = await this.driveCrypto.encryptPassphrase(
|
|
518
|
+
keys.passphrase,
|
|
519
|
+
keys.passphraseSessionKey,
|
|
520
|
+
[parentKeys.key],
|
|
521
|
+
addressKey,
|
|
522
|
+
);
|
|
448
523
|
|
|
449
524
|
return {
|
|
450
525
|
encryptedName: armoredNodeName,
|
|
@@ -457,7 +532,7 @@ export class NodesCryptoService {
|
|
|
457
532
|
}
|
|
458
533
|
|
|
459
534
|
private async handleClaimedAuthor(
|
|
460
|
-
node: { uid: string
|
|
535
|
+
node: { uid: string; creationTime: Date },
|
|
461
536
|
field: MetricVerificationErrorField,
|
|
462
537
|
signatureType: string,
|
|
463
538
|
verified: VERIFICATION_STATUS,
|
|
@@ -472,7 +547,7 @@ export class NodesCryptoService {
|
|
|
472
547
|
}
|
|
473
548
|
|
|
474
549
|
private async reportVerificationError(
|
|
475
|
-
node: { uid: string
|
|
550
|
+
node: { uid: string; creationTime: Date },
|
|
476
551
|
field: MetricVerificationErrorField,
|
|
477
552
|
claimedAuthor?: string,
|
|
478
553
|
) {
|
|
@@ -492,7 +567,9 @@ export class NodesCryptoService {
|
|
|
492
567
|
this.logger.error('Failed to check if claimed author matches default share', error);
|
|
493
568
|
}
|
|
494
569
|
|
|
495
|
-
this.logger.warn(
|
|
570
|
+
this.logger.warn(
|
|
571
|
+
`Failed to verify ${field} for node ${node.uid} (from before 2024: ${fromBefore2024}, matching address: ${addressMatchingDefaultShare})`,
|
|
572
|
+
);
|
|
496
573
|
|
|
497
574
|
this.telemetry.logEvent({
|
|
498
575
|
eventName: 'verificationError',
|
|
@@ -535,7 +612,12 @@ export class NodesCryptoService {
|
|
|
535
612
|
/**
|
|
536
613
|
* @param signatureType - Must be translated before calling this function.
|
|
537
614
|
*/
|
|
538
|
-
function handleClaimedAuthor(
|
|
615
|
+
function handleClaimedAuthor(
|
|
616
|
+
signatureType: string,
|
|
617
|
+
verified: VERIFICATION_STATUS,
|
|
618
|
+
claimedAuthor?: string,
|
|
619
|
+
notAvailableVerificationKeys = false,
|
|
620
|
+
): Author {
|
|
539
621
|
if (!claimedAuthor && notAvailableVerificationKeys) {
|
|
540
622
|
return resultOk(null as AnonymousUser);
|
|
541
623
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { getMockLogger } from
|
|
2
|
-
import { DriveEvent, DriveEventType } from
|
|
3
|
-
import { NodesEventsHandler } from
|
|
4
|
-
import { DecryptedNode } from
|
|
5
|
-
import { NodesCache } from
|
|
1
|
+
import { getMockLogger } from '../../tests/logger';
|
|
2
|
+
import { DriveEvent, DriveEventType } from '../events';
|
|
3
|
+
import { NodesEventsHandler } from './events';
|
|
4
|
+
import { DecryptedNode } from './interface';
|
|
5
|
+
import { NodesCache } from './cache';
|
|
6
6
|
|
|
7
|
-
describe(
|
|
7
|
+
describe('NodesEventsHandler', () => {
|
|
8
8
|
const logger = getMockLogger();
|
|
9
9
|
let cache: NodesCache;
|
|
10
10
|
let nodesEventsNodesEventsHandler: NodesEventsHandler;
|
|
@@ -14,11 +14,13 @@ describe("NodesEventsHandler", () => {
|
|
|
14
14
|
|
|
15
15
|
// @ts-expect-error No need to implement all methods for mocking
|
|
16
16
|
cache = {
|
|
17
|
-
getNode: jest.fn(() =>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
getNode: jest.fn(() =>
|
|
18
|
+
Promise.resolve({
|
|
19
|
+
uid: 'nodeUid123',
|
|
20
|
+
parentUid: 'parentUid',
|
|
21
|
+
name: { ok: true, value: 'name' },
|
|
22
|
+
} as DecryptedNode),
|
|
23
|
+
),
|
|
22
24
|
setNode: jest.fn(),
|
|
23
25
|
removeNodes: jest.fn(),
|
|
24
26
|
resetFolderChildrenLoaded: jest.fn(),
|
|
@@ -26,47 +28,55 @@ describe("NodesEventsHandler", () => {
|
|
|
26
28
|
nodesEventsNodesEventsHandler = new NodesEventsHandler(logger, cache);
|
|
27
29
|
});
|
|
28
30
|
|
|
29
|
-
it(
|
|
31
|
+
it('should unset the parent listing complete status when a `NodeCreated` event is received.', async () => {
|
|
30
32
|
const event: DriveEvent = {
|
|
31
|
-
eventId:
|
|
33
|
+
eventId: 'event1',
|
|
32
34
|
type: DriveEventType.NodeCreated,
|
|
33
|
-
nodeUid:
|
|
34
|
-
parentNodeUid:
|
|
35
|
+
nodeUid: 'nodeUid',
|
|
36
|
+
parentNodeUid: 'parentUid',
|
|
35
37
|
isTrashed: false,
|
|
36
38
|
isShared: false,
|
|
37
|
-
treeEventScopeId:
|
|
39
|
+
treeEventScopeId: 'volume1',
|
|
38
40
|
};
|
|
39
41
|
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
40
42
|
|
|
41
43
|
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledTimes(1);
|
|
42
|
-
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith(
|
|
44
|
+
expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith('parentUid');
|
|
43
45
|
expect(cache.setNode).toHaveBeenCalledTimes(0);
|
|
44
46
|
});
|
|
45
47
|
|
|
46
|
-
it(
|
|
48
|
+
it('should update the node metadata when a `NodeUpdated` event is received.', async () => {
|
|
47
49
|
const event: DriveEvent = {
|
|
48
50
|
type: DriveEventType.NodeUpdated,
|
|
49
|
-
eventId:
|
|
50
|
-
nodeUid:
|
|
51
|
-
parentNodeUid:
|
|
51
|
+
eventId: 'event1',
|
|
52
|
+
nodeUid: 'nodeUid123',
|
|
53
|
+
parentNodeUid: 'parentUid',
|
|
52
54
|
isTrashed: false,
|
|
53
55
|
isShared: false,
|
|
54
|
-
treeEventScopeId:
|
|
56
|
+
treeEventScopeId: 'volume1',
|
|
55
57
|
};
|
|
56
58
|
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
57
59
|
|
|
58
60
|
expect(cache.getNode).toHaveBeenCalledTimes(1);
|
|
59
61
|
expect(cache.setNode).toHaveBeenCalledTimes(1);
|
|
60
|
-
expect(cache.setNode).toHaveBeenCalledWith(
|
|
62
|
+
expect(cache.setNode).toHaveBeenCalledWith(
|
|
63
|
+
expect.objectContaining({
|
|
64
|
+
uid: 'nodeUid123',
|
|
65
|
+
isStale: true,
|
|
66
|
+
parentUid: 'parentUid',
|
|
67
|
+
trashTime: undefined,
|
|
68
|
+
isShared: false,
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
61
71
|
});
|
|
62
72
|
|
|
63
|
-
it(
|
|
73
|
+
it('should remove node from cache', async () => {
|
|
64
74
|
const event: DriveEvent = {
|
|
65
75
|
type: DriveEventType.NodeDeleted,
|
|
66
|
-
eventId:
|
|
67
|
-
nodeUid:
|
|
68
|
-
parentNodeUid:
|
|
69
|
-
treeEventScopeId:
|
|
76
|
+
eventId: 'event1',
|
|
77
|
+
nodeUid: 'nodeUid123',
|
|
78
|
+
parentNodeUid: 'parentUid',
|
|
79
|
+
treeEventScopeId: 'volume1',
|
|
70
80
|
};
|
|
71
81
|
|
|
72
82
|
await nodesEventsNodesEventsHandler.updateNodesCacheOnEvent(event);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
import { DriveEvent, DriveEventType } from
|
|
3
|
-
import { NodesCache } from
|
|
1
|
+
import { Logger } from '../../interface';
|
|
2
|
+
import { DriveEvent, DriveEventType } from '../events';
|
|
3
|
+
import { NodesCache } from './cache';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Provides internal event handling.
|
|
@@ -9,8 +9,10 @@ import { NodesCache } from "./cache";
|
|
|
9
9
|
* from the DriveEventsService.
|
|
10
10
|
*/
|
|
11
11
|
export class NodesEventsHandler {
|
|
12
|
-
constructor(
|
|
13
|
-
|
|
12
|
+
constructor(
|
|
13
|
+
private logger: Logger,
|
|
14
|
+
private cache: NodesCache,
|
|
15
|
+
) {}
|
|
14
16
|
|
|
15
17
|
async updateNodesCacheOnEvent(event: DriveEvent): Promise<void> {
|
|
16
18
|
try {
|
|
@@ -39,7 +41,12 @@ export class NodesEventsHandler {
|
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
if (event.type === DriveEventType.NodeUpdated) {
|
|
42
|
-
|
|
44
|
+
let node;
|
|
45
|
+
try {
|
|
46
|
+
node = await this.cache.getNode(event.nodeUid);
|
|
47
|
+
} catch {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
43
50
|
node.isStale = true;
|
|
44
51
|
node.parentUid = event.parentNodeUid;
|
|
45
52
|
node.isShared = event.isShared;
|
|
@@ -51,12 +58,6 @@ export class NodesEventsHandler {
|
|
|
51
58
|
await this.cache.setNode(node);
|
|
52
59
|
}
|
|
53
60
|
} catch (error: unknown) {
|
|
54
|
-
if (error instanceof Error) {
|
|
55
|
-
// FIXME throw CacheMissException error and catch it
|
|
56
|
-
if (error.message === 'Entity not found') {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
61
|
this.logger.error(`Failed to update node cache for event: ${event.eventId}`, error);
|
|
61
62
|
}
|
|
62
63
|
}
|