@protontech/drive-sdk 0.14.9 → 0.15.0
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/README.md +5 -0
- package/dist/cache/index.d.ts +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/nullCache.d.ts +1 -1
- package/dist/crypto/driveCrypto.d.ts +7 -11
- package/dist/crypto/driveCrypto.js +35 -38
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/driveCrypto.test.js +1 -21
- package/dist/crypto/driveCrypto.test.js.map +1 -1
- package/dist/crypto/index.d.ts +2 -4
- package/dist/crypto/index.js +3 -6
- package/dist/crypto/index.js.map +1 -1
- package/dist/crypto/interface.d.ts +3 -35
- package/dist/crypto/interface.js +0 -7
- package/dist/crypto/interface.js.map +1 -1
- package/dist/crypto/openPGPCrypto.d.ts +10 -106
- package/dist/crypto/openPGPCrypto.js +2 -4
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/index.d.ts +1 -1
- package/dist/diagnostic/index.js +1 -1
- package/dist/diagnostic/index.js.map +1 -1
- package/dist/diagnostic/integrityVerificationStream.js +1 -2
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
- package/dist/diagnostic/interface.d.ts +1 -1
- package/dist/diagnostic/nodeUtils.d.ts +1 -1
- package/dist/diagnostic/sdkDiagnosticBase.d.ts +2 -2
- package/dist/diagnostic/sdkDiagnosticBase.js.map +1 -1
- package/dist/diagnostic/sdkDiagnosticMain.js +1 -1
- package/dist/diagnostic/sdkDiagnosticMain.js.map +1 -1
- package/dist/diagnostic/sdkDiagnosticPhotos.js +1 -1
- package/dist/diagnostic/sdkDiagnosticPhotos.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/interface/account.d.ts +1 -1
- package/dist/interface/devices.d.ts +1 -1
- package/dist/interface/index.d.ts +15 -15
- package/dist/interface/index.js +7 -7
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +1 -1
- package/dist/interface/photos.d.ts +1 -1
- package/dist/interface/sharing.d.ts +2 -2
- package/dist/internal/apiService/apiService.js +1 -1
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/coreTypes.d.ts +8552 -7249
- package/dist/internal/apiService/driveTypes.d.ts +47 -92
- package/dist/internal/apiService/errors.test.js +1 -1
- package/dist/internal/apiService/errors.test.js.map +1 -1
- package/dist/internal/apiService/index.d.ts +4 -4
- package/dist/internal/apiService/index.js +5 -5
- package/dist/internal/apiService/index.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/devices/index.d.ts +1 -1
- package/dist/internal/devices/manager.test.js +1 -1
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/download/cryptoService.js +3 -2
- package/dist/internal/download/cryptoService.js.map +1 -1
- package/dist/internal/download/fileDownloader.js +8 -7
- 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 +2 -2
- package/dist/internal/download/index.js +1 -1
- package/dist/internal/download/index.js.map +1 -1
- package/dist/internal/download/interface.d.ts +1 -1
- package/dist/internal/download/telemetry.js +2 -3
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +5 -0
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/download/thumbnailDownloader.d.ts +1 -1
- package/dist/internal/download/thumbnailDownloader.js +1 -1
- 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 -0
- package/dist/internal/errors.js +11 -0
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +1 -1
- package/dist/internal/events/coreEventManager.test.js.map +1 -1
- package/dist/internal/events/eventManager.d.ts +1 -1
- package/dist/internal/events/eventManager.js +1 -0
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/index.js +1 -1
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +8 -0
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.js +1 -1
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.js +1 -1
- package/dist/internal/events/volumeEventManager.test.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +10 -4
- package/dist/internal/nodes/apiService.js +6 -2
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +6 -2
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +1 -1
- package/dist/internal/nodes/cryptoCache.d.ts +1 -1
- package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoReporter.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +2 -2
- package/dist/internal/nodes/cryptoService.js +2 -2
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +1 -1
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +4 -4
- package/dist/internal/nodes/index.js +2 -2
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +3 -3
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +1 -1
- package/dist/internal/nodes/nodesAccess.d.ts +2 -2
- package/dist/internal/nodes/nodesAccess.js +3 -3
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +2 -2
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +1 -1
- package/dist/internal/nodes/nodesManagement.js +2 -2
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +6 -6
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +1 -1
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/addToAlbum.d.ts +1 -1
- package/dist/internal/photos/addToAlbum.js.map +1 -1
- package/dist/internal/photos/albumsCrypto.js.map +1 -1
- package/dist/internal/photos/albumsManager.js +15 -5
- package/dist/internal/photos/albumsManager.js.map +1 -1
- package/dist/internal/photos/albumsManager.test.js +3 -2
- package/dist/internal/photos/albumsManager.test.js.map +1 -1
- package/dist/internal/photos/apiService.js +1 -1
- package/dist/internal/photos/index.d.ts +2 -2
- package/dist/internal/photos/index.js +5 -5
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +2 -2
- package/dist/internal/photos/nodes.d.ts +2 -2
- package/dist/internal/photos/nodes.js +11 -1
- package/dist/internal/photos/nodes.js.map +1 -1
- package/dist/internal/photos/nodes.test.js +17 -3
- package/dist/internal/photos/nodes.test.js.map +1 -1
- package/dist/internal/photos/photosManager.d.ts +1 -1
- package/dist/internal/photos/photosManager.js +1 -1
- package/dist/internal/photos/photosManager.js.map +1 -1
- package/dist/internal/photos/photosManager.test.js +1 -1
- package/dist/internal/photos/photosManager.test.js.map +1 -1
- package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
- package/dist/internal/photos/timeline.test.js.map +1 -1
- package/dist/internal/photos/upload.d.ts +1 -1
- package/dist/internal/shares/apiService.d.ts +1 -1
- package/dist/internal/shares/cache.d.ts +1 -1
- package/dist/internal/shares/cryptoCache.test.js.map +1 -1
- package/dist/internal/shares/cryptoService.d.ts +2 -2
- package/dist/internal/shares/cryptoService.js +1 -1
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +1 -1
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/shares/index.d.ts +2 -2
- package/dist/internal/shares/index.js +1 -1
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/manager.d.ts +2 -2
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +2 -2
- package/dist/internal/sharing/cryptoService.d.ts +2 -3
- package/dist/internal/sharing/cryptoService.js +10 -31
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +3 -3
- package/dist/internal/sharing/index.js +1 -1
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +2 -2
- package/dist/internal/sharing/sharingAccess.d.ts +1 -1
- package/dist/internal/sharing/sharingAccess.js +1 -1
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +1 -1
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.d.ts +3 -3
- package/dist/internal/sharing/sharingManagement.js +1 -1
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +2 -2
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
- package/dist/internal/sharingPublic/index.d.ts +2 -2
- package/dist/internal/sharingPublic/index.js +3 -3
- package/dist/internal/sharingPublic/index.js.map +1 -1
- package/dist/internal/sharingPublic/nodes.d.ts +4 -4
- package/dist/internal/sharingPublic/nodes.js +4 -1
- package/dist/internal/sharingPublic/nodes.js.map +1 -1
- package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
- package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
- package/dist/internal/upload/apiService.d.ts +1 -1
- package/dist/internal/upload/apiService.js +13 -6
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/cryptoService.d.ts +1 -1
- package/dist/internal/upload/cryptoService.js +5 -4
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +2 -2
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +1 -1
- package/dist/internal/upload/manager.d.ts +1 -1
- package/dist/internal/upload/manager.js +1 -1
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/smallFileUploader.test.js +1 -1
- package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +3 -3
- package/dist/internal/upload/streamUploader.js +1 -1
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +2 -2
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.d.ts +1 -1
- package/dist/internal/upload/telemetry.js +2 -3
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +5 -0
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/polyfill.d.ts +1 -0
- package/dist/polyfill.js +4 -0
- package/dist/polyfill.js.map +1 -0
- package/dist/protonDriveClient.d.ts +1 -1
- package/dist/protonDriveClient.js +3 -3
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +7 -1
- package/dist/protonDrivePhotosClient.js +13 -4
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +3 -3
- package/dist/protonDrivePublicLinkClient.js +3 -3
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/dist/transformers.d.ts +1 -1
- package/package.json +8 -4
- package/src/cache/index.ts +1 -1
- package/src/cache/memoryCache.ts +1 -1
- package/src/cache/nullCache.ts +1 -1
- package/src/crypto/driveCrypto.test.ts +1 -24
- package/src/crypto/driveCrypto.ts +37 -35
- package/src/crypto/index.ts +2 -4
- package/src/crypto/interface.ts +3 -49
- package/src/crypto/openPGPCrypto.ts +4 -88
- package/src/diagnostic/index.ts +3 -3
- package/src/diagnostic/integrityVerificationStream.ts +1 -2
- package/src/diagnostic/interface.ts +1 -1
- package/src/diagnostic/nodeUtils.ts +1 -1
- package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
- package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
- package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
- package/src/diagnostic/telemetry.ts +1 -1
- package/src/index.ts +4 -3
- package/src/interface/account.ts +1 -1
- package/src/interface/devices.ts +1 -1
- package/src/interface/index.ts +40 -40
- package/src/interface/nodes.ts +1 -1
- package/src/interface/photos.ts +1 -1
- package/src/interface/sharing.ts +2 -2
- package/src/internal/apiService/apiService.test.ts +2 -2
- package/src/internal/apiService/apiService.ts +3 -3
- package/src/internal/apiService/coreTypes.ts +8641 -7349
- package/src/internal/apiService/driveTypes.ts +47 -92
- package/src/internal/apiService/errors.test.ts +2 -2
- package/src/internal/apiService/index.ts +4 -4
- package/src/internal/apiService/transformers.ts +1 -1
- package/src/internal/devices/index.ts +1 -1
- package/src/internal/devices/manager.test.ts +2 -2
- package/src/internal/download/cryptoService.ts +6 -11
- package/src/internal/download/fileDownloader.test.ts +3 -3
- package/src/internal/download/fileDownloader.ts +8 -6
- package/src/internal/download/index.ts +3 -3
- package/src/internal/download/interface.ts +1 -1
- package/src/internal/download/seekableStream.test.ts +1 -1
- package/src/internal/download/telemetry.test.ts +7 -1
- package/src/internal/download/telemetry.ts +4 -7
- package/src/internal/download/thumbnailDownloader.test.ts +1 -1
- package/src/internal/download/thumbnailDownloader.ts +2 -2
- package/src/internal/errors.ts +15 -0
- package/src/internal/events/apiService.ts +2 -2
- package/src/internal/events/coreEventManager.test.ts +1 -1
- package/src/internal/events/eventManager.ts +2 -1
- package/src/internal/events/index.ts +2 -2
- package/src/internal/events/interface.ts +8 -0
- package/src/internal/events/volumeEventManager.test.ts +1 -1
- package/src/internal/events/volumeEventManager.ts +1 -1
- package/src/internal/nodes/apiService.test.ts +8 -3
- package/src/internal/nodes/apiService.ts +22 -7
- package/src/internal/nodes/cache.test.ts +1 -1
- package/src/internal/nodes/cache.ts +1 -1
- package/src/internal/nodes/cryptoCache.test.ts +1 -1
- package/src/internal/nodes/cryptoCache.ts +1 -1
- package/src/internal/nodes/cryptoReporter.ts +4 -4
- package/src/internal/nodes/cryptoService.test.ts +2 -2
- package/src/internal/nodes/cryptoService.ts +14 -15
- package/src/internal/nodes/events.test.ts +1 -1
- package/src/internal/nodes/extendedAttributes.test.ts +3 -3
- package/src/internal/nodes/index.test.ts +8 -8
- package/src/internal/nodes/index.ts +6 -6
- package/src/internal/nodes/interface.ts +6 -6
- package/src/internal/nodes/nodeName.test.ts +1 -1
- package/src/internal/nodes/nodesAccess.test.ts +3 -3
- package/src/internal/nodes/nodesAccess.ts +6 -6
- package/src/internal/nodes/nodesManagement.test.ts +4 -4
- package/src/internal/nodes/nodesManagement.ts +6 -6
- package/src/internal/nodes/nodesRevisions.ts +1 -1
- package/src/internal/photos/addToAlbum.ts +1 -1
- package/src/internal/photos/albumsCrypto.ts +1 -0
- package/src/internal/photos/albumsManager.test.ts +4 -3
- package/src/internal/photos/albumsManager.ts +13 -5
- package/src/internal/photos/apiService.ts +1 -1
- package/src/internal/photos/index.ts +7 -7
- package/src/internal/photos/interface.ts +2 -2
- package/src/internal/photos/nodes.test.ts +22 -6
- package/src/internal/photos/nodes.ts +16 -9
- package/src/internal/photos/photosManager.test.ts +5 -5
- package/src/internal/photos/photosManager.ts +4 -4
- package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
- package/src/internal/photos/timeline.test.ts +1 -1
- package/src/internal/photos/upload.ts +3 -3
- package/src/internal/sdkEvents.ts +1 -1
- package/src/internal/shares/apiService.ts +1 -1
- package/src/internal/shares/cache.ts +1 -1
- package/src/internal/shares/cryptoCache.test.ts +1 -1
- package/src/internal/shares/cryptoService.test.ts +1 -1
- package/src/internal/shares/cryptoService.ts +8 -8
- package/src/internal/shares/index.ts +5 -5
- package/src/internal/shares/manager.ts +2 -2
- package/src/internal/sharing/apiService.ts +10 -10
- package/src/internal/sharing/cryptoService.test.ts +1 -1
- package/src/internal/sharing/cryptoService.ts +12 -37
- package/src/internal/sharing/events.test.ts +2 -2
- package/src/internal/sharing/index.ts +3 -3
- package/src/internal/sharing/interface.ts +2 -2
- package/src/internal/sharing/sharingAccess.test.ts +4 -4
- package/src/internal/sharing/sharingAccess.ts +3 -3
- package/src/internal/sharing/sharingManagement.test.ts +4 -4
- package/src/internal/sharing/sharingManagement.ts +9 -9
- package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
- package/src/internal/sharingPublic/index.ts +6 -6
- package/src/internal/sharingPublic/nodes.ts +7 -4
- package/src/internal/sharingPublic/session/apiService.ts +1 -1
- package/src/internal/sharingPublic/session/manager.ts +1 -1
- package/src/internal/upload/apiService.ts +17 -8
- package/src/internal/upload/cryptoService.ts +8 -6
- package/src/internal/upload/fileUploader.test.ts +4 -4
- package/src/internal/upload/index.ts +3 -3
- package/src/internal/upload/interface.ts +1 -2
- package/src/internal/upload/manager.ts +4 -4
- package/src/internal/upload/smallFileUploader.test.ts +4 -4
- package/src/internal/upload/streamUploader.test.ts +5 -5
- package/src/internal/upload/streamUploader.ts +4 -4
- package/src/internal/upload/telemetry.test.ts +7 -1
- package/src/internal/upload/telemetry.ts +5 -8
- package/src/polyfill.ts +1 -0
- package/src/protonDriveClient.ts +32 -32
- package/src/protonDrivePhotosClient.ts +42 -32
- package/src/protonDrivePublicLinkClient.ts +25 -25
- package/src/transformers.ts +9 -9
- package/dist/crypto/hmac.d.ts +0 -22
- package/dist/crypto/hmac.js +0 -44
- package/dist/crypto/hmac.js.map +0 -1
- package/dist/crypto/utils.d.ts +0 -2
- package/dist/crypto/utils.js +0 -35
- package/dist/crypto/utils.js.map +0 -1
- package/src/crypto/hmac.ts +0 -46
- package/src/crypto/utils.ts +0 -40
|
@@ -220,7 +220,11 @@ export class AlbumsManager {
|
|
|
220
220
|
this.logger,
|
|
221
221
|
signal,
|
|
222
222
|
);
|
|
223
|
-
|
|
223
|
+
try {
|
|
224
|
+
yield* process.execute(photoNodeUids);
|
|
225
|
+
} finally {
|
|
226
|
+
await this.nodesService.notifyNodeChanged(albumNodeUid);
|
|
227
|
+
}
|
|
224
228
|
}
|
|
225
229
|
|
|
226
230
|
async *removePhotos(
|
|
@@ -228,11 +232,15 @@ export class AlbumsManager {
|
|
|
228
232
|
photoNodeUids: string[],
|
|
229
233
|
signal?: AbortSignal,
|
|
230
234
|
): AsyncGenerator<NodeResultWithError> {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
235
|
+
try {
|
|
236
|
+
for await (const result of this.apiService.removePhotosFromAlbum(albumNodeUid, photoNodeUids, signal)) {
|
|
237
|
+
if (result.ok) {
|
|
238
|
+
await this.nodesService.notifyNodeChanged(result.uid);
|
|
239
|
+
}
|
|
240
|
+
yield result;
|
|
234
241
|
}
|
|
235
|
-
|
|
242
|
+
} finally {
|
|
243
|
+
await this.nodesService.notifyNodeChanged(albumNodeUid);
|
|
236
244
|
}
|
|
237
245
|
}
|
|
238
246
|
|
|
@@ -494,7 +494,7 @@ export class PhotosAPIService {
|
|
|
494
494
|
): AsyncGenerator<NodeResultWithError> {
|
|
495
495
|
const { volumeId, nodeId: albumLinkId } = splitNodeUid(albumNodeUid);
|
|
496
496
|
|
|
497
|
-
const batchSize =
|
|
497
|
+
const batchSize = 10;
|
|
498
498
|
|
|
499
499
|
for (const photoNodeUidsBatch of batch(photoNodeUids, batchSize)) {
|
|
500
500
|
const linkIds = photoNodeUidsBatch.map((nodeUid) => splitNodeUid(nodeUid).nodeId);
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
ProtonDriveTelemetry,
|
|
8
8
|
} from '../../interface';
|
|
9
9
|
import { DriveAPIService } from '../apiService';
|
|
10
|
-
import { NodesCryptoService } from '../nodes/cryptoService';
|
|
11
|
-
import { NodesCryptoReporter } from '../nodes/cryptoReporter';
|
|
12
10
|
import { NodesCryptoCache } from '../nodes/cryptoCache';
|
|
11
|
+
import { NodesCryptoReporter } from '../nodes/cryptoReporter';
|
|
12
|
+
import { NodesCryptoService } from '../nodes/cryptoService';
|
|
13
13
|
import { NodesEventsHandler } from '../nodes/events';
|
|
14
14
|
import { NodesRevisons } from '../nodes/nodesRevisions';
|
|
15
15
|
import { ShareTargetType } from '../shares';
|
|
@@ -17,16 +17,16 @@ import { SharesCache } from '../shares/cache';
|
|
|
17
17
|
import { SharesCryptoCache } from '../shares/cryptoCache';
|
|
18
18
|
import { SharesCryptoService } from '../shares/cryptoService';
|
|
19
19
|
import { NodesService as UploadNodesService } from '../upload/interface';
|
|
20
|
-
import { UploadTelemetry } from '../upload/telemetry';
|
|
21
20
|
import { UploadQueue } from '../upload/queue';
|
|
22
|
-
import {
|
|
21
|
+
import { UploadTelemetry } from '../upload/telemetry';
|
|
23
22
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
23
|
+
import { AlbumsManager } from './albumsManager';
|
|
24
24
|
import { PhotosAPIService } from './apiService';
|
|
25
25
|
import { SharesService } from './interface';
|
|
26
|
-
import {
|
|
26
|
+
import { PhotosNodesAccess, PhotosNodesAPIService, PhotosNodesCache, PhotosNodesManagement } from './nodes';
|
|
27
|
+
import { PhotosManager } from './photosManager';
|
|
27
28
|
import { PhotoSharesManager } from './shares';
|
|
28
29
|
import { PhotosTimeline } from './timeline';
|
|
29
|
-
import { PhotosManager } from './photosManager';
|
|
30
30
|
import {
|
|
31
31
|
PhotoFileUploader,
|
|
32
32
|
PhotoUploadAPIService,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
PhotoUploadMetadata,
|
|
36
36
|
} from './upload';
|
|
37
37
|
|
|
38
|
-
export type { DecryptedPhotoNode, TimelineItem
|
|
38
|
+
export type { AlbumItem, DecryptedPhotoNode, TimelineItem } from './interface';
|
|
39
39
|
|
|
40
40
|
// Only photos and albums can be shared in photos volume.
|
|
41
41
|
export const PHOTOS_SHARE_TARGET_TYPES = [ShareTargetType.Photo, ShareTargetType.Album];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PrivateKey } from '../../crypto';
|
|
2
|
-
import { MetricVolumeType, PhotoAttributes,
|
|
3
|
-
import { DecryptedNode,
|
|
2
|
+
import { AlbumAttributes, MetricVolumeType, PhotoAttributes, PhotoTag } from '../../interface';
|
|
3
|
+
import { DecryptedNode, DecryptedUnparsedNode, EncryptedNode } from '../nodes/interface';
|
|
4
4
|
import { EncryptedShare } from '../shares';
|
|
5
5
|
|
|
6
6
|
export interface SharesService {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { MemoryCache } from '../../cache';
|
|
2
|
-
import {
|
|
2
|
+
import { MemberRole, NodeType } from '../../interface';
|
|
3
3
|
import { getMockLogger } from '../../tests/logger';
|
|
4
4
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
5
5
|
import { DriveAPIService } from '../apiService';
|
|
6
6
|
import { DecryptedPhotoNode } from './interface';
|
|
7
|
-
import { PhotosNodesAPIService, PhotosNodesCache,
|
|
7
|
+
import { PhotosNodesAccess, PhotosNodesAPIService, PhotosNodesCache, PhotosNodesCryptoService } from './nodes';
|
|
8
8
|
|
|
9
9
|
function generateAPINode() {
|
|
10
10
|
return {
|
|
@@ -55,7 +55,7 @@ function generateAPIAlbumNode(linkOverrides = {}, overrides = {}) {
|
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
|
|
58
|
+
function generateAPIPhotoNode(linkOverrides = {}, photoOverrides = {}, overrides = {}) {
|
|
59
59
|
const node = generateAPINode();
|
|
60
60
|
return {
|
|
61
61
|
...node,
|
|
@@ -84,6 +84,7 @@ function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
|
|
|
84
84
|
MediaType: 'image/jpeg',
|
|
85
85
|
ContentKeyPacket: 'contentKeyPacket',
|
|
86
86
|
ContentKeyPacketSignature: 'contentKeyPacketSig',
|
|
87
|
+
...photoOverrides,
|
|
87
88
|
},
|
|
88
89
|
Folder: null,
|
|
89
90
|
...overrides,
|
|
@@ -103,12 +104,16 @@ describe('PhotosNodesAPIService', () => {
|
|
|
103
104
|
});
|
|
104
105
|
|
|
105
106
|
describe('linkToEncryptedNode', () => {
|
|
106
|
-
async function testIterateNodes(mockedLink: object, expectedType
|
|
107
|
+
async function testIterateNodes(mockedLink: object, expectedType?: NodeType) {
|
|
107
108
|
apiMock.post = jest.fn().mockResolvedValue({ Links: [mockedLink] });
|
|
108
109
|
|
|
109
110
|
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
if (expectedType) {
|
|
112
|
+
expect(nodes).toHaveLength(1);
|
|
113
|
+
expect(nodes[0].type).toBe(expectedType);
|
|
114
|
+
} else {
|
|
115
|
+
expect(nodes).toHaveLength(0);
|
|
116
|
+
}
|
|
112
117
|
|
|
113
118
|
return nodes;
|
|
114
119
|
}
|
|
@@ -136,6 +141,17 @@ describe('PhotosNodesAPIService', () => {
|
|
|
136
141
|
expect(nodes[0].photo?.albums[0].nodeUid).toBe('volumeId~albumLinkId1');
|
|
137
142
|
expect(nodes[0].photo?.albums[0].additionTime).toEqual(new Date(1700001000 * 1000));
|
|
138
143
|
});
|
|
144
|
+
|
|
145
|
+
it('should handle photo node with null capture time', async () => {
|
|
146
|
+
await testIterateNodes(generateAPIPhotoNode({}, { CaptureTime: null }), undefined);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should handle photo node with capture time set to zero', async () => {
|
|
150
|
+
const nodes = await testIterateNodes(generateAPIPhotoNode({}, { CaptureTime: 0 }), NodeType.Photo);
|
|
151
|
+
|
|
152
|
+
expect(nodes[0].photo).toBeDefined();
|
|
153
|
+
expect(nodes[0].photo?.captureTime).toEqual(new Date(0));
|
|
154
|
+
});
|
|
139
155
|
});
|
|
140
156
|
});
|
|
141
157
|
|
|
@@ -2,14 +2,14 @@ import { PrivateKey } from '../../crypto';
|
|
|
2
2
|
import { DecryptionError } from '../../errors';
|
|
3
3
|
import { NodeType } from '../../interface';
|
|
4
4
|
import { drivePaths } from '../apiService';
|
|
5
|
-
import {
|
|
6
|
-
import { NodesCacheBase, serialiseNode
|
|
5
|
+
import { linkToEncryptedNode, linkToEncryptedNodeBaseMetadata, NodeAPIServiceBase } from '../nodes/apiService';
|
|
6
|
+
import { deserialiseNode, NodesCacheBase, serialiseNode } from '../nodes/cache';
|
|
7
7
|
import { NodesCryptoService } from '../nodes/cryptoService';
|
|
8
8
|
import { DecryptedNodeKeys } from '../nodes/interface';
|
|
9
9
|
import { NodesAccessBase, parseNode as parseNodeBase } from '../nodes/nodesAccess';
|
|
10
10
|
import { NodesManagementBase } from '../nodes/nodesManagement';
|
|
11
11
|
import { makeNodeUid } from '../uids';
|
|
12
|
-
import {
|
|
12
|
+
import { DecryptedPhotoNode, DecryptedUnparsedPhotoNode, EncryptedPhotoNode } from './interface';
|
|
13
13
|
|
|
14
14
|
type PostLoadLinksMetadataRequest = Extract<
|
|
15
15
|
drivePaths['/drive/photos/volumes/{volumeID}/links']['post']['requestBody'],
|
|
@@ -18,10 +18,7 @@ type PostLoadLinksMetadataRequest = Extract<
|
|
|
18
18
|
type PostLoadLinksMetadataResponse =
|
|
19
19
|
drivePaths['/drive/photos/volumes/{volumeID}/links']['post']['responses']['200']['content']['application/json'];
|
|
20
20
|
|
|
21
|
-
export class PhotosNodesAPIService extends NodeAPIServiceBase<
|
|
22
|
-
EncryptedPhotoNode,
|
|
23
|
-
PostLoadLinksMetadataResponse['Links'][0]
|
|
24
|
-
> {
|
|
21
|
+
export class PhotosNodesAPIService extends NodeAPIServiceBase<EncryptedPhotoNode, PostLoadLinksMetadataResponse['Links'][0]> {
|
|
25
22
|
protected async fetchNodeMetadata(volumeId: string, linkIds: string[], signal?: AbortSignal) {
|
|
26
23
|
const response = await this.apiService.post<PostLoadLinksMetadataRequest, PostLoadLinksMetadataResponse>(
|
|
27
24
|
`drive/photos/volumes/${volumeId}/links`,
|
|
@@ -37,7 +34,7 @@ export class PhotosNodesAPIService extends NodeAPIServiceBase<
|
|
|
37
34
|
volumeId: string,
|
|
38
35
|
link: PostLoadLinksMetadataResponse['Links'][0],
|
|
39
36
|
isOwnVolumeId: boolean,
|
|
40
|
-
): EncryptedPhotoNode {
|
|
37
|
+
): EncryptedPhotoNode | undefined {
|
|
41
38
|
const { baseNodeMetadata, baseCryptoNodeMetadata } = linkToEncryptedNodeBaseMetadata(
|
|
42
39
|
this.logger,
|
|
43
40
|
volumeId,
|
|
@@ -45,13 +42,23 @@ export class PhotosNodesAPIService extends NodeAPIServiceBase<
|
|
|
45
42
|
isOwnVolumeId,
|
|
46
43
|
);
|
|
47
44
|
|
|
48
|
-
if (link.Link.Type === 2 && link.Photo
|
|
45
|
+
if (link.Link.Type === 2 && link.Photo) {
|
|
49
46
|
const node = linkToEncryptedNode(
|
|
50
47
|
this.logger,
|
|
51
48
|
volumeId,
|
|
52
49
|
{ ...link, File: link.Photo, Folder: null },
|
|
53
50
|
isOwnVolumeId,
|
|
54
51
|
);
|
|
52
|
+
if (!node) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
// Capture time is not present only for draft nodes.
|
|
56
|
+
// Draft nodes are not exposed to the client and are internal to
|
|
57
|
+
// upload module only.
|
|
58
|
+
if (link.Photo.CaptureTime === null || link.Photo.CaptureTime === undefined) {
|
|
59
|
+
this.logger.warn(`Requested draft photo node, skipping from the result`);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
55
62
|
return {
|
|
56
63
|
...node,
|
|
57
64
|
type: NodeType.Photo,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PhotoTag, resultOk } from '../../interface';
|
|
2
2
|
import { getMockLogger } from '../../tests/logger';
|
|
3
|
-
import { PhotosManager, UpdatePhotoSettings } from './photosManager';
|
|
4
|
-
import { PhotosAPIService } from './apiService';
|
|
5
3
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
6
|
-
import {
|
|
7
|
-
import { DecryptedPhotoNode } from './interface';
|
|
4
|
+
import { PhotosAPIService } from './apiService';
|
|
8
5
|
import { MissingRelatedPhotosError } from './errors';
|
|
6
|
+
import { DecryptedPhotoNode } from './interface';
|
|
7
|
+
import { PhotosNodesAccess } from './nodes';
|
|
8
|
+
import { PhotosManager, UpdatePhotoSettings } from './photosManager';
|
|
9
9
|
|
|
10
10
|
function createMockPhotoNode(uid: string, overrides: Partial<DecryptedPhotoNode> = {}): DecryptedPhotoNode {
|
|
11
11
|
return {
|
|
@@ -3,12 +3,12 @@ import { c } from 'ttag';
|
|
|
3
3
|
import { AbortError } from '../../errors';
|
|
4
4
|
import { Logger, NodeResultWithError, PhotoTag } from '../../interface';
|
|
5
5
|
import { batch } from '../batch';
|
|
6
|
-
import { PhotosAPIService } from './apiService';
|
|
7
|
-
import { PhotoAlreadyInTargetError, PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
|
|
8
|
-
import { PhotosNodesAccess } from './nodes';
|
|
9
|
-
import { AlbumsCryptoService } from './albumsCrypto';
|
|
10
6
|
import { createBatches } from './addToAlbum';
|
|
7
|
+
import { AlbumsCryptoService } from './albumsCrypto';
|
|
8
|
+
import { PhotosAPIService } from './apiService';
|
|
11
9
|
import { MissingRelatedPhotosError } from './errors';
|
|
10
|
+
import { PhotosNodesAccess } from './nodes';
|
|
11
|
+
import { PhotoAlreadyInTargetError, PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* The number of photos that are loaded in parallel to prepare the payloads.
|
|
@@ -2,8 +2,8 @@ import { ValidationError } from '../../errors';
|
|
|
2
2
|
import { resultOk } from '../../interface';
|
|
3
3
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
4
4
|
import { DecryptedPhotoNode } from './interface';
|
|
5
|
-
import { PhotoTransferPayloadBuilder } from './photosTransferPayloadBuilder';
|
|
6
5
|
import { PhotosNodesAccess } from './nodes';
|
|
6
|
+
import { PhotoTransferPayloadBuilder } from './photosTransferPayloadBuilder';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Helper to create a mock photo node with minimal required properties.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getMockLogger } from '../../tests/logger';
|
|
2
1
|
import { DriveCrypto } from '../../crypto';
|
|
2
|
+
import { getMockLogger } from '../../tests/logger';
|
|
3
3
|
import { makeNodeUid } from '../uids';
|
|
4
4
|
import { PhotosAPIService } from './apiService';
|
|
5
5
|
import { PhotosNodesAccess } from './nodes';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DriveCrypto } from '../../crypto';
|
|
2
2
|
import {
|
|
3
|
-
ProtonDriveTelemetry,
|
|
4
|
-
UploadMetadata,
|
|
5
|
-
Thumbnail,
|
|
6
3
|
AnonymousUser,
|
|
7
4
|
FeatureFlagProvider,
|
|
8
5
|
PhotoTag,
|
|
6
|
+
ProtonDriveTelemetry,
|
|
7
|
+
Thumbnail,
|
|
8
|
+
UploadMetadata,
|
|
9
9
|
} from '../../interface';
|
|
10
10
|
import { DriveAPIService, drivePaths } from '../apiService';
|
|
11
11
|
import { generateFileExtendedAttributes } from '../nodes';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DriveAPIService, drivePaths } from '../apiService';
|
|
2
2
|
import { makeMemberUid } from '../uids';
|
|
3
|
-
import {
|
|
3
|
+
import { EncryptedRootShare, EncryptedShare, EncryptedShareCrypto, ShareType } from './interface';
|
|
4
4
|
|
|
5
5
|
type PostCreateVolumeRequest = Extract<
|
|
6
6
|
drivePaths['/drive/volumes']['post']['requestBody'],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
1
|
import { MemoryCache } from '../../cache';
|
|
2
|
+
import { PrivateKey, SessionKey } from '../../crypto';
|
|
3
3
|
import { CachedCryptoMaterial } from '../../interface';
|
|
4
4
|
import { getMockLogger } from '../../tests/logger';
|
|
5
5
|
import { SharesCryptoCache } from './cryptoCache';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { DriveCrypto, PrivateKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
|
|
2
2
|
import { ProtonDriveAccount, ProtonDriveTelemetry } from '../../interface';
|
|
3
3
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
4
|
-
import { EncryptedRootShare, ShareType } from './interface';
|
|
5
4
|
import { SharesCryptoService } from './cryptoService';
|
|
5
|
+
import { EncryptedRootShare, ShareType } from './interface';
|
|
6
6
|
|
|
7
7
|
describe('SharesCryptoService', () => {
|
|
8
8
|
let telemetry: ProtonDriveTelemetry;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { DriveCrypto, PrivateKey, VERIFICATION_STATUS } from '../../crypto';
|
|
1
2
|
import {
|
|
3
|
+
Logger,
|
|
4
|
+
MetricVolumeType,
|
|
2
5
|
ProtonDriveAccount,
|
|
3
|
-
|
|
4
|
-
resultError,
|
|
6
|
+
ProtonDriveTelemetry,
|
|
5
7
|
Result,
|
|
8
|
+
resultError,
|
|
9
|
+
resultOk,
|
|
6
10
|
UnverifiedAuthorError,
|
|
7
|
-
ProtonDriveTelemetry,
|
|
8
|
-
Logger,
|
|
9
|
-
MetricVolumeType,
|
|
10
11
|
} from '../../interface';
|
|
11
|
-
import { DriveCrypto, PrivateKey, VERIFICATION_STATUS } from '../../crypto';
|
|
12
12
|
import { getVerificationMessage, isNotApplicationError } from '../errors';
|
|
13
13
|
import {
|
|
14
|
-
EncryptedRootShare,
|
|
15
14
|
DecryptedRootShare,
|
|
16
|
-
EncryptedShareCrypto,
|
|
17
15
|
DecryptedShareKey,
|
|
16
|
+
EncryptedRootShare,
|
|
17
|
+
EncryptedShareCrypto,
|
|
18
18
|
ShareType,
|
|
19
19
|
} from './interface';
|
|
20
20
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
+
import { DriveCrypto } from '../../crypto';
|
|
1
2
|
import {
|
|
2
|
-
ProtonDriveEntitiesCache,
|
|
3
|
-
ProtonDriveCryptoCache,
|
|
4
3
|
ProtonDriveAccount,
|
|
4
|
+
ProtonDriveCryptoCache,
|
|
5
|
+
ProtonDriveEntitiesCache,
|
|
5
6
|
ProtonDriveTelemetry,
|
|
6
7
|
} from '../../interface';
|
|
7
|
-
import { DriveCrypto } from '../../crypto';
|
|
8
8
|
import { DriveAPIService } from '../apiService';
|
|
9
9
|
import { SharesAPIService } from './apiService';
|
|
10
|
-
import { SharesCryptoCache } from './cryptoCache';
|
|
11
10
|
import { SharesCache } from './cache';
|
|
11
|
+
import { SharesCryptoCache } from './cryptoCache';
|
|
12
12
|
import { SharesCryptoService } from './cryptoService';
|
|
13
13
|
import { SharesManager } from './manager';
|
|
14
14
|
|
|
15
|
-
export { ShareTargetType } from './interface';
|
|
16
15
|
export type { EncryptedShare } from './interface';
|
|
16
|
+
export { ShareTargetType } from './interface';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Provides facade for the whole shares module.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Logger, MetricVolumeType, ProtonDriveAccount } from '../../interface';
|
|
2
1
|
import { PrivateKey } from '../../crypto';
|
|
2
|
+
import { Logger, MetricVolumeType, ProtonDriveAccount } from '../../interface';
|
|
3
3
|
import { NotFoundAPIError } from '../apiService';
|
|
4
4
|
import { SharesAPIService } from './apiService';
|
|
5
5
|
import { SharesCache } from './cache';
|
|
6
6
|
import { SharesCryptoCache } from './cryptoCache';
|
|
7
7
|
import { SharesCryptoService } from './cryptoService';
|
|
8
|
-
import {
|
|
8
|
+
import { EncryptedRootShare, EncryptedShare, VolumeShareNodeIDs } from './interface';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Provides high-level actions for managing shares.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { SRPVerifier } from '../../crypto';
|
|
2
|
-
import { MemberRole, NonProtonInvitationState
|
|
2
|
+
import { Logger, MemberRole, NonProtonInvitationState } from '../../interface';
|
|
3
3
|
import {
|
|
4
4
|
DriveAPIService,
|
|
5
5
|
drivePaths,
|
|
6
|
+
memberRoleToPermission,
|
|
6
7
|
nodeTypeNumberToNodeType,
|
|
7
8
|
permissionsToMemberRole,
|
|
8
|
-
memberRoleToPermission,
|
|
9
9
|
} from '../apiService';
|
|
10
10
|
import { ShareTargetType } from '../shares';
|
|
11
11
|
import {
|
|
12
|
-
makeNodeUid,
|
|
13
|
-
splitNodeUid,
|
|
14
12
|
makeInvitationUid,
|
|
15
|
-
splitInvitationUid,
|
|
16
13
|
makeMemberUid,
|
|
17
|
-
|
|
14
|
+
makeNodeUid,
|
|
18
15
|
makePublicLinkUid,
|
|
16
|
+
splitInvitationUid,
|
|
17
|
+
splitMemberUid,
|
|
18
|
+
splitNodeUid,
|
|
19
19
|
splitPublicLinkUid,
|
|
20
20
|
} from '../uids';
|
|
21
21
|
import {
|
|
22
|
-
|
|
22
|
+
EncryptedBookmark,
|
|
23
|
+
EncryptedExternalInvitation,
|
|
24
|
+
EncryptedExternalInvitationRequest,
|
|
23
25
|
EncryptedInvitation,
|
|
26
|
+
EncryptedInvitationRequest,
|
|
24
27
|
EncryptedInvitationWithNode,
|
|
25
|
-
EncryptedExternalInvitation,
|
|
26
28
|
EncryptedMember,
|
|
27
|
-
EncryptedBookmark,
|
|
28
|
-
EncryptedExternalInvitationRequest,
|
|
29
29
|
EncryptedPublicLink,
|
|
30
30
|
EncryptedPublicLinkCrypto,
|
|
31
31
|
} from './interface';
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
resultOk,
|
|
9
9
|
} from '../../interface';
|
|
10
10
|
import { getMockTelemetry } from '../../tests/telemetry';
|
|
11
|
-
import { SharesService } from './interface';
|
|
12
11
|
import { PUBLIC_LINK_GENERATED_PASSWORD_LENGTH, SharingCryptoService } from './cryptoService';
|
|
12
|
+
import { SharesService } from './interface';
|
|
13
13
|
|
|
14
14
|
describe('SharingCryptoService', () => {
|
|
15
15
|
let telemetry: ProtonDriveTelemetry;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import bcrypt from 'bcryptjs';
|
|
2
1
|
import { c } from 'ttag';
|
|
3
2
|
|
|
4
3
|
import {
|
|
@@ -6,42 +5,37 @@ import {
|
|
|
6
5
|
PrivateKey,
|
|
7
6
|
SessionKey,
|
|
8
7
|
SRPVerifier,
|
|
9
|
-
uint8ArrayToBase64String,
|
|
10
8
|
VERIFICATION_STATUS,
|
|
11
9
|
} from '../../crypto';
|
|
10
|
+
import { DecryptionError } from '../../errors';
|
|
12
11
|
import {
|
|
12
|
+
Author,
|
|
13
|
+
InvalidNameError,
|
|
14
|
+
Member,
|
|
15
|
+
MetricVolumeType,
|
|
16
|
+
NonProtonInvitation,
|
|
13
17
|
ProtonDriveAccount,
|
|
18
|
+
ProtonDriveTelemetry,
|
|
14
19
|
ProtonInvitation,
|
|
15
20
|
ProtonInvitationWithNode,
|
|
16
|
-
NonProtonInvitation,
|
|
17
|
-
Author,
|
|
18
21
|
Result,
|
|
19
|
-
Member,
|
|
20
|
-
UnverifiedAuthorError,
|
|
21
22
|
resultError,
|
|
22
23
|
resultOk,
|
|
23
|
-
|
|
24
|
-
ProtonDriveTelemetry,
|
|
25
|
-
MetricVolumeType,
|
|
24
|
+
UnverifiedAuthorError,
|
|
26
25
|
} from '../../interface';
|
|
27
|
-
import { validateNodeName } from '../nodes/validations';
|
|
28
26
|
import { getErrorMessage, getVerificationMessage } from '../errors';
|
|
27
|
+
import { validateNodeName } from '../nodes/validations';
|
|
29
28
|
import { EncryptedShare } from '../shares';
|
|
30
29
|
import {
|
|
30
|
+
EncryptedBookmark,
|
|
31
|
+
EncryptedExternalInvitation,
|
|
31
32
|
EncryptedInvitation,
|
|
32
33
|
EncryptedInvitationWithNode,
|
|
33
|
-
EncryptedExternalInvitation,
|
|
34
34
|
EncryptedMember,
|
|
35
35
|
EncryptedPublicLink,
|
|
36
36
|
PublicLinkWithCreatorEmail,
|
|
37
|
-
EncryptedBookmark,
|
|
38
37
|
SharesService,
|
|
39
38
|
} from './interface';
|
|
40
|
-
import { DecryptionError } from '../../errors';
|
|
41
|
-
|
|
42
|
-
// Version 2 of bcrypt with 2**10 rounds.
|
|
43
|
-
// https://en.wikipedia.org/wiki/Bcrypt#Description
|
|
44
|
-
const BCRYPT_PREFIX = '$2y$10$';
|
|
45
39
|
|
|
46
40
|
export const PUBLIC_LINK_GENERATED_PASSWORD_LENGTH = 12;
|
|
47
41
|
|
|
@@ -325,13 +319,10 @@ export class SharingCryptoService {
|
|
|
325
319
|
const address = await this.account.getOwnAddress(creatorEmail);
|
|
326
320
|
const addressKey = address.keys[address.primaryKeyIndex].key;
|
|
327
321
|
|
|
328
|
-
const {
|
|
329
|
-
await this.computeKeySaltAndPassphrase(password);
|
|
330
|
-
const { base64SharePassphraseKeyPacket, armoredPassword, srp } =
|
|
322
|
+
const { base64SharePasswordSalt, base64SharePassphraseKeyPacket, armoredPassword, srp } =
|
|
331
323
|
await this.driveCrypto.encryptPublicLinkPasswordAndSessionKey(
|
|
332
324
|
password,
|
|
333
325
|
addressKey,
|
|
334
|
-
bcryptPassphrase,
|
|
335
326
|
shareSessionKey,
|
|
336
327
|
);
|
|
337
328
|
|
|
@@ -357,22 +348,6 @@ export class SharingCryptoService {
|
|
|
357
348
|
return result;
|
|
358
349
|
}
|
|
359
350
|
|
|
360
|
-
private async computeKeySaltAndPassphrase(password: string) {
|
|
361
|
-
if (!password) {
|
|
362
|
-
throw new Error('Password required.');
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
366
|
-
const hash: string = await bcrypt.hash(password, BCRYPT_PREFIX + bcrypt.encodeBase64(salt, 16));
|
|
367
|
-
// Remove bcrypt prefix and salt (first 29 characters)
|
|
368
|
-
const bcryptPassphrase = hash.slice(29);
|
|
369
|
-
|
|
370
|
-
return {
|
|
371
|
-
base64Salt: uint8ArrayToBase64String(salt),
|
|
372
|
-
bcryptPassphrase,
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
|
|
376
351
|
async decryptPublicLink(encryptedPublicLink: EncryptedPublicLink): Promise<PublicLinkWithCreatorEmail> {
|
|
377
352
|
const address = await this.account.getOwnAddress(encryptedPublicLink.creatorEmail);
|
|
378
353
|
const addressKeys = address.keys.map(({ key }) => key);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getMockLogger } from '../../tests/logger';
|
|
2
2
|
import { DriveEvent, DriveEventType } from '../events';
|
|
3
|
+
import { SharesManager } from '../shares/manager';
|
|
3
4
|
import { SharingCache } from './cache';
|
|
4
|
-
import { SharingAccess } from './sharingAccess';
|
|
5
5
|
import { SharingEventHandler } from './events';
|
|
6
|
-
import { SharesManager } from '../shares/manager';
|
|
7
6
|
import { NodesService } from './interface';
|
|
7
|
+
import { SharingAccess } from './sharingAccess';
|
|
8
8
|
|
|
9
9
|
// FIXME: test tree_refresh and tree_remove
|
|
10
10
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { ProtonDriveAccount, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from '../../interface';
|
|
2
1
|
import { DriveCrypto } from '../../crypto';
|
|
2
|
+
import { ProtonDriveAccount, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from '../../interface';
|
|
3
3
|
import { DriveAPIService } from '../apiService';
|
|
4
4
|
import { ShareTargetType } from '../shares';
|
|
5
5
|
import { SharingAPIService } from './apiService';
|
|
6
6
|
import { SharingCache } from './cache';
|
|
7
7
|
import { SharingCryptoService } from './cryptoService';
|
|
8
|
+
import { SharingEventHandler } from './events';
|
|
9
|
+
import { NodesService, SharesService } from './interface';
|
|
8
10
|
import { SharingAccess } from './sharingAccess';
|
|
9
11
|
import { SharingManagement } from './sharingManagement';
|
|
10
|
-
import { SharesService, NodesService } from './interface';
|
|
11
|
-
import { SharingEventHandler } from './events';
|
|
12
12
|
|
|
13
13
|
// Root shares are not allowed to be shared.
|
|
14
14
|
// Photos and Albums are not supported in main volume (core Drive).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { NodeType, MemberRole, NonProtonInvitationState, MissingNode, ShareResult, PublicLink } from '../../interface';
|
|
2
1
|
import { PrivateKey, SessionKey } from '../../crypto';
|
|
3
|
-
import {
|
|
2
|
+
import { MemberRole, MissingNode, NodeType, NonProtonInvitationState, PublicLink, ShareResult } from '../../interface';
|
|
4
3
|
import { DecryptedNode } from '../nodes';
|
|
4
|
+
import { EncryptedShare } from '../shares';
|
|
5
5
|
|
|
6
6
|
export enum SharingType {
|
|
7
7
|
SharedByMe = 'sharedByMe',
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { getMockLogger } from '../../tests/logger';
|
|
2
|
-
import { NodeType, resultError, resultOk, MemberRole } from '../../interface';
|
|
3
1
|
import { ValidationError } from '../../errors';
|
|
2
|
+
import { MemberRole, NodeType, resultError, resultOk } from '../../interface';
|
|
3
|
+
import { getMockLogger } from '../../tests/logger';
|
|
4
4
|
import { SharingAPIService } from './apiService';
|
|
5
5
|
import { SharingCache } from './cache';
|
|
6
6
|
import { SharingCryptoService } from './cryptoService';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { NodesService, SharesService } from './interface';
|
|
8
|
+
import { BATCH_LOADING_SIZE, SharingAccess } from './sharingAccess';
|
|
9
9
|
|
|
10
10
|
describe('SharingAccess', () => {
|
|
11
11
|
let apiService: SharingAPIService;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { c } from 'ttag';
|
|
2
2
|
|
|
3
|
-
import { MaybeBookmark, ProtonInvitationWithNode, resultError, resultOk } from '../../interface';
|
|
4
3
|
import { ValidationError } from '../../errors';
|
|
5
|
-
import {
|
|
4
|
+
import { MaybeBookmark, ProtonInvitationWithNode, resultError, resultOk } from '../../interface';
|
|
6
5
|
import { BatchLoading } from '../batchLoading';
|
|
6
|
+
import { DecryptedNode } from '../nodes';
|
|
7
7
|
import { SharingAPIService } from './apiService';
|
|
8
8
|
import { SharingCache } from './cache';
|
|
9
9
|
import { SharingCryptoService } from './cryptoService';
|
|
10
|
-
import {
|
|
10
|
+
import { NodesService, SharesService } from './interface';
|
|
11
11
|
|
|
12
12
|
// This is the number of nodes that are loaded in parallel.
|
|
13
13
|
// It is a trade-off between initial wait time and overhead of API calls.
|