@protontech/drive-sdk 0.0.13 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/memoryCache.js +0 -1
- package/dist/cache/memoryCache.js.map +1 -1
- package/dist/cache/memoryCache.test.js +2 -4
- package/dist/cache/memoryCache.test.js.map +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +36 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/driveCrypto.d.ts +2 -5
- package/dist/crypto/driveCrypto.js +7 -12
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +14 -14
- package/dist/crypto/openPGPCrypto.js +5 -3
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +222 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +58 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +11 -7
- package/dist/interface/index.js +2 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/result.js.map +1 -1
- package/dist/interface/sharing.d.ts +2 -0
- package/dist/interface/sharing.js.map +1 -1
- package/dist/interface/telemetry.js +0 -8
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/interface/thumbnail.js.map +1 -1
- package/dist/interface/upload.d.ts +7 -1
- package/dist/internal/apiService/apiService.d.ts +1 -1
- package/dist/internal/apiService/apiService.js +7 -11
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/apiService.test.js +55 -48
- package/dist/internal/apiService/apiService.test.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
- package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
- package/dist/internal/apiService/errors.js +14 -8
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/errors.test.js +17 -12
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/apiService/transformers.js +1 -1
- package/dist/internal/asyncIteratorMap.test.js +2 -2
- package/dist/internal/asyncIteratorMap.test.js.map +1 -1
- package/dist/internal/asyncIteratorRace.d.ts +13 -0
- package/dist/internal/asyncIteratorRace.js +59 -0
- package/dist/internal/asyncIteratorRace.js.map +1 -0
- package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
- package/dist/internal/asyncIteratorRace.test.js +119 -0
- package/dist/internal/asyncIteratorRace.test.js.map +1 -0
- package/dist/internal/batch.d.ts +1 -0
- package/dist/internal/batch.js +12 -0
- package/dist/internal/batch.js.map +1 -0
- package/dist/internal/batch.test.d.ts +1 -0
- package/dist/internal/batch.test.js +41 -0
- package/dist/internal/batch.test.js.map +1 -0
- package/dist/internal/batchLoading.js.map +1 -1
- package/dist/internal/batchLoading.test.js +13 -13
- package/dist/internal/batchLoading.test.js.map +1 -1
- package/dist/internal/devices/apiService.d.ts +3 -3
- package/dist/internal/devices/apiService.js +2 -2
- package/dist/internal/devices/apiService.js.map +1 -1
- package/dist/internal/devices/cryptoService.js +1 -2
- package/dist/internal/devices/cryptoService.js.map +1 -1
- package/dist/internal/devices/index.d.ts +5 -5
- package/dist/internal/devices/index.js.map +1 -1
- package/dist/internal/devices/interface.d.ts +3 -3
- package/dist/internal/devices/manager.js +2 -2
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +38 -7
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/apiService.d.ts +4 -4
- package/dist/internal/download/apiService.js +32 -32
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/cryptoService.d.ts +4 -4
- package/dist/internal/download/cryptoService.js +6 -5
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +6 -6
- package/dist/internal/download/fileDownloader.js +3 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +1 -1
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/index.d.ts +5 -5
- package/dist/internal/download/index.js +5 -5
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +3 -4
- package/dist/internal/download/telemetry.d.ts +3 -3
- package/dist/internal/download/telemetry.js +4 -2
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +8 -8
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
- package/dist/internal/download/thumbnailDownloader.js +6 -6
- package/dist/internal/download/thumbnailDownloader.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -1
- package/dist/internal/errors.js +1 -3
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +5 -7
- package/dist/internal/events/apiService.js +19 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +9 -12
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.d.ts +1 -0
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -106
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +177 -83
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +16 -36
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +12 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +9 -19
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +4 -3
- package/dist/internal/nodes/apiService.js +36 -15
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +60 -41
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +14 -5
- package/dist/internal/nodes/cache.js +31 -7
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +31 -9
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +2 -2
- package/dist/internal/nodes/cryptoCache.js.map +1 -1
- package/dist/internal/nodes/cryptoCache.test.js +24 -4
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -4
- package/dist/internal/nodes/cryptoService.js +11 -17
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +320 -241
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +8 -84
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +35 -279
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
- package/dist/internal/nodes/extendedAttributes.js +3 -1
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +7 -10
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +12 -13
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +24 -32
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.d.ts +22 -7
- package/dist/internal/nodes/nodesAccess.js +65 -16
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +165 -101
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +7 -9
- package/dist/internal/nodes/nodesManagement.js +21 -33
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +42 -21
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +3 -3
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +1 -1
- package/dist/internal/photos/apiService.js +3 -6
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/cache.d.ts +1 -1
- package/dist/internal/photos/index.d.ts +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/photosTimeline.d.ts +3 -3
- package/dist/internal/photos/photosTimeline.js +1 -2
- package/dist/internal/photos/photosTimeline.js.map +1 -1
- package/dist/internal/sdkEvents.d.ts +1 -1
- package/dist/internal/sdkEvents.js +2 -7
- package/dist/internal/sdkEvents.js.map +1 -1
- package/dist/internal/sdkEvents.test.js +8 -8
- package/dist/internal/shares/apiService.d.ts +2 -2
- package/dist/internal/shares/apiService.js +5 -3
- package/dist/internal/shares/apiService.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +4 -2
- package/dist/internal/shares/cache.js +14 -6
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/cache.test.js.map +1 -1
- package/dist/internal/shares/cryptoCache.d.ts +2 -2
- package/dist/internal/shares/cryptoCache.test.js +8 -2
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +3 -3
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +42 -42
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +4 -4
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/interface.d.ts +2 -2
- package/dist/internal/shares/manager.d.ts +8 -7
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +71 -63
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +4 -4
- package/dist/internal/sharing/apiService.js +5 -3
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +1 -1
- package/dist/internal/sharing/cache.test.js +33 -33
- package/dist/internal/sharing/cryptoService.d.ts +3 -3
- package/dist/internal/sharing/cryptoService.js +3 -4
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +39 -39
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +24 -56
- package/dist/internal/sharing/events.js +45 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +85 -189
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +8 -9
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +8 -4
- package/dist/internal/sharing/sharingAccess.d.ts +6 -6
- package/dist/internal/sharing/sharingAccess.js +8 -4
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +45 -39
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +5 -6
- package/dist/internal/sharing/sharingManagement.js +12 -16
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +305 -286
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/uids.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +5 -6
- package/dist/internal/upload/apiService.js +8 -5
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/blockVerifier.d.ts +3 -3
- package/dist/internal/upload/blockVerifier.js +1 -1
- package/dist/internal/upload/blockVerifier.js.map +1 -1
- package/dist/internal/upload/chunkStreamReader.test.js +6 -6
- package/dist/internal/upload/cryptoService.d.ts +4 -4
- package/dist/internal/upload/cryptoService.js +4 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/digests.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +6 -6
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +6 -6
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +5 -3
- package/dist/internal/upload/manager.d.ts +8 -8
- package/dist/internal/upload/manager.js +23 -52
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +185 -147
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +6 -6
- package/dist/internal/upload/streamUploader.js +9 -8
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +17 -12
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +3 -3
- package/dist/internal/upload/telemetry.js +5 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +8 -8
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +27 -170
- package/dist/protonDriveClient.js +37 -198
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/telemetry.js +18 -15
- package/dist/telemetry.js.map +1 -1
- package/dist/tests/logger.js.map +1 -1
- package/dist/tests/telemetry.d.ts +1 -1
- package/dist/transformers.js +4 -2
- package/dist/transformers.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/interface.ts +22 -22
- package/src/cache/memoryCache.test.ts +7 -7
- package/src/cache/memoryCache.ts +5 -5
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/driveCrypto.test.ts +15 -15
- package/src/crypto/driveCrypto.ts +120 -156
- package/src/crypto/hmac.ts +1 -1
- package/src/crypto/interface.ts +63 -72
- package/src/crypto/openPGPCrypto.ts +76 -94
- package/src/crypto/utils.ts +1 -1
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +84 -0
- package/src/diagnostic/index.ts +40 -0
- package/src/diagnostic/integrityVerificationStream.ts +55 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +249 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
- package/src/diagnostic/telemetry.ts +74 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +25 -22
- package/src/index.ts +3 -3
- package/src/interface/account.ts +10 -10
- package/src/interface/author.ts +6 -6
- package/src/interface/config.ts +28 -0
- package/src/interface/devices.ts +6 -6
- package/src/interface/download.ts +12 -9
- package/src/interface/events.ts +76 -25
- package/src/interface/httpClient.ts +11 -27
- package/src/interface/index.ts +81 -20
- package/src/interface/nodes.ts +67 -60
- package/src/interface/result.ts +1 -3
- package/src/interface/sharing.ts +60 -56
- package/src/interface/telemetry.ts +74 -74
- package/src/interface/thumbnail.ts +5 -6
- package/src/interface/upload.ts +25 -11
- package/src/internal/apiService/apiService.test.ts +109 -76
- package/src/internal/apiService/apiService.ts +40 -26
- package/src/internal/apiService/coreTypes.ts +2474 -2463
- package/src/internal/apiService/driveTypes.ts +1868 -1822
- package/src/internal/apiService/errorCodes.ts +4 -4
- package/src/internal/apiService/errors.test.ts +25 -23
- package/src/internal/apiService/errors.ts +15 -9
- package/src/internal/apiService/index.ts +1 -1
- package/src/internal/apiService/transformers.ts +2 -2
- package/src/internal/asyncIteratorMap.test.ts +4 -4
- package/src/internal/asyncIteratorMap.ts +1 -1
- package/src/internal/asyncIteratorRace.test.ts +149 -0
- package/src/internal/asyncIteratorRace.ts +79 -0
- package/src/internal/batch.test.ts +50 -0
- package/src/internal/batch.ts +9 -0
- package/src/internal/batchLoading.test.ts +13 -14
- package/src/internal/batchLoading.ts +8 -8
- package/src/internal/devices/apiService.ts +58 -51
- package/src/internal/devices/cryptoService.ts +22 -17
- package/src/internal/devices/index.ts +17 -10
- package/src/internal/devices/interface.ts +21 -12
- package/src/internal/devices/manager.test.ts +40 -9
- package/src/internal/devices/manager.ts +3 -3
- package/src/internal/download/apiService.ts +72 -52
- package/src/internal/download/cryptoService.ts +34 -18
- package/src/internal/download/fileDownloader.test.ts +25 -9
- package/src/internal/download/fileDownloader.ts +38 -20
- package/src/internal/download/index.ts +19 -19
- package/src/internal/download/interface.ts +19 -20
- package/src/internal/download/queue.ts +3 -3
- package/src/internal/download/telemetry.test.ts +11 -11
- package/src/internal/download/telemetry.ts +24 -14
- package/src/internal/download/thumbnailDownloader.test.ts +11 -6
- package/src/internal/download/thumbnailDownloader.ts +43 -32
- package/src/internal/errors.ts +7 -5
- package/src/internal/events/apiService.ts +46 -36
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +26 -48
- package/src/internal/events/eventManager.test.ts +211 -93
- package/src/internal/events/eventManager.ts +72 -117
- package/src/internal/events/index.ts +71 -91
- package/src/internal/events/interface.ts +92 -29
- package/src/internal/events/volumeEventManager.test.ts +239 -0
- package/src/internal/events/volumeEventManager.ts +68 -57
- package/src/internal/nodes/apiService.test.ts +197 -147
- package/src/internal/nodes/apiService.ts +288 -174
- package/src/internal/nodes/cache.test.ts +48 -20
- package/src/internal/nodes/cache.ts +79 -45
- package/src/internal/nodes/cryptoCache.test.ts +34 -14
- package/src/internal/nodes/cryptoCache.ts +10 -5
- package/src/internal/nodes/cryptoService.test.ts +492 -351
- package/src/internal/nodes/cryptoService.ts +171 -89
- package/src/internal/nodes/events.test.ts +48 -344
- package/src/internal/nodes/events.ts +48 -254
- package/src/internal/nodes/extendedAttributes.test.ts +28 -24
- package/src/internal/nodes/extendedAttributes.ts +20 -15
- package/src/internal/nodes/index.test.ts +51 -55
- package/src/internal/nodes/index.ts +32 -22
- package/src/internal/nodes/interface.ts +44 -31
- package/src/internal/nodes/nodesAccess.test.ts +237 -130
- package/src/internal/nodes/nodesAccess.ts +113 -50
- package/src/internal/nodes/nodesManagement.test.ts +64 -39
- package/src/internal/nodes/nodesManagement.ts +51 -62
- package/src/internal/nodes/nodesRevisions.ts +7 -7
- package/src/internal/nodes/validations.ts +2 -2
- package/src/internal/photos/albums.ts +5 -5
- package/src/internal/photos/apiService.ts +4 -7
- package/src/internal/photos/cache.ts +1 -1
- package/src/internal/photos/index.ts +8 -8
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/photosTimeline.ts +4 -5
- package/src/internal/sdkEvents.test.ts +10 -10
- package/src/internal/sdkEvents.ts +5 -13
- package/src/internal/shares/apiService.ts +44 -33
- package/src/internal/shares/cache.test.ts +6 -4
- package/src/internal/shares/cache.ts +25 -14
- package/src/internal/shares/cryptoCache.test.ts +17 -11
- package/src/internal/shares/cryptoCache.ts +4 -4
- package/src/internal/shares/cryptoService.test.ts +72 -74
- package/src/internal/shares/cryptoService.ts +48 -23
- package/src/internal/shares/index.ts +23 -11
- package/src/internal/shares/interface.ts +8 -8
- package/src/internal/shares/manager.test.ts +88 -80
- package/src/internal/shares/manager.ts +27 -23
- package/src/internal/sharing/apiService.ts +283 -175
- package/src/internal/sharing/cache.test.ts +35 -35
- package/src/internal/sharing/cache.ts +3 -3
- package/src/internal/sharing/cryptoService.test.ts +58 -46
- package/src/internal/sharing/cryptoService.ts +121 -83
- package/src/internal/sharing/events.test.ts +97 -207
- package/src/internal/sharing/events.ts +46 -157
- package/src/internal/sharing/index.ts +24 -16
- package/src/internal/sharing/interface.ts +46 -42
- package/src/internal/sharing/sharingAccess.test.ts +71 -65
- package/src/internal/sharing/sharingAccess.ts +39 -21
- package/src/internal/sharing/sharingManagement.test.ts +405 -335
- package/src/internal/sharing/sharingManagement.ts +144 -75
- package/src/internal/uids.ts +1 -1
- package/src/internal/upload/apiService.ts +168 -119
- package/src/internal/upload/blockVerifier.ts +8 -6
- package/src/internal/upload/chunkStreamReader.test.ts +7 -7
- package/src/internal/upload/cryptoService.ts +42 -36
- package/src/internal/upload/digests.ts +2 -2
- package/src/internal/upload/fileUploader.test.ts +15 -3
- package/src/internal/upload/fileUploader.ts +39 -17
- package/src/internal/upload/index.ts +17 -18
- package/src/internal/upload/interface.ts +79 -77
- package/src/internal/upload/manager.test.ts +222 -175
- package/src/internal/upload/manager.ts +74 -80
- package/src/internal/upload/queue.ts +3 -3
- package/src/internal/upload/streamUploader.test.ts +40 -27
- package/src/internal/upload/streamUploader.ts +87 -71
- package/src/internal/upload/telemetry.test.ts +11 -11
- package/src/internal/upload/telemetry.ts +25 -15
- package/src/internal/wait.test.ts +1 -1
- package/src/internal/wait.ts +3 -3
- package/src/protonDriveClient.ts +189 -276
- package/src/protonDrivePhotosClient.ts +20 -13
- package/src/telemetry.ts +60 -52
- package/src/tests/logger.ts +1 -1
- package/src/tests/telemetry.ts +2 -2
- package/src/transformers.ts +27 -21
- package/src/version.ts +0 -1
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { ProtonDriveEntitiesCache, Logger } from
|
|
2
|
-
import { getErrorMessage } from
|
|
3
|
-
import { Volume } from
|
|
1
|
+
import { ProtonDriveEntitiesCache, Logger } from '../../interface';
|
|
2
|
+
import { getErrorMessage } from '../errors';
|
|
3
|
+
import { Volume } from './interface';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Provides caching for shares and volume metadata.
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* The cache is responsible for serialising and deserialising volume metadata.
|
|
9
|
+
*
|
|
10
|
+
* This is only intended for the owner's main volume. There is no cache invalidation.
|
|
9
11
|
*/
|
|
10
12
|
export class SharesCache {
|
|
11
|
-
constructor(
|
|
13
|
+
constructor(
|
|
14
|
+
private logger: Logger,
|
|
15
|
+
private driveCache: ProtonDriveEntitiesCache,
|
|
16
|
+
) {
|
|
12
17
|
this.logger = logger;
|
|
13
18
|
this.driveCache = driveCache;
|
|
14
19
|
}
|
|
@@ -49,16 +54,22 @@ function serializeVolume(volume: Volume) {
|
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
function deserializeVolume(shareData: string): Volume {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
!volume ||
|
|
55
|
-
|
|
56
|
-
!volume.
|
|
57
|
-
|
|
58
|
-
!volume.
|
|
59
|
-
|
|
57
|
+
const volume = JSON.parse(shareData);
|
|
58
|
+
if (
|
|
59
|
+
!volume ||
|
|
60
|
+
typeof volume !== 'object' ||
|
|
61
|
+
!volume.volumeId ||
|
|
62
|
+
typeof volume.volumeId !== 'string' ||
|
|
63
|
+
!volume.shareId ||
|
|
64
|
+
typeof volume.shareId !== 'string' ||
|
|
65
|
+
!volume.rootNodeId ||
|
|
66
|
+
typeof volume.rootNodeId !== 'string' ||
|
|
67
|
+
!volume.creatorEmail ||
|
|
68
|
+
typeof volume.creatorEmail !== 'string' ||
|
|
69
|
+
!volume.addressId ||
|
|
70
|
+
typeof volume.addressId !== 'string'
|
|
60
71
|
) {
|
|
61
72
|
throw new Error('Invalid volume data');
|
|
62
73
|
}
|
|
63
74
|
return volume;
|
|
64
|
-
}
|
|
75
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { PrivateKey, SessionKey } from
|
|
2
|
-
import { MemoryCache } from
|
|
3
|
-
import { CachedCryptoMaterial } from
|
|
4
|
-
import { SharesCryptoCache } from
|
|
1
|
+
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
|
+
import { MemoryCache } from '../../cache';
|
|
3
|
+
import { CachedCryptoMaterial } from '../../interface';
|
|
4
|
+
import { SharesCryptoCache } from './cryptoCache';
|
|
5
5
|
|
|
6
6
|
describe('sharesCryptoCache', () => {
|
|
7
7
|
let memoryCache: MemoryCache<CachedCryptoMaterial>;
|
|
8
8
|
let cache: SharesCryptoCache;
|
|
9
9
|
|
|
10
10
|
const generatePrivateKey = (name: string) => {
|
|
11
|
-
return name as unknown as PrivateKey
|
|
12
|
-
}
|
|
11
|
+
return name as unknown as PrivateKey;
|
|
12
|
+
};
|
|
13
13
|
|
|
14
14
|
const generateSessionKey = (name: string) => {
|
|
15
|
-
return name as unknown as SessionKey
|
|
16
|
-
}
|
|
15
|
+
return name as unknown as SessionKey;
|
|
16
|
+
};
|
|
17
17
|
|
|
18
18
|
beforeEach(() => {
|
|
19
19
|
memoryCache = new MemoryCache();
|
|
@@ -32,8 +32,14 @@ describe('sharesCryptoCache', () => {
|
|
|
32
32
|
|
|
33
33
|
it('should replace and retrieve new keys', async () => {
|
|
34
34
|
const shareId = 'newShareId';
|
|
35
|
-
const keys1 = {
|
|
36
|
-
|
|
35
|
+
const keys1 = {
|
|
36
|
+
key: generatePrivateKey('privateKey1'),
|
|
37
|
+
passphraseSessionKey: generateSessionKey('sessionKey1'),
|
|
38
|
+
};
|
|
39
|
+
const keys2 = {
|
|
40
|
+
key: generatePrivateKey('privateKey2'),
|
|
41
|
+
passphraseSessionKey: generateSessionKey('sessionKey2'),
|
|
42
|
+
};
|
|
37
43
|
|
|
38
44
|
await cache.setShareKey(shareId, keys1);
|
|
39
45
|
await cache.setShareKey(shareId, keys2);
|
|
@@ -67,4 +73,4 @@ describe('sharesCryptoCache', () => {
|
|
|
67
73
|
expect(`${error}`).toBe('Error: Entity not found');
|
|
68
74
|
}
|
|
69
75
|
});
|
|
70
|
-
});
|
|
76
|
+
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { ProtonDriveCryptoCache } from
|
|
2
|
-
import { DecryptedShareKey } from
|
|
1
|
+
import { ProtonDriveCryptoCache } from '../../interface';
|
|
2
|
+
import { DecryptedShareKey } from './interface';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Provides caching for share crypto material.
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
7
|
* The cache is responsible for serialising and deserialising share
|
|
8
8
|
* crypto material.
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
10
|
* The share crypto materials are cached so the updates to the root
|
|
11
11
|
* nodes can be decrypted without the need to fetch the share keys
|
|
12
12
|
* from the server again. Otherwise the rest of the tree requires
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { DriveCrypto, PrivateKey, SessionKey, VERIFICATION_STATUS } from
|
|
2
|
-
import { ProtonDriveAccount, ProtonDriveTelemetry } from
|
|
3
|
-
import { getMockTelemetry } from
|
|
4
|
-
import { EncryptedRootShare, ShareType } from
|
|
5
|
-
import { SharesCryptoService } from
|
|
1
|
+
import { DriveCrypto, PrivateKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
|
|
2
|
+
import { ProtonDriveAccount, ProtonDriveTelemetry } from '../../interface';
|
|
3
|
+
import { getMockTelemetry } from '../../tests/telemetry';
|
|
4
|
+
import { EncryptedRootShare, ShareType } from './interface';
|
|
5
|
+
import { SharesCryptoService } from './cryptoService';
|
|
6
6
|
|
|
7
|
-
describe(
|
|
7
|
+
describe('SharesCryptoService', () => {
|
|
8
8
|
let telemetry: ProtonDriveTelemetry;
|
|
9
9
|
let driveCrypto: DriveCrypto;
|
|
10
10
|
let account: ProtonDriveAccount;
|
|
@@ -14,89 +14,89 @@ describe("SharesCryptoService", () => {
|
|
|
14
14
|
telemetry = getMockTelemetry();
|
|
15
15
|
// @ts-expect-error No need to implement all methods for mocking
|
|
16
16
|
driveCrypto = {
|
|
17
|
-
decryptKey: jest.fn(async () =>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
decryptKey: jest.fn(async () =>
|
|
18
|
+
Promise.resolve({
|
|
19
|
+
passphrase: 'pass',
|
|
20
|
+
key: 'decryptedKey' as unknown as PrivateKey,
|
|
21
|
+
passphraseSessionKey: 'sessionKey' as unknown as SessionKey,
|
|
22
|
+
verified: VERIFICATION_STATUS.SIGNED_AND_VALID,
|
|
23
|
+
}),
|
|
24
|
+
),
|
|
23
25
|
};
|
|
24
26
|
account = {
|
|
25
27
|
// @ts-expect-error No need to implement full response for mocking
|
|
26
28
|
getOwnAddress: jest.fn(async () => ({
|
|
27
|
-
keys: [{ key:
|
|
29
|
+
keys: [{ key: 'addressKey' as unknown as PrivateKey }],
|
|
28
30
|
})),
|
|
29
31
|
getPublicKeys: jest.fn(async () => []),
|
|
30
32
|
};
|
|
31
33
|
cryptoService = new SharesCryptoService(telemetry, driveCrypto, account);
|
|
32
34
|
});
|
|
33
35
|
|
|
34
|
-
it(
|
|
35
|
-
const result = await cryptoService.decryptRootShare(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
} as EncryptedRootShare,
|
|
47
|
-
);
|
|
36
|
+
it('should decrypt root share', async () => {
|
|
37
|
+
const result = await cryptoService.decryptRootShare({
|
|
38
|
+
shareId: 'shareId',
|
|
39
|
+
addressId: 'addressId',
|
|
40
|
+
creatorEmail: 'signatureEmail',
|
|
41
|
+
encryptedCrypto: {
|
|
42
|
+
armoredKey: 'armoredKey',
|
|
43
|
+
armoredPassphrase: 'armoredPassphrase',
|
|
44
|
+
armoredPassphraseSignature: 'armoredPassphraseSignature',
|
|
45
|
+
},
|
|
46
|
+
type: ShareType.Main,
|
|
47
|
+
} as EncryptedRootShare);
|
|
48
48
|
|
|
49
49
|
expect(result).toMatchObject({
|
|
50
50
|
share: {
|
|
51
|
-
shareId:
|
|
52
|
-
author: { ok: true, value:
|
|
51
|
+
shareId: 'shareId',
|
|
52
|
+
author: { ok: true, value: 'signatureEmail' },
|
|
53
53
|
},
|
|
54
54
|
key: {
|
|
55
|
-
key:
|
|
56
|
-
passphraseSessionKey:
|
|
55
|
+
key: 'decryptedKey',
|
|
56
|
+
passphraseSessionKey: 'sessionKey',
|
|
57
57
|
},
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
expect(account.getOwnAddress).toHaveBeenCalledWith(
|
|
61
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
60
|
+
expect(account.getOwnAddress).toHaveBeenCalledWith('addressId');
|
|
61
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
62
62
|
expect(telemetry.logEvent).not.toHaveBeenCalled();
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
it(
|
|
66
|
-
driveCrypto.decryptKey = jest.fn(async () =>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const result = await cryptoService.decryptRootShare(
|
|
74
|
-
{
|
|
75
|
-
shareId: "shareId",
|
|
76
|
-
addressId: "addressId",
|
|
77
|
-
creatorEmail: "signatureEmail",
|
|
78
|
-
encryptedCrypto: {
|
|
79
|
-
armoredKey: "armoredKey",
|
|
80
|
-
armoredPassphrase: "armoredPassphrase",
|
|
81
|
-
armoredPassphraseSignature: "armoredPassphraseSignature",
|
|
82
|
-
},
|
|
83
|
-
type: ShareType.Main,
|
|
84
|
-
} as EncryptedRootShare,
|
|
65
|
+
it('should decrypt root share with signiture verification error', async () => {
|
|
66
|
+
driveCrypto.decryptKey = jest.fn(async () =>
|
|
67
|
+
Promise.resolve({
|
|
68
|
+
passphrase: 'pass',
|
|
69
|
+
key: 'decryptedKey' as unknown as PrivateKey,
|
|
70
|
+
passphraseSessionKey: 'sessionKey' as unknown as SessionKey,
|
|
71
|
+
verified: VERIFICATION_STATUS.NOT_SIGNED,
|
|
72
|
+
}),
|
|
85
73
|
);
|
|
86
74
|
|
|
75
|
+
const result = await cryptoService.decryptRootShare({
|
|
76
|
+
shareId: 'shareId',
|
|
77
|
+
addressId: 'addressId',
|
|
78
|
+
creatorEmail: 'signatureEmail',
|
|
79
|
+
encryptedCrypto: {
|
|
80
|
+
armoredKey: 'armoredKey',
|
|
81
|
+
armoredPassphrase: 'armoredPassphrase',
|
|
82
|
+
armoredPassphraseSignature: 'armoredPassphraseSignature',
|
|
83
|
+
},
|
|
84
|
+
type: ShareType.Main,
|
|
85
|
+
} as EncryptedRootShare);
|
|
86
|
+
|
|
87
87
|
expect(result).toMatchObject({
|
|
88
88
|
share: {
|
|
89
|
-
shareId:
|
|
90
|
-
author: { ok: false, error: { claimedAuthor:
|
|
89
|
+
shareId: 'shareId',
|
|
90
|
+
author: { ok: false, error: { claimedAuthor: 'signatureEmail', error: 'Missing signature' } },
|
|
91
91
|
},
|
|
92
92
|
key: {
|
|
93
|
-
key:
|
|
94
|
-
passphraseSessionKey:
|
|
93
|
+
key: 'decryptedKey',
|
|
94
|
+
passphraseSessionKey: 'sessionKey',
|
|
95
95
|
},
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
expect(account.getOwnAddress).toHaveBeenCalledWith(
|
|
99
|
-
expect(account.getPublicKeys).toHaveBeenCalledWith(
|
|
98
|
+
expect(account.getOwnAddress).toHaveBeenCalledWith('addressId');
|
|
99
|
+
expect(account.getPublicKeys).toHaveBeenCalledWith('signatureEmail');
|
|
100
100
|
expect(telemetry.logEvent).toHaveBeenCalledWith({
|
|
101
101
|
eventName: 'verificationError',
|
|
102
102
|
volumeType: 'own_volume',
|
|
@@ -106,23 +106,21 @@ describe("SharesCryptoService", () => {
|
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
it(
|
|
110
|
-
const error = new Error(
|
|
109
|
+
it('should handle decrypt issue of root share', async () => {
|
|
110
|
+
const error = new Error('Decryption error');
|
|
111
111
|
driveCrypto.decryptKey = jest.fn(async () => Promise.reject(error));
|
|
112
112
|
|
|
113
|
-
const result = cryptoService.decryptRootShare(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
} as EncryptedRootShare,
|
|
125
|
-
);
|
|
113
|
+
const result = cryptoService.decryptRootShare({
|
|
114
|
+
shareId: 'shareId',
|
|
115
|
+
addressId: 'addressId',
|
|
116
|
+
creatorEmail: 'signatureEmail',
|
|
117
|
+
encryptedCrypto: {
|
|
118
|
+
armoredKey: 'armoredKey',
|
|
119
|
+
armoredPassphrase: 'armoredPassphrase',
|
|
120
|
+
armoredPassphraseSignature: 'armoredPassphraseSignature',
|
|
121
|
+
},
|
|
122
|
+
type: ShareType.Main,
|
|
123
|
+
} as EncryptedRootShare);
|
|
126
124
|
|
|
127
125
|
await expect(result).rejects.toThrow(error);
|
|
128
126
|
|
|
@@ -1,16 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import {
|
|
2
|
+
ProtonDriveAccount,
|
|
3
|
+
resultOk,
|
|
4
|
+
resultError,
|
|
5
|
+
Result,
|
|
6
|
+
UnverifiedAuthorError,
|
|
7
|
+
ProtonDriveTelemetry,
|
|
8
|
+
Logger,
|
|
9
|
+
MetricVolumeType,
|
|
10
|
+
} from '../../interface';
|
|
11
|
+
import { DriveCrypto, PrivateKey, VERIFICATION_STATUS } from '../../crypto';
|
|
12
|
+
import { getVerificationMessage } from '../errors';
|
|
13
|
+
import {
|
|
14
|
+
EncryptedRootShare,
|
|
15
|
+
DecryptedRootShare,
|
|
16
|
+
EncryptedShareCrypto,
|
|
17
|
+
DecryptedShareKey,
|
|
18
|
+
ShareType,
|
|
19
|
+
} from './interface';
|
|
5
20
|
|
|
6
21
|
/**
|
|
7
22
|
* Provides crypto operations for share keys.
|
|
8
|
-
*
|
|
23
|
+
*
|
|
9
24
|
* The share crypto service is responsible for encrypting and decrypting share
|
|
10
25
|
* keys. It should export high-level actions only, such as "decrypt share"
|
|
11
26
|
* instead of low-level operations like "decrypt share passphrase". Low-level
|
|
12
27
|
* operations should be kept private to the module.
|
|
13
|
-
*
|
|
28
|
+
*
|
|
14
29
|
* The service owns the logic to switch between old and new crypto model.
|
|
15
30
|
*/
|
|
16
31
|
export class SharesCryptoService {
|
|
@@ -19,7 +34,11 @@ export class SharesCryptoService {
|
|
|
19
34
|
private reportedDecryptionErrors = new Set<string>();
|
|
20
35
|
private reportedVerificationErrors = new Set<string>();
|
|
21
36
|
|
|
22
|
-
constructor(
|
|
37
|
+
constructor(
|
|
38
|
+
private telemetry: ProtonDriveTelemetry,
|
|
39
|
+
private driveCrypto: DriveCrypto,
|
|
40
|
+
private account: ProtonDriveAccount,
|
|
41
|
+
) {
|
|
23
42
|
this.telemetry = telemetry;
|
|
24
43
|
this.logger = telemetry.getLogger('shares-crypto');
|
|
25
44
|
this.driveCrypto = driveCrypto;
|
|
@@ -27,16 +46,21 @@ export class SharesCryptoService {
|
|
|
27
46
|
}
|
|
28
47
|
|
|
29
48
|
async generateVolumeBootstrap(addressKey: PrivateKey): Promise<{
|
|
30
|
-
shareKey: { encrypted: EncryptedShareCrypto
|
|
49
|
+
shareKey: { encrypted: EncryptedShareCrypto; decrypted: DecryptedShareKey };
|
|
31
50
|
rootNode: {
|
|
32
|
-
key: { encrypted: EncryptedShareCrypto
|
|
33
|
-
encryptedName: string
|
|
34
|
-
armoredHashKey: string
|
|
35
|
-
}
|
|
51
|
+
key: { encrypted: EncryptedShareCrypto; decrypted: DecryptedShareKey };
|
|
52
|
+
encryptedName: string;
|
|
53
|
+
armoredHashKey: string;
|
|
54
|
+
};
|
|
36
55
|
}> {
|
|
37
56
|
const shareKey = await this.driveCrypto.generateKey([addressKey], addressKey);
|
|
38
57
|
const rootNodeKey = await this.driveCrypto.generateKey([shareKey.decrypted.key], addressKey);
|
|
39
|
-
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
58
|
+
const { armoredNodeName } = await this.driveCrypto.encryptNodeName(
|
|
59
|
+
'root',
|
|
60
|
+
undefined,
|
|
61
|
+
shareKey.decrypted.key,
|
|
62
|
+
addressKey,
|
|
63
|
+
);
|
|
40
64
|
const { armoredHashKey } = await this.driveCrypto.generateHashKey(rootNodeKey.decrypted.key);
|
|
41
65
|
return {
|
|
42
66
|
shareKey,
|
|
@@ -45,10 +69,10 @@ export class SharesCryptoService {
|
|
|
45
69
|
encryptedName: armoredNodeName,
|
|
46
70
|
armoredHashKey,
|
|
47
71
|
},
|
|
48
|
-
}
|
|
72
|
+
};
|
|
49
73
|
}
|
|
50
74
|
|
|
51
|
-
async decryptRootShare(share: EncryptedRootShare): Promise<{ share: DecryptedRootShare
|
|
75
|
+
async decryptRootShare(share: EncryptedRootShare): Promise<{ share: DecryptedRootShare; key: DecryptedShareKey }> {
|
|
52
76
|
const { keys: addressKeys } = await this.account.getOwnAddress(share.addressId);
|
|
53
77
|
const addressPublicKeys = await this.account.getPublicKeys(share.creatorEmail);
|
|
54
78
|
|
|
@@ -60,7 +84,7 @@ export class SharesCryptoService {
|
|
|
60
84
|
share.encryptedCrypto.armoredPassphraseSignature,
|
|
61
85
|
addressKeys.map(({ key }) => key),
|
|
62
86
|
addressPublicKeys,
|
|
63
|
-
)
|
|
87
|
+
);
|
|
64
88
|
key = result.key;
|
|
65
89
|
passphraseSessionKey = result.passphraseSessionKey;
|
|
66
90
|
verified = result.verified;
|
|
@@ -69,12 +93,13 @@ export class SharesCryptoService {
|
|
|
69
93
|
throw error;
|
|
70
94
|
}
|
|
71
95
|
|
|
72
|
-
const author: Result<string, UnverifiedAuthorError> =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
96
|
+
const author: Result<string, UnverifiedAuthorError> =
|
|
97
|
+
verified === VERIFICATION_STATUS.SIGNED_AND_VALID
|
|
98
|
+
? resultOk(share.creatorEmail)
|
|
99
|
+
: resultError({
|
|
100
|
+
claimedAuthor: share.creatorEmail,
|
|
101
|
+
error: getVerificationMessage(verified),
|
|
102
|
+
});
|
|
78
103
|
|
|
79
104
|
if (!author.ok) {
|
|
80
105
|
await this.reportVerificationError(share);
|
|
@@ -89,7 +114,7 @@ export class SharesCryptoService {
|
|
|
89
114
|
key,
|
|
90
115
|
passphraseSessionKey,
|
|
91
116
|
},
|
|
92
|
-
}
|
|
117
|
+
};
|
|
93
118
|
}
|
|
94
119
|
|
|
95
120
|
private reportDecryptionError(share: EncryptedRootShare, error?: unknown) {
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ProtonDriveEntitiesCache,
|
|
3
|
+
ProtonDriveCryptoCache,
|
|
4
|
+
ProtonDriveAccount,
|
|
5
|
+
ProtonDriveTelemetry,
|
|
6
|
+
} from '../../interface';
|
|
2
7
|
import { DriveCrypto } from '../../crypto';
|
|
3
|
-
import { DriveAPIService } from
|
|
4
|
-
import { SharesAPIService } from
|
|
5
|
-
import { SharesCryptoCache } from
|
|
6
|
-
import { SharesCache } from
|
|
7
|
-
import { SharesCryptoService } from
|
|
8
|
-
import { SharesManager } from
|
|
8
|
+
import { DriveAPIService } from '../apiService';
|
|
9
|
+
import { SharesAPIService } from './apiService';
|
|
10
|
+
import { SharesCryptoCache } from './cryptoCache';
|
|
11
|
+
import { SharesCache } from './cache';
|
|
12
|
+
import { SharesCryptoService } from './cryptoService';
|
|
13
|
+
import { SharesManager } from './manager';
|
|
9
14
|
|
|
10
|
-
export type { EncryptedShare } from
|
|
15
|
+
export type { EncryptedShare } from './interface';
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* Provides facade for the whole shares module.
|
|
14
|
-
*
|
|
19
|
+
*
|
|
15
20
|
* The shares module is responsible for handling shares metadata, including
|
|
16
21
|
* API communication, encryption, decryption, caching, and event handling.
|
|
17
|
-
*
|
|
22
|
+
*
|
|
18
23
|
* This facade provides internal interface that other modules can use to
|
|
19
24
|
* interact with the shares.
|
|
20
25
|
*/
|
|
@@ -30,6 +35,13 @@ export function initSharesModule(
|
|
|
30
35
|
const cache = new SharesCache(telemetry.getLogger('shares-cache'), driveEntitiesCache);
|
|
31
36
|
const cryptoCache = new SharesCryptoCache(driveCryptoCache);
|
|
32
37
|
const cryptoService = new SharesCryptoService(telemetry, crypto, account);
|
|
33
|
-
const sharesManager = new SharesManager(
|
|
38
|
+
const sharesManager = new SharesManager(
|
|
39
|
+
telemetry.getLogger('shares'),
|
|
40
|
+
api,
|
|
41
|
+
cache,
|
|
42
|
+
cryptoCache,
|
|
43
|
+
cryptoService,
|
|
44
|
+
account,
|
|
45
|
+
);
|
|
34
46
|
return sharesManager;
|
|
35
47
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { PrivateKey, SessionKey } from
|
|
2
|
-
import { Result, UnverifiedAuthorError } from
|
|
1
|
+
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
|
+
import { Result, UnverifiedAuthorError } from '../../interface';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Internal interface providing basic identification of volume and its root
|
|
6
6
|
* share and node.
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* No interface should inherit from this, this is only for composition to
|
|
9
9
|
* create basic volume or share interfaces.
|
|
10
|
-
*
|
|
10
|
+
*
|
|
11
11
|
* Volumes do not have necessarily share or node, but we want to always
|
|
12
12
|
* know what is the root share or node, thus we want to keep this for both
|
|
13
13
|
* volumes or any type of share.
|
|
@@ -21,7 +21,7 @@ export interface VolumeShareNodeIDs {
|
|
|
21
21
|
export type Volume = {
|
|
22
22
|
/**
|
|
23
23
|
* Creator email and address ID come from the default share.
|
|
24
|
-
*
|
|
24
|
+
*
|
|
25
25
|
* The idea is to keep this information synced, so whenever we check
|
|
26
26
|
* cached volume information, we have creator details at hand for any
|
|
27
27
|
* verification checks or creation needs.
|
|
@@ -62,7 +62,7 @@ interface BaseRootShare extends BaseShare {
|
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* Interface used only internaly in the shares module.
|
|
65
|
-
*
|
|
65
|
+
*
|
|
66
66
|
* Outside of the module, the decrypted share interface should be used.
|
|
67
67
|
*/
|
|
68
68
|
export interface EncryptedShare extends BaseShare {
|
|
@@ -77,7 +77,7 @@ interface ShareMembership {
|
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* Interface used only internaly in the shares module.
|
|
80
|
-
*
|
|
80
|
+
*
|
|
81
81
|
* Outside of the module, the decrypted share interface should be used.
|
|
82
82
|
*/
|
|
83
83
|
export interface EncryptedRootShare extends BaseRootShare {
|
|
@@ -89,7 +89,7 @@ export interface EncryptedRootShare extends BaseRootShare {
|
|
|
89
89
|
* Interface holding decrypted share metadata.
|
|
90
90
|
*/
|
|
91
91
|
export interface DecryptedRootShare extends BaseRootShare {
|
|
92
|
-
author: Result<string, UnverifiedAuthorError
|
|
92
|
+
author: Result<string, UnverifiedAuthorError>;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
export interface EncryptedShareCrypto {
|